UploadFSM.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623
  1. #ifndef RVC_MOD_UPLOAD_UPLOADFSM_H_
  2. #define RVC_MOD_UPLOAD_UPLOADFSM_H_
  3. #include "SpBase.h"
  4. #include "SpFSM.h"
  5. #include "SpSecureClient.h"
  6. #include "SpUtility.h"
  7. #include "upload.h"
  8. #include <list>
  9. #include "IHttpFunc.h"
  10. #ifdef RVC_OS_WIN
  11. #include "json.h"
  12. #include <io.h>
  13. #else
  14. #include "json/json.h"
  15. #include <map>
  16. #endif
  17. #define USER_EVT_JMP_DISABLE EVT_USER+1
  18. #define USER_EVT_JMP_ENABLE EVT_USER+2
  19. #define USER_EVT_JMP_CONNECT EVT_USER+3
  20. #define USER_EVT_DISCONNECT EVT_USER+4
  21. #define USER_EVT_UPLOAD_ANS EVT_USER+5
  22. #define USER_EVT_BLOCK_ANS EVT_USER+6
  23. #define USER_EVT_JMP_UPLOAD EVT_USER+7
  24. #define USER_EVT_JMP_OLD_SCAN EVT_USER+8
  25. #define USER_EVT_JMP_NEW_SCAN EVT_USER+9
  26. #define USER_EVT_JMP_NEW_UPLOAD EVT_USER+10
  27. #define USER_EVT_JMP_NEW_DISABLE EVT_USER+11
  28. #define USER_EVT_UPLOAD_SUCC EVT_USER+12
  29. #define USER_EVT_UPLOAD_FAIL EVT_USER+13
  30. using namespace std;
  31. #pragma pack(1)
  32. // [StructName("UPREQ")]
  33. struct UploadReq
  34. {
  35. char TerminalNo[16];
  36. char FileName[64];
  37. char FileType[16];
  38. int FileLength;
  39. int FileCreatDate;
  40. };
  41. // [StructName("UPANS")]
  42. struct UploadReply
  43. {
  44. int ResultCode;
  45. char UploadID[16];
  46. int BeginBlock;
  47. };
  48. //[StructName("BLKREQ")]
  49. struct BlockReq
  50. {
  51. char TerminalNo[16];
  52. char FileName[64];
  53. char UploadID[16];
  54. int BlockNo;
  55. char Data[0];
  56. };
  57. //[StructName("BLKANS")]
  58. struct BlockReply
  59. {
  60. char UploadID[16];
  61. int ResultCode;
  62. };
  63. #pragma pack()
  64. enum UploadCtlCode
  65. {
  66. Finish = 0, //完成(BLOCK)
  67. Begin = 1, //开始上传(UPLOAD)
  68. Continua = 2, //文件已经存在,断点续传,按返回块开始传(UPLOAD)(BLOCK)
  69. ErrorBlock = 3, //上块错误,重新传(BLOCK)
  70. ErrorType = 4, //错误的类型(UPLOAD)
  71. Timeout = 5, //过期(UPLOAD)
  72. ErrorUploadId = 6, //错误的上传id(BLOCK)
  73. };
  74. //上传请求回应
  75. struct UploadAnsEvent : public FSMEvent
  76. {
  77. UploadAnsEvent(BYTE *pBuf, int nLen) : FSMEvent(USER_EVT_UPLOAD_ANS) {
  78. memcpy(&m_reply, pBuf, sizeof(UploadReply));
  79. }
  80. virtual ~UploadAnsEvent() {}
  81. UploadReply m_reply;
  82. };
  83. //上传块请求回应
  84. struct BlockAnsEvent : public FSMEvent
  85. {
  86. BlockAnsEvent(BYTE *pBuf, int nLen) : FSMEvent(USER_EVT_BLOCK_ANS) {
  87. memcpy(&m_reply, pBuf, sizeof(BlockReply));
  88. }
  89. virtual ~BlockAnsEvent() {}
  90. BlockReply m_reply;
  91. };
  92. /** 交易受限功能代码废弃
  93. struct UploadProgress
  94. {
  95. int uploadState;
  96. int uploadNumber;
  97. CSimpleStringA elapseTime;
  98. };
  99. */
  100. enum CenterModelEnum
  101. {
  102. branchModel = 0, //分行模式
  103. mixModel = 1, //混合模式
  104. centerModel = 2, //总行模式
  105. };
  106. struct CenterUrl
  107. {
  108. string queryPlanUrl; //上传策略查询接口
  109. string queryTempFileUrl; //查询临时计划文件状态接口
  110. string updateStateUrl; //更新上传状态接口
  111. string addUploadFailUrl; //增加失败流水接口
  112. //string uploadCenterUrl; //终端总行上传文件接口
  113. };
  114. //上传接口
  115. struct UploadFileReq : CHTTPUploadReq {
  116. };
  117. struct UploadFileRet : CHTTPUploadRet {
  118. };
  119. struct UploadDataRet{
  120. int uploaded_length;
  121. bool upload_finish;
  122. string branchFilePath;
  123. string strBody;
  124. };
  125. //上传策略查询接口
  126. struct UploadQueryPlanReq : CHTTPReq {
  127. string m_reqStr;
  128. string ToJson() {
  129. return m_reqStr;
  130. }
  131. };
  132. struct UploadQueryPlanRet : CHTTPRet {
  133. string m_retStr;
  134. bool Parse(string strData) {
  135. m_retStr=strData;
  136. return true;
  137. }
  138. };
  139. //查询临时计划文件状态接口
  140. struct UploadQueryTempFileReq : CHTTPReq {
  141. string m_reqStr;
  142. string ToJson() {
  143. return m_reqStr;
  144. }
  145. };
  146. struct UploadQueryTempFileRet : CHTTPRet {
  147. string m_retStr;
  148. bool Parse(string strData) {
  149. m_retStr=strData;
  150. return true;
  151. }
  152. };
  153. //更新上传状态接口
  154. struct UploadUpdateStateReq : CHTTPReq {
  155. string m_reqStr;
  156. string ToJson() {
  157. return m_reqStr;
  158. }
  159. };
  160. struct UploadUpdateStateRet : CHTTPRet {
  161. string m_retStr;
  162. bool Parse(string strData) {
  163. m_retStr=strData;
  164. return true;
  165. }
  166. };
  167. //增加失败流水接口
  168. struct UploadUploadFailReq : CHTTPReq {
  169. string m_reqStr;
  170. string ToJson() {
  171. return m_reqStr;
  172. }
  173. };
  174. struct UploadUploadFailRet : CHTTPRet {
  175. string m_retStr;
  176. bool Parse(string strData) {
  177. m_retStr=strData;
  178. return true;
  179. }
  180. };
  181. struct UploadPlan{
  182. string plan_id;//计划ID
  183. string branch_no;//分行号
  184. string plan_type;//计划类型 T-临时计划(Temp) P-永久计划(Permanent)
  185. string file_type;//文件类型 V-录像文件(Vedio) O-其他文件(Other)
  186. string path_type;//路径类型(R-相对路径,A-绝对路径)
  187. string path_name;//路径
  188. string file_name;//文件名通配符(*表示任意0个或N个字符,如*.* *xx xx*)
  189. string file_regex;//文件名正则表达式(通用的正则表达式,上面文件名通配符已够用,一般不使用)
  190. string before_deal_type; //上传前处理类型(Z压缩...)
  191. string after_deal_type;//上传后处理类型(D删除|M移动|N不动)
  192. string after_deal_text;//上传后处理操作(如 移动路径)
  193. int file_limit;//(文件路径下最大扫描出文件个数,默认256)
  194. int file_length_limit;//(扫描出文件最大长度限制,单位M)
  195. int max_silent;//(文件最新修改时间流失间隔,用于热点文件隔离)
  196. string upload_address_env;//上传文件地址环境:DMZ: 行外,BIZ:行内
  197. };
  198. struct UploadFileInfo:UploadPlan{
  199. string filePath; //文件绝对路径(用于读取本地文件)
  200. string fileUploadPath;//上传给总行的绝对路径(不能超过900字符)
  201. //string fileUploadRelativePath;//上传给总行的路径(不超过900字符,不包含文件名称)
  202. string fileName; //文件名称
  203. string BranchFilePath;//分行文件路径(含IP)
  204. long fileLen;// 文件长度
  205. long decFileLen;//解密后的长度
  206. string decHeadJson;//解密后自定义头
  207. string editTime;//文件最后修改时间
  208. // UploadPlan* plan;//对应的计划指针
  209. };
  210. struct UploadReport{
  211. int sum;//一批上传文件个数
  212. int succ;//上传成功文件个数
  213. int fail;//上传失败文件个数
  214. int uploadFail;//上传失败次数
  215. int decodeFail;//解密失败次数
  216. int updateState;//上传登记失败次数
  217. int operateFileFail;//上传完处理文件失败次数
  218. int queryTempFail;//查询临时文件失败次数
  219. bool isBreak;//批次是否被中断
  220. };
  221. class UploadConnection;
  222. class UploadFSM : public FSMImpl<UploadFSM>, public IFSMStateHooker, public ISysVarListener
  223. {
  224. public:
  225. enum {s0,s1,s2,s3,s4,s5,s6,s7};
  226. BEGIN_FSM_STATE(UploadFSM)
  227. FSM_STATE_ENTRY(s0,"Starting",s0_on_entry,s0_on_exit,s0_on_event)
  228. FSM_STATE_ENTRY(s1, "Disable",s1_on_entry,s1_on_exit,s1_on_event)
  229. FSM_STATE_ENTRY(s2, "Enable", s2_on_entry, s2_on_exit, s2_on_event)
  230. FSM_STATE_ENTRY(s3, "Connect", s3_on_entry, s3_on_exit, s3_on_event)
  231. FSM_STATE_ENTRY(s4, "Upload", s4_on_entry, s4_on_exit, s4_on_event)
  232. FSM_STATE_ENTRY(s5, "Release", s5_on_entry, s5_on_exit, s5_on_event)
  233. FSM_STATE_ENTRY(s6, "DisConnect", s6_on_entry, s6_on_exit, s6_on_event)//添加断连等待时间状态
  234. FSM_STATE_ENTRY(s7, "NewUpload", s7_on_entry, s7_on_exit, s7_on_event)//添加新模式上传状态
  235. END_FSM_STATE()
  236. BEGIN_FSM_RULE(UploadFSM,s0)
  237. FSM_RULE_ENTRY_ANY(s0, s1, USER_EVT_JMP_DISABLE)
  238. FSM_RULE_ENTRY_ANY(s0, s2, USER_EVT_JMP_ENABLE)
  239. FSM_RULE_ENTRY_ANY(s1, s2, USER_EVT_JMP_ENABLE)
  240. FSM_RULE_ENTRY_ANY(s2, s3, USER_EVT_JMP_CONNECT)//旧上传模式
  241. FSM_RULE_ENTRY_ANY(s2, s1, USER_EVT_JMP_DISABLE)
  242. FSM_RULE_ENTRY_ANY(s2, s7, USER_EVT_JMP_NEW_UPLOAD)//新上传模式
  243. FSM_RULE_ENTRY_ANY(s3, s4, USER_EVT_JMP_UPLOAD)
  244. FSM_RULE_ENTRY_ANY(s3, s1, USER_EVT_JMP_DISABLE)
  245. FSM_RULE_ENTRY(s4, s5, USER_EVT_UPLOAD_ANS, 1)
  246. FSM_RULE_ENTRY(s4, s6, USER_EVT_DISCONNECT, 1)//断连时跳转到S6
  247. FSM_RULE_ENTRY(s4, s5, USER_EVT_BLOCK_ANS, 1)
  248. FSM_RULE_ENTRY_ANY(s4, s5, EVT_TIMER)
  249. FSM_RULE_ENTRY_ANY(s4, s1, USER_EVT_JMP_DISABLE)
  250. FSM_RULE_ENTRY_ANY(s5, s2, EVT_TIMER)
  251. FSM_RULE_ENTRY_ANY(s5, s2, USER_EVT_DISCONNECT)
  252. FSM_RULE_ENTRY_ANY(s5, s1, USER_EVT_JMP_DISABLE)
  253. FSM_RULE_ENTRY_ANY(s6, s2, EVT_TIMER)//等待一段时间进入S2
  254. FSM_RULE_ENTRY_ANY(s6, s1, USER_EVT_JMP_DISABLE)
  255. FSM_RULE_ENTRY_ANY(s7, s2, EVT_TIMER)//等待一段时间进入s2,重新开始扫描文件
  256. FSM_RULE_ENTRY_ANY(s7, s1, USER_EVT_JMP_NEW_DISABLE)//等待一段时间进入s2
  257. END_FSM_RULE()
  258. UploadFSM();
  259. ~UploadFSM();
  260. virtual void OnStateTrans(int iSrcState, int iDstState);
  261. virtual void OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName);
  262. virtual ErrorCodeEnum OnInit();
  263. virtual ErrorCodeEnum OnExit();
  264. void s0_on_entry();
  265. void s0_on_exit();
  266. unsigned int s0_on_event(FSMEvent* event);
  267. void s1_on_entry();
  268. void s1_on_exit();
  269. unsigned int s1_on_event(FSMEvent* event);
  270. void s2_on_entry();
  271. void s2_on_exit();
  272. unsigned int s2_on_event(FSMEvent* event);
  273. void s3_on_entry();
  274. void s3_on_exit();
  275. unsigned int s3_on_event(FSMEvent* event);
  276. void s4_on_entry();
  277. void s4_on_exit();
  278. unsigned int s4_on_event(FSMEvent* event);
  279. void s5_on_entry();
  280. void s5_on_exit();
  281. unsigned int s5_on_event(FSMEvent* event);
  282. void s6_on_entry();
  283. void s6_on_exit();
  284. unsigned int s6_on_event(FSMEvent* event);
  285. void s7_on_entry();
  286. void s7_on_exit();
  287. unsigned int s7_on_event(FSMEvent* event);
  288. private:
  289. /** 交易受限功能代码废弃
  290. ErrorCodeEnum LoadServerConfigFromCenterSetting();
  291. */
  292. file_t *find_first_upload_file();
  293. void post_process();
  294. /** 交易受限功能代码废弃
  295. int getUploadFileNum(int &fileSumlen);
  296. public:
  297. int getCheckDirFile(int silentTime);//检查文件夹文件个数
  298. void getUploadProgress(UploadProgress &progress);//获取上传文件状态
  299. bool clearUploadDate();//清空上传日期
  300. ErrorCodeEnum SaveUploadDate();//保存上传日期
  301. ErrorCodeEnum getUploadDate(CAutoArray<CSimpleStringA> &strList);//获取上传日期
  302. ErrorCodeEnum insertUploadDate();//插入上传日期
  303. bool uploadDate_exist(CSimpleStringA uploadDate);
  304. */
  305. public:
  306. bool queryPlan();//查询上传策略(true表示新模式,false表示旧模式)
  307. void scanFile();//扫描文件
  308. void scanDirfresh(UploadPlan* plan,const char* path);
  309. static void HttpsLogCallBack(const char* logtxt);
  310. bool IsFileMatch(const char *pszFilter, const char *pszFileName);//通配符过滤
  311. ErrorCodeEnum SM3FileToStr(CSimpleStringA strFilePath, CSimpleStringA &strSM3,bool isSub);//文件获取SM3
  312. ErrorCodeEnum SM3_Str(CSimpleStringA &strSM3,BYTE * SM3Byte,bool isSub);//获取SM3字符串
  313. bool getFileContent(FILE* file,unsigned char* content,int beginPos, int contentLen);//从文件中获取内容
  314. bool test_zero_ref(const char *path);
  315. bool GetFileLength(const char* filePath,long &fileLen);//获取文件长度
  316. void reportBatchMsg();//报告批次消息
  317. private:
  318. UploadConnection *m_pConnection;
  319. file_t *m_uploading_file; //当前正在上传的文件
  320. int m_uploading_block_id; //正在上传的块号
  321. #ifdef RVC_OS_WIN
  322. HANDLE m_uploading_handle;
  323. #else()
  324. FILE* m_uploading_handle;
  325. #endif // RVC_OS_WIN
  326. char m_upload_id[16];
  327. CSimpleStringA m_terminalNo;
  328. /** 交易受限功能代码废弃
  329. CSimpleStringA m_server1;
  330. int m_server1_port;
  331. CSimpleStringA m_server2;
  332. int m_server2_port;
  333. */
  334. struct list_head m_updir_list;//文件夹配置列表
  335. //添加lwt
  336. /** 交易受限功能代码废弃
  337. list<CSimpleStringA>* m_check_dir;//重点文件夹的列表
  338. DWORD m_dBeginTime;//统计上传速度开始时间
  339. DWORD m_dEndTime;//统计上传速度结束时间
  340. int m_iSpeed;//单位k/ms
  341. CRITICAL_SECTION m_cs;//临界区变量
  342. list<CSimpleStringA>* m_uploadDateList;//上传日期文件列表
  343. */
  344. bool m_isOffLine;//是否坐席空闲
  345. int m_centerModel;//上传模式 (0:分行模式 1:混合模式 2:总行模式)
  346. bool m_uploadModel; //上传文件模式 (false:分行模式 ,true:总行模式)
  347. list<UploadFileInfo*>* m_uploadList; //新模式下待上传文件列表
  348. list<UploadPlan*>* m_uploadPlanList; //新模式策略列表
  349. public:
  350. CenterUrl m_centerUrl;//访问总行的url地址集合
  351. string m_rootPath ;//系统根路径,例如:windows: C: linux:/opt
  352. UploadFileInfo* m_currUploadFile;//正在上传的文件指针
  353. map<int,string> m_branchIpList;//新模式下分行服务器列表
  354. int m_eachUploadLen;//每次上传数据的最大长度,单位K
  355. UploadReport m_uploadReport;//每批次上传告警统计
  356. };
  357. class UploadConnection : public SpSecureClient
  358. {
  359. public:
  360. UploadConnection(CEntityBase *pEntity, UploadFSM *pFSM) : SpSecureClient(pEntity), m_pFSM(pFSM) {}
  361. void SendUpReq(file_t *file)
  362. {
  363. UploadReq req = {0};
  364. CSystemStaticInfo si;
  365. {
  366. m_pEntity->GetFunction()->GetSystemStaticInfo(si);
  367. }
  368. strcpy(&req.TerminalNo[0], si.strTerminalID);
  369. strcpy(&req.FileType[0], file->owner->name);
  370. #ifdef RVC_OS_WIN
  371. strcpy(&req.FileName[0], file->name);
  372. #else
  373. string fileName = file->name;
  374. std::string result = SP::Utility::UTF8ToGBK(fileName);
  375. strcpy(&req.FileName[0], result.c_str());
  376. #endif // RVC_OS_WIN
  377. req.FileLength = file->length;
  378. req.FileCreatDate = file->create_time;
  379. CSmartPointer<IPackage> pkt = CreateNewPackage("UPREQ");
  380. pkt->AddStruct("UPREQ", false, false, (LPBYTE)&req, sizeof(UploadReq));
  381. SendPackage(pkt);
  382. }
  383. #ifdef RVC_OS_WIN
  384. bool SendBlockReq(file_t* file, HANDLE hFile, const char* upload_id, int block_id)
  385. {
  386. bool ret = true;
  387. int nLen = sizeof(BlockReq) + 0x8000;
  388. BlockReq* req = (BlockReq*)new BYTE[nLen];
  389. memset(req, 0, nLen);
  390. CSystemStaticInfo si;
  391. {
  392. m_pEntity->GetFunction()->GetSystemStaticInfo(si);
  393. }
  394. req->BlockNo = block_id;
  395. strcpy(&req->TerminalNo[0], si.strTerminalID);
  396. strcpy(&req->FileName[0], file->name);
  397. memcpy(req->UploadID, upload_id, sizeof(req->UploadID));
  398. DWORD dwOffset = block_id << 15; // 32k once
  399. DWORD dwLength = min(file->length - dwOffset, 1 << 15);
  400. SetFilePointer(hFile, dwOffset, NULL, FILE_BEGIN);
  401. BOOL bRet = ReadFile(hFile, &req->Data[0], dwLength, &dwLength, NULL);
  402. if (bRet) {
  403. //Dbg("block len:%d", dwLength);
  404. CSmartPointer<IPackage>pkt = CreateNewPackage("BLKREQ");
  405. pkt->AddStruct("BLKREQ", false, false, (LPBYTE)req, sizeof(BlockReq) + dwLength);
  406. SendPackage(pkt);
  407. ret = true;
  408. }
  409. else {
  410. //增加跳出分支,防止状态机跳不出
  411. DWORD err = GetLastError();
  412. Dbg("SendBlockReq is error file name [%s] , block_id [%d] , GetLastError = %d", file->name, block_id, err);
  413. ret = false;
  414. }
  415. delete req;
  416. return ret;
  417. }
  418. #else
  419. bool SendBlockReq(file_t* file, FILE* hFile, const char* upload_id, int block_id)
  420. {
  421. bool ret = true;
  422. int nLen = sizeof(BlockReq) + 0x8000;
  423. BlockReq* req = (BlockReq*)new BYTE[nLen];
  424. memset(req, 0, nLen);
  425. CSystemStaticInfo si;
  426. {
  427. m_pEntity->GetFunction()->GetSystemStaticInfo(si);
  428. }
  429. req->BlockNo = block_id;
  430. strcpy(&req->TerminalNo[0], si.strTerminalID);
  431. string fileName = file->name;
  432. std::string result = SP::Utility::UTF8ToGBK(fileName);
  433. strcpy(&req->FileName[0], fileName.c_str());
  434. memcpy(req->UploadID, upload_id, sizeof(req->UploadID));
  435. DWORD dwOffset = block_id << 15; // 32k once
  436. //DWORD dwLength = min(file->length - dwOffset, 1 << 15);
  437. DWORD dwLength = ((file->length - dwOffset) < (1 << 15)) ? (file->length - dwOffset) : (1 << 15);
  438. if (fseek(hFile, dwOffset, SEEK_SET)==0) {
  439. int bRet = fread(&req->Data[0], dwLength, 1, hFile);
  440. //dwLength=0时,表示文件长度是0,也需要发送到分行服务
  441. if (bRet == 1||dwLength==0) {
  442. CSmartPointer<IPackage>pkt = CreateNewPackage("BLKREQ");
  443. pkt->AddStruct("BLKREQ", false, false, (LPBYTE)req, sizeof(BlockReq) + dwLength);
  444. SendPackage(pkt);
  445. ret = true;
  446. }
  447. else {
  448. //增加跳出分支,防止状态机跳不出
  449. Dbg("SendBlockReq fread fail, is error file name [%s] , block_id [%d] ", file->name, block_id);
  450. ret = false;
  451. }
  452. }
  453. else {
  454. //增加跳出分支,防止状态机跳不出
  455. Dbg("SendBlockReq fseek fail, is error file name [%s] , block_id [%d]", file->name, block_id);
  456. ret = false;
  457. }
  458. delete req;
  459. return ret;
  460. }
  461. #endif // RVC_OS_WIN
  462. protected:
  463. virtual ~UploadConnection() {}
  464. virtual void OnDisconnect()
  465. {
  466. m_pFSM->PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
  467. }
  468. virtual void OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
  469. {
  470. string serviceCode = pRecvPkg->GetServiceCode();
  471. if (serviceCode == "UPREQ")
  472. {
  473. DWORD dwSysCode, dwUserCode;
  474. string strErrMsg;
  475. ErrorCodeEnum rc = Error_Succeed;
  476. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  477. {
  478. rc = (ErrorCodeEnum)dwSysCode;
  479. LogWarn(Severity_Low, rc, dwUserCode, CSimpleStringA::Format("create up packet Fail!, %s", strErrMsg.c_str()).GetData());
  480. //Sleep(3000);
  481. OnDisconnect();
  482. }
  483. else
  484. {
  485. int nLen = pRecvPkg->GetStructLen("UPANS");
  486. if (nLen > 0)
  487. {
  488. BYTE *pBuf = new BYTE[nLen];
  489. memset(pBuf, 0, nLen);
  490. int nArrayNum = 0;
  491. if (pRecvPkg->GetStructData("UPANS", pBuf, &nLen, &nArrayNum))
  492. {
  493. FSMEvent *evt = new UploadAnsEvent(pBuf, nLen);
  494. m_pFSM->PostEventFIFO(evt);
  495. }
  496. else
  497. {
  498. Dbg("create invalid upans packet!");
  499. OnDisconnect();
  500. }
  501. delete pBuf;
  502. }else{
  503. //nlen增加跳出分支
  504. Dbg("upans packet len is error len=%d",nLen);
  505. //Sleep(1000);
  506. OnDisconnect();
  507. }
  508. }
  509. }
  510. else if (serviceCode == "BLKREQ")
  511. {
  512. DWORD dwSysCode, dwUserCode;
  513. string strErrMsg;
  514. ErrorCodeEnum rc = Error_Succeed;
  515. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  516. {
  517. rc = (ErrorCodeEnum)dwSysCode;
  518. LogError(Severity_Middle, rc, dwUserCode, CSimpleStringA::Format("create up blk Fail!, %s", strErrMsg.c_str()));
  519. //Sleep(3000);
  520. OnDisconnect();
  521. }
  522. else
  523. {
  524. int nLen = pRecvPkg->GetStructLen("BLKANS");
  525. if (nLen > 0)
  526. {
  527. BYTE *pBuf = new BYTE[nLen];
  528. memset(pBuf, 0, nLen);
  529. int nArrayNum = 0;
  530. if (pRecvPkg->GetStructData("BLKANS", pBuf, &nLen, &nArrayNum))
  531. {
  532. FSMEvent *evt = new BlockAnsEvent(pBuf, nLen);
  533. m_pFSM->PostEventFIFO(evt);
  534. }
  535. else
  536. {
  537. Dbg("create invalid blkans packet!");
  538. OnDisconnect();
  539. }
  540. delete pBuf;
  541. }else{
  542. //nlen增加跳出分支
  543. Dbg("blkans packet len is error len=%d",nLen);
  544. //Sleep(1000);
  545. OnDisconnect();
  546. }
  547. }
  548. }
  549. else
  550. {
  551. Dbg("unknown service code! code= %s",serviceCode.c_str());
  552. //Sleep(2000);
  553. OnDisconnect();
  554. }
  555. }
  556. private:
  557. UploadFSM *m_pFSM;
  558. };
  559. #endif // RVC_MOD_UPLOAD_UPLOADFSM_H_