libpurple/protocols/gg/multilogon.c

changeset 35144
3590ceb242b5
parent 35139
c30787ce6256
child 35149
7804dd798227
equal deleted inserted replaced
35143:7847eb4b93b0 35144:3590ceb242b5
30 #include "multilogon.h" 30 #include "multilogon.h"
31 31
32 #include <debug.h> 32 #include <debug.h>
33 33
34 #include "gg.h" 34 #include "gg.h"
35 #include "keymapper.h"
35 #include "utils.h" 36 #include "utils.h"
36 #include "message-prpl.h" 37 #include "message-prpl.h"
37 38
39 typedef struct
40 {
41 uint64_t id;
42 uint32_t remote_addr;
43 gchar *name;
44 time_t logon_time;
45 } ggp_multilogon_session_info;
46
38 struct _ggp_multilogon_session_data 47 struct _ggp_multilogon_session_data
39 { 48 {
40 int session_count; 49 int session_count;
50 ggp_multilogon_session_info *sessions;
51 PurpleRequestDatasheet *sheet_handle;
52 gpointer dialog_handle;
53 ggp_keymapper *sid_mapper;
41 }; 54 };
42 55
43 static inline ggp_multilogon_session_data * 56 static inline ggp_multilogon_session_data *
44 ggp_multilogon_get_mldata(PurpleConnection *gc); 57 ggp_multilogon_get_mldata(PurpleConnection *gc);
45 58
50 { 63 {
51 GGPInfo *accdata = purple_connection_get_protocol_data(gc); 64 GGPInfo *accdata = purple_connection_get_protocol_data(gc);
52 return accdata->multilogon_data; 65 return accdata->multilogon_data;
53 } 66 }
54 67
55 void ggp_multilogon_setup(PurpleConnection *gc) 68 void
69 ggp_multilogon_setup(PurpleConnection *gc)
56 { 70 {
57 GGPInfo *accdata = purple_connection_get_protocol_data(gc); 71 GGPInfo *accdata = purple_connection_get_protocol_data(gc);
58 72
59 ggp_multilogon_session_data *mldata = 73 ggp_multilogon_session_data *mldata =
60 g_new0(ggp_multilogon_session_data, 1); 74 g_new0(ggp_multilogon_session_data, 1);
61 accdata->multilogon_data = mldata; 75 accdata->multilogon_data = mldata;
62 } 76
63 77 mldata->sid_mapper = ggp_keymapper_new();
64 void ggp_multilogon_cleanup(PurpleConnection *gc) 78 }
65 { 79
66 ggp_multilogon_session_data *mldata = ggp_multilogon_get_mldata(gc); 80 static void
81 ggp_multilogon_free_sessions(PurpleConnection *gc)
82 {
83 ggp_multilogon_session_data *mldata = ggp_multilogon_get_mldata(gc);
84 int i;
85
86 for (i = 0; i < mldata->session_count; i++)
87 g_free(mldata->sessions[i].name);
88 g_free(mldata->sessions);
89
90 mldata->sessions = NULL;
91 mldata->session_count = 0;
92 }
93
94 void
95 ggp_multilogon_cleanup(PurpleConnection *gc)
96 {
97 ggp_multilogon_session_data *mldata = ggp_multilogon_get_mldata(gc);
98
99 if (mldata->dialog_handle) {
100 purple_request_close(PURPLE_REQUEST_FIELDS,
101 mldata->dialog_handle);
102 mldata->dialog_handle = NULL;
103 }
104
105 ggp_multilogon_free_sessions(gc);
106 ggp_keymapper_free(mldata->sid_mapper);
67 g_free(mldata); 107 g_free(mldata);
68 } 108 }
69 109
70 void ggp_multilogon_info(PurpleConnection *gc, 110 static uint64_t
71 struct gg_event_multilogon_info *info) 111 ggp_multilogon_sid_from_libgadu(gg_multilogon_id_t lsid)
72 { 112 {
73 ggp_multilogon_session_data *mldata = ggp_multilogon_get_mldata(gc); 113 uint64_t sid;
114
115 memcpy(&sid, lsid.id, sizeof(uint64_t));
116
117 return sid;
118 }
119
120 static gg_multilogon_id_t
121 ggp_multilogon_sid_to_libgadu(uint64_t sid)
122 {
123 gg_multilogon_id_t lsid;
124
125 memcpy(lsid.id, &sid, sizeof(uint64_t));
126
127 return lsid;
128 }
129
130 void
131 ggp_multilogon_fill_sessions(PurpleRequestDatasheet *sheet,
132 PurpleConnection *gc)
133 {
134 ggp_multilogon_session_data *mldata = ggp_multilogon_get_mldata(gc);
135 ggp_keymapper *km = mldata->sid_mapper;
74 int i; 136 int i;
75 137
76 purple_debug_info("gg", "ggp_multilogon_info: session list changed\n"); 138 purple_request_datasheet_record_mark_all_for_rem(sheet);
77 for (i = 0; i < info->count; i++) 139
78 { 140 for (i = 0; i < mldata->session_count; i++) {
79 purple_debug_misc("gg", "ggp_multilogon_info: " 141 ggp_multilogon_session_info *sess = &mldata->sessions[i];
80 "session [%s] logged in at %lu\n", 142 PurpleRequestDatasheetRecord *rec;
81 info->sessions[i].name, 143
82 (unsigned long)info->sessions[i].logon_time); 144 rec = purple_request_datasheet_record_add(sheet,
145 ggp_keymapper_to_key(km, sess->id));
146
147 purple_request_datasheet_record_set_string_data(rec, 0,
148 ggp_ipv4_to_str(sess->remote_addr));
149 purple_request_datasheet_record_set_string_data(rec, 1,
150 purple_date_format_full(localtime(&sess->logon_time)));
151 purple_request_datasheet_record_set_string_data(rec, 2,
152 sess->name);
83 } 153 }
84 154
155 purple_request_datasheet_record_remove_marked(sheet);
156 }
157
158 void
159 ggp_multilogon_info(PurpleConnection *gc, struct gg_event_multilogon_info *info)
160 {
161 ggp_multilogon_session_data *mldata = ggp_multilogon_get_mldata(gc);
162 int i;
163
164 ggp_multilogon_free_sessions(gc);
165
166 purple_debug_info("gg", "ggp_multilogon_info: session list changed "
167 "(count now: %d)\n", info->count);
168
169 mldata->sessions = g_new(ggp_multilogon_session_info, info->count);
170 for (i = 0; i < info->count; i++) {
171 struct gg_multilogon_session *lsess = &info->sessions[i];
172 ggp_multilogon_session_info *psess = &mldata->sessions[i];
173
174 psess->id = ggp_multilogon_sid_from_libgadu(lsess->id);
175 psess->remote_addr = lsess->remote_addr;
176 psess->name = g_strdup(lsess->name);
177 psess->logon_time = lsess->logon_time;
178 }
179
85 mldata->session_count = info->count; 180 mldata->session_count = info->count;
86 } 181
87 182 if (mldata->sheet_handle != NULL)
88 int ggp_multilogon_get_session_count(PurpleConnection *gc) 183 ggp_multilogon_fill_sessions(mldata->sheet_handle, gc);
89 { 184 }
90 ggp_multilogon_session_data *mldata = ggp_multilogon_get_mldata(gc); 185
91 return mldata->session_count; 186 void
92 } 187 ggp_multilogon_disconnect(PurpleRequestDatasheetRecord *rec, gpointer _gc)
188 {
189 PurpleConnection *gc = _gc;
190 ggp_multilogon_session_data *mldata = ggp_multilogon_get_mldata(gc);
191 GGPInfo *accdata = purple_connection_get_protocol_data(gc);
192 uint64_t sid;
193 gpointer key;
194
195 key = purple_request_datasheet_record_get_key(rec);
196 sid = ggp_keymapper_from_key(mldata->sid_mapper, key);
197
198 gg_multilogon_disconnect(accdata->session,
199 ggp_multilogon_sid_to_libgadu(sid));
200
201 purple_request_datasheet_record_remove(
202 purple_request_datasheet_record_get_datasheet(rec), key);
203 }
204
205 void
206 ggp_multilogon_dialog(PurpleConnection *gc)
207 {
208 ggp_multilogon_session_data *mldata = ggp_multilogon_get_mldata(gc);
209 PurpleRequestField *field;
210 PurpleRequestFields *fields;
211 PurpleRequestFieldGroup *group;
212 PurpleRequestCommonParameters *cpar;
213 PurpleRequestDatasheet *sheet;
214 PurpleRequestDatasheetAction *action;
215 gpointer dialog_handle;
216
217 if (mldata->dialog_handle != NULL)
218 return;
219
220 fields = purple_request_fields_new();
221 group = purple_request_field_group_new(NULL);
222 purple_request_fields_add_group(fields, group);
223
224 sheet = purple_request_datasheet_new();
225 purple_request_datasheet_add_column(sheet,
226 PURPLE_REQUEST_DATASHEET_COLUMN_STRING, _("IP"));
227 purple_request_datasheet_add_column(sheet,
228 PURPLE_REQUEST_DATASHEET_COLUMN_STRING, _("Logon time"));
229 purple_request_datasheet_add_column(sheet,
230 PURPLE_REQUEST_DATASHEET_COLUMN_STRING, _("Session"));
231
232 action = purple_request_datasheet_action_new();
233 purple_request_datasheet_action_set_label(action, _("Disconnect"));
234 purple_request_datasheet_action_set_cb(action,
235 ggp_multilogon_disconnect, gc);
236 purple_request_datasheet_add_action(sheet, action);
237 ggp_multilogon_fill_sessions(sheet, gc);
238
239 field = purple_request_field_datasheet_new("sessions", NULL, sheet);
240 purple_request_field_group_add_field(group, field);
241
242 cpar = purple_request_cpar_new();
243 purple_request_cpar_set_icon(cpar, PURPLE_REQUEST_ICON_DIALOG);
244
245 dialog_handle = purple_request_fields(gc,
246 _("Other Gadu-Gadu sessions"), NULL, NULL, fields,
247 NULL, NULL, _("Close"), NULL,
248 cpar, NULL);
249 mldata->sheet_handle = sheet;
250 mldata->dialog_handle = dialog_handle;
251
252 purple_request_add_close_notify(dialog_handle,
253 purple_callback_set_zero, &mldata->sheet_handle);
254 purple_request_add_close_notify(dialog_handle,
255 purple_callback_set_zero, &mldata->dialog_handle);
256 }

mercurial