libgaim/protocols/bonjour/buddy.c

changeset 14254
77edc7a6191a
parent 14253
b63ebf84c42b
child 20470
77693555855f
child 20472
6a6d2ef151e6
equal deleted inserted replaced
14253:b63ebf84c42b 14254:77edc7a6191a
1 /*
2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or
5 * (at your option) any later version.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU Library General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
15 */
16
17 #include <glib.h>
18 #include <stdlib.h>
19
20 #include "buddy.h"
21 #include "account.h"
22 #include "blist.h"
23 #include "bonjour.h"
24 #include "debug.h"
25
26 /**
27 * Creates a new buddy.
28 */
29 BonjourBuddy *
30 bonjour_buddy_new(const gchar *name, const gchar *first, gint port_p2pj,
31 const gchar *phsh, const gchar *status, const gchar *email,
32 const gchar *last, const gchar *jid, const gchar *AIM,
33 const gchar *vc, const gchar *ip, const gchar *msg)
34 {
35 BonjourBuddy *buddy = malloc(sizeof(BonjourBuddy));
36
37 buddy->name = g_strdup(name);
38 buddy->first = g_strdup(first);
39 buddy->port_p2pj = port_p2pj;
40 buddy->phsh = g_strdup(phsh);
41 buddy->status = g_strdup(status);
42 buddy->email = g_strdup(email);
43 buddy->last = g_strdup(last);
44 buddy->jid = g_strdup(jid);
45 buddy->AIM = g_strdup(AIM);
46 buddy->vc = g_strdup(vc);
47 buddy->ip = g_strdup(ip);
48 buddy->msg = g_strdup(msg);
49 buddy->conversation = NULL;
50
51 return buddy;
52 }
53
54 /**
55 * Check if all the compulsory buddy data is present.
56 */
57 gboolean
58 bonjour_buddy_check(BonjourBuddy *buddy)
59 {
60 if (buddy->name == NULL) {
61 return FALSE;
62 }
63
64 if (buddy->first == NULL) {
65 return FALSE;
66 }
67
68 if (buddy->last == NULL) {
69 return FALSE;
70 }
71
72 if (buddy->status == NULL) {
73 return FALSE;
74 }
75
76 return TRUE;
77 }
78
79 /**
80 * If the buddy does not yet exist, then create it and add it to
81 * our buddy list. In either case we set the correct status for
82 * the buddy.
83 */
84 void
85 bonjour_buddy_add_to_gaim(GaimAccount *account, BonjourBuddy *bonjour_buddy)
86 {
87 GaimBuddy *buddy;
88 GaimGroup *group;
89 const char *status_id, *first, *last;
90 char *alias;
91
92 /* Translate between the Bonjour status and the Gaim status */
93 if (g_ascii_strcasecmp("dnd", bonjour_buddy->status) == 0)
94 status_id = BONJOUR_STATUS_ID_AWAY;
95 else
96 status_id = BONJOUR_STATUS_ID_AVAILABLE;
97
98 /*
99 * TODO: Figure out the idle time by getting the "away"
100 * field from the DNS SD.
101 */
102
103 /* Create the alias for the buddy using the first and the last name */
104 first = bonjour_buddy->first;
105 last = bonjour_buddy->last;
106 alias = g_strdup_printf("%s%s%s",
107 (first && *first ? first : ""),
108 (first && *first && last && *last ? " " : ""),
109 (last && *last ? last : ""));
110
111 /* Make sure the Bonjour group exists in our buddy list */
112 group = gaim_find_group(BONJOUR_GROUP_NAME); /* Use the buddy's domain, instead? */
113 if (group == NULL)
114 {
115 group = gaim_group_new(BONJOUR_GROUP_NAME);
116 gaim_blist_add_group(group, NULL);
117 }
118
119 /* Make sure the buddy exists in our buddy list */
120 buddy = gaim_find_buddy(account, bonjour_buddy->name);
121 if (buddy == NULL)
122 {
123 buddy = gaim_buddy_new(account, bonjour_buddy->name, alias);
124 buddy->proto_data = bonjour_buddy;
125 gaim_blist_node_set_flags((GaimBlistNode *)buddy, GAIM_BLIST_NODE_FLAG_NO_SAVE);
126 gaim_blist_add_buddy(buddy, NULL, group, NULL);
127 }
128
129 /* Set the user's status */
130 if (bonjour_buddy->msg != NULL)
131 gaim_prpl_got_user_status(account, buddy->name, status_id,
132 "message", bonjour_buddy->msg,
133 NULL);
134 else
135 gaim_prpl_got_user_status(account, buddy->name, status_id,
136 NULL);
137 gaim_prpl_got_user_idle(account, buddy->name, FALSE, 0);
138
139 g_free(alias);
140 }
141
142 /**
143 * Deletes a buddy from memory.
144 */
145 void
146 bonjour_buddy_delete(BonjourBuddy *buddy)
147 {
148 g_free(buddy->name);
149 g_free(buddy->first);
150 g_free(buddy->phsh);
151 g_free(buddy->status);
152 g_free(buddy->email);
153 g_free(buddy->last);
154 g_free(buddy->jid);
155 g_free(buddy->AIM);
156 g_free(buddy->vc);
157 g_free(buddy->ip);
158 g_free(buddy->msg);
159
160 if (buddy->conversation != NULL)
161 {
162 g_free(buddy->conversation->buddy_name);
163 g_free(buddy->conversation);
164 }
165
166 free(buddy);
167 }

mercurial