/* PROTO */ void imcomm_im_send_message(void *handle, const char *whom, const char *msg, int automsg) { pkt_t *packet; packet = pkt_init(28 + strlen(whom) + strlen(msg) + (4 * automsg)); /* * Message cookie? * * Putting something random seems to work. */ pkt_add32(packet, 0x01020304); pkt_add32(packet, 0x05060708); pkt_add16(packet, 0x0001); pkt_add8(packet, (uint8_t) strlen(whom)); pkt_addraw(packet, (uint8_t *) whom, strlen(whom)); pkt_add16(packet, 0x0002); pkt_add16(packet, (uint16_t) (uint16_t) (strlen(msg) + 13)); pkt_add32(packet, 0x05010001); pkt_add8(packet, 0x01); pkt_add16(packet, 0x0101); pkt_add16(packet, (uint16_t) (uint16_t) (strlen(msg) + 4)); pkt_add32(packet, 0x00000000); pkt_addraw(packet, (uint8_t *) msg, strlen(msg)); if (automsg) { pkt_add16(packet, 0x0004); pkt_add16(packet, 0x0000); } snac_sendpkt(handle, 0x04, 0x06, packet, (automsg ? 0 : 1)); pkt_free(packet); }
/* PROTO */ IMCOMM_RET snac_send_cli_update(void *handle) { IMCOMM_RET ret; pkt_t *pkt; /* * This makes the server send us extended status information */ #if 0 pkt = pkt_init(12); pkt_add16(pkt, 0x001d); pkt_add16(pkt, 0x0008); pkt_add32(pkt, 0x00020404); pkt_add32(pkt, 0x00000000); #endif pkt = pkt_init(8); pkt_add16(pkt, 0x0006); pkt_add16(pkt, 0x0004); if (((IMCOMM *) handle)->isinvisible) pkt_add32(pkt, 0x00000100); else pkt_add32(pkt, 0x00000000); ret = snac_sendpkt(handle, 0x01, 0x1e, pkt, 0); pkt_free(pkt); return ret; }
/**************************************************************************** * ow_write_header(struct owctx *ow) * * Write OLE header block. */ void ow_write_header(struct owctx *ow) { int root_start; int num_lists; struct pkt *pkt; int i; if (ow->biff_only) return; ow_calculate_sizes(ow); root_start = ow->root_start; num_lists = ow->list_blocks; pkt = pkt_init(0, VARIABLE_PACKET); pkt_add32(pkt, 0xD0CF11E0); /* OLE document file id part 1 */ pkt_add32(pkt, 0xA1B11AE1); /* OLE document file id part 2 */ pkt_add32_le(pkt, 0x00); /* UID of this file (can be all 0's) 1/4 */ pkt_add32_le(pkt, 0x00); /* UID of this file (can be all 0's) 2/4 */ pkt_add32_le(pkt, 0x00); /* UID of this file (can be all 0's) 3/4 */ pkt_add32_le(pkt, 0x00); /* UID of this file (can be all 0's) 4/4 */ pkt_add16_le(pkt, 0x3E); /* Revision number (almost always 0x003E) */ pkt_add16_le(pkt, 0x03); /* Version number (almost always 0x0003) */ pkt_add16(pkt, 0xFEFF); /* Byte order identifier: * (0xFEFF = Little Endian) * (0xFFFE = Big Endian) */ pkt_add16_le(pkt, 0x09); /* 2^x (9 = 512 bytes) */ pkt_add32_le(pkt, 0x06); /* Unknown 5 */ pkt_add32_le(pkt, 0x00); /* Unknown 5 */ pkt_add32_le(pkt, 0x00); /* Unknown 5 */ pkt_add32_le(pkt, num_lists); /* num_bbd_blocks */ pkt_add32_le(pkt, root_start); /* root_startblock */ pkt_add32_le(pkt, 0x00); /* Unknown 6 */ pkt_add32_le(pkt, 0x1000); /* Unknown 6 */ pkt_add32_le(pkt, -2); /* sbd_startblock */ pkt_add32_le(pkt, 0x00); /* Unknown 7 */ pkt_add32_le(pkt, -2); /* Unknown 7 */ pkt_add32_le(pkt, 0x00); /* Unknown 7 */ for (i = 1; i <= num_lists; i++) { root_start++; pkt_add32_le(pkt, root_start); } for (i = num_lists; i <= 108; i++) { pkt_add32_le(pkt, -1); /* Unused */ } ow->io_handler.write(ow->io_handle,pkt->data, pkt->len); pkt_free(pkt); }
/* PROTO */ IMCOMM_RET snac_send_icbm_params(void *handle, uint16_t channel, uint16_t max_msg_size) { IMCOMM_RET ret; pkt_t *packet; packet = pkt_init(16); pkt_add32(packet, 0x00000000); pkt_add16(packet, 0x000b); pkt_add16(packet, 0x1f40); pkt_add16(packet, ((IMCOMM *) handle)->max_sender_warning); pkt_add16(packet, ((IMCOMM *) handle)->max_receiver_warning); pkt_add32(packet, 0x00000000); ret = snac_sendpkt(handle, 0x04, 0x02, packet, 0); pkt_free(packet); return ret; }
/* PROTO */ IMCOMM_RET multi_ssiact_cliready(void *handle) { struct MultiPacket *multipkt; pkt_t *cliupdpkt; unsigned char cli_ready_packet[] = {0x00, 0x13, 0x00, 0x03, 0x01, 0x10, 0x08, 0xE5, 0x00, 0x0b, 0x00, 0x01, 0x01, 0x10, 0x08, 0xe5, 0x00, 0x0a, 0x00, 0x01, 0x01, 0x10, 0x08, 0xe5, 0x00, 0x09, 0x00, 0x01, 0x01, 0x10, 0x08, 0xe5, 0x00, 0x08, 0x00, 0x01, 0x01, 0x04, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x01, 0x10, 0x08, 0xe5, 0x00, 0x04, 0x00, 0x01, 0x01, 0x10, 0x08, 0xe5, 0x00, 0x03, 0x00, 0x01, 0x01, 0x10, 0x08, 0xe5, 0x00, 0x02, 0x00, 0x01, 0x01, 0x10, 0x08, 0xe5, 0x00, 0x01, 0x00, 0x04, 0x01, 0x10, 0x08, 0xe5 }; multipkt = MultiPktInit(); cliupdpkt = pkt_init(12); pkt_add16(cliupdpkt, 0x001d); pkt_add16(cliupdpkt, 0x0008); pkt_add32(cliupdpkt, 0x00020404); pkt_add32(cliupdpkt, 0x00000000); snac_addToMulti(handle, multipkt, 0x01, 0x1e, cliupdpkt->data, cliupdpkt->len, 0); snac_addToMulti(handle, multipkt, 0x01, 0x02, cli_ready_packet, sizeof(cli_ready_packet), 0); snac_addToMulti(handle, multipkt, 0x13, 0x07, NULL, 0, 0); flap_sendMulti(handle, multipkt); MultiPktFree(multipkt); pkt_free(cliupdpkt); if (((IMCOMM *) handle)->callbacks[IMCOMM_ERROR]) ((IMCOMM *) handle)->callbacks[IMCOMM_ERROR] (handle, IMCOMM_STATUS_CONNECTED); return IMCOMM_RET_OK; }
/* PROTO */ void snac_addToMulti(void *handle, struct MultiPacket * mpkt, uint16_t family, uint16_t subtype, unsigned char *data, uint16_t len, int updateidle) { pkt_t *snac_packet; snac_packet = pkt_init(len + 10); pkt_add16(snac_packet, family); pkt_add16(snac_packet, subtype); pkt_add16(snac_packet, 0); pkt_add32(snac_packet, ((IMCOMM *) handle)->snacreq); pkt_addraw(snac_packet, (uint8_t *) data, len); ((IMCOMM *) handle)->snacreq++; flap_addToMulti(mpkt, 0x02, snac_packet->data, snac_packet->len, updateidle); pkt_free(snac_packet); }
/* PROTO */ IMCOMM_RET snac_send(void *handle, uint16_t family, uint16_t subtype, unsigned char *data, uint16_t len, int updateidle) { pkt_t *snac_packet; IMCOMM_RET ret; if (((IMCOMM *) handle)->srv_pause) return IMCOMM_RET_OK; snac_packet = pkt_init(len + 10); pkt_add16(snac_packet, family); pkt_add16(snac_packet, subtype); pkt_add16(snac_packet, 0); pkt_add32(snac_packet, ((IMCOMM *) handle)->snacreq); pkt_addraw(snac_packet, (uint8_t *) data, len); ((IMCOMM *) handle)->snacreq++; ret = flap_sendpkt(handle, 0x02, snac_packet, updateidle); pkt_free(snac_packet); return ret; }
/* PROTO */ IMCOMM_RET snac_set_location_info(void *handle) { pkt_t *packet; char *idstr = "text/aolrtf; charset=\"iso-8859-1\""; int pktlen = 0; uint8_t capabilities[] = {0x09, 0x46, 0x13, 0x46, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00, 0x09, 0x46, 0x13, 0x4d, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00, 0x09, 0x46, 0x00, 0x00, 0x4c, 0x7f, 0x11, 0xd1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00 }; snac_send_cli_update(handle); if (((IMCOMM *) handle)->profile_str != NULL) pktlen += 8 + strlen(idstr) + strlen((char *) ((IMCOMM *) handle)->profile_str); if (((IMCOMM *) handle)->away_msg != NULL) pktlen += strlen((char *) ((IMCOMM *) handle)->away_msg); packet = pkt_init(pktlen + 10 + 8 + 4 + strlen(idstr) + sizeof(capabilities)); pkt_add16(packet, 0x0001); pkt_add16(packet, (uint16_t) strlen(idstr)); pkt_addraw(packet, (uint8_t *) idstr, strlen(idstr)); if (((IMCOMM *) handle)->profile_str != NULL) { pkt_add16(packet, 0x0002); pkt_add16(packet, (uint16_t) strlen((char *) ((IMCOMM *) handle)-> profile_str)); pkt_addraw(packet, ((IMCOMM *) handle)->profile_str, strlen((char *) ((IMCOMM *) handle)->profile_str)); } pkt_add16(packet, 0x0003); pkt_add16(packet, (uint16_t) strlen(idstr)); pkt_addraw(packet, (uint8_t *) idstr, strlen(idstr)); pkt_add16(packet, 0x0004); if (((IMCOMM *) handle)->away_msg != NULL) { pkt_add16(packet, (uint16_t) strlen((char *) ((IMCOMM *) handle)-> away_msg)); pkt_addraw(packet, ((IMCOMM *) handle)->away_msg, (uint16_t) strlen((char *) ((IMCOMM *) handle)-> away_msg)); } else { pkt_add16(packet, 0x0000); } pkt_add16(packet, 0x0005); pkt_add16(packet, (uint16_t) sizeof(capabilities)); pkt_addraw(packet, capabilities, sizeof(capabilities)); pkt_add16(packet, 0x0006); pkt_add16(packet, 0x0006); pkt_add16(packet, 0x0004); pkt_add32(packet, 0x00020002); snac_sendpkt(handle, 0x02, 0x04, packet, 0); pkt_free(packet); return IMCOMM_RET_OK; }