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
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"
35 #include "keymapper.h"
37 #include "message-prpl.h"
45 } ggp_multilogon_session_info
;
47 struct _ggp_multilogon_session_data
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
;
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();
80 ggp_multilogon_free_sessions(PurpleConnection
*gc
)
82 ggp_multilogon_session_data
*mldata
= ggp_multilogon_get_mldata(gc
);
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;
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
);
110 ggp_multilogon_sid_from_libgadu(gg_multilogon_id_t lsid
)
114 memcpy(&sid
, lsid
.id
, sizeof(uint64_t));
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));
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
;
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,
152 purple_request_datasheet_record_remove_marked(sheet
);
156 ggp_multilogon_info(PurpleConnection
*gc
, struct gg_event_multilogon_info
*info
)
158 ggp_multilogon_session_data
*mldata
= ggp_multilogon_get_mldata(gc
);
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
);
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
);
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
);
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
)
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
,
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
);