cómo trabajar con el protocolo de msn messenger en delphi
Este artículo es severamente obsoleta y será actualizado pronto
Esta es una implementación del protocolo de msn messenger en delphi no es completa y con el fin de construir lo que se necesita la WSocket paquete, más de lo que se presenta aquí es una parte de la especificación (todavía no lo suficiente como para incluso hacer una despojado de MSN Messenger clon). El trabajo que usted ve aquí tiene su todos (la mayoría debido al hecho de que simplemente soy nuevo en programación de sockets), este artículo se basa en las obras de venkydude MSN artículo y una versión antigua de KMerlin (opensource de msn messenger clon para linux). Este es el segundo artículo que escribo en la Mensajería Instantánea (El primero sobre el yahoo protocolo, algo que no he podido terminar por falta de tiempo (mucho trabajo)) estoy pensando en la actualización de este artículo lo antes Posible.
< & & & & & & & & & & & & & & & & -CÓDIGO & & & & & & & & & & & & & & & & & & & & >
{GLOBAL de TAREAS: IMPLEMENTAR LOCALES de TODO, la limpieza, extender}
unidad MSNMessenger
interfaz
usos
WSocket, MD5, Clases, SysUtils
tipo
TUserState = (
usOnline, // que son en línea
usBusy, // Realmente ocupado
usBRB, // Estar a la Derecha de nuevo
usAway, //
usOnPhone, //En el Teléfono
usLunch, //Almuerzo
usHidden, //Ocultos
usOffline //fuera de línea
)
TMSNMessenger = clase(TComponent)
privada
FConnected: Boolean
FUserName: Cadena
FPassword: Cadena
FFriendlyUserName: Cadena
FLog: TStrings
FFriendlyNameChange: TNotifyEvent
FState: TUserState
función GetHost: Cadena
procedimiento SetHost(const Valor: Cadena)
función GetPort: Cadena
procedimiento SetPort(const Valor: Cadena)
procedimiento SetUserName(const Valor: Cadena)
procedimiento SetPassWord(const Valor: Cadena)
función GetFriendlyUserName: Cadena
procedimiento SetFriendlyUserName(const Valor: Cadena)
procedimiento SetState(const Valor: TUserState)
protegido
FSocket: TWSocket
FTrialID: Integer
procedimiento SendVER
procedimiento ReceiveSYN
procedimiento SocketWrite(const AString: Cadena)
procedimiento LogWrite(const Datos: Cadena)
procedimiento ProcessCommand(const Mando: Cadena)
procedimiento SocketDisconnect(Sender: TObject de Error: Word)
procedimiento SocketDataAvailable(Sender: TObject de Error: Word)
procedimiento SocketConnect(Sender: TObject de Error: Word)
procedimiento TriggerFriendlyNameChange dinámico
público
constructor Create(AOwner: TComponent) reemplazar
destructor Destruir reemplazar
procedimiento Login
procedimiento cerrar sesión
publicado
propiedad Host: Cadena de leer GetHost escribe SetHost
propiedad Puerto: Cadena de leer GetPort escribe SetPort
propiedad nombre de Usuario: Cadena de leer FUserName escribe SetUserName
propiedad Contraseña: Cadena de leer FPassword escribe SetPassWord
propiedad FriendlyUserName: Cadena de leer GetFriendlyUserName escribe SetFriendlyUserName
propiedad Conectado: Boolean leer FConnected
propiedad Log: TStrings leer FLog escribe FLog
propiedad FriendlyNameChange: TNotifyEvent leer FFriendlyNameChange escribe FFriendlyNameChange
propiedad Estado: TUserState leer FState escribe SetState
fin
aplicación
usos windows
const RealState: array[TUserState] Cadena =
('VAR %d NLN', 'VAR %d BSY', 'VAR %d BRB' , 'VAR %d AWY', 'VAR %d PHN', 'VAR %d LUN',
'VAR %d enfermedad hemolítica del recién nacido', 'VAR %d FLN' )
tipo
CharSet = Set char
función UTF8ToAnsi(x: cadena): ansistring
{ Función que recibe UTF8 string y convierte
a cadena ansi }
var
i: integer
b1, b2: byte
begin
Resultado := x
i := 1
mientras i <= Longitud(Resultado) ¿empezar
si (ord(Resultado[i]) y $80) <> 0 a continuación, empezar
b1 := ord(Resultado[i])
b2 := ord(Resultado[i 1])
si (b1 y $F0) <> $C0
Resultado[i] := #128
else begin
Resultado[i] := Chr((b1 shl 6) o (b2 y $3F))
Eliminar(Resultado, i 1, 1)
fin
fin
inc(i)
fin
fin
función AnsiToUtf8(x: ansistring): cadena
{ Función que reciba la cadena ansi y convierte
a UTF8 string }
var
i: integer
b1, b2: byte
begin
Resultado := x
para i := Largo(Resultado) downto 1
si Resultado[i] >= #127 a continuación, empezar
b1 := $C0 o (ord(Resultado[i]) shr 6)
b2 := $80 o (ord(Resultado[i]) y $3F)
Resultado[i] := chr(b1)
Insertar(chr(b2), Resultado, i 1)
fin
fin
Función ExtractWord(N:Integer S:Cadena WordDelims:juego de Caracteres):Cadena
Var
I,J:Word
Conteo:Integer
U:Integer
Begin
Count := 0
I := 1
Resultado := '
U := Length(S)
Mientras I <= U ¿Empezar
{preskoc oddelovace}
Mientras (I <= U) Y (S[I] En WordDelims) ¿Inc(I)
{neni-li na konci retezce, bude nalezen zacatek slova}
Si I <= U Entonces Inc(Recuento)
J := I
{un zde je konec slova}
Mientras (J <= U) Y No(S[J] En WordDelims) Hacer Inc(J)
{je-li toto n-te slovo, vloz ho na vystup}
Si Count = N , a Continuación, Empezar
Resultado := Copy(S,I,J-I)
Salir
Fin
I := J
Fin {mientras}
Fin
función WordAt(const Texto : cadena Posición : Integer) : cadena
begin
Resultado := ExtractWord(Posición, Texto, [' '])
fin
{ TMSNMessenger }
constructor TMSNMessenger.Create(AOwner: TComponent)
begin
heredado Create(AOwner)
FSocket := TWSocket.Create(Self)
FSocket.Addr := 'messenger.hotmail.com'
FSocket.Puerto := '1863'
FSocket.Proto:= 'tcp'
FSocket.OnSessionConnected := SocketConnect
FSocket.OnSessionClosed := SocketDisconnect
FSocket.OnDataAvailable := SocketDataAvailable
FConnected := False
fin
destructor TMSNMessenger.Destruir
begin
FSocket.Libre
FSocket := nil
heredado Destruir
fin
función TMSNMessenger.GetFriendlyUserName: Cadena
begin
si no FConnected
Resultado := FFriendlyUserName
fin
función TMSNMessenger.GetHost: Cadena
begin
Resultado := FSocket.Direc
fin
función TMSNMessenger.GetPort: Cadena
begin
Resultado := FSocket.Puerto
fin
procedimiento TMSNMessenger.Inicio de sesión
begin
FSocket.Conecte
fin
procedimiento TMSNMessenger.Cierre de sesión
begin
fin
procedimiento TMSNMessenger.LogWrite(const Datos: Cadena)
begin
si Asignado( FLog )
FLog.Agregar(Datos)
fin
{Processcommand aquí es similar a la de un windowproc
aquí podemos procesar todo tipo de información enviada desde el servidor
a partir de ahora es IFFull (lleno de si) tal vez si tengo
algo de tiempo libre va a convertir esto en un caso
TAREAS: Limpiar este procedimiento lío
TAREAS: Añadir más comandos}
procedimiento TMSNMessenger.ProcessCommand
var
Tmp: Cadena
Hash: Cadena
begin
Tmp := WordAt(Mando, 1)
si Tmp = 'VER'
SocketWrite('INF %d')
si Tmp = 'INF' /font>
SocketWrite('USR %d MD5 I ' FUserName)
si Tmp = 'USR'
begin
si WordAt(Mando, 4) = S
begin
Hash := WordAt(Mando, 5)
Eliminar(Hash, pos(#13#10, Hash), Longitud(Hash))
Hash := StrMD5(Hash de la Contraseña)
SocketWrite('USR %d MD5 S' Minúsculas(Hash))
persona
begin
FFriendlyUserName := WordAt(Mando, 5)
SocketWrite('SYN %d 1')
ReceiveSYN
fin
fin
{Cuando se recibe un XFR y no está conectado
para el servidor msn significa redirigir a otro servidor}
si (TMP = 'XFR') y no Conectado
begin
TMP := WordAt(Mando, 4)
FSocket.Cerrar
Eliminar(Tmp, pos(':', Tmp), Longitud(Tmp))
FSocket.Addr := Tmp
TMP := WordAt(Mando, 4)
Eliminar(Tmp, 1, pos(':', Tmp))
FSocket.Puerto := Tmp
FSocket.Conecte
Salir
fin
{cambiar el nombre Amistoso nombre}
si (TMP = 'REA')
begin
FFriendlyUserName := WordAt(Mando, 5)
FFriendlyUserName := StringReplace(FFriendlyUserName, ' ', ' ', [rfReplaceall])
TriggerFriendlyNameChange
fin
{El comando es recibido antes de que el servidor
se desconecta de nosotros, si es porque hemos iniciado sesión en otro equipo
recibimos el mensaje de que el OTH (OTRO equipo)
TODO escribir algún evento o algo para recuperar esta notificación}
si (TMP = ' ')
begin
si pos('OTH', Mando) > 1
LogWrite('cierra la Sesión en otro equipo de desconectar')
fin
fin
{SYN es sin duda el más informationfull MSN Messenger Comando
SYN nos informa de:
correo electrónico
Lista de amigos
Lista de bloqueo
la Inversa de la lista (la gente que te tiene en sus listas)
los números de Teléfono (Casa, móvil, etc.)
MSN Messenger
etc.
sin embargo, esto viene con un precio, ya que hay tanta información
WSocket no puede obtener toda la información correctamente (una calidad de no bloqueo de sockets)
así que para que vamos a congelar este hilo para los 5 segundos
(en el sentido que sus formas no recibirá ningún mensaje y
parece que no responde durante un tiempo), I
sé que debe haber una mejor manera si alguien sabe mi correo electrónico.
TAREAS : Analizar el contenido recibido
TAREAS : buscar una manera que no tiene que congelar el hilo
}
procedimiento TMSNMessenger.ReceiveSYN
var
Tmp: Cadena
begin
FSocket.OnDataAvailable := nil
el Sueño(5000)
Tmp := FSocket.ReceiveStr
FSocket.OnDataAvailable := SocketDataAvailable
Tmp := UTF8ToAnsi(Tmp)
LogWrite('RECV :' Tmp)
SocketWrite('VAR %d NLN')
fin
procedimiento TMSNMessenger.SendVER
begin
SocketWrite('VER %d CVR0 MSNP5 MSNP6 MSNP7')
fin
procedimiento TMSNMessenger.SetFriendlyUserName(const Valor: Cadena)
var
tmp: Cadena
begin
si FConnected y (FUserName <> Valor)
begin
tmp := StringReplace(Valor ' ', ' ', [rfReplaceAll])
tmp := AnsiToUtf8(Tmp)
SocketWrite('REA %d' FUsername ' ' tmp)
fin
fin
procedimiento TMSNMessenger.SetHost(const Valor: Cadena)
begin
si no Conectado
si FSocket.Direc < >
FSocket.Addr := Valor
fin
procedimiento TMSNMessenger.SetPassWord(const Valor: Cadena)
begin
si no Conectado
si (FPassword <> Valor)
FPassword := Valor
fin
procedimiento TMSNMessenger.SetPort(const Valor: Cadena)
begin
si no Conectado
si FSocket.Puerto < >
FSocket.Puerto := Valor
fin
procedimiento TMSNMessenger.SetState(const Valor: TUserState)
begin
si FConnected
si (FState <> Valor)
SocketWrite( RealState[Valor] )
fin
procedimiento TMSNMessenger.SetUserName(const Valor: Cadena)
begin
si no FConnected
si FUsername < >
FUserName := Valor
fin
procedimiento TMSNMessenger.SocketConnect(Sender: TObject de Error: Word)
begin
FTrialID := 1
SendVER
fin
procedimiento TMSNMessenger.SocketDataAvailable(Sender: TObject de Error: Word)
var
Tmp: Cadena
begin
Tmp := FSocket.ReceiveStr
Tmp := UTF8ToAnsi(Tmp)
LogWrite('RECV :' Tmp)
ProcessCommand(Tmp)
fin
procedimiento TMSNMessenger.SocketDisconnect(Sender: TObject de Error: Word)
begin
FConnected := False
LogWrite('Desconectado')
fin
procedimiento TMSNMessenger.SocketWrite(const AString: Cadena)
begin
FSocket.SendStr(Formato(AString, [FTrialID]) #13 #10)
LogWrite(ENVIADO : ' Format(AString, [FTrialID]))
Inc(FTrialID)
fin
procedimiento TMSNMessenger.TriggerFriendlyNameChange
begin
si Asignado(FFriendlyNameChange)
FFriendlyNameChange(Auto)
fin
fin.
< & & & & & & & & & & & & & & & & -/CÓDIGO & & & & & & & & & & & & & & & & & & & -> un ejemplo sería: AMSN := TMSNMessenger.Create(Self) // AMSN es una variable de tipo TMSNMessenger AMSN.Nombre de usuario := ' // Esto indica el nombre de usuario que debe ser siempre de forma *@hotmail.com AMSN.PassWord := ' //Esto indica la contraseña de AMSN.Registro := MEmo1.Líneas // Registro indica un destino para el volcado de la recepción y el envío de información, yo lo uso para recuperar la información de protocolo y esas cosas, pero no es obligatorio usar AMSN.Inicio de sesión // procedimiento que indica que debemos iniciar el proceso de inicio de sesión
Msn messenger en delphi
Msn messenger en delphi : Multi-millones de consejos para hacer su vida mas facil.
como trabajar con el protocolo de msn messenger en delphi
Este articulo es severamente obsoleta y sera actualizado pronto
Esta es una implementacion del protocolo de msn messenger en delphi no es completa y con el fin de construir lo que se necesita la WSocket paquete, mas de lo que se presenta aqui es una parte de la especificacion (todavia no lo suficiente como para incluso hacer una despojado de MSN Messenger clon). El trabajo que usted ve aqui tiene su todos (la mayoria debido al hecho de que simplemente soy nuevo en programacion de sockets), este articulo se basa en las obras de venkydude MSN articulo y una version antigua de KMerlin (opensource de msn messenger clon para linux). Este es el segundo articulo que escribo en la Mensajeria Instantanea (El primero sobre el yahoo protocolo, algo que no he podido terminar por falta de tiempo (mucho trabajo)) estoy pensando en la actualizacion de este articulo lo antes Posible.
< & & & & & & & & & & & & & & & & -CODIGO & & & & & & & & & & & & & & & & & & & & >
{GLOBAL de TAREAS: IMPLEMENTAR LOCALES de TODO, la limpieza, extender}
unidad MSNMessenger
interfaz
usos
WSocket, MD5, Clases, SysUtils
tipo
TUserState = (
usOnline, // que son en linea
usBusy, // Realmente ocupado
usBRB, // Estar a la Derecha de nuevo
usAway, //
usOnPhone, //En el Telefono
usLunch, //Almuerzo
usHidden, //Ocultos
usOffline //fuera de linea
)
TMSNMessenger = clase(TComponent)
privada
FConnected: Boolean
FUserName: Cadena
FPassword: Cadena
FFriendlyUserName: Cadena
FLog: TStrings
FFriendlyNameChange: TNotifyEvent
FState: TUserState
funcion GetHost: Cadena
procedimiento SetHost(const Valor: Cadena)
funcion GetPort: Cadena
procedimiento SetPort(const Valor: Cadena)
procedimiento SetUserName(const Valor: Cadena)
procedimiento SetPassWord(const Valor: Cadena)
funcion GetFriendlyUserName: Cadena
procedimiento SetFriendlyUserName(const Valor: Cadena)
procedimiento SetState(const Valor: TUserState)
protegido
FSocket: TWSocket
FTrialID: Integer
procedimiento SendVER
procedimiento ReceiveSYN
procedimiento SocketWrite(const AString: Cadena)
procedimiento LogWrite(const Datos: Cadena)
procedimiento ProcessCommand(const Mando: Cadena)
procedimiento SocketDisconnect(Sender: TObject de Error: Word)
procedimiento SocketDataAvailable(Sender: TObject de Error: Word)
procedimiento SocketConnect(Sender: TObject de Error: Word)
procedimiento TriggerFriendlyNameChange dinamico
publico
constructor Create(AOwner: TComponent) reemplazar
destructor Destruir reemplazar
procedimiento Login
procedimiento cerrar sesion
publicado
propiedad Host: Cadena de leer GetHost escribe SetHost
propiedad Puerto: Cadena de leer GetPort escribe SetPort
propiedad nombre de Usuario: Cadena de leer FUserName escribe SetUserName
propiedad Contraseña: Cadena de leer FPassword escribe SetPassWord
propiedad FriendlyUserName: Cadena de leer GetFriendlyUserName escribe SetFriendlyUserName
propiedad Conectado: Boolean leer FConnected
propiedad Log: TStrings leer FLog escribe FLog
propiedad FriendlyNameChange: TNotifyEvent leer FFriendlyNameChange escribe FFriendlyNameChange
propiedad Estado: TUserState leer FState escribe SetState
fin
aplicacion
usos windows
const RealState: array[TUserState] Cadena =
('VAR %d NLN', 'VAR %d BSY', 'VAR %d BRB' , 'VAR %d AWY', 'VAR %d PHN', 'VAR %d LUN',
'VAR %d enfermedad hemolitica del recien nacido', 'VAR %d FLN' )
tipo
CharSet = Set char
funcion UTF8ToAnsi(x: cadena): ansistring
{ Funcion que recibe UTF8 string y convierte
a cadena ansi }
var
i: integer
b1, b2: byte
begin
Resultado := x
i := 1
mientras i <= Longitud(Resultado) ¿empezar
si (ord(Resultado[i]) y $80) <> 0 a continuacion, empezar
b1 := ord(Resultado[i])
b2 := ord(Resultado[i 1])
si (b1 y $F0) <> $C0
Resultado[i] := #128
else begin
Resultado[i] := Chr((b1 shl 6) o (b2 y $3F))
Eliminar(Resultado, i 1, 1)
fin
fin
inc(i)
fin
fin
funcion AnsiToUtf8(x: ansistring): cadena
{ Funcion que reciba la cadena ansi y convierte
a UTF8 string }
var
i: integer
b1, b2: byte
begin
Resultado := x
para i := Largo(Resultado) downto 1
si Resultado[i] >= #127 a continuacion, empezar
b1 := $C0 o (ord(Resultado[i]) shr 6)
b2 := $80 o (ord(Resultado[i]) y $3F)
Resultado[i] := chr(b1)
Insertar(chr(b2), Resultado, i 1)
fin
fin
Funcion ExtractWord(N:Integer S:Cadena WordDelims:juego de Caracteres):Cadena
Var
I,J:Word
Conteo:Integer
U:Integer
Begin
Count := 0
I := 1
Resultado := '
U := Length(S)
Mientras I <= U ¿Empezar
{preskoc oddelovace}
Mientras (I <= U) Y (S[I] En WordDelims) ¿Inc(I)
{neni-li na konci retezce, bude nalezen zacatek slova}
Si I <= U Entonces Inc(Recuento)
J := I
{un zde je konec slova}
Mientras (J <= U) Y No(S[J] En WordDelims) Hacer Inc(J)
{je-li toto n-te slovo, vloz ho na vystup}
Si Count = N , a Continuacion, Empezar
Resultado := Copy(S,I,J-I)
Salir
Fin
I := J
Fin {mientras}
Fin
funcion WordAt(const Texto : cadena Posicion : Integer) : cadena
begin
Resultado := ExtractWord(Posicion, Texto, [' '])
fin
{ TMSNMessenger }
constructor TMSNMessenger.Create(AOwner: TComponent)
begin
heredado Create(AOwner)
FSocket := TWSocket.Create(Self)
FSocket.Addr := 'messenger.hotmail.com'
FSocket.Puerto := '1863'
FSocket.Proto:= 'tcp'
FSocket.OnSessionConnected := SocketConnect
FSocket.OnSessionClosed := SocketDisconnect
FSocket.OnDataAvailable := SocketDataAvailable
FConnected := False
fin
destructor TMSNMessenger.Destruir
begin
FSocket.Libre
FSocket := nil
heredado Destruir
fin
funcion TMSNMessenger.GetFriendlyUserName: Cadena
begin
si no FConnected
Resultado := FFriendlyUserName
fin
funcion TMSNMessenger.GetHost: Cadena
begin
Resultado := FSocket.Direc
fin
funcion TMSNMessenger.GetPort: Cadena
begin
Resultado := FSocket.Puerto
fin
procedimiento TMSNMessenger.Inicio de sesion
begin
FSocket.Conecte
fin
procedimiento TMSNMessenger.Cierre de sesion
begin
fin
procedimiento TMSNMessenger.LogWrite(const Datos: Cadena)
begin
si Asignado( FLog )
FLog.Agregar(Datos)
fin
{Processcommand aqui es similar a la de un windowproc
aqui podemos procesar todo tipo de informacion enviada desde el servidor
a partir de ahora es IFFull (lleno de si) tal vez si tengo
algo de tiempo libre va a convertir esto en un caso
TAREAS: Limpiar este procedimiento lio
TAREAS: Añadir mas comandos}
procedimiento TMSNMessenger.ProcessCommand
var
Tmp: Cadena
Hash: Cadena
begin
Tmp := WordAt(Mando, 1)
si Tmp = 'VER'
SocketWrite('INF %d')
si Tmp = 'INF' /font>
SocketWrite('USR %d MD5 I ' FUserName)
si Tmp = 'USR'
begin
si WordAt(Mando, 4) = S
begin
Hash := WordAt(Mando, 5)
Eliminar(Hash, pos(#13#10, Hash), Longitud(Hash))
Hash := StrMD5(Hash de la Contraseña)
SocketWrite('USR %d MD5 S' Minusculas(Hash))
persona
begin
FFriendlyUserName := WordAt(Mando, 5)
SocketWrite('SYN %d 1')
ReceiveSYN
fin
fin
{Cuando se recibe un XFR y no esta conectado
para el servidor msn significa redirigir a otro servidor}
si (TMP = 'XFR') y no Conectado
begin
TMP := WordAt(Mando, 4)
FSocket.Cerrar
Eliminar(Tmp, pos(':', Tmp), Longitud(Tmp))
FSocket.Addr := Tmp
TMP := WordAt(Mando, 4)
Eliminar(Tmp, 1, pos(':', Tmp))
FSocket.Puerto := Tmp
FSocket.Conecte
Salir
fin
{cambiar el nombre Amistoso nombre}
si (TMP = 'REA')
begin
FFriendlyUserName := WordAt(Mando, 5)
FFriendlyUserName := StringReplace(FFriendlyUserName, ' ', ' ', [rfReplaceall])
TriggerFriendlyNameChange
fin
{El comando es recibido antes de que el servidor
se desconecta de nosotros, si es porque hemos iniciado sesion en otro equipo
recibimos el mensaje de que el OTH (OTRO equipo)
TODO escribir algun evento o algo para recuperar esta notificacion}
si (TMP = ' ')
begin
si pos('OTH', Mando) > 1
LogWrite('cierra la Sesion en otro equipo de desconectar')
fin
fin
{SYN es sin duda el mas informationfull MSN Messenger Comando
SYN nos informa de:
correo electronico
Lista de amigos
Lista de bloqueo
la Inversa de la lista (la gente que te tiene en sus listas)
los numeros de Telefono (Casa, movil, etc.)
MSN Messenger
etc.
sin embargo, esto viene con un precio, ya que hay tanta informacion
WSocket no puede obtener toda la informacion correctamente (una calidad de no bloqueo de sockets)
asi que para que vamos a congelar este hilo para los 5 segundos
(en el sentido que sus formas no recibira ningun mensaje y
parece que no responde durante un tiempo), I
se que debe haber una mejor manera si alguien sabe mi correo electronico.
TAREAS : Analizar el contenido recibido
TAREAS : buscar una manera que no tiene que congelar el hilo
}
procedimiento TMSNMessenger.ReceiveSYN
var
Tmp: Cadena
begin
FSocket.OnDataAvailable := nil
el Sueño(5000)
Tmp := FSocket.ReceiveStr
FSocket.OnDataAvailable := SocketDataAvailable
Tmp := UTF8ToAnsi(Tmp)
LogWrite('RECV :' Tmp)
SocketWrite('VAR %d NLN')
fin
procedimiento TMSNMessenger.SendVER
begin
SocketWrite('VER %d CVR0 MSNP5 MSNP6 MSNP7')
fin
procedimiento TMSNMessenger.SetFriendlyUserName(const Valor: Cadena)
var
tmp: Cadena
begin
si FConnected y (FUserName <> Valor)
begin
tmp := StringReplace(Valor ' ', ' ', [rfReplaceAll])
tmp := AnsiToUtf8(Tmp)
SocketWrite('REA %d' FUsername ' ' tmp)
fin
fin
procedimiento TMSNMessenger.SetHost(const Valor: Cadena)
begin
si no Conectado
si FSocket.Direc < >
FSocket.Addr := Valor
fin
procedimiento TMSNMessenger.SetPassWord(const Valor: Cadena)
begin
si no Conectado
si (FPassword <> Valor)
FPassword := Valor
fin
procedimiento TMSNMessenger.SetPort(const Valor: Cadena)
begin
si no Conectado
si FSocket.Puerto < >
FSocket.Puerto := Valor
fin
procedimiento TMSNMessenger.SetState(const Valor: TUserState)
begin
si FConnected
si (FState <> Valor)
SocketWrite( RealState[Valor] )
fin
procedimiento TMSNMessenger.SetUserName(const Valor: Cadena)
begin
si no FConnected
si FUsername < >
FUserName := Valor
fin
procedimiento TMSNMessenger.SocketConnect(Sender: TObject de Error: Word)
begin
FTrialID := 1
SendVER
fin
procedimiento TMSNMessenger.SocketDataAvailable(Sender: TObject de Error: Word)
var
Tmp: Cadena
begin
Tmp := FSocket.ReceiveStr
Tmp := UTF8ToAnsi(Tmp)
LogWrite('RECV :' Tmp)
ProcessCommand(Tmp)
fin
procedimiento TMSNMessenger.SocketDisconnect(Sender: TObject de Error: Word)
begin
FConnected := False
LogWrite('Desconectado')
fin
procedimiento TMSNMessenger.SocketWrite(const AString: Cadena)
begin
FSocket.SendStr(Formato(AString, [FTrialID]) #13 #10)
LogWrite(ENVIADO : ' Format(AString, [FTrialID]))
Inc(FTrialID)
fin
procedimiento TMSNMessenger.TriggerFriendlyNameChange
begin
si Asignado(FFriendlyNameChange)
FFriendlyNameChange(Auto)
fin
fin.
< & & & & & & & & & & & & & & & & -/CODIGO & & & & & & & & & & & & & & & & & & & -> un ejemplo seria: AMSN := TMSNMessenger.Create(Self) // AMSN es una variable de tipo TMSNMessenger AMSN.Nombre de usuario := ' // Esto indica el nombre de usuario que debe ser siempre de forma *@hotmail.com AMSN.PassWord := ' //Esto indica la contraseña de AMSN.Registro := MEmo1.Lineas // Registro indica un destino para el volcado de la recepcion y el envio de informacion, yo lo uso para recuperar la informacion de protocolo y esas cosas, pero no es obligatorio usar AMSN.Inicio de sesion // procedimiento que indica que debemos iniciar el proceso de inicio de sesion