Kaynağa Gözat

添加群组交接功能

lqq 9 yıl önce
ebeveyn
işleme
d82699c78c

Dosya farkı çok büyük olduğundan ihmal edildi
+ 1 - 1
AppCom/AppCentreCom.dproj


BIN
AppCom/AppCentreCom.res


Dosya farkı çok büyük olduğundan ihmal edildi
+ 1 - 1
CA/CA.dproj


BIN
CA/CA.res


Dosya farkı çok büyük olduğundan ihmal edildi
+ 1 - 1
COM/RealICQCOMInterfaces/RealICQCOMInterfaces.dproj


BIN
COM/RealICQCOMInterfaces/RealICQCOMInterfaces.res


Dosya farkı çok büyük olduğundan ihmal edildi
+ 648 - 617
Client/Group/GroupClient.pas


+ 5 - 0
Client/Group/GroupProcess.pas

@@ -2,6 +2,8 @@ unit GroupProcess;
 

 interface
 
+  {$INCLUDE LXTalk.inc}
+
 uses
   superobject, GroupUtility, GroupClient, RealICQModel, Classes, SysUtils;
 
@@ -234,6 +236,8 @@ begin
     ATeam.TeamIntro := AData.S['group.intro'];
     ATeam.TeamCallBoard := AData.S['group.notice'];
     ATeam.TeamValidate := TRealICQTeamValidateType(AData.I['group.auth']);
+    if AData.S['group.creator'] <> '' then
+      ATeam.TeamCreater := AData.S['group.creator'];
     TGroupService.GetService.OnTeamInfoChange(ATeam);
   except
     on Ex: Exception do
@@ -246,6 +250,7 @@ begin
 //  GetMapTeamUsersProvider.Insert(AData.S['group.id'], AData.O['group'].AsJSon(), AData.I['group.ver']);
 
 
+
 end;
 
 { TGroupSearchResponse }

+ 33 - 1
Client/Group/GroupService.pas

@@ -17,6 +17,8 @@ type
     function AddMembers(AMembers: string; ANewMembers: TStrings): string;
     procedure DownFaceFileComplete(Source_file, Dest_file: string; blStatus: boolean; ErrMessage: string);
     function AddMember(AMembers, ANewMember: string): string;
+
+
   public
     procedure Init(ALoginName: string);
     procedure Uninstall;
@@ -28,6 +30,7 @@ type
     procedure QuitTeam(ATeamID: string);
     procedure DisbandTeam(ATeamID: string);
     procedure UpdateTeam(ATeamID, AIntro, ANotice, AName: string; AAuth: Integer);
+    procedure HandOverTeam(ATeamID, ALoginName: string);
     procedure CreateTeam(ATeamName, ATeamCallBoard, ATeamIntro: string; ATeamMembers: TStringList; AIsTempTeam: Boolean; ATeamValidateType: TRealICQTeamValidateType);
     procedure SearchTeam(AKey: string; ASearchType: TRealICQTeamSearchType; AMatchingType: TRealICQMatchingType; APage: Integer);
     procedure AddTeamMembers(ATeamID: string; AAddMembers: TStringList);
@@ -41,6 +44,7 @@ type
     procedure JoinTeamResponse(ATeamID, ALoginName, ATag: string; Accepted: Boolean);
     procedure SendTeamMessage(ATeamID, ASender, AMsg: string; AFont: TFont; AFaces: TStringList; Attachs: string);
     function IsTeamManager(ATeamID, ALoginName: string): Boolean;
+    function IsTeamCreater(ATeamID, ALoginName: string): Boolean;
     function GetTeam(ATeamID: string): TRealICQTeam;
     function GetTeams: TStringList;
     procedure MessageMiscMust(ATeamID: string);
@@ -215,6 +219,33 @@ begin
   FGroupClient.Connect(ALoginName);
 end;
 
