Replace functions which called once with their bodies
[pidgin-git.git] / libpurple / protocols / gg / multilogon.c
blob2630d59b6f8193f61b3b9b32f5e9ecb946689e38
1 /* purple
3 * Purple is the legal property of its developers, whose names are too numerous
4 * to list here. Please refer to the COPYRIGHT file distributed with this
5 * source distribution.
7 * Rewritten from scratch during Google Summer of Code 2012
8 * by Tomek Wasilczyk (http://www.wasilczyk.pl).
10 * Previously implemented by:
11 * - Arkadiusz Miskiewicz <misiek@pld.org.pl> - first implementation (2001);
12 * - Bartosz Oler <bartosz@bzimage.us> - reimplemented during GSoC 2005;
13 * - Krzysztof Klinikowski <grommasher@gmail.com> - some parts (2009-2011).
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 2 of the License, or
18 * (at your option) any later version.
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, write to the Free Software
27 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
30 #include "multilogon.h"
32 #include <debug.h>
34 #include "gg.h"
35 #include "keymapper.h"
36 #include "utils.h"
37 #include "message-prpl.h"
39 typedef struct
41 uint64_t id;
42 uint32_t remote_addr;
43 gchar *name;
44 time_t logon_time;
45 } ggp_multilogon_session_info;
47 struct _ggp_multilogon_session_data
49 int session_count;
50 ggp_multilogon_session_info *sessions;
51 PurpleRequestDatasheet *sheet_handle;
52 gpointer dialog_handle;
53 ggp_keymapper *sid_mapper;
56 static inline ggp_multilogon_session_data *
57 ggp_multilogon_get_mldata(PurpleConnection *gc);
60 static inline ggp_multilogon_session_data *
61 ggp_multilogon_get_mldata(PurpleConnection *gc)
63 GGPInfo *accdata = purple_connection_get_protocol_data(gc);
64 return accdata->multilogon_data;
67 void
68 ggp_multilogon_setup(PurpleConnection *gc)
70 GGPInfo *accdata = purple_connection_get_protocol_data(gc);
72 ggp_multilogon_session_data *mldata =
73 g_new0(ggp_multilogon_session_data, 1);
74 accdata->multilogon_data = mldata;
76 mldata->sid_mapper = ggp_keymapper_new();
79 static void
80 ggp_multilogon_free_sessions(PurpleConnection *gc)
82 ggp_multilogon_session_data *mldata = ggp_multilogon_get_mldata(gc);
83 int i;
85 for (i = 0; i < mldata->session_count; i++)
86 g_free(mldata->sessions[i].name);
87 g_free(mldata->sessions);
89 mldata->sessions = NULL;
90 mldata->session_count = 0;
93 void
94 ggp_multilogon_cleanup(PurpleConnection *gc)
96 ggp_multilogon_session_data *mldata = ggp_multilogon_get_mldata(gc);
98 if (mldata->dialog_handle) {
99 purple_request_close(PURPLE_REQUEST_FIELDS,
100 mldata->dialog_handle);
101 mldata->dialog_handle = NULL;
104 ggp_multilogon_free_sessions(gc);
105 ggp_keymapper_free(mldata->sid_mapper);
106 g_free(mldata);
109 static uint64_t
110 ggp_multilogon_sid_from_libgadu(gg_multilogon_id_t lsid)
112 uint64_t sid;
114 memcpy(&sid, lsid.id, sizeof(uint64_t));
116 return sid;
119 static void
120 ggp_multilogon_sid_to_libgadu(uint64_t sid, gg_multilogon_id_t *lsid)
122 g_return_if_fail(lsid != NULL);
124 memcpy(lsid->id, &sid, sizeof(uint64_t));
127 static void
128 ggp_multilogon_fill_sessions(PurpleRequestDatasheet *sheet,
129 PurpleConnection *gc)
131 ggp_multilogon_session_data *mldata = ggp_multilogon_get_mldata(gc);
132 ggp_keymapper *km = mldata->sid_mapper;
133 int i;
135 purple_request_datasheet_record_mark_all_for_rem(sheet);
137 for (i = 0; i < mldata->session_count; i++) {
138 ggp_multilogon_session_info *sess = &mldata->sessions[i];
139 PurpleRequestDatasheetRecord *rec;
141 rec = purple_request_datasheet_record_add(sheet,
142 ggp_keymapper_to_key(km, sess->id));
144 purple_request_datasheet_record_set_string_data(rec, 0,
145 ggp_ipv4_to_str(sess->remote_addr));
146 purple_request_datasheet_record_set_string_data(rec, 1,
147 purple_date_format_full(localtime(&sess->logon_time)));
148 purple_request_datasheet_record_set_string_data(rec, 2,
149 sess->name);
152 purple_request_datasheet_record_remove_marked(sheet);
155 void
156 ggp_multilogon_info(PurpleConnection *gc, struct gg_event_multilogon_info *info)
158 ggp_multilogon_session_data *mldata = ggp_multilogon_get_mldata(gc);
159 int i;
161 ggp_multilogon_free_sessions(gc);
163 purple_debug_info("gg", "ggp_multilogon_info: session list changed "
164 "(count now: %d)\n", info->count);
166 mldata->sessions = g_new(ggp_multilogon_session_info, info->count);
167 for (i = 0; i < info->count; i++) {
168 struct gg_multilogon_session *lsess = &info->sessions[i];
169 ggp_multilogon_session_info *psess = &mldata->sessions[i];
171 psess->id = ggp_multilogon_sid_from_libgadu(lsess->id);
172 psess->remote_addr = lsess->remote_addr;
173 psess->name = g_strdup(lsess->name);
174 psess->logon_time = lsess->logon_time;
177 mldata->session_count = info->count;
179 if (mldata->sheet_handle != NULL)
180 ggp_multilogon_fill_sessions(mldata->sheet_handle, gc);
183 static void
184 ggp_multilogon_disconnect(PurpleRequestDatasheetRecord *rec, gpointer _gc)
186 PurpleConnection *gc = _gc;
187 ggp_multilogon_session_data *mldata = ggp_multilogon_get_mldata(gc);
188 GGPInfo *accdata = purple_connection_get_protocol_data(gc);
189 uint64_t sid;
190 gpointer key;
191 gg_multilogon_id_t lsid;
193 key = purple_request_datasheet_record_get_key(rec);
194 sid = ggp_keymapper_from_key(mldata->sid_mapper, key);
196 ggp_multilogon_sid_to_libgadu(sid, &lsid);
197 gg_multilogon_disconnect(accdata->session, lsid);
199 purple_request_datasheet_record_remove(
200 purple_request_datasheet_record_get_datasheet(rec), key);
203 void
204 ggp_multilogon_dialog(PurpleConnection *gc)
206 ggp_multilogon_session_data *mldata = ggp_multilogon_get_mldata(gc);
207 PurpleRequestField *field;
208 PurpleRequestFields *fields;
209 PurpleRequestFieldGroup *group;
210 PurpleRequestCommonParameters *cpar;
211 PurpleRequestDatasheet *sheet;
212 PurpleRequestDatasheetAction *action;
213 gpointer dialog_handle;
215 if (mldata->dialog_handle != NULL)
216 return;
218 fields = purple_request_fields_new();
219 group = purple_request_field_group_new(NULL);
220 purple_request_fields_add_group(fields, group);
222 sheet = purple_request_datasheet_new();
223 purple_request_datasheet_add_column(sheet,
224 PURPLE_REQUEST_DATASHEET_COLUMN_STRING, _("IP"));
225 purple_request_datasheet_add_column(sheet,
226 PURPLE_REQUEST_DATASHEET_COLUMN_STRING, _("Logon time"));
227 purple_request_datasheet_add_column(sheet,
228 PURPLE_REQUEST_DATASHEET_COLUMN_STRING, _("Session"));
230 action = purple_request_datasheet_action_new();
231 purple_request_datasheet_action_set_label(action, _("Disconnect"));
232 purple_request_datasheet_action_set_cb(action,
233 ggp_multilogon_disconnect, gc);
234 purple_request_datasheet_add_action(sheet, action);
235 ggp_multilogon_fill_sessions(sheet, gc);
237 field = purple_request_field_datasheet_new("sessions", NULL, sheet);
238 purple_request_field_group_add_field(group, field);
240 cpar = purple_request_cpar_new();
241 purple_request_cpar_set_icon(cpar, PURPLE_REQUEST_ICON_DIALOG);
243 dialog_handle = purple_request_fields(gc,
244 _("Other Gadu-Gadu sessions"), NULL, NULL, fields,
245 NULL, NULL, _("Close"), NULL,
246 cpar, NULL);
247 mldata->sheet_handle = sheet;
248 mldata->dialog_handle = dialog_handle;
250 purple_request_add_close_notify(dialog_handle,
251 purple_callback_set_zero, &mldata->sheet_handle);
252 purple_request_add_close_notify(dialog_handle,
253 purple_callback_set_zero, &mldata->dialog_handle);