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