Initial maemo support.
[connman] / client / main.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 <stdio.h>
27 #include <errno.h>
28 #include <stdlib.h>
29 #include <string.h>
30
31 #include <dbus/dbus.h>
32
33 #define CONNMAN_SERVICE                 "org.moblin.connman"
34
35 #define CONNMAN_MANAGER_INTERFACE       CONNMAN_SERVICE ".Manager"
36 #define CONNMAN_MANAGER_PATH            "/"
37
38 static DBusMessage *get_properties(DBusConnection *connection)
39 {
40         DBusMessage *message, *reply;
41         DBusError error;
42
43         message = dbus_message_new_method_call(CONNMAN_SERVICE,
44                                                 CONNMAN_MANAGER_PATH,
45                                                 CONNMAN_MANAGER_INTERFACE,
46                                                         "GetProperties");
47         if (message == NULL)
48                 return NULL;
49
50         dbus_error_init(&error);
51
52         reply = dbus_connection_send_with_reply_and_block(connection,
53                                                         message, -1, &error);
54         if (reply == NULL) {
55                 if (dbus_error_is_set(&error) == TRUE) {
56                         fprintf(stderr, "%s\n", error.message);
57                         dbus_error_free(&error);
58                 } else
59                         fprintf(stderr, "Failed to get properties\n");
60                 dbus_message_unref(message);
61                 return NULL;
62         }
63
64         dbus_message_unref(message);
65
66         return reply;
67 }
68
69 static const char *extract_state(DBusMessage *message)
70 {
71         DBusMessageIter array, dict;
72
73         dbus_message_iter_init(message, &array);
74         dbus_message_iter_recurse(&array, &dict);
75
76         while (dbus_message_iter_get_arg_type(&dict) == DBUS_TYPE_DICT_ENTRY) {
77                 DBusMessageIter entry, value;
78                 const char *key;
79
80                 dbus_message_iter_recurse(&dict, &entry);
81                 dbus_message_iter_get_basic(&entry, &key);
82
83                 dbus_message_iter_next(&entry);
84
85                 dbus_message_iter_recurse(&entry, &value);
86
87                 //type = dbus_message_iter_get_arg_type(&value);
88                 //dbus_message_iter_get_basic(&value, &val);
89
90                 if (strcmp(key, "State") == 0) {
91                         const char *val;
92                         dbus_message_iter_get_basic(&value, &val);
93                         return val;
94                 }
95
96                 dbus_message_iter_next(&dict);
97         }
98
99         return NULL;
100 }
101
102 static void print_objects(DBusMessageIter *array)
103 {
104         DBusMessageIter value;
105
106         if (dbus_message_iter_get_arg_type(array) != DBUS_TYPE_ARRAY)
107                 return;
108
109         dbus_message_iter_recurse(array, &value);
110
111         while (dbus_message_iter_get_arg_type(&value) == DBUS_TYPE_OBJECT_PATH) {
112                 const char *path;
113
114                 dbus_message_iter_get_basic(&value, &path);
115
116                 printf("%s\n", path);
117
118                 dbus_message_iter_next(&value);
119         }
120 }
121
122 static void extract_devices(DBusMessage *message)
123 {
124         DBusMessageIter array, dict;
125
126         dbus_message_iter_init(message, &array);
127         dbus_message_iter_recurse(&array, &dict);
128
129         while (dbus_message_iter_get_arg_type(&dict) == DBUS_TYPE_DICT_ENTRY) {
130                 DBusMessageIter entry, value;
131                 const char *key;
132
133                 dbus_message_iter_recurse(&dict, &entry);
134                 dbus_message_iter_get_basic(&entry, &key);
135
136                 dbus_message_iter_next(&entry);
137
138                 dbus_message_iter_recurse(&entry, &value);
139
140                 //type = dbus_message_iter_get_arg_type(&value);
141                 //dbus_message_iter_get_basic(&value, &val);
142
143                 if (strcmp(key, "Devices") == 0) {
144                         print_objects(&value);
145                         return;
146                 }
147
148                 dbus_message_iter_next(&dict);
149         }
150 }
151
152 static int cmd_status(DBusConnection *connection)
153 {
154         DBusMessage *message;
155         const char *state;
156
157         message = get_properties(connection);
158
159         state = extract_state(message);
160
161         dbus_message_unref(message);
162
163         if (state == NULL)
164                 return -EINVAL;
165
166         printf("System is %s\n", state);
167
168         return 0;
169 }
170
171 static int cmd_devices(DBusConnection *connection)
172 {
173         DBusMessage *message;
174
175         message = get_properties(connection);
176
177         extract_devices(message);
178
179         dbus_message_unref(message);
180
181         return 0;
182 }
183
184 static void usage(const char *program)
185 {
186         printf("ConnMan utility ver %s\n\n", VERSION);
187
188         printf("Usage:\n"
189                 "\t%s <command>\n\n", program);
190
191         printf("Commands:\n"
192                 "\thelp\n"
193                 "\tdev\n"
194                 "\n");
195 }
196
197 int main(int argc, char *argv[])
198 {
199         DBusConnection *conn;
200
201         if (argc > 1 && strcmp(argv[1], "help") == 0) {
202                 usage(argv[0]);
203                 exit(0);
204         }
205
206         conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
207         if (!conn) {
208                 fprintf(stderr, "Can't get on system bus\n");
209                 exit(1);
210         }
211
212         if (argc > 1) {
213                 if (strcmp(argv[1], "dev") == 0)
214                         cmd_devices(conn);
215         } else
216                 cmd_status(conn);
217
218         dbus_connection_unref(conn);
219
220         return 0;
221 }