comparison libpurple/protocols/bonjour/buddy.c @ 18798:ed1def07d86e

Refactor the bonjour mdns implementation abstraction in preparation for the avahi implementation. Also fix alias assignment from the server to populate the server alias instead of the local alias.
author Daniel Atallah <daniel.atallah@gmail.com>
date Sun, 05 Aug 2007 02:44:53 +0000
parents 1faa319ab4c3
children 83719d57a8ee
comparison
equal deleted inserted replaced
18796:95fe5195bf98 18798:ed1def07d86e
20 #include "internal.h" 20 #include "internal.h"
21 #include "buddy.h" 21 #include "buddy.h"
22 #include "account.h" 22 #include "account.h"
23 #include "blist.h" 23 #include "blist.h"
24 #include "bonjour.h" 24 #include "bonjour.h"
25 #include "mdns_interface.h"
25 #include "debug.h" 26 #include "debug.h"
26 27
27 /** 28 /**
28 * Creates a new buddy. 29 * Creates a new buddy.
29 */ 30 */
32 { 33 {
33 BonjourBuddy *buddy = g_new0(BonjourBuddy, 1); 34 BonjourBuddy *buddy = g_new0(BonjourBuddy, 1);
34 35
35 buddy->account = account; 36 buddy->account = account;
36 buddy->name = g_strdup(name); 37 buddy->name = g_strdup(name);
38
39 _mdns_init_buddy(buddy);
37 40
38 return buddy; 41 return buddy;
39 } 42 }
40 43
41 void 44 void
100 void 103 void
101 bonjour_buddy_add_to_purple(BonjourBuddy *bonjour_buddy) 104 bonjour_buddy_add_to_purple(BonjourBuddy *bonjour_buddy)
102 { 105 {
103 PurpleBuddy *buddy; 106 PurpleBuddy *buddy;
104 PurpleGroup *group; 107 PurpleGroup *group;
105 const char *status_id, *first, *last; 108 PurpleAccount *account = bonjour_buddy->account;
106 gchar *alias; 109 const char *status_id, *first, *last, *old_hash, *new_hash;
110 gchar *alias = NULL;
107 111
108 /* Translate between the Bonjour status and the Purple status */ 112 /* Translate between the Bonjour status and the Purple status */
109 if (g_ascii_strcasecmp("dnd", bonjour_buddy->status) == 0) 113 if (g_ascii_strcasecmp("dnd", bonjour_buddy->status) == 0)
110 status_id = BONJOUR_STATUS_ID_AWAY; 114 status_id = BONJOUR_STATUS_ID_AWAY;
111 else 115 else
114 /* 118 /*
115 * TODO: Figure out the idle time by getting the "away" 119 * TODO: Figure out the idle time by getting the "away"
116 * field from the DNS SD. 120 * field from the DNS SD.
117 */ 121 */
118 122
119 /* Create the alias for the buddy using the first and the last name */
120 first = bonjour_buddy->first;
121 last = bonjour_buddy->last;
122 alias = g_strdup_printf("%s%s%s",
123 (first && *first ? first : ""),
124 (first && *first && last && *last ? " " : ""),
125 (last && *last ? last : ""));
126
127 /* Make sure the Bonjour group exists in our buddy list */ 123 /* Make sure the Bonjour group exists in our buddy list */
128 group = purple_find_group(BONJOUR_GROUP_NAME); /* Use the buddy's domain, instead? */ 124 group = purple_find_group(BONJOUR_GROUP_NAME); /* Use the buddy's domain, instead? */
129 if (group == NULL) 125 if (group == NULL) {
130 {
131 group = purple_group_new(BONJOUR_GROUP_NAME); 126 group = purple_group_new(BONJOUR_GROUP_NAME);
132 purple_blist_add_group(group, NULL); 127 purple_blist_add_group(group, NULL);
133 } 128 }
134 129
135 /* Make sure the buddy exists in our buddy list */ 130 /* Make sure the buddy exists in our buddy list */
136 buddy = purple_find_buddy(bonjour_buddy->account, bonjour_buddy->name); 131 buddy = purple_find_buddy(account, bonjour_buddy->name);
137 132
138 if (buddy == NULL) 133 if (buddy == NULL) {
139 { 134 buddy = purple_buddy_new(account, bonjour_buddy->name, NULL);
140 buddy = purple_buddy_new(bonjour_buddy->account, bonjour_buddy->name, alias);
141 buddy->proto_data = bonjour_buddy; 135 buddy->proto_data = bonjour_buddy;
142 purple_blist_node_set_flags((PurpleBlistNode *)buddy, PURPLE_BLIST_NODE_FLAG_NO_SAVE); 136 purple_blist_node_set_flags((PurpleBlistNode *)buddy, PURPLE_BLIST_NODE_FLAG_NO_SAVE);
143 purple_blist_add_buddy(buddy, NULL, group, NULL); 137 purple_blist_add_buddy(buddy, NULL, group, NULL);
144 } 138 }
145 139
140 /* Create the alias for the buddy using the first and the last name */
141 first = bonjour_buddy->first;
142 last = bonjour_buddy->last;
143 if ((first && *first) || (last && *last))
144 alias = g_strdup_printf("%s%s%s",
145 (first && *first ? first : ""),
146 (first && *first && last && *last ? " " : ""),
147 (last && *last ? last : ""));
148 serv_got_alias(purple_account_get_connection(account), buddy->name, alias);
149 g_free(alias);
150
146 /* Set the user's status */ 151 /* Set the user's status */
147 if (bonjour_buddy->msg != NULL) 152 if (bonjour_buddy->msg != NULL)
148 purple_prpl_got_user_status(bonjour_buddy->account, buddy->name, status_id, 153 purple_prpl_got_user_status(account, buddy->name, status_id,
149 "message", bonjour_buddy->msg, 154 "message", bonjour_buddy->msg, NULL);
150 NULL);
151 else 155 else
152 purple_prpl_got_user_status(bonjour_buddy->account, buddy->name, status_id, 156 purple_prpl_got_user_status(account, buddy->name, status_id, NULL);
153 NULL);
154 purple_prpl_got_user_idle(bonjour_buddy->account, buddy->name, FALSE, 0);
155 157
156 g_free(alias); 158 purple_prpl_got_user_idle(account, buddy->name, FALSE, 0);
157 } 159 }
158 160
159 /** 161 /**
160 * Deletes a buddy from memory. 162 * Deletes a buddy from memory.
161 */ 163 */
180 g_free(buddy->ver); 182 g_free(buddy->ver);
181 183
182 bonjour_jabber_close_conversation(buddy->conversation); 184 bonjour_jabber_close_conversation(buddy->conversation);
183 buddy->conversation = NULL; 185 buddy->conversation = NULL;
184 186
185 #ifdef USE_BONJOUR_APPLE 187 /* Clean up any mdns implementation data */
186 if (buddy->txt_query != NULL) 188 _mdns_delete_buddy(buddy);
187 {
188 purple_input_remove(buddy->txt_query_fd);
189 DNSServiceRefDeallocate(buddy->txt_query);
190 }
191 #endif
192 189
193 g_free(buddy); 190 g_free(buddy);
194 } 191 }