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

PlugIns编程

开发平台:

Delphi

  1. unit hxDllClient;
  2. interface
  3. uses
  4.   Windows, Forms, Dialogs, Classes, SysUtils, hxUpdate, hxClasses, hxFileRes;
  5. type
  6.   ThxDllClient = class(TObject)
  7.   private
  8.     FDownloadProgress: TDownloadProgress;
  9.     FTotalSize: Integer;
  10.     FWorking: Boolean;
  11.     FNewVersions: TVersionList;
  12.     FOldVersions: TVersionList;
  13.     FClient: ThxUpdateClient;
  14.     FHost: string;
  15.     FPort: Integer;
  16.     FProjectName: string;
  17.     FProxyInfo: TProxyInfo;
  18.     procedure DoDownloadFileList(Sender: TObject; DownloadStatus: TDownloadStatus;
  19.       const WorkCount: Integer);
  20.     procedure DoDownloadFiles(Sender: TObject; DownloadStatus: TDownloadStatus;
  21.       const WorkCount: Integer);
  22.     procedure RefreshNewFileList(ResTree: TResTree; var TotalSize: Integer);
  23.     function GetOldVersion(FileName: string): TVersion;
  24.     function GetNewVersion(FileName: string): TVersion;
  25.     procedure SetActive(const Value: Boolean);
  26.     function GetActive: Boolean;
  27.   public
  28.     constructor Create;
  29.     destructor Destroy; override;
  30.     function CheckNewVersion: Boolean;
  31.     procedure UpdateProduct(DownloadProgress: TDownloadProgress);
  32.     property Host: string read FHost write FHost;
  33.     property Port: Integer read FPort write FPort;
  34.     property ProxyInfo: TProxyInfo read FProxyInfo write FProxyInfo;
  35.     property ProjectName: string read FProjectName write FProjectName;
  36.     property OldVersions: TVersionList read FOldVersions;
  37.     property NewVersions: TVersionList read FNewVersions; 
  38.     property Active: Boolean read GetActive write SetActive;
  39.   end;
  40. implementation
  41. { ThxDllClient }
  42. function ThxDllClient.CheckNewVersion: Boolean;
  43. var
  44.   T: Cardinal;
  45. begin
  46.   Active:= True;
  47.   T:= GetTickCount;
  48.   FClient.DownloadFileList(DoDownloadFileList);
  49.   while GetTickCount - T < G_TimeOut do
  50.   begin
  51.     if not FWorking then
  52.     begin
  53.       Result:= FTotalSize <> 0;
  54.       Active:= False;
  55.       Exit;
  56.     end;
  57.     if Application.Terminated then
  58.       Break;
  59.     Application.ProcessMessages;
  60.   end;
  61.   raise Exception.Create('网络超时,无法连接到LiveUpdate服务器!');
  62. end;
  63. constructor ThxDllClient.Create;
  64. var
  65.   VerName: string;
  66. begin
  67.   FNewVersions:= TVersionList.Create('');
  68.   VerName:= ExtractFilePath(Application.ExeName) + ProjectName + '.ver';
  69.   //VerName:= StringReplace(Application.ExeName, '.exe', '.ver', [rfReplaceAll]);
  70.   FOldVersions:= TVersionList.Create(VerName);
  71.   FTotalSize:= 0;
  72.   FWorking:= True;
  73.   FClient:= nil;
  74.   FDownloadProgress:= nil;
  75.   FProjectName:= ProjectName;
  76. end;
  77. destructor ThxDllClient.Destroy;
  78. begin
  79.   FOldVersions.Free;
  80.   if Assigned(FClient) then
  81.     FClient.Free;
  82.   inherited Destroy;
  83. end;
  84. procedure ThxDllClient.DoDownloadFileList(Sender: TObject;
  85.   DownloadStatus: TDownloadStatus; const WorkCount: Integer);
  86. begin
  87.   case DownloadStatus of
  88.     dsBegin:
  89.     begin
  90.     end;
  91.     dsFileData:
  92.     begin
  93.     end;
  94.     dsEnd:
  95.     begin
  96.       FTotalSize:= 0;
  97.       RefreshNewFileList((Sender as TDownloadFileListThread).ResTree, FTotalSize);
  98.       FWorking:= False;
  99.     end;
  100.   end;
  101. end;
  102. procedure ThxDllClient.DoDownloadFiles(Sender: TObject; DownloadStatus: TDownloadStatus;
  103.   const WorkCount: Integer);
  104. var
  105.   FileName: string;
  106.   NewVersion: TVersion;
  107. begin
  108.   FileName:= (Sender as TDownloadFilesThread).DownloadFileName;
  109.   case DownloadStatus of
  110.     dsBegin, dsFileBegin, dsFileData, dsEnd:
  111.     begin
  112.       if Assigned(FDownloadProgress) then
  113.         FDownloadProgress(DownloadStatus, FileName, WorkCount);
  114.     end;
  115.     dsFileEnd:  //更新版本号
  116.     begin
  117.       NewVersion:= GetNewVersion(FileName);
  118.       FOldVersions.Update(FileName, NewVersion);
  119.       if Assigned(FDownloadProgress) then
  120.         FDownloadProgress(dsFileEnd, FileName, WorkCount);
  121.     end;
  122.   end;
  123. end;
  124. function ThxDllClient.GetActive: Boolean;
  125. begin
  126.   Result:= FClient.Active;
  127. end;
  128. function ThxDllClient.GetNewVersion(FileName: string): TVersion;
  129. var
  130.   Index: Integer;
  131. begin
  132.   Index:= FNewVersions.IndexOf(FileName);
  133.   if Index <> -1 then
  134.     Result:= FNewVersions.Items[Index]^.Version;
  135. end;
  136. function ThxDllClient.GetOldVersion(FileName: string): TVersion;
  137. var
  138.   Index: Integer;
  139. begin
  140.   Index:= FOldVersions.IndexOf(FileName);
  141.   if Index <> -1 then
  142.     Result:= FOldVersions[Index].Version
  143.   else
  144.     Result:= 'Unknown';
  145. end;
  146. procedure ThxDllClient.RefreshNewFileList(ResTree: TResTree;
  147.   var TotalSize: Integer);
  148.   procedure TravelTree(Node: TNode);
  149.   var
  150.     I: Integer;
  151.     pInfo: PResInfo;
  152.   begin
  153.     if Node = nil then Exit;
  154.     pInfo:= PResInfo(Node.Data);
  155.     if pInfo^.ResType = rtFile then
  156.     begin
  157.       if not SameVersion(pInfo^.Version, GetOldVersion(pInfo^.DownloadURL)) then
  158.       begin
  159.         FNewVersions.Update(pInfo^.DownloadURL, pInfo^.Version);
  160.         Inc(TotalSize, pInfo^.FileSize);
  161.       end;
  162.     end;
  163.     for I:= 0 to Node.Count - 1 do
  164.       TravelTree(Node.Children[I]);
  165.   end;
  166. var
  167.   I: Integer;
  168.   Node: TNode;
  169. begin
  170.   FNewVersions.Clear;
  171.   Node:= ResTree.RootNode;
  172.   for I:= 0 to Node.Count - 1 do
  173.     TravelTree(Node.Children[I]);
  174. end;
  175. procedure ThxDllClient.SetActive(const Value: Boolean);
  176. var
  177.   T: Cardinal;
  178. begin
  179.   if FProjectName = '' then
  180.     raise Exception.Create('Dll未初始化,必须先调用Init函数进行初始化!');
  181.   if not Assigned(FClient) then
  182.     FClient:= ThxUpdateClient.Create(FProjectName);
  183.   if FClient.Active <> Value then
  184.   begin
  185.     if not FClient.Active then
  186.     begin
  187.       T:= GetTickCount;
  188.       FClient.ProxyInfo:= FProxyInfo;
  189.       FClient.Open(Host, Port);
  190.       //异步转为同步
  191.       while GetTickCount - T < 60000 do
  192.       begin
  193.         if FClient.Active = True then Exit;
  194.         Application.ProcessMessages;
  195.       end;
  196.       raise Exception.CreateFmt('连接超时,错误码是%d', [GetLastError]);
  197.     end
  198.     else
  199.       FClient.Close;
  200.   end;
  201. end;
  202. procedure ThxDllClient.UpdateProduct(DownloadProgress: TDownloadProgress);
  203. var
  204.   I: Integer;
  205.   slFiles: TStrings;
  206. begin
  207.   Active:= True;
  208.   Assert(FClient.Active = True);
  209.   FDownloadProgress:= DownloadProgress;
  210.   if Assigned(FDownloadProgress) then
  211.     FDownloadProgress(dsBegin, '', FTotalSize);
  212.   slFiles:= TStringList.Create;
  213.   try
  214.     for I:= 0 to FNewVersions.Count - 1 do
  215.       slFiles.Add(FNewVersions[I].FileName);
  216.     FClient.DownloadFiles(slFiles, DoDownloadFiles);
  217.   finally
  218.     slFiles.Free;
  219.   end;
  220. end;
  221. end.