Remove obsolete file.
[connman] / src / manager.c
1 /*
2  *
3  *  Connection Manager
4  *
5  *  Copyright (C) 2007-2009  Intel Corporation. All rights reserved.
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License version 2 as
9  *  published by the Free Software Foundation.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  *
20  */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <gdbus.h>
27
28 #include "connman.h"
29
30 enum connman_policy {
31         CONNMAN_POLICY_UNKNOWN  = 0,
32         CONNMAN_POLICY_SINGLE   = 1,
33         CONNMAN_POLICY_MULTIPLE = 2,
34         CONNMAN_POLICY_ASK      = 3,
35 };
36
37 static enum connman_policy global_policy = CONNMAN_POLICY_SINGLE;
38 static connman_bool_t global_offlinemode = FALSE;
39
40 static const char *policy2string(enum connman_policy policy)
41 {
42         switch (policy) {
43         case CONNMAN_POLICY_UNKNOWN:
44                 break;
45         case CONNMAN_POLICY_SINGLE:
46                 return "single";
47         case CONNMAN_POLICY_MULTIPLE:
48                 return "multiple";
49         case CONNMAN_POLICY_ASK:
50                 return "ask";
51         }
52
53         return NULL;
54 }
55
56 static enum connman_policy string2policy(const char *policy)
57 {
58         if (g_str_equal(policy, "single") == TRUE)
59                 return CONNMAN_POLICY_SINGLE;
60         else if (g_str_equal(policy, "multiple") == TRUE)
61                 return CONNMAN_POLICY_MULTIPLE;
62         else if (g_str_equal(policy, "ask") == TRUE)
63                 return CONNMAN_POLICY_ASK;
64         else
65                 return CONNMAN_POLICY_UNKNOWN;
66 }
67
68 static void append_profiles(DBusMessageIter *dict)
69 {
70         DBusMessageIter entry, value, iter;
71         const char *key = "Profiles";
72
73         dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
74                                                                 NULL, &entry);
75
76         dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
77
78         dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
79                 DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING,
80                                                                 &value);
81
82         dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
83                                 DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
84         __connman_profile_list(&iter);
85         dbus_message_iter_close_container(&value, &iter);
86
87         dbus_message_iter_close_container(&entry, &value);
88
89         dbus_message_iter_close_container(dict, &entry);
90 }
91
92 static void append_services(DBusMessageIter *dict)
93 {
94         DBusMessageIter entry, value, iter;
95         const char *key = "Services";
96
97         dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
98                                                                 NULL, &entry);
99
100         dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
101
102         dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
103                 DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING,
104                                                                 &value);
105
106         dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
107                                 DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
108         __connman_service_list(&iter);
109         dbus_message_iter_close_container(&value, &iter);
110
111         dbus_message_iter_close_container(&entry, &value);
112
113         dbus_message_iter_close_container(dict, &entry);
114 }
115
116 static void append_devices(DBusMessageIter *dict)
117 {
118         DBusMessageIter entry, value, iter;
119         const char *key = "Devices";
120
121         dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
122                                                                 NULL, &entry);
123
124         dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
125
126         dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
127                 DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING,
128                                                                 &value);
129
130         dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
131                                 DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
132         __connman_element_list(NULL, CONNMAN_ELEMENT_TYPE_DEVICE, &iter);
133         dbus_message_iter_close_container(&value, &iter);
134
135         dbus_message_iter_close_container(&entry, &value);
136
137         dbus_message_iter_close_container(dict, &entry);
138 }
139
140 static void append_connections(DBusMessageIter *dict)
141 {
142         DBusMessageIter entry, value, iter;
143         const char *key = "Connections";
144
145         dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
146                                                                 NULL, &entry);
147
148         dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
149
150         dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
151                 DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING,
152                                                                 &value);
153
154         dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
155                                 DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
156         __connman_element_list(NULL, CONNMAN_ELEMENT_TYPE_CONNECTION, &iter);
157         dbus_message_iter_close_container(&value, &iter);
158
159         dbus_message_iter_close_container(&entry, &value);
160
161         dbus_message_iter_close_container(dict, &entry);
162 }
163
164 static DBusMessage *get_properties(DBusConnection *conn,
165                                         DBusMessage *msg, void *data)
166 {
167         DBusMessage *reply;
168         DBusMessageIter array, dict;
169         const char *str;
170
171         DBG("conn %p", conn);
172
173         if (__connman_security_check_privilege(msg,
174                                         CONNMAN_SECURITY_PRIVILEGE_PUBLIC) < 0)
175                 return __connman_error_permission_denied(msg);
176
177         reply = dbus_message_new_method_return(msg);
178         if (reply == NULL)
179                 return NULL;
180
181         dbus_message_iter_init_append(reply, &array);
182
183         dbus_message_iter_open_container(&array, DBUS_TYPE_ARRAY,
184                         DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
185                         DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
186                         DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
187
188         str = __connman_profile_active_path();
189         if (str != NULL)
190                 connman_dbus_dict_append_variant(&dict, "ActiveProfile",
191                                                 DBUS_TYPE_OBJECT_PATH, &str);
192
193         append_profiles(&dict);
194         append_services(&dict);
195
196         append_devices(&dict);
197         append_connections(&dict);
198
199         if (__connman_element_count(NULL, CONNMAN_ELEMENT_TYPE_CONNECTION) > 0)
200                 str = "online";
201         else
202                 str = "offline";
203
204         connman_dbus_dict_append_variant(&dict, "State",
205                                                 DBUS_TYPE_STRING, &str);
206
207         str = policy2string(global_policy);
208         if (str != NULL)
209                 connman_dbus_dict_append_variant(&dict, "Policy",
210                                                 DBUS_TYPE_STRING, &str);
211
212         connman_dbus_dict_append_variant(&dict, "OfflineMode",
213                                 DBUS_TYPE_BOOLEAN, &global_offlinemode);
214
215         dbus_message_iter_close_container(&array, &dict);
216
217         return reply;
218 }
219
220 static DBusMessage *set_property(DBusConnection *conn,
221                                         DBusMessage *msg, void *data)
222 {
223         DBusMessageIter iter, value;
224         const char *name;
225
226         DBG("conn %p", conn);
227
228         if (dbus_message_iter_init(msg, &iter) == FALSE)
229                 return __connman_error_invalid_arguments(msg);
230
231         dbus_message_iter_get_basic(&iter, &name);
232         dbus_message_iter_next(&iter);
233         dbus_message_iter_recurse(&iter, &value);
234
235         if (__connman_security_check_privilege(msg,
236                                         CONNMAN_SECURITY_PRIVILEGE_MODIFY) < 0)
237                 return __connman_error_permission_denied(msg);
238
239         if (g_str_equal(name, "Policy") == TRUE) {
240                 enum connman_policy policy;
241                 const char *str;
242
243                 dbus_message_iter_get_basic(&value, &str);
244                 policy = string2policy(str);
245                 if (policy == CONNMAN_POLICY_UNKNOWN)
246                         return __connman_error_invalid_arguments(msg);
247
248                 global_policy = policy;
249         } else if (g_str_equal(name, "OfflineMode") == TRUE) {
250                 connman_bool_t offlinemode;
251
252                 dbus_message_iter_get_basic(&value, &offlinemode);
253
254                 if (global_offlinemode == offlinemode)
255                         return __connman_error_invalid_arguments(msg);
256
257                 global_offlinemode = offlinemode;
258
259                 __connman_device_set_offlinemode(offlinemode);
260         } else if (g_str_equal(name, "ActiveProfile") == TRUE) {
261                 const char *str;
262
263                 dbus_message_iter_get_basic(&value, &str);
264
265                 return __connman_error_not_supported(msg);
266         }
267
268         return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
269 }
270
271 static DBusMessage *add_profile(DBusConnection *conn,
272                                         DBusMessage *msg, void *data)
273 {
274         const char *name;
275
276         DBG("conn %p", conn);
277
278         dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &name,
279                                                         DBUS_TYPE_INVALID);
280
281         return __connman_error_not_supported(msg);
282 }
283
284 static DBusMessage *remove_profile(DBusConnection *conn,
285                                         DBusMessage *msg, void *data)
286 {
287         const char *path;
288
289         DBG("conn %p", conn);
290
291         dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
292                                                         DBUS_TYPE_INVALID);
293
294         return __connman_error_not_supported(msg);
295 }
296
297 static DBusMessage *connect_service(DBusConnection *conn,
298                                         DBusMessage *msg, void *data)
299 {
300         DBusMessageIter iter, array;
301
302         DBG("conn %p", conn);
303
304         if (__connman_security_check_privilege(msg,
305                                         CONNMAN_SECURITY_PRIVILEGE_MODIFY) < 0)
306                 return __connman_error_permission_denied(msg);
307
308         dbus_message_iter_init(msg, &iter);
309         dbus_message_iter_recurse(&iter, &array);
310
311         while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_DICT_ENTRY) {
312                 DBusMessageIter entry, value;
313                 const char *key;
314
315                 dbus_message_iter_recurse(&array, &entry);
316                 dbus_message_iter_get_basic(&entry, &key);
317
318                 dbus_message_iter_next(&entry);
319                 dbus_message_iter_recurse(&entry, &value);
320
321                 switch (dbus_message_iter_get_arg_type(&value)) {
322                 }
323
324                 dbus_message_iter_next(&array);
325         }
326
327         return __connman_error_not_implemented(msg);
328 }
329
330 static DBusMessage *register_agent(DBusConnection *conn,
331                                         DBusMessage *msg, void *data)
332 {
333         DBusMessage *reply;
334         const char *sender, *path;
335
336         DBG("conn %p", conn);
337
338         sender = dbus_message_get_sender(msg);
339
340         dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
341                                                         DBUS_TYPE_INVALID);
342
343         reply = dbus_message_new_method_return(msg);
344         if (reply == NULL)
345                 return NULL;
346
347         dbus_message_append_args(reply, DBUS_TYPE_INVALID);
348
349         __connman_agent_register(sender, path);
350
351         return reply;
352 }
353
354 static DBusMessage *unregister_agent(DBusConnection *conn,
355                                         DBusMessage *msg, void *data)
356 {
357         DBusMessage *reply;
358         const char *sender, *path;
359
360         DBG("conn %p", conn);
361
362         sender = dbus_message_get_sender(msg);
363
364         dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
365                                                         DBUS_TYPE_INVALID);
366
367         reply = dbus_message_new_method_return(msg);
368         if (reply == NULL)
369                 return NULL;
370
371         dbus_message_append_args(reply, DBUS_TYPE_INVALID);
372
373         __connman_agent_unregister(sender, path);
374
375         return reply;
376 }
377
378 static GDBusMethodTable manager_methods[] = {
379         { "GetProperties",   "",      "a{sv}", get_properties   },
380         { "SetProperty",     "sv",    "",      set_property     },
381         { "AddProfile",      "s",     "o",     add_profile      },
382         { "RemoveProfile",   "o",     "",      remove_profile   },
383         { "ConnectService",  "a{sv}", "o",     connect_service  },
384         { "RegisterAgent",   "o",     "",      register_agent   },
385         { "UnregisterAgent", "o",     "",      unregister_agent },
386         { },
387 };
388
389 static GDBusSignalTable manager_signals[] = {
390         { "PropertyChanged", "sv" },
391         { "StateChanged",    "s"  },
392         { },
393 };
394
395 static DBusMessage *nm_sleep(DBusConnection *conn,
396                                         DBusMessage *msg, void *data)
397 {
398         DBusMessage *reply;
399
400         DBG("conn %p", conn);
401
402         reply = dbus_message_new_method_return(msg);
403         if (reply == NULL)
404                 return NULL;
405
406         dbus_message_append_args(reply, DBUS_TYPE_INVALID);
407
408         return reply;
409 }
410
411 static DBusMessage *nm_wake(DBusConnection *conn,
412                                         DBusMessage *msg, void *data)
413 {
414         DBusMessage *reply;
415
416         DBG("conn %p", conn);
417
418         reply = dbus_message_new_method_return(msg);
419         if (reply == NULL)
420                 return NULL;
421
422         dbus_message_append_args(reply, DBUS_TYPE_INVALID);
423
424         return reply;
425 }
426
427 enum {
428         NM_STATE_UNKNOWN = 0,
429         NM_STATE_ASLEEP,
430         NM_STATE_CONNECTING,
431         NM_STATE_CONNECTED,
432         NM_STATE_DISCONNECTED
433 };
434
435 static DBusMessage *nm_state(DBusConnection *conn,
436                                         DBusMessage *msg, void *data)
437 {
438         DBusMessage *reply;
439         dbus_uint32_t state;
440
441         DBG("conn %p", conn);
442
443         reply = dbus_message_new_method_return(msg);
444         if (reply == NULL)
445                 return NULL;
446
447         state = NM_STATE_DISCONNECTED;
448
449         dbus_message_append_args(reply, DBUS_TYPE_UINT32, &state,
450                                                         DBUS_TYPE_INVALID);
451
452         return reply;
453 }
454
455 static GDBusMethodTable nm_methods[] = {
456         { "sleep", "",  "",   nm_sleep        },
457         { "wake",  "",  "",   nm_wake         },
458         { "state", "",  "u",  nm_state        },
459         { },
460 };
461
462 static DBusConnection *connection = NULL;
463 static gboolean nm_compat = FALSE;
464
465 int __connman_manager_init(DBusConnection *conn, gboolean compat)
466 {
467         DBG("conn %p", conn);
468
469         connection = dbus_connection_ref(conn);
470         if (connection == NULL)
471                 return -1;
472
473         g_dbus_register_interface(connection, CONNMAN_MANAGER_PATH,
474                                         CONNMAN_MANAGER_INTERFACE,
475                                         manager_methods,
476                                         manager_signals, NULL, NULL, NULL);
477
478         if (compat == TRUE) {
479                 g_dbus_register_interface(connection, NM_PATH, NM_INTERFACE,
480                                         nm_methods, NULL, NULL, NULL, NULL);
481
482                 nm_compat = TRUE;
483         }
484
485         return 0;
486 }
487
488 void __connman_manager_cleanup(void)
489 {
490         DBG("conn %p", connection);
491
492         if (nm_compat == TRUE) {
493                 g_dbus_unregister_interface(connection, NM_PATH, NM_INTERFACE);
494         }
495
496         g_dbus_unregister_interface(connection, CONNMAN_MANAGER_PATH,
497                                                 CONNMAN_MANAGER_INTERFACE);
498
499         dbus_connection_unref(connection);
500 }