⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 umsnmsgr.pas

📁 msn控件 可验证 可接受信息 可发送信息 msn8协议 win32
💻 PAS
📖 第 1 页 / 共 5 页
字号:
         if Member.MsnObj <> MsnObj then
            Member.MsnObj := MsnObj;
      end;
      
      // 搊榐柤傪峏怴
      if (Member.Status <> usFLN) and (Member.Name <> OldName) then
         RenameMember(Member.Account, Member.Name);
    end;
  end;
  
  // 儊儞僶忬懺曄峏僀儀儞僩
  if Member <> nil then
    DoMemberStatusChange(Member, OldStatus, InitList);
end;

// 儊儞僶偲僌儖乕僾偺悢傪庢摼
procedure TMsnConnection.ProcessSynCommand(ParamLst: TStringList);
var
   MsgID: Integer;
begin
   MsgID := StrToIntDef(SS(ParamLst, 1), -1);
   If MsgID = 4 then
   begin
      FMembersCount := StrToInt(ParamLst[3]);
      FGroupsCount  := StrToInt(ParamLst[4]);
      FLstCount := 0;
      FLsgCount := 0;
   end;
end;

// 桭払儕僗僩傪夝愅偟偰嶌惉
procedure TMsnConnection.ProcessMemberList(ParamLst: TStringList);
var
   I: Integer;
   nLk: Integer;
   Idx: Integer;
   List: TMsnMemberList;
   ListKind: TListKind;
   Member: TMsnMember;
begin
   if (ParamLst[0] = 'LST') then
   begin
      Inc(FLstCount);
      nLk := StrToIntDef(SS(ParamLst,3),0);
      for I := 0 to 3 do
      begin
         if (nLK and (1 shl I)) <> 0 then
         begin
            case I of
               0: begin ListKind := lkFL; List := FMembers;        end;
               1: begin ListKind := lkAL; List := FAllowMembers;   end;
               2: begin ListKind := lkBL; List := FBlockMembers;   end;
               3: begin ListKind := lkRL; List := FReverseMembers; end;
            else
            begin ListKind := lkFL; List := FMembers; end;
            end;
            
            Member := List.Add;
            Member.Status := usFLN;
            Member.Account := ParamLst[1];
            Member.Name := DecodeParam(ParamLst[2]);
            
            if ListKind = lkFL then
               Member.Groups.Add(StrToIntDef(SS(ParamLst,4),0));
            if Member.Groups.Count = 0 then
               Member.Groups.Add(0);
            // 儊儞僶弶婜壔僀儀儞僩
            DoMemberInit(ListKind, Member);
         end;
      end;
      
      if (FSignInStage <> ssSignIn) and (FMembersCount = FLstCount) then
      begin
         FMembers.Updated        := True;
         FAllowMembers.Updated   := True;
         FBlockMembers.Updated   := True;
         FReverseMembers.Updated := True;
         DoMemberListUpdated(lkFL); // 堷悢偼柍娭學乧偩偲巚傢傟
         
         // 僒僀儞僀儞廔椆張棟
         FinishSignInProcess;
      end;
   end
   else
   begin
      if ParamLst[2] = 'FL' then
      begin
         ListKind := lkFL;
         List := FMembers;
      end
      else if ParamLst[2] = 'RL' then
      begin
         ListKind := lkRL;
         List := FReverseMembers;
      end
      else if ParamLst[2] = 'AL' then
      begin
         ListKind := lkAL;
         List := FAllowMembers;
      end
      else if ParamLst[2] = 'BL' then
      begin
         ListKind := lkBL;
         List := FBlockMembers;
      end else
         Exit;
  
      // 儕僗僩偵捛壛
      if (ParamLst[0] = 'ADD') then
      begin
         Member := List.Find(ParamLst[4]);
         if Member = nil then    // 怴婯偵儊儞僶傪捛壛
         begin
            Member := List.Add;
            with Member do
            begin
               Status := usFLN;
               Account := ParamLst[4];
               Name := DecodeParam(ParamLst[5]);
               if SS(ParamLst, 6) <> '' then
                  Member.Groups.Add(StrToIntDef(SS(ParamLst, 6), 0));
               if Member.Groups.Count = 0 then
                  Member.Groups.Add(0);
               // 儊儞僶捛壛僀儀儞僩
               DoMemberAddition(ListKind, Member);
            end;
         end else                // 婛懚偺儊儞僶傪僌儖乕僾偵捛壛
         begin
            if SS(ParamLst, 6) <> '' then
               Member.Groups.Add(StrToIntDef(SS(ParamLst, 6), 0));
            DoMemberGroupChange(Member);
         end;
      end
      // 儕僗僩偐傜嶍彍
      else if (ParamLst[0] = 'REM') then
      begin
         Idx := List.IndexOf(ParamLst[4]);
         if Idx <> -1 then
         begin
            if SS(ParamLst, 5) = '' then    // 儊儞僶傪嶍彍
            begin
               // 儊儞僶嶍彍僀儀儞僩
               DoMemberDeletion(ListKind, List[Idx]);
               List.Delete(Idx);
            end else                        // 摿掕偺僌儖乕僾偐傜嶍彍
            begin
               List[Idx].Groups.Remove(StrToIntDef(ParamLst[5], -1));
               if List[Idx].Groups.Count = 0 then
               begin
                  // 儊儞僶嶍彍僀儀儞僩
                  DoMemberDeletion(ListKind, List[Idx]);
                  List.Delete(Idx);
               end else
                  DoMemberGroupChange(List[Idx]);
            end;
         end;
      end;
   end;