+procedure TGroupService.HandOverTeam(ATeamID, ALoginName: string);
+var
+  iIndex: Integer;
+  ATempTeam: TRealICQTeam;
+begin
+  iIndex := FTeams.IndexOf(ATeamID);
+  if iIndex < 0 then
+    Exit;
+  ATempTeam := FTeams.Objects[iIndex] as TRealICQTeam;
+  FGroupClient.UpdateTeamCreator(ATeamID, ATempTeam.TeamIntro, ATempTeam.TeamCallBoard, ATempTeam.TeamCaption, Integer(ATempTeam.TeamValidate), ALoginName);
+  if not IsTeamManager(ATeamID, ALoginName) then
+    AddManager(ATeamID, ALoginName);
+end;
+
+function TGroupService.IsTeamCreater(ATeamID, ALoginName: string): Boolean;
+var
+  iIndex: Integer;
+  ATempTeam: TRealICQTeam;
+begin
+  Result := False;
+  iIndex := FTeams.IndexOf(ATeamID);
+  if iIndex < 0 then
+    Exit;
+  ATempTeam := FTeams.Objects[iIndex] as TRealICQTeam;
+  Result := AnsiSameText(ALoginName, ATempTeam.TeamCreater);
+end;
+
 function TGroupService.IsTeamManager(ATeamID, ALoginName: string): Boolean;
 var
   iIndex: Integer;
@@ -468,7 +499,8 @@ begin
     ATempTeam.TeamIntro := ATeam.TeamIntro;
     ATempTeam.TeamCallBoard := ATeam.TeamCallBoard;
     ATempTeam.TeamValidate := ATeam.TeamValidate;
-
+    if ATeam.TeamCreater <> '' then
+      ATempTeam.TeamCreater := ATeam.TeamCreater;
     MainForm.WebSocketSendReadTeamInfo(ATeam.TeamID);
   end;
 end;

+ 192 - 215
Client/Group/TeamShareAdapter.pas

@@ -1,230 +1,207 @@
 unit TeamShareAdapter;
-
-interface
-
-uses
-  GroupConfig, RealICQClient, Classes, StrUtils, SysUtils, Dialogs, RealICQModel;
-
-type  
-  TTeamShareAdapter = class
-  private
-    class procedure SendUploadedEventToServer(AJson: string; ARealICQClient: TRealICQClient);
-  public
-    class procedure UploadFile(ATeamID, AFileName: string; ATeamForm: TComponent; ARealICQClient: TRealICQClient; IsNeedNotify: Boolean); overload;
-    class function GetTheFileSize(AFileName: String): Int64;
-    class function GetShareURL(ATeamID, ALoginName, ADisplayName, AIsAdmin: string): string;
-    class procedure UploadedNotifyToMembers(ASender, AMembers, AFileMd5, AFileName: string; AFileSize: Integer; ARealICQClient: TRealICQClient);
-  end;
-
-implementation
-
-uses
-  MainFrm, Windows, TalkingFrm, HTTPApp, RealICQUtils, LoggerImport, superobject,
-  md5, UploadOrDownloadFileMission, TransmitDirection, Forms;
-
-const
-  DOWN_URL: string = 'http://%s:%d/home/down/%s?%s';
-  UP_URL: string = 'http://%s:%d/Home/Create?use=%s&groupid=%s&displayname=%s';
-  SHARE_URL: string = 'http://%s:%d/home/index?loginname=%s&teamid=%s&displayname=%s&isAdmin=%s';
-  OLD_SHARE_URL: string = '%s/share/Default.aspx?TeamID=%s&LoginName=%s&password=%s&tick=%s';// + IntToStr(GetTickCount)
+
+interface
+
+uses
+  GroupConfig, RealICQClient, Classes, StrUtils, SysUtils, Dialogs, RealICQModel;
+
+type
+  TTeamShareAdapter = class
+  private
+    class procedure SendUploadedEventToServer(AJson: string; ARealICQClient: TRealICQClient);
+  public
+    class procedure UploadFile(ATeamID, AFileName: string; ATeamForm: TComponent; ARealICQClient: TRealICQClient; IsNeedNotify: Boolean); overload;
+    class function GetTheFileSize(AFileName: string): Int64;
+    class function GetShareURL(ATeamID, ALoginName, ADisplayName, AIsAdmin: string): string;
+    class procedure UploadedNotifyToMembers(ASender, AMembers, AFileMd5, AFileName: string; AFileSize: Integer; ARealICQClient: TRealICQClient);
+  end;
+
+implementation
+
+uses
+  MainFrm, Windows, TalkingFrm, HTTPApp, RealICQUtils, LoggerImport, superobject,
+  md5, UploadOrDownloadFileMission, TransmitDirection, Forms;
+
+const
+  DOWN_URL: string = 'http://%s:%d/home/down/%s?%s';
+  UP_URL: string = 'http://%s:%d/Home/Create?use=%s&groupid=%s&displayname=%s';
+  SHARE_URL: string = 'http://%s:%d/home/index?loginname=%s&teamid=%s&displayname=%s&isAdmin=%s';
+  OLD_SHARE_URL: string = '%s/share/Default.aspx?TeamID=%s&LoginName=%s&password=%s&tick=%s'; // + IntToStr(GetTickCount)
+
   NOTIFY_JSON: string = '{sender:"", receivers:[], sendtime:"", url:"", fileSize:""}';
 { TTeamShareAdapter }
