| 179 |
179 |
| 180 /** |
180 /** |
| 181 * aim_send_im_direct - send IM client-to-client over established connection |
181 * aim_send_im_direct - send IM client-to-client over established connection |
| 182 * @sess: session to conn |
182 * @sess: session to conn |
| 183 * @conn: directim connection |
183 * @conn: directim connection |
| 184 * @msg: null-terminated string to send. |
184 * @msg: null-terminated string to send. |
| |
185 * len: The length of the message to send, including binary data. |
| 185 * |
186 * |
| 186 * Call this just like you would aim_send_im, to send a directim. You |
187 * Call this just like you would aim_send_im, to send a directim. You |
| 187 * _must_ have previously established the directim connection. |
188 * _must_ have previously established the directim connection. |
| 188 */ |
189 */ |
| 189 faim_export int aim_send_im_direct(aim_session_t *sess, aim_conn_t *conn, const char *msg) |
190 faim_export int aim_send_im_direct(aim_session_t *sess, aim_conn_t *conn, const char *msg, int len) |
| 190 { |
191 { |
| 191 struct aim_directim_intdata *intdata = (struct aim_directim_intdata *)conn->internal; |
192 struct aim_directim_intdata *intdata = (struct aim_directim_intdata *)conn->internal; |
| 192 aim_frame_t *fr; |
193 aim_frame_t *fr; |
| 193 aim_bstream_t hdrbs; /* XXX this should be within aim_frame_t */ |
194 aim_bstream_t hdrbs; /* XXX this should be within aim_frame_t */ |
| 194 |
195 |
| 195 if (!sess || !conn || !msg || (conn->type != AIM_CONN_TYPE_RENDEZVOUS)) |
196 if (!sess || !conn || !msg || (conn->type != AIM_CONN_TYPE_RENDEZVOUS)) |
| 196 return -EINVAL; |
197 return -EINVAL; |
| 197 |
198 |
| 198 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_OFT, 0x01, strlen(msg)))) |
199 if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_OFT, 0x01, len))) |
| 199 return -ENOMEM; |
200 return -ENOMEM; |
| 200 |
201 |
| 201 memcpy(fr->hdr.oft.magic, "ODC2", 4); |
202 memcpy(fr->hdr.oft.magic, "ODC2", 4); |
| 202 |
203 |
| 203 fr->hdr.oft.hdr2len = 0x44; |
204 fr->hdr.oft.hdr2len = 0x44; |
| 214 aimbs_putraw(&hdrbs, intdata->cookie, 8); |
215 aimbs_putraw(&hdrbs, intdata->cookie, 8); |
| 215 aimbs_put16(&hdrbs, 0x0000); |
216 aimbs_put16(&hdrbs, 0x0000); |
| 216 aimbs_put16(&hdrbs, 0x0000); |
217 aimbs_put16(&hdrbs, 0x0000); |
| 217 aimbs_put16(&hdrbs, 0x0000); |
218 aimbs_put16(&hdrbs, 0x0000); |
| 218 aimbs_put16(&hdrbs, 0x0000); |
219 aimbs_put16(&hdrbs, 0x0000); |
| 219 aimbs_put32(&hdrbs, strlen(msg)); |
220 aimbs_put32(&hdrbs, len); |
| 220 aimbs_put16(&hdrbs, 0x0000); |
221 aimbs_put16(&hdrbs, 0x0000); |
| 221 aimbs_put16(&hdrbs, 0x0000); |
222 aimbs_put16(&hdrbs, 0x0000); |
| 222 aimbs_put16(&hdrbs, 0x0000); |
223 aimbs_put16(&hdrbs, 0x0000); |
| 223 |
224 |
| 224 /* flags -- 0x000e for "started typing", 0x0002 for "stopped typing, 0x0000 for message */ |
225 /* flags -- 0x000e for "started typing", 0x0002 for "stopped typing, 0x0000 for message */ |
| 249 i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0001); |
250 i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x0001); |
| 250 i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x2e0f); |
251 i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x2e0f); |
| 251 i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x393e); |
252 i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0x393e); |
| 252 i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0xcac8); |
253 i += aimutil_put16(newpacket->hdr.oft.hdr2+i, 0xcac8); |
| 253 #endif |
254 #endif |
| 254 aimbs_putraw(&fr->data, msg, strlen(msg)); |
255 aimbs_putraw(&fr->data, msg, len); |
| 255 |
256 |
| 256 aim_tx_enqueue(sess, fr); |
257 aim_tx_enqueue(sess, fr); |
| 257 |
258 |
| 258 return 0; |
259 return 0; |
| 259 } |
260 } |
| 1119 free(msg); |
1120 free(msg); |
| 1120 return -1; |
1121 return -1; |
| 1121 } |
1122 } |
| 1122 recvd = recvd + i; |
1123 recvd = recvd + i; |
| 1123 msg2 = msg2 + i; |
1124 msg2 = msg2 + i; |
| 1124 if ((userfunc=aim_callhandler(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_DOWNLOADIMAGE))) |
1125 if ((userfunc=aim_callhandler(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER))) |
| 1125 userfunc(sess, &fr, snptr, (double)recvd / payloadlength); |
1126 userfunc(sess, &fr, snptr, (double)recvd / payloadlength); |
| 1126 } |
1127 } |
| 1127 |
1128 |
| 1128 if ( (userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING)) ) |
1129 if ( (userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING)) ) |
| 1129 ret = userfunc(sess, &fr, snptr, msg, payloadlength); |
1130 ret = userfunc(sess, &fr, snptr, msg, payloadlength); |