Download.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  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;//MidAddress1.purl;//http://sz-idmanage.file.qhmoka.com/JsonFile/SanHua/20191105164316042.json
  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. nreadsize = ns.Read(nbytes, 0, nbytes.Length);
  191. int preocess = 0;
  192. while (nreadsize > 0)
  193. {
  194. fs.Write(nbytes, 0, nreadsize);
  195. //formm.recevMsg.Items.Add("线程" + threadIndex.ToString() + "已下载字节:" + Math.Ceiling(nreadsize / 1024.0f) + "KB");
  196. nreadsize = ns.Read(nbytes, 0, nbytes.Length);
  197. preocess += (int)Math.Ceiling(nreadsize / 1024.0f);
  198. if(preocess<= formm.ProgressBar1.Maximum)
  199. {
  200. formm.ProgressBar1.Value = preocess;
  201. }
  202. }
  203. fs.Close();
  204. ns.Close();
  205. response.Close();
  206. GC.Collect();
  207. Log.WriteGetKeyLog("Download key package success:" + formm.filename);
  208. if(!File.Exists(dbPath))
  209. {
  210. if (SQLiteHelper.NewDbFile(dbPath))
  211. {
  212. SQLiteHelper.NewTable(dbPath, "keys", "(sn varchar,keys varvhar,copy_date DATETIME,report_date DATETIME)");
  213. 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)");
  214. SQLiteHelper.NewTable(dbPath, "report", "(url varchar,content varchar,gener_date DATETIME,report_date DATETIME)");
  215. SQLiteHelper.NewTable(dbPath, "rokuCustomer", "(ordernum varchar,region varchar,brand varchar,oemmodel varchar,supporturl varchar,supportphone varchar,productiondate varchar,remotetype varchar)");
  216. 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')))");
  217. SQLiteHelper.NewTable(dbPath, "dsn", "(ordernum varchar,dsn varchar,updatetime DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP,'localtime')))");
  218. 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" });
  219. if (formm.midlistnow.rokuCustomer != null)
  220. SQLiteHelper.AddRokuOneLine(dbPath, new object[] { formm.midlistnow.rokuCustomer.ordernum, formm.midlistnow.rokuCustomer.region, formm.midlistnow.rokuCustomer.brand, formm.midlistnow.rokuCustomer.oemmodel, formm.midlistnow.rokuCustomer.supporturl, formm.midlistnow.rokuCustomer.supportphone, formm.midlistnow.rokuCustomer.productiondate, formm.midlistnow.rokuCustomer.remotetype });
  221. if (formm.whiteBalanceListnow != null)
  222. if (formm.whiteBalanceListnow.whiteBalanceInfo != null)
  223. if (formm.whiteBalanceListnow.whiteBalanceInfo.isExemption != "1")
  224. {
  225. SQLiteHelper.AddwbOneLine(dbPath, new object[] { formm.whiteBalanceListnow.whiteBalanceInfo.ordernum,
  226. formm.whiteBalanceListnow.whiteBalanceInfo.hdmirgain, formm.whiteBalanceListnow.whiteBalanceInfo.hdmiggain, formm.whiteBalanceListnow.whiteBalanceInfo.hdmibgain,
  227. formm.whiteBalanceListnow.whiteBalanceInfo.nrgain, formm.whiteBalanceListnow.whiteBalanceInfo.nggain, formm.whiteBalanceListnow.whiteBalanceInfo.nbgain,
  228. formm.whiteBalanceListnow.whiteBalanceInfo.lrgain, formm.whiteBalanceListnow.whiteBalanceInfo.lggain, formm.whiteBalanceListnow.whiteBalanceInfo.lbgain });
  229. }
  230. if (formm.midlistnow.keytype.ContainsKey("DSN"))
  231. {
  232. SQLiteHelper.AdddsnOneLine(dbPath, new object[] { formm.Ordername, formm.midlistnow.keytype["DSN"] });
  233. }
  234. }
  235. }
  236. }
  237. catch (Exception ex)
  238. {
  239. SQLiteHelper.UpdateStatus(dbPath, "0");
  240. MessageBox.Show(ex.Message, LResource.Error) ;
  241. Log.WriteErrorLog("\r\nDownload error:" + ex.Message);
  242. CommonMethod.ReportErrormsg("Fail to download key package", ex.Message + "\r\ndownload link:" + formm.DownloadLink, formm.errorDBNow);
  243. fs.Close();
  244. formm.Close();
  245. GC.Collect();
  246. return;
  247. }
  248. string keyinfo = "";
  249. string downloadMD5 = GetMD5.GetMD5HashFromFile(filenamea);
  250. if (downloadMD5 == formm.packet_md5)
  251. {
  252. try
  253. {
  254. SQLiteHelper.UpdateTime(dbPath, formm.Ordername);
  255. List<object[]> keyDatas = new List<object[]>();
  256. using (System.IO.StreamReader file = System.IO.File.OpenText(filenamea))
  257. {
  258. using (JsonTextReader reader = new JsonTextReader(file))
  259. {
  260. JArray o = (JArray)JToken.ReadFrom(reader);
  261. formm.ProgressBar1.Maximum = o.Count;
  262. int index = 0;
  263. formm.skinLabel1.Text = LResource.ParseKeys;
  264. foreach (var ss in o) //查找某个字段与值
  265. {
  266. var sn = ((JObject)ss)["sn"];
  267. var data = ((JObject)ss)["key"];
  268. keyDatas.Add(new object[] { sn, data });
  269. formm.ProgressBar1.Value = index;
  270. switch(formm.typeNow)
  271. {
  272. case -1:
  273. {
  274. break;
  275. }
  276. case 0:
  277. {
  278. if (!Countkey.CreateEEPROMKey(data.ToString(), formm.Ordername, out keyinfo, out string error))
  279. {
  280. Log.WriteErrorLog("\r\nCreate EEPROM fail:\r\n" + error);
  281. MessageBox.Show(LResource.CreateEEPROMError + "\r\n" + error);
  282. formm.skinLabel1.Text = LResource.ParseKeysError;
  283. return;
  284. }
  285. break;
  286. }
  287. case 1:
  288. {
  289. if(!FireTVkey.CreateFireTVKeys(data.ToString(), formm.Ordername,out string error))
  290. {
  291. Log.WriteErrorLog("\r\nCreate FireTV keys fail:\r\n" + error);
  292. MessageBox.Show( "生成FireTV订单离线key失败\r\n" + error);
  293. formm.skinLabel1.Text = LResource.ParseKeysError;
  294. return;
  295. }
  296. break;
  297. }
  298. }
  299. index++;
  300. }
  301. }
  302. }
  303. formm.skinLabel1.Text = LResource.ParseKeys;
  304. formm.skinLabel1.Text = LResource.InsertKeystoDB;
  305. if (formm.typeNow == 0)
  306. {
  307. MessageBox.Show("合成的Key类型有:" + keyinfo);
  308. }
  309. if (InsertKeys(dbPath, keyDatas))
  310. {
  311. SQLiteHelper.UpdateStatus(dbPath, "1");
  312. }
  313. else
  314. {
  315. MessageBox.Show(LResource.TransferDBFail);
  316. }
  317. }
  318. catch(Exception ex)
  319. {
  320. SQLiteHelper.UpdateStatus(dbPath, "0");
  321. Log.WriteErrorLog(ex.Message);
  322. formm.Close();
  323. GC.Collect();
  324. return;
  325. }
  326. }
  327. else
  328. {
  329. SQLiteHelper.UpdateStatus(dbPath, "0");
  330. MessageBox.Show("MD5 checking fail,please try again"+ downloadMD5);
  331. CommonMethod.ReportErrormsg("Key package MD5 checking fail", "MD5 checking error targetMD5:" + formm.packet_md5 + "\r\ndownload file MD5:" + downloadMD5, formm.errorDBNow);
  332. Log.WriteErrorLog("\r\nMD5 checking error targetMD5:" + formm.packet_md5 + "\r\ndownload file MD5:" + downloadMD5);
  333. }
  334. while (true)
  335. {
  336. /*
  337. GetAvailableThreads():检索由 GetMaxThreads 返回的线程池线程的最大数目和当前活动数目之间的差值。
  338. 而GetMaxThreads 检索可以同时处于活动状态的线程池请求的数目。
  339. 通过最大数目减可用数目就可以得到当前活动线程的数目,如果为零,那就说明没有活动线程,说明所有线程运行完毕。
  340. */
  341. ThreadPool.GetMaxThreads(out int maxWorkerThreads, out int portThreads);
  342. ThreadPool.GetAvailableThreads(out int workerThreads, out portThreads);
  343. if (maxWorkerThreads - workerThreads == 0)
  344. {
  345. Log.WriteGetKeyLog("Dowload thread Finished!");
  346. break;
  347. }
  348. else
  349. {
  350. Thread.Sleep(500);
  351. Log.WriteGetKeyLog("Dowload thread unfinished!");
  352. }
  353. }
  354. formm.Close();
  355. }
  356. public bool InsertKeys(string dbPath, List<object[]> keys)
  357. {
  358. try
  359. {
  360. SQLiteConnection sqliteConn = new SQLiteConnection("data source=" + dbPath);
  361. if (sqliteConn.State != System.Data.ConnectionState.Open)
  362. {
  363. sqliteConn.Open();
  364. SQLiteCommand cmd = new SQLiteCommand();
  365. cmd.Connection = sqliteConn;
  366. int index = 0;
  367. DbTransaction trans = sqliteConn.BeginTransaction();
  368. foreach (var key in keys)
  369. {
  370. formm.ProgressBar1.Value = index;
  371. cmd.CommandText = string.Format("insert into keys(sn,keys) values('{0}','{1}')", key[0], key[1]);
  372. cmd.ExecuteNonQuery();
  373. index++;
  374. }
  375. trans.Commit();
  376. }
  377. sqliteConn.Close();
  378. sqliteConn.Dispose();
  379. return true;
  380. }
  381. catch (Exception ex)
  382. {
  383. Log.WriteErrorLog("\r\nFail to transfer key to DB:\r\n" + ex.Message);
  384. return false;
  385. }
  386. }
  387. }
  388. }