reSIProcate/DialogUsageManager  9680
DumFeatureChain.cxx
Go to the documentation of this file.
00001 #include <vector>
00002 
00003 #include "rutil/SharedPtr.hxx"
00004 #include "resip/dum/TargetCommand.hxx"
00005 #include "resip/dum/DumFeature.hxx"
00006 #include "resip/dum/DumFeatureChain.hxx"
00007 #include "resip/stack/Message.hxx"
00008 #include "rutil/WinLeakCheck.hxx"
00009 
00010 using namespace resip;
00011 using namespace std;
00012 
00013 class GuardFeature : public DumFeature
00014 {
00015    public:
00016       GuardFeature(DialogUsageManager& dum, TargetCommand::Target& target)
00017          : DumFeature(dum, target)
00018       {}
00019 
00020       virtual ProcessingResult process(Message* msg)
00021       {
00022          return DumFeature::FeatureDone;
00023       }
00024 };
00025 
00026 DumFeatureChain::DumFeatureChain(DialogUsageManager& dum,
00027                                  const FeatureList& features,
00028                                  TargetCommand::Target& target)
00029    :mFeatures(features)
00030 {
00031    mFeatures.push_back(SharedPtr<DumFeature>(new GuardFeature(dum, target)));
00032    for (FeatureList::size_type i = 0; i < mFeatures.size(); ++i)
00033    {
00034       mActiveFeatures.push_back(true);
00035    }
00036 }
00037 
00038 DumFeatureChain::ProcessingResult DumFeatureChain::process(Message* msg)
00039 {
00040    FeatureList::iterator feat = mFeatures.begin();
00041    vector<bool>::iterator active = mActiveFeatures.begin();
00042    bool stop = false;
00043 
00044    DumFeature::ProcessingResult pres = DumFeature::FeatureDone;
00045    do
00046    {
00047       if (*active)
00048       {
00049          pres = (*feat)->process(msg);
00050 
00051          switch(pres)
00052          {
00053             case DumFeature::EventTaken:
00054                stop = true;
00055                break;
00056             case DumFeature::FeatureDone:
00057                *active = false;
00058                break;
00059             case DumFeature::FeatureDoneAndEventDone:
00060             case DumFeature::FeatureDoneAndEventTaken: //??
00061             case DumFeature::ChainDoneAndEventTaken:
00062             case DumFeature::ChainDoneAndEventDone:
00063                *active = false;
00064                stop = true;
00065                break;
00066          }
00067 
00068          if (pres & DumFeature::EventDoneBit)
00069          {
00070             delete msg;
00071             int bits = pres;
00072             bits ^= DumFeature::EventDoneBit;
00073             bits |= DumFeature::EventTaken;
00074             pres = static_cast<DumFeature::ProcessingResult>(bits);
00075          }
00076       }
00077 
00078       active++;
00079       feat++;
00080    }
00081    while(!stop && feat != mFeatures.end());
00082 
00083 
00084    int chainBits = 0;
00085    if (pres & DumFeature::ChainDoneBit || feat == mFeatures.end())
00086    {
00087       chainBits |= ChainDoneBit;
00088    }
00089 
00090    if (pres & DumFeature::EventTakenBit)
00091    {
00092       chainBits |= EventTakenBit;
00093    }
00094 
00095    return static_cast<DumFeatureChain::ProcessingResult>(chainBits);
00096 }