| 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 } |