onde vc pego o delphi 3000 ?
e essa unit funciona ?

----- Original Message ----- 
From: "Walter Alves Chagas Junior" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Friday, October 22, 2004 6:53 PM
Subject: RES: [delphi-br] Achei isso no Delphi3000



Pelo que li, esta unit permite um aplicativo feito no Delphi usar os
protocolosdo Messenger



 []s

 Walter Alves Chagas Junior
 Projeto e desenvolvimento
 Telemont Engenharia
 [EMAIL PROTECTED]
 Fone: (31) 3389-8215 Fax: (31) 3389-8200



> -----Mensagem original-----
> De: David Leão [mailto:[EMAIL PROTECTED]
> Enviada em: sexta-feira, 22 de outubro de 2004 17:51
> Para: [EMAIL PROTECTED]
> Assunto: Res: [delphi-br] Achei isso no Delphi3000
>
>
>
> Do que se trata??
>
>
>
> uma aplicação parecida com o messenger da microsoft??
>
> []'s
>
>
>
> __________________________________________
>
> David Leão Alves
>
> Administrador de Banco de Dados
>
> Governo do Estado do Amapá
>
> Secretaria de Estado do Meio Ambiente - SEMA
>
>  Av. Mendonça Furtado, 53 - Centro / Macapá-AP
>
>  212-5318 - 212-5378
>
>  212-5303
>
>  [EMAIL PROTECTED]
>
>  www.sema.ap.gov.br
>
> -------Mensagem original-------
>
>
>
> De: [EMAIL PROTECTED]
>
> Data: 10/22/04 17:15:03
>
> Para: '[EMAIL PROTECTED]'
>
> Assunto: [delphi-br] Achei isso no Delphi3000
>
>
>
> This is an implementation of the msn messenger protocol in
> delphi it isnt
>
> complete and in order to build it you will need the WSocket
> package, most of
>
> what is
>
> presented here is a part of the specification (still not
> enough to even make
>
> a stripped down MSN Messenger clone).
>
>
>
> The work you see here has its todos (most due to the fact
> that I am simply
>
> new to sockets programming), this article is based on works
> of venkydude MSN
>
> article and
>
> a old version of KMerlin (an opensource msn messenger clone
> for linux).
>
>
>
> This is the second article I write on Instant Messaging (The
> first one about
>
> the yahoo protocol, something wich I have not been able to
> complete due to
>
> time
>
> constraints (lot of work))
>
>
>
> I am planning in updating this article As Soon As Posible and
> I would like
>
> some help, if you are interested (in helping me) contact me
> at my email
>
> address
>
> ([EMAIL PROTECTED]) with the subject "YahooLib.pas"
> (Without quotes, this
>
> way I know it is about the msn/yahoo protocols)
>
>
>
> So enough chat in here is the code:
>
>
>
> <---------------------------------CODE------------------------
> --------------
>
> -->
>
>
>
>
>
> {GLOBAL TODO: IMPLEMENT LOCAL TODO's, cleanup, extend}
>
> unit MSNMessenger;
>
>
>
> interface
>
>
>
> uses
>
>   WSocket, MD5, Classes, SysUtils;
>
>
>
> type
>
>   TUserState = (
>
>     usOnline,  // you are online
>
>     usBusy,    // Actually busy
>
>     usBRB,     // Be Right Back
>
>     usAway,    // Away
>
>     usOnPhone, //On Phone
>
>     usLunch,   //Lunch
>
>     usHidden,   //Hidden
>
>     usOffline  //Offline
>
>     );
>
>
>
>   TMSNMessenger = class(TComponent)
>
>   private
>
>     FConnected: Boolean;
>
>     FUserName: String;
>
>     FPassword: String;
>
>     FFriendlyUserName: String;
>
>     FLog: TStrings;
>
>     FFriendlyNameChange: TNotifyEvent;
>
>     FState: TUserState;
>
>     function GetHost: String;
>
>     procedure SetHost(const Value: String);
>
>     function GetPort: String;
>
>     procedure SetPort(const Value: String);
>
>     procedure SetUserName(const Value: String);
>
>     procedure SetPassWord(const Value: String);
>
>     function GetFriendlyUserName: String;
>
>     procedure SetFriendlyUserName(const Value: String);
>
>     procedure SetState(const Value: TUserState);
>
>   protected
>
>     FSocket: TWSocket;
>
>     FTrialID: Integer;
>
>
>
>     procedure SendVER;
>
>     procedure ReceiveSYN;
>
>
>
>     procedure SocketWrite(const AString: String);
>
>     procedure LogWrite(const Data: String);
>
>     procedure ProcessCommand(const ACommand: String);
>
>     procedure SocketDisconnect(Sender: TObject; Error: Word);
>
>     procedure SocketDataAvailable(Sender: TObject; Error: Word);
>
>     procedure SocketConnect(Sender: TObject; Error: Word);
>
>
>
>     procedure TriggerFriendlyNameChange; dynamic;
>
>   public
>
>     constructor Create(AOwner: TComponent); override;
>
>     destructor Destroy; override;
>
>
>
>     procedure Login;
>
>     procedure Logoff;
>
>   published
>
>     property Host: String read GetHost write SetHost;
>
>     property Port: String read GetPort write SetPort;
>
>     property UserName: String read FUserName write SetUserName;
>
>     property PassWord: String read FPassword write SetPassWord;
>
>     property FriendlyUserName: String read GetFriendlyUserName write
>
> SetFriendlyUserName;
>
>     property Connected: Boolean read FConnected;
>
>     property Log: TStrings read FLog write FLog;
>
>     property FriendlyNameChange: TNotifyEvent read
> FFriendlyNameChange write
>
> FFriendlyNameChange;
>
>     property Status: TUserState read FState write SetState;
>
>   end;
>
>
>
> implementation
>
>
>
> uses windows;
>
>
>
> const RealState: array[TUserState] of String =
>
>   ('CHG %d NLN', 'CHG %d BSY', 'CHG %d BRB', 'CHG %d AWY',
> 'CHG %d PHN',
>
> 'CHG %d LUN',
>
>    'CHG %d HDN', 'CHG %d FLN' );
>
>
>
> type
>
>   CharSet = Set of char;
>
>
>
> function UTF8ToAnsi(x: string): ansistring;
>
>   { Function that recieves UTF8 string and converts
>
>     to ansi string }
>
> var
>
>   i: integer;
>
>   b1, b2: byte;
>
> begin
>
>   Result := x;
>
>   i := 1;
>
>   while i <= Length(Result) do begin
>
>     if (ord(Result[i]) and $80) <> 0 then begin
>
>       b1 := ord(Result[i]);
>
>       b2 := ord(Result[i + 1]);
>
>       if (b1 and $F0) <> $C0 then
>
>         Result[i] := #128
>
>       else begin
>
>         Result[i] := Chr((b1 shl 6) or (b2 and $3F));
>
>         Delete(Result, i + 1, 1);
>
>       end;
>
>     end;
>
>     inc(i);
>
>   end;
>
> end;
>
>
>
> function AnsiToUtf8(x: ansistring): string;
>
>   { Function that recieves ansi string and converts
>
>     to UTF8 string }
>
> var
>
>   i: integer;
>
>   b1, b2: byte;
>
> begin
>
>   Result := x;
>
>   for i := Length(Result) downto 1 do
>
>     if Result[i] >= #127 then begin
>
>       b1 := $C0 or (ord(Result[i]) shr 6);
>
>       b2 := $80 or (ord(Result[i]) and $3F);
>
>       Result[i] := chr(b1);
>
>       Insert(chr(b2), Result, i + 1);
>
>     end;
>
> end;
>
>
>
> Function  ExtractWord(N:Integer;S:String;WordDelims:CharSet):String;
>
> Var
>
>   I,J:Word;
>
>   Count:Integer;
>
>   SLen:Integer;
>
> Begin
>
>   Count := 0;
>
>   I := 1;
>
>   Result := '';
>
>   SLen := Length(S);
>
>   While I <= SLen Do Begin
>
>     {preskoc oddelovace}
>
>     While (I <= SLen) And (S[I] In WordDelims) Do Inc(I);
>
>     {neni-li na konci retezce, bude nalezen zacatek slova}
>
>     If I <= SLen Then Inc(Count);
>
>     J := I;
>
>     {a zde je konec slova}
>
>     While (J <= SLen) And Not(S[J] In WordDelims) Do Inc(J);
>
>     {je-li toto n-te slovo, vloz ho na vystup}
>
>     If Count = N Then Begin
>
>       Result := Copy(S,I,J-I);
>
>       Exit
>
>     End;
>
>     I := J;
>
>   End; {while}
>
> End;
>
>
>
>
>
> function  WordAt(const Text : string; Position : Integer) : string;
>
> begin
>
>   Result := ExtractWord(Position, Text, [' ']);
>
> end;
>
>
>
> { TMSNMessenger }
>
>
>
> constructor TMSNMessenger.Create(AOwner: TComponent);
>
> begin
>
>   inherited Create(AOwner);
>
>   FSocket := TWSocket.Create(Self);
>
>   FSocket.Addr := 'messenger.hotmail.com';
>
>   FSocket.Port := '1863';
>
>   FSocket.Proto:= 'tcp';
>
>
>
>   FSocket.OnSessionConnected := SocketConnect;
>
>   FSocket.OnSessionClosed    := SocketDisconnect;
>
>   FSocket.OnDataAvailable    := SocketDataAvailable;
>
>   FConnected := False;
>
> end;
>
>
>
> destructor TMSNMessenger.Destroy;
>
> begin
>
>   FSocket.Free;
>
>   FSocket := nil;
>
>   inherited Destroy;
>
> end;
>
>
>
> function TMSNMessenger.GetFriendlyUserName: String;
>
> begin
>
>   if not FConnected then
>
>     Result := FFriendlyUserName;
>
> end;
>
>
>
> function TMSNMessenger.GetHost: String;
>
> begin
>
>   Result := FSocket.Addr;
>
> end;
>
>
>
> function TMSNMessenger.GetPort: String;
>
> begin
>
>   Result := FSocket.Port;
>
> end;
>
>
>
> procedure TMSNMessenger.Login;
>
> begin
>
>   FSocket.Connect;
>
> end;
>
>
>
> procedure TMSNMessenger.Logoff;
>
> begin
>
> end;
>
>
>
> procedure TMSNMessenger.LogWrite(const Data: String);
>
> begin
>
>   if Assigned( FLog ) then
>
>     FLog.Add(Data);
>
> end;
>
>
>
> {Processcommand here is akin to a windowproc
>
>   here we process all kind of info sent from the server
>
>   as of now it is IFFull (full of if's) perhaps if i have
>
>   some spare time will turn this into a case
>
>
>
>   TODO: Clean this procedure mess up
>
>   TODO: Add more commands}
>
>
>
> procedure TMSNMessenger.ProcessCommand;
>
> var
>
>   Tmp: String;
>
>   Hash: String;
>
> begin
>
>   Tmp := WordAt(ACommand, 1);
>
>
>
>   if Tmp = 'VER' then
>
>     SocketWrite('INF %d');
>
>
>
>   if Tmp = 'INF' then
>
>     SocketWrite('USR %d MD5 I '+ FUserName);
>
>
>
>   if Tmp = 'USR' then
>
>   begin
>
>     if WordAt(ACommand, 4) = 'S' then
>
>     begin
>
>       Hash := WordAt(ACommand, 5);
>
>       Delete(Hash, pos(#13#10, Hash), Length(Hash));
>
>       Hash := StrMD5(Hash + PassWord);
>
>       SocketWrite('USR %d MD5 S ' + Lowercase(Hash));
>
>     end else
>
>     begin
>
>       FFriendlyUserName := WordAt(ACommand, 5);
>
>       SocketWrite('SYN %d 1');
>
>       ReceiveSYN;
>
>     end;
>
>   end;
>
> {When you receive an XFR and you are not connected
>
>   to the msn server it means redirect to another server}
>
>   if (TMP = 'XFR') and not Connected then
>
>   begin
>
>     TMP := WordAt(ACommand, 4);
>
>     FSocket.Close;
>
>     Delete(Tmp, pos(':', Tmp), Length(Tmp));
>
>     FSocket.Addr := Tmp;
>
>     TMP := WordAt(ACommand, 4);
>
>     Delete(Tmp, 1, pos(':', Tmp));
>
>     FSocket.Port := Tmp;
>
>     FSocket.Connect;
>
>     Exit;
>
>   end;
>
> {Rename Friendly name}
>
>   if (TMP = 'REA') then
>
>   begin
>
>     FFriendlyUserName := WordAt(ACommand, 5);
>
>     FFriendlyUserName := StringReplace(FFriendlyUserName, '%20', ' ',
>
> [rfReplaceall]);
>
>     TriggerFriendlyNameChange;
>
>   end;
>
> {The out command is received before the server
>
>   disconnects us, if it's because we've logged in another machine
>
>   we receive the message OUT OTH (OTHER MACHINE)
>
>   TODO write some event or something to retrieve this notification}
>
>   if (TMP = 'OUT') then
>
>   begin
>
>     if pos('OTH', ACommand) > 1 then
>
>       LogWrite('Logged out in another computer disconnecting');
>
>   end;
>
>
>
> end;
>
>
>
> {SYN is without a doubt the most informationfull MSN Messenger Command
>
>   SYN informs us of:
>
>    available email
>
>    Friend List
>
>    Block List
>
>    Reverse list (people that has you in their lists)
>
>    Phone numbers (Home, mobile, etc.)
>
>    MSN Messenger settings
>
>    etc.
>
>
>
>   however this comes with a price, since there is so much information
>
>   WSocket may not get all the info properly (a quality of non blocking
>
> sockets)
>
>   thus in order to get it we will freeze this thread for 5 seconds
>
> (meaning your forms will not receive any message and
>
>   seem unresponsive for a while), I
>
>   know there must be a better way around if somebody knows email me.
>
>
>
>   TODO : Parse the received content
>
>   TODO : look for a way wich does not have to freeze the thread
>
> }
>
>
>
> procedure TMSNMessenger.ReceiveSYN;
>
> var
>
>   Tmp: String;
>
> begin
>
>   FSocket.OnDataAvailable := nil;
>
>
>
>   Sleep(5000);
>
>   Tmp := FSocket.ReceiveStr;
>
>
>
>   FSocket.OnDataAvailable := SocketDataAvailable;
>
>   Tmp := UTF8ToAnsi(Tmp);
>
>   LogWrite('RECV : ' + Tmp);
>
>   SocketWrite('CHG %d NLN');
>
> end;
>
>
>
> procedure TMSNMessenger.SendVER;
>
> begin
>
>   SocketWrite('VER %d CVR0 MSNP5 MSNP6 MSNP7')
>
> end;
>
>
>
> procedure TMSNMessenger.SetFriendlyUserName(const Value: String);
>
> var
>
>   tmp: String;
>
> begin
>
>   if FConnected and (FUserName <> Value) then
>
>   begin
>
>     tmp := StringReplace(Value, ' ', '%20', [rfReplaceAll]);
>
>     tmp := AnsiToUtf8(Tmp);
>
>     SocketWrite('REA %d ' + FUsername + ' '+ tmp);
>
>   end;
>
> end;
>
>
>
> procedure TMSNMessenger.SetHost(const Value: String);
>
> begin
>
>   if not Connected then
>
>     if FSocket.Addr <> Value then
>
>       FSocket.Addr := Value;
>
> end;
>
>
>
> procedure TMSNMessenger.SetPassWord(const Value: String);
>
> begin
>
>   if not Connected then
>
>     if (FPassword <> Value) then
>
>       FPassword := Value;
>
> end;
>
>
>
> procedure TMSNMessenger.SetPort(const Value: String);
>
> begin
>
>   if not Connected then
>
>     if FSocket.Port <> Value then
>
>       FSocket.Port := Value;
>
> end;
>
>
>
> procedure TMSNMessenger.SetState(const Value: TUserState);
>
> begin
>
>   if FConnected then
>
>     if (FState <> Value) then
>
>       SocketWrite( RealState[Value] );
>
> end;
>
>
>
> procedure TMSNMessenger.SetUserName(const Value: String);
>
> begin
>
>   if not FConnected then
>
>     if FUsername <> Value then
>
>       FUserName := Value;
>
> end;
>
>
>
> procedure TMSNMessenger.SocketConnect(Sender: TObject; Error: Word);
>
> begin
>
>   FTrialID := 1;
>
>   SendVER;
>
> end;
>
>
>
> procedure TMSNMessenger.SocketDataAvailable(Sender: TObject;
> Error: Word);
>
> var
>
>   Tmp: String;
>
> begin
>
>   Tmp := FSocket.ReceiveStr;
>
>   Tmp := UTF8ToAnsi(Tmp);
>
>   LogWrite('RECV : ' + Tmp);
>
>   ProcessCommand(Tmp);
>
> end;
>
>
>
> procedure TMSNMessenger.SocketDisconnect(Sender: TObject;
> Error: Word);
>
> begin
>
>   FConnected := False;
>
>   LogWrite('Disconnected');
>
> end;
>
>
>
> procedure TMSNMessenger.SocketWrite(const AString: String);
>
> begin
>
>   FSocket.SendStr(Format(AString, [FTrialID]) + #13+#10);
>
>   LogWrite('SENT : ' + Format(AString, [FTrialID]));
>
>   Inc(FTrialID);
>
> end;
>
>
>
> procedure TMSNMessenger.TriggerFriendlyNameChange;
>
> begin
>
>   if Assigned(FFriendlyNameChange) then
>
>     FFriendlyNameChange(Self);
>
> end;
>
>
>
> end.
>
>
>
> <---------------------------------/CODE-----------------------
> --------------
>
> -->
>
>
>
>
>
> a sample would be:
>
>
>
>   AMSN := TMSNMessenger.Create(Self); // AMSN is a variable of type
>
> TMSNMessenger
>
>   AMSN.UserName := ''; // This indicates the username wich
> should always be
>
> of form [EMAIL PROTECTED]
>
>   AMSN.PassWord := '';//This indicates the password
>
>   AMSN.Log := MEmo1.Lines; // Log indicates a destination to dump the
>
> received and sent information, I use it for retrieving
> protocol information
>
> and stuff but it is not obligatory to use it
>
>   AMSN.Login;  // procedure wich indicates that  we should
> start the login
>
> process
>
>
>
>
>
>
>
>   []s
>
>
>
>   Walter Alves Chagas Junior
>
>   Projeto e desenvolvimento
>
>   Telemont Engenharia
>
>   [EMAIL PROTECTED]
>
>   Fone: (31) 3389-8215 Fax: (31) 3389-8200
>
>
>
>
>
>
>
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>
>
>
>
>
>
> --
>
> <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>
>
>
>
> Para ver as mensagens antigas, acesse:
>
>   http://br.groups.yahoo.com/group/delphi-br/messages
>
>
>
> Para falar com o moderador, envie um e-mail para:
>
>   [EMAIL PROTECTED] ou [EMAIL PROTECTED]
>
>
>
> Links do Yahoo! Grupos
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>
>
> -- 
> <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>
>
> Para ver as mensagens antigas, acesse:
>  http://br.groups.yahoo.com/group/delphi-br/messages
>
> Para falar com o moderador, envie um e-mail para:
>  [EMAIL PROTECTED] ou [EMAIL PROTECTED]
>
> Links do Yahoo! Grupos
>
>
>
>
>
>
>
>


[As partes desta mensagem que não continham texto foram removidas]



-- 
<<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>

Para ver as mensagens antigas, acesse:
 http://br.groups.yahoo.com/group/delphi-br/messages

Para falar com o moderador, envie um e-mail para:
 [EMAIL PROTECTED] ou [EMAIL PROTECTED]

Links do Yahoo! Grupos










-- 
<<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>

Para ver as mensagens antigas, acesse:
 http://br.groups.yahoo.com/group/delphi-br/messages

Para falar com o moderador, envie um e-mail para:
 [EMAIL PROTECTED] ou [EMAIL PROTECTED]
 
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/delphi-br/

<*> Para sair deste grupo, envie um e-mail para:
    [EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html

 



Responder a