frmMain.pas
上传用户:youjie821
上传日期:2013-01-27
资源大小:459k
文件大小:14k
源码类别:

PlugIns编程

开发平台:

Delphi

  1. unit frmMain;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, ActnList, StdCtrls, hxUpdate, ComCtrls, RzButton, ExtCtrls,
  6.   RzPanel, GIFImage, RzTreeVw, RzBorder, RzPrgres, RzLabel, RzListVw,
  7.   RzLstBox, hxFileRes, hxClasses, hxVersion, hxPopup, Menus;
  8. type
  9.   TMainForm = class(TForm)
  10.     RzPanel1: TRzPanel;
  11.     RzPanel2: TRzPanel;
  12.     RzPanel3: TRzPanel;
  13.     Notebook1: TNotebook;       
  14.     ActionList1: TActionList;
  15.     actOpen: TAction;
  16.     actClose: TAction;
  17.     actDownloadFileList: TAction;
  18.     actDowloadSelectedFiles: TAction;
  19.     actDownloadNewFiles: TAction;
  20.     actBack: TAction;
  21.     actNext: TAction;
  22.     actCancel: TAction;
  23.     actFinish: TAction;
  24.     RzButton2: TRzButton;
  25.     RzButton3: TRzButton;
  26.     RzButton4: TRzButton;
  27.     RzPanel4: TRzPanel;
  28.     Image1: TImage;
  29.     RzPanel5: TRzPanel;
  30.     tvNewFiles: TRzCheckTree;
  31.     RzPanel6: TRzPanel;
  32.     lvUpdateFiles: TRzListView;
  33.     RzLabel1: TRzLabel;
  34.     pbTotalDownload: TRzProgressBar;
  35.     lblDownloadFileName: TRzLabel;
  36.     pbFileDownload: TRzProgressBar;
  37.     RzPanel7: TRzPanel;
  38.     RzLabel3: TRzLabel;
  39.     RzLabel4: TRzLabel;
  40.     RzLabel5: TRzLabel;
  41.     lbInstalled: TRzListBox;
  42.     RzLabel6: TRzLabel;
  43.     RzLabel7: TRzLabel;
  44.     RzButton1: TRzButton;
  45.     actConfig: TAction;
  46.     RzLabel8: TRzLabel;
  47.     RzLabel9: TRzLabel;
  48.     RzLabel10: TRzLabel;
  49.     pbFileList: TRzProgressBar;
  50.     lblDownloadFileList: TRzLabel;
  51.     RzLabel12: TRzLabel;
  52.     RzLabel2: TRzLabel;
  53.     actViewFileInfo: TAction;
  54.     PopupMenu1: TPopupMenu;
  55.     N1: TMenuItem;
  56.     Label1: TRzLabel;
  57.     procedure FormCreate(Sender: TObject);
  58.     procedure FormDestroy(Sender: TObject);
  59.     procedure actOpenUpdate(Sender: TObject);
  60.     procedure actCloseUpdate(Sender: TObject);
  61.     procedure actOpenExecute(Sender: TObject);
  62.     procedure actCloseExecute(Sender: TObject);
  63.     procedure actDownloadFileListUpdate(Sender: TObject);
  64.     procedure actDowloadSelectedFilesExecute(Sender: TObject);
  65.     procedure actDowloadSelectedFilesUpdate(Sender: TObject);
  66.     procedure actDownloadFileListExecute(Sender: TObject);
  67.     procedure actDownloadNewFilesUpdate(Sender: TObject);
  68.     procedure actBackUpdate(Sender: TObject);
  69.     procedure actNextUpdate(Sender: TObject);
  70.     procedure actFinishUpdate(Sender: TObject);
  71.     procedure actBackExecute(Sender: TObject);
  72.     procedure actNextExecute(Sender: TObject);
  73.     procedure actCancelExecute(Sender: TObject);
  74.     procedure actFinishExecute(Sender: TObject);
  75.     procedure actCancelUpdate(Sender: TObject);
  76.     procedure actConfigExecute(Sender: TObject);
  77.     procedure actViewFileInfoUpdate(Sender: TObject);
  78.     procedure actViewFileInfoExecute(Sender: TObject);
  79.   private
  80.     { Private declarations }
  81.     FPopup: ThxPopup;
  82.     FVersionList: TVersionList;
  83.     procedure DoDownloadFileList(Sender: TObject; DownloadStatus: TDownloadStatus;
  84.       const WorkCount: Integer);
  85.     procedure DoDownloadFiles(Sender: TObject; DownloadStatus: TDownloadStatus;
  86.       const WorkCount: Integer);
  87.     function GetNewVersion(FileName: string): TVersion;
  88.     function GetOldVersion(FileName: string): TVersion;
  89.     procedure RefreshInstalledFiles;
  90.     procedure RefreshFileList(TreeNodes: TTreeNodes; Tree: TResTree);
  91.   public
  92.     { Public declarations }
  93.   end;
  94. var
  95.   MainForm: TMainForm;
  96. implementation
  97. uses
  98.   frmConfig, hxClientApp, hxSysUtils;
  99. {$R *.dfm}
  100. procedure TMainForm.FormCreate(Sender: TObject);
  101. begin
  102.   Caption:= 'LiveUpdate - ' + ParamStr(1);
  103.   FPopup:= ThxPopup.Create(nil);
  104.   G_ClientApp:= ThxClientApp.Create(ParamStr(1));
  105.   // 显示已安装的文件列表
  106.   FVersionList:= TVersionList.Create(ExtractFilePath(ParamStr(0)) + ParamStr(1) + '.ver');
  107.   RefreshInstalledFiles;
  108.   Notebook1.PageIndex:= 0;
  109. end;
  110. procedure TMainForm.FormDestroy(Sender: TObject);
  111. begin
  112.   FVersionList.Free;
  113.   G_ClientApp.Free;
  114.   FPopup.Free;
  115. end;
  116. procedure TMainForm.actOpenUpdate(Sender: TObject);
  117. begin
  118.   (Sender as TAction).Enabled:= not GetClientApp.UpdateClient.Active;
  119. end;
  120. procedure TMainForm.actCloseUpdate(Sender: TObject);
  121. begin
  122.   (Sender as TAction).Enabled:= GetClientApp.UpdateClient.Active;
  123. end;
  124. procedure TMainForm.actOpenExecute(Sender: TObject);
  125. begin
  126.   with GetClientApp.Settings do
  127.     GetClientApp.UpdateClient.Open(ServerIP, ServerPort);
  128. end;
  129. procedure TMainForm.actCloseExecute(Sender: TObject);
  130. begin
  131.   GetClientApp.UpdateClient.Close;
  132. end;
  133. procedure TMainForm.actDownloadFileListUpdate(Sender: TObject);
  134. begin
  135.   (Sender as TAction).Enabled:= GetClientApp.UpdateClient.Active;
  136. end;
  137. procedure TMainForm.actDowloadSelectedFilesExecute(Sender: TObject);
  138. var
  139.   I: Integer;
  140.   slFiles: TStrings;
  141.   TreeNode: TTreeNode;
  142. begin
  143.   slFiles:= TStringList.Create;
  144.   try
  145.     for I:= 0 to tvNewFiles.Items.Count - 1 do
  146.       if tvNewFiles.Items[I].Selected then
  147.       begin
  148.         TreeNode:= tvNewFiles.Items[I];
  149.         case PResInfo(TreeNode.Data)^.ResType of
  150.           rtFile: slFiles.Add(PResInfo(TreeNode.Data)^.DownloadURL);
  151.           rtDirectory:
  152.           begin
  153.             TreeNode:= TreeNode.getFirstChild;
  154.             while TreeNode <> nil do
  155.             begin
  156.               if PResInfo(TreeNode.Data)^.ResType = rtFile then
  157.                 slFiles.Add(PResInfo(TreeNode.Data)^.DownloadURL);
  158.               TreeNode:= TreeNode.getNextSibling;
  159.             end;
  160.           end;
  161.         end;
  162.       end;
  163.     GetClientApp.UpdateClient.DownloadFiles(slFiles, nil);
  164.   finally
  165.     slFiles.Free;
  166.   end;
  167. end;
  168. procedure TMainForm.actDowloadSelectedFilesUpdate(Sender: TObject);
  169. begin
  170.   (Sender as TAction).Enabled:= GetClientApp.UpdateClient.Active;
  171. end;
  172. procedure TMainForm.actDownloadFileListExecute(Sender: TObject);
  173. begin
  174.   GetClientApp.UpdateClient.DownloadFileList(nil);
  175. end;
  176. procedure TMainForm.actDownloadNewFilesUpdate(Sender: TObject);
  177. begin
  178.   (Sender as TAction).Enabled:= GetClientApp.UpdateClient.Active;
  179. end;
  180. procedure TMainForm.actBackUpdate(Sender: TObject);
  181. begin
  182.   (Sender as TAction).Enabled:= (Notebook1.PageIndex > 0) and
  183.     (Notebook1.PageIndex <> Notebook1.Pages.Count - 1) and
  184.     ((Sender as TAction).Tag = 0);
  185. end;
  186. procedure TMainForm.actNextUpdate(Sender: TObject);
  187. begin
  188.   (Sender as TAction).Enabled:= Notebook1.PageIndex < Notebook1.Pages.Count - 1;
  189. end;
  190. procedure TMainForm.actFinishUpdate(Sender: TObject);
  191. begin
  192.   (Sender as TAction).Enabled:= Notebook1.PageIndex = Notebook1.Pages.Count - 1;
  193. end;
  194. procedure TMainForm.actBackExecute(Sender: TObject);
  195. begin
  196.   Notebook1.PageIndex:= Notebook1.PageIndex - 1;
  197. end;
  198. procedure TMainForm.actNextExecute(Sender: TObject);
  199. var
  200.   I: Integer;
  201.   slFiles: TStrings;
  202.   FileSize: Integer;
  203.   pInfo: PResInfo;
  204. begin
  205.   Notebook1.PageIndex:= Notebook1.PageIndex + 1;
  206.   case Notebook1.PageIndex of
  207.     1:  // download file list
  208.     begin
  209.       if GetClientApp.UpdateClient.Active then
  210.         GetClientApp.UpdateClient.Close;
  211.       lblDownloadFileList.Caption:= '正在连接服务器...';
  212.       with GetClientApp.Settings do
  213.         GetClientApp.UpdateClient.Open(ServerIP, ServerPort);
  214.       GetClientApp.UpdateClient.DownloadFileList(DoDownloadFileList);
  215.     end;
  216.     2: // download files
  217.     begin
  218.       slFiles:= TStringList.Create;
  219.       try
  220.         lvUpdateFiles.Clear;
  221.         FileSize:= 0;
  222.         for I:= 0 to tvNewFiles.Items.Count - 1 do
  223.         begin
  224.           pInfo:= PResInfo(tvNewFiles.Items[I].Data);
  225.           if (tvNewFiles.ItemState[I] = csChecked) and (pInfo^.ResType <> rtDirectory) then
  226.           begin
  227.             slFiles.Add(pInfo^.DownloadURL);
  228.             FileSize:= FileSize + pInfo^.FileSize;
  229.             with lvUpdateFiles.Items.Add do
  230.             begin
  231.               Caption:= pInfo^.FileName;
  232.               SubItems.Add(IntToStr(pInfo^.FileSize));
  233.               SubItems.Add('0');
  234.               Data:= pInfo;
  235.             end;
  236.           end;
  237.         end;
  238.         if slFiles.Count <> 0 then
  239.         begin
  240.           pbTotalDownload.TotalParts:= FileSize;
  241.           GetClientApp.UpdateClient.DownloadFiles(slFiles, DoDownloadFiles);
  242.         end
  243.         else
  244.           Notebook1.PageIndex:= 3;
  245.       finally
  246.         slFiles.Free;
  247.       end;
  248.     end;
  249.   end;
  250. end;
  251. procedure TMainForm.actCancelExecute(Sender: TObject);
  252. begin
  253.   Close;
  254. end;
  255. procedure TMainForm.actFinishExecute(Sender: TObject);
  256. begin
  257.   Close;
  258. end;
  259. procedure TMainForm.actCancelUpdate(Sender: TObject);
  260. begin
  261.   if Notebook1.PageIndex = Notebook1.Pages.Count - 1 then
  262.     (Sender as TAction).Caption:= '关闭'
  263.   else
  264.     (Sender as TAction).Caption:= '取消';
  265. end;
  266. procedure TMainForm.actConfigExecute(Sender: TObject);
  267. begin
  268.   // Todo:配置网络
  269.   ShowConfigForm;
  270. end;
  271. procedure TMainForm.DoDownloadFileList(Sender: TObject; DownloadStatus: TDownloadStatus;
  272.   const WorkCount: Integer);
  273. begin
  274.   case DownloadStatus of
  275.     dsBegin:
  276.     begin
  277.       pbFileList.Percent:= 0;
  278.       lblDownloadFileList.Caption:= '正在下载最新文件列表...';
  279.     end;
  280.     dsEnd:
  281.     begin
  282.       RefreshFileList(tvNewFiles.Items, (Sender as TDownloadFileListThread).ResTree);
  283.       pbFileList.Percent:= 100;
  284.       lblDownloadFileList.Caption:= '文件列表下载完毕';
  285.     end;
  286.   end;
  287. end;
  288. procedure TMainForm.DoDownloadFiles(Sender: TObject; DownloadStatus: TDownloadStatus;
  289.   const WorkCount: Integer);
  290.   function IndexOfNewFile(FileName: string): Integer;
  291.   var
  292.     I: Integer;
  293.   begin
  294.     Result:= -1;
  295.     for I:= 0 to lvUpdateFiles.Items.Count - 1 do
  296.       if SameText(PResInfo(lvUpdateFiles.Items[I].Data)^.DownloadURL, FileName) then
  297.       begin
  298.         Result:= I;
  299.         Exit;
  300.       end;
  301.   end;
  302. var
  303.   Index: Integer;
  304.   FileName, NewVersion: string;
  305. begin
  306.   case DownloadStatus of
  307.     dsBegin:
  308.     begin
  309.       //pbTotalDownload.TotalParts:= WorkCount;
  310.       pbTotalDownload.PartsComplete:= 0;
  311.     end;
  312.     dsFileBegin:
  313.     begin
  314.       pbFileDownload.TotalParts:= WorkCount;
  315.       pbFileDownload.PartsComplete:= 0;
  316.       lblDownloadFileName.Caption:= (Sender as TDownloadFilesThread).DownloadFileName;
  317.     end;
  318.     dsFileData:
  319.     begin
  320.       pbFileDownload.IncParts(WorkCount);
  321.       pbTotalDownload.IncParts(WorkCount);
  322.       FileName:= (Sender as TDownloadFilesThread).DownloadFileName;
  323.       Index:= IndexOfNewFile(FileName);
  324.       if Index <> -1 then
  325.         lvUpdateFiles.Items[Index].SubItems[1]:= IntToStr(pbFileDownload.Percent);
  326.     end;
  327.     dsFileEnd:
  328.     begin
  329.       // 更新历史版本号
  330.       FileName:= (Sender as TDownloadFilesThread).DownloadFileName;
  331.       Index:= IndexOfNewFile(FileName);
  332.       if Index <> -1 then
  333.       begin
  334.         NewVersion:= PResInfo(lvUpdateFiles.Items[Index].Data)^.Version;
  335.         FVersionList.Update((Sender as TDownloadFilesThread).DownloadFileName, NewVersion);
  336.       end;
  337.       pbFileDownload.Percent:= 100;
  338.       //pbTotalDownload.PartsComplete:= pbTotalDownload.PartsComplete + WorkCount;
  339.     end;
  340.     dsEnd:
  341.     begin
  342.       FPopup.Title:= '提示';
  343.       FPopup.Text:= '程序更新完毕。';
  344.       FPopup.Popup;
  345.       // 自动跳到最后一页
  346.       Notebook1.PageIndex:= Notebook1.Pages.Count - 1;
  347.       actBack.Tag:= 1;
  348.     end;
  349.   end;
  350. end;
  351. procedure TMainForm.RefreshFileList(TreeNodes: TTreeNodes; Tree: TResTree);
  352.   procedure TravelTree(Node: TNode; TreeNode: TTreeNode);
  353.   var
  354.     I: Integer;
  355.   begin
  356.     if Node = nil then Exit;
  357.     with PResInfo(Node.Data)^ do
  358.       case ResType of
  359.         rtDirectory:
  360.         begin
  361.           TreeNode:= TreeNodes.AddChild(TreeNode, Node.Text);
  362.           TreeNode.Data:= Node.Data;
  363.         end;
  364.       else
  365.         // 在此处比较版本
  366.         if not SameVersion(Version, GetOldVersion(DownloadURL)) then
  367.         begin
  368.           TreeNode:= TreeNodes.AddChild(TreeNode, Node.Text);
  369.           TreeNode.Data:= Node.Data;
  370.           tvNewFiles.ItemState[tvNewFiles.Items.Count - 1]:= csChecked;
  371.         end;
  372.       end;
  373.     for I:= 0 to Node.Count - 1 do
  374.       TravelTree(Node.Children[I], TreeNode);
  375.   end;
  376. var
  377.   I: Integer;
  378.   Node: TNode;
  379. begin
  380.   TreeNodes.BeginUpdate;
  381.   try
  382.     TreeNodes.Clear;
  383.     Node:= Tree.RootNode;
  384.     for I:= 0 to Node.Count - 1 do
  385.       TravelTree(Node.Children[I], nil);
  386.     // 删除空目录
  387.     for I:= TreeNodes.Count - 1 downto 0 do
  388.       if PResInfo(TreeNodes.Item[I].Data)^.ResType = rtDirectory then
  389.         if not TreeNodes.Item[I].HasChildren then
  390.           TreeNodes.Item[I].Delete;
  391.   finally
  392.     TreeNodes.EndUpdate;
  393.   end;
  394. end;
  395. procedure TMainForm.RefreshInstalledFiles;
  396. var
  397.   I: Integer;
  398. begin
  399.   lbInstalled.Items.BeginUpdate;
  400.   try
  401.     lbInstalled.Items.Clear;
  402.     for I:= 0 to FVersionList.Count - 1 do
  403.       lbInstalled.Items.Add(FVersionList[I]^.FileName);
  404.   finally
  405.     lbInstalled.Items.EndUpdate;
  406.   end;
  407. end;
  408. procedure TMainForm.actViewFileInfoUpdate(Sender: TObject);
  409. begin
  410.   (Sender as TAction).Enabled:= tvNewFiles.Selected <> nil;
  411. end;
  412. procedure TMainForm.actViewFileInfoExecute(Sender: TObject);
  413. var
  414.   Str: string;
  415. begin
  416.   with PResInfo(tvNewFiles.Selected.Data)^ do
  417.   begin
  418.     Str:= 'FileName:' + FileName + #13#10;
  419.     Str:= Str + 'Description:' + Description + #13#10;
  420.     Str:= Str + 'FileSize:' + IntToStr(FileSize) + #13#10;
  421.     Str:= Str + 'FileAttr:' + IntToStr(FileAttr) + #13#10;
  422.     Str:= Str + 'Version:' + Version + #13#10;
  423.     Str:= Str + 'ResType:' + IntToStr(Integer(ResType)) + #13#10;
  424.     Str:= Str + 'DownloadURL:' + DownloadURL;
  425.     ShowMessage(Str);
  426.   end;
  427. end;
  428. function TMainForm.GetOldVersion(FileName: string): string;
  429. var
  430.   Index: Integer;
  431. begin
  432.   Index:= FVersionList.IndexOf(FileName);
  433.   if Index <> -1 then
  434.     Result:= FVersionList[Index].Version
  435.   else
  436.     Result:= 'Unknown';
  437. end;
  438. function TMainForm.GetNewVersion(FileName: string): TVersion;
  439. var
  440.   I: Integer;
  441. begin
  442.   Result:= '0';
  443.   for I:= 0 to tvNewFiles.Items.Count - 1 do
  444.   begin
  445.     if SameText(PResInfo(tvNewFiles.Items[I].Data)^.FileName, FileName) then
  446.     begin
  447.       Result:= PResInfo(tvNewFiles.Items[I].Data)^.Version;
  448.       Break;
  449.     end;
  450.   end;
  451. end;
  452. end.