Move GetInterfaces method to Manager interface
[platform/upstream/connman.git] / src / manager.c
1 /*
2  *
3  *  Connection Manager
4  *
5  *  Copyright (C) 2007-2013  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 <errno.h>
27
28 #include <gdbus.h>
29
30 #include <connman/agent.h>
31
32 #include "connman.h"
33
34 static bool connman_state_idle;
35 static dbus_bool_t sessionmode;
36
37 static DBusMessage *get_properties(DBusConnection *conn,
38                                         DBusMessage *msg, void *data)
39 {
40         DBusMessage *reply;
41         DBusMessageIter array, dict;
42         dbus_bool_t offlinemode;
43         const char *str;
44 #if defined TIZEN_EXT
45         dbus_bool_t autoconnectmode;
46 #endif
47
48         DBG("conn %p", conn);
49
50         reply = dbus_message_new_method_return(msg);
51         if (!reply)
52                 return NULL;
53
54         dbus_message_iter_init_append(reply, &array);
55
56         connman_dbus_dict_open(&array, &dict);
57
58         str = __connman_notifier_get_state();
59         connman_dbus_dict_append_basic(&dict, "State",
60                                                 DBUS_TYPE_STRING, &str);
61
62         offlinemode = __connman_technology_get_offlinemode();
63         connman_dbus_dict_append_basic(&dict, "OfflineMode",
64                                         DBUS_TYPE_BOOLEAN, &offlinemode);
65
66         connman_dbus_dict_append_basic(&dict, "SessionMode",
67                                         DBUS_TYPE_BOOLEAN,
68                                         &sessionmode);
69 #if defined TIZEN_EXT
70         autoconnectmode = __connman_service_get_auto_connect_mode();
71         connman_dbus_dict_append_basic(&dict, "AutoConnectMode",
72                                         DBUS_TYPE_BOOLEAN,
73                                         &autoconnectmode);
74 #endif
75
76         connman_dbus_dict_close(&array, &dict);
77
78         return reply;
79 }
80
81 static DBusMessage *set_property(DBusConnection *conn,
82                                         DBusMessage *msg, void *data)
83 {
84         DBusMessageIter iter, value;
85         const char *name;
86         int type;
87
88         DBG("conn %p", conn);
89
90         if (!dbus_message_iter_init(msg, &iter))
91                 return __connman_error_invalid_arguments(msg);
92
93         if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
94                 return __connman_error_invalid_arguments(msg);
95
96         dbus_message_iter_get_basic(&iter, &name);
97         dbus_message_iter_next(&iter);
98
99         if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
100                 return __connman_error_invalid_arguments(msg);
101
102         dbus_message_iter_recurse(&iter, &value);
103
104         type = dbus_message_iter_get_arg_type(&value);
105
106         if (g_str_equal(name, "OfflineMode")) {
107                 dbus_bool_t offlinemode;
108
109                 if (type != DBUS_TYPE_BOOLEAN)
110                         return __connman_error_invalid_arguments(msg);
111
112                 dbus_message_iter_get_basic(&value, &offlinemode);
113
114                 __connman_technology_set_offlinemode(offlinemode);
115         } else if (g_str_equal(name, "SessionMode")) {
116
117                 if (type != DBUS_TYPE_BOOLEAN)
118                         return __connman_error_invalid_arguments(msg);
119
120                 dbus_message_iter_get_basic(&value, &sessionmode);
121 #if defined TIZEN_EXT
122         } else if (g_str_equal(name, "AutoConnectMode") == TRUE) {
123                 bool automode;
124
125                 if (type != DBUS_TYPE_BOOLEAN)
126                         return __connman_error_invalid_arguments(msg);
127
128                 dbus_message_iter_get_basic(&value, &automode);
129
130                 __connman_service_set_auto_connect_mode(automode);
131 #endif
132         } else
133                 return __connman_error_invalid_property(msg);
134
135         return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
136 }
137
138 static void append_technology_structs(DBusMessageIter *iter, void *user_data)
139 {
140         __connman_technology_list_struct(iter);
141 }
142
143 static DBusMessage *get_technologies(DBusConnection *conn,
144                 DBusMessage *msg, void *data)
145 {
146         DBusMessage *reply;
147
148 #if !defined TIZEN_EXT
149         DBG("");
150 #endif
151
152         reply = dbus_message_new_method_return(msg);
153         if (!reply)
154                 return NULL;
155
156         __connman_dbus_append_objpath_dict_array(reply,
157                         append_technology_structs, NULL);
158
159         return reply;
160 }
161
162 static DBusMessage *remove_provider(DBusConnection *conn,
163                                     DBusMessage *msg, void *data)
164 {
165         const char *path;
166         int err;
167
168         DBG("conn %p", conn);
169
170         dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
171                                                         DBUS_TYPE_INVALID);
172
173         err = __connman_provider_remove_by_path(path);
174         if (err < 0)
175                 return __connman_error_failed(msg, -err);
176
177         return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
178 }
179
180 static DBusConnection *connection = NULL;
181
182 static void idle_state(bool idle)
183 {
184
185         DBG("idle %d", idle);
186
187         connman_state_idle = idle;
188
189         if (!connman_state_idle)
190                 return;
191 }
192
193 static const struct connman_notifier technology_notifier = {
194         .name           = "manager",
195         .priority       = CONNMAN_NOTIFIER_PRIORITY_HIGH,
196         .idle_state     = idle_state,
197 };
198
199 static void append_service_structs(DBusMessageIter *iter, void *user_data)
200 {
201         __connman_service_list_struct(iter);
202 }
203
204 static DBusMessage *get_services(DBusConnection *conn,
205                                         DBusMessage *msg, void *data)
206 {
207         DBusMessage *reply;
208
209         reply = dbus_message_new_method_return(msg);
210         if (!reply)
211                 return NULL;
212
213         __connman_dbus_append_objpath_dict_array(reply,
214                         append_service_structs, NULL);
215
216         return reply;
217 }
218
219 #if defined TIZEN_EXT
220 static DBusMessage *get_interfaces(DBusConnection *conn, DBusMessage *msg, void *data)
221 {
222         DBusMessage *reply;
223         DBusMessageIter iter, array;
224         const char *default_interface = connman_option_get_string("DefaultWifiInterface");
225
226         DBG("DefaultWifiInterface %s", default_interface);
227
228         reply = dbus_message_new_method_return(msg);
229         if (!reply)
230                 return NULL;
231
232         dbus_message_iter_init_append(reply, &iter);
233         dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
234                                         DBUS_TYPE_STRING_AS_STRING, &array);
235
236         dbus_message_iter_append_basic(&array,
237                                 DBUS_TYPE_STRING, &default_interface);
238
239         __connman_technology_append_interfaces(&array,
240                         CONNMAN_SERVICE_TYPE_WIFI, default_interface);
241
242         dbus_message_iter_close_container(&iter, &array);
243         return reply;
244 }
245
246 static DBusMessage *get_default_service(DBusConnection *conn,
247                                         DBusMessage *msg, void *data)
248 {
249         struct connman_service *service = connman_service_get_default_connection();
250         DBG("service %p", service);
251
252         return connman_service_get_defaut_info(msg, service);
253 }
254 #endif
255
256 #if defined TIZEN_EXT_INS
257 static void append_ins_structs(DBusMessageIter *iter, void *user_data)
258 {
259         __connman_ins_list_struct(iter);
260 }
261
262 static DBusMessage *get_ins(DBusConnection *conn,
263                                         DBusMessage *msg, void *data)
264 {
265         DBusMessage *reply;
266
267         reply = dbus_message_new_method_return(msg);
268         if (!reply)
269                 return NULL;
270
271         __connman_dbus_append_objpath_dict_array(reply,
272                         append_ins_structs, NULL);
273
274         return reply;
275 }
276 #endif
277
278 static void append_peer_structs(DBusMessageIter *iter, void *user_data)
279 {
280         __connman_peer_list_struct(iter);
281 }
282
283 static DBusMessage *get_peers(DBusConnection *conn,
284                                         DBusMessage *msg, void *data)
285 {
286         DBusMessage *reply;
287
288         reply = dbus_message_new_method_return(msg);
289         if (!reply)
290                 return NULL;
291
292         __connman_dbus_append_objpath_dict_array(reply,
293                                         append_peer_structs, NULL);
294         return reply;
295 }
296
297 static DBusMessage *get_tethering_clients(DBusConnection *conn,
298                                         DBusMessage *msg, void *data)
299 {
300         DBusMessage *reply;
301         DBusMessageIter iter, array;
302
303         reply = dbus_message_new_method_return(msg);
304         if (!reply)
305                 return NULL;
306
307         dbus_message_iter_init_append(reply, &iter);
308
309         dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
310                                 DBUS_TYPE_STRING_AS_STRING, &array);
311
312         __connman_tethering_list_clients(&array);
313
314         dbus_message_iter_close_container(&iter, &array);
315         return reply;
316 }
317
318 static DBusMessage *connect_provider(DBusConnection *conn,
319                                         DBusMessage *msg, void *data)
320 {
321         int err;
322
323         DBG("conn %p", conn);
324
325         err = __connman_provider_create_and_connect(msg);
326         if (err < 0)
327                 return __connman_error_failed(msg, -err);
328
329         return NULL;
330 }
331
332 static DBusMessage *register_agent(DBusConnection *conn,
333                                         DBusMessage *msg, void *data)
334 {
335         const char *sender, *path;
336         int err;
337
338         DBG("conn %p", conn);
339
340         sender = dbus_message_get_sender(msg);
341
342         dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
343                                                         DBUS_TYPE_INVALID);
344
345         err = connman_agent_register(sender, path);
346         if (err < 0)
347                 return __connman_error_failed(msg, -err);
348
349         return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
350 }
351
352 static DBusMessage *unregister_agent(DBusConnection *conn,
353                                         DBusMessage *msg, void *data)
354 {
355         const char *sender, *path;
356         int err;
357
358         DBG("conn %p", conn);
359
360         sender = dbus_message_get_sender(msg);
361
362         dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
363                                                         DBUS_TYPE_INVALID);
364
365         err = connman_agent_unregister(sender, path);
366         if (err < 0)
367                 return __connman_error_failed(msg, -err);
368
369         return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
370 }
371
372 static DBusMessage *register_counter(DBusConnection *conn,
373                                         DBusMessage *msg, void *data)
374 {
375         const char *sender, *path;
376         unsigned int accuracy, period;
377         int err;
378
379         DBG("conn %p", conn);
380
381         sender = dbus_message_get_sender(msg);
382
383         dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
384                                                 DBUS_TYPE_UINT32, &accuracy,
385                                                 DBUS_TYPE_UINT32, &period,
386                                                         DBUS_TYPE_INVALID);
387
388         /* FIXME: add handling of accuracy parameter */
389
390         err = __connman_counter_register(sender, path, period);
391         if (err < 0)
392                 return __connman_error_failed(msg, -err);
393
394         return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
395 }
396
397 static DBusMessage *unregister_counter(DBusConnection *conn,
398                                         DBusMessage *msg, void *data)
399 {
400         const char *sender, *path;
401         int err;
402
403         DBG("conn %p", conn);
404
405         sender = dbus_message_get_sender(msg);
406
407         dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
408                                                         DBUS_TYPE_INVALID);
409
410         err = __connman_counter_unregister(sender, path);
411         if (err < 0)
412                 return __connman_error_failed(msg, -err);
413
414         return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
415 }
416
417 static DBusMessage *create_session(DBusConnection *conn,
418                                         DBusMessage *msg, void *data)
419 {
420         int err;
421
422         DBG("conn %p", conn);
423
424         err = __connman_session_create(msg);
425         if (err < 0) {
426                 if (err == -EINPROGRESS)
427                         return NULL;
428
429                 return __connman_error_failed(msg, -err);
430         }
431
432         return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
433 }
434
435 static DBusMessage *destroy_session(DBusConnection *conn,
436                                         DBusMessage *msg, void *data)
437 {
438         int err;
439
440         DBG("conn %p", conn);
441
442         err = __connman_session_destroy(msg);
443         if (err < 0)
444                 return __connman_error_failed(msg, -err);
445
446         return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
447 }
448
449 static DBusMessage *request_private_network(DBusConnection *conn,
450                                         DBusMessage *msg, void *data)
451 {
452         const char *sender;
453         int  err;
454
455         DBG("conn %p", conn);
456
457         sender = dbus_message_get_sender(msg);
458
459         err = __connman_private_network_request(msg, sender);
460         if (err < 0)
461                 return __connman_error_failed(msg, -err);
462
463         return NULL;
464 }
465
466 static DBusMessage *release_private_network(DBusConnection *conn,
467                                         DBusMessage *msg, void *data)
468 {
469         const char *path;
470         int err;
471
472         DBG("conn %p", conn);
473
474         dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
475                                                         DBUS_TYPE_INVALID);
476
477         err = __connman_private_network_release(path);
478         if (err < 0)
479                 return __connman_error_failed(msg, -err);
480
481         return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
482 }
483
484 static int parse_peers_service_specs(DBusMessageIter *array,
485                         const unsigned char **spec, int *spec_len,
486                         const unsigned char **query, int *query_len,
487                         int *version)
488 {
489         *spec = *query = NULL;
490         *spec_len = *query_len = *version = 0;
491
492         while (dbus_message_iter_get_arg_type(array) ==
493                                                         DBUS_TYPE_DICT_ENTRY) {
494                 DBusMessageIter entry, inter, value;
495                 const char *key;
496
497                 dbus_message_iter_recurse(array, &entry);
498                 dbus_message_iter_get_basic(&entry, &key);
499
500                 dbus_message_iter_next(&entry);
501
502                 dbus_message_iter_recurse(&entry, &inter);
503
504                 if  (!g_strcmp0(key, "BonjourResponse")) {
505                         dbus_message_iter_recurse(&inter, &value);
506                         dbus_message_iter_get_fixed_array(&value,
507                                                         spec, spec_len);
508                 } else if (!g_strcmp0(key, "BonjourQuery")) {
509                         dbus_message_iter_recurse(&inter, &value);
510                         dbus_message_iter_get_fixed_array(&value,
511                                                         query, query_len);
512                 } else if (!g_strcmp0(key, "UpnpService")) {
513                         dbus_message_iter_get_basic(&inter, spec);
514                         *spec_len = strlen((const char *)*spec)+1;
515                 } else if (!g_strcmp0(key, "UpnpVersion")) {
516                         dbus_message_iter_get_basic(&inter, version);
517                 } else if (!g_strcmp0(key, "WiFiDisplayIEs")) {
518                         if (*spec || *query)
519                                 return -EINVAL;
520
521                         dbus_message_iter_recurse(&inter, &value);
522                         dbus_message_iter_get_fixed_array(&value,
523                                                         spec, spec_len);
524                 } else
525                         return -EINVAL;
526
527                 dbus_message_iter_next(array);
528         }
529
530         if ((*query && !*spec && !*version) ||
531                                 (!*spec && !*query) || (!*spec && *version))
532                 return -EINVAL;
533
534         return 0;
535 }
536
537 static DBusMessage *register_peer_service(DBusConnection *conn,
538                                                 DBusMessage *msg, void *data)
539 {
540         const unsigned char *spec, *query;
541         DBusMessageIter iter, array;
542         int spec_len, query_len;
543         dbus_bool_t master;
544         const char *owner;
545         int version;
546         int ret;
547
548         DBG("");
549
550         owner = dbus_message_get_sender(msg);
551
552         dbus_message_iter_init(msg, &iter);
553         dbus_message_iter_recurse(&iter, &array);
554
555         ret = parse_peers_service_specs(&array, &spec, &spec_len,
556                                                 &query, &query_len, &version);
557         if (ret)
558                 goto error;
559
560         dbus_message_iter_next(&iter);
561         dbus_message_iter_get_basic(&iter, &master);
562
563         ret = __connman_peer_service_register(owner, msg, spec, spec_len,
564                                         query, query_len, version,master);
565         if (!ret)
566                 return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
567         if (ret == -EINPROGRESS)
568                 return NULL;
569 error:
570         return __connman_error_failed(msg, -ret);
571 }
572
573 static DBusMessage *unregister_peer_service(DBusConnection *conn,
574                                                 DBusMessage *msg, void *data)
575 {
576         const unsigned char *spec, *query;
577         DBusMessageIter iter, array;
578         int spec_len, query_len;
579         const char *owner;
580         int version;
581         int ret;
582
583         DBG("");
584
585         owner = dbus_message_get_sender(msg);
586
587         dbus_message_iter_init(msg, &iter);
588         dbus_message_iter_recurse(&iter, &array);
589
590         ret = parse_peers_service_specs(&array, &spec, &spec_len,
591                                                 &query, &query_len, &version);
592         if (ret)
593                 goto error;
594
595         ret = __connman_peer_service_unregister(owner, spec, spec_len,
596                                                 query, query_len, version);
597         if (!ret)
598                 return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
599 error:
600         return __connman_error_failed(msg, -ret);
601
602 }
603
604 #if defined TIZEN_EXT_WIFI_MESH
605 static void append_mesh_peer_structs(DBusMessageIter *iter, void *user_data)
606 {
607         __connman_mesh_peer_list_struct(iter);
608 }
609
610 static DBusMessage *get_mesh_peers(DBusConnection *conn,
611                                         DBusMessage *msg, void *data)
612 {
613         DBusMessage *reply;
614
615         reply = dbus_message_new_method_return(msg);
616         if (!reply)
617                 return NULL;
618
619         __connman_dbus_append_objpath_dict_array(reply,
620                                         append_mesh_peer_structs, NULL);
621         return reply;
622 }
623
624 static DBusMessage *get_connected_mesh_peers(DBusConnection *conn,
625                                         DBusMessage *msg, void *data)
626 {
627         DBusMessage *reply;
628         DBusMessageIter iter, array;
629
630         reply = dbus_message_new_method_return(msg);
631         if (!reply)
632                 return NULL;
633
634         dbus_message_iter_init_append(reply, &iter);
635         dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
636                         DBUS_STRUCT_BEGIN_CHAR_AS_STRING
637                         DBUS_TYPE_ARRAY_AS_STRING
638                                 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
639                                         DBUS_TYPE_STRING_AS_STRING
640                                         DBUS_TYPE_VARIANT_AS_STRING
641                                 DBUS_DICT_ENTRY_END_CHAR_AS_STRING
642                         DBUS_STRUCT_END_CHAR_AS_STRING, &array);
643
644         __connman_mesh_connected_peer_list_struct(&array);
645         dbus_message_iter_close_container(&iter, &array);
646         return reply;
647 }
648
649 static DBusMessage *get_disconnected_mesh_peers(DBusConnection *conn,
650                                         DBusMessage *msg, void *data)
651 {
652         DBusMessage *reply;
653         DBusMessageIter iter, array;
654
655         reply = dbus_message_new_method_return(msg);
656         if (!reply)
657                 return NULL;
658
659         dbus_message_iter_init_append(reply, &iter);
660         dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
661                         DBUS_STRUCT_BEGIN_CHAR_AS_STRING
662                         DBUS_TYPE_ARRAY_AS_STRING
663                                 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
664                                         DBUS_TYPE_STRING_AS_STRING
665                                         DBUS_TYPE_VARIANT_AS_STRING
666                                 DBUS_DICT_ENTRY_END_CHAR_AS_STRING
667                         DBUS_STRUCT_END_CHAR_AS_STRING, &array);
668
669         __connman_mesh_disconnected_peer_list_struct(&array);
670         dbus_message_iter_close_container(&iter, &array);
671         return reply;
672 }
673
674 static DBusMessage *mesh_add_peer(DBusConnection *conn,
675                                         DBusMessage *msg, void *user_data)
676 {
677         const char *addr;
678         int err;
679
680         dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &addr,
681                                                         DBUS_TYPE_INVALID);
682
683         DBG("Address %s", addr);
684
685         err = __connman_mesh_change_peer_status(msg, addr, CONNMAN_MESH_PEER_ADD);
686         if (err < 0)
687                 return __connman_error_failed(msg, -err);
688
689         return NULL;
690 }
691
692 static DBusMessage *mesh_remove_peer(DBusConnection *conn,
693                                         DBusMessage *msg, void *user_data)
694 {
695         const char *addr;
696         int err;
697
698         dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &addr,
699                                                         DBUS_TYPE_INVALID);
700
701         DBG("Address %s", addr);
702
703         err = __connman_mesh_change_peer_status(msg, addr,
704                                                                                 CONNMAN_MESH_PEER_REMOVE);
705         if (err < 0)
706                 return __connman_error_failed(msg, -err);
707
708         return NULL;
709 }
710 #endif
711
712 static const GDBusMethodTable manager_methods[] = {
713         { GDBUS_METHOD("GetProperties",
714                         NULL, GDBUS_ARGS({ "properties", "a{sv}" }),
715                         get_properties) },
716         { GDBUS_ASYNC_METHOD("SetProperty",
717                         GDBUS_ARGS({ "name", "s" }, { "value", "v" }),
718                         NULL, set_property) },
719         { GDBUS_METHOD("GetTechnologies",
720                         NULL, GDBUS_ARGS({ "technologies", "a(oa{sv})" }),
721                         get_technologies) },
722         { GDBUS_DEPRECATED_METHOD("RemoveProvider",
723                         GDBUS_ARGS({ "provider", "o" }), NULL,
724                         remove_provider) },
725         { GDBUS_METHOD("GetServices",
726                         NULL, GDBUS_ARGS({ "services", "a(oa{sv})" }),
727                         get_services) },
728 #if defined TIZEN_EXT
729         { GDBUS_METHOD("GetInterfaces",
730                         NULL, GDBUS_ARGS({ "interface_list", "as" }),
731                         get_interfaces) },
732         { GDBUS_METHOD("GetDefaultService",
733                         NULL, GDBUS_ARGS({ "service", "oa{sv}" }),
734                         get_default_service) },
735 #endif
736 #if defined TIZEN_EXT_INS
737         { GDBUS_METHOD("GetINS",
738                         NULL, GDBUS_ARGS({ "services", "a(oa{sv})" }),
739                         get_ins) },
740 #endif
741         { GDBUS_METHOD("GetPeers",
742                         NULL, GDBUS_ARGS({ "peers", "a(oa{sv})" }),
743                         get_peers) },
744         { GDBUS_METHOD("GetTetheringClients",
745                         NULL, GDBUS_ARGS({ "tethering_clients", "as" }),
746                         get_tethering_clients) },
747         { GDBUS_DEPRECATED_ASYNC_METHOD("ConnectProvider",
748                               GDBUS_ARGS({ "provider", "a{sv}" }),
749                               GDBUS_ARGS({ "path", "o" }),
750                               connect_provider) },
751         { GDBUS_METHOD("RegisterAgent",
752                         GDBUS_ARGS({ "path", "o" }), NULL,
753                         register_agent) },
754         { GDBUS_METHOD("UnregisterAgent",
755                         GDBUS_ARGS({ "path", "o" }), NULL,
756                         unregister_agent) },
757         { GDBUS_METHOD("RegisterCounter",
758                         GDBUS_ARGS({ "path", "o" }, { "accuracy", "u" },
759                                         { "period", "u" }),
760                         NULL, register_counter) },
761         { GDBUS_METHOD("UnregisterCounter",
762                         GDBUS_ARGS({ "path", "o" }), NULL,
763                         unregister_counter) },
764         { GDBUS_ASYNC_METHOD("CreateSession",
765                         GDBUS_ARGS({ "settings", "a{sv}" },
766                                                 { "notifier", "o" }),
767                         GDBUS_ARGS({ "session", "o" }),
768                         create_session) },
769         { GDBUS_METHOD("DestroySession",
770                         GDBUS_ARGS({ "session", "o" }), NULL,
771                         destroy_session) },
772         { GDBUS_ASYNC_METHOD("RequestPrivateNetwork",
773                               NULL, GDBUS_ARGS({ "path", "o" },
774                                                { "settings", "a{sv}" },
775                                                { "socket", "h" }),
776                               request_private_network) },
777         { GDBUS_METHOD("ReleasePrivateNetwork",
778                         GDBUS_ARGS({ "path", "o" }), NULL,
779                         release_private_network) },
780         { GDBUS_ASYNC_METHOD("RegisterPeerService",
781                         GDBUS_ARGS({ "specification", "a{sv}" },
782                                    { "master", "b" }), NULL,
783                         register_peer_service) },
784         { GDBUS_METHOD("UnregisterPeerService",
785                         GDBUS_ARGS({ "specification", "a{sv}" }), NULL,
786                         unregister_peer_service) },
787 #if defined TIZEN_EXT_WIFI_MESH
788         { GDBUS_METHOD("GetMeshPeers",
789                         NULL, GDBUS_ARGS({ "peers", "a(oa{sv})" }),
790                         get_mesh_peers) },
791         { GDBUS_METHOD("GetConnectedMeshPeers",
792                         NULL, GDBUS_ARGS({ "peers", "a(a{sv})" }),
793                         get_connected_mesh_peers) },
794         { GDBUS_METHOD("GetDisconnectedMeshPeers",
795                         NULL, GDBUS_ARGS({ "peers", "a(a{sv})" }),
796                         get_disconnected_mesh_peers) },
797         { GDBUS_ASYNC_METHOD("MeshAddPeer", GDBUS_ARGS({ "address", "s" }), NULL,
798                                    mesh_add_peer) },
799         { GDBUS_ASYNC_METHOD("MeshRemovePeer", GDBUS_ARGS({ "address", "s" }), NULL,
800                                    mesh_remove_peer) },
801 #endif
802         { },
803 };
804
805 static const GDBusSignalTable manager_signals[] = {
806         { GDBUS_SIGNAL("PropertyChanged",
807                         GDBUS_ARGS({ "name", "s" }, { "value", "v" })) },
808         { GDBUS_SIGNAL("TechnologyAdded",
809                         GDBUS_ARGS({ "path", "o" },
810                                    { "properties", "a{sv}" })) },
811         { GDBUS_SIGNAL("TechnologyRemoved",
812                         GDBUS_ARGS({ "path", "o" })) },
813         { GDBUS_SIGNAL("ServicesChanged",
814                         GDBUS_ARGS({ "changed", "a(oa{sv})" },
815                                         { "removed", "ao" })) },
816         { GDBUS_SIGNAL("PeersChanged",
817                         GDBUS_ARGS({ "changed", "a(oa{sv})" },
818                                         { "removed", "ao" })) },
819         { },
820 };
821
822 int __connman_manager_init(void)
823 {
824         DBG("");
825
826         connection = connman_dbus_get_connection();
827         if (!connection)
828                 return -1;
829
830         if (connman_notifier_register(&technology_notifier) < 0)
831                 connman_error("Failed to register technology notifier");
832
833         g_dbus_register_interface(connection, CONNMAN_MANAGER_PATH,
834                                         CONNMAN_MANAGER_INTERFACE,
835                                         manager_methods,
836                                         manager_signals, NULL, NULL, NULL);
837
838         connman_state_idle = true;
839
840         return 0;
841 }
842
843 void __connman_manager_cleanup(void)
844 {
845         DBG("");
846
847         if (!connection)
848                 return;
849
850         connman_notifier_unregister(&technology_notifier);
851
852         g_dbus_unregister_interface(connection, CONNMAN_MANAGER_PATH,
853                                                 CONNMAN_MANAGER_INTERFACE);
854
855         dbus_connection_unref(connection);
856 }