00001 #ifndef __SUBSCRIPTIONSERVICE__CONNECTIONSTRATEGY_CONNECTIONSTRATEGY_HH__ 00002 #define __SUBSCRIPTIONSERVICE__CONNECTIONSTRATEGY_CONNECTIONSTRATEGY_HH__ 00003 00004 #include <algorithm> 00005 #include <accdevexception.hh> 00006 #include "subscriptionservice/Description/DeviceDescriptor.hh" 00007 00008 namespace DeviceAccess 00009 { 00010 namespace Subscription 00011 { 00012 namespace ConnectionStrategy 00013 { 00014 using ::DeviceAccess::Subscription::Description::DeviceDescriptor; 00015 00023 class ConnStrat 00024 { 00025 public: 00037 virtual void checkConns( 00038 const std::vector<DeviceDescriptor>& dds, 00039 const std::vector<int>& idxs) const 00040 throw (AccDevException) = 0; 00041 00042 virtual ~ConnStrat() {} 00043 00044 static const AccDevException NOTCONNECTED; 00045 }; 00046 00050 class ThrowOnZeroConns : public ConnStrat 00051 { 00052 public: 00053 virtual void checkConns( 00054 const std::vector<DeviceDescriptor>& dds, 00055 const std::vector<int>& idxs) const 00056 throw (AccDevException) 00057 { 00058 if (idxs.size() == 0) 00059 throw NOTCONNECTED; 00060 } 00061 }; 00062 00066 class ThrowAlways : public ConnStrat 00067 { 00068 public: 00069 virtual void checkConns( 00070 const std::vector<DeviceDescriptor>& dds, 00071 const std::vector<int>& idxs) const 00072 throw (AccDevException) 00073 { 00074 if (idxs.size() < dds.size()) 00075 throw NOTCONNECTED; 00076 } 00077 00078 }; 00079 00083 class ThrowNever : public ConnStrat 00084 { 00085 public: 00086 virtual void checkConns( 00087 const std::vector<DeviceDescriptor>& dds, 00088 const std::vector<int>& idxs) const 00089 throw (AccDevException) 00090 { 00091 } 00092 }; 00093 00101 class ThrowOnIdx : public ConnStrat 00102 { 00103 private: 00104 std::vector<int> _idxs; 00105 00106 public: 00107 ThrowOnIdx(const std::vector<int> idxs) : 00108 _idxs(idxs) 00109 { 00110 } 00111 00112 virtual void checkConns( 00113 const std::vector<DeviceDescriptor>& dds, 00114 const std::vector<int>& idxs) const 00115 throw (AccDevException) 00116 { 00117 for (std::vector<int>::const_iterator it = _idxs.begin(); 00118 it != _idxs.end(); it++) 00119 if (std::find(idxs.begin(), idxs.end(), *it) == idxs.end()) 00120 throw NOTCONNECTED; 00121 } 00122 }; 00123 00131 class ThrowOnNomen : public ConnStrat 00132 { 00133 private: 00134 std::vector<string> _nomens; 00135 00136 public: 00137 ThrowOnNomen(const std::vector<string> nomens) : 00138 _nomens(nomens) 00139 { 00140 } 00141 00142 virtual void checkConns( 00143 const std::vector<DeviceDescriptor>& dds, 00144 const std::vector<int>& idxs) const 00145 throw (AccDevException) 00146 { 00147 for (std::vector<string>::const_iterator it = _nomens.begin(); 00148 it != _nomens.end(); it++) 00149 if (std::find_if(idxs.begin(), idxs.end(), 00150 TestNomen(*it, dds)) 00151 == idxs.end()) 00152 { 00153 throw NOTCONNECTED; 00154 } 00155 } 00156 00157 private: 00158 struct TestNomen { 00159 std::string _nomen; 00160 const std::vector<DeviceDescriptor>& _dds; 00161 00162 TestNomen( 00163 const std::string& nomen, 00164 const std::vector<DeviceDescriptor>& dds) : 00165 _nomen(nomen), 00166 _dds(dds) {} 00167 00168 bool operator()(int i) 00169 { 00170 return _nomen == _dds[i].device->nomen(); 00171 } 00172 }; 00173 }; 00174 } 00175 } 00176 } 00177 00178 #endif