plugins/icq/chatsession.c

changeset 1432
ab10a52f94a7
parent 1309
dccfec27ffd4
child 1531
a275218f3f4c
--- 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);
+}
+

mercurial