Mercurial > pidgin
comparison src/gtkblist.c @ 8089:35db601609e3
[gaim-migrate @ 8788]
Gaim-Evolution Buddy List-Addressbook syncronocity by our very own
Chip X. Eightysix.
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Tue, 13 Jan 2004 01:45:32 +0000 |
parents | 08d993c1d843 |
children | d60272410bd5 |
comparison
equal
deleted
inserted
replaced
8088:a86784e3b98c | 8089:35db601609e3 |
---|---|
1070 gdk_window_set_cursor(gtkblist->window->window, cursor); | 1070 gdk_window_set_cursor(gtkblist->window->window, cursor); |
1071 gdk_cursor_unref(cursor); | 1071 gdk_cursor_unref(cursor); |
1072 } | 1072 } |
1073 } | 1073 } |
1074 | 1074 |
1075 static void | |
1076 add_buddies_from_vcard(const char *prpl_id, GaimGroup *group, GList *list, | |
1077 const char *alias) | |
1078 { | |
1079 GList *l; | |
1080 GaimAccount *account = NULL; | |
1081 GaimConnection *gc; | |
1082 | |
1083 if (list == NULL) | |
1084 return; | |
1085 | |
1086 for (l = gaim_connections_get_all(); l != NULL; l = l->next) | |
1087 { | |
1088 gc = (GaimConnection *)l->data; | |
1089 account = gaim_connection_get_account(gc); | |
1090 | |
1091 if (!strcmp(gaim_account_get_protocol_id(account), prpl_id)) | |
1092 break; | |
1093 | |
1094 account = NULL; | |
1095 } | |
1096 | |
1097 if (account != NULL) | |
1098 { | |
1099 for (l = list; l != NULL; l = l->next) | |
1100 { | |
1101 gaim_blist_request_add_buddy(account, l->data, | |
1102 (group ? group->name : NULL), | |
1103 alias); | |
1104 } | |
1105 } | |
1106 | |
1107 g_list_foreach(list, (GFunc)g_free, NULL); | |
1108 g_list_free(list); | |
1109 } | |
1110 | |
1111 static gboolean | |
1112 parse_vcard(const char *vcard, GaimGroup *group) | |
1113 { | |
1114 char *temp_vcard; | |
1115 char *s, *c; | |
1116 char *alias = NULL; | |
1117 GList *aims = NULL; | |
1118 GList *icqs = NULL; | |
1119 GList *yahoos = NULL; | |
1120 GList *msns = NULL; | |
1121 GList *jabbers = NULL; | |
1122 | |
1123 s = temp_vcard = g_strdup(vcard); | |
1124 | |
1125 while (*s != '\0' && strncmp(s, "END:vCard", strlen("END:vCard"))) | |
1126 { | |
1127 char *field, *value; | |
1128 | |
1129 field = s; | |
1130 | |
1131 /* Grab the field */ | |
1132 while (*s != '\r' && *s != '\n' && *s != '\0' && *s != ':') | |
1133 s++; | |
1134 | |
1135 if (*s == '\r') s++; | |
1136 if (*s == '\n') | |
1137 { | |
1138 s++; | |
1139 continue; | |
1140 } | |
1141 | |
1142 if (*s != '\0') *s++ = '\0'; | |
1143 | |
1144 if ((c = strchr(field, ';')) != NULL) | |
1145 *c = '\0'; | |
1146 | |
1147 /* Proceed to the end of the line */ | |
1148 value = s; | |
1149 | |
1150 while (*s != '\r' && *s != '\n' && *s != '\0') | |
1151 s++; | |
1152 | |
1153 if (*s == '\r') *s++ = '\0'; | |
1154 if (*s == '\n') *s++ = '\0'; | |
1155 | |
1156 /* We only want to worry about a few fields here. */ | |
1157 if (!strcmp(field, "FN")) | |
1158 alias = g_strdup(value); | |
1159 else if (!strcmp(field, "X-AIM") || !strcmp(field, "X-ICQ") || | |
1160 !strcmp(field, "X-YAHOO") || !strcmp(field, "X-MSN") || | |
1161 !strcmp(field, "X-JABBER")) | |
1162 { | |
1163 char **values = g_strsplit(value, ":", 0); | |
1164 char **im; | |
1165 | |
1166 for (im = values; *im != NULL; im++) | |
1167 { | |
1168 if (!strcmp(field, "X-AIM")) | |
1169 aims = g_list_append(aims, g_strdup(*im)); | |
1170 else if (!strcmp(field, "X-ICQ")) | |
1171 icqs = g_list_append(icqs, g_strdup(*im)); | |
1172 else if (!strcmp(field, "X-YAHOO")) | |
1173 yahoos = g_list_append(yahoos, g_strdup(*im)); | |
1174 else if (!strcmp(field, "X-MSN")) | |
1175 msns = g_list_append(msns, g_strdup(*im)); | |
1176 else if (!strcmp(field, "X-JABBER")) | |
1177 jabbers = g_list_append(jabbers, g_strdup(*im)); | |
1178 } | |
1179 | |
1180 g_strfreev(values); | |
1181 } | |
1182 } | |
1183 | |
1184 g_free(temp_vcard); | |
1185 | |
1186 if (aims == NULL && icqs == NULL && yahoos == NULL && | |
1187 msns == NULL && jabbers == NULL) | |
1188 { | |
1189 if (alias != NULL) | |
1190 g_free(alias); | |
1191 | |
1192 return FALSE; | |
1193 } | |
1194 | |
1195 add_buddies_from_vcard("prpl-oscar", group, aims, alias); | |
1196 add_buddies_from_vcard("prpl-oscar", group, icqs, alias); | |
1197 add_buddies_from_vcard("prpl-yahoo", group, yahoos, alias); | |
1198 add_buddies_from_vcard("prpl-msn", group, msns, alias); | |
1199 add_buddies_from_vcard("prpl-jabber", group, jabbers, alias); | |
1200 | |
1201 if (alias != NULL) | |
1202 g_free(alias); | |
1203 | |
1204 return TRUE; | |
1205 } | |
1206 | |
1075 static void gaim_gtk_blist_drag_data_get_cb (GtkWidget *widget, | 1207 static void gaim_gtk_blist_drag_data_get_cb (GtkWidget *widget, |
1076 GdkDragContext *dc, | 1208 GdkDragContext *dc, |
1077 GtkSelectionData *data, | 1209 GtkSelectionData *data, |
1078 guint info, | 1210 guint info, |
1079 guint time, | 1211 guint time, |
1080 gpointer *null) | 1212 gpointer *null) |
1081 { | 1213 { |
1082 if (data->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE)) { | 1214 if (data->target == gdk_atom_intern("GAIM_BLIST_NODE", FALSE)) |
1215 { | |
1083 GtkTreeRowReference *ref = g_object_get_data(G_OBJECT(dc), "gtk-tree-view-source-row"); | 1216 GtkTreeRowReference *ref = g_object_get_data(G_OBJECT(dc), "gtk-tree-view-source-row"); |
1084 GtkTreePath *sourcerow = gtk_tree_row_reference_get_path(ref); | 1217 GtkTreePath *sourcerow = gtk_tree_row_reference_get_path(ref); |
1085 GtkTreeIter iter; | 1218 GtkTreeIter iter; |
1086 GaimBlistNode *node = NULL; | 1219 GaimBlistNode *node = NULL; |
1087 GValue val = {0}; | 1220 GValue val = {0}; |
1096 (void*)&node, | 1229 (void*)&node, |
1097 sizeof (node)); | 1230 sizeof (node)); |
1098 | 1231 |
1099 gtk_tree_path_free(sourcerow); | 1232 gtk_tree_path_free(sourcerow); |
1100 } | 1233 } |
1101 else if (data->target == gdk_atom_intern("application/x-im-contact", | 1234 else if (data->target == gdk_atom_intern("application/x-im-contact", FALSE)) |
1102 FALSE)) { | 1235 { |
1103 | |
1104 GtkTreeRowReference *ref; | 1236 GtkTreeRowReference *ref; |
1105 GtkTreePath *sourcerow; | 1237 GtkTreePath *sourcerow; |
1106 GtkTreeIter iter; | 1238 GtkTreeIter iter; |
1107 GaimBlistNode *node = NULL; | 1239 GaimBlistNode *node = NULL; |
1108 GaimBuddy *buddy; | 1240 GaimBuddy *buddy; |
1398 if (path != NULL) | 1530 if (path != NULL) |
1399 gtk_tree_path_free(path); | 1531 gtk_tree_path_free(path); |
1400 | 1532 |
1401 gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); | 1533 gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); |
1402 } | 1534 } |
1535 else if (sd->target == gdk_atom_intern("text/x-vcard", FALSE) && sd->data) | |
1536 { | |
1537 gboolean result; | |
1538 GaimGroup *group = NULL; | |
1539 GtkTreePath *path = NULL; | |
1540 GtkTreeViewDropPosition position; | |
1541 | |
1542 if (gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(widget), | |
1543 x, y, &path, &position)) | |
1544 { | |
1545 GtkTreeIter iter; | |
1546 GaimBlistNode *node; | |
1547 GValue val = {0}; | |
1548 | |
1549 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), | |
1550 &iter, path); | |
1551 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), | |
1552 &iter, NODE_COLUMN, &val); | |
1553 node = g_value_get_pointer(&val); | |
1554 | |
1555 if (GAIM_BLIST_NODE_IS_BUDDY(node)) | |
1556 { | |
1557 group = (GaimGroup *)node->parent->parent; | |
1558 } | |
1559 else if (GAIM_BLIST_NODE_IS_CHAT(node) || | |
1560 GAIM_BLIST_NODE_IS_CONTACT(node)) | |
1561 { | |
1562 group = (GaimGroup *)node->parent; | |
1563 } | |
1564 else if (GAIM_BLIST_NODE_IS_GROUP(node)) | |
1565 { | |
1566 group = (GaimGroup *)node; | |
1567 } | |
1568 } | |
1569 | |
1570 result = parse_vcard(sd->data, group); | |
1571 | |
1572 gtk_drag_finish(dc, result, (dc->action == GDK_ACTION_MOVE), t); | |
1573 } | |
1403 } | 1574 } |
1404 | 1575 |
1405 static void gaim_gtk_blist_paint_tip(GtkWidget *widget, GdkEventExpose *event, GaimBlistNode *node) | 1576 static void gaim_gtk_blist_paint_tip(GtkWidget *widget, GdkEventExpose *event, GaimBlistNode *node) |
1406 { | 1577 { |
1407 GtkStyle *style; | 1578 GtkStyle *style; |
2333 gaim_prefs_get_bool("/gaim/gtk/blist/show_warning_level")); | 2504 gaim_prefs_get_bool("/gaim/gtk/blist/show_warning_level")); |
2334 gtk_tree_view_column_set_visible(gtkblist->buddy_icon_column, FALSE); | 2505 gtk_tree_view_column_set_visible(gtkblist->buddy_icon_column, FALSE); |
2335 } | 2506 } |
2336 } | 2507 } |
2337 | 2508 |
2338 enum {DRAG_BUDDY, DRAG_ROW}; | 2509 enum {DRAG_BUDDY, DRAG_ROW, DRAG_VCARD}; |
2339 | 2510 |
2340 static char * | 2511 static char * |
2341 item_factory_translate_func (const char *path, gpointer func_data) | 2512 item_factory_translate_func (const char *path, gpointer func_data) |
2342 { | 2513 { |
2343 return _((char *)path); | 2514 return _((char *)path); |
2372 GtkWidget *button; | 2543 GtkWidget *button; |
2373 GtkSizeGroup *sg; | 2544 GtkSizeGroup *sg; |
2374 GtkAccelGroup *accel_group; | 2545 GtkAccelGroup *accel_group; |
2375 GtkTreeSelection *selection; | 2546 GtkTreeSelection *selection; |
2376 GtkTargetEntry gte[] = {{"GAIM_BLIST_NODE", GTK_TARGET_SAME_APP, DRAG_ROW}, | 2547 GtkTargetEntry gte[] = {{"GAIM_BLIST_NODE", GTK_TARGET_SAME_APP, DRAG_ROW}, |
2377 {"application/x-im-contact", 0, DRAG_BUDDY}}; | 2548 {"application/x-im-contact", 0, DRAG_BUDDY}, |
2549 {"text/x-vcard", 0, DRAG_VCARD }}; | |
2378 | 2550 |
2379 if (gtkblist && gtkblist->window) { | 2551 if (gtkblist && gtkblist->window) { |
2380 gtk_widget_show(gtkblist->window); | 2552 gtk_widget_show(gtkblist->window); |
2381 return; | 2553 return; |
2382 } | 2554 } |
2438 g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(gaim_gtk_blist_selection_changed), NULL); | 2610 g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(gaim_gtk_blist_selection_changed), NULL); |
2439 | 2611 |
2440 | 2612 |
2441 /* Set up dnd */ | 2613 /* Set up dnd */ |
2442 gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(gtkblist->treeview), | 2614 gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(gtkblist->treeview), |
2443 GDK_BUTTON1_MASK, gte, 2, | 2615 GDK_BUTTON1_MASK, gte, 3, |
2444 GDK_ACTION_COPY); | 2616 GDK_ACTION_COPY); |
2445 gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(gtkblist->treeview), | 2617 gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(gtkblist->treeview), |
2446 gte, 2, | 2618 gte, 3, |
2447 GDK_ACTION_COPY | GDK_ACTION_MOVE); | 2619 GDK_ACTION_COPY | GDK_ACTION_MOVE); |
2448 | 2620 |
2449 g_signal_connect(G_OBJECT(gtkblist->treeview), "drag-data-received", G_CALLBACK(gaim_gtk_blist_drag_data_rcv_cb), NULL); | 2621 g_signal_connect(G_OBJECT(gtkblist->treeview), "drag-data-received", G_CALLBACK(gaim_gtk_blist_drag_data_rcv_cb), NULL); |
2450 g_signal_connect(G_OBJECT(gtkblist->treeview), "drag-data-get", G_CALLBACK(gaim_gtk_blist_drag_data_get_cb), NULL); | 2622 g_signal_connect(G_OBJECT(gtkblist->treeview), "drag-data-get", G_CALLBACK(gaim_gtk_blist_drag_data_get_cb), NULL); |
2451 | 2623 |