# HG changeset patch # User Richard Laager # Date 1177345684 0 # Node ID 7873f314fadfacccb2b06410bb48443b8d706f36 # Parent 00a4de6880da5a4bcd034ff0c2b06bbfa5800a1b Patch in Trac ticket #113 from Simom. "Continued from patch #1693706 in SF tracker: Newer Live Messenger -versions doesn't always send SHA1C-field in msnobj's and so Pidgin discards them. This new version of patch uses sha1c as icon checksum if it exists, otherwise it falls back to using sha1d, as datallah suggested." diff -r 00a4de6880da -r 7873f314fadf libpurple/protocols/msn/object.c --- a/libpurple/protocols/msn/object.c Mon Apr 09 13:02:46 2007 +0000 +++ b/libpurple/protocols/msn/object.c Mon Apr 23 16:28:04 2007 +0000 @@ -92,9 +92,10 @@ GET_STRING_TAG(sha1c, "SHA1C"); /* If we are missing any of the required elements then discard the object */ + /* SHA1C is not always sent anymore */ if (obj->creator == NULL || obj->size == 0 || obj->type == 0 || obj->location == NULL || obj->friendly == NULL - || obj->sha1d == NULL || obj->sha1c == NULL) { + || obj->sha1d == NULL /*|| obj->sha1c == NULL*/) { purple_debug_error("msn", "Discarding invalid msnobj: '%s'\n", str); msn_object_destroy(obj); obj = NULL; @@ -274,18 +275,30 @@ return obj->sha1c; } +const char * +msn_object_get_sha1(const MsnObject *obj) +{ + g_return_val_if_fail(obj != NULL, NULL); + + if(obj->sha1c != NULL) { + return obj->sha1c; + } else { + return obj->sha1d; + } +} + static MsnObject * -msn_object_find_local(const char *sha1c) +msn_object_find_local(const char *sha1) { GList *l; - g_return_val_if_fail(sha1c != NULL, NULL); + g_return_val_if_fail(sha1 != NULL, NULL); for (l = local_objs; l != NULL; l = l->next) { MsnObject *local_obj = l->data; - if (!strcmp(msn_object_get_sha1c(local_obj), sha1c)) + if (!strcmp(msn_object_get_sha1(local_obj), sha1)) return local_obj; } @@ -324,7 +337,7 @@ g_return_val_if_fail(obj != NULL, NULL); - local_obj = msn_object_find_local(msn_object_get_sha1c(obj)); + local_obj = msn_object_find_local(msn_object_get_sha1(obj)); if (local_obj != NULL) return local_obj->real_location; diff -r 00a4de6880da -r 7873f314fadf libpurple/protocols/msn/object.h --- a/libpurple/protocols/msn/object.h Mon Apr 09 13:02:46 2007 +0000 +++ b/libpurple/protocols/msn/object.h Mon Apr 23 16:28:04 2007 +0000 @@ -196,6 +196,15 @@ */ const char *msn_object_get_sha1c(const MsnObject *obj); +/** + * Returns a MsnObject's SHA1C value if it exists, otherwise SHA1D. + * + * @param obj The object. + * + * @return The SHA1C value. + */ +const char *msn_object_get_sha1(const MsnObject *obj); + void msn_object_set_local(MsnObject *obj); const char *msn_object_get_real_location(const MsnObject *obj); void msn_object_set_real_location(MsnObject *obj, diff -r 00a4de6880da -r 7873f314fadf libpurple/protocols/msn/slp.c --- a/libpurple/protocols/msn/slp.c Mon Apr 09 13:02:46 2007 +0000 +++ b/libpurple/protocols/msn/slp.c Mon Apr 23 16:28:04 2007 +0000 @@ -793,7 +793,7 @@ MsnObject *obj; char **tokens; char *smile, *body_str; - const char *body, *who, *sha1c; + const char *body, *who, *sha1; guint tok; size_t body_len; @@ -825,7 +825,7 @@ break; who = msn_object_get_creator(obj); - sha1c = msn_object_get_sha1c(obj); + sha1 = msn_object_get_sha1(obj); slplink = msn_session_get_slplink(session, who); @@ -842,14 +842,14 @@ conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, session->account, who); } - if (purple_conv_custom_smiley_add(conv, smile, "sha1", sha1c, TRUE)) { + if (purple_conv_custom_smiley_add(conv, smile, "sha1", sha1, TRUE)) { msn_slplink_request_object(slplink, smile, got_emoticon, NULL, obj); } msn_object_destroy(obj); obj = NULL; who = NULL; - sha1c = NULL; + sha1 = NULL; } g_strfreev(tokens); } @@ -871,7 +871,7 @@ return FALSE; old = purple_blist_node_get_string((PurpleBlistNode *)buddy, "icon_checksum"); - new = msn_object_get_sha1c(obj); + new = msn_object_get_sha1(obj); if (new == NULL) return FALSE; @@ -1090,7 +1090,7 @@ obj = msn_user_get_object(user); - info = msn_object_get_sha1c(obj); + info = msn_object_get_sha1(obj); if (g_ascii_strcasecmp(user->passport, purple_account_get_username(account)))