5563
|
1 /**
|
|
2 * @file account.c Account API
|
|
3 * @ingroup core
|
|
4 *
|
|
5 * gaim
|
|
6 *
|
|
7 * Copyright (C) 2003 Christian Hammond <chipx86@gnupdate.org>
|
|
8 *
|
|
9 * This program is free software; you can redistribute it and/or modify
|
|
10 * it under the terms of the GNU General Public License as published by
|
|
11 * the Free Software Foundation; either version 2 of the License, or
|
|
12 * (at your option) any later version.
|
|
13 *
|
|
14 * This program is distributed in the hope that it will be useful,
|
|
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
17 * GNU General Public License for more details.
|
|
18 *
|
|
19 * You should have received a copy of the GNU General Public License
|
|
20 * along with this program; if not, write to the Free Software
|
|
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
22 */
|
|
23 #include "account.h"
|
|
24 #include "prefs.h"
|
|
25
|
|
26 typedef struct
|
|
27 {
|
|
28 GaimPrefType type;
|
|
29
|
|
30 union
|
|
31 {
|
|
32 int integer;
|
|
33 char *string;
|
|
34 gboolean bool;
|
|
35
|
|
36 } value;
|
|
37
|
|
38 } GaimAccountSetting;
|
|
39
|
|
40 static GList *accounts = NULL;
|
|
41
|
|
42 static void
|
|
43 __delete_setting(void *data)
|
|
44 {
|
|
45 GaimAccountSetting *setting = (GaimAccountSetting *)data;
|
|
46
|
|
47 if (setting->type == GAIM_PREF_STRING)
|
|
48 g_free(setting->value.string);
|
|
49
|
|
50 g_free(setting);
|
|
51 }
|
|
52
|
|
53 GaimAccount *
|
|
54 gaim_account_new(const char *username, GaimProtocol protocol)
|
|
55 {
|
|
56 GaimAccount *account;
|
|
57
|
|
58 g_return_val_if_fail(username != NULL, NULL);
|
|
59
|
|
60 account = g_new0(GaimAccount, 1);
|
|
61
|
|
62 gaim_account_set_username(account, username);
|
|
63 gaim_account_set_protocol(account, protocol);
|
|
64
|
|
65 account->settings = g_hash_table_new_full(g_str_hash, g_str_equal,
|
|
66 g_free, __delete_setting);
|
|
67
|
|
68 accounts = g_list_append(accounts, account);
|
|
69
|
|
70 return account;
|
|
71 }
|
|
72
|
|
73 void
|
|
74 gaim_account_destroy(GaimAccount *account)
|
|
75 {
|
|
76 g_return_if_fail(account != NULL);
|
|
77
|
|
78 if (account->gc != NULL)
|
|
79 gaim_connection_destroy(account->gc);
|
|
80
|
|
81 if (account->username != NULL) g_free(account->username);
|
|
82 if (account->alias != NULL) g_free(account->alias);
|
|
83 if (account->password != NULL) g_free(account->password);
|
|
84 if (account->user_info != NULL) g_free(account->user_info);
|
|
85
|
|
86 g_hash_table_destroy(account->settings);
|
|
87
|
|
88 accounts = g_list_remove(accounts, account);
|
|
89
|
|
90 g_free(account);
|
|
91 }
|
|
92
|
|
93 GaimConnection *
|
|
94 gaim_account_connect(GaimAccount *account)
|
|
95 {
|
|
96 GaimConnection *gc;
|
|
97
|
|
98 g_return_val_if_fail(account != NULL, NULL);
|
|
99 g_return_val_if_fail(!gaim_account_is_connected(account), NULL);
|
|
100
|
|
101 gc = gaim_connection_new(account);
|
|
102
|
|
103 gaim_connection_connect(gc);
|
|
104
|
|
105 return gc;
|
|
106 }
|
|
107
|
|
108 void
|
|
109 gaim_account_disconnect(GaimAccount *account)
|
|
110 {
|
|
111 g_return_if_fail(account != NULL);
|
|
112 g_return_if_fail(gaim_account_is_connected(account));
|
|
113
|
|
114 gaim_connection_disconnect(account->gc);
|
|
115 gaim_connection_destroy(account->gc);
|
|
116
|
|
117 account->gc = NULL;
|
|
118 }
|
|
119
|
|
120 void
|
|
121 gaim_account_set_username(GaimAccount *account, const char *username)
|
|
122 {
|
|
123 g_return_if_fail(account != NULL);
|
|
124 g_return_if_fail(username != NULL);
|
|
125
|
|
126 if (account->username != NULL)
|
|
127 g_free(account->username);
|
|
128
|
|
129 account->username = (username == NULL ? NULL : g_strdup(username));
|
|
130 }
|
|
131
|
|
132 void
|
|
133 gaim_account_set_password(GaimAccount *account, const char *password)
|
|
134 {
|
|
135 g_return_if_fail(account != NULL);
|
|
136 g_return_if_fail(password != NULL);
|
|
137
|
|
138 if (account->password != NULL)
|
|
139 g_free(account->password);
|
|
140
|
|
141 account->password = (password == NULL ? NULL : g_strdup(password));
|
|
142 }
|
|
143
|
|
144 void
|
|
145 gaim_account_set_alias(GaimAccount *account, const char *alias)
|
|
146 {
|
|
147 g_return_if_fail(account != NULL);
|
|
148 g_return_if_fail(alias != NULL);
|
|
149
|
|
150 if (account->alias != NULL)
|
|
151 g_free(account->alias);
|
|
152
|
|
153 account->alias = (alias == NULL ? NULL : g_strdup(alias));
|
|
154 }
|
|
155
|
|
156 void
|
|
157 gaim_account_set_user_info(GaimAccount *account, const char *user_info)
|
|
158 {
|
|
159 g_return_if_fail(account != NULL);
|
|
160 g_return_if_fail(user_info != NULL);
|
|
161
|
|
162 if (account->user_info != NULL)
|
|
163 g_free(account->user_info);
|
|
164
|
|
165 account->user_info = (user_info == NULL ? NULL : g_strdup(user_info));
|
|
166 }
|
|
167
|
|
168 void
|
|
169 gaim_account_set_buddy_icon(GaimAccount *account, const char *icon)
|
|
170 {
|
|
171 g_return_if_fail(account != NULL);
|
|
172 g_return_if_fail(icon != NULL);
|
|
173
|
|
174 if (account->buddy_icon != NULL)
|
|
175 g_free(account->buddy_icon);
|
|
176
|
|
177 account->buddy_icon = (icon == NULL ? NULL : g_strdup(icon));
|
|
178 }
|
|
179
|
|
180 void
|
|
181 gaim_account_set_protocol(GaimAccount *account, GaimProtocol protocol)
|
|
182 {
|
|
183 g_return_if_fail(account != NULL);
|
|
184
|
|
185 account->protocol = protocol;
|
|
186 }
|
|
187
|
|
188 void
|
|
189 gaim_account_set_connection(GaimAccount *account, GaimConnection *gc)
|
|
190 {
|
|
191 g_return_if_fail(account != NULL);
|
|
192 g_return_if_fail(gc != NULL);
|
|
193
|
|
194 account->gc = gc;
|
|
195 }
|
|
196
|
|
197 void
|
|
198 gaim_account_set_remember_password(GaimAccount *account, gboolean value)
|
|
199 {
|
|
200 g_return_if_fail(account != NULL);
|
|
201
|
|
202 account->remember_pass = value;
|
|
203 }
|
|
204
|
|
205 void
|
|
206 gaim_account_set_int(GaimAccount *account, const char *name, int value)
|
|
207 {
|
|
208 GaimAccountSetting *setting;
|
|
209
|
|
210 g_return_if_fail(account != NULL);
|
|
211 g_return_if_fail(name != NULL);
|
|
212
|
|
213 setting = g_new0(GaimAccountSetting, 1);
|
|
214
|
|
215 setting->type = GAIM_PREF_INT;
|
|
216 setting->value.integer = value;
|
|
217
|
|
218 g_hash_table_insert(account->settings, g_strdup(name), setting);
|
|
219 }
|
|
220
|
|
221 void
|
|
222 gaim_account_set_string(GaimAccount *account, const char *name,
|
|
223 const char *value)
|
|
224 {
|
|
225 GaimAccountSetting *setting;
|
|
226
|
|
227 g_return_if_fail(account != NULL);
|
|
228 g_return_if_fail(name != NULL);
|
|
229
|
|
230 setting = g_new0(GaimAccountSetting, 1);
|
|
231
|
|
232 setting->type = GAIM_PREF_STRING;
|
|
233 setting->value.string = g_strdup(value);
|
|
234
|
|
235 g_hash_table_insert(account->settings, g_strdup(name), setting);
|
|
236 }
|
|
237
|
|
238 void
|
|
239 gaim_account_set_bool(GaimAccount *account, const char *name, gboolean value)
|
|
240 {
|
|
241 GaimAccountSetting *setting;
|
|
242
|
|
243 g_return_if_fail(account != NULL);
|
|
244 g_return_if_fail(name != NULL);
|
|
245
|
|
246 setting = g_new0(GaimAccountSetting, 1);
|
|
247
|
|
248 setting->type = GAIM_PREF_BOOLEAN;
|
|
249 setting->value.bool = value;
|
|
250
|
|
251 g_hash_table_insert(account->settings, g_strdup(name), setting);
|
|
252 }
|
|
253
|
|
254 gboolean
|
|
255 gaim_account_is_connected(const GaimAccount *account)
|
|
256 {
|
|
257 g_return_val_if_fail(account != NULL, FALSE);
|
|
258
|
|
259 return (account->gc != NULL &&
|
|
260 gaim_connection_get_state(account->gc) == GAIM_CONNECTED);
|
|
261 }
|
|
262
|
|
263 const char *
|
|
264 gaim_account_get_username(const GaimAccount *account)
|
|
265 {
|
|
266 g_return_val_if_fail(account != NULL, NULL);
|
|
267
|
|
268 return account->username;
|
|
269 }
|
|
270
|
|
271 const char *
|
|
272 gaim_account_get_password(const GaimAccount *account)
|
|
273 {
|
|
274 g_return_val_if_fail(account != NULL, NULL);
|
|
275
|
|
276 return account->password;
|
|
277 }
|
|
278
|
|
279 const char *
|
|
280 gaim_account_get_alias(const GaimAccount *account)
|
|
281 {
|
|
282 g_return_val_if_fail(account != NULL, NULL);
|
|
283
|
|
284 return account->alias;
|
|
285 }
|
|
286
|
|
287 const char *
|
|
288 gaim_account_get_user_info(const GaimAccount *account)
|
|
289 {
|
|
290 g_return_val_if_fail(account != NULL, NULL);
|
|
291
|
|
292 return account->user_info;
|
|
293 }
|
|
294
|
|
295 const char *
|
|
296 gaim_account_get_buddy_icon(const GaimAccount *account)
|
|
297 {
|
|
298 g_return_val_if_fail(account != NULL, NULL);
|
|
299
|
|
300 return account->buddy_icon;
|
|
301 }
|
|
302
|
|
303 GaimProtocol
|
|
304 gaim_account_get_protocol(const GaimAccount *account)
|
|
305 {
|
|
306 g_return_val_if_fail(account != NULL, -1);
|
|
307
|
|
308 return account->protocol;
|
|
309 }
|
|
310
|
|
311 GaimConnection *
|
|
312 gaim_account_get_connection(const GaimAccount *account)
|
|
313 {
|
|
314 g_return_val_if_fail(account != NULL, NULL);
|
|
315
|
|
316 return account->gc;
|
|
317 }
|
|
318
|
|
319 gboolean
|
|
320 gaim_account_get_remember_password(const GaimAccount *account)
|
|
321 {
|
|
322 g_return_val_if_fail(account != NULL, FALSE);
|
|
323
|
|
324 return account->remember_pass;
|
|
325 }
|
|
326
|
|
327 int
|
|
328 gaim_account_get_int(const GaimAccount *account, const char *name)
|
|
329 {
|
|
330 GaimAccountSetting *setting;
|
|
331
|
|
332 g_return_val_if_fail(account != NULL, -1);
|
|
333 g_return_val_if_fail(name != NULL, -1);
|
|
334
|
|
335 setting = g_hash_table_lookup(account->settings, name);
|
|
336
|
|
337 g_return_val_if_fail(setting->type == GAIM_PREF_INT, -1);
|
|
338
|
|
339 return setting->value.integer;
|
|
340 }
|
|
341
|
|
342 const char *
|
|
343 gaim_account_get_string(const GaimAccount *account, const char *name)
|
|
344 {
|
|
345 GaimAccountSetting *setting;
|
|
346
|
|
347 g_return_val_if_fail(account != NULL, NULL);
|
|
348 g_return_val_if_fail(name != NULL, NULL);
|
|
349
|
|
350 setting = g_hash_table_lookup(account->settings, name);
|
|
351
|
|
352 g_return_val_if_fail(setting->type == GAIM_PREF_STRING, NULL);
|
|
353
|
|
354 return setting->value.string;
|
|
355 }
|
|
356
|
|
357 gboolean
|
|
358 gaim_account_get_bool(const GaimAccount *account, const char *name)
|
|
359 {
|
|
360 GaimAccountSetting *setting;
|
|
361
|
|
362 g_return_val_if_fail(account != NULL, FALSE);
|
|
363 g_return_val_if_fail(name != NULL, FALSE);
|
|
364
|
|
365 setting = g_hash_table_lookup(account->settings, name);
|
|
366
|
|
367 g_return_val_if_fail(setting->type == GAIM_PREF_BOOLEAN, FALSE);
|
|
368
|
|
369 return setting->value.bool;
|
|
370 }
|
|
371
|
|
372 GList *
|
|
373 gaim_accounts_get_all(void)
|
|
374 {
|
|
375 return accounts;
|
|
376 }
|