-class function TTeamShareAdapter.GetShareURL(ATeamID, ALoginName, ADisplayName,
-  AIsAdmin: string): string;
-var
-  AConfig: TGroupShareConfig;
-begin
-  AConfig := TGroupShareConfig.GetConfig;
-  if AConfig.GroupShareVersion = gsvNew then
-    Result := Format(SHARE_URL, [AConfig.IP, AConfig.Port, ALoginName, ATeamID, HttpEncode(AnsiToUtf8(ADisplayName)), AIsAdmin])
-  else if AConfig.GroupShareVersion = gsvOld then
-    Result := Format(OLD_SHARE_URL, [AConfig.URL, ATeamID, ALoginName, MD5En(MainForm.RealICQClient.Password), IntToStr(GetTickCount)]);
-end;
-
-class function TTeamShareAdapter.GetTheFileSize(AFileName: String): Int64;
-var
-	FileHandle: THandle;
-	MapHandle: THandle;                                              
-	ViewPointer: pointer;
-begin
-  Result := 0;
-  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);
-  if FileHandle <> INVALID_HANDLE_VALUE then try
-    MapHandle := CreateFileMapping(FileHandle, nil, PAGE_READONLY, 0, 0, nil);
-    if MapHandle <> 0 then try
-      ViewPointer := MapViewOfFile(MapHandle, FILE_MAP_READ, 0, 0, 0);
-      if ViewPointer <> nil then try
-        Result := GetFileSize(FileHandle, nil);
-      finally
-        UnmapViewOfFile(ViewPointer);
-      end;
-    finally
-      CloseHandle(MapHandle);
-    end;
-  finally
-    CloseHandle(FileHandle);
-  end;
-end;
-
-class procedure TTeamShareAdapter.SendUploadedEventToServer(AJson: string;
-  ARealICQClient: TRealICQClient);
-var
-  nIndex,AJsonLength,IIDLength,
-  BufferLength: SmallInt;
-  SendBuffer: Array of Byte;
-begin
-  try
-    AJsonLength := Length(AJson);
-    BufferLength := 5 + Length(AJson);
-    SetLength(SendBuffer, BufferLength);
-    nIndex := 0;
+
+
+class function TTeamShareAdapter.GetShareURL(ATeamID, ALoginName, ADisplayName, AIsAdmin: string): string;
+var
+  AConfig: TGroupShareConfig;
+begin
+  AConfig := TGroupShareConfig.GetConfig;
+  if AConfig.GroupShareVersion = gsvNew then
+    Result := Format(SHARE_URL, [AConfig.IP, AConfig.Port, ALoginName, ATeamID, HttpEncode(AnsiToUtf8(ADisplayName)), AIsAdmin])
+  else if AConfig.GroupShareVersion = gsvOld then
+    Result := Format(OLD_SHARE_URL, [AConfig.URL, ATeamID, ALoginName, MD5En(MainForm.RealICQClient.Password), IntToStr(GetTickCount)]);
+end;
+
+class function TTeamShareAdapter.GetTheFileSize(AFileName: string): Int64;
+var
+  FileHandle: THandle;
+  MapHandle: THandle;
+  ViewPointer: pointer;
+begin
+  Result := 0;
+  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);
+  if FileHandle <> INVALID_HANDLE_VALUE then
+  try
+    MapHandle := CreateFileMapping(FileHandle, nil, PAGE_READONLY, 0, 0, nil);
+    if MapHandle <> 0 then
+    try
+      ViewPointer := MapViewOfFile(MapHandle, FILE_MAP_READ, 0, 0, 0);
+      if ViewPointer <> nil then
+      try
+        Result := GetFileSize(FileHandle, nil);
+      finally
+        UnmapViewOfFile(ViewPointer);
+      end;
+    finally
+      CloseHandle(MapHandle);
+    end;
+  finally
+    CloseHandle(FileHandle);
+  end;
+end;
+
+class procedure TTeamShareAdapter.SendUploadedEventToServer(AJson: string; ARealICQClient: TRealICQClient);
+var
+  nIndex, AJsonLength, IIDLength, BufferLength: SmallInt;
+  SendBuffer: array of Byte;
+begin
+  AJsonLength := Length(AJson);
+  BufferLength := 5 + Length(AJson);
+  SetLength(SendBuffer, BufferLength);
+  nIndex := 0;
 
      //填充 (1)协议类型(0xD3)            1byte