end;

// 僌儖乕僾儕僗僩傪嶌惉
procedure TMsnConnection.ProcessGroupList(ParamLst: TStringList);
var
   I: Integer;
   Group: TMsnGroup;
begin
   if ParamLst[0] = 'LSG' then
   begin
      Group := FGroups.Add;
      with Group do
      begin
         Id := StrToIntDef(ParamLst[1], 0);
         Name := DecodeParam(ParamLst[2]);
      end;
      
      if Config.ShowIndividual or (Group.Name <> 'Individuals') then
      begin
         DoGroupAddition(Group);
         DoGroupListChange;
      end;
      
      // 儊儞僶偑偄側偄偲偒偼偙偺帪揰偱儊儞僶儕僗僩峏怴
      if (FSignInStage <> ssSignIn) and (FMembersCount = 0) then
      begin
         FMembers.Updated        := True;
         FAllowMembers.Updated   := True;
         FBlockMembers.Updated   := True;
         FReverseMembers.Updated := True;
         DoMemberListUpdated(lkFL); // 堷悢偼柍娭學乧偩偲巚傢傟
         
         // 僒僀儞僀儞廔椆張棟
         FinishSignInProcess;
      end;
   end
   else if ParamLst[0] = 'ADG' then
   begin
      Group := FGroups.Add;
      with Group do
      begin
         Id := StrtoIntDef(ParamLst[4], 0);
         Name := DecodeParam(ParamLst[3]);
      end;
      DoGroupAddition(Group);
      DoGroupListChange;
   end
   else if ParamLst[0] = 'REG' then
   begin
      I := FGroups.IndexOf(StrtoIntDef(ParamLst[3], -1));
      if I <> -1 then
      begin
         FGroups[I].Name := DecodeParam(ParamLst[4]);
         DoGroupNameChange(FGroups[I]);
      end;
   end
   else if ParamLst[0] = 'RMG' then
   begin
      I := FGroups.IndexOf(StrToIntDef(ParamLst[3], -1));
      if I <> -1 then
      begin
         DoGroupDeletion(FGroups[I]);
         FGroups.Delete(I);
         DoGroupListChange;
      end;
   end;
end;

procedure TMsnConnection.CreatePrivacyCommand(var ParamLst: TStringList; Cmd: String; BLP: TBLP);
begin
   ParamLst.Add(Cmd);
   ParamLst.Add('0'); // dummy
   case BLP of
      bpAL: ParamLst.Add('AL');
      bpBL: ParamLst.Add('BL');
   end;
   ParamLst.Add('0'); // dummy
   ParamLst.Add(RS_DUMMY_ALL_USER_ACCOUNT);
   If Cmd = 'ADD' then
      ParamLst.Add(EncodeParam(GetLocalStr(RS_SECTION_UI, 'RS_DUMMY_ALL_USER_NAME')));
end;

// GTC BLP傪庴怣
procedure TMsnConnection.ProcessPrivacySetting(ParamLst: TStringList);
var
  Cmd: TStringList;
  OBLP: TBLP;
