TeamShareAdapter.pas 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. unit TeamShareAdapter;
  2. interface
  3. uses
  4. GroupConfig, RealICQClient, Classes, StrUtils, SysUtils, Dialogs, RealICQModel;
  5. type
  6. TTeamShareAdapter = class
  7. private
  8. class procedure SendUploadedEventToServer(AJson: string; ARealICQClient: TRealICQClient);
  9. public
  10. class procedure UploadFile(ATeamID, AFileName: string; ATeamForm: TComponent; ARealICQClient: TRealICQClient; IsNeedNotify: Boolean); overload;
  11. class function GetTheFileSize(AFileName: string): Int64;
  12. class function GetShareURL(ATeamID, ALoginName, ADisplayName, AIsAdmin: string): string;
  13. class procedure UploadedNotifyToMembers(ASender, AMembers, AFileMd5, AFileName: string; AFileSize: Integer; ARealICQClient: TRealICQClient);
  14. end;
  15. implementation
  16. uses
  17. MainFrm, Windows, TalkingFrm, HTTPApp, RealICQUtils, LoggerImport, superobject,
  18. md5, UploadOrDownloadFileMission, TransmitDirection, Forms;
  19. const
  20. DOWN_URL: string = 'http://%s:%d/home/down/%s?%s';
  21. UP_URL: string = 'http://%s:%d/Home/Create?use=%s&groupid=%s&displayname=%s';
  22. SHARE_URL: string = 'http://%s:%d/home/index?loginname=%s&teamid=%s&displayname=%s&isAdmin=%s';
  23. OLD_SHARE_URL: string = '%s/share/Default.aspx?TeamID=%s&LoginName=%s&password=%s&tick=%s'; // + IntToStr(GetTickCount)
  24. NOTIFY_JSON: string = '{sender:"", receivers:[], sendtime:"", url:"", fileSize:""}';
  25. { TTeamShareAdapter }
  26. class function TTeamShareAdapter.GetShareURL(ATeamID, ALoginName, ADisplayName, AIsAdmin: string): string;
  27. var
  28. AConfig: TGroupShareConfig;
  29. begin
  30. AConfig := TGroupShareConfig.GetConfig;
  31. if AConfig.GroupShareVersion = gsvNew then
  32. Result := Format(SHARE_URL, [AConfig.IP, AConfig.Port, ALoginName, ATeamID, HttpEncode(AnsiToUtf8(ADisplayName)), AIsAdmin])
  33. else if AConfig.GroupShareVersion = gsvOld then
  34. Result := Format(OLD_SHARE_URL, [AConfig.URL, ATeamID, ALoginName, MD5En(MainForm.RealICQClient.Password), IntToStr(GetTickCount)]);
  35. end;
  36. class function TTeamShareAdapter.GetTheFileSize(AFileName: string): Int64;
  37. var
  38. FileHandle: THandle;
  39. MapHandle: THandle;
  40. ViewPointer: pointer;
  41. begin
  42. Result := 0;
  43. FileHandle := CreateFile(pChar(AFileName), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN, 0);
  44. if FileHandle <> INVALID_HANDLE_VALUE then
  45. try
  46. MapHandle := CreateFileMapping(FileHandle, nil, PAGE_READONLY, 0, 0, nil);
  47. if MapHandle <> 0 then
  48. try
  49. ViewPointer := MapViewOfFile(MapHandle, FILE_MAP_READ, 0, 0, 0);
  50. if ViewPointer <> nil then
  51. try
  52. Result := GetFileSize(FileHandle, nil);
  53. finally
  54. UnmapViewOfFile(ViewPointer);
  55. end;
  56. finally
  57. CloseHandle(MapHandle);
  58. end;
  59. finally
  60. CloseHandle(FileHandle);
  61. end;
  62. end;
  63. class procedure TTeamShareAdapter.SendUploadedEventToServer(AJson: string; ARealICQClient: TRealICQClient);
  64. var
  65. nIndex, AJsonLength, IIDLength, BufferLength: SmallInt;
  66. SendBuffer: array of Byte;
  67. begin
  68. AJsonLength := Length(AJson);
  69. BufferLength := 5 + Length(AJson);
  70. SetLength(SendBuffer, BufferLength);
  71. nIndex := 0;
  72. //填充 (1)协议类型(0xD3) 1byte
  73. SendBuffer[nIndex] := $D3;
  74. Inc(nIndex, 1);
  75. //填充 (2)消息总长度 2byte
  76. CopyMemory(@SendBuffer[nIndex], @BufferLength, 2);
  77. Inc(nIndex, 2);
  78. //填充 (2)JSON总长度 2byte
  79. CopyMemory(@SendBuffer[nIndex], @AJsonLength, 2);
  80. Inc(nIndex, 2);
  81. //填充(4)JSON 动态长度
  82. CopyMemory(@SendBuffer[nIndex], PChar(AJson), AJsonLength);
  83. ARealICQClient.TCPClient.SendBuffer(SendBuffer[0], BufferLength);
  84. end;
  85. //sender:"%s", receivers:"[%s]", sendtime:"%f", url:"%s", fileSize
  86. class procedure TTeamShareAdapter.UploadedNotifyToMembers(ASender, AMembers, AFileMd5, AFileName: string; AFileSize: Integer; ARealICQClient: TRealICQClient);
  87. var
  88. AJson, ADownUrl: string;
  89. AReceivers: TStringList;
  90. AConfig: TGroupShareConfig;
  91. iLoop, iMax: Integer;
  92. jo: ISuperObject;
  93. begin
  94. AConfig := TGroupShareConfig.GetConfig;
  95. if AConfig.GroupShareVersion <> gsvNew then
  96. Exit;
  97. AReceivers := SplitString(AMembers, Chr(10));
  98. ADownUrl := Format(DOWN_URL, [AConfig.IP, AConfig.Port, AFileMd5, AFileName]);
  99. jo := SO(NOTIFY_JSON);
  100. jo.S['sender'] := ASender;
  101. jo.D['sendtime'] := Now;
  102. jo.S['url'] := ADownUrl;
  103. jo.I['fileSize'] := AFileSize;
  104. iMax := 10;
  105. for iLoop := 0 to AReceivers.Count - 1 do
  106. begin
  107. if iLoop >= iMax then
  108. begin
  109. AJson := jo.AsJSon(False, False);
  110. SendUploadedEventToServer(AJson, ARealICQClient);
  111. Jo.A['receivers'].Clear;
  112. Inc(iMax, 10);
  113. end;
  114. jo.A['receivers'].Add(TSuperObject.Create(AReceivers[iLoop]))
  115. end;
  116. if jo.A['receivers'].Length > 0 then
  117. begin
  118. AJson := jo.AsJSon(False, False);
  119. SendUploadedEventToServer(AJson, ARealICQClient);
  120. end;
  121. AReceivers.Free;
  122. end;
  123. class procedure TTeamShareAdapter.UploadFile(ATeamID, AFileName: string; ATeamForm: TComponent; ARealICQClient: TRealICQClient; IsNeedNotify: Boolean);
  124. var
  125. AConfig: TGroupShareConfig;
  126. AUpUrl: string;
  127. AFileSize: int64;
  128. strMissionID, js: string;
  129. begin
  130. AConfig := TGroupShareConfig.GetConfig;
  131. if (not ARealICQClient.Connected) or (not ARealICQClient.Logined) then
  132. Exit;
  133. if IsNeedNotify and not (MessageBox(0, '确认要群发文件吗?', '提示', MB_OKCANCEL + MB_ICONQUESTION) = ID_OK) then
  134. Exit;
  135. if DirectoryExists(AFileName) then
  136. begin
  137. MessageBox(0, PChar('您上传的是目录,请压缩后上传!'), '提示', MB_ICONINFORMATION);
  138. Exit;
  139. end;
  140. if FileExists(AFileName) then
  141. begin
  142. TTalkingForm(ATeamForm).spbTeamNetWorkDisk.OnClick(Nil);
  143. AFileSize := GetTheFileSize(AFileName);
  144. if AFileSize > 100 * 1024 * 1024 then
  145. begin
  146. MessageBox(0, PChar('文件(' + AFileName + ')大小超过:' + IntToStr(100) + 'M !'), '提示', MB_ICONINFORMATION);
  147. Exit;
  148. end;
  149. end
  150. else
  151. begin
  152. MessageBox(0, PChar('文件不存在! '), '提示', MB_ICONINFORMATION);
  153. Exit;
  154. end;
  155. if AConfig.GroupShareVersion = gsvNew then
  156. begin
  157. try
  158. AUpUrl := Format(UP_URL, [AConfig.IP, AConfig.Port, ARealICQClient.LoginName, ATeamID, HttpEncode(AnsiToUtf8(ARealICQClient.Me.DisplayName))]);
  159. TTalkingForm(ATeamForm).spbUploadTeamFileProcess.Visible := True;
  160. TTalkingForm(ATeamForm).TeamUpLoadFile.ThreadDownFile(AUpUrl, AFileName, AFileSize, IsNeedNotify);
  161. except
  162. on E: Exception do
  163. MessageBox(0, PChar(E.Message), '发送文件时出错', MB_ICONINFORMATION);
  164. end;
  165. end
  166. else if AConfig.GroupShareVersion = gsvOld then
  167. begin
  168. try
  169. strMissionID := '1|' + IntToStr(GetTickCount) + ',' + ATeamID + ',' + MainForm.RealICQClient.LoginName;
  170. js := format('ReadyToUpload("%s", "%s", %d)', [strMissionID, ReplaceStr(AFileName, '\', '\\'), GetTheFileSize(AFileName)]);
  171. (ATeamForm as TTalkingForm).WebBrowserForTeamDisk.OleObject.Document.parentWindow.execScript(js, 'JavaScript');
  172. except
  173. on E: Exception do
  174. MessageBox(0, PChar(E.Message), '上传文件时出错', MB_ICONINFORMATION);
  175. end;
  176. end;
  177. end;
  178. end.