00001 #ifndef _H_BONDSM_SM
00002 #define _H_BONDSM_SM
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #define SMC_USES_IOSTREAMS
00013
00014 #include <statemap.h>
00015
00016
00017 class SM;
00018 class SM_WaitingForSister;
00019 class SM_Alive;
00020 class SM_AwaitSisterDeath;
00021 class SM_Dead;
00022 class SM_Default;
00023 class BondSMState;
00024 class BondSMContext;
00025 class BondSM;
00026
00027 class BondSMState :
00028 public statemap::State
00029 {
00030 public:
00031
00032 BondSMState(const char *name, int stateId)
00033 : statemap::State(name, stateId)
00034 {};
00035
00036 virtual void Entry(BondSMContext&) {};
00037 virtual void Exit(BondSMContext&) {};
00038
00039 virtual void ConnectTimeout(BondSMContext& context);
00040 virtual void Die(BondSMContext& context);
00041 virtual void DisconnectTimeout(BondSMContext& context);
00042 virtual void HeartbeatTimeout(BondSMContext& context);
00043 virtual void SisterAlive(BondSMContext& context);
00044 virtual void SisterDead(BondSMContext& context);
00045
00046 protected:
00047
00048 virtual void Default(BondSMContext& context);
00049 };
00050
00051 class SM
00052 {
00053 public:
00054
00055 static SM_WaitingForSister WaitingForSister;
00056 static SM_Alive Alive;
00057 static SM_AwaitSisterDeath AwaitSisterDeath;
00058 static SM_Dead Dead;
00059 };
00060
00061 class SM_Default :
00062 public BondSMState
00063 {
00064 public:
00065
00066 SM_Default(const char *name, int stateId)
00067 : BondSMState(name, stateId)
00068 {};
00069
00070 };
00071
00072 class SM_WaitingForSister :
00073 public SM_Default
00074 {
00075 public:
00076 SM_WaitingForSister(const char *name, int stateId)
00077 : SM_Default(name, stateId)
00078 {};
00079
00080 void ConnectTimeout(BondSMContext& context);
00081 void Die(BondSMContext& context);
00082 void SisterAlive(BondSMContext& context);
00083 void SisterDead(BondSMContext& context);
00084 };
00085
00086 class SM_Alive :
00087 public SM_Default
00088 {
00089 public:
00090 SM_Alive(const char *name, int stateId)
00091 : SM_Default(name, stateId)
00092 {};
00093
00094 void Die(BondSMContext& context);
00095 void HeartbeatTimeout(BondSMContext& context);
00096 void SisterAlive(BondSMContext& context);
00097 void SisterDead(BondSMContext& context);
00098 };
00099
00100 class SM_AwaitSisterDeath :
00101 public SM_Default
00102 {
00103 public:
00104 SM_AwaitSisterDeath(const char *name, int stateId)
00105 : SM_Default(name, stateId)
00106 {};
00107
00108 void Die(BondSMContext& context);
00109 void DisconnectTimeout(BondSMContext& context);
00110 void HeartbeatTimeout(BondSMContext& context);
00111 void SisterAlive(BondSMContext& context);
00112 void SisterDead(BondSMContext& context);
00113 };
00114
00115 class SM_Dead :
00116 public SM_Default
00117 {
00118 public:
00119 SM_Dead(const char *name, int stateId)
00120 : SM_Default(name, stateId)
00121 {};
00122
00123 void ConnectTimeout(BondSMContext& context);
00124 void Die(BondSMContext& context);
00125 void DisconnectTimeout(BondSMContext& context);
00126 void HeartbeatTimeout(BondSMContext& context);
00127 void SisterAlive(BondSMContext& context);
00128 void SisterDead(BondSMContext& context);
00129 };
00130
00131 class BondSMContext :
00132 public statemap::FSMContext
00133 {
00134 public:
00135
00136 BondSMContext(BondSM& owner)
00137 : FSMContext(SM::WaitingForSister),
00138 _owner(owner)
00139 {};
00140
00141 BondSMContext(BondSM& owner, const statemap::State& state)
00142 : FSMContext(state),
00143 _owner(owner)
00144 {};
00145
00146 virtual void enterStartState()
00147 {
00148 getState().Entry(*this);
00149 return;
00150 }
00151
00152 BondSM& getOwner() const
00153 {
00154 return (_owner);
00155 };
00156
00157 BondSMState& getState() const
00158 {
00159 if (_state == NULL)
00160 {
00161 throw statemap::StateUndefinedException();
00162 }
00163
00164 return (dynamic_cast<BondSMState&>(*_state));
00165 };
00166
00167 void ConnectTimeout()
00168 {
00169 (getState()).ConnectTimeout(*this);
00170 };
00171
00172 void Die()
00173 {
00174 (getState()).Die(*this);
00175 };
00176
00177 void DisconnectTimeout()
00178 {
00179 (getState()).DisconnectTimeout(*this);
00180 };
00181
00182 void HeartbeatTimeout()
00183 {
00184 (getState()).HeartbeatTimeout(*this);
00185 };
00186
00187 void SisterAlive()
00188 {
00189 (getState()).SisterAlive(*this);
00190 };
00191
00192 void SisterDead()
00193 {
00194 (getState()).SisterDead(*this);
00195 };
00196
00197 private:
00198
00199 BondSM& _owner;
00200 };
00201
00202
00203
00204
00205
00206
00207
00208
00209 #endif // _H_BONDSM_SM