Mercurial > pidgin
annotate src/protocols/msn/buddyicon.c @ 5718:c19cc2a3d65e
[gaim-migrate @ 6140]
Connecting using the checkbox works again. Sean broke it. Tsk tsk.
committer: Tailor Script <tailor@pidgin.im>
| author | Christian Hammond <chipx86@chipx86.com> |
|---|---|
| date | Tue, 03 Jun 2003 20:25:21 +0000 |
| parents | 187c740f2a4e |
| children | 952710ac6635 |
| rev | line source |
|---|---|
| 5351 | 1 /** |
| 2 * @file buddyicon.c Buddy icon support | |
| 3 * | |
| 4 * gaim | |
| 5 * | |
| 6 * Copyright (C) 2003 Christian Hammond <chipx86@gnupdate.org> | |
| 7 * | |
| 8 * This program is free software; you can redistribute it and/or modify | |
| 9 * it under the terms of the GNU General Public License as published by | |
| 10 * the Free Software Foundation; either version 2 of the License, or | |
| 11 * (at your option) any later version. | |
| 12 * | |
| 13 * This program is distributed in the hope that it will be useful, | |
| 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 16 * GNU General Public License for more details. | |
| 17 * | |
| 18 * You should have received a copy of the GNU General Public License | |
| 19 * along with this program; if not, write to the Free Software | |
| 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 21 */ | |
| 22 #include "msn.h" | |
| 23 #include "buddyicon.h" | |
| 24 | |
| 25 #define PACKET_LENGTH 1500 | |
| 26 | |
|
5355
6a57fd9b45e1
[gaim-migrate @ 5731]
Christian Hammond <chipx86@chipx86.com>
parents:
5351
diff
changeset
|
27 #define MAX_BUDDY_ICON_FILE_SIZE 8192 |
|
6a57fd9b45e1
[gaim-migrate @ 5731]
Christian Hammond <chipx86@chipx86.com>
parents:
5351
diff
changeset
|
28 |
| 5351 | 29 static const char alphabet[] = |
| 30 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" | |
| 31 "0123456789+/"; | |
| 32 | |
| 33 static char * | |
| 34 __base64_enc(const char *data, int len) | |
| 35 { | |
| 36 char *dest; | |
| 37 char *buf; | |
| 38 | |
| 39 buf = dest = g_malloc(4 * len / 3 + 4); | |
| 40 | |
| 41 /* Encode 3 bytes at a time */ | |
| 42 while (len >= 3) { | |
| 43 buf[0] = alphabet[(data[0] >> 2) & 0x3F]; | |
| 44 buf[1] = alphabet[((data[0] << 4) & 0x30) | ((data[1] >> 4) & 0x0F)]; | |
| 45 buf[2] = alphabet[((data[1] << 2) & 0x3C) | ((data[2] >> 6) & 0x03)]; | |
| 46 buf[3] = alphabet[data[2] & 0x3F]; | |
| 47 data += 3; | |
| 48 buf += 4; | |
| 49 len -= 3; | |
| 50 } | |
| 51 | |
| 52 if (len > 0) { | |
| 53 buf[0] = alphabet[(data[0] >> 2) & 0x3F]; | |
| 54 buf[1] = alphabet[(data[0] << 4) & 0x30]; | |
| 55 | |
| 56 if (len > 1) { | |
| 57 buf[1] += (data[1] >> 4) & 0x0F; | |
| 58 buf[2] = alphabet[(data[1] << 2) & 0x3C]; | |
| 59 } | |
| 60 | |
| 61 else | |
| 62 buf[2] = '='; | |
| 63 | |
| 64 buf[3] = '='; | |
| 65 buf += 4; | |
| 66 } | |
| 67 | |
| 68 *buf = '\0'; | |
| 69 | |
| 70 return dest; | |
| 71 } | |
| 72 | |
| 73 static gboolean | |
|
5564
187c740f2a4e
[gaim-migrate @ 5966]
Christian Hammond <chipx86@chipx86.com>
parents:
5506
diff
changeset
|
74 __get_buddy_icon_info(GaimAccount *account, char **base64, |
| 5351 | 75 char **md5sum, int *file_size, int *base64_size) |
| 76 { | |
| 77 FILE *fp; | |
| 78 struct stat sb; | |
| 79 md5_state_t st; | |
| 80 md5_byte_t di[16]; | |
|
5564
187c740f2a4e
[gaim-migrate @ 5966]
Christian Hammond <chipx86@chipx86.com>
parents:
5506
diff
changeset
|
81 const char *icon; |
| 5351 | 82 |
| 83 if (base64 != NULL) *base64 = NULL; | |
| 84 if (md5sum != NULL) *md5sum = NULL; | |
| 85 if (file_size != NULL) *file_size = 0; | |
| 86 if (base64_size != NULL) *base64_size = 0; | |
| 87 | |
|
5564
187c740f2a4e
[gaim-migrate @ 5966]
Christian Hammond <chipx86@chipx86.com>
parents:
5506
diff
changeset
|
88 icon = gaim_account_get_buddy_icon(account); |
|
187c740f2a4e
[gaim-migrate @ 5966]
Christian Hammond <chipx86@chipx86.com>
parents:
5506
diff
changeset
|
89 |
|
187c740f2a4e
[gaim-migrate @ 5966]
Christian Hammond <chipx86@chipx86.com>
parents:
5506
diff
changeset
|
90 if (!stat(icon, &sb)) { |
| 5351 | 91 if (file_size != NULL) |
| 92 *file_size = sb.st_size; | |
| 93 | |
|
5564
187c740f2a4e
[gaim-migrate @ 5966]
Christian Hammond <chipx86@chipx86.com>
parents:
5506
diff
changeset
|
94 if ((fp = fopen(icon, "rb")) != NULL) { |
| 5351 | 95 char *buf = g_malloc(sb.st_size + 1); |
| 96 char *temp; | |
| 97 | |
| 98 fread(buf, 1, sb.st_size, fp); | |
| 99 | |
| 100 buf[sb.st_size] = '\0'; | |
| 101 | |
| 102 temp = __base64_enc(buf, sb.st_size); | |
| 103 | |
| 104 if (base64_size != NULL) | |
| 105 *base64_size = strlen(temp); | |
| 106 | |
| 107 if (base64 != NULL) | |
| 108 *base64 = temp; | |
| 109 else | |
| 110 g_free(temp); | |
| 111 | |
| 112 if (md5sum != NULL) { | |
| 113 char buf2[3]; | |
| 114 int i; | |
| 115 | |
| 116 md5_init(&st); | |
| 117 md5_append(&st, (const md5_byte_t *)buf, sb.st_size); | |
| 118 md5_finish(&st, di); | |
| 119 | |
| 120 *md5sum = g_new0(char, 33); | |
| 121 | |
| 122 for (i = 0; i < 16; i++) { | |
| 123 g_snprintf(buf2, sizeof(buf2), "%02x", di[i]); | |
| 124 strcat(*md5sum, buf2); | |
| 125 } | |
| 126 } | |
| 127 | |
| 128 g_free(buf); | |
| 129 | |
| 130 fclose(fp); | |
| 131 } | |
| 132 else { | |
| 133 gaim_debug(GAIM_DEBUG_ERROR, "msn", | |
| 134 "Cannot open buddy icon file!\n"); | |
| 135 | |
| 136 return FALSE; | |
| 137 } | |
| 138 } | |
| 139 | |
| 140 return TRUE; | |
| 141 } | |
| 142 | |
| 143 static gboolean | |
| 144 __send_icon_data(MsnSwitchBoard *swboard, MsnBuddyIconXfer *buddyicon) | |
| 145 { | |
|
5564
187c740f2a4e
[gaim-migrate @ 5966]
Christian Hammond <chipx86@chipx86.com>
parents:
5506
diff
changeset
|
146 GaimConnection *gc = swboard->servconn->session->account->gc; |
| 5351 | 147 char buf[MSN_BUF_LEN]; |
| 148 MsnMessage *msg; | |
| 149 int len; | |
| 150 | |
| 151 len = MIN(PACKET_LENGTH - 4, | |
| 152 buddyicon->total_size - buddyicon->bytes_xfer); | |
| 153 | |
| 154 strcpy(buf, "ICON"); | |
| 155 | |
| 156 strncat(buf, buddyicon->data + buddyicon->bytes_xfer, len); | |
| 157 | |
| 158 msg = msn_message_new(); | |
| 159 msn_message_set_content_type(msg, "application/x-buddyicon"); | |
| 160 msn_message_set_receiver(msg, buddyicon->user); | |
| 161 msn_message_set_charset(msg, NULL); | |
| 162 msn_message_set_attr(msg, "User-Agent", NULL); | |
| 163 | |
| 164 msn_message_set_body(msg, buf); | |
| 165 | |
| 166 if (!msn_switchboard_send_msg(swboard, msg)) { | |
| 167 msn_message_destroy(msg); | |
| 168 | |
| 169 msn_buddy_icon_xfer_destroy(swboard->buddy_icon_xfer); | |
| 170 swboard->buddy_icon_xfer = NULL; | |
| 171 | |
|
5564
187c740f2a4e
[gaim-migrate @ 5966]
Christian Hammond <chipx86@chipx86.com>
parents:
5506
diff
changeset
|
172 gaim_connection_error(gc, _("Write error")); |
| 5351 | 173 |
| 174 return FALSE; | |
| 175 } | |
| 176 | |
| 177 msn_message_destroy(msg); | |
| 178 | |
| 179 buddyicon->bytes_xfer += len; | |
| 180 | |
| 181 if (buddyicon->bytes_xfer == buddyicon->total_size) { | |
| 182 msg = msn_message_new(); | |
| 183 msn_message_set_content_type(msg, "application/x-buddyicon"); | |
| 184 msn_message_set_receiver(msg, buddyicon->user); | |
| 185 msn_message_set_charset(msg, NULL); | |
| 186 msn_message_set_attr(msg, "User-Agent", NULL); | |
| 187 | |
| 188 msn_message_set_body(msg, "Command: COMPLETE\r\n"); | |
| 189 | |
| 190 msn_switchboard_send_msg(swboard, msg); | |
| 191 | |
| 192 msn_buddy_icon_xfer_destroy(swboard->buddy_icon_xfer); | |
| 193 swboard->buddy_icon_xfer = NULL; | |
| 194 } | |
| 195 | |
| 196 return TRUE; | |
| 197 } | |
| 198 | |
| 199 static gboolean | |
| 200 __process_invite(MsnServConn *servconn, const MsnMessage *msg) | |
| 201 { | |
| 202 MsnSession *session = servconn->session; | |
|
5564
187c740f2a4e
[gaim-migrate @ 5966]
Christian Hammond <chipx86@chipx86.com>
parents:
5506
diff
changeset
|
203 GaimConnection *gc = session->account->gc; |
| 5351 | 204 MsnMessage *new_msg; |
| 205 MsnSwitchBoard *swboard; | |
| 206 MsnBuddyIconXfer *buddyicon; | |
| 207 struct buddy *b; | |
| 208 GHashTable *table; | |
| 209 const char *command; | |
| 210 | |
| 211 table = msn_message_get_hashtable_from_body(msg); | |
| 212 | |
| 213 command = g_hash_table_lookup(table, "Command"); | |
| 214 | |
| 215 if (command == NULL) { | |
| 216 gaim_debug(GAIM_DEBUG_ERROR, "msn", | |
| 217 "Missing Command from buddy icon message.\n"); | |
| 218 return TRUE; | |
| 219 } | |
| 220 | |
| 221 if (!strcmp(command, "INVITE")) { | |
| 222 MsnUser *user; | |
| 223 const char *md5sum = g_hash_table_lookup(table, "MD5SUM"); | |
| 224 const char *size_s = g_hash_table_lookup(table, "File-Size"); | |
| 225 const char *base64_size_s = g_hash_table_lookup(table, "Base64-Size"); | |
| 226 const char *passport; | |
| 227 | |
| 228 if (md5sum == NULL) { | |
| 229 gaim_debug(GAIM_DEBUG_ERROR, "msn", | |
| 230 "Missing MD5SUM from buddy icon message.\n"); | |
| 231 | |
| 232 return TRUE; | |
| 233 } | |
| 234 | |
| 235 if (size_s == NULL) { | |
| 236 gaim_debug(GAIM_DEBUG_ERROR, "msn", | |
| 237 "Missing File-Size from buddy icon message.\n"); | |
| 238 | |
| 239 return TRUE; | |
| 240 } | |
| 241 | |
| 242 if (base64_size_s == NULL) { | |
| 243 gaim_debug(GAIM_DEBUG_ERROR, "msn", | |
| 244 "Missing Bas64-Size from buddy icon message.\n"); | |
| 245 | |
| 246 return TRUE; | |
| 247 } | |
| 248 | |
|
5355
6a57fd9b45e1
[gaim-migrate @ 5731]
Christian Hammond <chipx86@chipx86.com>
parents:
5351
diff
changeset
|
249 if (atoi(size_s) > MAX_BUDDY_ICON_FILE_SIZE) { |
|
6a57fd9b45e1
[gaim-migrate @ 5731]
Christian Hammond <chipx86@chipx86.com>
parents:
5351
diff
changeset
|
250 gaim_debug(GAIM_DEBUG_ERROR, "msn", |
|
6a57fd9b45e1
[gaim-migrate @ 5731]
Christian Hammond <chipx86@chipx86.com>
parents:
5351
diff
changeset
|
251 "User tried to send a buddy icon over 8KB! " |
|
6a57fd9b45e1
[gaim-migrate @ 5731]
Christian Hammond <chipx86@chipx86.com>
parents:
5351
diff
changeset
|
252 "Not accepting."); |
|
6a57fd9b45e1
[gaim-migrate @ 5731]
Christian Hammond <chipx86@chipx86.com>
parents:
5351
diff
changeset
|
253 return TRUE; |
|
6a57fd9b45e1
[gaim-migrate @ 5731]
Christian Hammond <chipx86@chipx86.com>
parents:
5351
diff
changeset
|
254 } |
|
6a57fd9b45e1
[gaim-migrate @ 5731]
Christian Hammond <chipx86@chipx86.com>
parents:
5351
diff
changeset
|
255 |
| 5351 | 256 user = msn_message_get_sender(msg); |
| 257 | |
| 258 passport = msn_user_get_passport(user); | |
| 259 | |
| 260 /* See if we actually need a new icon. */ | |
| 261 if ((b = gaim_find_buddy(gc->account, passport)) != NULL) { | |
| 262 const char *cur_md5sum; | |
| 263 | |
| 264 cur_md5sum = gaim_buddy_get_setting(b, "icon_checksum"); | |
| 265 | |
| 266 if (cur_md5sum != NULL && !strcmp(cur_md5sum, md5sum)) | |
| 267 return TRUE; | |
| 268 } | |
| 269 | |
| 270 /* Send a request for transfer. */ | |
| 271 new_msg = msn_message_new(); | |
| 272 msn_message_set_content_type(new_msg, "application/x-buddyicon"); | |
| 273 msn_message_set_receiver(new_msg, user); | |
| 274 msn_message_set_charset(new_msg, NULL); | |
| 275 msn_message_set_attr(new_msg, "User-Agent", NULL); | |
| 276 | |
| 277 msn_message_set_body(new_msg, "Command: REQUEST\r\n"); | |
| 278 | |
| 279 if ((swboard = msn_session_open_switchboard(session)) == NULL) { | |
| 280 msn_message_destroy(new_msg); | |
| 281 | |
|
5564
187c740f2a4e
[gaim-migrate @ 5966]
Christian Hammond <chipx86@chipx86.com>
parents:
5506
diff
changeset
|
282 gaim_connection_error(gc, _("Write error")); |
| 5351 | 283 |
| 284 return FALSE; | |
| 285 } | |
| 286 | |
| 287 swboard->hidden = TRUE; | |
| 288 msn_switchboard_set_user(swboard, user); | |
| 289 msn_switchboard_send_msg(swboard, new_msg); | |
| 290 | |
| 291 msn_message_destroy(new_msg); | |
| 292 | |
| 293 buddyicon = swboard->buddy_icon_xfer = msn_buddy_icon_xfer_new(); | |
| 294 | |
| 295 buddyicon->user = user; | |
| 296 msn_user_ref(buddyicon->user); | |
| 297 | |
| 298 buddyicon->md5sum = g_strdup(md5sum); | |
| 299 buddyicon->total_size = atoi(base64_size_s); | |
| 300 buddyicon->file_size = atoi(size_s); | |
| 301 | |
| 302 buddyicon->data = g_malloc(buddyicon->total_size + 1); | |
| 303 } | |
| 304 else if (!strcmp(command, "REQUEST")) { | |
| 305 swboard = (MsnSwitchBoard *)servconn->data; | |
| 306 | |
| 307 swboard->hidden = TRUE; | |
| 308 | |
| 309 swboard->buddy_icon_xfer = buddyicon = msn_buddy_icon_xfer_new(); | |
| 310 | |
| 311 if (!__get_buddy_icon_info(gc->account, | |
| 312 &buddyicon->data, | |
| 313 &buddyicon->md5sum, | |
| 314 &buddyicon->file_size, | |
| 315 &buddyicon->total_size)) { | |
| 316 | |
| 317 msn_buddy_icon_xfer_destroy(buddyicon); | |
| 318 | |
| 319 new_msg = msn_message_new(); | |
| 320 msn_message_set_content_type(new_msg, "application/x-buddyicon"); | |
| 321 msn_message_set_receiver(new_msg, msn_message_get_sender(msg)); | |
| 322 msn_message_set_charset(new_msg, NULL); | |
| 323 msn_message_set_attr(new_msg, "User-Agent", NULL); | |
| 324 | |
| 325 msn_message_set_body(new_msg, "Command: CANCEL\r\n"); | |
| 326 | |
| 327 if ((swboard = msn_session_open_switchboard(session)) == NULL) { | |
| 328 msn_message_destroy(new_msg); | |
| 329 | |
|
5564
187c740f2a4e
[gaim-migrate @ 5966]
Christian Hammond <chipx86@chipx86.com>
parents:
5506
diff
changeset
|
330 gaim_connection_error(gc, _("Write error")); |
| 5351 | 331 |
| 332 return FALSE; | |
| 333 } | |
| 334 | |
| 335 swboard->hidden = TRUE; | |
| 336 | |
| 337 msn_switchboard_send_msg(swboard, new_msg); | |
| 338 | |
| 339 msn_message_destroy(new_msg); | |
| 340 | |
| 341 msn_switchboard_destroy(swboard); | |
| 342 } | |
| 343 | |
| 344 return __send_icon_data(swboard, buddyicon); | |
| 345 } | |
| 346 else if (!strcmp(command, "ACK")) { | |
| 347 swboard = (MsnSwitchBoard *)servconn->data; | |
| 348 | |
| 349 buddyicon = swboard->buddy_icon_xfer; | |
| 350 | |
| 351 if (buddyicon != NULL) | |
| 352 return __send_icon_data(swboard, buddyicon); | |
| 353 } | |
| 354 else if (!strcmp(command, "COMPLETE")) { | |
| 355 const char *passport; | |
| 356 char *icon; | |
| 357 int icon_len; | |
| 358 | |
| 359 swboard = (MsnSwitchBoard *)servconn->data; | |
| 360 | |
| 361 buddyicon = swboard->buddy_icon_xfer; | |
| 362 | |
| 363 passport = msn_user_get_passport(buddyicon->user); | |
| 364 swboard->hidden = TRUE; | |
| 365 | |
| 366 frombase64(buddyicon->data, &icon, &icon_len); | |
| 367 | |
| 368 if ((b = gaim_find_buddy(gc->account, passport)) != NULL) { | |
| 369 gaim_buddy_set_setting(b, "icon_checksum", buddyicon->md5sum); | |
| 370 gaim_blist_save(); | |
| 371 } | |
| 372 | |
| 373 set_icon_data(gc, passport, icon, icon_len); | |
| 374 | |
| 375 g_free(icon); | |
| 376 | |
| 377 msn_buddy_icon_xfer_destroy(swboard->buddy_icon_xfer); | |
| 378 swboard->buddy_icon_xfer = NULL; | |
| 379 | |
| 380 msn_switchboard_destroy(swboard); | |
| 381 } | |
| 382 else if (!strcmp(command, "CANCEL")) { | |
| 383 swboard = (MsnSwitchBoard *)servconn->data; | |
| 384 | |
| 385 msn_buddy_icon_xfer_destroy(swboard->buddy_icon_xfer); | |
| 386 swboard->buddy_icon_xfer = NULL; | |
| 387 | |
| 388 msn_switchboard_destroy(swboard); | |
| 389 } | |
| 390 else { | |
| 391 gaim_debug(GAIM_DEBUG_ERROR, "msn", | |
| 392 "Unknown buddy icon message command: %s\n", command); | |
| 393 } | |
| 394 | |
| 395 return TRUE; | |
| 396 } | |
| 397 | |
| 398 static gboolean | |
| 399 __process_data(MsnServConn *servconn, const MsnMessage *msg) | |
| 400 { | |
|
5564
187c740f2a4e
[gaim-migrate @ 5966]
Christian Hammond <chipx86@chipx86.com>
parents:
5506
diff
changeset
|
401 GaimConnection *gc = servconn->session->account->gc; |
| 5351 | 402 MsnSwitchBoard *swboard; |
| 403 MsnBuddyIconXfer *buddyicon; | |
| 404 MsnMessage *ack_msg; | |
| 405 const char *data; | |
| 406 int len; | |
| 407 | |
| 408 swboard = (MsnSwitchBoard *)servconn->data; | |
| 409 buddyicon = swboard->buddy_icon_xfer; | |
| 410 | |
| 411 data = msn_message_get_body(msg) + 4; | |
| 412 | |
| 413 len = strlen(data); | |
| 414 | |
| 415 /* Copy the data into our buffer. */ | |
| 416 strncpy(buddyicon->data + buddyicon->bytes_xfer, data, | |
| 417 buddyicon->total_size - buddyicon->bytes_xfer); | |
| 418 | |
| 419 buddyicon->bytes_xfer += len; | |
| 420 | |
| 421 /* Acknowledge this data. */ | |
| 422 ack_msg = msn_message_new(); | |
| 423 msn_message_set_content_type(ack_msg, "application/x-buddyicon"); | |
| 424 msn_message_set_receiver(ack_msg, msn_message_get_sender(msg)); | |
| 425 msn_message_set_charset(ack_msg, NULL); | |
| 426 msn_message_set_attr(ack_msg, "User-Agent", NULL); | |
| 427 msn_message_set_body(ack_msg, "Command: ACK\r\n"); | |
| 428 | |
| 429 if (!msn_switchboard_send_msg(swboard, ack_msg)) { | |
| 430 msn_message_destroy(ack_msg); | |
| 431 | |
| 432 msn_buddy_icon_xfer_destroy(swboard->buddy_icon_xfer); | |
| 433 swboard->buddy_icon_xfer = NULL; | |
| 434 | |
|
5564
187c740f2a4e
[gaim-migrate @ 5966]
Christian Hammond <chipx86@chipx86.com>
parents:
5506
diff
changeset
|
435 gaim_connection_error(gc, _("Write error")); |
| 5351 | 436 |
| 437 return FALSE; | |
| 438 } | |
| 439 | |
| 440 msn_message_destroy(ack_msg); | |
| 441 | |
| 442 return TRUE; | |
| 443 } | |
| 444 | |
| 445 MsnBuddyIconXfer * | |
| 446 msn_buddy_icon_xfer_new(void) | |
| 447 { | |
| 448 return g_new0(MsnBuddyIconXfer, 1); | |
| 449 } | |
| 450 | |
| 451 void | |
| 452 msn_buddy_icon_xfer_destroy(MsnBuddyIconXfer *xfer) | |
| 453 { | |
| 454 g_return_if_fail(xfer != NULL); | |
| 455 | |
| 456 if (xfer->user != NULL) | |
| 457 msn_user_unref(xfer->user); | |
| 458 | |
| 459 if (xfer->data != NULL) | |
| 460 g_free(xfer->data); | |
| 461 | |
| 462 g_free(xfer); | |
| 463 } | |
| 464 | |
| 465 gboolean | |
|
5506
4f72b611f0ee
[gaim-migrate @ 5905]
Christian Hammond <chipx86@chipx86.com>
parents:
5355
diff
changeset
|
466 msn_buddy_icon_msg(MsnServConn *servconn, MsnMessage *msg) |
| 5351 | 467 { |
| 468 if (!strncmp(msn_message_get_body(msg), "ICON", 4)) | |
| 469 return __process_data(servconn, msg); | |
| 470 else | |
| 471 return __process_invite(servconn, msg); | |
| 472 } | |
| 473 | |
| 474 void | |
| 475 msn_buddy_icon_invite(MsnSwitchBoard *swboard) | |
| 476 { | |
|
5564
187c740f2a4e
[gaim-migrate @ 5966]
Christian Hammond <chipx86@chipx86.com>
parents:
5506
diff
changeset
|
477 GaimAccount *account = swboard->servconn->session->account; |
|
187c740f2a4e
[gaim-migrate @ 5966]
Christian Hammond <chipx86@chipx86.com>
parents:
5506
diff
changeset
|
478 GaimConnection *gc = account->gc; |
| 5351 | 479 MsnMessage *msg; |
| 480 char buf[MSN_BUF_LEN]; | |
| 481 char *md5sum; | |
| 482 int file_size, base64_size; | |
| 483 | |
| 484 g_return_if_fail(swboard != NULL); | |
| 485 | |
|
5564
187c740f2a4e
[gaim-migrate @ 5966]
Christian Hammond <chipx86@chipx86.com>
parents:
5506
diff
changeset
|
486 if (gaim_account_get_buddy_icon(account) == NULL) |
| 5351 | 487 return; /* We don't have an icon to send. */ |
| 488 | |
| 489 if (!__get_buddy_icon_info(account, NULL, &md5sum, | |
| 490 &file_size, &base64_size)) { | |
| 491 return; | |
| 492 } | |
| 493 | |
|
5355
6a57fd9b45e1
[gaim-migrate @ 5731]
Christian Hammond <chipx86@chipx86.com>
parents:
5351
diff
changeset
|
494 if (file_size > MAX_BUDDY_ICON_FILE_SIZE) { |
|
6a57fd9b45e1
[gaim-migrate @ 5731]
Christian Hammond <chipx86@chipx86.com>
parents:
5351
diff
changeset
|
495 gaim_debug(GAIM_DEBUG_ERROR, "msn", |
|
6a57fd9b45e1
[gaim-migrate @ 5731]
Christian Hammond <chipx86@chipx86.com>
parents:
5351
diff
changeset
|
496 "The buddy icon is too large to send. Must be no more " |
|
6a57fd9b45e1
[gaim-migrate @ 5731]
Christian Hammond <chipx86@chipx86.com>
parents:
5351
diff
changeset
|
497 "than %d bytes!\n", MAX_BUDDY_ICON_FILE_SIZE); |
|
6a57fd9b45e1
[gaim-migrate @ 5731]
Christian Hammond <chipx86@chipx86.com>
parents:
5351
diff
changeset
|
498 return; |
|
6a57fd9b45e1
[gaim-migrate @ 5731]
Christian Hammond <chipx86@chipx86.com>
parents:
5351
diff
changeset
|
499 } |
|
6a57fd9b45e1
[gaim-migrate @ 5731]
Christian Hammond <chipx86@chipx86.com>
parents:
5351
diff
changeset
|
500 |
| 5351 | 501 msg = msn_message_new(); |
| 502 msn_message_set_content_type(msg, "application/x-buddyicon"); | |
| 503 msn_message_set_receiver(msg, msn_message_get_sender(msg)); | |
| 504 msn_message_set_charset(msg, NULL); | |
| 505 msn_message_set_attr(msg, "User-Agent", NULL); | |
| 506 | |
| 507 g_snprintf(buf, sizeof(buf), | |
| 508 "Command: INVITE\r\n" | |
| 509 "MD5SUM: %s\r\n" | |
| 510 "File-Size: %d\r\n" | |
| 511 "Base64-Size: %d\r\n", | |
| 512 md5sum, file_size, base64_size); | |
| 513 | |
| 514 g_free(md5sum); | |
| 515 | |
| 516 msn_message_set_body(msg, buf); | |
| 517 | |
| 518 if (!msn_switchboard_send_msg(swboard, msg)) { | |
| 519 msn_message_destroy(msg); | |
| 520 | |
|
5564
187c740f2a4e
[gaim-migrate @ 5966]
Christian Hammond <chipx86@chipx86.com>
parents:
5506
diff
changeset
|
521 gaim_connection_error(gc, _("Write error")); |
| 5351 | 522 |
| 523 return; | |
| 524 } | |
| 525 | |
| 526 msn_message_destroy(msg); | |
| 527 } |
