UpgradeMgrCnn.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827
  1. #include "UpgradeMgrConn.h"
  2. #include <string.h>
  3. #include "GetDevInfoHelper.h"
  4. #include "UpgradeMgrFSM.h"
  5. #include "mod_UpgradeMgr.h"
  6. #ifdef RVC_OS_WIN
  7. #else
  8. #include <sys/utsname.h>
  9. #include <errno.h>
  10. #endif
  11. namespace UpgradeConnect {
  12. void CUpgradeMgrConn::OnDisconnect()
  13. {
  14. Dbg("connection disconnect");
  15. m_pFSM->PostEventFIFO(new FSMEvent(CReportMgrFSM::Event_Disconnected));
  16. }
  17. void CUpgradeMgrConn::OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
  18. {
  19. string serviceCode = pRecvPkg->GetServiceCode();
  20. if (serviceCode == "POLL")
  21. {
  22. HandlePollUpgradeRet(pRecvPkg);
  23. }
  24. else if (serviceCode == "CONFIRM")
  25. {
  26. HandleConfirmUpgradeRet(pRecvPkg);
  27. }
  28. else if (serviceCode == "REPORT")
  29. {
  30. HandleReportRet(pRecvPkg);
  31. }
  32. else if (serviceCode == "QRYEXEC")
  33. {
  34. HandleQueryExecInfoRet(pRecvPkg);
  35. }
  36. else if (serviceCode == "MD5List")
  37. {
  38. HandleMD5ListRet(pRecvPkg);
  39. }
  40. else if (serviceCode == "CUSVER")
  41. {
  42. HandleReportSysCustomVerRet(pRecvPkg);
  43. }
  44. else
  45. {
  46. LOG_TRACE("unknown service code: %s", serviceCode.c_str());
  47. }
  48. }
  49. ErrorCodeEnum CUpgradeMgrConn::SendConfirmUpgradeReq(const char* pPackExecID)
  50. {
  51. CSmartPointer<IPackage> package = CreateNewPackage("CONFIRM");
  52. Confirm_Req req = {};
  53. #ifdef RVC_OS_WIN
  54. strncpy_s(req.PackExecID, sizeof(req.PackExecID), pPackExecID, _TRUNCATE);
  55. #else
  56. strncpy(req.PackExecID, pPackExecID, sizeof(req.PackExecID));
  57. #endif
  58. package->AddStruct("CONF_REQ", false, false, (BYTE*)&req, sizeof(req), 1);
  59. //Dbg("send upgrade confirm package");
  60. SendPackage(package);
  61. return Error_Succeed;
  62. }
  63. ErrorCodeEnum CUpgradeMgrConn::SendQueryExecInfoReq(const char* pPackExecID)
  64. {
  65. CSmartPointer<IPackage> package = CreateNewPackage("QRYEXEC");
  66. QueryExec_Req req = {};
  67. #ifdef RVC_OS_WIN
  68. strncpy_s(req.PackExecID, sizeof(req.PackExecID), pPackExecID, _TRUNCATE);
  69. #else
  70. strncpy(req.PackExecID, pPackExecID, sizeof(req.PackExecID));
  71. #endif
  72. package->AddStruct("EXEC_REQ", false, false, (BYTE*)&req, sizeof(req), 1);
  73. //Dbg("send upgrade confirm package");
  74. SendPackage(package);
  75. return Error_Succeed;
  76. }
  77. ErrorCodeEnum CUpgradeMgrConn::SendPollUpgradeReq(bool IsHashComputed)
  78. {
  79. auto pFunc = m_pEntity->GetFunction();
  80. CSystemStaticInfo info;
  81. auto rc = pFunc->GetSystemStaticInfo(info);
  82. if (rc != Error_Succeed)
  83. {
  84. LogError(Severity_Middle, rc, 0, "get system static info error");
  85. return rc;
  86. }
  87. PollUpgrade_Req4 req1;
  88. memset(&req1, 0, sizeof(req1));
  89. strncpy(req1.TerminalNo, info.strTerminalID, sizeof(req1.TerminalNo)-1);
  90. strncpy(req1.MachineType, info.strMachineType, sizeof(req1.MachineType)-1);
  91. // 设备版本,低两位为小版本号,高两位为大版本号 Binary 4
  92. WORD nMajor = info.MachineVersion.GetMajor();
  93. req1.MachineVersion[0] = (nMajor >> 8) & 0xFF;
  94. req1.MachineVersion[1] = nMajor & 0xFF;
  95. WORD nMinor = info.MachineVersion.GetMinor();
  96. req1.MachineVersion[2] = (nMinor >> 8) & 0xFF;
  97. req1.MachineVersion[3] = nMinor & 0xFF;
  98. // 安装版本,其中包含软件框架版本 binary 8
  99. WORD nTmp = info.InstallVersion.GetMajor();
  100. req1.InstallVersion[0] = (nTmp >> 8) & 0xFF;
  101. req1.InstallVersion[1] = nTmp & 0xFF;
  102. nTmp = info.InstallVersion.GetMinor();
  103. req1.InstallVersion[2] = (nTmp >> 8) & 0xFF;
  104. req1.InstallVersion[3] = nTmp & 0xFF;
  105. nTmp = info.InstallVersion.GetRevision();
  106. req1.InstallVersion[4] = (nTmp >> 8) & 0xFF;
  107. req1.InstallVersion[5] = nTmp & 0xFF;
  108. nTmp = info.InstallVersion.GetBuild();
  109. req1.InstallVersion[6] = (nTmp >> 8) & 0xFF;
  110. req1.InstallVersion[7] = nTmp & 0xFF;
  111. // OS版本
  112. #ifdef RVC_OS_WIN
  113. OSVERSIONINFO osvi;
  114. ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
  115. osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  116. GetVersionEx(&osvi);
  117. req1.OSVersion[0] = (osvi.dwMajorVersion >> 8) & 0xFF;
  118. req1.OSVersion[1] = osvi.dwMajorVersion & 0xFF;
  119. req1.OSVersion[2] = (osvi.dwMinorVersion >> 8) & 0xFF;
  120. req1.OSVersion[3] = osvi.dwMinorVersion & 0xFF;
  121. req1.OSVersion[4] = (osvi.dwBuildNumber >> 8) & 0xFF;
  122. req1.OSVersion[5] = osvi.dwBuildNumber & 0xFF;
  123. #else
  124. DWORD dwMajorVersion(0), dwMinorVersion(0), dwBuildNumber(0);
  125. struct utsname kernel_info;
  126. int ret = uname(&kernel_info);
  127. if (ret == 0) {
  128. int n = sscanf((const char*)kernel_info.release, "%d.%d", &dwMajorVersion, &dwMinorVersion);
  129. }
  130. else {
  131. Dbg("get linux kernel version fail: %s", strerror(errno));
  132. }
  133. req1.OSVersion[0] = (dwMajorVersion >> 8) & 0xFF;
  134. req1.OSVersion[1] = dwMajorVersion & 0xFF;
  135. req1.OSVersion[2] = (dwMinorVersion >> 8) & 0xFF;
  136. req1.OSVersion[3] = dwMinorVersion & 0xFF;
  137. req1.OSVersion[4] = (dwBuildNumber >> 8) & 0xFF;
  138. req1.OSVersion[5] = dwBuildNumber & 0xFF;
  139. #endif
  140. strncpy(req1.Sites, info.strSite, sizeof(req1.Sites)-1);
  141. CSmartPointer<IPackage> package = CreateNewPackage("POLL");
  142. package->AddStruct("POLLREQ4", false, false, (BYTE*)&req1, sizeof(req1));
  143. // 获取硬件信息
  144. CAutoArray<CSimpleStringA> devNames;
  145. rc = SpGetAllDevices(m_pEntity, devNames);
  146. if (rc != Error_Succeed)
  147. {
  148. LogError(Severity_Middle, rc, 0, "get all device info error");
  149. return rc;
  150. }
  151. int nDevEntityCount = devNames.GetCount();
  152. if (nDevEntityCount >0)
  153. {
  154. int nBufLen = nDevEntityCount * sizeof(PollUpgrade_Req2);
  155. char *pBuf = new char[nBufLen];
  156. memset(pBuf, 0, nBufLen);
  157. PollUpgrade_Req2 *pDevInfo = (PollUpgrade_Req2*)pBuf;
  158. for(int i=0; i<nDevEntityCount; i++)
  159. {
  160. CSimpleStringA strVersion, strModel, strVendor;
  161. rc = SpGetDeviceInfo(m_pEntity, devNames[i], strModel, strVendor, strVersion);
  162. if (rc == Error_Succeed)
  163. {
  164. strncpy(pDevInfo->Type, (const char*)devNames[i], sizeof(pDevInfo->Type)-1);
  165. strncpy(pDevInfo->Modal, (const char*)strModel, sizeof(pDevInfo->Modal)-1);
  166. strncpy(pDevInfo->Factory,(const char*)strVendor, sizeof(pDevInfo->Factory)-1);
  167. if (strVersion.GetLength() >0)
  168. {
  169. CAutoArray<CSimpleStringA> arr = strVersion.Split('.');
  170. for(int i=0; i<4 && i<arr.GetCount(); i++)
  171. {
  172. WORD w = (WORD) atoi(arr[i]);
  173. ((BYTE*)pDevInfo->Version)[i*2] = (w >> 8) & 0xFF;
  174. ((BYTE*)pDevInfo->Version)[i*2+1] = w & 0xFF;
  175. }
  176. }
  177. }
  178. pDevInfo++;
  179. }
  180. package->AddStruct("POLLREQ2", false, false, (BYTE*)pBuf, nBufLen, nDevEntityCount);
  181. delete[] pBuf;
  182. }
  183. // 获取当前版本安装包信息
  184. vector<CSimpleStringA> installedPacks;
  185. for(int i=0; i<info.LightPackInfos.GetCount(); i++)
  186. installedPacks.push_back(info.LightPackInfos[i].strPackName);
  187. if (!info.InstallPack.IsNullOrEmpty())
  188. installedPacks.push_back(info.InstallPack);
  189. CVersion lastVer = info.PreviousInstallVersion;
  190. while (lastVer.IsValid())
  191. {
  192. CInstallInfo lastVerInfo = {};
  193. rc = pFunc->GetInstallInfo(lastVer, lastVerInfo);
  194. if (rc != Error_Succeed)
  195. break;
  196. if (!lastVerInfo.InstallPack.IsNullOrEmpty())
  197. installedPacks.push_back(lastVerInfo.InstallPack);
  198. lastVer = lastVerInfo.PreviousInstallVersion;
  199. }
  200. //modify by lwt 20210113 增加体系外升级安装包
  201. list<CSimpleStringA>::iterator itor = ((CReportMgrFSM*)m_pFSM)->m_InstallSysPackList.begin();
  202. while(itor!=((CReportMgrFSM*)m_pFSM)->m_InstallSysPackList.end())
  203. {
  204. CSimpleStringA sysPackName = *itor;
  205. if(!sysPackName.IsNullOrEmpty()){
  206. installedPacks.push_back(sysPackName);
  207. }
  208. itor++;
  209. }
  210. int nPackCount = installedPacks.size();
  211. if (nPackCount >0)
  212. {
  213. //Dbg("current version has %d packs installed", nPackCount);
  214. int nBufLen = nPackCount * sizeof(PollUpgrade_Req5);
  215. char *pBuf = new char[nBufLen];
  216. memset(pBuf, 0, nBufLen);
  217. PollUpgrade_Req5 *pPackInfo = (PollUpgrade_Req5*)pBuf;
  218. for(int i=0; i<nPackCount; i++)
  219. {
  220. CSimpleStringA &strPackName = installedPacks[i];
  221. strncpy(pPackInfo->UpgradePack, strPackName, strPackName.GetLength()>MAX_PACKNAME_LEN?MAX_PACKNAME_LEN:strPackName.GetLength());
  222. pPackInfo->PackState = 'D';//CUpgradeMgrEntity::GetInstallStateVal(info.LightPackInfos[i].State);
  223. pPackInfo++;
  224. //Dbg("pack %s installed", (const char*)installedPacks[i]);
  225. }
  226. package->AddStruct("POLLREQ5", false, false, (BYTE*)pBuf, nBufLen, nPackCount);
  227. delete[] pBuf;
  228. }
  229. //CSimpleStringA strMD5List = "";
  230. //((CUpgradeMgrEntity*)m_pEntity)->GetMD5List(strMD5List);
  231. PollUpgrade_Req6 req6;
  232. memset(&req6, 0, sizeof(req6));
  233. //hash完成才添加hash文件
  234. if(IsHashComputed){
  235. CSimpleStringA SM3Hash= ((CUpgradeMgrEntity*)m_pEntity)->m_strSM3Hash;
  236. if (!SM3Hash.IsNullOrEmpty())
  237. {
  238. Dbg("add md5list hash");
  239. strncpy(req6.MD5ListHash, SM3Hash, SM3Hash.GetLength());
  240. }else{
  241. Dbg("add md5list hash fail");
  242. }
  243. }
  244. //CSimpleStringA md5List = ((CUpgradeMgrEntity*)m_pEntity)->m_strMD5List;
  245. //if (!md5List.IsNullOrEmpty())
  246. //{
  247. // CSimpleStringA strMD5ListHash = "";
  248. // ((CUpgradeMgrEntity*)m_pEntity)->MD5Data(md5List, strMD5ListHash);
  249. // if (strMD5ListHash.IsNullOrEmpty())
  250. // {
  251. // Dbg("get md5list hash fail");
  252. // }
  253. // else
  254. // {
  255. // Dbg("add md5list hash");
  256. // strncpy(req6.MD5ListHash, strMD5ListHash, strMD5ListHash.GetLength());
  257. // }
  258. //}
  259. package->AddStruct("POLLREQ6", false, false, (BYTE*)&req6, sizeof(req6));
  260. Dbg("send poll upgrade package");
  261. SendPackage(package);
  262. return Error_Succeed;
  263. }
  264. ErrorCodeEnum CUpgradeMgrConn::SendMD5ListReq(CSimpleStringA strBlockId)
  265. {
  266. m_BlockId = atoi(strBlockId);
  267. Dbg("send MD5 list m_BlockId=%d", m_BlockId);
  268. auto pFunc = m_pEntity->GetFunction();
  269. CSystemStaticInfo info;
  270. auto rc = pFunc->GetSystemStaticInfo(info);
  271. if (rc != Error_Succeed)
  272. {
  273. LogError(Severity_Middle, rc, 0, "get system static info error");
  274. return rc;
  275. }
  276. CSmartPointer<IPackage> package = CreateNewPackage("MD5List");
  277. MD5List_Req req;
  278. memset(&req, 0, sizeof(req));
  279. strncpy(req.TerminalNo, info.strTerminalID, sizeof(req.TerminalNo)-1);
  280. // 安装版本,其中包含软件框架版本 binary 8
  281. WORD nTmp = info.InstallVersion.GetMajor();
  282. req.InstallVersion[0] = (nTmp >> 8) & 0xFF;
  283. req.InstallVersion[1] = nTmp & 0xFF;
  284. nTmp = info.InstallVersion.GetMinor();
  285. req.InstallVersion[2] = (nTmp >> 8) & 0xFF;
  286. req.InstallVersion[3] = nTmp & 0xFF;
  287. nTmp = info.InstallVersion.GetRevision();
  288. req.InstallVersion[4] = (nTmp >> 8) & 0xFF;
  289. req.InstallVersion[5] = nTmp & 0xFF;
  290. nTmp = info.InstallVersion.GetBuild();
  291. req.InstallVersion[6] = (nTmp >> 8) & 0xFF;
  292. req.InstallVersion[7] = nTmp & 0xFF;
  293. req.BlockId = m_BlockId;
  294. CSimpleStringA strMD5List = "";
  295. ((CUpgradeMgrEntity*)m_pEntity)->GetMD5List(strMD5List);
  296. Dbg("MD5 list len=%d", strMD5List.GetLength());
  297. if (!strMD5List.IsNullOrEmpty())
  298. {
  299. if (strMD5List.GetLength() > m_BlockId*MAX_MD5LIST_LEN)
  300. {
  301. req.bEnd = false;
  302. strncpy(req.MD5List, strMD5List.GetData()+(m_BlockId-1)*MAX_MD5LIST_LEN, MAX_MD5LIST_LEN);
  303. }
  304. else
  305. {
  306. req.bEnd = true;
  307. strncpy(req.MD5List, strMD5List.GetData()+(m_BlockId-1)*MAX_MD5LIST_LEN, strMD5List.GetLength()-(m_BlockId-1)*MAX_MD5LIST_LEN);
  308. }
  309. //SM3hash字符串拷贝
  310. if(((CUpgradeMgrEntity*)m_pEntity)->m_IsSM3listSucc){
  311. CSimpleStringA strMD5ListHash = ((CUpgradeMgrEntity*)m_pEntity)->m_strSM3Hash;
  312. strncpy(req.MD5ListHash, strMD5ListHash, strMD5ListHash.GetLength());
  313. }else{
  314. Dbg("get md5list hash fail");
  315. }
  316. //CSimpleStringA strMD5ListHash = "";
  317. //((CUpgradeMgrEntity*)m_pEntity)->MD5Data(strMD5List, strMD5ListHash);
  318. //if (strMD5ListHash.IsNullOrEmpty())
  319. //{
  320. // Dbg("get md5list hash fail");
  321. //}
  322. //else
  323. //{
  324. // strncpy(req.MD5ListHash, strMD5ListHash, strMD5ListHash.GetLength());
  325. //}
  326. package->AddStruct("MD5REQ", false, false, (BYTE*)&req, sizeof(req));
  327. }
  328. else
  329. {
  330. Dbg("get MD5 list fail");
  331. }
  332. Dbg("send MD5 list package");
  333. SendPackage(package);
  334. return Error_Succeed;
  335. }
  336. //ErrorCodeEnum CUpgradeMgrConn::SendMD5ListReq(CSimpleStringA strTerminalNo,CSimpleStringA strBlockId)//test
  337. //{
  338. // m_BlockId = atoi(strBlockId);
  339. // Dbg("send MD5 list m_BlockId=%d", m_BlockId);
  340. //
  341. // auto pFunc = m_pEntity->GetFunction();
  342. // CSystemStaticInfo info;
  343. // auto rc = pFunc->GetSystemStaticInfo(info);
  344. // if (rc != Error_Succeed)
  345. // {
  346. // LogError(Severity_Middle, rc, 0, "get system static info error");
  347. // return rc;
  348. // }
  349. //
  350. // CSmartPointer<IPackage> package = CreateNewPackage("MD5List");
  351. //
  352. // MD5List_Req req;
  353. // memset(&req, 0, sizeof(req));
  354. // strncpy(req.TerminalNo, strTerminalNo, sizeof(req.TerminalNo)-1);
  355. //
  356. // // 安装版本,其中包含软件框架版本 binary 8
  357. // WORD nTmp = info.InstallVersion.GetMajor();
  358. // req.InstallVersion[0] = (nTmp >> 8) & 0xFF;
  359. // req.InstallVersion[1] = nTmp & 0xFF;
  360. // nTmp = info.InstallVersion.GetMinor();
  361. // req.InstallVersion[2] = (nTmp >> 8) & 0xFF;
  362. // req.InstallVersion[3] = nTmp & 0xFF;
  363. // nTmp = info.InstallVersion.GetRevision();
  364. // req.InstallVersion[4] = (nTmp >> 8) & 0xFF;
  365. // req.InstallVersion[5] = nTmp & 0xFF;
  366. // nTmp = info.InstallVersion.GetBuild();
  367. // req.InstallVersion[6] = (nTmp >> 8) & 0xFF;
  368. // req.InstallVersion[7] = nTmp & 0xFF;
  369. //
  370. // req.BlockId = m_BlockId;
  371. //
  372. // CSimpleStringA strMD5List = "";
  373. // ((CUpgradeMgrEntity*)m_pEntity)->GetMD5List(strMD5List);
  374. // Dbg("MD5 list len=%d", strMD5List.GetLength());
  375. //
  376. // if (!strMD5List.IsNullOrEmpty())
  377. // {
  378. // if (strMD5List.GetLength() > m_BlockId*MAX_MD5LIST_LEN)
  379. // {
  380. // req.bEnd = false;
  381. // strncpy(req.MD5List, strMD5List.GetData()+(m_BlockId-1)*MAX_MD5LIST_LEN, MAX_MD5LIST_LEN);
  382. // }
  383. // else
  384. // {
  385. // req.bEnd = true;
  386. // strncpy(req.MD5List, strMD5List.GetData()+(m_BlockId-1)*MAX_MD5LIST_LEN, strMD5List.GetLength()-(m_BlockId-1)*MAX_MD5LIST_LEN);
  387. // }
  388. //
  389. // CSimpleStringA strMD5ListHash = "";
  390. // ((CUpgradeMgrEntity*)m_pEntity)->MD5Data(strMD5List, strMD5ListHash);
  391. // if (strMD5ListHash.IsNullOrEmpty())
  392. // {
  393. // Dbg("get md5list hash fail");
  394. // }
  395. // else
  396. // {
  397. // strncpy(req.MD5ListHash, strMD5ListHash, strMD5ListHash.GetLength());
  398. // }
  399. //
  400. // package->AddStruct("MD5REQ", false, false, (BYTE*)&req, sizeof(req));
  401. // }
  402. // else
  403. // {
  404. // Dbg("get MD5 list fail");
  405. // }
  406. //
  407. // Dbg("send MD5 list package");
  408. // //SendPackage(package);
  409. //
  410. // if (SendPackage(package) == "")
  411. // {
  412. // Dbg("SendPackage failed, send MD5REQ failed");
  413. // return Error_Unexpect;
  414. // }
  415. // else
  416. // {
  417. // Dbg("send MD5REQ success");
  418. // }
  419. //
  420. // package = ReceivePackage(5);
  421. // if (package == NULL)
  422. // {
  423. // Dbg("ReceivePackage failed, don't revceive MD5REQ ans");
  424. // return Error_Unexpect;
  425. // }
  426. //
  427. // int nRetLen = package->GetStructLen("MD5RET");
  428. // if (nRetLen > 0)
  429. // {
  430. // BYTE *pBuf = new BYTE[nRetLen];
  431. // memset(pBuf, 0, nRetLen);
  432. //
  433. // int nArrayNum(0);
  434. // int nBufLen = nRetLen;
  435. // bool bRet = package->GetStructData("MD5RET", pBuf, &nBufLen, &nArrayNum);
  436. // assert(bRet && nArrayNum>0);
  437. // MD5List_Ret md5Ret;
  438. // memset(&md5Ret,0,sizeof(MD5List_Ret));
  439. // memcpy(&md5Ret, pBuf, sizeof(MD5List_Ret));
  440. //
  441. // if (md5Ret.BlockId == 0)
  442. // {
  443. // Dbg("recieve blockid %d, start to poll new pack!", md5Ret.BlockId);
  444. // /*auto pEvent = new CUpgradeMgrFSM::RvcCommRetEvent(CUpgradeMgrFSM::Event_StartPoll, pBuf, nArrayNum);
  445. // m_pFSM->PostEventFIFO(pEvent);*/
  446. //
  447. // m_BlockId = 0;
  448. // }
  449. // else if (md5Ret.BlockId == m_BlockId)
  450. // {
  451. // Dbg("recieve right blockid %d, start to send next block %d!", md5Ret.BlockId, md5Ret.BlockId+1);
  452. // CSimpleStringA nextBlockId = CSimpleStringA::Format("%d",md5Ret.BlockId+1);
  453. // SendMD5ListReq(strTerminalNo, nextBlockId);
  454. // }
  455. // else
  456. // {
  457. // Dbg("recieve wrong blockid %d, resend md5list!",md5Ret.BlockId);
  458. // SendMD5ListReq(strTerminalNo, "1");
  459. // }
  460. // delete pBuf;
  461. // }
  462. // else
  463. // {
  464. // Dbg("don't recieve MD5RET packet!");
  465. // //OnDisconnect();
  466. // }
  467. //
  468. // return Error_Succeed;
  469. //}
  470. ErrorCodeEnum CUpgradeMgrConn::HandleReportRet(const CSmartPointer<IPackage> &pRecvPkg)
  471. {
  472. DWORD dwSysCode, dwUserCode;
  473. string strErrMsg;
  474. ErrorCodeEnum rc;
  475. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  476. {
  477. rc = (ErrorCodeEnum)dwSysCode;
  478. CSimpleStringA strMsg = CSimpleStringA::Format("report upgrade state error: %s", strErrMsg.c_str());
  479. LogError(Severity_Middle, (ErrorCodeEnum)dwSysCode, dwUserCode, strMsg);
  480. }
  481. return Error_Succeed;
  482. }
  483. ErrorCodeEnum CUpgradeMgrConn::HandleConfirmUpgradeRet(const CSmartPointer<IPackage> &pRecvPkg)
  484. {
  485. DWORD dwSysCode, dwUserCode;
  486. string strErrMsg;
  487. ErrorCodeEnum rc;
  488. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  489. {
  490. rc = (ErrorCodeEnum)dwSysCode;
  491. LogError(Severity_Middle, (ErrorCodeEnum)dwSysCode, dwUserCode, strErrMsg.c_str());
  492. return rc;
  493. }
  494. int nRetLen = pRecvPkg->GetStructLen("CONF_RET");
  495. if (nRetLen >0)
  496. {
  497. BYTE *pBuf = new BYTE[nRetLen];
  498. memset(pBuf, 0, nRetLen);
  499. int nArrayNum(0);
  500. int nBufLen = nRetLen;
  501. bool bRet = pRecvPkg->GetStructData("CONF_RET", pBuf, &nBufLen, &nArrayNum);
  502. assert(bRet && nArrayNum>0);
  503. auto pEvent = new CUpgradeMgrFSM::RvcCommRetEvent(CUpgradeMgrFSM::Event_EndConfirm, pBuf, nArrayNum);
  504. m_pFSM->PostEventFIFO(pEvent);
  505. return Error_Succeed;
  506. }
  507. else
  508. {
  509. LogError(Severity_Low, Error_Unexpect, 0, "get struct [CONF_RET] from confirm return package fail");
  510. return Error_Unexpect;
  511. }
  512. }
  513. ErrorCodeEnum CUpgradeMgrConn::HandleQueryExecInfoRet(const CSmartPointer<IPackage> &pRecvPkg)
  514. {
  515. DWORD dwSysCode, dwUserCode;
  516. string strErrMsg;
  517. ErrorCodeEnum rc;
  518. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  519. {
  520. rc = (ErrorCodeEnum)dwSysCode;
  521. LogError(Severity_Middle, (ErrorCodeEnum)dwSysCode, dwUserCode, strErrMsg.c_str());
  522. return rc;
  523. }
  524. int nRetLen = pRecvPkg->GetStructLen("EXEC_RET");
  525. if (nRetLen >0)
  526. {
  527. BYTE *pBuf = new BYTE[nRetLen];
  528. memset(pBuf, 0, nRetLen);
  529. int nArrayNum(0);
  530. int nBufLen = nRetLen;
  531. bool bRet = pRecvPkg->GetStructData("EXEC_RET", pBuf, &nBufLen, &nArrayNum);
  532. assert(bRet && nArrayNum>0);
  533. auto pEvent = new CUpgradeMgrFSM::RvcCommRetEvent(CUpgradeMgrFSM::Event_EndQueryExec, pBuf, nArrayNum);
  534. m_pFSM->PostEventFIFO(pEvent);
  535. return Error_Succeed;
  536. }
  537. else
  538. {
  539. LogError(Severity_Low, Error_Unexpect, 0, "get struct [EXEC_RET] fail");
  540. return Error_Unexpect;
  541. }
  542. }
  543. ErrorCodeEnum CUpgradeMgrConn::HandlePollUpgradeRet(const CSmartPointer<IPackage> &pRecvPkg)
  544. {
  545. DWORD dwSysCode, dwUserCode;
  546. string strErrMsg;
  547. ErrorCodeEnum rc = Error_Succeed;
  548. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  549. {
  550. rc = (ErrorCodeEnum)dwSysCode;
  551. LogError(Severity_Middle, (ErrorCodeEnum)dwSysCode, dwUserCode, strErrMsg.c_str());
  552. return rc;
  553. }
  554. int nRetLen = pRecvPkg->GetStructLen("POLLRET1");
  555. if (nRetLen >0)
  556. {
  557. BYTE *pBuf = new BYTE[nRetLen];
  558. memset(pBuf, 0, nRetLen);
  559. int nArrayNum(0);
  560. int nBufLen = nRetLen;
  561. bool bRet = pRecvPkg->GetStructData("POLLRET1", pBuf, &nBufLen, &nArrayNum);
  562. assert(bRet && nArrayNum>0);
  563. auto pEvent = new CUpgradeMgrFSM::RvcCommRetEvent(CUpgradeMgrFSM::Event_EndPoll, pBuf, nArrayNum);
  564. m_pFSM->PostEventFIFO(pEvent);
  565. }
  566. else if ((nRetLen =pRecvPkg->GetStructLen("POLLRET3")) > 0)
  567. {
  568. BYTE *pBuf = new BYTE[nRetLen];
  569. memset(pBuf, 0, nRetLen);
  570. int nArrayNum(0);
  571. int nBufLen = nRetLen;
  572. bool bRet = pRecvPkg->GetStructData("POLLRET3", pBuf, &nBufLen, &nArrayNum);
  573. assert(bRet && nArrayNum>0);
  574. auto pEvent = new CUpgradeMgrFSM::RvcCommRetEvent(CUpgradeMgrFSM::Event_EndPoll, pBuf, nArrayNum);
  575. m_pFSM->PostEventFIFO(pEvent);
  576. }
  577. else if ((nRetLen =pRecvPkg->GetStructLen("POLLRET5")) > 0)
  578. {
  579. BYTE *pBuf = new BYTE[nRetLen];
  580. memset(pBuf, 0, nRetLen);
  581. int nArrayNum(0);
  582. int nBufLen = nRetLen;
  583. bool bRet = pRecvPkg->GetStructData("POLLRET5", pBuf, &nBufLen, &nArrayNum);
  584. assert(bRet && nArrayNum>0);
  585. auto pEvent = new CUpgradeMgrFSM::RvcCommRetEvent(CUpgradeMgrFSM::Event_EndPoll, pBuf, nArrayNum);
  586. m_pFSM->PostEventFIFO(pEvent);
  587. }
  588. else
  589. {
  590. m_pFSM->PostEventFIFO(new CUpgradeMgrFSM::RvcCommRetEvent(CUpgradeMgrFSM::Event_EndPoll, 0, 0));
  591. }
  592. nRetLen = pRecvPkg->GetStructLen("POLLRET2");
  593. if (nRetLen >0)
  594. {
  595. LogEvent(Severity_Low, 0, "receive cancell upgrade instruct");
  596. BYTE *pBuf = new BYTE[nRetLen];
  597. memset(pBuf, 0, nRetLen);
  598. int nArrayNum(0);
  599. int nBufLen = nRetLen;
  600. bool bRet = pRecvPkg->GetStructData("POLLRET2", pBuf, &nBufLen, &nArrayNum);
  601. assert(bRet && nArrayNum>0);
  602. auto pEvent = new CUpgradeMgrFSM::RvcCommRetEvent(CUpgradeMgrFSM::Event_CancelUpgrade, pBuf, nArrayNum);
  603. m_pFSM->PostEventFIFO(pEvent);
  604. }
  605. return rc;
  606. }
  607. ErrorCodeEnum CUpgradeMgrConn::HandleMD5ListRet(const CSmartPointer<IPackage> &pRecvPkg)
  608. {
  609. DWORD dwSysCode, dwUserCode;
  610. string strErrMsg;
  611. ErrorCodeEnum rc = Error_Succeed;
  612. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  613. {
  614. rc = (ErrorCodeEnum)dwSysCode;
  615. LogError(Severity_Middle, (ErrorCodeEnum)dwSysCode, dwUserCode, strErrMsg.c_str());
  616. return rc;
  617. }
  618. int nRetLen = pRecvPkg->GetStructLen("MD5RET");
  619. if (nRetLen >0)
  620. {
  621. BYTE *pBuf = new BYTE[nRetLen];
  622. memset(pBuf, 0, nRetLen);
  623. int nArrayNum(0);
  624. int nBufLen = nRetLen;
  625. bool bRet = pRecvPkg->GetStructData("MD5RET", pBuf, &nBufLen, &nArrayNum);
  626. assert(bRet && nArrayNum>0);
  627. MD5List_Ret md5Ret;
  628. memset(&md5Ret,0,sizeof(MD5List_Ret));
  629. memcpy(&md5Ret, pBuf, sizeof(MD5List_Ret));
  630. if (md5Ret.BlockId == 0)
  631. {
  632. Dbg("recieve blockid %d, send md5list succ", md5Ret.BlockId);
  633. //auto pEvent = new CUpgradeMgrFSM::RvcCommRetEvent(CUpgradeMgrFSM::Event_StartPoll, pBuf, nArrayNum);
  634. //m_pFSM->PostEventFIFO(pEvent);
  635. m_BlockId = 0;
  636. }
  637. else if (md5Ret.BlockId == m_BlockId)
  638. {
  639. Dbg("recieve right blockid %d, start to send next block %d!", md5Ret.BlockId, md5Ret.BlockId+1);
  640. CSimpleStringA nextBlockId = CSimpleStringA::Format("%d",md5Ret.BlockId+1);
  641. SendMD5ListReq(nextBlockId);
  642. }
  643. else
  644. {
  645. Dbg("recieve wrong blockid %d, resend md5list!",md5Ret.BlockId);
  646. SendMD5ListReq("1");
  647. }
  648. //delete pBuf;
  649. }
  650. return rc;
  651. }
  652. ErrorCodeEnum CUpgradeMgrConn::ReportUpgradeResult(const char* pPackName, CVersion &installVersion, char installState, DWORD stateTime, DWORD dwErrCode, const char *pComment)
  653. {
  654. CSmartPointer<IPackage> package = CreateNewPackage("REPORT");
  655. Report3_Req req = {};
  656. auto pFunc = m_pEntity->GetFunction();
  657. CSystemStaticInfo info;
  658. auto rc = pFunc->GetSystemStaticInfo(info);
  659. if (rc != Error_Succeed)
  660. {
  661. LogError(Severity_Middle, rc, 0, "get system static info error");
  662. return rc;
  663. }
  664. strncpy(req.TerminalNo, (const char*)info.strTerminalID, sizeof(req.TerminalNo)-1);
  665. strncpy(req.UpgradePack, pPackName, sizeof(req.UpgradePack)-1);
  666. __int64 ver64 = installVersion.GetVersion64();
  667. for(int i=0; i<8; i++)
  668. req.InstallVersion[7-i] = ((BYTE*)&ver64)[i];
  669. req.InstallState = installState;
  670. req.FailCode = dwErrCode;
  671. req.StateTime = stateTime;
  672. if (pComment != NULL)
  673. strncpy(req.Comment, pComment, sizeof(req.Comment) - 1);
  674. package->AddStruct("REP3_REQ", false, false, (BYTE*)&req, sizeof(req));
  675. //Dbg("send report package");
  676. SendPackage(package);
  677. return Error_Succeed;
  678. }
  679. ErrorCodeEnum CUpgradeMgrConn::ReportSysCustomVer(const char* pPackName, const char* pSysCustomVer, const char* pFWID, const char* pSysPatchName)
  680. {
  681. CSmartPointer<IPackage> package = CreateNewPackage("CUSVER");
  682. ReportSysCustomVer_Req3 req = {};
  683. auto pFunc = m_pEntity->GetFunction();
  684. CSystemStaticInfo info;
  685. auto rc = pFunc->GetSystemStaticInfo(info);
  686. if (rc != Error_Succeed)
  687. {
  688. LogError(Severity_Middle, rc, 0, "get system static info fail");
  689. return rc;
  690. }
  691. CSimpleStringA strSysCustomVer = pSysCustomVer;
  692. CSimpleStringA strFWID = pFWID;
  693. CSimpleStringA strSysPatchName = pSysPatchName;
  694. strncpy(req.TerminalNo, (const char*)info.strTerminalID, sizeof(req.TerminalNo) - 1);
  695. strncpy(req.SysPackName, pPackName, sizeof(req.SysPackName) - 1);
  696. if (!strSysCustomVer.IsNullOrEmpty())
  697. {
  698. strncpy(req.SysCustomVer, pSysCustomVer, sizeof(req.SysCustomVer) - 1);
  699. }
  700. if (!strFWID.IsNullOrEmpty())
  701. {
  702. strncpy(req.FWID, pFWID, sizeof(req.FWID) - 1);
  703. }
  704. if (!strSysPatchName.IsNullOrEmpty())
  705. {
  706. strncpy(req.SysPatchName, pSysPatchName, sizeof(req.SysPatchName) - 1);
  707. }
  708. package->AddStruct("CUSVER_R3", false, false, (BYTE*)&req, sizeof(req));
  709. SendPackage(package);
  710. Dbg("ReportSysCustomVer()");
  711. return Error_Succeed;
  712. }
  713. ErrorCodeEnum CUpgradeMgrConn::HandleReportSysCustomVerRet(const CSmartPointer<IPackage> &pRecvPkg)
  714. {
  715. DWORD dwSysCode, dwUserCode;
  716. string strErrMsg;
  717. ErrorCodeEnum rc;
  718. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  719. {
  720. rc = (ErrorCodeEnum)dwSysCode;
  721. CSimpleStringA strMsg = CSimpleStringA::Format("report system custom version error: %s", strErrMsg.c_str());
  722. LogError(Severity_Middle, (ErrorCodeEnum)dwSysCode, dwUserCode, strMsg);
  723. }
  724. return Error_Succeed;
  725. }
  726. }