📄 umsnmsgr.pas
字号:
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 + -