--- a/plugins/icq/chatsession.c Sat Jan 27 11:18:17 2001 +0000 +++ b/plugins/icq/chatsession.c Sun Jan 28 01:52:27 2001 +0000 @@ -1,7 +1,9 @@ #include <stdlib.h> +#include "icq.h" #include "icqlib.h" +#include "tcplink.h" #include "chatsession.h" #include "list.h" @@ -11,10 +13,10 @@ if (p) { - p->remote_handle=0L; p->status=0; p->id=0L; p->icqlink=icqlink; + p->tcplink=NULL; list_insert(icqlink->d->icq_ChatSessions, 0, p); } @@ -23,15 +25,13 @@ void icq_ChatSessionDelete(void *p) { + icq_ChatSession *pchat = (icq_ChatSession *)p; + invoke_callback(pchat->icqlink, icq_ChatNotify)(pchat, CHAT_NOTIFY_CLOSE, + 0, NULL); + free(p); } -void icq_ChatSessionClose(icq_ChatSession *p) -{ - list_remove(p->icqlink->d->icq_ChatSessions, p); - icq_ChatSessionDelete(p); -} - int _icq_FindChatSession(void *p, va_list data) { DWORD uin=va_arg(data, DWORD); @@ -48,6 +48,77 @@ { p->status=status; if(p->id) - if(p->icqlink->icq_RequestNotify) - (*p->icqlink->icq_RequestNotify)(p->icqlink, p->id, ICQ_NOTIFY_CHAT, status, 0); + invoke_callback(p->icqlink, icq_ChatNotify)(p, CHAT_NOTIFY_STATUS, + status, NULL); +} + +/* public */ + +/** Closes a chat session. + * @param session desired icq_ChatSession + * @ingroup ChatSession + */ +void icq_ChatSessionClose(icq_ChatSession *session) +{ + icq_TCPLink *plink = session->tcplink; + + /* if we're attached to a tcplink, unattach so the link doesn't try + * to close us, and then close the tcplink */ + if (plink) + { + plink->session=NULL; + icq_TCPLinkClose(plink); + } + + icq_ChatSessionDelete(session); + + list_remove(session->icqlink->d->icq_ChatSessions, session); } + +/** Sends chat data to the remote uin. + * @param session desired icq_ChatSession + * @param data pointer to data buffer, null-terminated + * @ingroup ChatSession + */ +void icq_ChatSessionSendData(icq_ChatSession *session, const char *data) +{ + icq_TCPLink *plink = session->tcplink; + int data_length = strlen(data); + char *buffer; + + if(!plink) + return; + + buffer = (char *)malloc(data_length); + strcpy(buffer, data); + icq_ChatRusConv_n("kw", buffer, data_length); + + send(plink->socket, buffer, data_length, 0); + + free(buffer); +} + +/** Sends chat data to the remote uin. + * @param session desired icq_ChatSession + * @param data pointer to data buffer + * @param length length of data + * @ingroup ChatSession + */ +void icq_ChatSessionSendData_n(icq_ChatSession *session, const char *data, + int length) +{ + icq_TCPLink *plink = session->tcplink; + char *buffer; + + if(!plink) + return; + + buffer = (char *)malloc(length); + memcpy(buffer, data, length); + icq_ChatRusConv_n("kw", buffer, length); + + send(plink->socket, buffer, length, 0); + + free(buffer); +} +