begin
  if (ParamLst[0] = 'GTC') then
  begin
    if ParamLst[1] = 'A' then
      FGTC := True
    else if ParamLst[1] = 'N' then
      FGTC := False;
  end else
  if (ParamLst[0] = 'BLP') then
  begin
    OBLP := FBLP;
    if (ParamLst[1] = 'AL') or (SS(ParamLst, 3) = 'AL') then
    begin
      FBLP := bpAL;
      OBLP := bpBL;
    end
    else if (ParamLst[1] = 'BL') or (SS(ParamLst, 3) = 'BL') then
    begin
      FBLP := bpBL;
      OBLP := bpAL;
    end;
    
    Cmd := TStringList.Create;
    CreatePrivacyCommand(Cmd, 'ADD', FBLP);
    ProcessMemberList(Cmd);
    Cmd.Clear;
    CreatePrivacyCommand(Cmd, 'REM', OBLP);
    ProcessMemberList(Cmd);
    Cmd.Free;
  end;
end;

// CHL偵曉摎
procedure TMsnConnection.ProcessCHL(ParamLst: TStringList);
var
  ChlStr: String;
  sTemp: String;
begin
  Inc(FTrID);
  ChlStr := Trim(ParamLst[2]) + MSNMSGR_CHL;
  sTemp := LowerCase(MD5Print(MD5String(ChlStr)));
  SendCommand(Format('QRY %d %s 32'#13#10, [FTrID, MSNMSGR_PID]));
  SendCommand(sTemp);
end;

// QNG僐儅儞僪
procedure TMsnConnection.ProcessQNG(ParamLst: TStringList);
var
   Sec: Integer;
begin
   Sec := StrToIntDef(SS(ParamLst,1),-1);
   If Sec > 1 then
      SetPingInterval(Sec - 1); // 1昩憗傔偵Ping偡傞
end;

// 僄儔乕偑憲傜傟偰偒偨偲偒
procedure TMsnConnection.ProcessError(ParamLst: TStringList);
begin
  DoError(ekMsnError, StrToInt(ParamLst[0]));
end;

// 儊僢僙乕僕傪庴怣
procedure TMsnConnection.ProcessMessage(DataStr: UTF8String);
var
  Command, Header: UTF8String;
  FromAccount: String;
  FromName: WideString;
  Msg: UTF8String;
  ParamLst: TStringList;
  P: Integer;
begin
  P := Pos(#13#10, DataStr);
  if P > 0 then
    Command := Copy(DataStr, 1, P - 1)
  else
    Command := DataStr;
  ParamLst := TStringList.Create;
  try
    SplitParamStr(ParamLst, Command);

    FromAccount := String(UTF8Decode(ParamLst[1]));
    FromName := DecodeParam(ParamLst[2]);

    Delete(DataStr, 1, Length(Command) + 2);
    P := Pos(#13#10#13#10, DataStr);
    if P > 0 then
    begin
      Header := Copy(DataStr, 1, P - 1);
      Msg := Copy(DataStr, P + 4, Length(DataStr));
    end else
    begin
      Header := DataStr;
      Msg := '';
    end;
    // 儊僢僙乕僕庴怣僀儀儞僩
    DoReceiveMessage(Header, FromAccount, FromName, Msg);
  finally
    ParamLst.Free;
  end;
end;

procedure TMsnConnection.DoReceiveMessage(Header: UTF8String; FromAccount: String;
                                          FromName: WideString; Msg: UTF8String);
const
  DefaultMbox = 'ACTIVE';
  TrashMbox = 'trAsH';
  JunkMbox = 'HM_BuLkMail_';
  DeleteMbox0 = '.!!trAsH';
  DeleteMbox1 = '00000000-0000-0000-0000-000000000006';
var
  Lines: TStringList;
  ContentType: String;
  FromAddr, From, SrcFolder, DestFolder: String;
  MessageDelta: Integer;
  CPort: Integer;
  SysMsgType: Integer;
  SysMsgArg1: String;
begin
  Lines := TStringList.Create;
  SplitMimeHeader(Lines, Header + #13#10 +  String(UTF8Decode(Msg)));

  ContentType := Lines.Values['Content-Type'];
  if AnsiContainsStr(ContentType, 'text/x-msmsgsprofile') then
  begin
    with User.PassportInfo do
    begin
      LoginTime := StrToIntDef(Lines.Values['LoginTime'], 0);
      EmailEnabled := (StrToIntDef(Lines.Values['EmailEnabled'], 0) = 1);
      MemberIdHigh := StrToIntDef(Lines.Values['MemberIdHigh'], 0);
      MemberIdLow := StrToIntDef(Lines.Values['MemberIdLow'], 0);
      lang_preference := StrToIntDef(Lines.Values['lang_preference'], 0);
      preferredEmail := Lines.Values['preferredEmail'];
      country := Lines.Values['country'];
      PostalCode := Lines.Values['PostalCode'];
      Gender := Lines.Value

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -