mod_HolderContext.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. // mod_systemcustomization.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. #include "stdafx.h"
  4. #include "SpBase.h"
  5. #include "..\EventCode.h"
  6. #include "HolderContextFSM.h"
  7. #include "io.h"
  8. #include "HolderContext_server_g.h"
  9. #include "HolderContext_def_g.h"
  10. #include "../mod_MaintainWatcher/MaintainWatcher_msg_g.h"
  11. using namespace MaintainWatcher;
  12. using namespace HolderContext;
  13. //机型
  14. #define MACHINE_TYPE_STAND2S "RVC.Stand2S" //站立式双屏
  15. #define MACHINE_TYPE_STAND1S "RVC.Stand1S" //站立式单屏
  16. #define MACHINE_TYPE_EMBED2S "RVC.Embed2S" //嵌墙式双屏
  17. #define MACHINE_TYPE_EMBED1S "RVC.Embed1S" //嵌墙式单屏
  18. #define MACHINE_TYPE_PAD "RVC.Pad" //携带式移动终端
  19. #define MACHINE_TYPE_WALL "RVC.Wall" //挂壁式
  20. //场所
  21. #define SITE_LIB "cmb.LIB"//银行大堂内
  22. #define SITE_SSB "cmb.SSB"//自助营业网点
  23. #define SITE_FLB "cmb.FLB"//离行机器,银行业务为主界面,如企业,商场
  24. #define SITE_LSS "cmb.LSS"//面向生活销售机,一般部署在小区,面向销售广告
  25. #define SITE_SMM "cmb.SMM"//商场销售门户,放置在商场,多商户门户
  26. class CHolderContextEntiy;
  27. class HolderContextSession : public HolderContext_ServerSessionBase
  28. {
  29. public:
  30. HolderContextSession(CHolderContextEntiy *pEntity): m_pEntity(pEntity) {}
  31. virtual ~HolderContextSession() {}
  32. virtual void Handle_SetHolderState(SpReqAnsContext<HolderContext_SetHolderState_Req, HolderContext_SetHolderState_Ans>::Pointer ctx);
  33. virtual void Handle_PickUp(SpReqAnsContext<HolderContext_PickUp_Req, HolderContext_PickUp_Ans>::Pointer ctx);
  34. virtual void Handle_Hangup(SpOnewayCallContext<HolderContext_Hangup_Info>::Pointer ctx);
  35. virtual void Handle_CheckHolderRights(SpReqAnsContext<HolderContext_CheckHolderRights_Req, HolderContext_CheckHolderRights_Ans>::Pointer ctx);
  36. private:
  37. CHolderContextEntiy *m_pEntity;
  38. };
  39. class CHolderContextEntiy : public CEntityBase, public ILogListener, public IBroadcastListener, public ISysVarListener
  40. {
  41. public:
  42. CHolderContextEntiy() {}
  43. virtual ~CHolderContextEntiy() {}
  44. virtual const char *GetEntityName() const { return "HolderContext"; }
  45. bool StrEqual(const char *s1, const char *s2,int len)
  46. {
  47. for (int i = 0; i < len; ++i)
  48. {
  49. if (toupper(s1[i]) != toupper(s2[i]))
  50. return false;
  51. }
  52. return true;
  53. }
  54. ErrorCodeEnum LoadRootConfig()
  55. {
  56. CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
  57. CSmartPointer<IConfigInfo> spConfig;
  58. ErrorCodeEnum Error = spFunction->OpenConfig(Config_Root, spConfig);
  59. if (Error_Succeed == Error)
  60. {
  61. Error = spConfig->ReadConfigValue("Terminal", "MachineType", m_strMachineType);
  62. if(Error_Succeed == Error)
  63. {
  64. Error = spConfig->ReadConfigValue("Terminal", "Site", m_strSite);
  65. if(Error_Succeed != Error)
  66. {
  67. Dbg("ReadConfigValue Site failed");
  68. }
  69. }
  70. else
  71. {
  72. Dbg("ReadConfigValue MachineType failed");
  73. }
  74. }
  75. return Error;
  76. }
  77. void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext)
  78. {
  79. //MessageBox(0,NULL,NULL,0);
  80. Dbg("OnPreStart.");
  81. ErrorCodeEnum Error = Error_Succeed;
  82. //TODO:订阅持有者登录事件(电子钥匙验证通过事件),获取持有者信息
  83. ErrorCodeEnum errorCode = Error_Succeed;
  84. CSystemStaticInfo StaticInfo;
  85. CSmartPointer<IEntityFunction> spEntityFunction = GetFunction();
  86. errorCode = spEntityFunction->GetSystemStaticInfo(StaticInfo);
  87. if (Error_Succeed != errorCode)
  88. {
  89. Dbg("GetSystemStaticInfo failed. %s",StaticInfo.strMachineType);
  90. return;
  91. }
  92. Dbg("GetSystemStaticInfo ok. %s",StaticInfo.strMachineType);
  93. if(0 == _stricmp(StaticInfo.strMachineType, "RVC.PAD"))
  94. {
  95. Dbg("pad.");
  96. CUUID m_SubIDHolderLogon;
  97. char cHolderInfo[2048] = {0};
  98. errorCode = spEntityFunction->SubscribeBroadcast("MaintainWatcher", cHolderInfo, this, m_SubIDHolderLogon);
  99. if(errorCode != Error_Succeed)
  100. {
  101. LOG_TRACE("Subscribe MaintainWatcher evt failed 0x%x");
  102. Dbg("Subscribe MaintainWatcher evt failed.");
  103. return;
  104. }
  105. Dbg("SubScribe MaintainWatcher status broadcast suc.");
  106. }
  107. if (__OnStart(Error_Succeed)!=Error_Succeed)
  108. {
  109. return;
  110. }
  111. // delete code
  112. //不订阅心跳实体的指令事件
  113. /*Dbg("SubscribeLog.");
  114. 订阅心跳实体的指令事件
  115. Error = GetFunction()->SubscribeLog(m_UUIDHeatbeat, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_INC_VEDIO_CONNECTING, "HeartBeat", false)
  116. if (Error_Succeed != Error)
  117. {
  118. Dbg("SubScribe LOG_EVT_HEARTBEAT_CONSTRATCIONS failed.");
  119. }*/
  120. Dbg("before Init.");
  121. Error = m_fsm.Init(this);
  122. Dbg("Init return %d",Error);
  123. pTransactionContext->SendAnswer(Error) ;
  124. }
  125. void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext)
  126. {
  127. __OnClose(Error_Succeed);
  128. pTransactionContext->SendAnswer(Error_Succeed);
  129. }
  130. //delete code
  131. void OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
  132. const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
  133. const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage)
  134. {
  135. /*
  136. if (dwUserCode == LOG_EVT_INC_VEDIO_CONNECTING)
  137. {
  138. //Dbg("recv log event from Heartbeat, Instruction[%s]", pszMessage);
  139. //add code by @wb
  140. Dbg("recv log event from Connect, Instruction[%s]", pszMessage);
  141. if (NULL != pszMessage)
  142. {
  143. m_fsm.HandleInstrution(pszMessage);
  144. }
  145. } */
  146. if (strlen(pszMessage)>2)
  147. {
  148. CSimpleStringA str = pszMessage;
  149. if (str[str.GetLength()-2] == '\r' && str[str.GetLength()-1]=='\n')
  150. str[str.GetLength()-2] = 0;
  151. if (eLogType == Log_Error)
  152. str = CSimpleStringA::Format("[%s] %s || SysCode: 0x%X, UserCode: 0x%X\r\n", pszEntityName, (const char*)str, dwSysError, dwUserCode);
  153. else
  154. str = CSimpleStringA::Format("[%s] %s\r\n", pszEntityName, (const char*)str);
  155. }
  156. }
  157. void OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName)
  158. {
  159. //"O", // Offline
  160. // "C", // Connecting
  161. // "H", // HandFree
  162. // "P", // Pickup
  163. // "B", // Broken
  164. // "F", // Fail
  165. // "R", // Releasing
  166. if (m_fsm.m_bHolderBusy)
  167. {
  168. Dbg("正在示忙状态");
  169. return;
  170. }
  171. //过滤非手机呼pad模式的广播消息
  172. if (FALSE == m_fsm.m_bIncomeHangup){
  173. CSimpleStringA strValue;
  174. ErrorCodeEnum Error = this->GetFunction()->GetSysVar("CallType", strValue);
  175. if (Error == Error_Succeed) {
  176. if (strValue[0] == 'N') {
  177. return;
  178. }
  179. }
  180. }
  181. //通话状态
  182. if (0 == _stricmp(pszKey, "CallState"))
  183. {
  184. Dbg("CallState from : %c to %c", pszOldValue[0], pszValue[0]);
  185. m_fsm.m_CurCallState = pszValue[0];
  186. //除了offline状态对应“S”或“R”,其它通话状态都对应“B”
  187. if (pszValue[0] == 'O' || pszValue[0] == 'R')
  188. {
  189. /*if (m_fsm.m_bMenu)
  190. {
  191. Dbg("通话结束且首页状态,设置S状态");
  192. m_fsm.SetHolderState("S");
  193. }*/
  194. //给业务层广播连接断开消息
  195. Connecting e;
  196. SpSendBroadcast(this->GetFunction(), eMsg_DisConnect, eMsgSig_DisConnect, e);
  197. Dbg("SpSendBroadcast eMsg_DisConnect");
  198. }
  199. else
  200. {
  201. if ((pszValue[0] == 'H')||(pszValue[0] == 'P'))
  202. {
  203. //给业务层广播连接成功消息
  204. Connecting e;
  205. SpSendBroadcast(this->GetFunction(), eMsg_Connected, eMsgSig_Connected, e);
  206. Dbg("SpSendBroadcast eMsg_Connected");
  207. }
  208. else if (pszValue[0] == 'C')
  209. {
  210. //给业务层广播正在连接消息
  211. Connecting e;
  212. SpSendBroadcast(this->GetFunction(), eMsg_Connecting, eMsgSig_Connecting, e);
  213. Dbg("SpSendBroadcast eMsg_Connecting");
  214. }
  215. Dbg("响应CallSate变化,设置为B状态!");
  216. m_fsm.SetHolderState("B");
  217. }
  218. //m_fsm.SetHolderState(pszValue);
  219. }
  220. else if (0 == _stricmp(pszKey, "UIState"))
  221. {
  222. Dbg("UIState from : %c to %c", pszOldValue[0], pszValue[0]);
  223. if (pszValue[0] == 'M'
  224. || pszValue[0] == 'A'
  225. || pszValue[0] == 'T'
  226. || pszValue[0] == 'X')
  227. {
  228. //界面状态UIState。定义当前交互层所处的交互模式。有8种状态:目录浏览M、随机广告A、目标广告T、业务填单F、交易确认C、业务提交S、请求回报R、暂停响应Z。初始状态为M。
  229. //M、A、T三种状态都认为在首页
  230. Dbg("首页状态!");
  231. m_fsm.m_bMenu = TRUE;
  232. /*if (m_fsm.m_CurCallState == "O")
  233. {
  234. Dbg("首页状态且通话结束,设置S状态");
  235. m_fsm.SetHolderState("S");
  236. }*/
  237. }
  238. else
  239. {
  240. m_fsm.m_bMenu = FALSE;
  241. }
  242. }
  243. else
  244. {
  245. Dbg("warning: unknown Sys var changed!");
  246. }
  247. }
  248. virtual void OnBroadcastEvent(CUUID SubID, const char *pszEntityName,DWORD dwMessageId, DWORD dwMessageSignature,CAutoBuffer Buffer)
  249. {
  250. UkeyVerifyEx fc;
  251. Dbg("%s,%d,%d",pszEntityName,dwMessageId,dwMessageSignature);
  252. if (_strnicmp(pszEntityName, "MaintainWatcher", strlen("MaintainWatcher")) == 0)
  253. {
  254. switch (dwMessageSignature)
  255. {
  256. case eMsgSig_UkeyInsert:
  257. Dbg("recieve MaintainWatcher eMsgSig_UkeyInsert");
  258. break;
  259. case eMsgSig_UkeyPullOut:
  260. m_fsm.m_bLogon = FALSE;
  261. Dbg("recieve MaintainWatcher eMsgSig_UkeyPullOut");
  262. break;
  263. case eMsgSig_UkeyVerifyEx:
  264. m_fsm.m_bLogon = TRUE;
  265. SpBuffer2Object(Buffer, fc);
  266. m_fsm.GetHolderMsg(fc.UserInfo);
  267. Dbg("recieve MaintainWatcher eMsg_UkeyVerify");
  268. break;
  269. default:
  270. Dbg("recieve unknown MaintainWatcher entity Broadcast msg type");
  271. break;
  272. }
  273. }
  274. }
  275. ErrorCodeEnum __OnStart(ErrorCodeEnum preOperationError)
  276. {
  277. CSmartPointer<IEntityFunction> Func = GetFunction();
  278. CSimpleStringA strValue;
  279. if (Func->RegistSysVarEvent("CallState", this)!=Error_Succeed)
  280. {
  281. Dbg("RegistSysVarEvent CallState Fail!");
  282. }
  283. else
  284. {
  285. Func->GetSysVar("CallState", strValue);
  286. Dbg("RegistSysVarEvent CallState success,value=%s",strValue);
  287. m_fsm.m_HolderState.State = strValue;
  288. }
  289. return Error_Succeed;
  290. }
  291. ErrorCodeEnum __OnClose(ErrorCodeEnum preOperationError)
  292. {
  293. LOG_FUNCTION();
  294. CSmartPointer<IEntityFunction> Func = GetFunction();
  295. Func->UnregistSysVarEvent("CallState");
  296. Func->UnsubscribeBroadcast("MaintainWatcher");
  297. //delete code
  298. //Func->UnsubscribeLog(m_UUIDHeatbeat);
  299. return Error_Succeed;
  300. }
  301. virtual bool IsService()const{return true;}
  302. virtual CServerSessionBase *OnNewSession(const char* /*pszRemoteEntityName*/, const char * /*pszParam*/){return new HolderContextSession(this);}
  303. public:
  304. HolderContextFSM m_fsm;
  305. private:
  306. //delete code
  307. //CUUID m_UUIDHeatbeat;
  308. CSimpleStringA m_strMachineType, m_strSite;
  309. bool m_bWow64, m_bPad, m_bFlb;
  310. };
  311. void HolderContextSession::Handle_SetHolderState(SpReqAnsContext<HolderContext_SetHolderState_Req, HolderContext_SetHolderState_Ans>::Pointer ctx)
  312. {
  313. Dbg("On Handle_SetHolderState!");
  314. ctx->Answer(Error_Succeed); // 告知中台已经收到状态设置
  315. Dbg("业务界面设置状态[%s]", ctx->Req.state);
  316. if ("B" == ctx->Req.state)
  317. {
  318. Dbg("点击示忙!");
  319. m_pEntity->m_fsm.m_bHolderBusy = TRUE;
  320. }
  321. else if ("S" == ctx->Req.state)
  322. {
  323. Dbg("点击示闲,或通话结束且退出业务界面!");
  324. m_pEntity->m_fsm.m_bHolderBusy = FALSE;
  325. }
  326. m_pEntity->m_fsm.m_HolderState.State = ctx->Req.state;
  327. if (m_pEntity->m_fsm.SetHolderState(ctx->Req.state))
  328. {
  329. Dbg("Handle_SetHolderState ok!");
  330. }
  331. else
  332. {
  333. Dbg("Handle_SetHolderState failed!");
  334. }
  335. }
  336. void HolderContextSession::Handle_PickUp(SpReqAnsContext<HolderContext_PickUp_Req, HolderContext_PickUp_Ans>::Pointer ctx)
  337. {
  338. Dbg("On Handle_PickUp!");
  339. ctx->Answer(Error_Succeed); // 告知中台已经收到接听动作
  340. if (m_pEntity->m_fsm.SendConnectTask())
  341. {
  342. Dbg("Handle_PickUp ok!");
  343. }
  344. else
  345. {
  346. Dbg("Handle_PickUp failed!");
  347. }
  348. }
  349. void HolderContextSession::Handle_Hangup(SpOnewayCallContext<HolderContext_Hangup_Info>::Pointer ctx)
  350. {
  351. Dbg("On Handle_Hangup!");
  352. if (m_pEntity->m_fsm.HangupTask())
  353. {
  354. Dbg("Handle_Hangup ok!");
  355. }
  356. else
  357. {
  358. Dbg("Handle_Hangup failed!");
  359. }
  360. }
  361. void HolderContextSession::Handle_CheckHolderRights(SpReqAnsContext<HolderContext_CheckHolderRights_Req, HolderContext_CheckHolderRights_Ans>::Pointer ctx)
  362. {
  363. Dbg("On Handle_CheckHolderRights!");
  364. //检测权限是否足够,检测结果返回业务
  365. DWORD dwRet = m_pEntity->m_fsm.CheckHolderRights();
  366. if (Error_Succeed == dwRet)
  367. {
  368. Dbg("Handle_CheckHolderRights ok!");
  369. ctx->Ans.Errcode = Error_Succeed;
  370. ctx->Ans.ErrMsg = "";
  371. ctx->Answer(Error_Succeed);
  372. }
  373. else
  374. {
  375. Dbg("Handle_CheckHolderRights failed!");
  376. ctx->Ans.Errcode = m_pEntity->m_fsm.m_nErrcode;
  377. ctx->Ans.ErrMsg = m_pEntity->m_fsm.m_strErrmsg;
  378. ctx->Answer(Error_Succeed);
  379. }
  380. return;
  381. }
  382. SP_BEGIN_ENTITY_MAP()
  383. SP_ENTITY(CHolderContextEntiy)
  384. SP_END_ENTITY_MAP()