Mercurial > pidgin
annotate src/protocols/gg/gg.c @ 11545:85abf1deac05
[gaim-migrate @ 13800]
The registration process is now actually useful, it saves the UIN that was assigned to you as your new username (and the password you selected, if the account has "Remember Password" checked. Don't leak proto_data when logging out. Don't leak authentication token when cancelling registration.
committer: Tailor Script <tailor@pidgin.im>
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Wed, 14 Sep 2005 19:01:33 +0000 |
parents | 6723c4930e50 |
children | 2aa7d8dd61d7 |
rev | line source |
---|---|
11394 | 1 /** |
2 * @file gg.c Gadu-Gadu protocol plugin | |
3 * | |
4 * gaim | |
5 * | |
6 * Copyright (C) 2005 Bartosz Oler <bartosz@bzimage.us> | |
7 * | |
8 * Some parts of the code are adapted or taken for the previous implementation | |
9 * of this plugin written by Arkadiusz Miskiewicz <misiek@pld.org.pl> | |
10 * | |
11 * Thanks to Google's Summer of Code Program. | |
12 * | |
13 * This program is free software; you can redistribute it and/or modify | |
14 * it under the terms of the GNU General Public License as published by | |
15 * the Free Software Foundation; either version 2 of the License, or | |
16 * (at your option) any later version. | |
17 * | |
18 * This program is distributed in the hope that it will be useful, | |
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
21 * GNU General Public License for more details. | |
22 * | |
23 * You should have received a copy of the GNU General Public License | |
24 * along with this program; if not, write to the Free Software | |
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
26 */ | |
27 | |
11360 | 28 |
2393 | 29 /* |
11360 | 30 * NOTES |
2393 | 31 * |
11360 | 32 * I don't like automatic updates of the buddylist stored on the server, so not |
33 * going to implement this. Maybe some kind of option to enable/disable this | |
34 * feature. | |
2393 | 35 */ |
11360 | 36 |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
37 #include "internal.h" |
2393 | 38 |
11360 | 39 #include "plugin.h" |
40 #include "version.h" | |
41 #include "notify.h" | |
42 #include "status.h" | |
9030 | 43 #include "blist.h" |
11360 | 44 #include "accountopt.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
45 #include "debug.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
46 #include "util.h" |
11360 | 47 #include "request.h" |
2393 | 48 |
11360 | 49 #include "lib/libgadu.h" |
5603 | 50 |
11414 | 51 #include "gg.h" |
52 #include "confer.h" | |
53 #include "search.h" | |
54 #include "buddylist.h" | |
55 #include "utils.h" | |
11394 | 56 |
11414 | 57 static GaimPlugin *my_protocol = NULL; |
11394 | 58 |
11360 | 59 /* ---------------------------------------------------------------------- */ |
11414 | 60 /* ----- EXTERNAL CALLBACKS --------------------------------------------- */ |
11360 | 61 /* ---------------------------------------------------------------------- */ |
9950 | 62 |
11360 | 63 /** |
64 * Request buddylist from the server. | |
65 * Buddylist is received in the ggp_callback_recv(). | |
66 * | |
67 * @param Current action handler. | |
68 */ | |
69 /* static void ggp_action_buddylist_get(GaimPluginAction *action) {{{ */ | |
70 static void ggp_action_buddylist_get(GaimPluginAction *action) | |
71 { | |
72 GaimConnection *gc = (GaimConnection *)action->context; | |
73 GGPInfo *info = gc->proto_data; | |
74 | |
75 gaim_debug_info("gg", "Downloading...\n"); | |
76 | |
77 gg_userlist_request(info->session, GG_USERLIST_GET, NULL); | |
78 } | |
79 /* }}} */ | |
80 | |
81 /** | |
82 * Upload the buddylist to the server. | |
83 * | |
84 * @param action Current action handler. | |
85 */ | |
86 /* static void ggp_action_buddylist_put(GaimPluginAction *action) {{{ */ | |
87 static void ggp_action_buddylist_put(GaimPluginAction *action) | |
88 { | |
89 GaimConnection *gc = (GaimConnection *)action->context; | |
90 GGPInfo *info = gc->proto_data; | |
91 | |
92 char *buddylist = ggp_buddylist_dump(gaim_connection_get_account(gc)); | |
93 | |
94 gaim_debug_info("gg", "Uploading...\n"); | |
95 | |
96 if (buddylist == NULL) | |
97 return; | |
98 | |
99 gg_userlist_request(info->session, GG_USERLIST_PUT, buddylist); | |
100 g_free(buddylist); | |
101 } | |
102 /* }}} */ | |
103 | |
104 /** | |
105 * Delete buddylist from the server. | |
106 * | |
107 * @param action Current action handler. | |
108 */ | |
109 /* static void ggp_action_buddylist_delete(GaimPluginAction *action) {{{ */ | |
110 static void ggp_action_buddylist_delete(GaimPluginAction *action) | |
111 { | |
112 GaimConnection *gc = (GaimConnection *)action->context; | |
113 GGPInfo *info = gc->proto_data; | |
114 | |
115 gaim_debug_info("gg", "Deleting...\n"); | |
116 | |
117 gg_userlist_request(info->session, GG_USERLIST_PUT, NULL); | |
118 } | |
119 /* }}} */ | |
120 | |
121 /* | |
122 */ | |
123 /* static void ggp_callback_buddylist_save_ok(GaimConnection *gc, gchar *file) {{{ */ | |
124 static void ggp_callback_buddylist_save_ok(GaimConnection *gc, gchar *file) | |
125 { | |
126 GaimAccount *account = gaim_connection_get_account(gc); | |
127 | |
128 FILE *fh; | |
129 char *buddylist = ggp_buddylist_dump(account); | |
130 gchar *msg; | |
131 | |
132 gaim_debug_info("gg", "Saving...\n"); | |
133 gaim_debug_info("gg", "file = %s\n", file); | |
134 | |
135 if (buddylist == NULL) { | |
136 gaim_notify_info(account, _("Save Buddylist..."), | |
137 _("Your buddylist is empty, nothing was written to the file."), | |
138 NULL); | |
2792
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
139 return; |
9123abd0db92
[gaim-migrate @ 2805]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2791
diff
changeset
|
140 } |
2393 | 141 |
11360 | 142 if ((fh = g_fopen(file, "wb")) == NULL) { |
143 msg = g_strconcat(_("Couldn't open file"), ": ", file, "\n", NULL); | |
144 gaim_debug_error("gg", "Could not open file: %s\n", file); | |
145 gaim_notify_error(account, _("Couldn't open file"), msg, NULL); | |
146 g_free(msg); | |
147 g_free(file); | |
148 return; | |
149 } | |
150 | |
151 fwrite(buddylist, sizeof(char), g_utf8_strlen(buddylist, -1), fh); | |
152 fclose(fh); | |
153 g_free(buddylist); | |
154 | |
155 gaim_notify_info(account, _("Save Buddylist..."), | |
156 _("Buddylist saved successfully!"), NULL); | |
157 } | |
158 /* }}} */ | |
2806
1ffac7cf4e94
[gaim-migrate @ 2819]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
159 |
11360 | 160 /* |
161 */ | |
162 /* static void ggp_callback_buddylist_load_ok(GaimConnection *gc, gchar *file) {{{ */ | |
163 static void ggp_callback_buddylist_load_ok(GaimConnection *gc, gchar *file) | |
164 { | |
165 GaimAccount *account = gaim_connection_get_account(gc); | |
166 char *buddylist, *tmp, *ptr; | |
167 FILE *fh; | |
168 gchar *msg; | |
2806
1ffac7cf4e94
[gaim-migrate @ 2819]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
169 |
11360 | 170 buddylist = g_strdup(""); |
171 tmp = g_new0(gchar, 50); | |
172 | |
173 gaim_debug_info("gg", "file_name = %s\n", file); | |
174 | |
175 if ((fh = g_fopen(file, "rb")) == NULL) { | |
176 msg = g_strconcat(_("Couldn't open file"), ": ", file, "\n", NULL); | |
177 gaim_debug_error("gg", "Could not open file: %s\n", file); | |
178 gaim_notify_error(account, _("Could't open file"), msg, NULL); | |
179 g_free(msg); | |
180 g_free(file); | |
2806
1ffac7cf4e94
[gaim-migrate @ 2819]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
181 return; |
1ffac7cf4e94
[gaim-migrate @ 2819]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
182 } |
11360 | 183 |
184 while (fread(tmp, sizeof(gchar), 49, fh) == 49) { | |
185 tmp[49] = '\0'; | |
186 /* gaim_debug_info("gg", "read: %s\n", tmp); */ | |
187 ptr = g_strconcat(buddylist, tmp, NULL); | |
188 memset(tmp, '\0', 50); | |
189 g_free(buddylist); | |
190 buddylist = ptr; | |
191 } | |
192 fclose(fh); | |
193 g_free(tmp); | |
194 | |
195 ggp_buddylist_load(gc, buddylist); | |
196 g_free(buddylist); | |
197 | |
198 gaim_notify_info(account, | |
199 _("Load Buddylist..."), | |
200 _("Buddylist loaded successfully!"), NULL); | |
2806
1ffac7cf4e94
[gaim-migrate @ 2819]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
201 } |
11360 | 202 /* }}} */ |
203 | |
204 /* | |
205 */ | |
206 /* static void ggp_action_buddylist_save(GaimPluginAction *action) {{{ */ | |
207 static void ggp_action_buddylist_save(GaimPluginAction *action) | |
208 { | |
209 GaimConnection *gc = (GaimConnection *)action->context; | |
210 | |
211 gaim_request_file(action, _("Save buddylist..."), NULL, TRUE, | |
212 G_CALLBACK(ggp_callback_buddylist_save_ok), NULL, gc); | |
213 } | |
214 /* }}} */ | |
2806
1ffac7cf4e94
[gaim-migrate @ 2819]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2792
diff
changeset
|
215 |
11360 | 216 /* |
217 */ | |
218 /* static void ggp_action_buddylist_load(GaimPluginAction *action) {{{ */ | |
219 static void ggp_action_buddylist_load(GaimPluginAction *action) | |
220 { | |
221 GaimConnection *gc = (GaimConnection *)action->context; | |
222 | |
223 gaim_request_file(action, "Load buddylist from file...", NULL, FALSE, | |
224 G_CALLBACK(ggp_callback_buddylist_load_ok), NULL, gc); | |
225 } | |
226 /* }}} */ | |
227 | |
228 /* | |
229 */ | |
11414 | 230 /* static void ggp_callback_register_account_ok(GaimConnection *gc, GaimRequestFields *fields) {{{ */ |
231 static void ggp_callback_register_account_ok(GaimConnection *gc, GaimRequestFields *fields) | |
232 { | |
233 GaimAccount *account; | |
234 GGPInfo *info = gc->proto_data; | |
235 struct gg_http *h = NULL; | |
236 struct gg_pubdir *s; | |
237 uin_t uin; | |
238 gchar *email, *p1, *p2, *t; | |
11545
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
239 GGPToken *token = info->register_token; |
11414 | 240 |
241 email = charset_convert(gaim_request_fields_get_string(fields, "email"), | |
242 "UTF-8", "CP1250"); | |
243 p1 = charset_convert(gaim_request_fields_get_string(fields, "password1"), | |
244 "UTF-8", "CP1250"); | |
245 p2 = charset_convert(gaim_request_fields_get_string(fields, "password2"), | |
246 "UTF-8", "CP1250"); | |
247 t = charset_convert(gaim_request_fields_get_string(fields, "token"), | |
248 "UTF-8", "CP1250"); | |
249 | |
250 account = gaim_connection_get_account(gc); | |
251 | |
252 if (email == NULL || p1 == NULL || p2 == NULL || t == NULL || | |
253 *email == '\0' || *p1 == '\0' || *p2 == '\0' || *t == '\0') { | |
11545
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
254 gaim_connection_error(gc, _("Fill in the registration fields.")); |
11414 | 255 goto exit_err; |
256 } | |
257 | |
258 if (g_utf8_collate(p1, p2) != 0) { | |
11545
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
259 gaim_connection_error(gc, _("Passwords do not match.")); |
11414 | 260 goto exit_err; |
261 } | |
262 | |
11545
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
263 h = gg_register3(email, p1, token->token_id, t, 0); |
11414 | 264 if (h == NULL || !(s = h->data) || !s->success) { |
11545
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
265 gaim_connection_error(gc, |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
266 _("Unable to register new account. Error occurred.\n")); |
11414 | 267 goto exit_err; |
268 } | |
269 | |
270 uin = s->uin; | |
271 gaim_debug_info("gg", "registered uin: %d\n", uin); | |
272 | |
11545
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
273 g_free(t); |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
274 t = g_strdup_printf("%u", uin); |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
275 gaim_account_set_username(account, t); |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
276 /* Save the password if remembering passwords for the account */ |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
277 gaim_account_set_password(account, p1); |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
278 |
11414 | 279 gaim_notify_info(NULL, _("New Gadu-Gadu Account Registered"), |
280 _("Registration completed successfully!"), NULL); | |
281 | |
11545
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
282 /* TODO: the currently open Accounts Window will not be updated withthe new username and etc, we need to somehow have it refresh at this point */ |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
283 |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
284 /* Need to disconnect or actually log in. For now, we disconnect. */ |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
285 gaim_connection_destroy(gc); |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
286 |
11414 | 287 exit_err: |
288 gg_register_free(h); | |
289 g_free(email); | |
290 g_free(p1); | |
291 g_free(p2); | |
292 g_free(t); | |
11545
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
293 g_free(token->token_id); |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
294 g_free(token); |
11414 | 295 } |
296 /* }}} */ | |
297 | |
11545
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
298 static void ggp_callback_register_account_cancel(GaimConnection *gc, GaimRequestFields *fields) |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
299 { |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
300 GGPInfo *info = gc->proto_data; |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
301 GGPToken *token = info->register_token; |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
302 |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
303 gaim_connection_destroy(gc); |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
304 |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
305 g_free(token->token_id); |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
306 g_free(token); |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
307 |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
308 } |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
309 |
11414 | 310 /* ----- PUBLIC DIRECTORY SEARCH ---------------------------------------- */ |
311 | |
312 /* | |
313 */ | |
314 /* static void ggp_callback_show_next(GaimConnection *gc, GList *row) {{{ */ | |
315 static void ggp_callback_show_next(GaimConnection *gc, GList *row) | |
316 { | |
317 GGPInfo *info = gc->proto_data; | |
318 | |
319 g_free(info->search_form->offset); | |
320 info->search_form->offset = g_strdup(info->search_form->last_uin); | |
321 ggp_search_start(gc, info->search_form); | |
322 } | |
323 /* }}} */ | |
324 | |
325 /* | |
326 */ | |
327 /* static void ggp_callback_add_buddy(GaimConnection *gc, GList *row) {{{ */ | |
328 static void ggp_callback_add_buddy(GaimConnection *gc, GList *row) | |
329 { | |
330 gaim_blist_request_add_buddy(gaim_connection_get_account(gc), | |
331 g_list_nth_data(row, 0), NULL, NULL); | |
332 } | |
333 /* }}} */ | |
334 | |
335 /* | |
336 */ | |
337 /* static void ggp_callback_find_buddies(GaimConnection *gc, GaimRequestFields *fields) {{{ */ | |
338 static void ggp_callback_find_buddies(GaimConnection *gc, GaimRequestFields *fields) | |
339 { | |
340 GGPInfo *info = gc->proto_data; | |
341 GGPSearchForm *form; | |
342 | |
343 form = ggp_search_form_new(); | |
344 /* | |
345 * TODO: Fail if we have already a form attached. Only one search | |
346 * at a time will be allowed for now. | |
347 */ | |
348 info->search_form = form; | |
349 | |
350 form->lastname = charset_convert(gaim_request_fields_get_string(fields, "lastname"), | |
351 "UTF-8", "CP1250"); | |
352 form->firstname = charset_convert(gaim_request_fields_get_string(fields, "firstname"), | |
353 "UTF-8", "CP1250"); | |
354 form->nickname = charset_convert(gaim_request_fields_get_string(fields, "nickname"), | |
355 "UTF-8", "CP1250"); | |
356 form->city = charset_convert(gaim_request_fields_get_string(fields, "city"), | |
357 "UTF-8", "CP1250"); | |
358 form->birthyear = charset_convert(gaim_request_fields_get_string(fields, "year"), | |
359 "UTF-8", "CP1250"); | |
360 | |
361 switch (gaim_request_fields_get_choice(fields, "gender")) { | |
362 case 1: | |
363 form->gender = g_strdup(GG_PUBDIR50_GENDER_MALE); | |
364 break; | |
365 case 2: | |
366 form->gender = g_strdup(GG_PUBDIR50_GENDER_FEMALE); | |
367 break; | |
368 default: | |
369 form->gender = NULL; | |
370 break; | |
371 } | |
372 | |
373 form->active = gaim_request_fields_get_bool(fields, "active") | |
374 ? g_strdup(GG_PUBDIR50_ACTIVE_TRUE) : NULL; | |
375 | |
376 form->offset = g_strdup("0"); | |
377 | |
378 ggp_search_start(gc, form); | |
379 } | |
380 /* }}} */ | |
381 | |
382 /* | |
383 */ | |
384 /* static void ggp_find_buddies(GaimPluginAction *action) {{{ */ | |
385 static void ggp_find_buddies(GaimPluginAction *action) | |
386 { | |
387 GaimConnection *gc = (GaimConnection *)action->context; | |
388 | |
389 GaimRequestFields *fields; | |
390 GaimRequestFieldGroup *group; | |
391 GaimRequestField *field; | |
392 | |
393 fields = gaim_request_fields_new(); | |
394 group = gaim_request_field_group_new(NULL); | |
395 gaim_request_fields_add_group(fields, group); | |
396 | |
397 field = gaim_request_field_string_new("lastname", _("Last name"), NULL, FALSE); | |
398 gaim_request_field_string_set_masked(field, FALSE); | |
399 gaim_request_field_group_add_field(group, field); | |
400 | |
401 field = gaim_request_field_string_new("firstname", _("First name"), NULL, FALSE); | |
402 gaim_request_field_string_set_masked(field, FALSE); | |
403 gaim_request_field_group_add_field(group, field); | |
404 | |
405 field = gaim_request_field_string_new("nickname", _("Nickname"), NULL, FALSE); | |
406 gaim_request_field_string_set_masked(field, FALSE); | |
407 gaim_request_field_group_add_field(group, field); | |
408 | |
409 field = gaim_request_field_string_new("city", _("City"), NULL, FALSE); | |
410 gaim_request_field_string_set_masked(field, FALSE); | |
411 gaim_request_field_group_add_field(group, field); | |
412 | |
413 field = gaim_request_field_string_new("year", _("Year of birth"), NULL, FALSE); | |
414 gaim_request_field_group_add_field(group, field); | |
415 | |
416 field = gaim_request_field_choice_new("gender", "Gender", 0); | |
417 gaim_request_field_choice_add(field, "Male or female"); | |
418 gaim_request_field_choice_add(field, "Male"); | |
419 gaim_request_field_choice_add(field, "Female"); | |
420 gaim_request_field_group_add_field(group, field); | |
421 | |
422 field = gaim_request_field_bool_new("active", _("Only online"), FALSE); | |
423 gaim_request_field_group_add_field(group, field); | |
424 | |
425 gaim_request_fields(gc, | |
426 _("Find buddies"), | |
427 _("Find buddies"), | |
428 _("Please, enter your search criteria below"), | |
429 fields, | |
430 _("OK"), G_CALLBACK(ggp_callback_find_buddies), | |
431 _("Cancel"), NULL, | |
432 gc); | |
433 } | |
434 /* }}} */ | |
435 | |
436 /* ----- CHANGE PASSWORD ------------------------------------------------ */ | |
437 | |
438 /* | |
439 */ | |
11360 | 440 /* static void ggp_callback_change_passwd_ok(GaimConnection *gc, GaimRequestFields *fields) {{{ */ |
441 static void ggp_callback_change_passwd_ok(GaimConnection *gc, GaimRequestFields *fields) | |
2393 | 442 { |
11360 | 443 GaimAccount *account; |
444 GGPInfo *info = gc->proto_data; | |
445 struct gg_http *h; | |
446 gchar *cur, *p1, *p2, *t; | |
447 | |
448 cur = charset_convert(gaim_request_fields_get_string(fields, "password_cur"), | |
449 "UTF-8", "CP1250"); | |
450 p1 = charset_convert(gaim_request_fields_get_string(fields, "password1"), | |
451 "UTF-8", "CP1250"); | |
452 p2 = charset_convert(gaim_request_fields_get_string(fields, "password2"), | |
453 "UTF-8", "CP1250"); | |
454 t = charset_convert(gaim_request_fields_get_string(fields, "token"), | |
455 "UTF-8", "CP1250"); | |
456 | |
457 account = gaim_connection_get_account(gc); | |
458 | |
459 if (cur == NULL || p1 == NULL || p2 == NULL || t == NULL || | |
460 *cur == '\0' || *p1 == '\0' || *p2 == '\0' || *t == '\0') { | |
461 gaim_notify_error(account, NULL, _("Fill in the fields."), NULL); | |
462 goto exit_err; | |
463 } | |
464 | |
465 if (g_utf8_collate(p1, p2) != 0) { | |
466 gaim_notify_error(account, NULL, _("New passwords do not match."), NULL); | |
467 goto exit_err; | |
468 } | |
2393 | 469 |
11360 | 470 if (g_utf8_collate(cur, gaim_account_get_password(account)) != 0) { |
471 gaim_notify_error(account, NULL, | |
472 _("Your current password is different from the one that you specified."), | |
473 NULL); | |
474 goto exit_err; | |
475 } | |
476 | |
477 gaim_debug_info("gg", "change_passwd: old=%s; p1=%s; token=%s\n", | |
478 cur, p1, info->chpasswd_token->token_id); | |
479 | |
480 /* XXX: this e-mail should be a pref... */ | |
481 h = gg_change_passwd4(ggp_get_uin(account), | |
482 "user@example.net", gaim_account_get_password(account), | |
483 p1, info->chpasswd_token->token_id, t, 0); | |
2393 | 484 |
11360 | 485 if (h == NULL) { |
486 gaim_notify_error(account, NULL, | |
487 _("Unable to change password. Error occured.\n"), | |
488 NULL); | |
489 goto exit_err; | |
490 } | |
491 | |
492 gaim_account_set_password(account, p1); | |
493 | |
494 gg_change_passwd_free(h); | |
495 | |
496 gaim_notify_info(account, _("Change password for the Gadu-Gadu account"), | |
497 _("Password was changed successfully!"), NULL); | |
498 | |
499 exit_err: | |
500 g_free(cur); | |
501 g_free(p1); | |
502 g_free(p2); | |
503 g_free(t); | |
504 g_free(info->chpasswd_token->token_id); | |
505 g_free(info->chpasswd_token); | |
506 } | |
507 /* }}} */ | |
2393 | 508 |
11360 | 509 /* |
510 */ | |
511 /* static void ggp_change_passwd(GaimPluginAction *action) {{{ */ | |
512 static void ggp_change_passwd(GaimPluginAction *action) | |
513 { | |
514 GaimConnection *gc = (GaimConnection *)action->context; | |
515 GGPInfo *info = gc->proto_data; | |
516 GGPToken *token; | |
517 | |
518 GaimRequestFields *fields; | |
519 GaimRequestFieldGroup *group; | |
520 GaimRequestField *field; | |
521 | |
522 struct gg_http *req; | |
523 struct gg_token *t; | |
524 gchar *msg; | |
525 | |
526 gaim_debug_info("gg", "token: requested.\n"); | |
527 | |
528 /* TODO: This should be async. */ | |
529 if ((req = gg_token(0)) == NULL) { | |
530 gaim_notify_error(gaim_connection_get_account(gc), | |
531 _("Token Error"), | |
532 _("Unable to fetch the token.\n"), NULL); | |
2393 | 533 return; |
534 } | |
11360 | 535 |
536 t = req->data; | |
537 | |
538 token = g_new0(GGPToken, 1); | |
539 token->token_id = g_strdup(t->tokenid); | |
540 info->chpasswd_token = token; | |
541 | |
542 | |
543 fields = gaim_request_fields_new(); | |
544 group = gaim_request_field_group_new(NULL); | |
545 gaim_request_fields_add_group(fields, group); | |
546 | |
547 field = gaim_request_field_string_new("password_cur", _("Current password"), "", FALSE); | |
548 gaim_request_field_string_set_masked(field, TRUE); | |
549 gaim_request_field_group_add_field(group, field); | |
550 | |
551 field = gaim_request_field_string_new("password1", _("Password"), "", FALSE); | |
552 gaim_request_field_string_set_masked(field, TRUE); | |
553 gaim_request_field_group_add_field(group, field); | |
554 | |
555 field = gaim_request_field_string_new("password2", _("Password (retype)"), "", FALSE); | |
556 gaim_request_field_string_set_masked(field, TRUE); | |
557 gaim_request_field_group_add_field(group, field); | |
558 | |
559 field = gaim_request_field_string_new("token", _("Enter current token"), "", FALSE); | |
560 gaim_request_field_string_set_masked(field, FALSE); | |
561 gaim_request_field_group_add_field(group, field); | |
562 | |
563 /* original size: 60x24 */ | |
564 field = gaim_request_field_image_new("token_img", _("Current token"), req->body, req->body_size); | |
565 gaim_request_field_group_add_field(group, field); | |
566 | |
567 gg_token_free(req); | |
568 | |
569 msg = g_strdup_printf("%s %d", | |
570 _("Please, enter your current password and your new password for UIN: "), | |
571 ggp_get_uin(gaim_connection_get_account(gc))); | |
572 | |
573 gaim_request_fields(gc, | |
574 _("Change Gadu-Gadu Password"), | |
575 _("Change Gadu-Gadu Password"), | |
576 msg, | |
577 fields, _("OK"), G_CALLBACK(ggp_callback_change_passwd_ok), | |
578 _("Cancel"), NULL, gc); | |
579 | |
580 g_free(msg); | |
581 } | |
582 /* }}} */ | |
583 | |
11414 | 584 /* ----- CONFERENCES ---------------------------------------------------- */ |
585 | |
11394 | 586 /* |
587 */ | |
588 /* static void ggp_callback_add_to_chat_ok(GaimConnection *gc, GaimRequestFields *fields) {{{ */ | |
589 static void ggp_callback_add_to_chat_ok(GaimConnection *gc, GaimRequestFields *fields) | |
590 { | |
591 GGPInfo *info = gc->proto_data; | |
592 GaimRequestField *field; | |
593 const GList *sel, *l; | |
594 | |
595 field = gaim_request_fields_get_field(fields, "name"); | |
596 sel = gaim_request_field_list_get_selected(field); | |
597 gaim_debug_info("gg", "selected chat %s for buddy %s\n", sel->data, info->tmp_buddy); | |
598 | |
599 for (l = info->chats; l != NULL; l = l->next) { | |
600 GGPChat *chat = l->data; | |
601 | |
602 if (g_utf8_collate(chat->name, sel->data) == 0) { | |
603 chat->participants = g_list_append(chat->participants, info->tmp_buddy); | |
604 break; | |
605 } | |
606 } | |
607 } | |
608 /* }}} */ | |
609 | |
610 /* | |
611 */ | |
612 /* static void ggp_bmenu_add_to_chat(GaimBlistNode *node, gpointer ignored) {{{ */ | |
613 static void ggp_bmenu_add_to_chat(GaimBlistNode *node, gpointer ignored) | |
614 { | |
615 GaimBuddy *buddy; | |
616 GaimConnection *gc; | |
617 GGPInfo *info; | |
618 | |
619 GaimRequestFields *fields; | |
620 GaimRequestFieldGroup *group; | |
621 GaimRequestField *field; | |
622 | |
623 GList *l; | |
624 gchar *msg; | |
625 | |
626 buddy = (GaimBuddy *)node; | |
627 gc = gaim_account_get_connection(gaim_buddy_get_account(buddy)); | |
628 info = gc->proto_data; | |
629 | |
630 /* TODO: It tmp_buddy != NULL then stop! */ | |
631 info->tmp_buddy = g_strdup(gaim_buddy_get_name(buddy)); | |
632 | |
633 fields = gaim_request_fields_new(); | |
634 group = gaim_request_field_group_new(NULL); | |
635 gaim_request_fields_add_group(fields, group); | |
636 | |
637 field = gaim_request_field_list_new("name", "Chat name"); | |
638 for (l = info->chats; l != NULL; l = l->next) { | |
639 GGPChat *chat = l->data; | |
640 gaim_debug_info("gg", "adding chat %s\n", chat->name); | |
641 gaim_request_field_list_add(field, g_strdup(chat->name), g_strdup(chat->name)); | |
642 } | |
643 gaim_request_field_group_add_field(group, field); | |
644 | |
645 msg = g_strdup_printf(_("Select a chat for buddy: %s"), gaim_buddy_get_name(buddy)); | |
646 gaim_request_fields(gc, | |
647 _("Add to chat..."), | |
648 _("Add to chat..."), | |
649 msg, | |
650 fields, | |
651 _("Add"), G_CALLBACK(ggp_callback_add_to_chat_ok), | |
652 _("Cancel"), NULL, gc); | |
653 g_free(msg); | |
654 } | |
655 /* }}} */ | |
656 | |
11414 | 657 /* ----- BLOCK BUDDIES -------------------------------------------------- */ |
658 | |
11410 | 659 /* |
660 */ | |
661 /* static void ggp_bmenu_block(GaimBlistNode *node, gpointer ignored) {{{ */ | |
662 static void ggp_bmenu_block(GaimBlistNode *node, gpointer ignored) | |
663 { | |
664 GaimConnection *gc; | |
665 GaimBuddy *buddy; | |
666 GGPInfo *info; | |
667 uin_t uin; | |
668 | |
669 buddy = (GaimBuddy *)node; | |
670 gc = gaim_account_get_connection(gaim_buddy_get_account(buddy)); | |
671 info = gc->proto_data; | |
672 | |
673 uin = ggp_str_to_uin(gaim_buddy_get_name(buddy)); | |
674 | |
675 if (gaim_blist_node_get_bool(node, "blocked")) { | |
676 gaim_blist_node_set_bool(node, "blocked", FALSE); | |
677 gg_remove_notify_ex(info->session, uin, GG_USER_BLOCKED); | |
678 gg_add_notify_ex(info->session, uin, GG_USER_NORMAL); | |
679 gaim_debug_info("gg", "send: uin=%d; mode=NORMAL\n", uin); | |
680 } else { | |
681 gaim_blist_node_set_bool(node, "blocked", TRUE); | |
682 gg_remove_notify_ex(info->session, uin, GG_USER_NORMAL); | |
683 gg_add_notify_ex(info->session, uin, GG_USER_BLOCKED); | |
684 gaim_debug_info("gg", "send: uin=%d; mode=BLOCKED\n", uin); | |
685 } | |
686 } | |
687 /* }}} */ | |
688 | |
11360 | 689 /* ---------------------------------------------------------------------- */ |
11414 | 690 /* ----- INTERNAL CALLBACKS --------------------------------------------- */ |
691 /* ---------------------------------------------------------------------- */ | |
692 | |
693 /** | |
694 * Handle change of the status of the buddy. | |
695 * | |
696 * @param gc GaimConnection | |
697 * @param uin UIN of the buddy. | |
698 * @param status ID of the status. | |
699 * @param descr Description. | |
700 */ | |
701 /* static void ggp_generic_status_handler(GaimConnection *gc, uin_t uin, int status, const char *descr) {{{ */ | |
702 static void ggp_generic_status_handler(GaimConnection *gc, uin_t uin, int status, const char *descr) | |
703 { | |
704 gchar *from; | |
705 const char *st; | |
706 gchar *msg; | |
707 | |
708 from = g_strdup_printf("%ld", (unsigned long int)uin); | |
709 switch (status) { | |
710 case GG_STATUS_NOT_AVAIL: | |
711 case GG_STATUS_NOT_AVAIL_DESCR: | |
712 st = "offline"; | |
713 break; | |
714 case GG_STATUS_AVAIL: | |
715 case GG_STATUS_AVAIL_DESCR: | |
716 st = "online"; | |
717 break; | |
718 case GG_STATUS_BUSY: | |
719 case GG_STATUS_BUSY_DESCR: | |
720 st = "away"; | |
721 break; | |
722 case GG_STATUS_BLOCKED: | |
723 /* user is blocking us.... */ | |
724 st = "blocked"; | |
725 break; | |
726 default: | |
727 st = "online"; | |
728 gaim_debug_info("gg", "GG_EVENT_NOTIFY: Unknown status: %d\n", status); | |
729 break; | |
730 } | |
731 | |
732 gaim_debug_info("gg", "st = %s\n", st); | |
733 msg = charset_convert(descr, "CP1250", "UTF-8"); | |
734 gaim_prpl_got_user_status(gaim_connection_get_account(gc), from, st, "message", msg, NULL); | |
735 g_free(from); | |
736 g_free(msg); | |
737 } | |
738 /* }}} */ | |
739 | |
740 /** | |
741 * Dispatch a message received from a buddy. | |
742 * | |
743 * @param gc GaimConnection. | |
744 * @param ev Gadu-Gadu event structure. | |
745 */ | |
746 /* static void ggp_recv_message_handler(GaimConnection *gc, const struct gg_event *ev) {{{ */ | |
747 static void ggp_recv_message_handler(GaimConnection *gc, const struct gg_event *ev) | |
748 { | |
749 GGPInfo *info = gc->proto_data; | |
750 GaimConversation *conv; | |
751 gchar *from; | |
752 gchar *msg; | |
753 gchar *tmp; | |
754 const char *chat_name; | |
755 int chat_id; | |
756 | |
757 from = g_strdup_printf("%lu", (unsigned long int)ev->event.msg.sender); | |
758 | |
759 msg = charset_convert((const char *)ev->event.msg.message, | |
760 "CP1250", "UTF-8"); | |
761 gaim_str_strip_cr(msg); | |
762 tmp = g_markup_escape_text(msg, -1); | |
763 | |
764 gaim_debug_info("gg", "msg form (%s): %s (class = %d; rcpt_count = %d)\n", | |
765 from, tmp, ev->event.msg.msgclass, ev->event.msg.recipients_count); | |
766 | |
767 /* | |
768 * Chat between only two presons will be treated as a private message. | |
769 * It's due to some broken clients that send private messages | |
770 * with msgclass == CHAT | |
771 */ | |
772 if (ev->event.msg.recipients_count == 0) { | |
773 serv_got_im(gc, from, tmp, 0, ev->event.msg.time); | |
774 } else { | |
775 chat_name = ggp_confer_find_by_participants(gc, | |
776 ev->event.msg.recipients, | |
777 ev->event.msg.recipients_count); | |
778 if (chat_name == NULL) { | |
779 chat_name = ggp_confer_add_new(gc, NULL); | |
780 serv_got_joined_chat(gc, info->chats_count, chat_name); | |
781 ggp_confer_participants_add_uin(gc, chat_name, ev->event.msg.sender); | |
782 ggp_confer_participants_add(gc, chat_name, ev->event.msg.recipients, | |
783 ev->event.msg.recipients_count); | |
784 } | |
785 conv = ggp_confer_find_by_name(gc, chat_name); | |
786 chat_id = gaim_conv_chat_get_id(GAIM_CONV_CHAT(conv)); | |
787 serv_got_chat_in(gc, chat_id, ggp_buddy_get_name(gc, ev->event.msg.sender), | |
788 0, msg, ev->event.msg.time); | |
789 } | |
790 g_free(msg); | |
791 g_free(tmp); | |
792 g_free(from); | |
793 } | |
794 /* }}} */ | |
795 | |
796 /* | |
797 */ | |
798 /* static void ggp_callback_recv(gpointer _gc, gint fd, GaimInputCondition cond) {{{ */ | |
799 static void ggp_callback_recv(gpointer _gc, gint fd, GaimInputCondition cond) | |
800 { | |
801 GaimConnection *gc = _gc; | |
802 GGPInfo *info = gc->proto_data; | |
803 struct gg_event *ev; | |
804 int i; | |
805 | |
806 if (!(ev = gg_watch_fd(info->session))) { | |
807 gaim_debug_error("gg", "ggp_callback_recv: gg_watch_fd failed -- CRITICAL!\n"); | |
808 gaim_connection_error(gc, _("Unable to read socket")); | |
809 return; | |
810 } | |
811 | |
812 switch (ev->type) { | |
813 case GG_EVENT_NONE: | |
814 /* Nothing happened. */ | |
815 break; | |
816 case GG_EVENT_MSG: | |
817 ggp_recv_message_handler(gc, ev); | |
818 break; | |
819 case GG_EVENT_ACK: | |
820 gaim_debug_info("gg", "message sent to: %ld, delivery status=%d, seq=%d\n", | |
821 ev->event.ack.recipient, ev->event.ack.status, ev->event.ack.seq); | |
822 break; | |
823 case GG_EVENT_NOTIFY: | |
824 case GG_EVENT_NOTIFY_DESCR: | |
825 { | |
826 struct gg_notify_reply *n; | |
827 char *descr; | |
828 | |
829 gaim_debug_info("gg", "notify_pre: (%d) status: %d\n", | |
830 ev->event.notify->uin, | |
831 ev->event.notify->status); | |
832 | |
833 n = (ev->type == GG_EVENT_NOTIFY) ? ev->event.notify | |
834 : ev->event.notify_descr.notify; | |
835 | |
836 for (; n->uin; n++) { | |
837 descr = (ev->type == GG_EVENT_NOTIFY) ? NULL | |
838 : ev->event.notify_descr.descr; | |
839 gaim_debug_info("gg", "notify: (%d) status: %d; descr: %s\n", | |
840 n->uin, n->status, descr); | |
841 | |
842 ggp_generic_status_handler(gc, | |
843 n->uin, n->status, descr); | |
844 } | |
845 } | |
846 break; | |
847 case GG_EVENT_NOTIFY60: | |
848 gaim_debug_info("gg", "notify60_pre: (%d) status=%d; version=%d; descr=%s\n", | |
849 ev->event.notify60->uin, ev->event.notify60->status, | |
850 ev->event.notify60->version, ev->event.notify60->descr); | |
851 | |
852 for (i = 0; ev->event.notify60[i].uin; i++) { | |
853 gaim_debug_info("gg", "notify60: (%d) status=%d; version=%d; descr=%s\n", | |
854 ev->event.notify60[i].uin, ev->event.notify60[i].status, | |
855 ev->event.notify60[i].version, ev->event.notify60[i].descr); | |
856 | |
857 ggp_generic_status_handler(gc, | |
858 ev->event.notify60[i].uin, | |
859 ev->event.notify60[i].status, | |
860 ev->event.notify60[i].descr); | |
861 } | |
862 break; | |
863 case GG_EVENT_STATUS: | |
864 gaim_debug_info("gg", "status: (%d) status=%d; descr=%s\n", | |
865 ev->event.status.uin, ev->event.status.status, | |
866 ev->event.status.descr); | |
867 | |
868 ggp_generic_status_handler(gc, | |
869 ev->event.status.uin, | |
870 ev->event.status.status, | |
871 ev->event.status.descr); | |
872 break; | |
873 case GG_EVENT_STATUS60: | |
874 gaim_debug_info("gg", "status60: (%d) status=%d; version=%d; descr=%s\n", | |
875 ev->event.status60.uin, | |
876 ev->event.status60.status, | |
877 ev->event.status60.version, | |
878 ev->event.status60.descr); | |
879 | |
880 ggp_generic_status_handler(gc, | |
881 ev->event.status60.uin, | |
882 ev->event.status60.status, | |
883 ev->event.status60.descr); | |
884 break; | |
885 case GG_EVENT_USERLIST: | |
886 if (ev->event.userlist.type == GG_USERLIST_GET_REPLY) { | |
887 gaim_debug_info("gg", "GG_USERLIST_GET_REPLY\n"); | |
888 if (ev->event.userlist.reply != NULL) { | |
889 ggp_buddylist_load(gc, ev->event.userlist.reply); | |
890 } | |
891 break; | |
892 } else { | |
893 gaim_debug_info("gg", "GG_USERLIST_PUT_REPLY. Userlist stored on the server.\n"); | |
894 } | |
895 break; | |
896 case GG_EVENT_PUBDIR50_SEARCH_REPLY: | |
897 { | |
898 GaimNotifySearchResults *results; | |
899 GaimNotifySearchColumn *column; | |
900 gg_pubdir50_t req = ev->event.pubdir50; | |
901 int res_count = 0; | |
902 int start; | |
903 int i; | |
904 | |
905 res_count = gg_pubdir50_count(req); | |
906 if (res_count < 1) { | |
907 gaim_debug_info("gg", "GG_EVENT_PUBDIR50_SEARCH_REPLY: Nothing found\n"); | |
908 return; | |
909 } | |
910 res_count = (res_count > 20) ? 20 : res_count; | |
911 | |
912 results = gaim_notify_searchresults_new(); | |
913 | |
914 column = gaim_notify_searchresults_column_new("UIN"); | |
915 gaim_notify_searchresults_column_add(results, column); | |
916 | |
917 column = gaim_notify_searchresults_column_new("First name"); | |
918 gaim_notify_searchresults_column_add(results, column); | |
919 | |
920 column = gaim_notify_searchresults_column_new("Nick name"); | |
921 gaim_notify_searchresults_column_add(results, column); | |
922 | |
923 column = gaim_notify_searchresults_column_new("City"); | |
924 gaim_notify_searchresults_column_add(results, column); | |
925 | |
926 column = gaim_notify_searchresults_column_new("Birth year"); | |
927 gaim_notify_searchresults_column_add(results, column); | |
928 | |
929 gaim_debug_info("gg", "Going with %d entries\n", res_count); | |
930 | |
931 start = (int)ggp_str_to_uin(gg_pubdir50_get(req, 0, GG_PUBDIR50_START)); | |
932 gaim_debug_info("gg", "start = %d\n", start); | |
933 | |
934 for (i = 0; i < res_count; i++) { | |
935 GList *row = NULL; | |
936 char *birth = ggp_search_get_result(req, i, GG_PUBDIR50_BIRTHYEAR); | |
937 | |
938 /* TODO: Status will be displayed as an icon. */ | |
939 /* row = g_list_append(row, ggp_search_get_result(req, i, GG_PUBDIR50_STATUS)); */ | |
940 row = g_list_append(row, ggp_search_get_result(req, i, GG_PUBDIR50_UIN)); | |
941 row = g_list_append(row, ggp_search_get_result(req, i, GG_PUBDIR50_FIRSTNAME)); | |
942 row = g_list_append(row, ggp_search_get_result(req, i, GG_PUBDIR50_NICKNAME)); | |
943 row = g_list_append(row, ggp_search_get_result(req, i, GG_PUBDIR50_CITY)); | |
944 row = g_list_append(row, (birth && strncmp(birth, "0", 1)) ? birth : g_strdup("-")); | |
945 gaim_notify_searchresults_row_add(results, row); | |
946 if (i == res_count - 1) { | |
947 g_free(info->search_form->last_uin); | |
948 info->search_form->last_uin = ggp_search_get_result(req, i, GG_PUBDIR50_UIN); | |
949 } | |
950 } | |
951 | |
952 gaim_notify_searchresults_button_add(results, GAIM_NOTIFY_BUTTON_CONTINUE, ggp_callback_show_next); | |
953 gaim_notify_searchresults_button_add(results, GAIM_NOTIFY_BUTTON_ADD_BUDDY, ggp_callback_add_buddy); | |
954 if (info->searchresults_window == NULL) { | |
955 void *h = gaim_notify_searchresults(gc, _("Gadu-Gadu Public Directory"), | |
956 _("Search results"), NULL, results, NULL, NULL); | |
957 info->searchresults_window = h; | |
958 } else { | |
959 gaim_notify_searchresults_new_rows(gc, results, info->searchresults_window, NULL); | |
960 } | |
961 } | |
962 break; | |
963 default: | |
964 gaim_debug_error("gg", "unsupported event type=%d\n", ev->type); | |
965 break; | |
966 } | |
967 | |
968 gg_free_event(ev); | |
969 } | |
970 /* }}} */ | |
971 | |
972 /* ---------------------------------------------------------------------- */ | |
11360 | 973 /* ----- GaimPluginProtocolInfo ----------------------------------------- */ |
974 /* ---------------------------------------------------------------------- */ | |
975 | |
976 /* static const char *ggp_list_icon(GaimAccount *account, GaimBuddy *buddy) {{{ */ | |
977 static const char *ggp_list_icon(GaimAccount *account, GaimBuddy *buddy) | |
978 { | |
979 return "gadu-gadu"; | |
980 } | |
981 /* }}} */ | |
982 | |
983 /* static void ggp_list_emblems(GaimBuddy *b, const char **se, const char **sw, const char **nw, const char **ne) {{{ */ | |
984 static void ggp_list_emblems(GaimBuddy *b, const char **se, const char **sw, const char **nw, const char **ne) | |
985 { | |
986 GaimPresence *presence = gaim_buddy_get_presence(b); | |
987 | |
988 /* | |
989 * Note to myself: | |
990 * The only valid status types are those defined | |
991 * in prpl_info->status_types. | |
992 * | |
993 * Usable icons: away, blocked, dnd, extendedaway, | |
994 * freeforchat, ignored, invisible, na, offline. | |
995 */ | |
996 | |
997 if (!GAIM_BUDDY_IS_ONLINE(b)) { | |
998 *se = "offline"; | |
999 } else if (gaim_presence_is_status_active(presence, "away")) { | |
1000 *se = "away"; | |
1001 } else if (gaim_presence_is_status_active(presence, "online")) { | |
1002 *se = "online"; | |
1003 } else if (gaim_presence_is_status_active(presence, "offline")) { | |
1004 *se = "offline"; | |
1005 } else if (gaim_presence_is_status_active(presence, "blocked")) { | |
1006 *se = "blocked"; | |
1007 } else { | |
1008 *se = "offline"; | |
1009 gaim_debug_info("gg", "ggp_list_emblems: unknown status\n"); | |
1010 } | |
2393 | 1011 } |
11360 | 1012 /* }}} */ |
2393 | 1013 |
11360 | 1014 /* static char *ggp_status_text(GaimBuddy *b) {{{ */ |
1015 static char *ggp_status_text(GaimBuddy *b) | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2835
diff
changeset
|
1016 { |
11360 | 1017 GaimStatus *status; |
1018 const char *msg; | |
1019 char *text; | |
1020 char *tmp; | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2835
diff
changeset
|
1021 |
11360 | 1022 status = gaim_presence_get_active_status(gaim_buddy_get_presence(b)); |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2835
diff
changeset
|
1023 |
11360 | 1024 msg = gaim_status_get_attr_string(status, "message"); |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2835
diff
changeset
|
1025 |
11360 | 1026 if (msg != NULL) { |
1027 tmp = gaim_markup_strip_html(msg); | |
1028 text = g_markup_escape_text(tmp, -1); | |
1029 g_free(tmp); | |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2835
diff
changeset
|
1030 |
11360 | 1031 return text; |
1032 } else { | |
1033 tmp = g_strdup(gaim_status_get_name(status)); | |
1034 text = g_markup_escape_text(tmp, -1); | |
1035 g_free(tmp); | |
1036 | |
1037 return text; | |
8997 | 1038 } |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2835
diff
changeset
|
1039 } |
11360 | 1040 /* }}} */ |
2846
4b3f17ca66bf
[gaim-migrate @ 2859]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2835
diff
changeset
|
1041 |
11360 | 1042 /* static char *ggp_tooltip_text(GaimBuddy *b) {{{ */ |
1043 static char *ggp_tooltip_text(GaimBuddy *b) | |
1044 { | |
1045 GaimStatus *status; | |
1046 char *text; | |
1047 gchar *ret; | |
1048 const char *msg, *name; | |
1049 | |
1050 status = gaim_presence_get_active_status(gaim_buddy_get_presence(b)); | |
1051 msg = gaim_status_get_attr_string(status, "message"); | |
1052 name = gaim_status_get_name(status); | |
1053 | |
1054 if (msg != NULL) { | |
1055 char *tmp = gaim_markup_strip_html(msg); | |
1056 text = g_markup_escape_text(tmp, -1); | |
1057 g_free(tmp); | |
1058 | |
1059 ret = g_strdup_printf("\n<b>%s:</b> %s: %s", | |
1060 _("Status"), name, text); | |
1061 | |
1062 g_free(text); | |
1063 } else { | |
1064 ret = g_strdup_printf("\n<b>%s:</b> %s", | |
1065 _("Status"), name); | |
1066 } | |
1067 | |
1068 return ret; | |
1069 } | |
1070 /* }}} */ | |
1071 | |
1072 /* static GList *ggp_status_types(GaimAccount *account) {{{ */ | |
1073 static GList *ggp_status_types(GaimAccount *account) | |
1074 { | |
1075 GaimStatusType *type; | |
1076 GList *types = NULL; | |
1077 | |
1078 type = gaim_status_type_new_with_attrs(GAIM_STATUS_OFFLINE, "offline", _("Offline"), | |
1079 TRUE, TRUE, FALSE, "message", _("Message"), | |
1080 gaim_value_new(GAIM_TYPE_STRING), NULL); | |
1081 types = g_list_append(types, type); | |
1082 | |
11522 | 1083 type = gaim_status_type_new_with_attrs(GAIM_STATUS_AVAILABLE, "online", _("Online"), |
11360 | 1084 TRUE, TRUE, FALSE, "message", _("Message"), |
1085 gaim_value_new(GAIM_TYPE_STRING), NULL); | |
1086 types = g_list_append(types, type); | |
1087 | |
1088 /* | |
1089 * Without this selecting Available or Invisible as own status doesn't | |
1090 * work. It's not used and not needed to show status of buddies. | |
1091 */ | |
1092 type = gaim_status_type_new_with_attrs(GAIM_STATUS_AVAILABLE, "available", _("Available"), | |
1093 TRUE, TRUE, FALSE, "message", _("Message"), | |
1094 gaim_value_new(GAIM_TYPE_STRING), NULL); | |
1095 types = g_list_append(types, type); | |
1096 | |
1097 type = gaim_status_type_new_with_attrs(GAIM_STATUS_HIDDEN, "invisible", _("Invisible"), | |
1098 TRUE, TRUE, FALSE, "message", _("Message"), | |
1099 gaim_value_new(GAIM_TYPE_STRING), NULL); | |
1100 types = g_list_append(types, type); | |
1101 | |
1102 /* type = gaim_status_type_new_with_attrs(GAIM_STATUS_UNAVAILABLE, "not-available", "Not Available", */ | |
1103 /* TRUE, TRUE, FALSE, "message", _("Message"), */ | |
1104 /* gaim_value_new(GAIM_TYPE_STRING), NULL); */ | |
1105 /* types = g_list_append(types, type); */ | |
1106 | |
1107 type = gaim_status_type_new_with_attrs(GAIM_STATUS_AWAY, "away", _("Busy"), | |
1108 TRUE, TRUE, FALSE, "message", _("Message"), | |
1109 gaim_value_new(GAIM_TYPE_STRING), NULL); | |
1110 types = g_list_append(types, type); | |
1111 | |
1112 type = gaim_status_type_new_with_attrs(GAIM_STATUS_HIDDEN, "blocked", _("Blocked"), | |
1113 TRUE, TRUE, FALSE, "message", _("Message"), | |
1114 gaim_value_new(GAIM_TYPE_STRING), NULL); | |
1115 types = g_list_append(types, type); | |
1116 | |
1117 return types; | |
1118 } | |
1119 /* }}} */ | |
1120 | |
1121 /* static GList *ggp_blist_node_menu(GaimBlistNode *node) {{{ */ | |
1122 static GList *ggp_blist_node_menu(GaimBlistNode *node) | |
2393 | 1123 { |
11394 | 1124 GaimBlistNodeAction *act; |
2393 | 1125 GList *m = NULL; |
4333 | 1126 |
11360 | 1127 if (!GAIM_BLIST_NODE_IS_BUDDY(node)) |
1128 return NULL; | |
4333 | 1129 |
11410 | 1130 act = gaim_blist_node_action_new(_("Add to chat"), ggp_bmenu_add_to_chat, NULL, NULL); |
1131 m = g_list_append(m, act); | |
1132 | |
1133 if (gaim_blist_node_get_bool(node, "blocked")) | |
1134 act = gaim_blist_node_action_new(_("Unblock"), ggp_bmenu_block, NULL, NULL); | |
1135 else | |
1136 act = gaim_blist_node_action_new(_("Block"), ggp_bmenu_block, NULL, NULL); | |
11394 | 1137 m = g_list_append(m, act); |
2393 | 1138 |
1139 return m; | |
1140 } | |
11360 | 1141 /* }}} */ |
2393 | 1142 |
11394 | 1143 /* static GList *ggp_chat_info(GaimConnection *gc) {{{ */ |
1144 static GList *ggp_chat_info(GaimConnection *gc) | |
1145 { | |
1146 GList *m = NULL; | |
1147 struct proto_chat_entry *pce; | |
1148 | |
1149 pce = g_new0(struct proto_chat_entry, 1); | |
1150 pce->label = _("Chat _name:"); | |
1151 pce->identifier = "name"; | |
1152 pce->required = TRUE; | |
1153 m = g_list_append(m, pce); | |
1154 | |
1155 return m; | |
1156 } | |
1157 /* }}} */ | |
1158 | |
11360 | 1159 /* static void ggp_login(GaimAccount *account, GaimStatus *status) {{{ */ |
1160 static void ggp_login(GaimAccount *account, GaimStatus *status) | |
2393 | 1161 { |
11360 | 1162 GaimConnection *gc = gaim_account_get_connection(account); |
1163 struct gg_login_params *glp = g_new0(struct gg_login_params, 1); | |
1164 GGPInfo *info = g_new0(GGPInfo, 1); | |
1165 | |
11394 | 1166 /* Probably this should be move to some *_new() function. */ |
11360 | 1167 info->session = NULL; |
1168 info->searchresults_window = NULL; | |
11394 | 1169 info->chats = NULL; |
1170 info->chats_count = 0; | |
11360 | 1171 |
1172 gc->proto_data = info; | |
1173 | |
1174 glp->uin = ggp_get_uin(account); | |
1175 glp->password = (char *)gaim_account_get_password(account); | |
1176 | |
1177 glp->async = 0; | |
1178 glp->status = GG_STATUS_AVAIL; | |
1179 glp->tls = 0; | |
1180 | |
1181 info->session = gg_login(glp); | |
1182 if (info->session == NULL) { | |
1183 gaim_connection_error(gc, _("Connection failed.")); | |
1184 g_free(glp); | |
1185 return; | |
1186 } | |
1187 gaim_debug_info("gg", "ggp_login: so far so good.\n"); | |
1188 | |
1189 gc->inpa = gaim_input_add(info->session->fd, GAIM_INPUT_READ, ggp_callback_recv, gc); | |
2393 | 1190 |
11360 | 1191 gg_change_status(info->session, GG_STATUS_AVAIL); |
1192 gaim_connection_set_state(gc, GAIM_CONNECTED); | |
1193 ggp_buddylist_send(gc); | |
1194 } | |
1195 /* }}} */ | |
1196 | |
1197 /* static void ggp_close(GaimConnection *gc) {{{ */ | |
1198 static void ggp_close(GaimConnection *gc) | |
1199 { | |
8997 | 1200 |
11360 | 1201 if (gc == NULL) { |
1202 gaim_debug_info("gg", "gc == NULL\n"); | |
1203 return; | |
1204 } | |
1205 | |
11538
5c6c2e893803
[gaim-migrate @ 13792]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11522
diff
changeset
|
1206 if (gc->proto_data) { |
5c6c2e893803
[gaim-migrate @ 13792]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11522
diff
changeset
|
1207 GGPInfo *info = gc->proto_data; |
5c6c2e893803
[gaim-migrate @ 13792]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11522
diff
changeset
|
1208 /* XXX: Any way to pass description here? */ |
5c6c2e893803
[gaim-migrate @ 13792]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11522
diff
changeset
|
1209 if (info->session != NULL) { |
5c6c2e893803
[gaim-migrate @ 13792]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11522
diff
changeset
|
1210 gg_change_status(info->session, GG_STATUS_NOT_AVAIL); |
5c6c2e893803
[gaim-migrate @ 13792]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11522
diff
changeset
|
1211 gg_logoff(info->session); |
5c6c2e893803
[gaim-migrate @ 13792]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11522
diff
changeset
|
1212 gg_free_session(info->session); |
5c6c2e893803
[gaim-migrate @ 13792]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11522
diff
changeset
|
1213 } |
11545
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
1214 g_free(info); |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
1215 gc->proto_data = NULL; |
11538
5c6c2e893803
[gaim-migrate @ 13792]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11522
diff
changeset
|
1216 } |
11360 | 1217 |
1218 if (gc->inpa > 0) | |
1219 gaim_input_remove(gc->inpa); | |
1220 | |
1221 ggp_buddylist_offline(gc); | |
2393 | 1222 |
11360 | 1223 gaim_debug_info("gg", "Connection closed.\n"); |
1224 } | |
1225 /* }}} */ | |
1226 | |
1227 /* static int ggp_send_im(GaimConnection *gc, const char *who, const char *msg, GaimConvImFlags flags) {{{ */ | |
1228 static int ggp_send_im(GaimConnection *gc, const char *who, const char *msg, GaimConvImFlags flags) | |
1229 { | |
1230 GGPInfo *info = gc->proto_data; | |
11394 | 1231 char *tmp; |
11360 | 1232 |
1233 if (strlen(msg) == 0) | |
1234 return 1; | |
1235 | |
1236 tmp = charset_convert(msg, "UTF-8", "CP1250"); | |
2393 | 1237 |
11360 | 1238 if (tmp != NULL && strlen(tmp) > 0) { |
11394 | 1239 if (gg_send_message(info->session, GG_CLASS_MSG, ggp_str_to_uin(who), (unsigned char *)tmp) < 0) { |
11360 | 1240 return -1; |
1241 } | |
1242 } | |
1243 | |
1244 return 1; | |
1245 } | |
1246 /* }}} */ | |
1247 | |
1248 /* static void ggp_get_info(GaimConnection *gc, const char *name) { {{{ */ | |
1249 static void ggp_get_info(GaimConnection *gc, const char *name) | |
1250 { | |
1251 GGPInfo *info = gc->proto_data; | |
1252 GGPSearchForm *form; | |
2393 | 1253 |
11414 | 1254 form = ggp_search_form_new(); |
11360 | 1255 info->search_form = form; |
1256 | |
1257 form->uin = g_strdup(name); | |
1258 form->offset = g_strdup("0"); | |
1259 form->last_uin = g_strdup("0"); | |
1260 | |
11414 | 1261 ggp_search_start(gc, form); |
11360 | 1262 } |
1263 /* }}} */ | |
1264 | |
1265 /* static void ggp_set_status(GaimAccount *account, GaimStatus *status) {{{ */ | |
1266 static void ggp_set_status(GaimAccount *account, GaimStatus *status) | |
1267 { | |
1268 GaimStatusPrimitive prim; | |
1269 GaimConnection *gc; | |
1270 GGPInfo *info; | |
11397 | 1271 const char *status_id, *msg; |
11360 | 1272 int new_status, new_status_descr; |
1273 | |
1274 prim = gaim_status_type_get_primitive(gaim_status_get_type(status)); | |
1275 | |
1276 if (!gaim_status_is_active(status)) | |
1277 return; | |
1278 | |
1279 if (prim == GAIM_STATUS_OFFLINE) { | |
1280 gaim_account_disconnect(account); | |
1281 return; | |
1282 } | |
1283 | |
1284 if (!gaim_account_is_connected(account)) { | |
1285 gaim_account_connect(account); | |
2393 | 1286 return; |
1287 } | |
11360 | 1288 |
1289 gc = gaim_account_get_connection(account); | |
1290 info = gc->proto_data; | |
1291 | |
1292 status_id = gaim_status_get_id(status); | |
1293 | |
1294 gaim_debug_info("gg", "ggp_set_status: Requested status = %s\n", status_id); | |
2393 | 1295 |
11360 | 1296 if (strcmp(status_id, "available") == 0) { |
1297 new_status = GG_STATUS_AVAIL; | |
1298 new_status_descr = GG_STATUS_AVAIL_DESCR; | |
1299 } else if (strcmp(status_id, "away") == 0) { | |
1300 new_status = GG_STATUS_BUSY; | |
1301 new_status_descr = GG_STATUS_BUSY_DESCR; | |
1302 } else if (strcmp(status_id, "invisible") == 0) { | |
1303 new_status = GG_STATUS_INVISIBLE; | |
1304 new_status_descr = GG_STATUS_INVISIBLE_DESCR; | |
1305 } else { | |
1306 new_status = GG_STATUS_AVAIL; | |
1307 new_status_descr = GG_STATUS_AVAIL_DESCR; | |
1308 gaim_debug_info("gg", "ggp_set_status: uknown status requested (status_id=%s)\n", status_id); | |
1309 } | |
4916 | 1310 |
11397 | 1311 msg = gaim_status_get_attr_string(status, "message"); |
11360 | 1312 |
1313 if (msg == NULL) { | |
1314 gaim_debug_info("gg", "ggp_set_status: msg == NULL\n"); | |
1315 gg_change_status(info->session, new_status); | |
1316 } else { | |
1317 char *tmp = charset_convert(msg, "UTF-8", "CP1250"); | |
1318 gaim_debug_info("gg", "ggp_set_status: msg != NULL. msg = %s\n", tmp); | |
1319 gaim_debug_info("gg", "ggp_set_status: gg_change_status_descr() = %d\n", | |
1320 gg_change_status_descr(info->session, new_status_descr, tmp)); | |
1321 g_free(tmp); | |
1322 } | |
9944 | 1323 |
11360 | 1324 } |
1325 /* }}} */ | |
1326 | |
1327 /* static void ggp_add_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) {{{ */ | |
1328 static void ggp_add_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) | |
1329 { | |
1330 GGPInfo *info = gc->proto_data; | |
1331 | |
1332 gg_add_notify(info->session, ggp_str_to_uin(buddy->name)); | |
1333 } | |
1334 /* }}} */ | |
1335 | |
1336 /* static void ggp_remove_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) {{{ */ | |
1337 static void ggp_remove_buddy(GaimConnection *gc, GaimBuddy *buddy, GaimGroup *group) | |
1338 { | |
1339 GGPInfo *info = gc->proto_data; | |
1340 | |
1341 gg_remove_notify(info->session, ggp_str_to_uin(buddy->name)); | |
1342 } | |
1343 /* }}} */ | |
1344 | |
11394 | 1345 /* static void ggp_join_chat(GaimConnection *gc, GHashTable *data) {{{ */ |
1346 static void ggp_join_chat(GaimConnection *gc, GHashTable *data) | |
1347 { | |
1348 GGPInfo *info = gc->proto_data; | |
1349 GGPChat *chat; | |
1350 char *chat_name; | |
1351 GList *l; | |
1352 | |
1353 chat_name = g_hash_table_lookup(data, "name"); | |
1354 | |
1355 if (chat_name == NULL) | |
1356 return; | |
1357 | |
1358 gaim_debug_info("gg", "joined %s chat\n", chat_name); | |
1359 | |
1360 for (l = info->chats; l != NULL; l = l->next) { | |
1361 chat = l->data; | |
1362 | |
1363 if (chat != NULL && g_utf8_collate(chat->name, chat_name) == 0) { | |
1364 gaim_notify_error(gc, _("Chat error"), | |
1365 _("This chat name is already in use"), NULL); | |
1366 return; | |
1367 } | |
1368 } | |
1369 | |
11414 | 1370 ggp_confer_add_new(gc, chat_name); |
11394 | 1371 serv_got_joined_chat(gc, info->chats_count, chat_name); |
1372 } | |
1373 /* }}} */ | |
1374 | |
1375 /* static char *ggp_get_chat_name(GHashTable *data) { {{{ */ | |
1376 static char *ggp_get_chat_name(GHashTable *data) { | |
1377 return g_strdup(g_hash_table_lookup(data, "name")); | |
1378 } | |
1379 /* }}} */ | |
1380 | |
1381 /* static int ggp_chat_send(GaimConnection *gc, int id, const char *message) {{{ */ | |
1382 static int ggp_chat_send(GaimConnection *gc, int id, const char *message) | |
1383 { | |
1384 GaimConversation *conv; | |
1385 GGPInfo *info = gc->proto_data; | |
1386 GGPChat *chat = NULL; | |
1387 GList *l; | |
1388 char *msg; | |
1389 uin_t *uins; | |
1390 int count = 0; | |
1391 | |
1392 if ((conv = gaim_find_chat(gc, id)) == NULL) | |
1393 return -EINVAL; | |
1394 | |
1395 for (l = info->chats; l != NULL; l = l->next) { | |
1396 chat = l->data; | |
1397 | |
1398 if (g_utf8_collate(chat->name, conv->name) == 0) { | |
1399 gaim_debug_info("gg", "found conv!\n"); | |
1400 break; | |
1401 } | |
1402 | |
1403 chat = NULL; | |
1404 } | |
1405 | |
1406 if (chat == NULL) { | |
1407 gaim_debug_error("gg", "ggp_chat_send: Hm... that's strange. No such chat?\n"); | |
1408 return -EINVAL; | |
1409 } | |
1410 | |
1411 uins = g_new0(uin_t, g_list_length(chat->participants)); | |
1412 for (l = chat->participants; l != NULL; l = l->next) { | |
1413 gchar *name = l->data; | |
1414 uin_t uin; | |
1415 | |
1416 if ((uin = ggp_str_to_uin(name)) != 0) | |
1417 uins[count++] = uin; | |
1418 } | |
1419 | |
1420 msg = charset_convert(message, "UTF-8", "CP1250"); | |
1421 gg_send_message_confer(info->session, GG_CLASS_CHAT, count, uins, (unsigned char *)msg); | |
1422 g_free(msg); | |
1423 g_free(uins); | |
1424 | |
1425 serv_got_chat_in(gc, id, gaim_account_get_username(gaim_connection_get_account(gc)), | |
1426 0, message, time(NULL)); | |
1427 | |
1428 return 0; | |
1429 } | |
1430 /* }}} */ | |
1431 | |
11360 | 1432 /* static void ggp_keepalive(GaimConnection *gc) {{{ */ |
1433 static void ggp_keepalive(GaimConnection *gc) | |
1434 { | |
1435 GGPInfo *info = gc->proto_data; | |
1436 | |
1437 /* gaim_debug_info("gg", "Keeping connection alive....\n"); */ | |
1438 | |
1439 if (gg_ping(info->session) < 0) { | |
1440 gaim_debug_info("gg", "Not connected to the server " | |
1441 "or gg_session is not correct\n"); | |
1442 gaim_connection_error(gc, _("Not connected to the server.")); | |
4916 | 1443 } |
2393 | 1444 } |
11360 | 1445 /* }}} */ |
1446 | |
1447 /* static void ggp_register_user(GaimAccount *account) {{{ */ | |
1448 static void ggp_register_user(GaimAccount *account) | |
1449 { | |
11542
cda814bad7f8
[gaim-migrate @ 13797]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11541
diff
changeset
|
1450 GaimConnection *gc = gaim_account_get_connection(account); |
11360 | 1451 GaimRequestFields *fields; |
1452 GaimRequestFieldGroup *group; | |
1453 GaimRequestField *field; | |
1454 GGPInfo *info; | |
1455 GGPToken *token; | |
1456 | |
1457 struct gg_http *req; | |
1458 struct gg_token *t; | |
1459 | |
1460 gaim_debug_info("gg", "token: requested.\n"); | |
1461 | |
1462 if ((req = gg_token(0)) == NULL) { | |
11544 | 1463 gaim_connection_error(gc, _("Token Error: Unable to fetch the token.\n")); |
11360 | 1464 return; |
1465 } | |
1466 t = req->data; | |
1467 | |
1468 info = g_new0(GGPInfo, 1); | |
1469 gc->proto_data = info; | |
1470 | |
1471 token = g_new0(GGPToken, 1); | |
1472 token->token_id = g_strdup(t->tokenid); | |
1473 info->register_token = token; | |
1474 | |
1475 fields = gaim_request_fields_new(); | |
1476 group = gaim_request_field_group_new(NULL); | |
1477 gaim_request_fields_add_group(fields, group); | |
1478 | |
1479 field = gaim_request_field_string_new("email", _("e-Mail"), "", FALSE); | |
1480 gaim_request_field_string_set_masked(field, FALSE); | |
1481 gaim_request_field_group_add_field(group, field); | |
1482 | |
1483 field = gaim_request_field_string_new("password1", _("Password"), "", FALSE); | |
1484 gaim_request_field_string_set_masked(field, TRUE); | |
1485 gaim_request_field_group_add_field(group, field); | |
1486 | |
1487 field = gaim_request_field_string_new("password2", _("Password (retype)"), "", FALSE); | |
1488 gaim_request_field_string_set_masked(field, TRUE); | |
1489 gaim_request_field_group_add_field(group, field); | |
1490 | |
1491 field = gaim_request_field_string_new("token", _("Enter current token"), "", FALSE); | |
1492 gaim_request_field_string_set_masked(field, FALSE); | |
1493 gaim_request_field_group_add_field(group, field); | |
1494 | |
1495 /* original size: 60x24 */ | |
1496 field = gaim_request_field_image_new("token_img", _("Current token"), req->body, req->body_size); | |
1497 gaim_request_field_group_add_field(group, field); | |
1498 | |
1499 gg_token_free(req); | |
4916 | 1500 |
11360 | 1501 gaim_request_fields(account, |
1502 _("Register New Gadu-Gadu Account"), | |
1503 _("Register New Gadu-Gadu Account"), | |
1504 _("Please, fill in the following fields"), | |
1505 fields, _("OK"), G_CALLBACK(ggp_callback_register_account_ok), | |
11545
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
1506 _("Cancel"), G_CALLBACK(ggp_callback_register_account_cancel), |
85abf1deac05
[gaim-migrate @ 13800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11544
diff
changeset
|
1507 gc); |
2393 | 1508 } |
11360 | 1509 /* }}} */ |
2393 | 1510 |
11360 | 1511 /* static GList *ggp_actions(GaimPlugin *plugin, gpointer context) {{{ */ |
1512 static GList *ggp_actions(GaimPlugin *plugin, gpointer context) | |
8775 | 1513 { |
11360 | 1514 GList *m = NULL; |
1515 GaimPluginAction *act; | |
1516 | |
1517 act = gaim_plugin_action_new(_("Find buddies"), ggp_find_buddies); | |
1518 m = g_list_append(m, act); | |
1519 | |
1520 m = g_list_append(m, NULL); | |
1521 | |
1522 act = gaim_plugin_action_new(_("Change password"), ggp_change_passwd); | |
1523 m = g_list_append(m, act); | |
1524 | |
1525 m = g_list_append(m, NULL); | |
1526 | |
1527 act = gaim_plugin_action_new(_("Upload buddylist to Server"), ggp_action_buddylist_put); | |
1528 m = g_list_append(m, act); | |
8775 | 1529 |
11360 | 1530 act = gaim_plugin_action_new(_("Download buddylist from Server"), ggp_action_buddylist_get); |
1531 m = g_list_append(m, act); | |
1532 | |
1533 act = gaim_plugin_action_new(_("Delete buddylist from Server"), ggp_action_buddylist_delete); | |
1534 m = g_list_append(m, act); | |
1535 | |
1536 act = gaim_plugin_action_new(_("Save buddylist to file"), ggp_action_buddylist_save); | |
1537 m = g_list_append(m, act); | |
8775 | 1538 |
11360 | 1539 act = gaim_plugin_action_new(_("Load buddylist from file"), ggp_action_buddylist_load); |
1540 m = g_list_append(m, act); | |
1541 | |
1542 return m; | |
8775 | 1543 } |
11360 | 1544 /* }}} */ |
8775 | 1545 |
11360 | 1546 /* prpl_info setup {{{ */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1547 static GaimPluginProtocolInfo prpl_info = |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1548 { |
11360 | 1549 OPT_PROTO_REGISTER_NOSCREENNAME, |
1550 NULL, /* user_splits */ | |
1551 NULL, /* protocol_options */ | |
9950 | 1552 NO_BUDDY_ICONS, /* icon_spec */ |
11360 | 1553 ggp_list_icon, /* list_icon */ |
1554 ggp_list_emblems, /* list_emblems */ | |
1555 ggp_status_text, /* status_text */ | |
1556 ggp_tooltip_text, /* tooltip_text */ | |
1557 ggp_status_types, /* status_types */ | |
1558 ggp_blist_node_menu, /* blist_node_menu */ | |
11394 | 1559 ggp_chat_info, /* chat_info */ |
11360 | 1560 NULL, /* chat_info_defaults */ |
1561 ggp_login, /* login */ | |
1562 ggp_close, /* close */ | |
1563 ggp_send_im, /* send_im */ | |
1564 NULL, /* set_info */ | |
1565 NULL, /* send_typing */ | |
1566 ggp_get_info, /* get_info */ | |
1567 ggp_set_status, /* set_away */ | |
1568 NULL, /* set_idle */ | |
1569 NULL, /* change_passwd */ | |
1570 ggp_add_buddy, /* add_buddy */ | |
1571 NULL, /* add_buddies */ | |
1572 ggp_remove_buddy, /* remove_buddy */ | |
1573 NULL, /* remove_buddies */ | |
1574 NULL, /* add_permit */ | |
1575 NULL, /* add_deny */ | |
1576 NULL, /* rem_permit */ | |
1577 NULL, /* rem_deny */ | |
1578 NULL, /* set_permit_deny */ | |
11394 | 1579 ggp_join_chat, /* join_chat */ |
11360 | 1580 NULL, /* reject_chat */ |
11394 | 1581 ggp_get_chat_name, /* get_chat_name */ |
11360 | 1582 NULL, /* chat_invite */ |
1583 NULL, /* chat_leave */ | |
1584 NULL, /* chat_whisper */ | |
11394 | 1585 ggp_chat_send, /* chat_send */ |
11360 | 1586 ggp_keepalive, /* keepalive */ |
1587 ggp_register_user, /* register_user */ | |
1588 NULL, /* get_cb_info */ | |
1589 NULL, /* get_cb_away */ | |
1590 NULL, /* alias_buddy */ | |
1591 NULL, /* group_buddy */ | |
1592 NULL, /* rename_group */ | |
1593 NULL, /* buddy_free */ | |
1594 NULL, /* convo_closed */ | |
1595 NULL, /* normalize */ | |
1596 NULL, /* set_buddy_icon */ | |
1597 NULL, /* remove_group */ | |
1598 NULL, /* get_cb_real_name */ | |
1599 NULL, /* set_chat_topic */ | |
1600 NULL, /* find_blist_chat */ | |
1601 NULL, /* roomlist_get_list */ | |
1602 NULL, /* roomlist_cancel */ | |
1603 NULL, /* roomlist_expand_category */ | |
1604 NULL, /* can_receive_file */ | |
1605 NULL /* send_file */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1606 }; |
11360 | 1607 /* }}} */ |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1608 |
11360 | 1609 /* GaimPluginInfo setup {{{ */ |
1610 static GaimPluginInfo info = { | |
1611 GAIM_PLUGIN_MAGIC, /* magic */ | |
1612 GAIM_MAJOR_VERSION, /* major_version */ | |
1613 GAIM_MINOR_VERSION, /* minor_version */ | |
1614 GAIM_PLUGIN_PROTOCOL, /* plugin type */ | |
1615 NULL, /* ui_requirement */ | |
1616 0, /* flags */ | |
1617 NULL, /* dependencies */ | |
1618 GAIM_PRIORITY_DEFAULT, /* priority */ | |
1619 | |
1620 "prpl-gg", /* id */ | |
1621 "Gadu-Gadu", /* name */ | |
1622 VERSION, /* version */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1623 |
11360 | 1624 N_("Gadu-Gadu Protocol Plugin"), /* summary */ |
1625 N_("Polish popular IM"), /* description */ | |
1626 "boler@sourceforge.net", /* author */ | |
1627 GAIM_WEBSITE, /* homepage */ | |
1628 | |
1629 NULL, /* load */ | |
1630 NULL, /* unload */ | |
1631 NULL, /* destroy */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1632 |
11360 | 1633 NULL, /* ui_info */ |
1634 &prpl_info, /* extra_info */ | |
1635 NULL, /* prefs_info */ | |
1636 ggp_actions /* actions */ | |
1637 }; | |
1638 /* }}} */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1639 |
11541
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1640 static void gaim_gg_debug_handler(int level, const char * format, va_list args) { |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1641 GaimDebugLevel gaim_level; |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1642 char *msg = g_strdup_vprintf(format, args); |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1643 |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1644 /* This is pretty pointless since the GG_DEBUG levels don't correspond to |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1645 * the gaim ones */ |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1646 switch (level) { |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1647 case GG_DEBUG_FUNCTION: |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1648 gaim_level = GAIM_DEBUG_INFO; |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1649 break; |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1650 case GG_DEBUG_MISC: |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1651 case GG_DEBUG_NET: |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1652 case GG_DEBUG_DUMP: |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1653 case GG_DEBUG_TRAFFIC: |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1654 default: |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1655 gaim_level = GAIM_DEBUG_MISC; |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1656 break; |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1657 } |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1658 |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1659 gaim_debug(gaim_level, "gg", msg); |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1660 g_free(msg); |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1661 } |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1662 |
11360 | 1663 /* |
1664 */ | |
1665 /* static void init_plugin(GaimPlugin *plugin) {{{ */ | |
1666 static void init_plugin(GaimPlugin *plugin) | |
2393 | 1667 { |
5638
0bdfa28c678e
[gaim-migrate @ 6047]
Christian Hammond <chipx86@chipx86.com>
parents:
5618
diff
changeset
|
1668 GaimAccountOption *option; |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1669 |
11360 | 1670 option = gaim_account_option_string_new(_("Nickname"), "nick", _("Gadu-Gadu User")); |
1671 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | |
3572 | 1672 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5136
diff
changeset
|
1673 my_protocol = plugin; |
11541
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1674 |
5fc015909164
[gaim-migrate @ 13796]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
11538
diff
changeset
|
1675 gg_debug_handler = gaim_gg_debug_handler; |
2393 | 1676 } |
11360 | 1677 /* }}} */ |
2393 | 1678 |
11360 | 1679 GAIM_INIT_PLUGIN(gadu-gadu, init_plugin, info); |
1680 | |
1681 /* vim: set ts=4 sts=0 sw=4 noet: */ | |
11394 | 1682 |