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

PlugIns编程

开发平台:

Delphi

  1. unit frmMiniUpdate;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, RzPrgres, StdCtrls, RzLabel, ExtCtrls, RzPanel, hxClientApp, hxFileRes,
  6.   hxUpdate, hxSysUtils, RzButton, ShellApi;
  7. type
  8.   TMiniUpdateForm = class(TForm)
  9.     RzPanel4: TRzPanel;
  10.     Notebook1: TNotebook;
  11.     pnlFirst: TRzPanel;
  12.     lblDownloadTip: TRzLabel;
  13.     pbDownload: TRzProgressBar;
  14.     pnlSecond: TRzPanel;
  15.     RzLabel1: TRzLabel;
  16.     procedure FormCreate(Sender: TObject);
  17.     procedure FormShow(Sender: TObject);
  18.     procedure FormDestroy(Sender: TObject);
  19.     procedure Notebook1PageChanged(Sender: TObject);
  20.   private
  21.     { Private declarations }
  22.     FNewFiles: TStringList;
  23.     FVersionList: TVersionList;
  24.     procedure DoDownloadFileList(Sender: TObject; DownloadStatus: TDownloadStatus;
  25.       const WorkCount: Integer);
  26.     procedure DoDownloadFiles(Sender: TObject; DownloadStatus: TDownloadStatus;
  27.       const WorkCount: Integer);
  28.     procedure RefreshNewFileList(ResTree: TResTree; var TotalSize: Integer);
  29.     function GetNewVersion(FileName: string): TVersion;
  30.     function GetOldVersion(FileName: string): TVersion;
  31.   public
  32.     { Public declarations }
  33.   end;
  34. var
  35.   MiniUpdateForm: TMiniUpdateForm;
  36. implementation
  37. uses
  38.   hxClasses, frmConfig;
  39. {$R *.dfm}
  40. procedure TMiniUpdateForm.DoDownloadFileList(Sender: TObject;
  41.   DownloadStatus: TDownloadStatus; const WorkCount: Integer);
  42. var
  43.   I, TotalFileSize: Integer;
  44.   slFiles: TStringList;
  45. begin
  46.   case DownloadStatus of
  47.     dsBegin:
  48.     begin
  49.       pbDownload.Percent:= 0;
  50.       lblDownloadTip.Caption:= '正在下载最新文件列表...';
  51.     end;
  52.     dsEnd:
  53.     begin
  54.       TotalFileSize:= 0;
  55.       RefreshNewFileList((Sender as TDownloadFileListThread).ResTree, TotalFileSize);
  56.       lblDownloadTip.Caption:= '正在下载文件...';
  57.       Application.ProcessMessages;
  58.       pbDownload.Percent:= 0;
  59.       if FNewFiles.Count <> 0 then
  60.       begin
  61.         pbDownload.TotalParts:= TotalFileSize;
  62.         slFiles:= TStringList.Create;
  63.         try
  64.           for I:= 0 to FNewFiles.Count - 1 do
  65.           begin
  66.             slFiles.Add(FNewFiles.Names[I]);
  67.           end;
  68.           GetClientApp.UpdateClient.DownloadFiles(slFiles, DoDownloadFiles);
  69.         finally
  70.           slFiles.Free;
  71.         end;
  72.       end
  73.       else
  74.       begin
  75.         Application.Terminate;
  76.       end;
  77.     end;
  78.   end;
  79. end;
  80. procedure TMiniUpdateForm.DoDownloadFiles(Sender: TObject;
  81.   DownloadStatus: TDownloadStatus; const WorkCount: Integer);
  82. var
  83.   FileName: string;
  84.   NewVersion: TVersion;
  85. begin
  86.   case DownloadStatus of
  87.     dsBegin:
  88.     begin
  89.       pbDownload.PartsComplete:= 0;
  90.     end;
  91.     dsFileBegin:
  92.     begin
  93.       lblDownloadTip.Caption:= '正在下载 ' + (Sender as TDownloadFilesThread).DownloadFileName;
  94.     end;
  95.     dsFileData:
  96.     begin
  97.       pbDownload.IncParts(WorkCount);
  98.     end;
  99.     dsFileEnd:
  100.     begin
  101.       // 更新历史版本号
  102.       FileName:= (Sender as TDownloadFilesThread).DownloadFileName;
  103.       NewVersion:= GetNewVersion(FileName);
  104.       FVersionList.Update(FileName, NewVersion);
  105.       Application.ProcessMessages;
  106.     end;
  107.     dsEnd:
  108.     begin
  109.       Notebook1.PageIndex:= 1;
  110.     end;
  111.   end;
  112. end;
  113. procedure TMiniUpdateForm.FormCreate(Sender: TObject);
  114. begin
  115.   FNewFiles:= TStringList.Create;
  116.   G_ClientApp:= ThxClientApp.Create(ParamStr(1));
  117.   Notebook1.PageIndex:= 0;
  118. end;
  119. procedure TMiniUpdateForm.FormDestroy(Sender: TObject);
  120. begin
  121.   FVersionList.Free;
  122.   G_ClientApp.Free;
  123.   FNewFiles.Free;
  124. end;
  125. function TMiniUpdateForm.GetOldVersion(FileName: string): TVersion;
  126. var
  127.   Index: Integer;
  128. begin
  129.   Index:= FVersionList.IndexOf(FileName);
  130.   if Index <> -1 then
  131.     Result:= FVersionList[Index].Version
  132.   else
  133.     Result:= 'Unknown';
  134. end;
  135. procedure TMiniUpdateForm.FormShow(Sender: TObject);
  136. begin
  137.   // 显示已安装的文件列表
  138.   FVersionList:= TVersionList.Create(ExtractFilePath(ParamStr(0)) + ParamStr(1) + '.ver');
  139.   lblDownloadTip.Caption:= '正在连接服务器...';
  140.   with GetClientApp.Settings do
  141.   try
  142.     GetClientApp.UpdateClient.Open(ServerIP, ServerPort);
  143.   except
  144.     on E: Exception do
  145.     begin
  146.       MessageBox(0, PChar(E.Message), '网络故障', MB_OK + MB_ICONERROR);
  147.       ShowConfigForm;
  148.       Close;
  149.     end;
  150.   end;
  151.   GetClientApp.UpdateClient.DownloadFileList(DoDownloadFileList);
  152. end;
  153. function TMiniUpdateForm.GetNewVersion(FileName: string): TVersion;
  154. begin
  155.   Result:= FNewFiles.Values[FileName];
  156. end;
  157. procedure TMiniUpdateForm.RefreshNewFileList(ResTree: TResTree; var TotalSize: Integer);
  158.   procedure TravelTree(Node: TNode);
  159.   var
  160.     I: Integer;
  161.     pInfo: PResInfo;
  162.   begin
  163.     if Node = nil then Exit;
  164.     pInfo:= PResInfo(Node.Data);
  165.     if pInfo^.ResType = rtFile then
  166.     begin
  167.       if not SameVersion(pInfo^.Version, GetOldVersion(pInfo^.DownloadURL)) then
  168.       begin
  169.         FNewFiles.Values[pInfo^.DownloadURL]:= pInfo^.Version;
  170.         Inc(TotalSize, pInfo^.FileSize);
  171.       end;
  172.     end;
  173.     for I:= 0 to Node.Count - 1 do
  174.       TravelTree(Node.Children[I]);
  175.   end;
  176. var
  177.   I: Integer;
  178.   Node: TNode;
  179. begin
  180.   FNewFiles.Clear;
  181.   Node:= ResTree.RootNode;
  182.   for I:= 0 to Node.Count - 1 do
  183.     TravelTree(Node.Children[I]);
  184. end;
  185. procedure TMiniUpdateForm.Notebook1PageChanged(Sender: TObject);
  186. begin
  187.   if (Sender as TNotebook).PageIndex = 1 then
  188.   begin
  189.     ShellExecute(0, 'open', PChar(ParamStr(3)), '', '', SW_NORMAL);
  190.     Close;
  191.   end;
  192. end;
  193. end.