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 {