Download.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. using CCWin;
  2. using Newtonsoft.Json;
  3. using Newtonsoft.Json.Linq;
  4. using SufeiUtil;
  5. using SXLibrary;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Data.Common;
  9. using System.Data.SQLite;
  10. using System.IO;
  11. using System.Net;
  12. using System.Threading;
  13. using System.Windows.Forms;
  14. namespace MOKA_Factory_Tools
  15. {
  16. public partial class Download : Skin_Color
  17. {
  18. public string RequireHost;//请求的服务器地址
  19. public string DownloadLink;//key包的下载地址
  20. public string DownloadSize;//key包的大小
  21. public string Ordername;//订单号
  22. public string Ordernumber;//订单数量
  23. public string Orderclient;//客户机型
  24. public string OrderPID;//PID
  25. public string OrderSV;//软件版本
  26. public string packet_md5;//key包的MD5校验
  27. public bool[] threadendTag;//判断各线程是否接收完文件
  28. public string[] filenameList;//各线程下载的小文件名列表
  29. public int[] filestartpos;//各线程开始读取文件的位置
  30. public int[] filesize;//小文件大小
  31. public string url;//请求链接
  32. public bool union;//判断文件是否合并完成
  33. public int thread;//线程数
  34. public int typeNow;//生成类型(-1:普通预绑定下载,0:EEPROM,1:FireTV)
  35. public SQLiteConnection errorDBNow;
  36. public int wholesize;
  37. public MidList midlistnow;
  38. public WhiteBalanceList whiteBalanceListnow;
  39. public string filename;
  40. public Download(System.Data.SQLite.SQLiteConnection errorDB, MidAddress MidAddress1,int type, MidList midList, WhiteBalanceList whiteBalanceList)
  41. {
  42. InitializeComponent();
  43. skinLabel1.Text = LResource.DownloadKeys;
  44. this.Text = LResource.Download;
  45. Control.CheckForIllegalCrossThreadCalls = false;
  46. DownloadLink = MidAddress1.purl;
  47. DownloadSize = MidAddress1.psize;
  48. Ordername = MidAddress1.order;
  49. packet_md5 = MidAddress1.pmd5;
  50. Ordernumber = MidAddress1.number;
  51. Orderclient = MidAddress1.ctype;
  52. OrderPID = MidAddress1.pid;
  53. OrderSV = MidAddress1.version;
  54. RequireHost = MidAddress1.host;
  55. errorDBNow = errorDB;
  56. typeNow = type;
  57. midlistnow = midList;
  58. whiteBalanceListnow = whiteBalanceList;
  59. filename = Path.GetFileName(DownloadLink);
  60. }
  61. private void skinButton1_Click(object sender, EventArgs e)
  62. {
  63. this.Dispose();
  64. this.Close();
  65. }
  66. public void StartDownload()
  67. {
  68. url = DownloadLink;
  69. HttpWebRequest request;
  70. long filesizew = 0;
  71. try
  72. {
  73. request = (HttpWebRequest)HttpWebRequest.Create(url);//建立一个HTTP请求
  74. HttpWebResponse response = request.GetResponse() as HttpWebResponse;
  75. filesizew = response.ContentLength;//得到文件总大小
  76. response.Close();
  77. request.Abort();//取消请求
  78. }
  79. catch (Exception ex)
  80. {
  81. MessageBox.Show(LResource.Error + ": " + ex.Message, LResource.Error);
  82. Log.WriteErrorLog("\r\nCreate Http require error:"+ ex.Message);
  83. CommonMethod.ReportErrormsg("Fail to init download process", ex.Message + "\r\ndownload link:" + url, errorDBNow);
  84. return;
  85. }
  86. thread = 1;//单线程
  87. threadendTag = new bool[thread];
  88. filenameList = new string[thread];
  89. filestartpos = new int[thread];
  90. filesize = new int[thread];
  91. int filethread = (int)filesizew / thread;
  92. int filethreade = filethread + (int)filesizew % thread;
  93. string filePath = AppDomain.CurrentDomain.BaseDirectory + "\\download";
  94. //文件大小切割
  95. for (int i = 0; i < thread; i++)
  96. {
  97. threadendTag[i] = false;
  98. filenameList[i] = filePath + "\\" + filename;//+ "-" + i.ToString()
  99. if (i < thread - 1)
  100. {
  101. filestartpos[i] = filethread * i;
  102. filesize[i] = filethread - 1;
  103. }
  104. else
  105. {
  106. filestartpos[i] = filethread * i;
  107. filesize[i] = filethreade - 1;
  108. }
  109. }
  110. Thread[] threadk = new Thread[thread];
  111. HttpFile[] httpfile = new HttpFile[thread];
  112. //各进程开始下载
  113. for (int j = 0; j < thread; j++)
  114. {
  115. httpfile[j] = new HttpFile(this, j);
  116. threadk[j] = new Thread(new ThreadStart(httpfile[j].ReceiveFile));
  117. threadk[j].Start();
  118. }
  119. }
  120. private void Download_Shown(object sender, EventArgs e)
  121. {
  122. StartDownload();
  123. }
  124. private void Download_FormClosed(object sender, FormClosedEventArgs e)
  125. {
  126. this.Dispose();
  127. this.Close();
  128. }
  129. }
  130. public class HttpFile
  131. {
  132. public Download formm;//声明一个窗体类
  133. public int threadIndex;//进程标识
  134. public string filenamea;//下载的小文件名
  135. public string strUrl;//请求的链接
  136. public FileStream fs;
  137. public HttpWebRequest request;
  138. public HttpWebResponse response;
  139. public Stream ns;
  140. public byte[] nbytes;//接收缓冲区
  141. public int nreadsize;//接收字节数
  142. public HttpFile(Download form, int thread)
  143. {
  144. formm = form;
  145. threadIndex = thread;
  146. }
  147. ~HttpFile()
  148. {
  149. formm.Dispose();
  150. }
  151. public int GetThread
  152. {
  153. get
  154. {
  155. return threadIndex;
  156. }
  157. }
  158. public int GetFilesize
  159. {
  160. get
  161. {
  162. return formm.filesize[threadIndex];
  163. }
  164. }
  165. public void ReceiveFile()//线程开始接收文件
  166. {
  167. filenamea = formm.filenameList[threadIndex];
  168. strUrl = formm.DownloadLink;
  169. ns = null;
  170. nbytes = new byte[1024];
  171. nreadsize = 0;
  172. //formm.recevMsg.Items.Add("线程" + threadIndex.ToString() + "开始接收:" + "文件大小" + Math.Ceiling(formm.filesize[threadIndex] / 1024.0f) + "KB");
  173. formm.ProgressBar1.Maximum = Convert.ToInt32(Math.Ceiling(formm.filesize[threadIndex] / 1024.0f));
  174. fs = new FileStream(filenamea, FileMode.Create);
  175. string dbPath = AppDomain.CurrentDomain.BaseDirectory + "\\Keys\\" + formm.Ordername + ".db";
  176. try
  177. {
  178. request = (HttpWebRequest)WebRequest.Create(strUrl);
  179. request.KeepAlive = false;
  180. //request.ProtocolVersion = HttpVersion.Version10;
  181. request.Proxy = WebRequest.DefaultWebProxy;//不使用代理,减少自动搜索代理的过程,提升性能
  182. //要接收文件的字节范围
  183. //request.AddRange(formm.filestartpos[threadIndex], formm.filestartpos[threadIndex] + formm.filesize[threadIndex]);
  184. request.Timeout = 5 * 60 * 1000;
  185. System.Net.ServicePointManager.DefaultConnectionLimit = 200;
  186. //ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
  187. //request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
  188. response = request.GetResponse() as HttpWebResponse;
  189. ns = response.GetResponseStream();
  190. int preocess = 0;
  191. long recSize = 0;
  192. do
  193. {
  194. nreadsize = ns.Read(nbytes, 0, nbytes.Length);
  195. if (nreadsize == 0)
  196. continue;
  197. recSize += (long)nreadsize;
  198. fs.Write(nbytes, 0, nreadsize);
  199. fs.Flush();
  200. preocess += (int)Math.Ceiling(nreadsize / 1024.0f);
  201. if (preocess <= formm.ProgressBar1.Maximum)
  202. {
  203. formm.ProgressBar1.Value = preocess;
  204. }
  205. } while (recSize != response.ContentLength);
  206. fs.Close();
  207. ns.Close();
  208. response.Close();
  209. GC.Collect();
  210. Log.WriteGetKeyLog("Download key package success:" + formm.filename);
  211. if(!File.Exists(dbPath))
  212. {
  213. if (SQLiteHelper.NewDbFile(dbPath))
  214. {
  215. SQLiteHelper.NewTable(dbPath, "keys", "(sn varchar,keys varvhar,copy_date DATETIME,report_date DATETIME)");
  216. SQLiteHelper.NewTable(dbPath, "mid", "(bid varchar,number varchar, pid varchar,ctype varvhar,version varvhar,host varchar,purl varvhar,psize varvhar,pmd5 varvhar,status varvhar,start_date DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP,'localtime')),finish_date DATETIME,desc varvhar)");
  217. SQLiteHelper.NewTable(dbPath, "report", "(url varchar,content varchar,gener_date DATETIME,report_date DATETIME)");
  218. SQLiteHelper.NewTable(dbPath, "rokuCustomer", "(ordernum varchar,data varchar)");
  219. SQLiteHelper.NewTable(dbPath, "whitebalance", "(ordernum varchar,hdmirgain varchar,hdmiggain varchar,hdmibgain varchar,nrgain varchar,nggain varchar,nbgain varchar,lrgain varchar,lggain varchar,lbgain varchar,updatetime DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP,'localtime')))");
  220. SQLiteHelper.NewTable(dbPath, "dsn", "(ordernum varchar,dsn varchar,updatetime DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP,'localtime')))");
  221. SQLiteHelper.AddOneLine(dbPath, new object[] { formm.Ordername, formm.Ordernumber, formm.OrderPID, formm.Orderclient, formm.OrderSV, formm.RequireHost, formm.DownloadLink, formm.DownloadSize, formm.packet_md5, "0" });
  222. if (formm.midlistnow.rokuCustomer != null)
  223. {
  224. SQLiteHelper.AddRokuOneLine(dbPath, new object[]
  225. {
  226. formm.midlistnow.rokuCustomer.ordernum,
  227. JsonConvert.SerializeObject(formm.midlistnow.rokuCustomer).ToString()
  228. });
  229. }
  230. if (formm.whiteBalanceListnow != null)
  231. {
  232. if (formm.whiteBalanceListnow.whiteBalanceInfo != null)
  233. {
  234. if (formm.whiteBalanceListnow.whiteBalanceInfo.isExemption != "1")
  235. {
  236. SQLiteHelper.AddwbOneLine(dbPath, new object[]
  237. {
  238. formm.whiteBalanceListnow.whiteBalanceInfo.ordernum,
  239. formm.whiteBalanceListnow.whiteBalanceInfo.hdmirgain,
  240. formm.whiteBalanceListnow.whiteBalanceInfo.hdmiggain,
  241. formm.whiteBalanceListnow.whiteBalanceInfo.hdmibgain,
  242. formm.whiteBalanceListnow.whiteBalanceInfo.nrgain,
  243. formm.whiteBalanceListnow.whiteBalanceInfo.nggain,
  244. formm.whiteBalanceListnow.whiteBalanceInfo.nbgain,
  245. formm.whiteBalanceListnow.whiteBalanceInfo.lrgain,
  246. formm.whiteBalanceListnow.whiteBalanceInfo.lggain,
  247. formm.whiteBalanceListnow.whiteBalanceInfo.lbgain }
  248. );
  249. }
  250. }
  251. }
  252. if (formm.midlistnow.keytype.ContainsKey("DSN"))
  253. {
  254. SQLiteHelper.AdddsnOneLine(dbPath, new object[] { formm.Ordername, formm.midlistnow.keytype["DSN"] });
  255. }
  256. }
  257. }
  258. }
  259. catch (Exception ex)
  260. {
  261. SQLiteHelper.UpdateStatus(dbPath, "0");
  262. MessageBox.Show(ex.Message, LResource.Error) ;
  263. Log.WriteErrorLog("\r\nDownload error:" + ex.Message);
  264. CommonMethod.ReportErrormsg("Fail to download key package", ex.Message + "\r\ndownload link:" + formm.DownloadLink, formm.errorDBNow);
  265. fs.Close();
  266. formm.Close();
  267. GC.Collect();
  268. return;
  269. }
  270. string keyinfo = "";
  271. string downloadMD5 = GetMD5.GetMD5HashFromFile(filenamea);
  272. if (downloadMD5 == formm.packet_md5)
  273. {
  274. try
  275. {
  276. SQLiteHelper.UpdateTime(dbPath, formm.Ordername);
  277. List<object[]> keyDatas = new List<object[]>();
  278. using (System.IO.StreamReader file = System.IO.File.OpenText(filenamea))
  279. {
  280. using (JsonTextReader reader = new JsonTextReader(file))
  281. {
  282. JArray o = (JArray)JToken.ReadFrom(reader);
  283. formm.ProgressBar1.Maximum = o.Count;
  284. int index = 0;
  285. formm.skinLabel1.Text = LResource.ParseKeys;
  286. foreach (var ss in o) //查找某个字段与值
  287. {
  288. var sn = ((JObject)ss)["sn"];
  289. var data = ((JObject)ss)["key"];
  290. keyDatas.Add(new object[] { sn, data });
  291. formm.ProgressBar1.Value = index;
  292. switch(formm.typeNow)
  293. {
  294. case -1:
  295. {
  296. break;
  297. }
  298. case 0:
  299. {
  300. if (!Countkey.CreateEEPROMKey(data.ToString(), formm.Ordername, out keyinfo, out string error))
  301. {
  302. Log.WriteErrorLog("\r\nCreate EEPROM fail:\r\n" + error);
  303. MessageBox.Show(LResource.CreateEEPROMError + "\r\n" + error);
  304. formm.skinLabel1.Text = LResource.ParseKeysError;
  305. return;
  306. }
  307. break;
  308. }
  309. case 1:
  310. {
  311. if(!FireTVkey.CreateFireTVKeys(data.ToString(), formm.Ordername,out string error))
  312. {
  313. Log.WriteErrorLog("\r\nCreate FireTV keys fail:\r\n" + error);
  314. MessageBox.Show( "生成FireTV订单离线key失败\r\n" + error);
  315. formm.skinLabel1.Text = LResource.ParseKeysError;
  316. return;
  317. }
  318. break;
  319. }
  320. }
  321. index++;
  322. }
  323. }
  324. }
  325. formm.skinLabel1.Text = LResource.ParseKeys;
  326. formm.skinLabel1.Text = LResource.InsertKeystoDB;
  327. if (formm.typeNow == 0)
  328. {
  329. MessageBox.Show("合成的Key类型有:" + keyinfo);
  330. }
  331. if (InsertKeys(dbPath, keyDatas))
  332. {
  333. SQLiteHelper.UpdateStatus(dbPath, "1");
  334. }
  335. else
  336. {
  337. MessageBox.Show(LResource.TransferDBFail);
  338. }
  339. }
  340. catch(Exception ex)
  341. {
  342. SQLiteHelper.UpdateStatus(dbPath, "0");
  343. Log.WriteErrorLog(ex.Message);
  344. formm.Close();
  345. GC.Collect();
  346. return;
  347. }
  348. }
  349. else
  350. {
  351. SQLiteHelper.UpdateStatus(dbPath, "0");
  352. MessageBox.Show("MD5 checking fail,please try again"+ downloadMD5);
  353. CommonMethod.ReportErrormsg("Key package MD5 checking fail", "MD5 checking error targetMD5:" + formm.packet_md5 + "\r\ndownload file MD5:" + downloadMD5, formm.errorDBNow);
  354. Log.WriteErrorLog("\r\nMD5 checking error targetMD5:" + formm.packet_md5 + "\r\ndownload file MD5:" + downloadMD5);
  355. }
  356. while (true)
  357. {
  358. /*
  359. GetAvailableThreads():检索由 GetMaxThreads 返回的线程池线程的最大数目和当前活动数目之间的差值。
  360. 而GetMaxThreads 检索可以同时处于活动状态的线程池请求的数目。
  361. 通过最大数目减可用数目就可以得到当前活动线程的数目,如果为零,那就说明没有活动线程,说明所有线程运行完毕。
  362. */
  363. ThreadPool.GetMaxThreads(out int maxWorkerThreads, out int portThreads);
  364. ThreadPool.GetAvailableThreads(out int workerThreads, out portThreads);
  365. if (maxWorkerThreads - workerThreads == 0)
  366. {
  367. Log.WriteGetKeyLog("Dowload thread Finished!");
  368. break;
  369. }
  370. else
  371. {
  372. Thread.Sleep(500);
  373. Log.WriteGetKeyLog("Dowload thread unfinished!");
  374. }
  375. }
  376. formm.Close();
  377. }
  378. public bool InsertKeys(string dbPath, List<object[]> keys)
  379. {
  380. try
  381. {
  382. SQLiteConnection sqliteConn = new SQLiteConnection("data source=" + dbPath);
  383. if (sqliteConn.State != System.Data.ConnectionState.Open)
  384. {
  385. sqliteConn.Open();
  386. SQLiteCommand cmd = new SQLiteCommand();
  387. cmd.Connection = sqliteConn;
  388. int index = 0;
  389. DbTransaction trans = sqliteConn.BeginTransaction();
  390. foreach (var key in keys)
  391. {
  392. formm.ProgressBar1.Value = index;
  393. cmd.CommandText = string.Format("insert into keys(sn,keys) values('{0}','{1}')", key[0], key[1]);
  394. cmd.ExecuteNonQuery();
  395. index++;
  396. }
  397. trans.Commit();
  398. }
  399. sqliteConn.Close();
  400. sqliteConn.Dispose();
  401. return true;
  402. }
  403. catch (Exception ex)
  404. {
  405. Log.WriteErrorLog("\r\nFail to transfer key to DB:\r\n" + ex.Message);
  406. return false;
  407. }
  408. }
  409. }
  410. }