diff plugins/icq/icqpacket.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/icqpacket.c	Tue Nov 28 02:22:42 2000 +0000
@@ -0,0 +1,387 @@
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+$Id: icqpacket.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.10  2000/07/07 15:26:35  denis
+"icq_Packet data overflow" log message temporarily commented out.
+
+Revision 1.9  2000/06/25 16:26:36  denis
+icq_PacketUDPDump() tweaked a little.
+
+Revision 1.8  2000/05/03 18:20:40  denis
+icq_PacketReadUDPInUIN() was added.
+
+Revision 1.7  2000/04/05 14:37:02  denis
+Applied patch from "Guillaume R." <grs@mail.com> for basic Win32
+compatibility.
+
+Revision 1.6  2000/01/16 03:59:10  bills
+reworked list code so list_nodes don't need to be inside item structures,
+removed strlist code and replaced with generic list calls
+
+Revision 1.5  1999/09/29 19:58:20  bills
+cleanup
+
+Revision 1.4  1999/09/29 16:56:10  denis
+Cleanups.
+
+Revision 1.3  1999/07/18 20:18:43  bills
+changed to use new byte-order functions
+
+Revision 1.2  1999/07/16 15:45:05  denis
+Cleaned up.
+
+Revision 1.1  1999/07/16 12:11:36  denis
+UDP packet support added.
+tcp_packet* functions renamed to icq_Packet*
+
+Revision 1.8  1999/07/12 15:13:38  cproch
+- added definition of ICQLINK to hold session-specific global variabled
+  applications which have more than one connection are now possible
+- changed nearly every function defintion to support ICQLINK parameter
+
+Revision 1.7  1999/07/03 06:33:52  lord
+. byte order conversion macros added
+. some compilation warnings removed
+
+Revision 1.6  1999/04/17 19:36:50  bills
+added tcp_packet_node_delete function and changed structure to include
+list_node for new list routines.
+
+Revision 1.5  1999/04/14 15:08:04  denis
+Cleanups for "strict" compiling (-ansi -pedantic)
+
+*/
+
+/*
+ * ICQ packet abstraction
+ */
+
+#include <stdlib.h>
+#include <sys/types.h>
+
+#ifdef _WIN32
+#include <winsock.h>
+#else
+#include <sys/socket.h>
+#endif
+
+#include "icqtypes.h"
+#include "icq.h"
+#include "icqlib.h"
+#include "icqpacket.h"
+#include "tcp.h"
+#include "util.h"
+#include "icqbyteorder.h"
+#include "list.h"
+
+icq_Packet *icq_PacketNew()
+{
+  icq_Packet *p=(icq_Packet*)malloc(sizeof(icq_Packet));
+
+  p->length=0;
+  p->cursor=0;
+  p->id=0;
+
+  return p;
+}
+
+void icq_PacketDelete(void *p)
+{
+  free(p);
+}
+
+void icq_PacketAppend32(icq_Packet *p, DWORD i)
+{
+  DWORD val=i;
+
+  *(unsigned long*)((p->data)+(p->cursor))=htoicql(val);
+  icq_PacketAdvance(p, sizeof(DWORD));
+}
+
+void icq_PacketAppend32n(icq_Packet *p, DWORD i)
+{
+  DWORD val=i;
+
+  *(DWORD *)((p->data)+(p->cursor)) = val;
+  icq_PacketAdvance(p, sizeof(DWORD));
+}
+
+DWORD icq_PacketRead32(icq_Packet *p)
+{
+  DWORD val;
+
+  val = icqtohl(*(DWORD *)((p->data)+(p->cursor)));
+  icq_PacketAdvance(p, sizeof(DWORD));
+
+  return val;
+}
+
+DWORD icq_PacketRead32n(icq_Packet *p)
+{
+  DWORD val;
+
+  val = *(DWORD*)((p->data)+(p->cursor));
+  icq_PacketAdvance(p, sizeof(DWORD));
+
+  return val;
+}
+
+void icq_PacketAppend16(icq_Packet *p, WORD i)
+{
+  WORD val=i;
+
+  *(WORD *)((p->data)+(p->cursor)) = htoicqs(val);
+  icq_PacketAdvance(p, sizeof(WORD));
+}
+
+void icq_PacketAppend16n(icq_Packet *p, WORD i)
+{
+  WORD val=i;
+
+  *(WORD *)((p->data)+(p->cursor)) = val;
+  icq_PacketAdvance(p, sizeof(WORD));
+}
+
+WORD icq_PacketRead16(icq_Packet *p)
+{
+  WORD val;
+
+  val = icqtohs(*(WORD *)((p->data)+(p->cursor)));
+  icq_PacketAdvance(p, sizeof(WORD));
+
+  return val;
+}
+
+WORD icq_PacketRead16n(icq_Packet *p)
+{
+  WORD val;
+
+  val = *(WORD*)((p->data)+(p->cursor));
+  icq_PacketAdvance(p, sizeof(WORD));
+
+  return val;
+}
+
+void icq_PacketAppend8(icq_Packet *p, BYTE i)
+{
+  BYTE val=i;
+
+  memcpy((p->data)+(p->cursor), &val, sizeof(BYTE));
+  icq_PacketAdvance(p, sizeof(BYTE));
+}
+
+BYTE icq_PacketRead8(icq_Packet *p)
+{
+  BYTE val;
+
+  memcpy(&val, (p->data)+(p->cursor), sizeof(BYTE));
+  icq_PacketAdvance(p, sizeof(BYTE));
+
+  return val;
+}
+
+void icq_PacketAppendString(icq_Packet *p, const char *s)
+{
+  if(s)
+  {
+    int length=strlen(s)+1;
+
+    icq_PacketAppend16(p, length);
+    icq_PacketAppend(p, s, length);
+  }
+  else
+  {
+    icq_PacketAppend16(p, 1);
+    icq_PacketAppend8(p,0);
+  }
+}
+
+const char *icq_PacketReadString(icq_Packet *p)
+{
+  int length=icq_PacketRead16(p);
+
+  return (const char *)icq_PacketRead(p, length);
+}
+
+char *icq_PacketReadStringNew(icq_Packet *p)
+{
+  char *ptr;
+  int length=icq_PacketRead16(p);
+
+  ptr = (char*)malloc(length);
+  if(!ptr)
+    return 0L;
+  strncpy(ptr, icq_PacketRead(p, length), length);
+  return ptr;
+}
+
+void icq_PacketAppendStringFE(icq_Packet *p, const char *s)
+{
+  if(s)
+  {
+    int length=strlen(s);
+    icq_PacketAppend(p, s, length);
+  }
+  icq_PacketAppend8(p, 0xFE);
+}
+
+void icq_PacketAppendString0(icq_Packet *p, const char *s)
+{
+  if(s)
+  {
+    int length=strlen(s);
+    icq_PacketAppend(p, s, length);
+  }
+  icq_PacketAppend8(p, 0);
+}
+
+WORD icq_PacketReadUDPOutVer(icq_Packet *p)
+{
+  icq_PacketGoto(p, 0);
+  return icq_PacketRead16(p);
+}
+
+WORD icq_PacketReadUDPOutCmd(icq_Packet *p)
+{
+  icq_PacketGoto(p, 14 /*2*/);
+  return icq_PacketRead16(p);
+}
+
+WORD icq_PacketReadUDPOutSeq1(icq_Packet *p)
+{
+  icq_PacketGoto(p, 16);
+  return icq_PacketRead16(p);
+}
+
+WORD icq_PacketReadUDPOutSeq2(icq_Packet *p)
+{
+  icq_PacketGoto(p, 18 /*4*/);
+  return icq_PacketRead16(p);
+}
+
+WORD icq_PacketReadUDPInVer(icq_Packet *p)
+{
+  icq_PacketGoto(p, 0);
+  return icq_PacketRead16(p);
+}
+
+WORD icq_PacketReadUDPInCmd(icq_Packet *p)
+{
+  icq_PacketGoto(p, 7);
+  return icq_PacketRead16(p);
+}
+
+WORD icq_PacketReadUDPInSeq1(icq_Packet *p)
+{
+  icq_PacketGoto(p, 9);
+  return icq_PacketRead16(p);
+}
+
+WORD icq_PacketReadUDPInSeq2(icq_Packet *p)
+{
+  icq_PacketGoto(p, 11);
+  return icq_PacketRead16(p);
+}
+
+DWORD icq_PacketReadUDPInUIN(icq_Packet *p)
+{
+  icq_PacketGoto(p, 13);
+  return icq_PacketRead32(p);
+}
+
+void icq_PacketAppend(icq_Packet *p, const void *data, int length)
+{
+  memcpy((p->data)+(p->cursor), data, length);
+  icq_PacketAdvance(p, length);
+}
+
+const void *icq_PacketRead(icq_Packet *p, int length)
+{
+  const void *data=(p->data)+(p->cursor);
+
+  icq_PacketAdvance(p, length);
+
+  return data;
+}
+
+void icq_PacketShortDump(icq_Packet *p)
+{
+  printf("icq_Packet %x { id=%d, cursor=%x, length=%d }\n", 
+         (int)p, (int)p->id, p->cursor, p->length);
+}
+
+void icq_PacketDump(icq_Packet *p)
+{
+  icq_PacketShortDump(p);
+  hex_dump((char*)&(p->length), p->length+sizeof(WORD));
+}
+
+void icq_PacketUDPDump(icq_Packet *p)
+{
+  icq_PacketShortDump(p);
+  hex_dump((char*)&(p->data), p->length);
+}
+
+void icq_PacketBegin(icq_Packet *p)
+{
+  p->cursor=0;
+}
+
+void icq_PacketEnd(icq_Packet *p)
+{
+  p->cursor=p->length;
+}
+
+void icq_PacketAdvance(icq_Packet *p, int i)
+{
+  p->cursor+=i;
+
+  if(p->cursor > p->length)
+    p->length=p->cursor;
+
+/* Do nothing, because we don't have ICQLINK here */
+/*   if(p->cursor > ICQ_PACKET_DATA_SIZE) */
+/*     icq_FmtLog(0L, ICQ_LOG_WARNING, "icq_Packet data overflow\n"); */
+}
+
+void icq_PacketGoto(icq_Packet *p, int i)
+{
+  icq_PacketBegin(p);
+  icq_PacketAdvance(p, i);
+}
+
+void icq_PacketGotoUDPOutData(icq_Packet *p, int i)
+{
+  /* Go to data in UDP _client_ packet. */
+  icq_PacketGoto(p, 24+i);
+}
+
+void icq_PacketGotoUDPInData(icq_Packet *p, int i)
+{
+  /* Go to data in UDP _server_ packet. */
+  icq_PacketGoto(p, 21+i);
+}
+
+WORD icq_PacketPos(icq_Packet *p)
+{
+  return p->cursor;
+}
+
+int icq_PacketSend(icq_Packet *p, int socket)
+{
+  int result;
+
+  result=send(socket, (const char*)&(p->length), p->length+sizeof(WORD), 0);
+
+#ifdef TCP_RAW_TRACE
+  printf("%d bytes sent on socket %d, result %d\n", 
+    p->length+1, socket, result);
+  icq_PacketDump(p);
+#endif /* TCP_RAW_TRACE */
+
+  return result;
+}