Mercurial > pidgin
view plugins/icq/stdpackets.c @ 1498:0ef6603d986e
[gaim-migrate @ 1508]
updating icqlib
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Thu, 22 Feb 2001 23:07:34 +0000 |
parents | 4c510ca3563f |
children | 8ed70631ed15 |
line wrap: on
line source
/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* $Id: stdpackets.c 1442 2001-01-28 01:52:27Z warmenhoven $ $Log$ Revision 1.3 2001/01/28 01:52:27 warmenhoven icqlib 1.1.5 Revision 1.12 2001/01/24 05:11:14 bills applied patch from Robin Ericsson <lobbin@localhost.nu> which implements receiving contact lists. See new icq_RecvContactList callback. Revision 1.11 2000/12/19 06:00:07 bills moved members from ICQLINK to ICQLINK_private struct Revision 1.10 2000/06/15 01:51:23 bills added creation functions for cancel and refuse operations Revision 1.9 2000/05/04 15:50:38 bills warning cleanups Revision 1.8 2000/04/10 18:11:45 denis ANSI cleanups. Revision 1.7 2000/04/06 16:38:04 denis icq_*Send*Seq() functions with specified sequence number were added. Revision 1.6 2000/02/07 02:35:13 bills slightly modified chat packets Revision 1.5 2000/01/20 19:59:15 bills first implementation of sending file requests Revision 1.4 1999/09/29 20:12:32 bills tcp_link*->icq_TCPLink* Revision 1.3 1999/09/29 17:07:48 denis Host/network byteorder cleanups. Revision 1.2 1999/07/16 15:45:20 denis Cleaned up. Revision 1.1 1999/07/16 12:13:11 denis UDP packets support added. tcppackets.[ch] files renamed to stdpackets.[ch] Revision 1.9 1999/07/12 15:13:39 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.8 1999/05/03 21:41:28 bills initial file xfer support added- untested Revision 1.7 1999/04/17 19:39:09 bills added new functions to create chat packets. removed unnecessary code. added new function to create URL ack packet. Revision 1.6 1999/04/14 15:08:39 denis Cleanups for "strict" compiling (-ansi -pedantic) */ #include <stdlib.h> #include "icqtypes.h" #include "icq.h" #include "icqlib.h" #include "tcp.h" #include "stdpackets.h" icq_Packet *icq_TCPCreateInitPacket(icq_TCPLink *plink) { icq_Packet *p=icq_PacketNew(); if(p) { int type=plink->type; icq_PacketAppend8(p, 0xFF); icq_PacketAppend32(p, ICQ_TCP_VER); if(type==TCP_LINK_MESSAGE) icq_PacketAppend32n(p, htons(plink->icqlink->icq_TCPSrvPort)); else icq_PacketAppend32(p, 0x00000000); icq_PacketAppend32(p, plink->icqlink->icq_Uin); icq_PacketAppend32n(p, htonl(plink->icqlink->icq_OurIP)); icq_PacketAppend32n(p, htonl(plink->icqlink->icq_OurIP)); icq_PacketAppend8(p, 0x04); if(type==TCP_LINK_FILE || type==TCP_LINK_CHAT) icq_PacketAppend32(p, ntohs(plink->socket_address.sin_port)); else icq_PacketAppend32(p, 0x00000000); } return p; } icq_Packet *icq_TCPCreateStdPacket(icq_TCPLink *plink, WORD icq_TCPCommand, WORD type, const unsigned char *msg, WORD status, WORD msg_command) { icq_Packet *p=icq_PacketNew(); if(p) { icq_PacketAppend32(p, plink->icqlink->icq_Uin); icq_PacketAppend16(p, ICQ_TCP_VER); icq_PacketAppend16(p, icq_TCPCommand); icq_PacketAppend16(p, 0x0000); icq_PacketAppend32(p, plink->icqlink->icq_Uin); icq_PacketAppend16(p, type); icq_PacketAppendString(p, (char*)msg); /* FIXME: this should be the address the server returns to us, * link->icq_OurIp */ icq_PacketAppend32(p, plink->socket_address.sin_addr.s_addr); icq_PacketAppend32(p, plink->socket_address.sin_addr.s_addr); icq_PacketAppend32(p, ntohs(plink->socket_address.sin_port)); icq_PacketAppend8(p, 0x04); icq_PacketAppend16(p, status); icq_PacketAppend16(p, msg_command); } return p; } icq_Packet *icq_TCPCreateMessagePacket(icq_TCPLink *plink, const unsigned char *message) { icq_Packet *p=icq_TCPCreateStdPacket( plink, ICQ_TCP_MESSAGE, ICQ_TCP_MSG_MSG, message, 0, /* status */ ICQ_TCP_MSG_REAL); return p; } icq_Packet *icq_TCPCreateURLPacket(icq_TCPLink *plink, const char *message, const char *url) { icq_Packet *p; unsigned char *str=(unsigned char*)malloc(strlen(message)+strlen(url)+2); strcpy((char*)str, message); *(str+strlen(message))=0xFE; strcpy((char*)(str+strlen(message)+1), url); p=icq_TCPCreateStdPacket( plink, ICQ_TCP_MESSAGE, ICQ_TCP_MSG_URL, str, 0, /* status */ ICQ_TCP_MSG_REAL); free(str); return p; } icq_Packet *icq_TCPCreateChatReqPacket(icq_TCPLink *plink, const unsigned char *message) { icq_Packet *p=icq_TCPCreateStdPacket( plink, ICQ_TCP_MESSAGE, ICQ_TCP_MSG_CHAT, message, 0, /* status */ ICQ_TCP_MSG_REAL); icq_PacketAppendString(p, 0); icq_PacketAppend16(p, 0x0000); icq_PacketAppend16(p, 0x0000); icq_PacketAppend32(p, 0x00000000); return p; } icq_Packet *icq_TCPCreateChatReqAck(icq_TCPLink *plink, WORD port) { icq_Packet *p=icq_TCPCreateStdPacket( plink, ICQ_TCP_ACK, ICQ_TCP_MSG_CHAT, 0, 0, /* status */ ICQ_TCP_MSG_ACK); icq_PacketAppendString(p, 0); icq_PacketAppend16(p, htons(port)); icq_PacketAppend16(p, 0x0000); icq_PacketAppend32(p, port); return p; } icq_Packet *icq_TCPCreateChatReqRefuse(icq_TCPLink *plink, WORD port, const char *reason) { icq_Packet *p=icq_TCPCreateStdPacket( plink, ICQ_TCP_ACK, ICQ_TCP_MSG_CHAT, reason, ICQ_TCP_STATUS_REFUSE, ICQ_TCP_MSG_ACK); icq_PacketAppendString(p, 0); icq_PacketAppend16(p, htons(port)); icq_PacketAppend16(p, 0x0000); icq_PacketAppend32(p, port); return p; } icq_Packet *icq_TCPCreateChatReqCancel(icq_TCPLink *plink, WORD port) { icq_Packet *p=icq_TCPCreateStdPacket( plink, ICQ_TCP_CANCEL, ICQ_TCP_MSG_CHAT, 0, 0, /* status */ ICQ_TCP_MSG_ACK); icq_PacketAppendString(p, 0); icq_PacketAppend16(p, htons(port)); icq_PacketAppend16(p, 0x0000); icq_PacketAppend32(p, port); return p; } icq_Packet *icq_TCPCreateFileReqAck(icq_TCPLink *plink, WORD port) { icq_Packet *p=icq_TCPCreateStdPacket( plink, ICQ_TCP_ACK, ICQ_TCP_MSG_FILE, 0, 0, /* status */ ICQ_TCP_MSG_ACK); icq_PacketAppend16(p, htons(port)); icq_PacketAppend16(p, 0x0000); icq_PacketAppendString(p, 0); icq_PacketAppend32(p, 0x00000000); icq_PacketAppend32(p, port); return p; } icq_Packet *icq_TCPCreateFileReqRefuse(icq_TCPLink *plink, WORD port, const char *reason) { icq_Packet *p=icq_TCPCreateStdPacket( plink, ICQ_TCP_ACK, ICQ_TCP_MSG_FILE, reason, ICQ_TCP_STATUS_REFUSE, ICQ_TCP_MSG_ACK); icq_PacketAppend16(p, htons(port)); icq_PacketAppend16(p, 0x0000); icq_PacketAppendString(p, 0); icq_PacketAppend32(p, 0x00000000); icq_PacketAppend32(p, port); return p; } icq_Packet *icq_TCPCreateFileReqCancel(icq_TCPLink *plink, WORD port) { icq_Packet *p=icq_TCPCreateStdPacket( plink, ICQ_TCP_CANCEL, ICQ_TCP_MSG_FILE, 0, 0, /* status */ ICQ_TCP_MSG_ACK); icq_PacketAppend16(p, htons(port)); icq_PacketAppend16(p, 0x0000); icq_PacketAppendString(p, 0); icq_PacketAppend32(p, 0x00000000); icq_PacketAppend32(p, port); return p; } icq_Packet *icq_TCPCreateChatInfoPacket(icq_TCPLink *plink, const char *name, DWORD foreground, DWORD background) { icq_Packet *p=icq_PacketNew(); icq_PacketAppend32(p, 0x00000065); icq_PacketAppend32(p, 0xfffffffa); icq_PacketAppend32(p, plink->icqlink->icq_Uin); icq_PacketAppendString(p, name); icq_PacketAppend16(p, plink->socket_address.sin_port); icq_PacketAppend32(p, foreground); icq_PacketAppend32(p, background); icq_PacketAppend8(p, 0x00); return p; } icq_Packet *icq_TCPCreateChatInfo2Packet(icq_TCPLink *plink, const char *name, DWORD foreground, DWORD background) { icq_Packet *p=icq_PacketNew(); icq_PacketAppend32(p, 0x00000064); icq_PacketAppend32(p, plink->icqlink->icq_Uin); icq_PacketAppendString(p, name); icq_PacketAppend32(p, foreground); icq_PacketAppend32(p, background); icq_PacketAppend32(p, 0x00070004); icq_PacketAppend32(p, 0x00000000); icq_PacketAppend32n(p, htonl(plink->icqlink->icq_OurIP)); icq_PacketAppend32n(p, htonl(plink->icqlink->icq_OurIP)); icq_PacketAppend8(p, 0x04); icq_PacketAppend16(p, 0x0000); icq_PacketAppend32(p, 0x000a); icq_PacketAppend32(p, 0x0000); icq_PacketAppendString(p, "Courier New"); icq_PacketAppend8(p, 204); icq_PacketAppend8(p, 49); icq_PacketAppend8(p, 0x00); return p; } icq_Packet *icq_TCPCreateChatFontInfoPacket(icq_TCPLink *plink) { icq_Packet *p=icq_PacketNew(); icq_PacketAppend32(p, 0x00070004); icq_PacketAppend32(p, 0x00000000); icq_PacketAppend32n(p, htonl(plink->icqlink->icq_OurIP)); icq_PacketAppend32n(p, htonl(plink->icqlink->icq_OurIP)); icq_PacketAppend8(p, 0x04); icq_PacketAppend16(p, ntohs(plink->socket_address.sin_port)); /* Zero ? */ icq_PacketAppend32(p, 0x000a); icq_PacketAppend32(p, 0x0000); icq_PacketAppendString(p, "Courier New"); icq_PacketAppend8(p, 204); icq_PacketAppend8(p, 49); icq_PacketAppend8(p, 0x00); return p; } icq_Packet *icq_TCPCreateFileReqPacket(icq_TCPLink *plink, const char *message, const char *filename, unsigned long size) { icq_Packet *p=icq_TCPCreateStdPacket( plink, ICQ_TCP_MESSAGE, ICQ_TCP_MSG_FILE, (const unsigned char*)message, 0, /* status */ ICQ_TCP_MSG_REAL); icq_PacketAppend16(p, 0x0000); icq_PacketAppend16(p, 0x0000); icq_PacketAppendString(p, filename); icq_PacketAppend32(p, size); icq_PacketAppend32(p, 0x00000000); return p; } void icq_TCPAppendSequence(ICQLINK *link, icq_Packet *p) { p->id=link->d->icq_TCPSequence--; icq_PacketEnd(p); icq_PacketAppend32(p, p->id); } void icq_TCPAppendSequenceN(ICQLINK *link, icq_Packet *p, DWORD seq) { (void)link; p->id=seq; icq_PacketEnd(p); icq_PacketAppend32(p, p->id); } icq_Packet *icq_TCPCreateMessageAck(icq_TCPLink *plink, const unsigned char *message) { icq_Packet *p=icq_TCPCreateStdPacket( plink, ICQ_TCP_ACK, ICQ_TCP_MSG_MSG, message, 0, /* status */ ICQ_TCP_MSG_ACK); return p; } icq_Packet *icq_TCPCreateURLAck(icq_TCPLink *plink, const unsigned char *message) { icq_Packet *p=icq_TCPCreateStdPacket( plink, ICQ_TCP_ACK, ICQ_TCP_MSG_URL, message, 0, /* status */ ICQ_TCP_MSG_ACK); return p; } icq_Packet *icq_TCPCreateContactListAck(icq_TCPLink *plink, const unsigned char *message) { icq_Packet *p=icq_TCPCreateStdPacket( plink, ICQ_TCP_ACK, ICQ_TCP_MSG_CONTACTLIST, message, 0, /* status */ ICQ_TCP_MSG_ACK); return p; } icq_Packet *icq_TCPCreateFile00Packet(DWORD num_files, DWORD total_bytes, DWORD speed, const char *name) { icq_Packet *p=icq_PacketNew(); if(p) { icq_PacketAppend8(p, 0x00); icq_PacketAppend32(p, 0x00000000); icq_PacketAppend32(p, num_files); icq_PacketAppend32(p, total_bytes); icq_PacketAppend32(p, speed); icq_PacketAppendString(p, name); } return p; } icq_Packet *icq_TCPCreateFile01Packet(DWORD speed, const char *name) { icq_Packet *p=icq_PacketNew(); if(p) { icq_PacketAppend8(p, 0x01); icq_PacketAppend32(p, speed); icq_PacketAppendString(p, name); } return p; } icq_Packet *icq_TCPCreateFile02Packet(const char *filename, DWORD filesize, DWORD speed) { icq_Packet *p=icq_PacketNew(); if(p) { icq_PacketAppend8(p, 0x02); icq_PacketAppend8(p, 0x00); icq_PacketAppendString(p, filename); icq_PacketAppendString(p, 0); icq_PacketAppend32(p, filesize); icq_PacketAppend32(p, 0x00000000); icq_PacketAppend32(p, speed); } return p; } icq_Packet *icq_TCPCreateFile03Packet(DWORD filesize, DWORD speed) { icq_Packet *p=icq_PacketNew(); if(p) { icq_PacketAppend8(p, 0x03); icq_PacketAppend32(p, filesize); icq_PacketAppend32(p, 0x00000000); icq_PacketAppend32(p, speed); } return p; } icq_Packet *icq_TCPCreateFile04Packet(DWORD filenum) { icq_Packet *p=icq_PacketNew(); if(p) { icq_PacketAppend8(p, 0x04); icq_PacketAppend32(p, filenum); } return p; } icq_Packet *icq_TCPCreateFile05Packet(DWORD speed) { icq_Packet *p=icq_PacketNew(); if(p) { icq_PacketAppend8(p, 0x05); icq_PacketAppend32(p, speed); } return p; } icq_Packet *icq_TCPCreateFile06Packet(int length, void *data) { icq_Packet *p=icq_PacketNew(); if(p) { icq_PacketAppend8(p, 0x06); icq_PacketAppend(p, data, length); } return p; } icq_Packet *icq_UDPCreateStdPacket(ICQLINK *link, WORD cmd) { icq_Packet *p = icq_PacketNew(); /* if(!link->d->icq_UDPSession) link->d->icq_UDPSession = rand() & 0x3FFFFFFF; if(!link->d->icq_UDPSeqNum2) link->d->icq_UDPSeqNum2 = rand() & 0x7FFF;*/ icq_PacketAppend16(p, ICQ_UDP_VER); /* ver */ icq_PacketAppend32(p, 0); /* zero */ icq_PacketAppend32(p, link->icq_Uin); /* uin */ icq_PacketAppend32(p, link->d->icq_UDPSession); /* session */ icq_PacketAppend16(p, cmd); /* cmd */ icq_PacketAppend16(p, link->d->icq_UDPSeqNum1++); /* seq1 */ icq_PacketAppend16(p, link->d->icq_UDPSeqNum2++); /* seq2 */ icq_PacketAppend32(p, 0); /* checkcode */ return p; } icq_Packet *icq_UDPCreateStdSeqPacket(ICQLINK *link, WORD cmd, WORD seq) { icq_Packet *p = icq_PacketNew(); icq_PacketAppend16(p, ICQ_UDP_VER); /* ver */ icq_PacketAppend32(p, 0); /* zero */ icq_PacketAppend32(p, link->icq_Uin); /* uin */ icq_PacketAppend32(p, link->d->icq_UDPSession); /* session */ icq_PacketAppend16(p, cmd); /* cmd */ icq_PacketAppend16(p, seq); /* seq1 */ icq_PacketAppend16(p, 0); /* seq2 */ icq_PacketAppend32(p, 0); /* checkcode */ return p; }