OICQPack.pas
上传用户:hbtcygglw
上传日期:2007-01-07
资源大小:281k
文件大小:5k
源码类别:

其他

开发平台:

Delphi

  1. unit OICQPack;
  2. interface
  3. uses Windows,SysUtils,classes;
  4. const
  5. OICQ_CMD_LOGON=$13;
  6. OICQ_CMD_LOGOFF=$1;
  7. OICQ_CMD_GETUSERINFO=$06;
  8. OICQ_CMD_SENDMSG=$08;
  9. OICQ_CMD_ADDFRIEND=$09;
  10. OICQ_CMD_GETFRIENDLIST=$0C;
  11. OICQ_CMD_REMOVEFRIEND=$0A;
  12. OICQ_CMD_PING=$02;
  13. function BuildEmptyPack(var buf:array of char;buflen:Integer;Cmd:Byte;MsgId:Word;uid:string):Integer;
  14. function BuildPingPack(var buf:array of char;buflen:Integer;MsgId:Word;uid:String):Integer;
  15. function BuildLogonPack(var buf:array of char;buflen:Integer;MsgId:Word;uid:string;password:string):Integer;
  16. function ParseLogonReponse(buf:array of char;buflen:Integer;var uid:string;var ip:string;var port:string):Boolean;
  17. function BuildLogoffPack(var buf:array of char;buflen:Integer;MsgId:Word;uid:string;password:string):Integer;
  18. function BuildGetFriendListPack(var buf:array of char;buflen:Integer;MsgId:Word;uid:string;password:string):Integer;
  19. function ParseFriendList(buf:array of char;buflen:Integer;items:TStrings):Integer;
  20. function BuildGetUserInfoPack(var buf:array of char;buflen:Integer;MsgId:Word;uid:String;FriendId:String):Integer;
  21. function ParseUserInfo(buf:array of char;buflen:Integer;var uid:string;var name:string):Boolean;
  22. function BuildDeleteFriend(var buf:array of char;buflen:Integer;MsgId:Word;uid:string;FriendId:string):Integer;
  23. function ParseDeleteReponse(buf:array of char;buflen:Integer):Boolean;
  24. implementation
  25. uses data;
  26. function BuildEmptyPack(var buf:array of char;buflen:Integer;Cmd:Byte;MsgId:Word;uid:string):Integer;
  27. var
  28. id:DWORD;
  29. begin
  30. //Version header
  31. buf[0]:=#2;
  32. buf[1]:=#1;
  33. buf[2]:=#7;
  34. buf[3]:=#0;
  35. //Cmd
  36. buf[4]:=Chr(Cmd);
  37. //MsgId
  38. buf[5]:=Chr((MsgId and $ff00) shr 8);
  39. buf[6]:=Chr(MsgId and $00ff);
  40. //uid
  41. id:=StrToInt(uid);
  42. buf[7]:=Chr((id and $ff000000) shr 24);
  43. buf[8]:=Chr((id and $00ff0000) shr 16);
  44. buf[9]:=Chr((id and $0000ff00) shr 8);
  45. buf[10]:=Chr(id and $000000ff);
  46. Result:=11;
  47. end;
  48. function BuildLogonPack(var buf:array of char;buflen:Integer;MsgId:Word;uid:string;password:string):Integer;
  49. var
  50. i:Integer;
  51. begin
  52. i:=BuildEmptyPack(buf,buflen,OICQ_CMD_LOGON,MsgId,uid);
  53. buf[i]:=#$30;
  54. Inc(i);
  55. buf[i]:=#$1f;
  56. Inc(i);
  57. i:=ArrayStrCopy(buf,buflen,i,password);
  58. buf[i]:=#03;
  59. Result:=i+1;
  60. end;
  61. function ParseLogonReponse(buf:array of char;buflen:Integer;var uid:string;var ip:string;var port:string):Boolean;
  62. var
  63. i:Integer;
  64. begin
  65. if(buf[4]=#$13)then
  66.     begin
  67.     Result:=True;
  68.     i:=ParseStrFromBuf(buf,buflen,7,$1f,uid);
  69.     i:=ParseStrFromBuf(buf,buflen,i+1,$1f,ip);
  70.     ParseStrFromBuf(buf,buflen,i+1,$1f,port);
  71.     end
  72. else Result:=False;
  73. end;
  74. function BuildLogoffPack(var buf:array of char;buflen:Integer;MsgId:Word;uid:string;password:string):Integer;
  75. var
  76. i:Integer;
  77. begin
  78. i:=BuildEmptyPack(buf,buflen,OICQ_CMD_LOGOFF,MsgId,uid);
  79. i:=ArrayStrCopy(buf,buflen,i,password);
  80. buf[i]:=#03;
  81. Result:=i+1;
  82. end;
  83. function BuildGetFriendListPack(var buf:array of char;buflen:Integer;MsgId:Word;uid:string;password:string):Integer;
  84. var
  85. i:Integer;
  86. begin
  87. i:=BuildEmptyPack(buf,buflen,OICQ_CMD_GETFRIENDLIST,MsgId,uid);
  88. i:=ArrayStrCopy(buf,buflen,i,password);
  89. buf[i]:=#03;
  90. Result:=i+1;
  91. end;
  92. function ParseFriendList(buf:array of char;buflen:Integer;items:TStrings):Integer;
  93. var
  94. i:integer;
  95. str:string;
  96. begin
  97. Result:=0;
  98. if(buf[4]=Chr(OICQ_CMD_GETFRIENDLIST))then
  99.     begin
  100.     i:=ParseStrFromBuf(buf,buflen,7,$1f,str);
  101.     while((i<buflen) and (i<>7))do
  102.         begin
  103.         items.add(str);
  104.         i:=ParseStrFromBuf(buf,buflen,i+1,$1f,str);
  105.         Inc(Result);
  106.         end;
  107.     end
  108. else Result:=-1;
  109. end;
  110. function BuildGetUserInfoPack(var buf:array of char;buflen:Integer;MsgId:Word;uid:String;FriendId:String):Integer;
  111. var
  112. i:Integer;
  113. begin
  114. i:=BuildEmptyPack(buf,buflen,OICQ_CMD_GETUSERINFO,MsgId,uid);
  115. i:=ArrayStrCopy(buf,buflen,i,FriendId);
  116. buf[i]:=#03;
  117. Result:=i+1;
  118. end;
  119. function ParseUserInfo(buf:array of char;buflen:Integer;var uid:string;var name:string):Boolean;
  120. var
  121. i:Integer;
  122. begin
  123. if(buf[4]=Chr(OICQ_CMD_GETUSERINFO))then
  124.     begin
  125.     Result:=True;
  126.     i:=ParseStrFromBuf(buf,buflen,7,$1e,uid);
  127.     ParseStrFromBuf(buf,buflen,i+1,$1e,name);
  128.     end
  129. else Result:=False;
  130. end;
  131. function BuildDeleteFriend(var buf:array of char;buflen:Integer;MsgId:Word;uid:string;FriendId:string):Integer;
  132. var
  133. i:Integer;
  134. begin
  135. i:=BuildEmptyPack(buf,buflen,OICQ_CMD_REMOVEFRIEND,MsgId,uid);
  136. i:=ArrayStrCopy(buf,buflen,i,FriendId);
  137. buf[i]:=#03;
  138. Result:=i+1;
  139. end;
  140. function ParseDeleteReponse(buf:array of char;buflen:Integer):Boolean;
  141. begin
  142. Result:=(buf[4]=Chr(OICQ_CMD_REMOVEFRIEND));
  143. end;
  144. function BuildPingPack(var buf:array of char;buflen:Integer;MsgId:Word;uid:String):Integer;
  145. var
  146. i:Integer;
  147. begin
  148. i:=BuildEmptyPack(buf,buflen,OICQ_CMD_PING,MsgId,uid);
  149. i:=ArrayStrCopy(buf,buflen,i+1,uid);
  150. buf[i]:=#3;
  151. Result:=i+1;
  152. end;
  153. end.