-    SendBuffer[nIndex] := $D3;
-    Inc(nIndex, 1);
+  SendBuffer[nIndex] := $D3;
+  Inc(nIndex, 1);
 
     //填充 (2)消息总长度                  2byte
-    CopyMemory(@SendBuffer[nIndex], @BufferLength, 2);
-    Inc(nIndex, 2);
+  CopyMemory(@SendBuffer[nIndex], @BufferLength, 2);
+  Inc(nIndex, 2);
     
     //填充 (2)JSON总长度                  2byte
-    CopyMemory(@SendBuffer[nIndex], @AJsonLength, 2);
-    Inc(nIndex, 2);
+  CopyMemory(@SendBuffer[nIndex], @AJsonLength, 2);
+  Inc(nIndex, 2);
 
     //填充(4)JSON                    动态长度
-    CopyMemory(@SendBuffer[nIndex], PChar(AJson), AJsonLength);
-
-    ARealICQClient.TCPClient.SendBuffer(SendBuffer[0], BufferLength);
-  except
-    on E: Exception do
-      Log(E.Message, 'TTeamShareAdapter.SendUploadedEventToServer('+AJson+')');
-  end;
+  CopyMemory(@SendBuffer[nIndex], PChar(AJson), AJsonLength);
+
+  ARealICQClient.TCPClient.SendBuffer(SendBuffer[0], BufferLength);   
 end;
 
 //sender:"%s", receivers:"[%s]", sendtime:"%f", url:"%s", fileSize
