Mercurial > pidgin.yaz
comparison libpurple/protocols/msn/msn.c @ 23131:ac567757d236
propagate from branch 'im.pidgin.pidgin' (head 6be4a11c3e1bf403bbb6e1a7a754e4b99e7d9a44)
to branch 'im.pidgin.pidgin.custom_smiley' (head fb801dc3cb44bc81a383a9e0a44ba099a3e99d1e)
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Wed, 07 May 2008 03:32:43 +0000 |
parents | 05cb3f04c01e b30f54a72031 |
children | 9aa105267f46 |
comparison
equal
deleted
inserted
replaced
22832:4409f8a0d7aa | 23131:ac567757d236 |
---|---|
30 #include "msg.h" | 30 #include "msg.h" |
31 #include "page.h" | 31 #include "page.h" |
32 #include "pluginpref.h" | 32 #include "pluginpref.h" |
33 #include "prefs.h" | 33 #include "prefs.h" |
34 #include "session.h" | 34 #include "session.h" |
35 #include "smiley.h" | |
35 #include "state.h" | 36 #include "state.h" |
36 #include "util.h" | 37 #include "util.h" |
37 #include "cmds.h" | 38 #include "cmds.h" |
38 #include "core.h" | 39 #include "core.h" |
39 #include "prpl.h" | 40 #include "prpl.h" |
80 char *msg; | 81 char *msg; |
81 PurpleMessageFlags flags; | 82 PurpleMessageFlags flags; |
82 time_t when; | 83 time_t when; |
83 } MsnIMData; | 84 } MsnIMData; |
84 | 85 |
86 typedef struct | |
87 { | |
88 char *smile; | |
89 MsnObject *obj; | |
90 } MsnEmoticon; | |
91 | |
85 static const char * | 92 static const char * |
86 msn_normalize(const PurpleAccount *account, const char *str) | 93 msn_normalize(const PurpleAccount *account, const char *str) |
87 { | 94 { |
88 static char buf[BUF_LEN]; | 95 static char buf[BUF_LEN]; |
89 char *tmp; | 96 char *tmp; |
113 | 120 |
114 if (swboard == NULL) | 121 if (swboard == NULL) |
115 return FALSE; | 122 return FALSE; |
116 | 123 |
117 msn_switchboard_send_msg(swboard, msg, TRUE); | 124 msn_switchboard_send_msg(swboard, msg, TRUE); |
125 msn_message_destroy(msg); | |
118 | 126 |
119 return TRUE; | 127 return TRUE; |
120 } | 128 } |
121 | 129 |
122 static GList * | 130 static GList * |
923 g_free(imdata->msg); | 931 g_free(imdata->msg); |
924 g_free(imdata); | 932 g_free(imdata); |
925 return FALSE; | 933 return FALSE; |
926 } | 934 } |
927 | 935 |
936 static GString* | |
937 msn_msg_emoticon_add(GString *current, MsnEmoticon *emoticon) | |
938 { | |
939 MsnObject *obj; | |
940 char *strobj; | |
941 | |
942 if (emoticon == NULL) | |
943 return current; | |
944 | |
945 obj = emoticon->obj; | |
946 | |
947 if (!obj) | |
948 return current; | |
949 | |
950 strobj = msn_object_to_string(obj); | |
951 | |
952 if (current) | |
953 g_string_append_printf(current, "\t%s\t%s", | |
954 emoticon->smile, strobj); | |
955 else { | |
956 current = g_string_new(""); | |
957 g_string_printf(current,"%s\t%s", | |
958 emoticon->smile, strobj); | |
959 } | |
960 | |
961 g_free(strobj); | |
962 | |
963 return current; | |
964 } | |
965 | |
966 static void | |
967 msn_send_emoticons(MsnSwitchBoard *swboard, GString *body) | |
968 { | |
969 MsnMessage *msg; | |
970 | |
971 g_return_if_fail(body != NULL); | |
972 | |
973 msg = msn_message_new(MSN_MSG_SLP); | |
974 msn_message_set_content_type(msg, "text/x-mms-emoticon"); | |
975 msn_message_set_flag(msg, 'N'); | |
976 msn_message_set_bin_data(msg, body->str, body->len); | |
977 | |
978 msn_switchboard_send_msg(swboard, msg, TRUE); | |
979 msn_message_destroy(msg); | |
980 } | |
981 | |
982 static void msn_emoticon_destroy(MsnEmoticon *emoticon) | |
983 { | |
984 if (emoticon->obj) | |
985 msn_object_destroy(emoticon->obj); | |
986 g_free(emoticon->smile); | |
987 g_free(emoticon); | |
988 } | |
989 | |
990 static GSList* msn_msg_grab_emoticons(const char *msg, const char *username) | |
991 { | |
992 GSList *list; | |
993 GList *smileys; | |
994 PurpleSmiley *smiley; | |
995 PurpleStoredImage *img; | |
996 char *ptr; | |
997 MsnEmoticon *emoticon; | |
998 int length; | |
999 | |
1000 list = NULL; | |
1001 smileys = purple_smileys_get_all(); | |
1002 length = strlen(msg); | |
1003 | |
1004 for (; smileys; smileys = g_list_delete_link(smileys, smileys)) { | |
1005 smiley = smileys->data; | |
1006 | |
1007 ptr = g_strstr_len(msg, length, purple_smiley_get_shortcut(smiley)); | |
1008 | |
1009 if (!ptr) | |
1010 continue; | |
1011 | |
1012 img = purple_smiley_get_stored_image(smiley); | |
1013 | |
1014 emoticon = g_new0(MsnEmoticon, 1); | |
1015 emoticon->smile = g_strdup(purple_smiley_get_shortcut(smiley)); | |
1016 emoticon->obj = msn_object_new_from_image(img, | |
1017 purple_imgstore_get_filename(img), | |
1018 username, MSN_OBJECT_EMOTICON); | |
1019 | |
1020 purple_imgstore_unref(img); | |
1021 list = g_slist_prepend(list, emoticon); | |
1022 } | |
1023 | |
1024 return list; | |
1025 } | |
1026 | |
928 static int | 1027 static int |
929 msn_send_im(PurpleConnection *gc, const char *who, const char *message, | 1028 msn_send_im(PurpleConnection *gc, const char *who, const char *message, |
930 PurpleMessageFlags flags) | 1029 PurpleMessageFlags flags) |
931 { | 1030 { |
932 PurpleAccount *account; | 1031 PurpleAccount *account; |
933 PurpleBuddy *buddy = purple_find_buddy(gc->account, who); | 1032 PurpleBuddy *buddy = purple_find_buddy(gc->account, who); |
934 MsnMessage *msg; | 1033 MsnMessage *msg; |
935 char *msgformat; | 1034 char *msgformat; |
936 char *msgtext; | 1035 char *msgtext; |
1036 const char *username; | |
937 | 1037 |
938 purple_debug_info("MSNP14","send IM {%s} to %s\n",message,who); | 1038 purple_debug_info("MSNP14","send IM {%s} to %s\n",message,who); |
939 account = purple_connection_get_account(gc); | 1039 account = purple_connection_get_account(gc); |
1040 username = purple_account_get_username(account); | |
940 | 1041 |
941 if (buddy) { | 1042 if (buddy) { |
942 PurplePresence *p = purple_buddy_get_presence(buddy); | 1043 PurplePresence *p = purple_buddy_get_presence(buddy); |
943 if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_MOBILE)) { | 1044 if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_MOBILE)) { |
944 char *text = purple_markup_strip_html(message); | 1045 char *text = purple_markup_strip_html(message); |
967 | 1068 |
968 g_free(msgformat); | 1069 g_free(msgformat); |
969 g_free(msgtext); | 1070 g_free(msgtext); |
970 | 1071 |
971 purple_debug_info("MSNP14","prepare to send online Message\n"); | 1072 purple_debug_info("MSNP14","prepare to send online Message\n"); |
972 if (g_ascii_strcasecmp(who, purple_account_get_username(account))) | 1073 if (g_ascii_strcasecmp(who, username)) |
973 { | 1074 { |
974 MsnSession *session; | 1075 MsnSession *session; |
975 MsnSwitchBoard *swboard; | 1076 MsnSwitchBoard *swboard; |
1077 MsnEmoticon *smile; | |
1078 GSList *smileys; | |
1079 GString *emoticons = NULL; | |
976 | 1080 |
977 session = gc->proto_data; | 1081 session = gc->proto_data; |
978 if(msn_user_is_yahoo(account,who)){ | 1082 if(msn_user_is_yahoo(account,who)){ |
979 /*we send the online and offline Message to Yahoo User via UBM*/ | 1083 /*we send the online and offline Message to Yahoo User via UBM*/ |
980 purple_debug_info("MSNP14","send to Yahoo User\n"); | 1084 purple_debug_info("MSNP14","send to Yahoo User\n"); |
981 uum_send_msg(session,msg); | 1085 uum_send_msg(session,msg); |
982 }else{ | 1086 }else{ |
983 purple_debug_info("MSNP14","send via switchboard\n"); | 1087 purple_debug_info("MSNP14","send via switchboard\n"); |
984 swboard = msn_session_get_swboard(session, who, MSN_SB_FLAG_IM); | 1088 swboard = msn_session_get_swboard(session, who, MSN_SB_FLAG_IM); |
1089 smileys = msn_msg_grab_emoticons(message, username); | |
1090 while (smileys) { | |
1091 smile = (MsnEmoticon*)smileys->data; | |
1092 emoticons = msn_msg_emoticon_add(emoticons, smile); | |
1093 msn_emoticon_destroy(smile); | |
1094 smileys = g_slist_delete_link(smileys, smileys); | |
1095 } | |
1096 | |
1097 if (emoticons) { | |
1098 msn_send_emoticons(swboard, emoticons); | |
1099 g_string_free(emoticons, TRUE); | |
1100 } | |
1101 | |
985 msn_switchboard_send_msg(swboard, msg, TRUE); | 1102 msn_switchboard_send_msg(swboard, msg, TRUE); |
986 } | 1103 } |
987 } | 1104 } |
988 else | 1105 else |
989 { | 1106 { |