Imported Upstream version 1.26
[platform/upstream/connman.git] / tools / manager-api.c
1 /*
2  *
3  *  Connection Manager
4  *
5  *  Copyright (C) 2011-2014  BMW Car IT GmbH.
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 <stdio.h>
27
28 #include "session-test.h"
29
30 static DBusMessage *set_property(DBusConnection *connection,
31                                 const char *property, int type, void *value)
32 {
33         DBusMessage *message, *reply;
34         DBusError error;
35         DBusMessageIter iter;
36
37         message = dbus_message_new_method_call(CONNMAN_SERVICE,
38                                                 CONNMAN_MANAGER_PATH,
39                                                 CONNMAN_MANAGER_INTERFACE,
40                                                 "SetProperty");
41         if (!message)
42                 return NULL;
43
44         dbus_message_iter_init_append(message, &iter);
45         connman_dbus_property_append_basic(&iter, property, type, value);
46
47         dbus_error_init(&error);
48
49         reply = dbus_connection_send_with_reply_and_block(connection,
50                                                         message, -1, &error);
51         if (!reply) {
52                 if (dbus_error_is_set(&error)) {
53                         LOG("%s", error.message);
54                         dbus_error_free(&error);
55                 } else {
56                         LOG("Failed to get properties");
57                 }
58                 dbus_message_unref(message);
59                 return NULL;
60         }
61
62         dbus_message_unref(message);
63
64         return reply;
65 }
66
67 DBusMessage *manager_get_services(DBusConnection *connection)
68 {
69         DBusMessage *message, *reply;
70         DBusError error;
71
72         message = dbus_message_new_method_call(CONNMAN_SERVICE,
73                                                 CONNMAN_MANAGER_PATH,
74                                                 CONNMAN_MANAGER_INTERFACE,
75                                                         "GetServices");
76         if (!message)
77                 return NULL;
78
79         dbus_error_init(&error);
80
81         reply = dbus_connection_send_with_reply_and_block(connection,
82                                                         message, -1, &error);
83         if (!reply) {
84                 if (dbus_error_is_set(&error)) {
85                         LOG("%s", error.message);
86                         dbus_error_free(&error);
87                 } else {
88                         LOG("Failed to get properties");
89                 }
90                 dbus_message_unref(message);
91                 return NULL;
92         }
93
94         dbus_message_unref(message);
95
96         return reply;
97 }
98
99 DBusMessage *manager_get_properties(DBusConnection *connection)
100 {
101         DBusMessage *message, *reply;
102         DBusError error;
103
104         message = dbus_message_new_method_call(CONNMAN_SERVICE,
105                                                 CONNMAN_MANAGER_PATH,
106                                                 CONNMAN_MANAGER_INTERFACE,
107                                                         "GetProperties");
108         if (!message)
109                 return NULL;
110
111         dbus_error_init(&error);
112
113         reply = dbus_connection_send_with_reply_and_block(connection,
114                                                         message, -1, &error);
115         if (!reply) {
116                 if (dbus_error_is_set(&error)) {
117                         LOG("%s", error.message);
118                         dbus_error_free(&error);
119                 } else {
120                         LOG("%s", error.message);
121                 }
122                 dbus_message_unref(message);
123                 return NULL;
124         }
125
126         dbus_message_unref(message);
127
128         return reply;
129 }
130
131 DBusMessage *manager_create_session(DBusConnection *connection,
132                                         struct test_session_info *info,
133                                         const char *notifier_path)
134 {
135         DBusMessage *message, *reply;
136         DBusError error;
137         DBusMessageIter array, dict;
138
139         message = dbus_message_new_method_call(CONNMAN_SERVICE,
140                                                 CONNMAN_MANAGER_PATH,
141                                                 CONNMAN_MANAGER_INTERFACE,
142                                                         "CreateSession");
143         if (!message)
144                 return NULL;
145
146         dbus_error_init(&error);
147
148         dbus_message_iter_init_append(message, &array);
149
150         connman_dbus_dict_open(&array, &dict);
151
152         session_append_settings(&dict, info);
153
154         connman_dbus_dict_close(&array, &dict);
155
156         dbus_message_iter_append_basic(&array, DBUS_TYPE_OBJECT_PATH,
157                                 &notifier_path);
158
159         reply = dbus_connection_send_with_reply_and_block(connection,
160                                                         message, -1, &error);
161         if (!reply) {
162                 if (dbus_error_is_set(&error)) {
163                         LOG("%s", error.message);
164                         dbus_error_free(&error);
165                 } else {
166                         LOG("Failed to get properties");
167                 }
168                 dbus_message_unref(message);
169                 return NULL;
170         }
171
172         dbus_message_unref(message);
173
174         return reply;
175 }
176
177 DBusMessage *manager_destroy_session(DBusConnection *connection,
178                                         const char *notifier_path)
179 {
180         DBusMessage *message, *reply;
181         DBusError error;
182         DBusMessageIter array;
183
184         message = dbus_message_new_method_call(CONNMAN_SERVICE,
185                                                 CONNMAN_MANAGER_PATH,
186                                                 CONNMAN_MANAGER_INTERFACE,
187                                                         "DestroySession");
188         if (!message)
189                 return NULL;
190
191         dbus_error_init(&error);
192
193         dbus_message_iter_init_append(message, &array);
194
195         dbus_message_iter_append_basic(&array, DBUS_TYPE_OBJECT_PATH,
196                                 &notifier_path);
197
198         reply = dbus_connection_send_with_reply_and_block(connection,
199                                                         message, -1, &error);
200         if (!reply) {
201                 if (dbus_error_is_set(&error)) {
202                         LOG("%s", error.message);
203                         dbus_error_free(&error);
204                 } else {
205                         LOG("%s", error.message);
206                 }
207                 dbus_message_unref(message);
208                 return NULL;
209         }
210
211         dbus_message_unref(message);
212
213         return reply;
214 }
215
216 DBusMessage *manager_set_session_mode(DBusConnection *connection,
217                                         bool enable)
218 {
219         dbus_bool_t val = enable;
220
221         return set_property(connection, "SessionMode",
222                                 DBUS_TYPE_BOOLEAN, &val);
223 }
224
225 int manager_parse_properties(DBusMessage *msg,
226                                 struct test_manager *manager)
227 {
228         DBusMessageIter iter, array;
229
230         dbus_message_iter_init(msg, &iter);
231         dbus_message_iter_recurse(&iter, &array);
232
233         while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_DICT_ENTRY) {
234                 DBusMessageIter entry, value;
235                 const char *key;
236
237                 dbus_message_iter_recurse(&array, &entry);
238                 dbus_message_iter_get_basic(&entry, &key);
239
240                 dbus_message_iter_next(&entry);
241                 dbus_message_iter_recurse(&entry, &value);
242
243                 switch (dbus_message_iter_get_arg_type(&value)) {
244                 case DBUS_TYPE_STRING:
245                         if (g_str_equal(key, "State")) {
246                                 const char *val;
247                                 dbus_message_iter_get_basic(&value, &val);
248
249                                 if (manager->state)
250                                         g_free(manager->state);
251
252                                 LOG("State %s", val);
253
254                                 manager->state = g_strdup(val);
255                         }
256                         break;
257                 default:
258                         break;
259                 }
260                 dbus_message_iter_next(&array);
261         }
262
263         return 0;
264 }