segmentupdate.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. #include "segmentupdate.h"
  2. #include "unzip.h"
  3. #include "SNCDataBase.h"
  4. #include "wsnumchk.h"
  5. #include "respdlbaseseginfo.h"
  6. #include "respdldyseginfo.h"
  7. #include "respchkbasesegversion.h"
  8. #include "respgetsegdyinfo.h"
  9. SegmentUpdate::SegmentUpdate(QObject *parent) :
  10. QThread(parent)
  11. {
  12. method = UpdateBaseInfo;
  13. stop = false;
  14. }
  15. void SegmentUpdate::abort()
  16. {
  17. this->stop = true;
  18. }
  19. void SegmentUpdate::setMethod(SegmentUpdateMethod method)
  20. {
  21. this->method = method;
  22. }
  23. SegmentUpdate::~SegmentUpdate()
  24. {
  25. QFile::remove(QDir::tempPath()+"/snc_baseseg.zip");
  26. QFile::remove(QDir::tempPath()+"/snc_dynamicseg.zip");
  27. QFile::remove(QDir::tempPath()+"/speednumcube/baseseg.csv");
  28. QFile::remove(QDir::tempPath()+"/speednumcube/dynamicseg.csv");
  29. qDebug()<<QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")\
  30. <<"SegmentUpdate Destroyed.";
  31. }
  32. void SegmentUpdate::setPara(QString key, QString value)
  33. {
  34. this->paras.insert(key,value);
  35. }
  36. void SegmentUpdate::updateSegmentBaseInfo()
  37. {
  38. WSNumChk client;
  39. if(tip.isEmpty())
  40. tip = "正在检测号段库是否有更新...";
  41. emit updateProgress(tip,0);
  42. QString json = client.dlBaseSegInfo(SNCDataBase::getSegVersion());
  43. RespDlBaseSegInfo response(json);
  44. int rtCode = response.getRtnCode();
  45. if(rtCode==0)
  46. {
  47. emit updateProgress("您的号段库已经更新至最新版本!",1);
  48. }
  49. else if(rtCode < 0)
  50. {
  51. emit updateProgress("号段升级过程中发生错误,无法升级!",-3);
  52. }
  53. else
  54. {
  55. QString newVersion = response.getNewVersion();
  56. QString baseSegInfo = response.getBaseSegInfo();
  57. QByteArray arrayBase = QByteArray::fromBase64(baseSegInfo.toAscii());
  58. QFile file1(QDir::tempPath()+"/snc_baseseg.zip");
  59. file1.open(QIODevice::WriteOnly);
  60. file1.write(arrayBase);
  61. file1.close();
  62. emit updateProgress("正在安装号段数据库...",0);
  63. qDebug()<<response.getRtnCode()<<response.getRtnMemo();
  64. if(!stop)
  65. {
  66. if(extractBase())
  67. SNCDataBase::updateBaseSegInfo(newVersion,QDir::tempPath()+"/speednumcube/baseseg.csv");
  68. }
  69. emit updateProgress("您的号段库已经更新至最新版本!",1);
  70. }
  71. }
  72. void SegmentUpdate::updateSegmentChkInfo()
  73. {
  74. WSNumChk client;
  75. emit updateProgress("正在下载最新的号段信息...",0);
  76. QString json = client.dlDySegInfo(paras.value("areacode"));
  77. if(!json.isEmpty()){
  78. RespDlDySegInfo *response = new RespDlDySegInfo(json);
  79. int rtCode = response->getRtnCode();
  80. if(rtCode==0)
  81. {
  82. emit updateProgress("您的号段库已经更新至最新版本!",1);
  83. }
  84. else if(rtCode < 0 && rtCode > -3)
  85. {
  86. emit updateProgress("号段升级过程中发生错误,无法升级!",-2);
  87. }
  88. else if(rtCode == -3)
  89. {
  90. emit updateProgress("软件版本已经过期,请立即升级至新版本!",-3);
  91. }
  92. else
  93. {
  94. QString segChkInfo = response->getSegChkInfo();
  95. QByteArray arrayBase = QByteArray::fromBase64(segChkInfo.toAscii());
  96. QFile file1(QDir::tempPath()+"/snc_dynamicseg.zip");
  97. file1.open(QIODevice::WriteOnly);
  98. file1.write(arrayBase);
  99. file1.close();
  100. emit updateProgress("正在安装号段数据库...",0);
  101. QString today = QDate::currentDate().toString("yyyy-MM-dd");
  102. if(!stop)
  103. {
  104. if(extractDynamic())
  105. SNCDataBase::updateDynamicSegInfo(today,paras.value("areacode"),QDir::tempPath()+"/speednumcube/dynamicseg.csv");
  106. }
  107. emit updateProgress("您的号段库已经更新至最新版本!",1);
  108. }
  109. delete response;
  110. }
  111. else
  112. emit updateProgress("网络连接不可用!",-1);
  113. }
  114. bool SegmentUpdate::checkBaseSegVersion()
  115. {
  116. emit updateProgress("正在检测号段库是否有更新...",0);
  117. WSNumChk client;
  118. QString json = client.chkBaseSegVersion(SNCDataBase::getSegVersion());
  119. bool update = false;
  120. if(json.isEmpty())
  121. {
  122. emit updateProgress("网络连接不可用!",-1);
  123. }
  124. else
  125. {
  126. RespChkBaseSegVersion resp(json);
  127. int chkCode = resp.getRtnCode();
  128. if(chkCode == 0)
  129. {
  130. emit updateProgress("您的号段库已经更新至最新版本!",1);
  131. //tip = "您的号段库已经更新至最新版本!";
  132. }
  133. else if(chkCode == 1)
  134. {
  135. emit newNumbers(resp.getNewNumber());
  136. emit updateProgress("发现新版本"+resp.getNewVersion()+",版本号发生变化,需要升级号段库信息!",0);
  137. tip = QString("正在下载新版本%1,共%2个号段...").arg(resp.getNewVersion()).arg(resp.getNewNumber());
  138. update = true;
  139. }
  140. else if(chkCode == -1)
  141. {
  142. emit updateProgress("号段当前版本号非法!",-2);
  143. }
  144. else
  145. {
  146. emit updateProgress("检测版本过程中发生错误,无法升级!",-3);
  147. }
  148. }
  149. return update;
  150. }
  151. void SegmentUpdate::getSingleSegDyInfo()
  152. {
  153. WSNumChk client;
  154. QString json = client.getDySegInfo(paras.value("seg"));
  155. if(!json.isEmpty()){
  156. RespGetSegDyInfo *response = new RespGetSegDyInfo(json);
  157. int rtCode = response->getRtnCode();
  158. if(rtCode==0)
  159. {
  160. emit updateProgress("没有该号段的数据!",0);
  161. }
  162. else if(rtCode == -1)
  163. {
  164. emit updateProgress("号段非法!",-1);
  165. }
  166. else if(rtCode == -2)
  167. {
  168. emit updateProgress("认证码错误!",-2);
  169. }
  170. else if(rtCode == -3)
  171. {
  172. emit updateProgress("软件版本已经过期,请立即升级至新版本!",-3);
  173. }
  174. else if(rtCode == 1)
  175. {
  176. QString segChkInfo = response->getSegChkInfo();
  177. emit updateProgress(segChkInfo,1);
  178. }
  179. delete response;
  180. }
  181. else
  182. emit updateProgress("网络连接不可用!",-1);
  183. }
  184. void SegmentUpdate::run()
  185. {
  186. tip = "";
  187. QTime time;
  188. time.start();
  189. msleep(1000);
  190. switch(this->method)
  191. {
  192. case JustCheckVersion:
  193. checkBaseSegVersion();
  194. break;
  195. case UpdateBaseInfo:
  196. checkBaseSegVersion();
  197. updateSegmentBaseInfo();
  198. break;
  199. case UpdateDynamicInfo:
  200. updateSegmentChkInfo();
  201. break;
  202. case JustGetSingleSegDyInfo:
  203. getSingleSegDyInfo();
  204. break;
  205. default:
  206. break;
  207. }
  208. emit updateFinished();
  209. qDebug()<<QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")\
  210. <<"Segment Update Finish, Elapsed Time "<<time.elapsed();
  211. }
  212. bool SegmentUpdate::extractBase()
  213. {
  214. UnZip::ErrorCode ec;
  215. UnZip uz;
  216. QDir dir;
  217. if(!dir.exists(QDir::tempPath()+"/speednumcube"))
  218. {
  219. dir.mkdir(QDir::tempPath()+"/speednumcube");
  220. }
  221. ec = uz.openArchive(QDir::tempPath()+"/snc_baseseg.zip");
  222. if (ec != UnZip::Ok) {
  223. qDebug() << "Failed to open archive: " << uz.formatError(ec).toAscii().data() << endl << endl;
  224. return false ;
  225. }
  226. ec = uz.extractAll(QDir::tempPath()+"/speednumcube");
  227. if (ec != UnZip::Ok) {
  228. qDebug() << "Extraction failed: " << uz.formatError(ec).toAscii().data() << endl << endl;
  229. uz.closeArchive();
  230. return false ;
  231. }
  232. return true;
  233. }
  234. bool SegmentUpdate::extractDynamic()
  235. {
  236. UnZip::ErrorCode ec;
  237. UnZip uz;
  238. QDir dir;
  239. if(!dir.exists(QDir::tempPath()+"/speednumcube"))
  240. {
  241. dir.mkdir(QDir::tempPath()+"/speednumcube");
  242. }
  243. ec = uz.openArchive(QDir::tempPath()+"/snc_dynamicseg.zip");
  244. if (ec != UnZip::Ok) {
  245. qDebug() << "Failed to open archive: " << uz.formatError(ec).toAscii().data() << endl << endl;
  246. return false ;
  247. }
  248. ec = uz.extractAll(QDir::tempPath()+"/speednumcube");
  249. if (ec != UnZip::Ok) {
  250. qDebug() << "Extraction failed: " << uz.formatError(ec).toAscii().data() << endl << endl;
  251. uz.closeArchive();
  252. return false ;
  253. }
  254. return true;
  255. }