-class procedure TTeamShareAdapter.UploadedNotifyToMembers(ASender, AMembers,
-  AFileMd5, AFileName: string; AFileSize: Integer; ARealICQClient: TRealICQClient);
-var
-  AJson,ADownUrl: string;
-  AReceivers: TStringList;
-  AConfig: TGroupShareConfig;
-  iLoop, iMax: Integer;
-
-  jo :ISuperObject;
-begin
-  AConfig := TGroupShareConfig.GetConfig;
-  if AConfig.GroupShareVersion <> gsvNew then
-    Exit;
-  AReceivers := SplitString(AMembers, Chr(10));
-  ADownUrl := Format(DOWN_URL,
-    [
-      AConfig.IP,
-      AConfig.Port,
-      AFileMd5,
-      AFileName
-    ]);
-  jo := SO(NOTIFY_JSON);
-  jo.S['sender'] := ASender;
-  jo.D['sendtime'] := Now;
-  jo.S['url'] := ADownUrl;
-  jo.I['fileSize'] := AFileSize;
-  iMax := 10;
-
-  for iLoop := 0 to AReceivers.Count - 1 do
-  begin
-    if iLoop >= iMax then
-    begin
-      AJson := jo.AsJSon(False,False);
-      SendUploadedEventToServer(AJson, ARealICQClient);
-      Jo.A['receivers'].Clear;
-      Inc(iMax, 10);
-    end;
-    jo.A['receivers'].Add(TSuperObject.Create(AReceivers[iLoop]))
-  end;
-  if jo.A['receivers'].Length > 0 then
-  begin
-    AJson := jo.AsJSon(False,False);
-    SendUploadedEventToServer(AJson, ARealICQClient);
-  end;
-  AReceivers.Free;
-end;
-
-class procedure TTeamShareAdapter.UploadFile(ATeamID, AFileName: string;
-  ATeamForm: TComponent; ARealICQClient: TRealICQClient; IsNeedNotify: Boolean);
-var
-  AConfig: TGroupShareConfig;
-  AUpUrl: String;
-  AFileSize:int64;
-  strMissionID,
-  js: string;
-begin
-  AConfig := TGroupShareConfig.GetConfig;
-  if (not ARealICQClient.Connected) or ( not ARealICQClient.Logined) then
-    Exit;
-
-  if IsNeedNotify and not (MessageBox(0, '您确认要群发该文件吗?', '提示', MB_OKCANCEL + MB_ICONQUESTION) = ID_OK) then
-    Exit;
-
-
-  if DirectoryExists(AFileName) then
-  begin
-     MessageBox(0, PChar('您上传的是目录,请压缩后上传!'), '提示', MB_ICONINFORMATION);
-     Exit;
-  end;
-  if FileExists(AFileName) then
-  begin
-    TTalkingForm(ATeamForm).spbTeamNetWorkDisk.OnClick(Nil);
-    AFileSize := GetTheFileSize(AFileName);
-    if AFileSize=0 then
-    begin
-      MessageBox(0, PChar('发送文件大小不允许超过 ' + IntToStr(20) + 'M !'), '提示', MB_ICONINFORMATION);
-      Exit;
-    end;
-    if AFileSize >200 * 1024 * 1024 then
-    begin
-      MessageBox(0, PChar('发送文件大小不允许超过 ' + IntToStr(20) + 'M !'), '提示', MB_ICONINFORMATION);
-      Exit;
-    end;
-  end
-  else
-  begin
-    MessageBox(0, PChar('发送文件不存在!'), '提示', MB_ICONINFORMATION);
-    Exit;
-  end;
-
-  if AConfig.GroupShareVersion = gsvNew then
-  begin
-    try
-      AUpUrl := Format(UP_URL,
-        [
-        AConfig.IP,
-        AConfig.Port,
-        ARealICQClient.LoginName,
-        ATeamID,
-        HttpEncode(AnsiToUtf8(ARealICQClient.Me.DisplayName))]);
-      TTalkingForm(ATeamForm).spbUploadTeamFileProcess.Visible := True;
-      TTalkingForm(ATeamForm).TeamUpLoadFile.ThreadDownFile(AUpUrl,AFileName, AFileSize, IsNeedNotify);
-    except
-      on E: Exception do
-        MessageBox(0, PChar(E.Message), '发送文件时出错', MB_ICONINFORMATION);
-    end;
-  end
-  else if AConfig.GroupShareVersion = gsvOld then
-  begin
-    try
-      strMissionID := '1|' + IntToStr(GetTickCount) + ',' + ATeamID + ',' + MainForm.RealICQClient.LoginName;
-      js := format('ReadyToUpload("%s", "%s", %d)', [strMissionID, ReplaceStr(AFileName, '\', '\\'), GetTheFileSize(AFileName)]);
-      (ATeamForm as TTalkingForm)
-        .WebBrowserForTeamDisk
-        .OleObject
-        .Document
-        .parentWindow
-        .execScript(js, 'JavaScript');
-    except
-      on E: Exception do MessageBox(0, PChar(E.Message), '上传文件时出错', MB_ICONINFORMATION);
-    end;
-  end;
-end;
+class procedure TTeamShareAdapter.UploadedNotifyToMembers(ASender, AMembers, AFileMd5, AFileName: string; AFileSize: Integer; ARealICQClient: TRealICQClient);
+var
+  AJson, ADownUrl: string;
+  AReceivers: TStringList;
+  AConfig: TGroupShareConfig;
+  iLoop, iMax: Integer;
+  jo: ISuperObject;
+begin
+  AConfig := TGroupShareConfig.GetConfig;
+  if AConfig.GroupShareVersion <> gsvNew then
+    Exit;
+  AReceivers := SplitString(AMembers, Chr(10));
+  ADownUrl := Format(DOWN_URL, [AConfig.IP, AConfig.Port, AFileMd5, AFileName]);
+  jo := SO(NOTIFY_JSON);
+  jo.S['sender'] := ASender;
+  jo.D['sendtime'] := Now;
+  jo.S['url'] := ADownUrl;
+  jo.I['fileSize'] := AFileSize;
+  iMax := 10;
+
+  for iLoop := 0 to AReceivers.Count - 1 do
+  begin
+    if iLoop >= iMax then
+    begin
+      AJson := jo.AsJSon(False, False);
+      SendUploadedEventToServer(AJson, ARealICQClient);
+      Jo.A['receivers'].Clear;
+      Inc(iMax, 10);
+    end;
+    jo.A['receivers'].Add(TSuperObject.Create(AReceivers[iLoop]))
+  end;
+  if jo.A['receivers'].Length > 0 then
+  begin
+    AJson := jo.AsJSon(False, False);
+    SendUploadedEventToServer(AJson, ARealICQClient);
+  end;
+  AReceivers.Free;
+end;
+
+class procedure TTeamShareAdapter.UploadFile(ATeamID, AFileName: string; ATeamForm: TComponent; ARealICQClient: TRealICQClient; IsNeedNotify: Boolean);
+var
+  AConfig: TGroupShareConfig;
+  AUpUrl: string;
+  AFileSize: int64;
+  strMissionID, js: string;
+begin
+  AConfig := TGroupShareConfig.GetConfig;
+  if (not ARealICQClient.Connected) or (not ARealICQClient.Logined) then
+    Exit;
+
+  if IsNeedNotify and not (MessageBox(0, '您确认要群发该文件吗?', '提示', MB_OKCANCEL + MB_ICONQUESTION) = ID_OK) then
+    Exit;
+
+  if DirectoryExists(AFileName) then
+  begin
+    MessageBox(0, PChar('您上传的是目录,请压缩后上传!'), '提示', MB_ICONINFORMATION);
+    Exit;
+  end;
+  if FileExists(AFileName) then
+  begin
+    TTalkingForm(ATeamForm).spbTeamNetWorkDisk.OnClick(Nil);
+    AFileSize := GetTheFileSize(AFileName);
+    if AFileSize = 0 then
+    begin
+      MessageBox(0, PChar('发送文件大小不允许超过 ' + IntToStr(20) + 'M !'), '提示', MB_ICONINFORMATION);
+      Exit;
+    end;
+    if AFileSize > 200 * 1024 * 1024 then
+    begin
+      MessageBox(0, PChar('发送文件大小不允许超过 ' + IntToStr(20) + 'M !'), '提示', MB_ICONINFORMATION);
+      Exit;
+    end;
+  end
+  else
+  begin
+    MessageBox(0, PChar('发送文件不存在!'), '提示', MB_ICONINFORMATION);
+    Exit;
+  end;
+
+  if AConfig.GroupShareVersion = gsvNew then
+  begin
+    try
+      AUpUrl := Format(UP_URL, [AConfig.IP, AConfig.Port, ARealICQClient.LoginName, ATeamID, HttpEncode(AnsiToUtf8(ARealICQClient.Me.DisplayName))]);
+      TTalkingForm(ATeamForm).spbUploadTeamFileProcess.Visible := True;
+      TTalkingForm(ATeamForm).TeamUpLoadFile.ThreadDownFile(AUpUrl, AFileName, AFileSize, IsNeedNotify);
+    except
+      on E: Exception do
+        MessageBox(0, PChar(E.Message), '发送文件时出错', MB_ICONINFORMATION);
+    end;
+  end
+  else if AConfig.GroupShareVersion = gsvOld then
+  begin
+    try
+      strMissionID := '1|' + IntToStr(GetTickCount) + ',' + ATeamID + ',' + MainForm.RealICQClient.LoginName;
+      js := format('ReadyToUpload("%s", "%s", %d)', [strMissionID, ReplaceStr(AFileName, '\', '\\'), GetTheFileSize(AFileName)]);
+      (ATeamForm as TTalkingForm).WebBrowserForTeamDisk.OleObject.Document.parentWindow.execScript(js, 'JavaScript');
+    except
+      on E: Exception do
+        MessageBox(0, PChar(E.Message), '上传文件时出错', MB_ICONINFORMATION);
+    end;
+  end;
+end;
+
+end.
 
-end.

+ 20 - 0
Client/Group/TeamsAdapter.pas

@@ -11,18 +11,21 @@ type
   private
     class procedure NewUpdateTeamMembers(ATeamID: String; AOldMembers, ANewMembers: TStringList);
     class procedure OldUpdateTeamMembers(ATeamID: String; AOldMembers, ANewMembers: TStringList);
+
   public
     class procedure Start(ACurrentLoginName: string);
     class procedure Stop;
     class procedure UpdateTeamMembers(ATeamID: String; AOldMembers, ANewMembers: TStringList);
     class procedure AddTeamMembers(ATeamID: String; AAddMembers: TStringList);
     class procedure UpdateTeamInfo(ATeamID, AIntro, ANotice, AName: string; AAuth: Integer);
+    class procedure HandOverTeam(ATeamID, ALoginName: string); static;
     class procedure SendTeamMessage(ATeamID, ASender, AMsg: string; AFont: TFont; AFaces: TStringList; Attachs: String);
     class function RemoveManager(ATeamID, ALoginName: string): Boolean;
     class function AddManager(ATeamID, ALoginName: string): Boolean;
     class procedure Subscribe;
     class procedure UnSubscribe;
     class function  IsTeamManager(ATeamID, ALoginName: string): Boolean;
+    class function  IsTeamCreater(ATeamID, ALoginName: string): Boolean;
     class procedure SearchTeam(AKey: string; ASearchType: TRealICQTeamSearchType; AMatchingType: TRealICQMatchingType; APage: Integer);
     class procedure QuitTeam(ATeamID: String);
     class procedure DisbandTeam(ATeamID: String);
@@ -96,6 +99,23 @@ begin
     MainForm.RealICQClient.ModifyTeamMembers(ATeamID, AAddMembers);
 end;
 
+class function TTeamsAdapter.IsTeamCreater(ATeamID, ALoginName: string): Boolean;
+begin
+  Result := False;
+  if TGroupConfig.GetConfig.GroupVersion = gvIndependent then
+  begin
+    Result := TGroupService.GetService.IsTeamCreater(ATeamID, ALoginName);
+  end;
+end;
+
+class procedure TTeamsAdapter.HandOverTeam(ATeamID, ALoginName: string); 
+begin
+  if TGroupConfig.GetConfig.GroupVersion = gvIndependent then
+    TGroupService.GetService.HandOverTeam(ATeamID, ALoginName)
+  else
+    ShowMessage('集成版群组不支持该功能');
+end;
+
 class function TTeamsAdapter.IsTeamManager(ATeamID, ALoginName: string): Boolean;
 var
   iIndex: Integer;

Dosya farkı çok büyük olduğundan ihmal edildi
+ 1 - 1
Client/Lxtalk.dproj


BIN
Client/Lxtalk.res


+ 2 - 1
Client/TalkingFrm.dfm

@@ -3258,6 +3258,7 @@ object TalkingForm: TTalkingForm
               OnSelectionChange = RichEdInputerSelectionChange
               OnDropFiles = RichEdInputerDropFiles
               OnInsertObject = RichEdInputerInsertObject
+              ExplicitLeft = -4
             end
           end
         end
@@ -9071,7 +9072,7 @@ object TalkingForm: TTalkingForm
     Left = 48
     Top = 312
     Bitmap = {
-      494C010104000900FC0110001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+      494C010104000900000210001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
       0000000000003600000028000000400000002000000001002000000000000020
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000

Dosya farkı çok büyük olduğundan ihmal edildi
+ 2780 - 2469
Client/TeamOptionsFrm.dfm


Dosya farkı çok büyük olduğundan ihmal edildi
+ 775 - 789
Client/TeamOptionsFrm.pas


Dosya farkı çok büyük olduğundan ihmal edildi
+ 1 - 1
Controls/RealICQComponents.dproj


BIN
Controls/RealICQComponents.res


Dosya farkı çok büyük olduğundan ihmal edildi
+ 76 - 76
Includes/FlatStyle/FlatStyle.dproj


BIN
Includes/FlatStyle/FlatStyle.res


Dosya farkı çok büyük olduğundan ihmal edildi
+ 1 - 1
Log/Logger.dproj


BIN
Log/Logger.res


+ 1 - 1
ZWT/XML/DefaultConfig.xml

@@ -4,7 +4,7 @@
 	<UIMainColor Value="15392442"/>
 	<MainFormLeft Value="1881"/>
 	<MainFormTop Value="199"/>
-	<MainFormWidth Value="-300"/>
+	<MainFormWidth Value="258"/>
 	<MainFormHeight Value="734"/>
 	<TalkingFormLeft Value="695"/>
 	<TalkingFormTop Value="128"/>