|
reSIProcate/DialogUsageManager
9680
|
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 }
1.7.5.1