Mercurial > pidgin
comparison src/protocols/jabber/jabber.c @ 5135:102135caa225
[gaim-migrate @ 5499]
make use of KingAnt's uber-cool new notauthorized emblem, and let the prpls
stick text into the status line of the buddy to replace "Offline" if they
care to do so
committer: Tailor Script <tailor@pidgin.im>
author | Nathan Walp <nwalp@pidgin.im> |
---|---|
date | Tue, 15 Apr 2003 03:45:31 +0000 |
parents | 463b03cd8c90 |
children | 381da05cb5ed |
comparison
equal
deleted
inserted
replaced
5134:2acc2ee66597 | 5135:102135caa225 |
---|---|
1020 } | 1020 } |
1021 | 1021 |
1022 /* | 1022 /* |
1023 * Return pointer to jabber_buddy_data if buddy found. Create if necessary. | 1023 * Return pointer to jabber_buddy_data if buddy found. Create if necessary. |
1024 */ | 1024 */ |
1025 static struct jabber_buddy_data* jabber_find_buddy(struct gaim_connection *gc, char *buddy) | 1025 static struct jabber_buddy_data* jabber_find_buddy(struct gaim_connection *gc, char *buddy, gboolean create) |
1026 { | 1026 { |
1027 struct jabber_data *jd = gc->proto_data; | 1027 struct jabber_data *jd = gc->proto_data; |
1028 gpointer val; | 1028 gpointer val; |
1029 char *realwho; | 1029 char *realwho; |
1030 | 1030 |
1034 val = g_hash_table_lookup(jd->buddies, realwho); | 1034 val = g_hash_table_lookup(jd->buddies, realwho); |
1035 if(val) { | 1035 if(val) { |
1036 g_free(realwho); | 1036 g_free(realwho); |
1037 return (struct jabber_buddy_data *)val; | 1037 return (struct jabber_buddy_data *)val; |
1038 | 1038 |
1039 } else { | 1039 } else if (create) { |
1040 struct jabber_buddy_data *jbd = g_new0(struct jabber_buddy_data, 1); | 1040 struct jabber_buddy_data *jbd = g_new0(struct jabber_buddy_data, 1); |
1041 jbd->invisible = JABBER_NOT_INVIS; | 1041 jbd->invisible = JABBER_NOT_INVIS; |
1042 g_hash_table_insert(jd->buddies, g_strdup(realwho), jbd); | 1042 g_hash_table_insert(jd->buddies, g_strdup(realwho), jbd); |
1043 g_free(realwho); | 1043 g_free(realwho); |
1044 return jbd; | 1044 return jbd; |
1045 } else { | |
1046 return NULL; | |
1045 } | 1047 } |
1046 } | 1048 } |
1047 | 1049 |
1048 /* | 1050 /* |
1049 * find a resource by name, or if no name given, return the "default" resource | 1051 * find a resource by name, or if no name given, return the "default" resource |
1051 */ | 1053 */ |
1052 | 1054 |
1053 static jab_res_info jabber_find_resource(struct gaim_connection *gc, char *who) | 1055 static jab_res_info jabber_find_resource(struct gaim_connection *gc, char *who) |
1054 { | 1056 { |
1055 GSList *resources; | 1057 GSList *resources; |
1056 struct jabber_buddy_data *jbd = jabber_find_buddy(gc, who); | 1058 struct jabber_buddy_data *jbd = jabber_find_buddy(gc, who, FALSE); |
1057 jab_res_info jri = NULL; | 1059 jab_res_info jri = NULL; |
1058 char *res = strstr(who, "/"); | 1060 char *res = strstr(who, "/"); |
1059 | 1061 |
1060 if(res) | 1062 if(res) |
1061 res++; | 1063 res++; |
1090 char *buddy, | 1092 char *buddy, |
1091 char *res, | 1093 char *res, |
1092 int priority, | 1094 int priority, |
1093 int state) | 1095 int state) |
1094 { | 1096 { |
1095 struct jabber_buddy_data *jbd = jabber_find_buddy(gc, buddy); | 1097 struct jabber_buddy_data *jbd = jabber_find_buddy(gc, buddy, TRUE); |
1096 | 1098 |
1097 if(jbd) { | 1099 if(jbd) { |
1098 char *who; | 1100 char *who; |
1099 jab_res_info jri; | 1101 jab_res_info jri; |
1100 if(res) | 1102 if(res) |
1118 /* | 1120 /* |
1119 * remove the resource, if it exists | 1121 * remove the resource, if it exists |
1120 */ | 1122 */ |
1121 static void jabber_remove_resource(struct gaim_connection *gc, char *buddy, char *res) | 1123 static void jabber_remove_resource(struct gaim_connection *gc, char *buddy, char *res) |
1122 { | 1124 { |
1123 struct jabber_buddy_data *jbd = jabber_find_buddy(gc, buddy); | 1125 struct jabber_buddy_data *jbd = jabber_find_buddy(gc, buddy, FALSE); |
1124 if(jbd) { | 1126 if(jbd) { |
1125 char *who; | 1127 char *who; |
1126 jab_res_info jri; | 1128 jab_res_info jri; |
1127 if(res) | 1129 if(res) |
1128 who = g_strdup_printf("%s/%s", buddy, res); | 1130 who = g_strdup_printf("%s/%s", buddy, res); |
1217 | 1219 |
1218 if(jri) { | 1220 if(jri) { |
1219 if(jri->thread_id) | 1221 if(jri->thread_id) |
1220 ct = g_strdup(jri->thread_id); | 1222 ct = g_strdup(jri->thread_id); |
1221 } | 1223 } |
1222 if(!ct) { | 1224 |
1223 char buf[1024]; | |
1224 snprintf(buf, sizeof(buf), "%s%d", name, (int)time(NULL)); | |
1225 ct = g_strdup(shahash(buf)); | |
1226 } | |
1227 return ct; | 1225 return ct; |
1228 } | 1226 } |
1229 | 1227 |
1230 | 1228 |
1231 static time_t iso8601_to_time(char *timestamp) | 1229 static time_t iso8601_to_time(char *timestamp) |
1267 | 1265 |
1268 type = xmlnode_get_attrib(p->x, "type"); | 1266 type = xmlnode_get_attrib(p->x, "type"); |
1269 | 1267 |
1270 if ((y = xmlnode_get_tag(p->x, "thread"))) | 1268 if ((y = xmlnode_get_tag(p->x, "thread"))) |
1271 thread_id = xmlnode_get_data(y); | 1269 thread_id = xmlnode_get_data(y); |
1272 if(!thread_id) | |
1273 thread_id = ""; | |
1274 | 1270 |
1275 y = xmlnode_get_firstchild(p->x); | 1271 y = xmlnode_get_firstchild(p->x); |
1276 | 1272 |
1277 while(y) { | 1273 while(y) { |
1278 if(NSCHECK(y, NS_DELAY)) { | 1274 if(NSCHECK(y, NS_DELAY)) { |
1455 g_free(buddy); | 1451 g_free(buddy); |
1456 gaim_jid_free(gjid); | 1452 gaim_jid_free(gjid); |
1457 return; | 1453 return; |
1458 } | 1454 } |
1459 | 1455 |
1460 jbd = jabber_find_buddy(GJ_GC(gjc), buddy); | 1456 jbd = jabber_find_buddy(GJ_GC(gjc), buddy, TRUE); |
1461 | 1457 |
1462 if(jbd->error_msg) { | 1458 if(jbd->error_msg) { |
1463 g_free(jbd->error_msg); | 1459 g_free(jbd->error_msg); |
1464 jbd->error_msg = NULL; | 1460 jbd->error_msg = NULL; |
1465 } | 1461 } |
1804 } | 1800 } |
1805 } | 1801 } |
1806 } else if (BUD_USUB_TO_PEND(sub, ask) || BUD_USUBD_TO(sub, ask) || !strcasecmp(sub, "remove")) { | 1802 } else if (BUD_USUB_TO_PEND(sub, ask) || BUD_USUBD_TO(sub, ask) || !strcasecmp(sub, "remove")) { |
1807 jabber_remove_gaim_buddy(GJ_GC(gjc), buddyname); | 1803 jabber_remove_gaim_buddy(GJ_GC(gjc), buddyname); |
1808 } | 1804 } |
1809 if(b && (jbd = jabber_find_buddy(b->account->gc, buddyname)) != NULL) { | 1805 if(b && (jbd = jabber_find_buddy(b->account->gc, buddyname, TRUE)) != NULL) { |
1810 jbd->subscription = JABBER_SUB_NONE; | 1806 jbd->subscription = JABBER_SUB_NONE; |
1811 if(!strcasecmp(sub, "to")) | 1807 if(!strcasecmp(sub, "to")) |
1812 jbd->subscription |= JABBER_SUB_TO; | 1808 jbd->subscription |= JABBER_SUB_TO; |
1813 else if(!strcasecmp(sub, "from")) | 1809 else if(!strcasecmp(sub, "from")) |
1814 jbd->subscription |= JABBER_SUB_FROM; | 1810 jbd->subscription |= JABBER_SUB_FROM; |
2711 { | 2707 { |
2712 gjconn gjc = ((struct jabber_data *)gc->proto_data)->gjc; | 2708 gjconn gjc = ((struct jabber_data *)gc->proto_data)->gjc; |
2713 char *realwho; | 2709 char *realwho; |
2714 | 2710 |
2715 if((realwho = get_realwho(gjc, name, FALSE, NULL)) != NULL) { | 2711 if((realwho = get_realwho(gjc, name, FALSE, NULL)) != NULL) { |
2716 struct jabber_buddy_data *jbd = jabber_find_buddy(gc, realwho); | 2712 struct jabber_buddy_data *jbd = jabber_find_buddy(gc, realwho, TRUE); |
2717 xmlnode g = xmlnode_new_tag("presence"); | 2713 xmlnode g = xmlnode_new_tag("presence"); |
2718 | 2714 |
2719 xmlnode_put_attrib(g, "to", realwho); | 2715 xmlnode_put_attrib(g, "to", realwho); |
2720 | 2716 |
2721 if(invisible) | 2717 if(invisible) |
2797 return "jabber"; | 2793 return "jabber"; |
2798 } | 2794 } |
2799 | 2795 |
2800 static void jabber_list_emblems(struct buddy *b, char **se, char **sw, char **nw, char **ne) | 2796 static void jabber_list_emblems(struct buddy *b, char **se, char **sw, char **nw, char **ne) |
2801 { | 2797 { |
2802 struct jabber_buddy_data *jbd = jabber_find_buddy(b->account->gc, b->name); | 2798 struct jabber_buddy_data *jbd = jabber_find_buddy(b->account->gc, b->name, FALSE); |
2803 | 2799 |
2804 if(jbd) { | 2800 if(!GAIM_BUDDY_IS_ONLINE(b)) { |
2805 if (jbd->error_msg) | 2801 if (jbd && jbd->error_msg) |
2806 *nw = "error"; | 2802 *nw = "error"; |
2807 if ((jbd->subscription & JABBER_SUB_BOTH) != JABBER_SUB_BOTH) { | 2803 |
2808 if(jbd->subscription & JABBER_SUB_PENDING) | 2804 if(jbd && (jbd->subscription & JABBER_SUB_PENDING || |
2809 *ne = "pending"; | 2805 !(jbd->subscription & JABBER_SUB_TO))) |
2810 else if(jbd->subscription & JABBER_SUB_FROM) | 2806 *se = "notauthorized"; |
2811 *ne = "sub_from"; | 2807 else |
2812 else if(jbd->subscription & JABBER_SUB_TO) | 2808 *se = "offline"; |
2813 *ne = "sub_to"; | 2809 |
2814 else | |
2815 *ne = "sub_none"; | |
2816 } | |
2817 } | |
2818 | |
2819 if (b->present == GAIM_BUDDY_OFFLINE) { | |
2820 *se = "offline"; | |
2821 } else { | 2810 } else { |
2822 switch (b->uc) { | 2811 switch (b->uc) { |
2823 case UC_AWAY: | 2812 case UC_AWAY: |
2824 *se = "away"; | 2813 *se = "away"; |
2825 break; | 2814 break; |
3150 if((realwho = get_realwho(gjc, who, FALSE, NULL)) == NULL) { | 3139 if((realwho = get_realwho(gjc, who, FALSE, NULL)) == NULL) { |
3151 g_strfreev(str_arr); | 3140 g_strfreev(str_arr); |
3152 return; | 3141 return; |
3153 } | 3142 } |
3154 | 3143 |
3155 jbd = jabber_find_buddy(gc, realwho); | 3144 jbd = jabber_find_buddy(gc, realwho, TRUE); |
3156 | 3145 |
3157 *ap++ = g_strdup_printf("<B>Jabber ID:</B> %s<BR>\n", realwho); | 3146 *ap++ = g_strdup_printf("<B>Jabber ID:</B> %s<BR>\n", realwho); |
3158 *ap++ = g_strdup_printf("<B>Error:</B> %s<BR>\n", jbd->error_msg); | 3147 *ap++ = g_strdup_printf("<B>Error:</B> %s<BR>\n", jbd->error_msg); |
3159 *ap = NULL; | 3148 *ap = NULL; |
3160 | 3149 |
3171 struct jabber_data *jd = gc->proto_data; | 3160 struct jabber_data *jd = gc->proto_data; |
3172 gjconn gjc = jd->gjc; | 3161 gjconn gjc = jd->gjc; |
3173 int num_resources; | 3162 int num_resources; |
3174 gaim_jid gjid; | 3163 gaim_jid gjid; |
3175 char *buddy = get_realwho(gjc, who, FALSE, &gjid); | 3164 char *buddy = get_realwho(gjc, who, FALSE, &gjid); |
3176 struct jabber_buddy_data *jbd = jabber_find_buddy(gc, buddy); | 3165 struct jabber_buddy_data *jbd = jabber_find_buddy(gc, buddy, TRUE); |
3177 gchar **str_arr; | 3166 gchar **str_arr; |
3178 gchar **ap; | 3167 gchar **ap; |
3179 gchar *realwho, *final; | 3168 gchar *realwho, *final; |
3180 GSList *resources; | 3169 GSList *resources; |
3181 int i; | 3170 int i; |
3253 | 3242 |
3254 } | 3243 } |
3255 | 3244 |
3256 static char *jabber_tooltip_text(struct buddy *b) | 3245 static char *jabber_tooltip_text(struct buddy *b) |
3257 { | 3246 { |
3247 struct jabber_buddy_data *jbd = jabber_find_buddy(b->account->gc, b->name, FALSE); | |
3258 jab_res_info jri = jabber_find_resource(b->account->gc, b->name); | 3248 jab_res_info jri = jabber_find_resource(b->account->gc, b->name); |
3249 char *ret = NULL; | |
3259 if(jri) { | 3250 if(jri) { |
3260 char *stripped = strip_html(jabber_lookup_away(GC_GJ(b->account->gc), | 3251 char *stripped = strip_html(jabber_lookup_away(GC_GJ(b->account->gc), |
3261 b->name)); | 3252 b->name)); |
3262 char *text = NULL; | 3253 char *text = NULL; |
3263 char *ret; | |
3264 if(stripped) | 3254 if(stripped) |
3265 text = g_markup_escape_text(stripped, strlen(stripped)); | 3255 text = g_markup_escape_text(stripped, strlen(stripped)); |
3266 ret = g_strdup_printf(_("<b>Status:</b> %s%s%s"), | 3256 ret = g_strdup_printf(_("<b>Status:</b> %s%s%s"), |
3267 jabber_get_state_string(jri->state), text ? ": " : "", | 3257 jabber_get_state_string(jri->state), text ? ": " : "", |
3268 text ? text : ""); | 3258 text ? text : ""); |
3269 | 3259 |
3270 if(stripped) { | 3260 if(stripped) { |
3271 g_free(stripped); | 3261 g_free(stripped); |
3272 g_free(text); | 3262 g_free(text); |
3273 } | 3263 } |
3274 return ret; | 3264 } else if(jbd && (jbd->subscription & JABBER_SUB_PENDING || |
3275 } | 3265 !(jbd->subscription & JABBER_SUB_TO))) { |
3276 return NULL; | 3266 ret = g_strdup(_("<b>Status:</b> Not Authorized")); |
3267 } | |
3268 return ret; | |
3277 } | 3269 } |
3278 | 3270 |
3279 static char *jabber_status_text(struct buddy *b) | 3271 static char *jabber_status_text(struct buddy *b) |
3280 { | 3272 { |
3273 struct jabber_buddy_data *jbd = jabber_find_buddy(b->account->gc, b->name, FALSE); | |
3274 char *ret = NULL; | |
3281 if (b->uc & UC_UNAVAILABLE) { | 3275 if (b->uc & UC_UNAVAILABLE) { |
3282 char *stripped = strip_html(jabber_lookup_away(GC_GJ(b->account->gc), | 3276 char *stripped = strip_html(jabber_lookup_away(GC_GJ(b->account->gc), |
3283 b->name)); | 3277 b->name)); |
3284 char *ret; | |
3285 if(!stripped) { | 3278 if(!stripped) { |
3286 jab_res_info jri = jabber_find_resource(b->account->gc, b->name); | 3279 jab_res_info jri = jabber_find_resource(b->account->gc, b->name); |
3287 if(jri) | 3280 if(jri) |
3288 stripped = g_strdup(jabber_get_state_string(jri->state)); | 3281 stripped = g_strdup(jabber_get_state_string(jri->state)); |
3289 } | 3282 } |
3290 ret = g_markup_escape_text(stripped, strlen(stripped)); | 3283 ret = g_markup_escape_text(stripped, strlen(stripped)); |
3291 g_free(stripped); | 3284 g_free(stripped); |
3292 return ret; | 3285 } else if(jbd && (jbd->subscription & JABBER_SUB_PENDING || |
3293 } | 3286 !(jbd->subscription & JABBER_SUB_TO))) { |
3294 return NULL; | 3287 ret = g_strdup(_("Not Authorized")); |
3288 } | |
3289 return ret; | |
3295 } | 3290 } |
3296 | 3291 |
3297 static GList *jabber_buddy_menu(struct gaim_connection *gc, char *who) { | 3292 static GList *jabber_buddy_menu(struct gaim_connection *gc, char *who) { |
3298 GList *m = NULL; | 3293 GList *m = NULL; |
3299 struct proto_buddy_menu *pbm; | 3294 struct proto_buddy_menu *pbm; |
3307 pbm->gc = gc; | 3302 pbm->gc = gc; |
3308 m = g_list_append(m, pbm); | 3303 m = g_list_append(m, pbm); |
3309 } else { | 3304 } else { |
3310 gjconn gjc = ((struct jabber_data *)gc->proto_data)->gjc; | 3305 gjconn gjc = ((struct jabber_data *)gc->proto_data)->gjc; |
3311 char *realwho = get_realwho(gjc, who, FALSE, NULL); | 3306 char *realwho = get_realwho(gjc, who, FALSE, NULL); |
3312 struct jabber_buddy_data *jbd = jabber_find_buddy(gc, realwho); | 3307 struct jabber_buddy_data *jbd = jabber_find_buddy(gc, realwho, FALSE); |
3313 | 3308 |
3314 g_free(realwho); | 3309 g_free(realwho); |
3315 | 3310 |
3316 pbm = g_new0(struct proto_buddy_menu, 1); | 3311 pbm = g_new0(struct proto_buddy_menu, 1); |
3317 pbm->label = _("Get Away Msg"); | 3312 pbm->label = _("Get Away Msg"); |