diff plugins/icq/tcpchathandle.c @ 1152:201ec77f3a60

[gaim-migrate @ 1162] icq. whoop de doo committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Tue, 28 Nov 2000 02:22:42 +0000
parents
children 0a766047b4fd
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/icq/tcpchathandle.c	Tue Nov 28 02:22:42 2000 +0000
@@ -0,0 +1,271 @@
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+$Id: tcpchathandle.c 1162 2000-11-28 02:22:42Z warmenhoven $
+$Log$
+Revision 1.1  2000/11/28 02:22:42  warmenhoven
+icq. whoop de doo
+
+Revision 1.8  2000/07/24 03:10:08  bills
+added support for real nickname during TCP transactions like file and
+chat, instead of using Bill all the time (hmm, where'd I get that from? :)
+
+Revision 1.7  2000/07/09 22:19:35  bills
+added new *Close functions, use *Close functions instead of *Delete
+where correct, and misc cleanup
+
+Revision 1.6  2000/05/04 15:57:20  bills
+Reworked file transfer notification, small bugfixes, and cleanups.
+
+Revision 1.5  2000/05/03 18:29:15  denis
+Callbacks have been moved to the ICQLINK structure.
+
+Revision 1.4  2000/04/05 14:37:02  denis
+Applied patch from "Guillaume R." <grs@mail.com> for basic Win32
+compatibility.
+
+Revision 1.3  2000/02/07 02:54:45  bills
+warning cleanups.
+
+Revision 1.2  2000/02/07 02:43:37  bills
+new code for special chat functions (background, fonts, etc)
+
+Revision 1.1  1999/09/29 19:47:21  bills
+reworked chat/file handling.  fixed chat. (it's been broke since I put
+non-blocking connects in)
+
+*/
+
+#include <time.h>
+
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+
+#include <stdlib.h>
+
+#include "icqtypes.h"
+#include "icq.h"
+#include "icqlib.h"
+
+#include "stdpackets.h"
+#include "tcplink.h"
+#include "chatsession.h"
+
+void icq_HandleChatAck(icq_TCPLink *plink, icq_Packet *p, int port)
+{
+  icq_TCPLink *pchatlink;
+  icq_ChatSession *pchat;
+  icq_Packet *p2;
+
+  if(plink->icqlink->icq_RequestNotify)
+    (*plink->icqlink->icq_RequestNotify)(plink->icqlink, p->id, ICQ_NOTIFY_ACK, 0, 0);
+  pchatlink=icq_TCPLinkNew(plink->icqlink);
+  pchatlink->type=TCP_LINK_CHAT;
+  pchatlink->id=p->id;
+  
+  pchat=icq_ChatSessionNew(plink->icqlink);
+  pchat->id=p->id;
+  pchat->remote_uin=plink->remote_uin;
+  icq_ChatSessionSetStatus(pchat, CHAT_STATUS_CONNECTING);
+  icq_TCPLinkConnect(pchatlink, plink->remote_uin, port);
+
+  pchatlink->session=pchat;
+
+  p2=icq_TCPCreateChatInfoPacket(pchatlink, plink->icqlink->icq_Nick,
+    0x00ffffff, 0x00000000);
+  icq_TCPLinkSend(pchatlink, p2);
+
+}
+
+void icq_HandleChatHello(icq_TCPLink *plink)
+{
+
+  /* once the hello packet has been processed and we know which uin this
+   * link is for, we can link up with a chat session */
+  icq_ChatSession *pchat=icq_FindChatSession(plink->icqlink,
+    plink->remote_uin);
+
+  if(pchat)
+  {
+    plink->id=pchat->id;
+    plink->session=pchat;
+    icq_ChatSessionSetStatus(pchat, CHAT_STATUS_WAIT_NAME);
+
+  } else {
+
+    icq_FmtLog(plink->icqlink, ICQ_LOG_WARNING,
+      "unexpected chat hello received from %d, closing link\n",
+      plink->remote_uin);
+    icq_TCPLinkClose(plink);
+  }
+
+}
+
+void icq_TCPOnChatReqReceived(ICQLINK *link, DWORD uin, const char *message, DWORD id)
+{
+#ifdef TCP_PACKET_TRACE
+  printf("chat request packet received from %lu { sequence=%lx, message=%s }\n",
+     uin, id, message);
+#endif /* TCP_PACKET_TRACE */
+
+  if(link->icq_RecvChatReq) {
+
+    /* use the current system time for time received */
+    time_t t=time(0);
+    struct tm *ptime=localtime(&t);
+
+    (*link->icq_RecvChatReq)(link, uin, ptime->tm_hour, ptime->tm_min,
+       ptime->tm_mday, ptime->tm_mon+1, ptime->tm_year+1900, message, id);
+
+    /* don't send an acknowledgement to the remote client!
+     * GUI is responsible for sending acknowledgement once user accepts
+     * or denies using icq_TCPSendChatAck */
+  }
+}
+
+void icq_TCPChatUpdateFont(icq_TCPLink *plink, const char *font, WORD encoding, DWORD style, DWORD size)
+{
+  int packet_len, fontlen;
+  char *buffer;
+  if(!plink->icqlink->icq_RequestNotify)
+    return;
+  buffer = malloc(packet_len = (2 + (fontlen = strlen(font) + 1)) + 2 + 1 + (4+1)*2);
+  buffer[0] = '\x11';
+  *((DWORD *)&buffer[1]) = style;
+  buffer[5] = '\x12';
+  *((DWORD *)&buffer[6]) = size;
+  buffer[10] = '\x10';
+  *((WORD *)&buffer[11]) = fontlen;
+  strcpy(&buffer[13], font);
+  icq_RusConv("wk", &buffer[13]);
+  *((WORD *)&buffer[13 + fontlen]) = encoding;
+  if(plink->icqlink->icq_RequestNotify)
+    (*plink->icqlink->icq_RequestNotify)(plink->icqlink, plink->id, ICQ_NOTIFY_CHATDATA, packet_len, buffer);
+  free(buffer);
+}
+
+void icq_TCPChatUpdateColors(icq_TCPLink *plink, DWORD foreground, DWORD background)
+{
+  char buffer[10];
+
+  if(!plink->icqlink->icq_RequestNotify)
+    return;  
+  buffer[0] = '\x00';
+  *((DWORD *)&buffer[1]) = foreground;
+  buffer[5] = '\x01';
+  *((DWORD *)&buffer[6]) = background;
+  if(plink->icqlink->icq_RequestNotify)
+    (*plink->icqlink->icq_RequestNotify)(plink->icqlink, plink->id, ICQ_NOTIFY_CHATDATA,
+                                         sizeof(buffer), buffer);
+}
+
+void icq_TCPProcessChatPacket(icq_Packet *p, icq_TCPLink *plink)
+{
+  DWORD code;
+  DWORD remote_uin;
+  DWORD ip1, ip2;
+  DWORD fg, bg, fontstyle, fontsize;
+  WORD port1, encoding;
+  icq_Packet *presponse;
+  icq_ChatSession *pchat=(icq_ChatSession *)plink->session;
+  const char *font, *user;
+	
+  icq_PacketBegin(p);
+
+  code=icq_PacketRead32(p);
+  remote_uin=icq_PacketRead32(p);
+
+  if(code==0x00000006 || code==0x00070004)
+  {
+    font = (char *)NULL;
+    encoding = 0;
+    fontstyle = 0;
+    fontsize = 0;
+    if(code == 0x00070004)
+    {
+      ip1 = icq_PacketRead32(p);
+      ip2 = icq_PacketRead32(p);
+      icq_PacketRead8(p);
+      port1 = icq_PacketRead16(p);
+      fontsize = icq_PacketRead32(p);
+      fontstyle = icq_PacketRead32(p);
+      font = icq_PacketReadString(p);
+      encoding = icq_PacketRead16(p);
+    }
+    else
+    {
+      ip1 = icq_PacketRead32(p);
+      ip2 = icq_PacketRead32(p);
+      port1 = icq_PacketRead16(p);
+      icq_PacketRead8(p);
+      fontsize = icq_PacketRead32(p);
+      fontstyle = icq_PacketRead32(p);
+      font = icq_PacketReadString(p);
+      encoding = icq_PacketRead16(p);
+    }
+    if(font)
+      icq_TCPChatUpdateFont(plink, font, encoding, fontstyle, fontsize);
+    icq_ChatSessionSetStatus(pchat, CHAT_STATUS_READY);
+    plink->mode|=TCP_LINK_MODE_RAW;
+  }
+  else
+    if(remote_uin>0xffffff00)
+    {
+      remote_uin=icq_PacketRead32(p);
+      user = icq_PacketReadString(p);
+      icq_PacketRead16(p); /* Unknown */;
+      fg = icq_PacketRead32(p);
+      bg = icq_PacketRead32(p);
+      icq_TCPChatUpdateColors(plink, fg, bg);
+
+      presponse=icq_TCPCreateChatInfo2Packet(plink, plink->icqlink->icq_Nick,
+        0x00ffffff, 0x00000000);
+      icq_PacketSend(presponse, plink->socket);
+      icq_PacketDelete(presponse);
+      icq_ChatSessionSetStatus(pchat, CHAT_STATUS_WAIT_FONT);
+    }
+    else
+    {
+      user = icq_PacketReadString(p);
+      fg = icq_PacketRead32(p);
+      bg = icq_PacketRead32(p);
+      icq_TCPChatUpdateColors(plink, fg, bg);
+      font = (char *)NULL;
+      encoding = 0;
+      fontstyle = 0;
+      fontsize = 0;
+      if((code = icq_PacketRead32(p)) == 0x00070004)
+      {
+        icq_PacketRead32(p);
+        ip1 = icq_PacketRead32(p);
+        ip2 = icq_PacketRead32(p);
+        icq_PacketRead8(p);
+        port1 = icq_PacketRead16(p);
+        fontsize = icq_PacketRead32(p);
+        fontstyle = icq_PacketRead32(p);
+        font = icq_PacketReadString(p);
+        encoding = icq_PacketRead16(p);
+      }
+      else if(code == 0x00000006)
+      {
+        icq_PacketRead32(p);
+        ip1 = icq_PacketRead32(p);
+        ip2 = icq_PacketRead32(p);
+        port1 = icq_PacketRead16(p);
+        icq_PacketRead8(p);
+        fontsize = icq_PacketRead32(p);
+        fontstyle = icq_PacketRead32(p);
+        font = icq_PacketReadString(p);
+        encoding = icq_PacketRead16(p);
+      }
+      if(font)
+        icq_TCPChatUpdateFont(plink, font, encoding, fontstyle, fontsize);
+      presponse=icq_TCPCreateChatFontInfoPacket(plink);
+      icq_PacketSend(presponse, plink->socket);
+      icq_PacketDelete(presponse);
+      /* notify app that chat connection has been established */
+      icq_ChatSessionSetStatus(pchat, CHAT_STATUS_READY);
+      plink->mode|=TCP_LINK_MODE_RAW;
+    }
+}
+