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");