Merge lp:~kvalo/indicator-network/libconnman-backend into lp:~indicator-applet-developers/indicator-network/indicator-network

Proposed by Kalle Valo on 2010-11-24
Status: Merged
Merged at revision: 105
Proposed branch: lp:~kvalo/indicator-network/libconnman-backend
Merge into: lp:~indicator-applet-developers/indicator-network/indicator-network
Diff against target: 4004 lines (+1984/-1091)
24 files modified
README (+49/-0)
src/backend/Makefile.am (+5/-1)
src/backend/manager.c (+173/-357)
src/backend/manager.h (+6/-3)
src/backend/network-menu.c (+7/-83)
src/backend/ofono-manager.c (+25/-12)
src/backend/service-manager.c (+26/-48)
src/backend/service-manager.h (+3/-2)
src/backend/service.c (+222/-514)
src/backend/service.h (+3/-15)
src/backend/ui-proxy.c (+421/-0)
src/backend/ui-proxy.h (+72/-0)
tests/Makefile.am (+8/-14)
tests/mock-connman-manager.c (+194/-0)
tests/mock-connman-manager.h (+25/-0)
tests/mock-connman-service.c (+558/-0)
tests/mock-manager.c (+4/-4)
tests/mock-service-manager.c (+4/-3)
tests/mock-service.c (+4/-4)
tests/mock-ui-proxy.c (+159/-0)
tests/test-manager.c (+8/-2)
tests/test-network-menu.c (+4/-10)
tests/test-service-manager.c (+0/-1)
tests/test-service.c (+4/-18)
To merge this branch: bzr merge lp:~kvalo/indicator-network/libconnman-backend
Reviewer Review Type Date Requested Status
Mikkel Kamstrup Erlandsen (community) 2010-11-24 Approve on 2010-11-26
Review via email: mp+41734@code.launchpad.net

Description of the Change

Port most of backend (indicator-network-service) to libconnman. manager-proxy and ofono-manager are not ported yet.

This is a big merge, but I didn't find an easy way to make this smaller. Sorry about that.

To post a comment you must log in.

review needsfixing

General request: The code tree is nicely structured into modules, but
it's not immediately obvious how these things relate and what their
roles are. Could you add a short document describing this? Maybe also
add two lines in the different class headers to describe their role
and responsibilities briefly.

ui-proxy.c
+ /* FIXME: cancel the call on dispose */
+ g_dbus_proxy_call(priv->proxy, "Start", NULL,
+ G_DBUS_CALL_FLAGS_NONE, -1, NULL,
+ call_cb, self);

It's often easier to just g_object_ref(self) and then
g_object_unref(self) in call_cb(). You can apply that pattern in a few
places, but just mentioning this one place to cut down on the review
size :-)

ui-proxy.c
+ parameters = g_variant_new("(i)", level);
+
+ /* FIXME: cancel the call on dispose */
+ g_dbus_proxy_call(priv->proxy, "SetDebug", parameters,
+ G_DBUS_CALL_FLAGS_NONE, -1, NULL,
+ call_cb, self);

In my eyes it improves code readability if you inline g_variant_new()
in the method call, which works so elegantly with the floating refs.
It also cuts significantly down on the LOC. This is purely a personal
style issue so feel free to disregard :-)

ui-proxy.c
+ variant = g_simple_async_result_get_op_res_gpointer(simple);
+ g_variant_get(variant, "s", pin);
+
+ /* I assume simple still owns variant and unrefs it */

Yes it does. By your construction in ask_pin_cb(). Maybe change the
comment to reflect that.

ui-proxy.c
+static void ui_proxy_dispose(GObject *object)
+{
+ UIProxy *self = UI_PROXY(object);
+ UIProxyPrivate *priv = GET_PRIVATE(self);
+
+ if (priv->watch_id != 0) {
+ g_bus_unwatch_name(priv->watch_id);
+ priv->watch_id = 0;
+ }

You leak priv->proxy here if it's set.

ofono-manager.c
+ UIProxy *ui = UI_PROXY(object);
+ GError *error = NULL;
+
+ g_return_if_fail(priv != NULL);
+
+ ui_proxy_ask_pin_finish(ui, res, &error);

Don't you want to assign the return value to a gchar*? If you want to
ignore it you are still leaking it right now.

147. By Kalle Valo on 2010-11-26

ui-proxy: take a ref on self when doing async calls

148. By Kalle Valo on 2010-11-26

ui-proxy: clear up data ownership in ask_pin_finish()

149. By Kalle Valo on 2010-11-26

ui-proxy: fix priv->proxy leak

150. By Kalle Valo on 2010-11-26

Write a bit about code structure to README.

Kalle Valo (kvalo) wrote :

Mikkel Kamstrup Erlandsen <email address hidden> writes:

> General request: The code tree is nicely structured into modules, but
> it's not immediately obvious how these things relate and what their
> roles are. Could you add a short document describing this?

I now added small description to README, but this needs to be improved a
lot.

> Maybe also add two lines in the different class headers to describe
> their role and responsibilities briefly.

What's the best location to do this? Top of the object struct?

/* write documentation here? */
typedef struct {
  GObject parent;
} UIProxy;

> ui-proxy.c
> + /* FIXME: cancel the call on dispose */
> + g_dbus_proxy_call(priv->proxy, "Start", NULL,
> + G_DBUS_CALL_FLAGS_NONE, -1, NULL,
> + call_cb, self);
>
> It's often easier to just g_object_ref(self) and then
> g_object_unref(self) in call_cb(). You can apply that pattern in a few
> places, but just mentioning this one place to cut down on the review
> size :-)

Oh, this is a really nice trick. I changed UIProxy now to use this and
start using elsewhere from now on.

> ui-proxy.c
> + parameters = g_variant_new("(i)", level);
> +
> + /* FIXME: cancel the call on dispose */
> + g_dbus_proxy_call(priv->proxy, "SetDebug", parameters,
> + G_DBUS_CALL_FLAGS_NONE, -1, NULL,
> + call_cb, self);
>
> In my eyes it improves code readability if you inline g_variant_new()
> in the method call, which works so elegantly with the floating refs.
> It also cuts significantly down on the LOC. This is purely a personal
> style issue so feel free to disregard :-)

Thanks, I will definitely consider this. I usually try to avoid doing
too much on one line and that's why I sometimes use so many lines.

> ui-proxy.c
> + variant = g_simple_async_result_get_op_res_gpointer(simple);
> + g_variant_get(variant, "s", pin);
> +
> + /* I assume simple still owns variant and unrefs it */
>
> Yes it does. By your construction in ask_pin_cb(). Maybe change the
> comment to reflect that.

Improved.

> ui-proxy.c
> +static void ui_proxy_dispose(GObject *object)
> +{
> + UIProxy *self = UI_PROXY(object);
> + UIProxyPrivate *priv = GET_PRIVATE(self);
> +
> + if (priv->watch_id != 0) {
> + g_bus_unwatch_name(priv->watch_id);
> + priv->watch_id = 0;
> + }
>
> You leak priv->proxy here if it's set.

Fixed.

> ofono-manager.c
> + UIProxy *ui = UI_PROXY(object);
> + GError *error = NULL;
> +
> + g_return_if_fail(priv != NULL);
> +
> + ui_proxy_ask_pin_finish(ui, res, &error);
>
> Don't you want to assign the return value to a gchar*? If you want to
> ignore it you are still leaking it right now.

Yes, and actually I forgot to fix this part. There's #ifdef FIXME a bit
above here. Is it ok if I fix this in an another branch I'm already
working on? It's easier for me that way.

I have now pushed the fixes to the branch. Please take a look.

--
Kalle Valo

The additions to the README are spot on thanks a bunch.

If you swear to address the FIXMEs then the branch is approved with top marks ;-)

review: Approve
Kalle Valo (kvalo) wrote :

Mikkel Kamstrup Erlandsen <email address hidden> writes:

> If you swear to address the FIXMEs then the branch is approved with
> top marks ;-)

[holding left hand on top of the emacs manual and right hand up]

I swear

:D

--
Kalle Valo

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'README'
2--- README 2010-05-19 07:49:00 +0000
3+++ README 2010-11-26 12:12:27 +0000
4@@ -0,0 +1,49 @@
5+indicator-network - UI for Connection Mananager (connman)
6+
7+indicator-network is a user interface for Connection Manager and also
8+uses the indicator framework. The source code consists of three
9+components, all are under src directory.
10+
11+src/indicator contains the module running inside indicator, for
12+example indicator-applet in gnome panel. There's also a custom widget
13+service-menuitem for showing networks in the network menu.
14+
15+src/backend contains a separate daemon running as a backend process.
16+The name of process is indicator-network-service, but it will be
17+renamed at some point. The process uses dbusmenu to show the network
18+menu in the indicator.
19+
20+The description of various backend classes is:
21+
22+o manager: creates other objects needed and manages connman
23+ disconnections
24+
25+o manager-proxy: a dbus proxy for handling dbus interface between the
26+ indicator and backend
27+
28+o network-menu: manages the network menu using dbusmenu and handles
29+ all events related to the menu
30+
31+o ofono-manager: manages all communication to ofono
32+
33+o service: dbusmenu menuitem for a network (called as service in
34+ connman)
35+
36+o service-manager: manages all services related tasks, for example
37+ service (ie. network) updates
38+
39+o ui-proxy: proxy for the ui process, shows different dialogs
40+
41+src/agent contains code showing dialogs. It will be renamed to src/ui
42+at some point.
43+
44+There's also scripts/indicator-network-settings to show various
45+network settings to the user and
46+scripts/indicator-network-mobile-wizard which will be started when a
47+new unconfigured modem is inserted.
48+
49+Unit tests are in tests and can be run with 'make check'.
50+
51+For testing indicator-network there are connman-mock and ofono-mock in
52+tests/connman-mock directory. These can be used as fake connmand and
53+ofonod daemons and make it easier to test special cases.
54
55=== modified file 'src/backend/Makefile.am'
56--- src/backend/Makefile.am 2010-11-04 10:22:03 +0000
57+++ src/backend/Makefile.am 2010-11-26 12:12:27 +0000
58@@ -17,13 +17,16 @@
59 network-menu.c \
60 network-menu.h \
61 ofono-manager.c \
62- ofono-manager.h
63+ ofono-manager.h \
64+ ui-proxy.c \
65+ ui-proxy.h
66
67 indicator_network_service_CFLAGS = \
68 $(GLIB_CFLAGS) \
69 $(DBUSMENUGLIB_CFLAGS) \
70 $(INDICATOR_CFLAGS) \
71 $(LIBNOTIFY_CFLAGS) \
72+ $(CONNMAN_CFLAGS) \
73 -DLIBEXECDIR=\"$(libexecdir)\" \
74 -DBINDIR=\"$(bindir)\"
75
76@@ -32,5 +35,6 @@
77 $(DBUSMENUGLIB_LIBS) \
78 $(INDICATOR_LIBS) \
79 $(LIBNOTIFY_LIBS) \
80+ $(CONNMAN_LIBS) \
81 $(top_builddir)/src/common/libmarshal.la \
82 $(top_builddir)/src/common/liblog.la
83
84=== modified file 'src/backend/manager.c'
85--- src/backend/manager.c 2010-11-17 13:54:50 +0000
86+++ src/backend/manager.c 2010-11-26 12:12:27 +0000
87@@ -18,6 +18,35 @@
88 * with this program. If not, see <http://www.gnu.org/licenses/>.
89 */
90
91+/*
92+ * FIXME: libconnman todo list:
93+ *
94+ * o technology handling:
95+ * - g_signal_emit(self, signals[TECHNOLOGY_STATE_CHANGED], 0,
96+ * - CONNMAN_TECHNOLOGY_WIFI, wifi);
97+ * - g_signal_emit(self, signals[TECHNOLOGY_STATE_CHANGED], 0,
98+ * - CONNMAN_TECHNOLOGY_ETHERNET, ethernet);
99+ * - g_signal_emit(self, signals[TECHNOLOGY_STATE_CHANGED], 0,
100+ * - CONNMAN_TECHNOLOGY_CELLULAR, cellular);
101+ *
102+ *
103+ * o implement_request_scan()
104+ *
105+ * o handle wifi enable/disable errors:
106+ *
107+ * - g_warning("Failed to enable wireless: %s", error->message);
108+ * -
109+ * - summary = _("Wireless");
110+ * - msg = _("Failed to enable wireless");
111+ * - icon = ICON_NOTIFICATION_WIFI_FULL;
112+ *
113+ * - g_warning("Failed to disable wireless: %s", error->message);
114+ * -
115+ * - summary = _("Wireless");
116+ * - msg = _("Failed to disable wireless");
117+ * - icon = ICON_NOTIFICATION_WIFI_FULL;
118+ */
119+
120 #include "manager.h"
121
122 #ifdef HAVE_CONFIG_H
123@@ -33,8 +62,8 @@
124 #include <libnotify/notify.h>
125
126 #include "marshal.h"
127-#include "connman-manager-client.h"
128-#include "connman-service-client.h"
129+#include "connman-manager.h"
130+#include "connman-service.h"
131 #include "service.h"
132 #include "connman.h"
133 #include "dbus-shared-names.h"
134@@ -44,6 +73,7 @@
135 #include "log.h"
136 #include "manager-proxy.h"
137 #include "ofono-manager.h"
138+#include "ui-proxy.h"
139
140 G_DEFINE_TYPE(Manager, manager, G_TYPE_OBJECT)
141
142@@ -55,11 +85,11 @@
143 struct _ManagerPrivate {
144 ManagerProxy *ns_dbus;
145 ServiceManager *service_manager;
146- DBusGProxy *connman_proxy;
147- DBusGProxy *dbus_proxy;
148- DBusGProxy *agent_proxy;
149- DBusGConnection *system_bus;
150- DBusGConnection *session_bus;
151+
152+ ConnmanManager *connman;
153+
154+ UIProxy *ui;
155+
156 NotifyNotification *notification;
157 guint animation_timer;
158 gint animation_counter;
159@@ -81,14 +111,6 @@
160
161 static guint signals[LAST_SIGNAL] = { 0 };
162
163-struct service_state_string
164-{
165- const gchar *str;
166- ServiceState state;
167-};
168-
169-#define NETWORK_AGENT LIBEXECDIR "/indicator-network-agent"
170-
171 #define CONNECTING_ANIMATION_TIMEOUT 100
172
173 static void stop_connecting_animation(Manager *self);
174@@ -158,12 +180,12 @@
175 {
176 }
177
178-const gchar *manager_icon_name(const gchar *technology, gint signal)
179+const gchar *manager_icon_name(ConnmanServiceType type, gint signal)
180 {
181- if (g_str_equal(technology, CONNMAN_TECHNOLOGY_ETHERNET)) {
182+ switch (type) {
183+ case CONNMAN_SERVICE_TYPE_ETHERNET:
184 return ICON_CONNECTED_WIRED;
185- }
186- else if (g_str_equal(technology, CONNMAN_TECHNOLOGY_WIFI)) {
187+ case CONNMAN_SERVICE_TYPE_WIFI:
188 if (signal > 75)
189 return ICON_CONNECTED_WIFI_100;
190 else if (signal > 50)
191@@ -174,15 +196,13 @@
192 return ICON_CONNECTED_WIFI_25;
193 else
194 return ICON_CONNECTED_WIFI_0;
195- }
196- else if (g_str_equal(technology, CONNMAN_TECHNOLOGY_CELLULAR)) {
197+ case CONNMAN_SERVICE_TYPE_CELLULAR:
198 return ICON_CONNECTED_CELLULAR;
199- }
200- else if (g_str_equal(technology, CONNMAN_TECHNOLOGY_BLUETOOTH)) {
201+ case CONNMAN_SERVICE_TYPE_BLUETOOTH:
202 return ICON_CONNECTED_BLUETOOTH;
203+ default:
204+ return ICON_CONNECTED_DEFAULT;
205 }
206-
207- return ICON_CONNECTED_DEFAULT;
208 }
209
210 static void set_animation_icon(Manager *self)
211@@ -251,6 +271,8 @@
212 {
213 ManagerPrivate *priv = GET_PRIVATE(self);
214
215+ g_return_if_fail(priv != NULL);
216+
217 if (priv->animation_timer == 0)
218 return;
219
220@@ -285,7 +307,8 @@
221 static void update_icon(Manager *self)
222 {
223 ManagerPrivate *priv = GET_PRIVATE(self);
224- const gchar *technology, *icon_name;
225+ ConnmanServiceType type;
226+ const gchar *icon_name;
227
228 g_return_if_fail(self);
229
230@@ -301,14 +324,9 @@
231 goto done;
232 }
233
234- technology = service_manager_get_default_technology(priv->service_manager);
235-
236- if (technology == NULL || strlen(technology) == 0) {
237- icon_name = ICON_DISCONNECTED;
238- goto done;
239- }
240-
241- icon_name = manager_icon_name(technology, priv->signal_strength);
242+ type = service_manager_get_default_technology(priv->service_manager);
243+
244+ icon_name = manager_icon_name(type, priv->signal_strength);
245
246 done:
247 manager_proxy_set_icon(priv->ns_dbus, icon_name);
248@@ -359,340 +377,162 @@
249 update_icon(self);
250 }
251
252-static void update_enabled_technologies(Manager *self, GValue *value)
253-{
254- gboolean wifi, ethernet, cellular, bluetooth;
255- gchar **technologies;
256- int i;
257-
258- g_return_if_fail(self != NULL);
259- g_return_if_fail(G_VALUE_HOLDS_BOXED(value));
260-
261- wifi = FALSE;
262- ethernet = FALSE;
263- cellular = FALSE;
264- bluetooth = FALSE;
265-
266- technologies = g_value_get_boxed(value);
267-
268- for (i = 0; technologies[i] != NULL; i++) {
269- if (g_strcmp0(technologies[i], CONNMAN_TECHNOLOGY_WIFI) == 0)
270- wifi = TRUE;
271- else if (g_strcmp0(technologies[i], CONNMAN_TECHNOLOGY_ETHERNET) == 0)
272- ethernet = TRUE;
273- else if (g_strcmp0(technologies[i], CONNMAN_TECHNOLOGY_CELLULAR) == 0)
274- cellular = TRUE;
275- else if (g_strcmp0(technologies[i], CONNMAN_TECHNOLOGY_BLUETOOTH) == 0)
276- bluetooth = TRUE;
277- }
278-
279- /* FIXME: how to handle bluetooth? */
280-
281- g_signal_emit(self, signals[TECHNOLOGY_STATE_CHANGED], 0,
282- CONNMAN_TECHNOLOGY_WIFI, wifi);
283- g_signal_emit(self, signals[TECHNOLOGY_STATE_CHANGED], 0,
284- CONNMAN_TECHNOLOGY_ETHERNET, ethernet);
285- g_signal_emit(self, signals[TECHNOLOGY_STATE_CHANGED], 0,
286- CONNMAN_TECHNOLOGY_CELLULAR, cellular);
287-}
288-
289-static void connman_property_changed(DBusGProxy *proxy, const gchar *property,
290- GValue *value, gpointer user_data)
291-{
292- Manager *self = MANAGER(user_data);
293- ManagerPrivate *priv = GET_PRIVATE(self);
294-
295- g_return_if_fail(self != NULL);
296- g_return_if_fail(priv != NULL);
297-
298- if (g_str_equal(property, CONNMAN_PROPERTY_SERVICES)) {
299- service_manager_update(priv->service_manager, value);
300- }
301- else if (g_str_equal(property, CONNMAN_PROPERTY_ENABLED_TECHNOLOGIES)) {
302- update_enabled_technologies(self, value);
303- }
304-
305-}
306-
307-static void update_all_properties(Manager *self)
308-{
309- ManagerPrivate *priv = GET_PRIVATE(self);
310- GHashTable *properties;
311- GError *error = NULL;
312- GValue *value;
313-
314- g_return_if_fail(self != NULL);
315- g_return_if_fail(priv != NULL);
316-
317- /* FIXME: should be async */
318- org_moblin_connman_Manager_get_properties(priv->connman_proxy,
319- &properties, &error);
320-
321- if (error) {
322- g_warning("%s(): org_moblin_connman_Manager_get_properties failed: %s",
323- __func__, error->message);
324- g_error_free(error);
325- return;
326- }
327-
328- value = g_hash_table_lookup(properties, CONNMAN_PROPERTY_SERVICES);
329- if (value)
330- service_manager_update(priv->service_manager, value);
331-
332- value = g_hash_table_lookup(properties,
333- CONNMAN_PROPERTY_ENABLED_TECHNOLOGIES);
334- if (value)
335- update_enabled_technologies(self, value);
336-
337- /* now network menu can be enabled */
338+static void update_services(Manager *self)
339+{
340+ ManagerPrivate *priv = GET_PRIVATE(self);
341+ ConnmanService **services;
342+
343+ g_return_if_fail(priv != NULL);
344+
345+ services = connman_manager_get_services(priv->connman);
346+
347+ service_manager_update_services(priv->service_manager, services);
348+}
349+
350+static void connman_service_added(ConnmanManager *proxy,
351+ ConnmanService *service,
352+ gpointer user_data)
353+{
354+ Manager *self = MANAGER(user_data);
355+
356+ update_services(self);
357+}
358+
359+static void connman_service_removed(ConnmanManager *proxy, const gchar *path,
360+ gpointer user_data)
361+{
362+ Manager *self = MANAGER(user_data);
363+
364+ update_services(self);
365+}
366+
367+static void connman_connected(Manager *self)
368+{
369+ ManagerPrivate *priv = GET_PRIVATE(self);
370+
371+ g_return_if_fail(priv != NULL);
372+
373+ g_debug("connected to connman");
374+
375+ start_agent(self);
376+
377+ update_services(self);
378+
379+ /* FIXME: create update_technologies() */
380+
381 network_menu_enable(priv->network_menu);
382-
383- /* FIXME: free properties */
384-}
385-
386-static gboolean start_routine(gpointer user_data)
387-{
388- Manager *self = MANAGER(user_data);
389- ManagerPrivate *priv = GET_PRIVATE(self);
390-
391- g_return_val_if_fail(self != NULL, FALSE);
392- g_return_val_if_fail(priv != NULL, FALSE);
393-
394- update_all_properties(self);
395-
396- /* return false so that this callback isn't called anymore */
397- return FALSE;
398-}
399-
400-static void connman_proxy_destroy(DBusGProxy *proxy, gpointer user_data)
401-{
402- Manager *self = MANAGER(user_data);
403- ManagerPrivate *priv = GET_PRIVATE(self);
404-
405- g_return_if_fail(self != NULL);
406+}
407+
408+static void connman_disconnected(Manager *self)
409+{
410+ ManagerPrivate *priv = GET_PRIVATE(self);
411+
412+ g_debug("disconnected from connman");
413+
414 g_return_if_fail(priv != NULL);
415
416- if (priv->connman_proxy != NULL) {
417- g_object_unref(priv->connman_proxy);
418- priv->connman_proxy = NULL;
419- }
420-
421 network_menu_disable(priv->network_menu);
422 service_manager_remove_all(priv->service_manager);
423 stop_connecting_animation(self);
424 manager_proxy_set_icon(priv->ns_dbus, ICON_DISCONNECTED);
425 stop_agent(self);
426-
427- g_debug("connman proxy destroyed");
428-
429- return;
430-}
431-
432-static void create_connman_proxy(Manager *self)
433-{
434- ManagerPrivate *priv = GET_PRIVATE(self);
435- GError *error = NULL;
436-
437- g_return_if_fail(priv != NULL);
438- g_return_if_fail(priv->system_bus != NULL);
439- g_return_if_fail(priv->connman_proxy == NULL);
440-
441- priv->connman_proxy = dbus_g_proxy_new_for_name_owner(priv->system_bus,
442- CONNMAN_SERVICE_NAME,
443- CONNMAN_MANAGER_PATH,
444- CONNMAN_MANAGER_INTERFACE,
445- &error);
446-
447- if (error != NULL) {
448- g_debug("unable to contact connmand, not running?");
449- network_menu_disable(priv->network_menu);
450- g_error_free(error);
451- return;
452- }
453-
454- g_signal_connect(G_OBJECT(priv->connman_proxy), "destroy",
455- G_CALLBACK(connman_proxy_destroy), self);
456-
457- dbus_g_proxy_add_signal(priv->connman_proxy, CONNMAN_SIGNAL_PROPERTY_CHANGED,
458- G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID);
459-
460- dbus_g_proxy_connect_signal(priv->connman_proxy,
461- CONNMAN_SIGNAL_PROPERTY_CHANGED,
462- G_CALLBACK(connman_property_changed),
463- self, NULL);
464-
465- g_debug("connman proxies created");
466-
467- /* connmand is now running */
468-
469- /* FIXME: start_routine should be deleted if connmand is gone again */
470- g_idle_add(start_routine, self);
471- start_agent(self);
472-
473- return;
474-}
475-
476-static void agent_proxy_destroy(DBusGProxy *proxy, gpointer user_data)
477+}
478+
479+static void connman_connected_notify(ConnmanManager *connman, GParamSpec *pspec,
480+ gpointer user_data)
481 {
482 Manager *self = MANAGER(user_data);
483+
484+ if (connman_manager_is_connected(connman))
485+ connman_connected(self);
486+ else
487+ connman_disconnected(self);
488+}
489+
490+static void create_connman(Manager *self)
491+{
492 ManagerPrivate *priv = GET_PRIVATE(self);
493
494- g_return_if_fail(self != NULL);
495 g_return_if_fail(priv != NULL);
496
497- g_object_unref(priv->agent_proxy);
498- priv->agent_proxy = NULL;
499-
500- g_debug("agent proxy destroyed");
501-
502- /* FIXME: start agent again if we didn't stop it */
503+ priv->connman = connman_manager_new();
504+
505+ g_signal_connect(priv->connman, "notify::connected",
506+ G_CALLBACK(connman_connected_notify),
507+ self);
508+ g_signal_connect(priv->connman, "service-added",
509+ G_CALLBACK(connman_service_added),
510+ self);
511+ g_signal_connect(priv->connman, "service-removed",
512+ G_CALLBACK(connman_service_removed),
513+ self);
514+
515+ if (connman_manager_is_connected(priv->connman))
516+ connman_connected(self);
517+
518+ /* otherwise wait for the connected signal */
519+
520 return;
521 }
522
523-static void create_agent_proxy(Manager *self)
524+static void ui_connected_notify(UIProxy *ui, GParamSpec *pspec,
525+ gpointer user_data)
526+{
527+ if (ui_proxy_is_connected(ui))
528+ g_debug("ui connected");
529+ else
530+ g_debug("ui disconnected");
531+
532+ /* FIXME: start ui again if we didn't stop it */
533+}
534+
535+static void create_ui_proxy(Manager *self)
536 {
537 ManagerPrivate *priv = GET_PRIVATE(self);
538
539 g_return_if_fail(self != NULL);
540 g_return_if_fail(priv != NULL);
541- g_return_if_fail(priv->session_bus != NULL);
542
543 /* this should not be called agent_proxy is already created */
544- g_return_if_fail(priv->agent_proxy == NULL);
545-
546- priv->agent_proxy = dbus_g_proxy_new_for_name(priv->session_bus,
547- INDICATOR_NETWORK_AGENT_NAME,
548- INDICATOR_NETWORK_AGENT_OBJECT,
549- INDICATOR_NETWORK_AGENT_INTERFACE);
550- if (priv->agent_proxy == NULL) {
551- g_warning("failed to create agent proxy");
552- return;
553- }
554-
555- g_signal_connect(G_OBJECT(priv->agent_proxy), "destroy",
556- G_CALLBACK(agent_proxy_destroy), self);
557-
558- g_debug("agent proxy created");
559-}
560-
561-static void dbus_namechange(DBusGProxy *proxy, const gchar *name,
562- const gchar *prev, const gchar *new,
563- gpointer user_data)
564-{
565- Manager *self = MANAGER(user_data);
566-
567- g_return_if_fail(self != NULL);
568- g_return_if_fail(name != NULL);
569- g_return_if_fail(new != NULL);
570-
571- if (g_strcmp0(name, CONNMAN_SERVICE_NAME) == 0 && strlen(new) > 0) {
572- g_debug("connman manager interface visible");
573- create_connman_proxy(self);
574- }
575- return;
576-}
577-
578-static void create_dbus_proxy(Manager *self)
579-{
580- ManagerPrivate *priv = GET_PRIVATE(self);
581- GError *error = NULL;
582-
583- g_return_if_fail(self != NULL);
584- g_return_if_fail(priv != NULL);
585- g_return_if_fail(priv->system_bus != NULL);
586-
587- /* Set up the dbus Proxy */
588- priv->dbus_proxy = dbus_g_proxy_new_for_name_owner(priv->system_bus,
589- DBUS_SERVICE_DBUS,
590- DBUS_PATH_DBUS,
591- DBUS_INTERFACE_DBUS,
592- &error);
593- if (error != NULL) {
594- g_warning("Unable to connect to DBus events: %s", error->message);
595- g_error_free(error);
596- return;
597- }
598-
599- /* Configure the name owner changing */
600- dbus_g_proxy_add_signal(priv->dbus_proxy, "NameOwnerChanged",
601- G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
602- G_TYPE_INVALID);
603- dbus_g_proxy_connect_signal(priv->dbus_proxy, "NameOwnerChanged",
604- G_CALLBACK(dbus_namechange),
605- self, NULL);
606-
607-}
608-
609-static void start_agent_cb(DBusGProxy *proxy, GError *error,
610- gpointer user_data)
611-{
612- if (error) {
613- g_warning("failed to start agent: %s", error->message);
614- g_error_free(error);
615- }
616+ g_return_if_fail(priv->ui == NULL);
617+
618+ priv->ui = ui_proxy_new();
619+
620+ if (priv->ui == NULL) {
621+ g_warning("failed to create ui proxy");
622+ return;
623+ }
624+
625+ g_signal_connect(priv->ui, "notify::connected",
626+ G_CALLBACK(ui_connected_notify),
627+ self);
628+
629+ g_debug("ui proxy created");
630 }
631
632 void start_agent(Manager *self)
633 {
634 ManagerPrivate *priv = GET_PRIVATE(self);
635
636- g_return_if_fail(self != NULL);
637 g_return_if_fail(priv != NULL);
638-
639- if (priv->agent_proxy == NULL)
640- return;
641-
642- org_ayatana_indicator_network_agent_start_async(priv->agent_proxy,
643- start_agent_cb,
644- self);
645-}
646-
647-static void stop_agent_cb(DBusGProxy *proxy, GError *error,
648- gpointer user_data)
649-{
650- if (error) {
651- g_warning("failed to stop agent: %s", error->message);
652- g_error_free(error);
653- }
654+ g_return_if_fail(priv->ui != NULL);
655+
656+ ui_proxy_start(priv->ui);
657 }
658
659 void stop_agent(Manager *self)
660 {
661 ManagerPrivate *priv = GET_PRIVATE(self);
662
663- g_return_if_fail(self != NULL);
664 g_return_if_fail(priv != NULL);
665-
666- if (priv->agent_proxy == NULL)
667- return;
668-
669- org_ayatana_indicator_network_agent_stop_async(priv->agent_proxy,
670- stop_agent_cb,
671- self);
672+ g_return_if_fail(priv->ui != NULL);
673+
674+ ui_proxy_stop(priv->ui);
675 }
676
677 void manager_request_scan(Manager *self)
678 {
679- ManagerPrivate *priv = GET_PRIVATE(self);
680- GError * error = NULL;
681-
682- g_return_if_fail(self != NULL);
683- g_return_if_fail(priv != NULL);
684-
685- g_debug ("request scan");
686- if (priv->connman_proxy == NULL) {
687- g_warning ("but no connman instance available, so aborting");
688- return;
689- }
690-
691- /* FIXME: use async */
692- org_moblin_connman_Manager_request_scan (priv->connman_proxy,
693- "wifi", &error);
694- if (error != NULL) {
695- g_warning ("Error while trying to request scan: %s", error->message);
696- g_error_free (error);
697- return;
698- }
699+ /* FIXME: implement connman_manager_request_scan() */
700 }
701
702 void manager_set_debug_level(Manager *self, gint level)
703@@ -702,24 +542,24 @@
704 log_set_debug(level > 0);
705 }
706
707-DBusGProxy *manager_get_agent(Manager *self)
708+UIProxy *manager_get_ui(Manager *self)
709 {
710 ManagerPrivate *priv = GET_PRIVATE(self);
711
712- g_return_val_if_fail(self != NULL, NULL);
713+ g_return_val_if_fail(IS_MANAGER(self), NULL);
714 g_return_val_if_fail(priv != NULL, NULL);
715
716- return priv->agent_proxy;
717+ return priv->ui;
718 }
719
720-DBusGProxy *manager_get_connman(Manager *self)
721+ConnmanManager *manager_get_connman(Manager *self)
722 {
723 ManagerPrivate *priv = GET_PRIVATE(self);
724
725 g_return_val_if_fail(self != NULL, NULL);
726 g_return_val_if_fail(priv != NULL, NULL);
727
728- return priv->connman_proxy;
729+ return priv->connman;
730 }
731
732 ServiceManager *manager_get_service_manager(Manager *self)
733@@ -739,21 +579,10 @@
734 ManagerPrivate *priv;
735 gchar *icon;
736 int i, j;
737- GError *error = NULL;
738
739 self = g_object_new(TYPE_MANAGER, NULL);
740 priv = GET_PRIVATE(self);
741
742- priv->system_bus = system_bus;
743-
744- priv->session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
745- if (error) {
746- g_critical("Unable to connect to the dbus session bus: %s",
747- error->message);
748- g_error_free(error);
749- priv->session_bus = NULL;
750- }
751-
752 priv->ns_dbus = manager_proxy_new(self);
753 priv->service_manager = service_manager_new(self);
754 priv->network_menu = network_menu_new(self);
755@@ -766,21 +595,8 @@
756 "default-service-changed",
757 G_CALLBACK(default_service_changed), self);
758
759-
760- dbus_g_object_register_marshaller(_marshal_VOID__STRING_BOXED,
761- G_TYPE_NONE,
762- G_TYPE_STRING,
763- G_TYPE_VALUE,
764- G_TYPE_INVALID);
765-
766- dbus_g_object_register_marshaller(_marshal_VOID__INT,
767- G_TYPE_NONE,
768- G_TYPE_INT,
769- G_TYPE_INVALID);
770-
771- create_agent_proxy(self);
772- create_dbus_proxy(self);
773- create_connman_proxy(self);
774+ create_ui_proxy(self);
775+ create_connman(self);
776
777 /* create icon names */
778 for (i = 0; i < CONNECTING_ICON_STAGES; i++) {
779
780=== modified file 'src/backend/manager.h'
781--- src/backend/manager.h 2010-10-04 13:32:38 +0000
782+++ src/backend/manager.h 2010-11-26 12:12:27 +0000
783@@ -24,6 +24,9 @@
784 #include <glib-object.h>
785 #include <dbus/dbus-glib-bindings.h>
786
787+#include "connman-manager.h"
788+#include "ui-proxy.h"
789+
790 G_BEGIN_DECLS
791
792 #define TYPE_MANAGER manager_get_type()
793@@ -86,11 +89,11 @@
794
795 GType manager_get_type(void);
796
797-const gchar *manager_icon_name(const gchar *technology, gint signal);
798+const gchar *manager_icon_name(ConnmanServiceType type, gint signal);
799 void manager_notify(Manager *self, const gchar *summary, const gchar *body,
800 const gchar *icon);
801-DBusGProxy *manager_get_agent(Manager *self);
802-DBusGProxy *manager_get_connman(Manager *self);
803+UIProxy *manager_get_ui(Manager *self);
804+ConnmanManager *manager_get_connman(Manager *self);
805 ServiceManager *manager_get_service_manager(Manager *self);
806 void stop_agent(Manager *self);
807 void manager_set_debug_level(Manager *self, gint level);
808
809=== modified file 'src/backend/network-menu.c'
810--- src/backend/network-menu.c 2010-10-01 12:58:01 +0000
811+++ src/backend/network-menu.c 2010-11-26 12:12:27 +0000
812@@ -424,78 +424,16 @@
813 priv->wireless_enabled = state;
814 }
815
816-static void enable_wifi_cb(DBusGProxy *proxy, GError *error,
817- gpointer user_data)
818-{
819- NetworkMenu *self = user_data;
820- NetworkMenuPrivate *priv = GET_PRIVATE(self);
821- const gchar *summary, *msg, *icon;
822-
823- if (error == NULL)
824- /* method call ended successfully, nothing to do */
825- return;
826-
827- /* there was an error, notify the user */
828- g_warning("Failed to enable wireless: %s", error->message);
829-
830- summary = _("Wireless");
831- msg = _("Failed to enable wireless");
832- icon = ICON_NOTIFICATION_WIFI_FULL;
833-
834- manager_notify(priv->network_service, summary, msg, icon);
835-
836- g_error_free(error);
837-}
838-
839-static void disable_wifi_cb(DBusGProxy *proxy, GError *error,
840- gpointer user_data)
841-{
842- NetworkMenu *self = user_data;
843- NetworkMenuPrivate *priv = GET_PRIVATE(self);
844- const gchar *summary, *msg, *icon;
845-
846- if (error == NULL)
847- /* method call ended successfully, nothing to do */
848- return;
849-
850- /* there was an error, notify the user */
851- g_warning("Failed to disable wireless: %s", error->message);
852-
853- summary = _("Wireless");
854- msg = _("Failed to disable wireless");
855- icon = ICON_NOTIFICATION_WIFI_FULL;
856-
857- manager_notify(priv->network_service, summary, msg, icon);
858-
859- g_error_free(error);
860-}
861-
862 static void toggle_wireless_cb(DbusmenuMenuitem *mi, guint timestamp,
863 gpointer user_data)
864 {
865 NetworkMenu *self = user_data;
866 NetworkMenuPrivate *priv = GET_PRIVATE(self);
867 Manager *ns = priv->network_service;
868- DBusGProxy *proxy;
869
870 g_return_if_fail(ns != NULL);
871
872- /* FIXME: should manager_enable_technology() or similar */
873- proxy = manager_get_connman(priv->network_service);
874-
875- if (proxy == NULL)
876- return;
877-
878- if (priv->wireless_enabled)
879- org_moblin_connman_Manager_disable_technology_async(proxy,
880- CONNMAN_TECHNOLOGY_WIFI,
881- disable_wifi_cb,
882- self);
883- else
884- org_moblin_connman_Manager_enable_technology_async(proxy,
885- CONNMAN_TECHNOLOGY_WIFI,
886- enable_wifi_cb,
887- self);
888+ /* FIXME: enable or disable wireless accordingly */
889 }
890
891 static void network_settings_activated(DbusmenuMenuitem *mi, guint timestamp,
892@@ -510,34 +448,20 @@
893 g_spawn_async(NULL, argv, NULL, 0, NULL, NULL, NULL, NULL);
894 }
895
896-static void show_wireless_connect_reply(DBusGProxy *proxy, GError *error,
897- gpointer user_data)
898-{
899- if (error) {
900- g_critical("Unable to show wireless connect dialog: %s",
901- error->message);
902- g_error_free(error);
903- return;
904- }
905-}
906-
907 static void wireless_other_activated(DbusmenuMenuitem *mi, guint timestamp,
908 gpointer user_data)
909 {
910 NetworkMenu *self = user_data;
911 NetworkMenuPrivate *priv = GET_PRIVATE(self);
912 Manager *ns = priv->network_service;
913- DBusGProxy *agent;
914-
915- agent = manager_get_agent(ns);
916-
917- if (agent == NULL)
918+ UIProxy *ui;
919+
920+ ui = manager_get_ui(ns);
921+
922+ if (ui == NULL)
923 return;
924
925- org_ayatana_indicator_network_agent_show_wireless_connect_async(agent,
926- show_wireless_connect_reply,
927- self);
928-
929+ ui_proxy_show_wireless_connect(ui);
930 }
931
932 NetworkMenu *network_menu_new(Manager *ns)
933
934=== modified file 'src/backend/ofono-manager.c'
935--- src/backend/ofono-manager.c 2010-11-05 11:36:06 +0000
936+++ src/backend/ofono-manager.c 2010-11-26 12:12:27 +0000
937@@ -39,7 +39,7 @@
938 struct _OfonoManagerPrivate {
939 DBusGConnection *system_bus;
940 DBusGProxy *manager;
941- DBusGProxy *agent;
942+ UIProxy *ui;
943 GHashTable *modems;
944 GHashTable *sims;
945
946@@ -48,6 +48,7 @@
947
948 #define PIN_TYPE_PIN "pin"
949
950+#ifdef FIXME
951 static void enter_pin_cb(DBusGProxy *proxy, GError *error, gpointer user_data)
952 {
953 OfonoManager *self = OFONO_MANAGER(user_data);
954@@ -73,23 +74,36 @@
955 org_ofono_SimManager_enter_pin_async(proxy, type, pin,
956 enter_pin_cb, self);
957 }
958+#endif
959
960-static void ask_pin_cb(DBusGProxy *proxy, char *pin, GError *error,
961+static void ask_pin_cb(GObject *object, GAsyncResult *res,
962 gpointer user_data)
963 {
964 OfonoManager *self = OFONO_MANAGER(user_data);
965 OfonoManagerPrivate *priv = GET_PRIVATE(self);
966+ UIProxy *ui = UI_PROXY(object);
967+ GError *error = NULL;
968+
969+ g_return_if_fail(priv != NULL);
970+
971+ ui_proxy_ask_pin_finish(ui, res, &error);
972+
973+ if (error != NULL) {
974+ g_warning("ask pin failed: %s\n", error->message);
975+ g_error_free(error);
976+ return;
977+ }
978
979 g_return_if_fail(priv->current_sim != NULL);
980
981+#ifdef FIXME /* finish should return the pin */
982 if (pin == NULL || strlen(pin) == 0) {
983 priv->current_sim = NULL;
984 return;
985 }
986
987 enter_pin(self, priv->current_sim, PIN_TYPE_PIN, pin);
988-
989- /* FIXME: should free pin? */
990+#endif
991 }
992
993 static void ask_pin(OfonoManager *self, DBusGProxy *proxy)
994@@ -102,8 +116,7 @@
995 }
996
997 priv->current_sim = proxy;
998- org_ayatana_indicator_network_agent_ask_pin_async(priv->agent, PIN_TYPE_PIN,
999- ask_pin_cb, self);
1000+ ui_proxy_ask_pin(priv->ui, PIN_TYPE_PIN, NULL, ask_pin_cb, self);
1001 }
1002
1003 static void update_pin_required(OfonoManager *self, DBusGProxy *proxy,
1004@@ -439,9 +452,9 @@
1005 priv->manager = NULL;
1006 }
1007
1008- if (priv->agent != NULL) {
1009- g_object_unref(priv->agent);
1010- priv->agent = NULL;
1011+ if (priv->ui != NULL) {
1012+ g_object_unref(priv->ui);
1013+ priv->ui = NULL;
1014 }
1015
1016 if (priv->modems != NULL) {
1017@@ -513,10 +526,10 @@
1018 self = g_object_new(TYPE_OFONO_MANAGER, NULL);
1019
1020 priv = GET_PRIVATE(self);
1021- priv->agent = manager_get_agent(manager);
1022- g_object_ref(priv->agent);
1023+ priv->ui = manager_get_ui(manager);
1024+ g_object_ref(priv->ui);
1025
1026- g_return_val_if_fail(priv->agent != NULL, NULL);
1027+ g_return_val_if_fail(priv->ui != NULL, NULL);
1028
1029 return self;
1030 }
1031
1032=== modified file 'src/backend/service-manager.c'
1033--- src/backend/service-manager.c 2010-10-04 10:22:51 +0000
1034+++ src/backend/service-manager.c 2010-11-26 12:12:27 +0000
1035@@ -175,33 +175,20 @@
1036 service_get_strength(service));
1037 }
1038
1039-static void iterate_services(const GValue *value, gpointer user_data)
1040-{
1041- GList **new_paths = user_data;
1042- gchar *path;
1043-
1044- path = g_value_dup_boxed (value);
1045- if (!path)
1046- return;
1047-
1048- *new_paths = g_list_append(*new_paths, path);
1049-}
1050-
1051-void service_manager_update(ServiceManager *self, GValue *value)
1052+void service_manager_update_services(ServiceManager *self,
1053+ ConnmanService **services)
1054 {
1055 ServiceManagerPrivate *priv = GET_PRIVATE(self);
1056- GList *new_paths = NULL, *iter, *old_services, *link;
1057+ GList *old_services, *link;
1058 Service *service;
1059- gchar *path;
1060+ const gchar *path;
1061 gint count = 0;
1062
1063- dbus_g_type_collection_value_iterate(value, iterate_services, &new_paths);
1064-
1065 old_services = priv->services;
1066 priv->services = NULL;
1067
1068- for (iter = new_paths; iter != NULL; iter = iter->next) {
1069- path = iter->data;
1070+ for (; *services != NULL; services++) {
1071+ path = connman_service_get_path(*services);
1072
1073 /* check if we already have this service and reuse it */
1074 link = service_manager_find(old_services, path);
1075@@ -210,11 +197,11 @@
1076 old_services = g_list_delete_link(old_services, link);
1077 link = NULL;
1078 } else {
1079- service = service_new(path, priv->network_service);
1080+ service = service_new(*services, priv->network_service);
1081 g_signal_connect(G_OBJECT(service), "state-changed",
1082- G_CALLBACK(service_state_changed), self);
1083+ G_CALLBACK(service_state_changed), self);
1084 g_signal_connect(G_OBJECT(service), "strength-updated",
1085- G_CALLBACK(service_strength_updated), self);
1086+ G_CALLBACK(service_strength_updated), self);
1087
1088 count++;
1089 }
1090@@ -241,16 +228,6 @@
1091 /* remove unavailable services, we don't want to show them anymore */
1092 service_manager_free_all(old_services);
1093 old_services = NULL;
1094-
1095- if (new_paths) {
1096- for (iter = new_paths; iter != NULL; iter = iter->next) {
1097- g_free(iter->data);
1098- iter->data = NULL;
1099- }
1100-
1101- g_list_free(new_paths);
1102- new_paths = NULL;
1103- }
1104 }
1105
1106 GList *service_manager_get_wired(ServiceManager *self)
1107@@ -261,8 +238,7 @@
1108
1109 for (iter = priv->services; iter != NULL; iter = iter->next) {
1110 service = iter->data;
1111- if (g_strcmp0(service_get_tech(service),
1112- CONNMAN_TECHNOLOGY_ETHERNET) == 0) {
1113+ if (service_get_service_type(service) == CONNMAN_SERVICE_TYPE_ETHERNET) {
1114 list = g_list_append(list, service);
1115 }
1116 }
1117@@ -278,7 +254,7 @@
1118
1119 for (iter = priv->services; iter != NULL; iter = iter->next) {
1120 service = iter->data;
1121- if (g_strcmp0(service_get_tech(service), CONNMAN_TECHNOLOGY_WIFI) == 0) {
1122+ if (service_get_service_type(service) == CONNMAN_SERVICE_TYPE_WIFI) {
1123 list = g_list_append(list, service);
1124
1125 /* show only certain number of wireless networks */
1126@@ -294,15 +270,16 @@
1127 {
1128 ServiceManagerPrivate *priv = GET_PRIVATE(self);
1129 GList *list = NULL, *iter;
1130+ ConnmanServiceType type;
1131 Service *service;
1132
1133 for (iter = priv->services; iter != NULL; iter = iter->next) {
1134 service = iter->data;
1135- if (g_strcmp0(service_get_tech(service),
1136- CONNMAN_TECHNOLOGY_CELLULAR) == 0) {
1137+ type = service_get_service_type(service);
1138+
1139+ if (type == CONNMAN_SERVICE_TYPE_CELLULAR) {
1140 list = g_list_append(list, service);
1141- } else if (g_strcmp0(service_get_tech(service),
1142- CONNMAN_TECHNOLOGY_BLUETOOTH) == 0) {
1143+ } else if (type == CONNMAN_SERVICE_TYPE_BLUETOOTH) {
1144 list = g_list_append(list, service);
1145 }
1146 }
1147@@ -318,8 +295,8 @@
1148
1149 for (iter = priv->services; iter != NULL; iter = iter->next) {
1150 service = iter->data;
1151- if (service_get_state(service) == SERVICE_STATE_ASSOCIATION ||
1152- service_get_state(service) == SERVICE_STATE_CONFIGURATION) {
1153+ if (service_get_state(service) == CONNMAN_SERVICE_STATE_ASSOCIATION ||
1154+ service_get_state(service) == CONNMAN_SERVICE_STATE_CONFIGURATION) {
1155 return TRUE;
1156 }
1157 }
1158@@ -336,7 +313,7 @@
1159 {
1160 ServiceManagerPrivate *priv = GET_PRIVATE(self);
1161 Service *service;
1162- ServiceState state;
1163+ ConnmanServiceState state;
1164 GList *iter;
1165 guint result = 0;
1166
1167@@ -344,8 +321,9 @@
1168 service = iter->data;
1169 state = service_get_state(service);
1170
1171- if (state == SERVICE_STATE_READY || state == SERVICE_STATE_LOGIN ||
1172- state == SERVICE_STATE_ONLINE) {
1173+ if (state == CONNMAN_SERVICE_STATE_READY ||
1174+ state == CONNMAN_SERVICE_STATE_LOGIN ||
1175+ state == CONNMAN_SERVICE_STATE_ONLINE) {
1176 result++;
1177 }
1178 }
1179@@ -353,18 +331,18 @@
1180 return result;
1181 }
1182
1183-const gchar *service_manager_get_default_technology(ServiceManager *self)
1184+ConnmanServiceType service_manager_get_default_technology(ServiceManager *self)
1185 {
1186 Service *service;
1187
1188- g_return_val_if_fail(IS_SERVICE_MANAGER(self), NULL);
1189+ g_return_val_if_fail(IS_SERVICE_MANAGER(self), CONNMAN_SERVICE_TYPE_ETHERNET);
1190
1191 service = service_manager_get_default_service(self);
1192
1193 if (service == NULL)
1194- return "";
1195+ return CONNMAN_SERVICE_TYPE_ETHERNET;
1196
1197- return service_get_tech(service);
1198+ return service_get_service_type(service);
1199 }
1200
1201 Service *service_manager_get_default_service(ServiceManager *self)
1202
1203=== modified file 'src/backend/service-manager.h'
1204--- src/backend/service-manager.h 2010-09-30 13:58:58 +0000
1205+++ src/backend/service-manager.h 2010-11-26 12:12:27 +0000
1206@@ -59,7 +59,8 @@
1207
1208 ServiceManager *service_manager_new(Manager *ns);
1209 void service_manager_free(ServiceManager *self);
1210-void service_manager_update(ServiceManager *self, GValue *value);
1211+void service_manager_update_services(ServiceManager *self,
1212+ ConnmanService **services);
1213 void service_manager_remove_all(ServiceManager *self);
1214 GList *service_manager_get_wired(ServiceManager *self);
1215 GList *service_manager_get_wireless(ServiceManager *self);
1216@@ -67,7 +68,7 @@
1217 gboolean service_manager_is_connecting(ServiceManager *self);
1218 gboolean service_manager_is_connected(ServiceManager *self);
1219 guint service_manager_get_connected(ServiceManager *self);
1220-const gchar *service_manager_get_default_technology(ServiceManager *self);
1221+ConnmanServiceType service_manager_get_default_technology(ServiceManager *self);
1222 Service *service_manager_get_default_service(ServiceManager *self);
1223 guint service_manager_get_strength(ServiceManager *self);
1224
1225
1226=== modified file 'src/backend/service.c'
1227--- src/backend/service.c 2010-11-17 13:54:50 +0000
1228+++ src/backend/service.c 2010-11-26 12:12:27 +0000
1229@@ -49,19 +49,9 @@
1230 typedef struct _ServicePrivate ServicePrivate;
1231
1232 struct _ServicePrivate {
1233- gchar *path;
1234- gchar *name;
1235- gchar *type;
1236 Manager *network_service;
1237- DbusmenuMenuitem *menuitem;
1238- DBusGProxy *proxy;
1239- ServiceState state;
1240- gint signal_strength;
1241- gchar *error;
1242- gchar *security;
1243- DBusGProxyCall *connect_call;
1244- DBusGProxyCall *disconnect_call;
1245- DBusGProxyCall *show_error_call;
1246+ ConnmanService *service;
1247+ ConnmanServiceState state;
1248 };
1249
1250 enum {
1251@@ -73,47 +63,19 @@
1252
1253 static guint signals[LAST_SIGNAL] = { 0 };
1254
1255-struct service_state_string
1256-{
1257- const gchar *str;
1258- ServiceState state;
1259-};
1260-
1261-static const struct service_state_string service_state_map[] = {
1262- { "unknown", SERVICE_STATE_UNKNOWN },
1263- { "idle", SERVICE_STATE_IDLE },
1264- { "failure", SERVICE_STATE_FAILURE },
1265- { "association", SERVICE_STATE_ASSOCIATION },
1266- { "configuration", SERVICE_STATE_CONFIGURATION },
1267- { "ready", SERVICE_STATE_READY },
1268- { "login", SERVICE_STATE_LOGIN },
1269- { "online", SERVICE_STATE_ONLINE },
1270- { "disconnect", SERVICE_STATE_DISCONNECT },
1271-};
1272-
1273 static void service_dispose(GObject *object)
1274 {
1275 Service *self = SERVICE(object);
1276 ServicePrivate *priv = GET_PRIVATE(self);
1277
1278- if (priv->connect_call != NULL && priv->proxy != NULL) {
1279- dbus_g_proxy_cancel_call(priv->proxy, priv->connect_call);
1280- priv->connect_call = NULL;
1281- }
1282-
1283- if (priv->disconnect_call != NULL && priv->proxy != NULL) {
1284- dbus_g_proxy_cancel_call(priv->proxy, priv->disconnect_call);
1285- priv->disconnect_call = NULL;
1286- }
1287-
1288- if (priv->show_error_call != NULL && priv->proxy != NULL) {
1289- dbus_g_proxy_cancel_call(priv->proxy, priv->show_error_call);
1290- priv->show_error_call = NULL;
1291- }
1292-
1293- if (priv->proxy != NULL) {
1294- g_object_unref(priv->proxy);
1295- priv->proxy = NULL;
1296+ if (priv->service != NULL) {
1297+ g_object_unref(priv->service);
1298+ priv->service = NULL;
1299+ }
1300+
1301+ if (priv->network_service != NULL) {
1302+ g_object_unref(priv->network_service);
1303+ priv->network_service = NULL;
1304 }
1305
1306 G_OBJECT_CLASS (service_parent_class)->dispose (object);
1307@@ -122,25 +84,9 @@
1308 static void service_finalize(GObject *object)
1309 {
1310 Service *self = SERVICE(object);
1311- ServicePrivate *priv = GET_PRIVATE(self);
1312
1313 g_debug("[%p] service finalize", self);
1314
1315- g_free(priv->path);
1316- priv->path = NULL;
1317-
1318- g_free(priv->name);
1319- priv->name = NULL;
1320-
1321- g_free(priv->type);
1322- priv->type = NULL;
1323-
1324- g_free(priv->error);
1325- priv->error = NULL;
1326-
1327- g_free(priv->security);
1328- priv->security = NULL;
1329-
1330 G_OBJECT_CLASS (service_parent_class)->finalize (object);
1331 }
1332
1333@@ -176,31 +122,31 @@
1334 {
1335 ServicePrivate *priv = GET_PRIVATE(self);
1336
1337- g_return_val_if_fail(priv != NULL, "");
1338- g_return_val_if_fail(priv->type != NULL, "");
1339+ g_return_val_if_fail(priv != NULL, NULL);
1340
1341- if (g_strcmp0(priv->type, CONNMAN_TECHNOLOGY_WIFI) == 0)
1342+ switch (connman_service_get_service_type(priv->service)) {
1343+ case CONNMAN_SERVICE_TYPE_WIFI:
1344 return ICON_NOTIFICATION_WIFI_DISCONNECTED;
1345- else if (g_strcmp0(priv->type, CONNMAN_TECHNOLOGY_ETHERNET) == 0)
1346+ case CONNMAN_SERVICE_TYPE_ETHERNET:
1347 return ICON_NOTIFICATION_WIRED_DISCONNECTED;
1348- else if (g_strcmp0(priv->type, CONNMAN_TECHNOLOGY_CELLULAR) == 0)
1349+ case CONNMAN_SERVICE_TYPE_CELLULAR:
1350 return ICON_NOTIFICATION_CELLULAR_DISCONNECTED;
1351- else
1352+ default:
1353 return ICON_NOTIFICATION_WIRED_DISCONNECTED;
1354+ }
1355 }
1356
1357-
1358-static void service_connect_cb(DBusGProxy *proxy, GError *error,
1359- gpointer user_data)
1360+static void service_connect_cb(GObject *object, GAsyncResult *res,
1361+ gpointer user_data)
1362 {
1363 Service *self = user_data;
1364 ServicePrivate *priv = GET_PRIVATE(self);
1365 const gchar *summary, *msg, *icon;
1366+ GError *error = NULL;
1367
1368 g_return_if_fail(priv != NULL);
1369- g_return_if_fail(priv->connect_call != NULL);
1370
1371- priv->connect_call = NULL;
1372+ connman_service_connect_finish(priv->service, res, &error);
1373
1374 if (error == NULL)
1375 /* method call had no errors */
1376@@ -209,9 +155,9 @@
1377 /* FIXME: don't show errors if passphrase is requested through agent */
1378
1379 g_warning("[%p] failed to connect service %s: %s",
1380- self, priv->path, error->message);
1381+ self, connman_service_get_path(priv->service), error->message);
1382
1383- summary = priv->name;
1384+ summary = connman_service_get_name(priv->service);
1385 msg = _("Connection Failed");
1386 icon = get_disconnected_icon(self);
1387
1388@@ -223,44 +169,34 @@
1389 static void service_connect(Service *self)
1390 {
1391 ServicePrivate *priv = GET_PRIVATE(self);
1392- DBusGProxyCall *call;
1393-
1394- g_return_if_fail(priv);
1395- g_return_if_fail(priv->proxy);
1396-
1397- if (priv->connect_call != NULL) {
1398- g_debug("[%p] connect call already in progress", self);
1399- return;
1400- }
1401+
1402+ g_return_if_fail(priv != NULL);
1403
1404 g_debug("[%p] connect", self);
1405
1406- call = org_moblin_connman_Service_connect_async(priv->proxy,
1407- service_connect_cb,
1408- self);
1409- priv->connect_call = call;
1410+ connman_service_connect(priv->service, service_connect_cb, self);
1411 }
1412
1413-static void service_disconnect_cb(DBusGProxy *proxy, GError *error,
1414- gpointer user_data)
1415+static void service_disconnect_cb(GObject *object, GAsyncResult *res,
1416+ gpointer user_data)
1417 {
1418- Service *self = user_data;
1419+ Service *self = SERVICE(user_data);
1420 ServicePrivate *priv = GET_PRIVATE(self);
1421 const gchar *summary, *msg, *icon;
1422+ GError *error = NULL;
1423
1424 g_return_if_fail(priv != NULL);
1425- g_return_if_fail(priv->disconnect_call != NULL);
1426
1427- priv->disconnect_call = NULL;
1428+ connman_service_disconnect_finish(priv->service, res, &error);
1429
1430 if (error == NULL)
1431 /* method call had no errors */
1432 return;
1433
1434 g_warning("[%p] failed to disconnect service %s: %s",
1435- self, priv->path, error->message);
1436+ self, connman_service_get_path(priv->service), error->message);
1437
1438- summary = priv->name;
1439+ summary = connman_service_get_name(priv->service);
1440 msg = _("Disconnection Failed");
1441 icon = get_disconnected_icon(self);
1442
1443@@ -272,22 +208,13 @@
1444 static void service_disconnect(Service *self)
1445 {
1446 ServicePrivate *priv = GET_PRIVATE(self);
1447- DBusGProxyCall *call;
1448-
1449- g_return_if_fail(priv);
1450- g_return_if_fail(priv->proxy);
1451-
1452- if (priv->disconnect_call != NULL) {
1453- g_debug("[%p] disconnect call already in progress", self);
1454- return;
1455- }
1456+
1457+ g_return_if_fail(priv != NULL);
1458+ g_return_if_fail(priv->service != NULL);
1459
1460 g_debug("[%p] disconnect", self);
1461
1462- call = org_moblin_connman_Service_disconnect_async(priv->proxy,
1463- service_disconnect_cb,
1464- self);
1465- priv->disconnect_call = call;
1466+ connman_service_disconnect(priv->service, service_disconnect_cb, self);
1467 }
1468
1469 static void service_item_activated(DbusmenuMenuitem *mi, guint timestamp,
1470@@ -298,17 +225,17 @@
1471
1472 g_return_if_fail(priv != NULL);
1473
1474- switch (priv->state) {
1475- case SERVICE_STATE_IDLE:
1476- case SERVICE_STATE_FAILURE:
1477- case SERVICE_STATE_DISCONNECT:
1478+ switch (connman_service_get_state(priv->service)) {
1479+ case CONNMAN_SERVICE_STATE_IDLE:
1480+ case CONNMAN_SERVICE_STATE_FAILURE:
1481+ case CONNMAN_SERVICE_STATE_DISCONNECT:
1482 service_connect(self);
1483 break;
1484- case SERVICE_STATE_ASSOCIATION:
1485- case SERVICE_STATE_CONFIGURATION:
1486- case SERVICE_STATE_READY:
1487- case SERVICE_STATE_LOGIN:
1488- case SERVICE_STATE_ONLINE:
1489+ case CONNMAN_SERVICE_STATE_ASSOCIATION:
1490+ case CONNMAN_SERVICE_STATE_CONFIGURATION:
1491+ case CONNMAN_SERVICE_STATE_READY:
1492+ case CONNMAN_SERVICE_STATE_LOGIN:
1493+ case CONNMAN_SERVICE_STATE_ONLINE:
1494 service_disconnect(self);
1495 break;
1496 default:
1497@@ -316,49 +243,15 @@
1498 }
1499 }
1500
1501-static ServiceState service_str2state(const gchar *state)
1502-{
1503- const struct service_state_string *s;
1504- guint i;
1505-
1506- for (i = 0; i < G_N_ELEMENTS(service_state_map); i++) {
1507- s = &service_state_map[i];
1508- if (g_str_equal(s->str, state))
1509- return s->state;
1510- }
1511-
1512- g_warning("%s(): unknown state %s", __func__, state);
1513-
1514- return SERVICE_STATE_IDLE;
1515-}
1516-
1517-static const gchar *service_state2str(ServiceState state)
1518-{
1519- const struct service_state_string *s;
1520- guint i;
1521-
1522- for (i = 0; i < G_N_ELEMENTS(service_state_map); i++) {
1523- s = &service_state_map[i];
1524- if (s->state == state)
1525- return s->str;
1526- }
1527-
1528- g_warning("%s(): unknown state %d", __func__, state);
1529-
1530- return "unknown";
1531-}
1532-
1533 static void service_update_label(Service *self)
1534 {
1535 ServicePrivate *priv = GET_PRIVATE(self);
1536
1537 g_return_if_fail(priv);
1538- g_return_if_fail(priv->name);
1539- g_return_if_fail(strlen(priv->name) > 0);
1540
1541 dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self),
1542 DBUSMENU_MENUITEM_PROP_LABEL,
1543- priv->name);
1544+ connman_service_get_name(priv->service));
1545 }
1546
1547 static void service_update_checkmark(Service *self)
1548@@ -368,16 +261,16 @@
1549
1550 g_return_if_fail(priv);
1551
1552- switch (priv->state) {
1553- case SERVICE_STATE_READY:
1554- case SERVICE_STATE_LOGIN:
1555- case SERVICE_STATE_ONLINE:
1556+ switch (connman_service_get_state(priv->service)) {
1557+ case CONNMAN_SERVICE_STATE_READY:
1558+ case CONNMAN_SERVICE_STATE_LOGIN:
1559+ case CONNMAN_SERVICE_STATE_ONLINE:
1560 state = DBUSMENU_MENUITEM_TOGGLE_STATE_CHECKED;
1561 break;
1562- case SERVICE_STATE_IDLE:
1563- case SERVICE_STATE_FAILURE:
1564- case SERVICE_STATE_ASSOCIATION:
1565- case SERVICE_STATE_CONFIGURATION:
1566+ case CONNMAN_SERVICE_STATE_IDLE:
1567+ case CONNMAN_SERVICE_STATE_FAILURE:
1568+ case CONNMAN_SERVICE_STATE_ASSOCIATION:
1569+ case CONNMAN_SERVICE_STATE_CONFIGURATION:
1570 default:
1571 state = DBUSMENU_MENUITEM_TOGGLE_STATE_UNCHECKED;
1572 break;
1573@@ -388,116 +281,100 @@
1574 state);
1575 }
1576
1577-static void show_connect_error_cb(DBusGProxy *proxy, GError *error,
1578- gpointer user_data)
1579-{
1580- Service *self = user_data;
1581- ServicePrivate *priv = GET_PRIVATE(self);
1582-
1583- g_return_if_fail(priv != NULL);
1584- g_return_if_fail(priv->show_error_call != NULL);
1585-
1586- priv->show_error_call = NULL;
1587-
1588- if (error != NULL) {
1589- g_warning("%s(): failed to show connection error: %s",
1590- __func__, error->message);
1591- g_error_free(error);
1592- }
1593-}
1594-
1595 static void show_connect_error(Service *self)
1596 {
1597 ServicePrivate *priv = GET_PRIVATE(self);
1598- DBusGProxy *proxy = manager_get_agent(priv->network_service);
1599 const gchar *error_type = "general-connect-error";
1600- DBusGProxyCall *call;
1601-
1602- if (g_strcmp0(priv->type, CONNMAN_TECHNOLOGY_WIFI) == 0) {
1603- if (g_strcmp0(priv->security, "none") == 0) {
1604+ ConnmanServiceSecurity security;
1605+ ConnmanServiceState state;
1606+ ConnmanServiceType type;
1607+
1608+ g_return_if_fail(priv != NULL);
1609+
1610+ type = connman_service_get_service_type(priv->service);
1611+ security = connman_service_get_security(priv->service);
1612+ state = connman_service_get_state(priv->service);
1613+
1614+ if (type == CONNMAN_SERVICE_TYPE_WIFI) {
1615+ if (security == CONNMAN_SERVICE_SECURITY_NONE) {
1616 error_type = "wifi-open-connect-error";
1617 }
1618- else if (g_strcmp0(priv->security, "wep") == 0) {
1619- if (priv->state == SERVICE_STATE_CONFIGURATION)
1620+ else if (security == CONNMAN_SERVICE_SECURITY_WEP) {
1621+ if (state == CONNMAN_SERVICE_STATE_CONFIGURATION)
1622 error_type = "wifi-wep-dhcp-error";
1623 else
1624 error_type = "wifi-wep-connect-error";
1625 }
1626- else if ((g_strcmp0(priv->security, "wpa") == 0) ||
1627- (g_strcmp0(priv->security, "psk") == 0) ||
1628- (g_strcmp0(priv->security, "rsn") == 0)) {
1629- if (priv->state == SERVICE_STATE_CONFIGURATION)
1630+ else if (security == CONNMAN_SERVICE_SECURITY_PSK) {
1631+ if (state == CONNMAN_SERVICE_STATE_CONFIGURATION)
1632 error_type = "wifi-wpa-dhcp-error";
1633 else
1634 error_type = "wifi-wpa-connect-error";
1635 }
1636 }
1637
1638- call = org_ayatana_indicator_network_agent_show_connect_error_async(proxy,
1639- error_type,
1640- show_connect_error_cb,
1641- self);
1642- priv->show_error_call = call;
1643+ /* FIXME: show error dialogs */
1644 }
1645
1646-static void service_update_state(Service *self, const gchar *state)
1647+static void state_updated(ConnmanService *service, GParamSpec *pspec,
1648+ gpointer user_data)
1649 {
1650+ Service *self = SERVICE(user_data);
1651 ServicePrivate *priv = GET_PRIVATE(self);
1652- ServiceState new_state;
1653+ ConnmanServiceState new_state;
1654+ ConnmanServiceType type;
1655 const gchar *icon;
1656
1657- g_return_if_fail(priv);
1658- g_return_if_fail(priv->type);
1659- g_return_if_fail(state);
1660-
1661- g_debug("[%p] %s -> %s", self, service_state2str(priv->state),
1662- state);
1663-
1664- new_state = service_str2state(state);
1665+ g_return_if_fail(priv != NULL);
1666+
1667+ new_state = connman_service_get_state(priv->service);
1668+
1669+ g_debug("[%p] %s -> %s", self,
1670+ connman_service_state2str(priv->state),
1671+ connman_service_state2str(new_state));
1672
1673 /* only show state transitions */
1674 if (priv->state == new_state)
1675 return;
1676
1677- /*
1678- * if old state is unknown it means that we indicator-network-service just
1679- * started, so we should not send any notifications
1680- */
1681- if (priv->state != SERVICE_STATE_UNKNOWN) {
1682- switch (new_state) {
1683- case SERVICE_STATE_READY:
1684- if (g_str_equal(priv->type, CONNMAN_TECHNOLOGY_WIFI))
1685- icon = ICON_NOTIFICATION_WIFI_FULL;
1686- else if (g_str_equal(priv->type, CONNMAN_TECHNOLOGY_ETHERNET))
1687- icon = ICON_NOTIFICATION_WIRED_CONNECTED;
1688- else if (g_str_equal(priv->type, CONNMAN_TECHNOLOGY_CELLULAR))
1689- icon = ICON_NOTIFICATION_CELLULAR_CONNECTED;
1690- else
1691- icon = NULL;
1692- manager_notify(priv->network_service, priv->name,
1693- _("Connection Established"), icon);
1694- break;
1695- case SERVICE_STATE_IDLE:
1696- icon = get_disconnected_icon(self);
1697- manager_notify(priv->network_service, priv->name,
1698- _("Disconnected"), icon);
1699- break;
1700- case SERVICE_STATE_FAILURE:
1701- icon = get_disconnected_icon(self);
1702- manager_notify(priv->network_service, priv->name,
1703- _("Connection Failed"), icon);
1704- break;
1705- case SERVICE_STATE_ASSOCIATION:
1706- case SERVICE_STATE_CONFIGURATION:
1707- default:
1708- /* do nothing */
1709- break;
1710- }
1711+ type = connman_service_get_service_type(priv->service);
1712+
1713+ switch (new_state) {
1714+ case CONNMAN_SERVICE_STATE_READY:
1715+ if (type == CONNMAN_SERVICE_TYPE_WIFI)
1716+ icon = ICON_NOTIFICATION_WIFI_FULL;
1717+ else if (type == CONNMAN_SERVICE_TYPE_ETHERNET)
1718+ icon = ICON_NOTIFICATION_WIRED_CONNECTED;
1719+ else if (type == CONNMAN_SERVICE_TYPE_CELLULAR)
1720+ icon = ICON_NOTIFICATION_CELLULAR_CONNECTED;
1721+ else
1722+ icon = NULL;
1723+ manager_notify(priv->network_service,
1724+ connman_service_get_name(priv->service),
1725+ _("Connection Established"), icon);
1726+ break;
1727+ case CONNMAN_SERVICE_STATE_IDLE:
1728+ icon = get_disconnected_icon(self);
1729+ manager_notify(priv->network_service,
1730+ connman_service_get_name(priv->service),
1731+ _("Disconnected"), icon);
1732+ break;
1733+ case CONNMAN_SERVICE_STATE_FAILURE:
1734+ icon = get_disconnected_icon(self);
1735+ manager_notify(priv->network_service,
1736+ connman_service_get_name(priv->service),
1737+ _("Connection Failed"), icon);
1738+ break;
1739+ case CONNMAN_SERVICE_STATE_ASSOCIATION:
1740+ case CONNMAN_SERVICE_STATE_CONFIGURATION:
1741+ default:
1742+ /* do nothing */
1743+ break;
1744 }
1745
1746- if ((priv->state == SERVICE_STATE_ASSOCIATION ||
1747- priv->state == SERVICE_STATE_CONFIGURATION) &&
1748- new_state == SERVICE_STATE_FAILURE) {
1749+ if ((priv->state == CONNMAN_SERVICE_STATE_ASSOCIATION ||
1750+ priv->state == CONNMAN_SERVICE_STATE_CONFIGURATION) &&
1751+ new_state == CONNMAN_SERVICE_STATE_FAILURE) {
1752 show_connect_error(self);
1753 }
1754
1755@@ -513,73 +390,45 @@
1756 ServicePrivate *priv = GET_PRIVATE(self);
1757 const gchar *icon;
1758
1759- icon = manager_icon_name(priv->type, priv->signal_strength);
1760+ g_return_if_fail(priv != NULL);
1761+
1762+ icon = manager_icon_name(connman_service_get_service_type(priv->service),
1763+ connman_service_get_strength(priv->service));
1764
1765 dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self),
1766 DBUSMENU_MENUITEM_PROP_ICON_NAME,
1767 icon);
1768 }
1769
1770-/* FIXME: this should get GValue, not gchar */
1771-static void service_update_type(Service *self, const gchar *type)
1772-{
1773- ServicePrivate *priv = GET_PRIVATE(self);
1774-
1775- g_return_if_fail(priv);
1776- g_return_if_fail(type);
1777-
1778- g_free(priv->type);
1779- priv->type = g_strdup(type);
1780-
1781- g_debug("[%p] type %s", self, priv->type);
1782-
1783- service_update_icon(self);
1784-}
1785-
1786-static void service_update_strength(Service *self, GValue *value)
1787-{
1788- ServicePrivate *priv = GET_PRIVATE(self);
1789- guchar strength;
1790-
1791- g_return_if_fail(priv);
1792- g_return_if_fail(value);
1793- g_return_if_fail(G_VALUE_HOLDS_UCHAR(value));
1794-
1795- strength = g_value_get_uchar(value);
1796-
1797- if (strength > 100)
1798- return;
1799-
1800- priv->signal_strength = strength;
1801+static void strength_updated(ConnmanService *service, GParamSpec *pspec,
1802+ gpointer user_data)
1803+{
1804+ Service *self = SERVICE(user_data);
1805+
1806 service_update_icon(self);
1807
1808 g_signal_emit(self, signals[STRENGTH_UPDATED], 0);
1809 }
1810
1811-static void service_update_setup_required(Service *self, GValue *value)
1812+static void setup_required(Service *self)
1813 {
1814 ServicePrivate *priv = GET_PRIVATE(self);
1815- gboolean setup;
1816+ ConnmanServiceType type;
1817 gchar *argv[3];
1818 gchar *cmd = BINDIR "/indicator-network-mobile-wizard";
1819
1820 g_return_if_fail(priv);
1821- g_return_if_fail(value);
1822- g_return_if_fail(G_VALUE_HOLDS_BOOLEAN(value));
1823-
1824- setup = g_value_get_boolean(value);
1825-
1826- g_debug("[%p] setup required %d", self, setup);
1827+
1828+ g_debug("[%p] setup required", self);
1829+
1830+ type = connman_service_get_service_type(priv->service);
1831
1832 /* mobile wizard is only for cellular */
1833- if (g_strcmp0(priv->type, CONNMAN_TECHNOLOGY_CELLULAR) != 0)
1834- return;
1835-
1836- if (!setup)
1837+ if (type != CONNMAN_SERVICE_TYPE_CELLULAR)
1838 return;
1839
1840 argv[0] = cmd;
1841- argv[1] = priv->path;
1842+ argv[1] = g_strdup(connman_service_get_path(priv->service));
1843 argv[2] = 0;
1844
1845 /*
1846@@ -588,224 +437,47 @@
1847 */
1848 g_debug("%s(): starting %s %s", __func__, argv[0], argv[1]);
1849 g_spawn_async(NULL, argv, NULL, 0, NULL, NULL, NULL, NULL);
1850-}
1851-
1852-static void service_update_security(Service *self, GValue *value)
1853-{
1854- ServicePrivate *priv = GET_PRIVATE(self);
1855- gint mode;
1856-
1857- g_return_if_fail(priv);
1858- g_return_if_fail(value);
1859- g_return_if_fail(G_VALUE_HOLDS_STRING(value));
1860-
1861- g_free(priv->security);
1862- priv->security = g_value_dup_string(value);
1863-
1864- if (priv->security == NULL) {
1865- g_warning("%s(): failed to allocate string for error", __func__);
1866- return;
1867- }
1868-
1869- if ((g_strcmp0(priv->security, "wep") == 0) ||
1870- (g_strcmp0(priv->security, "wpa") == 0) ||
1871- (g_strcmp0(priv->security, "psk") == 0) ||
1872- (g_strcmp0(priv->security, "rsn") == 0))
1873- mode = SERVICE_MENUITEM_PROP_PROTECTED;
1874- else
1875- mode = SERVICE_MENUITEM_PROP_OPEN;
1876-
1877- dbusmenu_menuitem_property_set_int(DBUSMENU_MENUITEM(self),
1878- SERVICE_MENUITEM_PROP_PROTECTION_MODE,
1879- mode);
1880-
1881- g_debug("[%p] security %s", self, priv->security);
1882-}
1883-
1884-static void service_update_error(Service *self, GValue *value)
1885-{
1886- ServicePrivate *priv = GET_PRIVATE(self);
1887-
1888- g_return_if_fail(priv);
1889- g_return_if_fail(value);
1890- g_return_if_fail(G_VALUE_HOLDS_STRING(value));
1891-
1892- g_free(priv->error);
1893- priv->error = g_value_dup_string(value);
1894-
1895- if (priv->error == NULL) {
1896- g_warning("%s(): failed to allocate string for error", __func__);
1897- return;
1898- }
1899-
1900- g_debug("[%p] error '%s'", self, priv->error);
1901-}
1902-
1903-static void service_update_name(Service *self, GValue *value)
1904-{
1905+
1906+ g_free(argv[1]);
1907+}
1908+
1909+static void name_updated(ConnmanService *service, GParamSpec *pspec,
1910+ gpointer user_data)
1911+{
1912+ Service *self = SERVICE(user_data);
1913 ServicePrivate *priv = GET_PRIVATE(self);
1914
1915 g_return_if_fail(priv != NULL);
1916- g_return_if_fail(priv->path != NULL);
1917-
1918- g_free(priv->name);
1919- priv->name = NULL;
1920-
1921- if (value && !G_VALUE_HOLDS_STRING(value))
1922- g_critical("%s(): value not a string", __func__);
1923-
1924- if (value && G_VALUE_HOLDS_STRING(value) &&
1925- strlen(g_value_get_string(value)) > 0)
1926- priv->name = g_value_dup_string(value);
1927- else
1928- /* no valid name found for the service, use service path instead */
1929- priv->name = g_strdup(priv->path);
1930-
1931- g_debug("[%p] name %s", self, priv->name);
1932+
1933+ g_debug("[%p] name %s", self, connman_service_get_name(priv->service));
1934
1935 service_update_label(self);
1936 }
1937
1938-static void service_get_properties(Service *self)
1939-{
1940- ServicePrivate *priv = GET_PRIVATE(self);
1941- GHashTable *properties = NULL;
1942- GValue *value;
1943- GError *error = NULL;
1944-
1945- g_return_if_fail(priv);
1946- g_return_if_fail(priv->proxy != NULL);
1947-
1948- /* should this be async? */
1949- org_moblin_connman_Service_get_properties(priv->proxy, &properties,
1950- &error);
1951-
1952- if (error) {
1953- g_warning("%s(): org_moblin_connman_Service_get_properties failed: %s",
1954- __func__, error->message);
1955- g_error_free(error);
1956- goto out;
1957- }
1958-
1959- value = g_hash_table_lookup(properties, CONNMAN_PROPERTY_NAME);
1960- if (value)
1961- service_update_name(self, value);
1962-
1963- /* needs to be before service_update_state() */
1964- value = g_hash_table_lookup(properties, CONNMAN_PROPERTY_TYPE);
1965- if (value)
1966- service_update_type(self, g_value_get_string(value));
1967-
1968- value = g_hash_table_lookup(properties, CONNMAN_PROPERTY_STATE);
1969- if (value)
1970- service_update_state(self, g_value_get_string(value));
1971-
1972- value = g_hash_table_lookup(properties, CONNMAN_PROPERTY_STRENGTH);
1973- if (value)
1974- service_update_strength(self, value);
1975-
1976- value = g_hash_table_lookup(properties, CONNMAN_PROPERTY_SETUP_REQUIRED);
1977- if (value)
1978- service_update_setup_required(self, value);
1979-
1980- value = g_hash_table_lookup(properties, CONNMAN_PROPERTY_SECURITY);
1981- if (value)
1982- service_update_security(self, value);
1983-
1984- value = g_hash_table_lookup(properties, CONNMAN_PROPERTY_ERROR);
1985- if (value)
1986- service_update_error(self, value);
1987-
1988- out:
1989- if (properties)
1990- g_hash_table_destroy(properties);
1991-}
1992-
1993-static void service_property_changed(DBusGProxy *proxy, const gchar *property,
1994- GValue *value, gpointer user_data)
1995-{
1996- Service *self = user_data;
1997-
1998- if (g_str_equal(property, CONNMAN_PROPERTY_NAME)) {
1999- service_update_name(self, value);
2000- }
2001-
2002- if (g_str_equal(property, CONNMAN_PROPERTY_STATE)) {
2003- service_update_state(self, g_value_get_string(value));
2004- }
2005-
2006- if (g_str_equal(property, CONNMAN_PROPERTY_STRENGTH)) {
2007- service_update_strength(self, value);
2008- }
2009-
2010- if (g_strcmp0(property, CONNMAN_PROPERTY_SETUP_REQUIRED) == 0) {
2011- service_update_setup_required(self, value);
2012- }
2013-
2014- if (g_strcmp0(property, CONNMAN_PROPERTY_SECURITY) == 0) {
2015- service_update_security(self, value);
2016- }
2017-
2018- if (g_strcmp0(property, CONNMAN_PROPERTY_ERROR) == 0) {
2019- service_update_error(self, value);
2020- }
2021-}
2022-
2023-Service *service_new(const gchar *path, Manager *ns)
2024+Service *service_new(ConnmanService *service, Manager *ns)
2025 {
2026 ServicePrivate *priv;
2027- DBusGConnection *system_bus;
2028- GError *error = NULL;
2029 Service *self;
2030+ gint mode;
2031+
2032+ g_return_val_if_fail(service != NULL, NULL);
2033+ g_return_val_if_fail(ns != NULL, NULL);
2034
2035 self = g_object_new(TYPE_SERVICE, NULL);
2036 priv = GET_PRIVATE(self);
2037
2038+ g_return_val_if_fail(self != NULL, NULL);
2039+ g_return_val_if_fail(priv != NULL, NULL);
2040+
2041 priv->network_service = ns;
2042-
2043- priv->path = g_strdup(path);
2044- if (!priv->path) {
2045- goto error;
2046- }
2047-
2048- g_debug("[%p] service new %s", self, priv->path);
2049-
2050- priv->name = g_strdup(priv->path);
2051-
2052- /*
2053- * FIXME: set DBUSMENU_MENUITEM_PROP_LABEL to show at least something
2054- * from the beginning, if nothing else than "<unnamed>"
2055- */
2056-
2057- system_bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error);
2058-
2059- /* FIXME: follow also destroy signal */
2060- priv->proxy = dbus_g_proxy_new_for_name_owner(system_bus,
2061- CONNMAN_SERVICE_NAME,
2062- path,
2063- CONNMAN_SERVICE_INTERFACE,
2064- &error);
2065- if (error != NULL) {
2066- g_warning("failed to create dbus proxy for service %s", path);
2067- goto error;
2068- }
2069-
2070- /*
2071- * Some method calls, especially the connect method, might take a long
2072- * time. I didn't find a way to change the timeout for specific calls, so
2073- * have to increase timeout for all proxy calls.
2074- */
2075- dbus_g_proxy_set_default_timeout(priv->proxy, 120000);
2076-
2077- dbus_g_proxy_add_signal(priv->proxy, CONNMAN_SIGNAL_PROPERTY_CHANGED,
2078- G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID);
2079-
2080- dbus_g_proxy_connect_signal(priv->proxy,
2081- CONNMAN_SIGNAL_PROPERTY_CHANGED,
2082- G_CALLBACK(service_property_changed),
2083- self, NULL);
2084-
2085- priv->state = SERVICE_STATE_UNKNOWN;
2086+ g_object_ref(priv->network_service);
2087+
2088+ priv->service = service;
2089+ g_object_ref(priv->service);
2090+
2091+ /* FIXME: follow signals from priv->service */
2092+
2093+ g_debug("[%p] service new %s", self, connman_service_get_path(priv->service));
2094
2095 dbusmenu_menuitem_property_set(DBUSMENU_MENUITEM(self),
2096 DBUSMENU_MENUITEM_PROP_TYPE,
2097@@ -814,46 +486,82 @@
2098 DBUSMENU_MENUITEM_PROP_TOGGLE_TYPE,
2099 DBUSMENU_MENUITEM_TOGGLE_CHECK);
2100
2101- service_get_properties(self);
2102+ switch (connman_service_get_security(priv->service)) {
2103+ case CONNMAN_SERVICE_SECURITY_WEP:
2104+ case CONNMAN_SERVICE_SECURITY_PSK:
2105+ case CONNMAN_SERVICE_SECURITY_IEEE8021X:
2106+ mode = SERVICE_MENUITEM_PROP_PROTECTED;
2107+ break;
2108+ case CONNMAN_SERVICE_SECURITY_NONE:
2109+ default:
2110+ mode = SERVICE_MENUITEM_PROP_OPEN;
2111+ break;
2112+ }
2113+
2114+ dbusmenu_menuitem_property_set_int(DBUSMENU_MENUITEM(self),
2115+ SERVICE_MENUITEM_PROP_PROTECTION_MODE,
2116+ mode);
2117+
2118+ service_update_label(self);
2119+ service_update_checkmark(self);
2120
2121 g_signal_connect(G_OBJECT(self),
2122 DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
2123 G_CALLBACK(service_item_activated), self);
2124
2125+ g_signal_connect(priv->service, "notify::state", G_CALLBACK(state_updated),
2126+ self);
2127+ g_signal_connect(priv->service, "notify::name", G_CALLBACK(name_updated),
2128+ self);
2129+ g_signal_connect(priv->service, "notify::strength",
2130+ G_CALLBACK(strength_updated),
2131+ self);
2132+
2133+ if (connman_service_is_setup_required(priv->service))
2134+ setup_required(self);
2135+
2136 return self;
2137-
2138- error:
2139- g_object_unref(self);
2140- return NULL;
2141 }
2142
2143 const gchar *service_get_path(Service *self)
2144 {
2145 ServicePrivate *priv = GET_PRIVATE(self);
2146
2147- return priv->path;
2148-}
2149-
2150-/* service_get_type() existed already, use "tech" instead */
2151-const gchar *service_get_tech(Service *self)
2152-{
2153- ServicePrivate *priv = GET_PRIVATE(self);
2154-
2155- return priv->type;
2156-}
2157-
2158-ServiceState service_get_state(Service *self)
2159-{
2160- ServicePrivate *priv = GET_PRIVATE(self);
2161-
2162- return priv->state;
2163+ g_return_val_if_fail(IS_SERVICE(self), NULL);
2164+ g_return_val_if_fail(priv != NULL, NULL);
2165+
2166+ return connman_service_get_path(priv->service);
2167+}
2168+
2169+/* service_get_type() existed already, use "service_type" instead */
2170+ConnmanServiceType service_get_service_type(Service *self)
2171+{
2172+ ServicePrivate *priv = GET_PRIVATE(self);
2173+
2174+ g_return_val_if_fail(IS_SERVICE(self), CONNMAN_SERVICE_TYPE_ETHERNET);
2175+ g_return_val_if_fail(priv != NULL, CONNMAN_SERVICE_TYPE_ETHERNET);
2176+
2177+ return connman_service_get_service_type(priv->service);
2178+}
2179+
2180+ConnmanServiceState service_get_state(Service *self)
2181+{
2182+ ServicePrivate *priv = GET_PRIVATE(self);
2183+
2184+ g_return_val_if_fail(IS_SERVICE(self), CONNMAN_SERVICE_STATE_FAILURE);
2185+ g_return_val_if_fail(priv != NULL, CONNMAN_SERVICE_STATE_FAILURE);
2186+
2187+ return connman_service_get_state(priv->service);
2188 }
2189
2190 gint service_get_strength(Service *self)
2191 {
2192 ServicePrivate *priv = GET_PRIVATE(self);
2193
2194- return priv->signal_strength;
2195+ g_return_val_if_fail(IS_SERVICE(self), 0);
2196+ g_return_val_if_fail(priv != NULL, 0);
2197+
2198+ return connman_service_get_strength(priv->service);
2199 }
2200
2201 const gchar *service_get_name(Service *self)
2202@@ -863,5 +571,5 @@
2203 g_return_val_if_fail(IS_SERVICE(self), NULL);
2204 g_return_val_if_fail(priv != NULL, NULL);
2205
2206- return priv->name;
2207+ return connman_service_get_name(priv->service);
2208 }
2209
2210=== modified file 'src/backend/service.h'
2211--- src/backend/service.h 2010-10-05 07:23:53 +0000
2212+++ src/backend/service.h 2010-11-26 12:12:27 +0000
2213@@ -28,18 +28,6 @@
2214
2215 G_BEGIN_DECLS
2216
2217-typedef enum {
2218- SERVICE_STATE_UNKNOWN,
2219- SERVICE_STATE_IDLE,
2220- SERVICE_STATE_FAILURE,
2221- SERVICE_STATE_ASSOCIATION,
2222- SERVICE_STATE_CONFIGURATION,
2223- SERVICE_STATE_READY,
2224- SERVICE_STATE_LOGIN,
2225- SERVICE_STATE_ONLINE,
2226- SERVICE_STATE_DISCONNECT,
2227-} ServiceState;
2228-
2229 #define TYPE_SERVICE service_get_type()
2230
2231 #define SERVICE(obj) \
2232@@ -69,10 +57,10 @@
2233
2234 GType service_get_type(void);
2235
2236-Service *service_new(const gchar *path, Manager *ns);
2237+Service *service_new(ConnmanService *service, Manager *ns);
2238 const gchar *service_get_path(Service *self);
2239-const gchar *service_get_tech(Service *self);
2240-ServiceState service_get_state(Service *self);
2241+ConnmanServiceType service_get_service_type(Service *self);
2242+ConnmanServiceState service_get_state(Service *self);
2243 gint service_get_strength(Service *self);
2244 const gchar *service_get_name(Service *self);
2245
2246
2247=== added file 'src/backend/ui-proxy.c'
2248--- src/backend/ui-proxy.c 1970-01-01 00:00:00 +0000
2249+++ src/backend/ui-proxy.c 2010-11-26 12:12:27 +0000
2250@@ -0,0 +1,421 @@
2251+/*
2252+ * indicator-network - user interface for connman
2253+ * Copyright 2010 Canonical Ltd.
2254+ *
2255+ * Authors:
2256+ * Kalle Valo <kalle.valo@canonical.com>
2257+ *
2258+ * This program is free software: you can redistribute it and/or modify it
2259+ * under the terms of the GNU General Public License version 3, as published
2260+ * by the Free Software Foundation.
2261+ *
2262+ * This program is distributed in the hope that it will be useful, but
2263+ * WITHOUT ANY WARRANTY; without even the implied warranties of
2264+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
2265+ * PURPOSE. See the GNU General Public License for more details.
2266+ *
2267+ * You should have received a copy of the GNU General Public License along
2268+ * with this program. If not, see <http://www.gnu.org/licenses/>.
2269+ */
2270+
2271+#include "ui-proxy.h"
2272+
2273+#include "indicator-network-agent-xml.h"
2274+#include "dbus-shared-names.h"
2275+
2276+G_DEFINE_TYPE(UIProxy, ui_proxy, G_TYPE_OBJECT)
2277+
2278+#define GET_PRIVATE(o) \
2279+ (G_TYPE_INSTANCE_GET_PRIVATE((o), TYPE_UI_PROXY, \
2280+ UIProxyPrivate))
2281+
2282+typedef struct _UIProxyPrivate UIProxyPrivate;
2283+
2284+struct _UIProxyPrivate {
2285+ GDBusProxy *proxy;
2286+ guint watch_id;
2287+
2288+ gboolean connected;
2289+ gboolean start_requested;
2290+};
2291+
2292+enum
2293+{
2294+ /* reserved */
2295+ PROP_0,
2296+
2297+ PROP_CONNECTED,
2298+};
2299+
2300+static void call_cb(GObject *object, GAsyncResult *res, gpointer user_data)
2301+{
2302+ GDBusProxy *proxy = G_DBUS_PROXY(object);
2303+ UIProxy *self = UI_PROXY(user_data);
2304+ GError *error = NULL;
2305+ GVariant *result;
2306+
2307+ result = g_dbus_proxy_call_finish(proxy, res, &error);
2308+
2309+ if (error != NULL) {
2310+ g_warning("ui dbus call failed: %s", error->message);
2311+ g_error_free(error);
2312+ return;
2313+ }
2314+
2315+ if (result == NULL)
2316+ return;
2317+
2318+ g_variant_unref(result);
2319+ g_object_unref(self);
2320+}
2321+
2322+void ui_proxy_start(UIProxy *self)
2323+{
2324+ UIProxyPrivate *priv = GET_PRIVATE(self);
2325+
2326+ g_return_if_fail(IS_UI_PROXY(self));
2327+ g_return_if_fail(priv != NULL);
2328+
2329+ if (priv->proxy == NULL) {
2330+ /*
2331+ * The current way to create UIProxy object is racy because we don't
2332+ * signal when dbus is ready for use, so it can happen that gdbus proxy
2333+ * is not created when start is called. Postpone start to happen after
2334+ * the proxy is created.
2335+ */
2336+ priv->start_requested = TRUE;
2337+ return;
2338+ }
2339+
2340+ g_dbus_proxy_call(priv->proxy, "Start", NULL,
2341+ G_DBUS_CALL_FLAGS_NONE, -1, NULL,
2342+ call_cb, g_object_ref(self));
2343+}
2344+
2345+void ui_proxy_stop(UIProxy *self)
2346+{
2347+ UIProxyPrivate *priv = GET_PRIVATE(self);
2348+
2349+ g_return_if_fail(IS_UI_PROXY(self));
2350+ g_return_if_fail(priv != NULL);
2351+
2352+ if (!priv->connected) {
2353+ g_warning("Not connected to UI, cancelling Stop request");
2354+ return;
2355+ }
2356+
2357+ g_dbus_proxy_call(priv->proxy, "Stop", NULL,
2358+ G_DBUS_CALL_FLAGS_NONE, -1, NULL,
2359+ call_cb, g_object_ref(self));
2360+}
2361+
2362+void ui_proxy_show_connect_error(UIProxy *self, const gchar *error_id)
2363+{
2364+ UIProxyPrivate *priv = GET_PRIVATE(self);
2365+
2366+ g_return_if_fail(IS_UI_PROXY(self));
2367+ g_return_if_fail(priv != NULL);
2368+
2369+ if (!priv->connected) {
2370+ g_warning("Not connected to UI, cancelling ShowConnectError request");
2371+ return;
2372+ }
2373+
2374+ g_dbus_proxy_call(priv->proxy, "ShowConnectError", NULL,
2375+ G_DBUS_CALL_FLAGS_NONE, -1, NULL,
2376+ call_cb, g_object_ref(self));
2377+}
2378+
2379+void ui_proxy_show_wireless_connect(UIProxy *self)
2380+{
2381+ UIProxyPrivate *priv = GET_PRIVATE(self);
2382+
2383+ g_return_if_fail(IS_UI_PROXY(self));
2384+ g_return_if_fail(priv != NULL);
2385+
2386+ if (!priv->connected) {
2387+ g_warning("Not connected to UI, cancelling ShowWirelessConnect request");
2388+ return;
2389+ }
2390+
2391+ g_dbus_proxy_call(priv->proxy, "ShowWirelessConnect", NULL,
2392+ G_DBUS_CALL_FLAGS_NONE, -1, NULL,
2393+ call_cb, g_object_ref(self));
2394+}
2395+
2396+void ui_proxy_set_debug(UIProxy *self, guint level)
2397+{
2398+ UIProxyPrivate *priv = GET_PRIVATE(self);
2399+ GVariant *parameters;
2400+
2401+ g_return_if_fail(IS_UI_PROXY(self));
2402+ g_return_if_fail(priv != NULL);
2403+
2404+ if (!priv->connected) {
2405+ g_warning("Not connected to UI, cancelling SetDebug request");
2406+ return;
2407+ }
2408+
2409+ parameters = g_variant_new("(i)", level);
2410+
2411+ g_dbus_proxy_call(priv->proxy, "SetDebug", parameters,
2412+ G_DBUS_CALL_FLAGS_NONE, -1, NULL,
2413+ call_cb, g_object_ref(self));
2414+}
2415+
2416+static void ask_pin_cb(GObject *object, GAsyncResult *res, gpointer user_data)
2417+{
2418+ GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT(user_data);
2419+ GDBusProxy *proxy = G_DBUS_PROXY(object);
2420+ GError *error = NULL;
2421+ GVariant *result;
2422+
2423+ result = g_dbus_proxy_call_finish(proxy, res, &error);
2424+
2425+ if (error != NULL) {
2426+ g_simple_async_result_set_from_error(simple, error);
2427+ g_error_free(error);
2428+ goto out;
2429+ }
2430+
2431+ g_simple_async_result_set_op_res_gpointer(simple, result,
2432+ (GDestroyNotify) g_variant_unref);
2433+
2434+ out:
2435+ g_simple_async_result_complete(simple);
2436+ g_object_unref(simple);
2437+}
2438+
2439+void ui_proxy_ask_pin(UIProxy *self, const gchar *type,
2440+ GCancellable *cancellable, GAsyncReadyCallback callback,
2441+ gpointer user_data)
2442+{
2443+ GSimpleAsyncResult *simple;
2444+ UIProxyPrivate *priv = GET_PRIVATE(self);
2445+ GVariant *parameters;
2446+
2447+ g_return_if_fail(IS_UI_PROXY(self));
2448+ g_return_if_fail(priv != NULL);
2449+
2450+ simple = g_simple_async_result_new(G_OBJECT(self), callback,
2451+ user_data, ui_proxy_ask_pin);
2452+
2453+ if (!priv->connected) {
2454+ g_simple_async_result_set_error(simple, 0, 0,
2455+ "Not connected to UI, cancelling AskPin request");
2456+ return;
2457+ }
2458+
2459+ parameters = g_variant_new("(s)", type);
2460+
2461+ g_dbus_proxy_call(priv->proxy, "AskPin", parameters,
2462+ G_DBUS_CALL_FLAGS_NONE, -1, cancellable,
2463+ ask_pin_cb, simple);
2464+}
2465+
2466+gchar *ui_proxy_ask_pin_finish(UIProxy *self, GAsyncResult *res, GError **error)
2467+{
2468+ GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT(res);
2469+ gchar *pin = NULL;
2470+ GVariant *variant;
2471+
2472+ g_return_val_if_fail(IS_UI_PROXY(self), NULL);
2473+ g_return_val_if_fail(g_simple_async_result_get_source_tag(simple) ==
2474+ ui_proxy_ask_pin, NULL);
2475+
2476+ if (g_simple_async_result_propagate_error(simple, error))
2477+ return NULL;
2478+
2479+ variant = g_simple_async_result_get_op_res_gpointer(simple);
2480+ g_variant_get(variant, "s", pin);
2481+
2482+ /* simple still owns variant and unrefs it automatically */
2483+
2484+ /* caller now owns pin */
2485+ return pin;
2486+}
2487+
2488+gboolean ui_proxy_is_connected(UIProxy *self)
2489+{
2490+ UIProxyPrivate *priv = GET_PRIVATE(self);
2491+
2492+ g_return_val_if_fail(IS_UI_PROXY(self), FALSE);
2493+ g_return_val_if_fail(priv != NULL, FALSE);
2494+
2495+ return priv->connected;
2496+}
2497+
2498+static void service_appeared(GDBusConnection *connection, const gchar *name,
2499+ const gchar *name_owner, gpointer user_data)
2500+{
2501+ UIProxy *self = UI_PROXY(user_data);
2502+ UIProxyPrivate *priv = GET_PRIVATE(self);
2503+
2504+ if (priv->connected)
2505+ return;
2506+
2507+ priv->connected = TRUE;
2508+ g_object_notify(G_OBJECT(self), "connected");
2509+}
2510+
2511+
2512+static void service_vanished(GDBusConnection *connection, const gchar *name,
2513+ gpointer user_data)
2514+{
2515+ UIProxy *self = UI_PROXY(user_data);
2516+ UIProxyPrivate *priv = GET_PRIVATE(self);
2517+
2518+ if (!priv->connected)
2519+ return;
2520+
2521+ priv->connected = FALSE;
2522+ g_object_notify(G_OBJECT(self), "connected");
2523+}
2524+
2525+static void create_proxy_cb(GObject *source_object, GAsyncResult *res,
2526+ gpointer user_data)
2527+{
2528+ UIProxy *self = UI_PROXY(user_data);
2529+ UIProxyPrivate *priv = GET_PRIVATE(self);
2530+ GDBusNodeInfo *node_info;
2531+ GDBusInterfaceInfo *info;
2532+ GError *error = NULL;
2533+
2534+ g_return_if_fail(priv != NULL);
2535+
2536+ priv->proxy = g_dbus_proxy_new_finish(res, &error);
2537+
2538+ if (error != NULL) {
2539+ g_warning("Failed to get proxy: %s", error->message);
2540+ g_error_free(error);
2541+ return;
2542+ }
2543+
2544+ if (priv->proxy == NULL) {
2545+ g_warning("Failed to get proxy, but no errors");
2546+ return;
2547+ }
2548+
2549+ node_info = g_dbus_node_info_new_for_xml(indicator_network_agent_xml,
2550+ NULL);
2551+ g_return_if_fail(node_info != NULL);
2552+
2553+ info = node_info->interfaces[0];
2554+ g_dbus_proxy_set_interface_info(priv->proxy, info);
2555+
2556+ priv->watch_id = g_bus_watch_name(G_BUS_TYPE_SESSION,
2557+ INDICATOR_NETWORK_AGENT_NAME,
2558+ G_BUS_NAME_WATCHER_FLAGS_NONE,
2559+ service_appeared,
2560+ service_vanished,
2561+ self,
2562+ NULL);
2563+
2564+
2565+ if (priv->start_requested) {
2566+ ui_proxy_start(self);
2567+ priv->start_requested = FALSE;
2568+ }
2569+}
2570+
2571+static void ui_proxy_set_property(GObject *object,
2572+ guint property_id,
2573+ const GValue *value,
2574+ GParamSpec *pspec)
2575+{
2576+ UIProxy *self = UI_PROXY(object);
2577+ UIProxyPrivate *priv = GET_PRIVATE(self);
2578+
2579+ g_return_if_fail(priv != NULL);
2580+
2581+ switch(property_id) {
2582+ case PROP_CONNECTED:
2583+ priv->connected = g_value_get_boolean(value);
2584+ break;
2585+ default:
2586+ /* We don't have any other property... */
2587+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
2588+ break;
2589+ }
2590+}
2591+
2592+static void ui_proxy_get_property(GObject *object, guint property_id,
2593+ GValue *value, GParamSpec *pspec)
2594+{
2595+ UIProxy *self = UI_PROXY(object);
2596+ UIProxyPrivate *priv = GET_PRIVATE(self);
2597+
2598+ g_return_if_fail(priv != NULL);
2599+
2600+ switch(property_id) {
2601+ case PROP_CONNECTED:
2602+ g_value_set_boolean(value, priv->connected);
2603+ break;
2604+ default:
2605+ /* We don't have any other property... */
2606+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
2607+ break;
2608+ }
2609+}
2610+
2611+static void ui_proxy_dispose(GObject *object)
2612+{
2613+ UIProxy *self = UI_PROXY(object);
2614+ UIProxyPrivate *priv = GET_PRIVATE(self);
2615+
2616+ if (priv->proxy != NULL) {
2617+ g_object_unref(priv->proxy);
2618+ priv->proxy = NULL;
2619+ }
2620+
2621+ if (priv->watch_id != 0) {
2622+ g_bus_unwatch_name(priv->watch_id);
2623+ priv->watch_id = 0;
2624+ }
2625+
2626+ G_OBJECT_CLASS(ui_proxy_parent_class)->dispose(object);
2627+}
2628+
2629+static void ui_proxy_finalize(GObject *object)
2630+{
2631+ G_OBJECT_CLASS(ui_proxy_parent_class)->finalize(object);
2632+}
2633+
2634+static void ui_proxy_class_init(UIProxyClass *klass)
2635+{
2636+ GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
2637+ GParamSpec *pspec;
2638+
2639+ g_type_class_add_private(klass, sizeof(UIProxyPrivate));
2640+
2641+ gobject_class->dispose = ui_proxy_dispose;
2642+ gobject_class->finalize = ui_proxy_finalize;
2643+ gobject_class->set_property = ui_proxy_set_property;
2644+ gobject_class->get_property = ui_proxy_get_property;
2645+
2646+ pspec = g_param_spec_boolean("connected",
2647+ "UiProxy's connected property",
2648+ "Informs when object is connected for use",
2649+ FALSE,
2650+ G_PARAM_READABLE);
2651+ g_object_class_install_property(gobject_class, PROP_CONNECTED, pspec);
2652+}
2653+
2654+static void ui_proxy_init(UIProxy *self)
2655+{
2656+}
2657+
2658+UIProxy *ui_proxy_new(void)
2659+{
2660+ UIProxy *self;
2661+
2662+ self = g_object_new(TYPE_UI_PROXY, NULL);
2663+
2664+ g_dbus_proxy_new_for_bus(G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, NULL,
2665+ INDICATOR_NETWORK_AGENT_NAME,
2666+ INDICATOR_NETWORK_AGENT_OBJECT,
2667+ INDICATOR_NETWORK_AGENT_INTERFACE,
2668+ NULL, create_proxy_cb, self);
2669+
2670+ return self;
2671+}
2672
2673=== added file 'src/backend/ui-proxy.h'
2674--- src/backend/ui-proxy.h 1970-01-01 00:00:00 +0000
2675+++ src/backend/ui-proxy.h 2010-11-26 12:12:27 +0000
2676@@ -0,0 +1,72 @@
2677+/*
2678+ * indicator-network - user interface for connman
2679+ * Copyright 2010 Canonical Ltd.
2680+ *
2681+ * Authors:
2682+ * Kalle Valo <kalle.valo@canonical.com>
2683+ *
2684+ * This program is free software: you can redistribute it and/or modify it
2685+ * under the terms of the GNU General Public License version 3, as published
2686+ * by the Free Software Foundation.
2687+ *
2688+ * This program is distributed in the hope that it will be useful, but
2689+ * WITHOUT ANY WARRANTY; without even the implied warranties of
2690+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
2691+ * PURPOSE. See the GNU General Public License for more details.
2692+ *
2693+ * You should have received a copy of the GNU General Public License along
2694+ * with this program. If not, see <http://www.gnu.org/licenses/>.
2695+ */
2696+
2697+#ifndef _UI_PROXY_H_
2698+#define _UI_PROXY_H_
2699+
2700+#include <glib-object.h>
2701+#include <gio/gio.h>
2702+
2703+G_BEGIN_DECLS
2704+
2705+#define TYPE_UI_PROXY ui_proxy_get_type()
2706+
2707+#define UI_PROXY(obj) \
2708+ (G_TYPE_CHECK_INSTANCE_CAST((obj), TYPE_UI_PROXY, \
2709+ UIProxy))
2710+
2711+#define UI_PROXY_CLASS(klass) \
2712+ (G_TYPE_CHECK_CLASS_CAST((klass), TYPE_UI_PROXY, \
2713+ UIProxyClass))
2714+
2715+#define IS_UI_PROXY(obj) \
2716+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), TYPE_UI_PROXY))
2717+
2718+#define IS_UI_PROXY_CLASS(klass) \
2719+ (G_TYPE_CHECK_CLASS_TYPE((klass), TYPE_UI_PROXY))
2720+
2721+#define UI_PROXY_GET_CLASS(obj) \
2722+ (G_TYPE_INSTANCE_GET_CLASS((obj), TYPE_UI_PROXY, \
2723+ UIProxyClass))
2724+
2725+typedef struct {
2726+ GObject parent;
2727+} UIProxy;
2728+
2729+typedef struct {
2730+ GObjectClass parent_class;
2731+} UIProxyClass;
2732+
2733+GType ui_proxy_get_type(void);
2734+
2735+void ui_proxy_start(UIProxy *self);
2736+void ui_proxy_stop(UIProxy *self);
2737+void ui_proxy_show_connect_error(UIProxy *self, const gchar *error_id);
2738+void ui_proxy_show_wireless_connect(UIProxy *self);
2739+void ui_proxy_set_debug(UIProxy *self, guint level);
2740+void ui_proxy_ask_pin(UIProxy *self, const gchar *type,
2741+ GCancellable *cancellable, GAsyncReadyCallback callback,
2742+ gpointer user_data);
2743+gchar *ui_proxy_ask_pin_finish(UIProxy *self, GAsyncResult *res,
2744+ GError **error);
2745+gboolean ui_proxy_is_connected(UIProxy *self);
2746+UIProxy *ui_proxy_new(void);
2747+
2748+#endif
2749
2750=== modified file 'tests/Makefile.am'
2751--- tests/Makefile.am 2010-11-18 11:23:15 +0000
2752+++ tests/Makefile.am 2010-11-26 12:12:27 +0000
2753@@ -42,9 +42,7 @@
2754 $(top_srcdir)/src/backend/service-manager.c \
2755 mock-manager.c \
2756 mock-service.c \
2757- mock-dbus-gproxy.h \
2758- mock-dbus-gproxy.c \
2759- mock-dbus-gtype-specialized.c
2760+ mock-connman-service.c
2761
2762 TEST_PROGS += test-service
2763 test_service_SOURCES = \
2764@@ -52,11 +50,9 @@
2765 $(top_srcdir)/src/backend/service.c \
2766 mock-manager.c \
2767 mock-service-manager.c \
2768- mock-dbus-gproxy.h \
2769- mock-dbus-gproxy.c \
2770 mock-dbusmenu-menuitem.c \
2771- mock-dbus-gtype-specialized.c \
2772- connman-service-client.h
2773+ connman-service-client.h \
2774+ mock-connman-service.c
2775
2776 TEST_PROGS += test-network-menu
2777 test_network_menu_SOURCES = \
2778@@ -66,9 +62,7 @@
2779 mock-dbusmenu-menuitem.c \
2780 mock-service-manager.c \
2781 mock-dbusmenu-server.c \
2782- mock-dbus-gproxy.h \
2783- mock-dbus-gproxy.c \
2784- mock-dbus-gtype-specialized.c \
2785+ mock-ui-proxy.c \
2786 connman-manager-client.h \
2787 indicator-network-agent-client.h
2788
2789@@ -77,19 +71,19 @@
2790 test-manager.c \
2791 $(top_srcdir)/src/backend/manager.c \
2792 mock-service-manager.c \
2793- mock-dbus-gproxy.h \
2794- mock-dbus-gproxy.c \
2795 mock-service.c \
2796 mock-network-menu.c \
2797 mock-network-menu.h \
2798 mock-manager-proxy.c \
2799- mock-dbus-gobject.c \
2800 connman-manager-client.h \
2801 mock-log.c \
2802 mock-notify-notification.c \
2803 mock-dbusmenu-menuitem.c \
2804 mock-ofono-manager.c \
2805- mock-dbus-gtype-specialized.c
2806+ mock-ui-proxy.c \
2807+ mock-connman-manager.c \
2808+ mock-connman-manager.h \
2809+ mock-connman-service.c
2810
2811 TEST_PROGS += test-manager-proxy
2812 test_manager_proxy_SOURCES = \
2813
2814=== added file 'tests/mock-connman-manager.c'
2815--- tests/mock-connman-manager.c 1970-01-01 00:00:00 +0000
2816+++ tests/mock-connman-manager.c 2010-11-26 12:12:27 +0000
2817@@ -0,0 +1,194 @@
2818+/*
2819+ * indicator-network - user interface for connman
2820+ * Copyright 2010 Canonical Ltd.
2821+ *
2822+ * Authors:
2823+ * Kalle Valo <kalle.valo@canonical.com>
2824+ *
2825+ * This program is free software: you can redistribute it and/or modify it
2826+ * under the terms of the GNU General Public License version 3, as published
2827+ * by the Free Software Foundation.
2828+ *
2829+ * This program is distributed in the hope that it will be useful, but
2830+ * WITHOUT ANY WARRANTY; without even the implied warranties of
2831+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
2832+ * PURPOSE. See the GNU General Public License for more details.
2833+ *
2834+ * You should have received a copy of the GNU General Public License along
2835+ * with this program. If not, see <http://www.gnu.org/licenses/>.
2836+ */
2837+
2838+#include "mock-connman-manager.h"
2839+
2840+#include "marshal.h"
2841+#include "connman-service.h"
2842+
2843+G_DEFINE_TYPE(ConnmanManager, connman_manager, G_TYPE_OBJECT)
2844+
2845+#define GET_PRIVATE(o) \
2846+ (G_TYPE_INSTANCE_GET_PRIVATE((o), CONNMAN_TYPE_MANAGER, \
2847+ ConnmanManagerPrivate))
2848+
2849+typedef struct _ConnmanManagerPrivate ConnmanManagerPrivate;
2850+
2851+struct _ConnmanManagerPrivate {
2852+ gboolean connected;
2853+ gboolean initialised;
2854+};
2855+
2856+enum {
2857+ SERVICE_ADDED_SIGNAL,
2858+ SERVICE_REMOVED_SIGNAL,
2859+ LAST_SIGNAL,
2860+};
2861+
2862+static guint signals[LAST_SIGNAL] = { 0 };
2863+
2864+enum
2865+{
2866+ /* reserved */
2867+ PROP_0,
2868+
2869+ PROP_CONNECTED,
2870+};
2871+
2872+void connman_manager_connect_service(ConnmanManager *self,
2873+ ConnmanServiceType type,
2874+ ConnmanServiceMode mode,
2875+ ConnmanServiceSecurity security,
2876+ guint8 *ssid,
2877+ guint ssid_len,
2878+ GCancellable *cancellable,
2879+ GAsyncReadyCallback callback,
2880+ gpointer user_data)
2881+{
2882+}
2883+
2884+void connman_manager_connect_service_finish(ConnmanManager *self,
2885+ GAsyncResult *res,
2886+ GError **error)
2887+{
2888+}
2889+
2890+gboolean connman_manager_is_connected(ConnmanManager *self)
2891+{
2892+ ConnmanManagerPrivate *priv = GET_PRIVATE(self);
2893+
2894+ g_return_val_if_fail(CONNMAN_IS_MANAGER(self), FALSE);
2895+ g_return_val_if_fail(priv != NULL, FALSE);
2896+
2897+ return priv->connected;
2898+}
2899+
2900+ConnmanService **connman_manager_get_services(ConnmanManager *self)
2901+{
2902+ return NULL;
2903+}
2904+
2905+static void set_property(GObject *object, guint property_id,
2906+ const GValue *value, GParamSpec *pspec)
2907+{
2908+ ConnmanManager *self = CONNMAN_MANAGER(object);
2909+ ConnmanManagerPrivate *priv = GET_PRIVATE(self);
2910+
2911+ g_return_if_fail(priv != NULL);
2912+
2913+ switch(property_id) {
2914+ case PROP_CONNECTED:
2915+ priv->connected = g_value_get_boolean(value);
2916+ break;
2917+ default:
2918+ /* We don't have any other property... */
2919+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
2920+ break;
2921+ }
2922+}
2923+
2924+static void get_property(GObject *object, guint property_id,
2925+ GValue *value, GParamSpec *pspec)
2926+{
2927+ ConnmanManager *self = CONNMAN_MANAGER(object);
2928+ ConnmanManagerPrivate *priv = GET_PRIVATE(self);
2929+
2930+ switch(property_id) {
2931+ case PROP_CONNECTED:
2932+ g_value_set_boolean(value, priv->connected);
2933+ break;
2934+ default:
2935+ /* We don't have any other property... */
2936+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
2937+ break;
2938+ }
2939+}
2940+
2941+static void connman_manager_dispose(GObject *object)
2942+{
2943+ G_OBJECT_CLASS(connman_manager_parent_class)->dispose(object);
2944+}
2945+
2946+static void connman_manager_finalize(GObject *object)
2947+{
2948+ G_OBJECT_CLASS(connman_manager_parent_class)->finalize(object);
2949+}
2950+
2951+static void connman_manager_class_init(ConnmanManagerClass *klass)
2952+{
2953+ GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
2954+ GParamSpec *pspec;
2955+ guint id;
2956+
2957+ g_type_class_add_private(klass, sizeof(ConnmanManagerPrivate));
2958+
2959+ gobject_class->dispose = connman_manager_dispose;
2960+ gobject_class->finalize = connman_manager_finalize;
2961+ gobject_class->set_property = set_property;
2962+ gobject_class->get_property = get_property;
2963+
2964+ id = g_signal_new("service-added",
2965+ G_TYPE_FROM_CLASS(klass),
2966+ G_SIGNAL_RUN_LAST,
2967+ 0, NULL, NULL,
2968+ _marshal_VOID__BOXED,
2969+ G_TYPE_NONE, 1, CONNMAN_TYPE_SERVICE);
2970+ signals[SERVICE_ADDED_SIGNAL] = id;
2971+
2972+ id = g_signal_new("service-removed",
2973+ G_TYPE_FROM_CLASS(klass),
2974+ G_SIGNAL_RUN_LAST,
2975+ 0, NULL, NULL,
2976+ _marshal_VOID__STRING,
2977+ G_TYPE_NONE, 1, G_TYPE_STRING);
2978+ signals[SERVICE_REMOVED_SIGNAL] = id;
2979+
2980+ pspec = g_param_spec_boolean("connected",
2981+ "ConnmanManager's connected property",
2982+ "Set connected state", FALSE,
2983+ G_PARAM_READABLE);
2984+ g_object_class_install_property(gobject_class, PROP_CONNECTED, pspec);
2985+}
2986+
2987+static void connman_manager_init(ConnmanManager *self)
2988+{
2989+ ConnmanManagerPrivate *priv = GET_PRIVATE(self);
2990+
2991+ priv->connected = FALSE;
2992+ priv->initialised = FALSE;
2993+}
2994+
2995+ConnmanManager *connman_manager_new(void)
2996+{
2997+ return g_object_new(CONNMAN_TYPE_MANAGER, NULL);
2998+}
2999+
3000+/* mock functions */
3001+void connman_manager_mock_set_connected(ConnmanManager *self,
3002+ gboolean connected)
3003+{
3004+ ConnmanManagerPrivate *priv = GET_PRIVATE(self);
3005+
3006+ g_return_if_fail(CONNMAN_IS_MANAGER(self));
3007+ g_return_if_fail(priv != NULL);
3008+
3009+ priv->connected = connected;
3010+ g_object_notify(G_OBJECT(self), "connected");
3011+}
3012
3013=== added file 'tests/mock-connman-manager.h'
3014--- tests/mock-connman-manager.h 1970-01-01 00:00:00 +0000
3015+++ tests/mock-connman-manager.h 2010-11-26 12:12:27 +0000
3016@@ -0,0 +1,25 @@
3017+/*
3018+ * indicator-network - user interface for connman
3019+ *
3020+ * Copyright 2010 Canonical Ltd.
3021+ *
3022+ * Authors:
3023+ * Kalle Valo <kalle.valo@canonical.com>
3024+ *
3025+ * This program is free software: you can redistribute it and/or modify it
3026+ * under the terms of the GNU General Public License version 3, as published
3027+ * by the Free Software Foundation.
3028+ *
3029+ * This program is distributed in the hope that it will be useful, but
3030+ * WITHOUT ANY WARRANTY; without even the implied warranties of
3031+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
3032+ * PURPOSE. See the GNU General Public License for more details.
3033+ *
3034+ * You should have received a copy of the GNU General Public License along
3035+ * with this program. If not, see <http://www.gnu.org/licenses/>.
3036+ */
3037+
3038+#include "connman-manager.h"
3039+
3040+void connman_manager_mock_set_connected(ConnmanManager *self,
3041+ gboolean connected);
3042
3043=== added file 'tests/mock-connman-service.c'
3044--- tests/mock-connman-service.c 1970-01-01 00:00:00 +0000
3045+++ tests/mock-connman-service.c 2010-11-26 12:12:27 +0000
3046@@ -0,0 +1,558 @@
3047+/*
3048+ * indicator-network - user interface for connman
3049+ * Copyright 2010 Canonical Ltd.
3050+ *
3051+ * Authors:
3052+ * Kalle Valo <kalle.valo@canonical.com>
3053+ *
3054+ * This program is free software: you can redistribute it and/or modify it
3055+ * under the terms of the GNU General Public License version 3, as published
3056+ * by the Free Software Foundation.
3057+ *
3058+ * This program is distributed in the hope that it will be useful, but
3059+ * WITHOUT ANY WARRANTY; without even the implied warranties of
3060+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
3061+ * PURPOSE. See the GNU General Public License for more details.
3062+ *
3063+ * You should have received a copy of the GNU General Public License along
3064+ * with this program. If not, see <http://www.gnu.org/licenses/>.
3065+ */
3066+
3067+#include "connman-service.h"
3068+
3069+#include <glib/gi18n.h>
3070+
3071+#include "connman-service-xml.h"
3072+#include "connman.h"
3073+#include "marshal.h"
3074+
3075+G_DEFINE_TYPE(ConnmanService, connman_service, G_TYPE_OBJECT)
3076+
3077+#define GET_PRIVATE(o) \
3078+ (G_TYPE_INSTANCE_GET_PRIVATE((o), CONNMAN_TYPE_SERVICE, \
3079+ ConnmanServicePrivate))
3080+
3081+typedef struct _ConnmanServicePrivate ConnmanServicePrivate;
3082+
3083+struct _ConnmanServicePrivate {
3084+ gchar *path;
3085+ gboolean ready;
3086+
3087+ /* connman service properties */
3088+ ConnmanServiceState state;
3089+ gchar *error;
3090+ gchar *name;
3091+ ConnmanServiceType type;
3092+ ConnmanServiceSecurity security;
3093+ guint8 strength;
3094+ gboolean setup_required;
3095+};
3096+
3097+enum
3098+{
3099+ /* reserved */
3100+ PROP_0,
3101+
3102+ PROP_PATH,
3103+ PROP_READY,
3104+
3105+ PROP_STATE,
3106+ PROP_ERROR,
3107+ PROP_NAME,
3108+ PROP_TYPE,
3109+ PROP_SECURITY,
3110+ PROP_STRENGTH,
3111+ PROP_SETUP_REQUIRED,
3112+};
3113+
3114+#define SERVICE_NAME_UNKNOWN "<unnamed>"
3115+
3116+struct service_state_string
3117+{
3118+ const gchar *str;
3119+ ConnmanServiceState state;
3120+};
3121+
3122+static const struct service_state_string service_state_map[] = {
3123+ { "idle", CONNMAN_SERVICE_STATE_IDLE },
3124+ { "failure", CONNMAN_SERVICE_STATE_FAILURE },
3125+ { "association", CONNMAN_SERVICE_STATE_ASSOCIATION },
3126+ { "configuration", CONNMAN_SERVICE_STATE_CONFIGURATION },
3127+ { "ready", CONNMAN_SERVICE_STATE_READY },
3128+ { "login", CONNMAN_SERVICE_STATE_LOGIN },
3129+ { "online", CONNMAN_SERVICE_STATE_ONLINE },
3130+ { "disconnect", CONNMAN_SERVICE_STATE_DISCONNECT },
3131+};
3132+
3133+struct service_security_string
3134+{
3135+ const gchar *str;
3136+ ConnmanServiceSecurity security;
3137+};
3138+
3139+static const struct service_security_string service_security_map[] = {
3140+ { "none", CONNMAN_SERVICE_SECURITY_NONE },
3141+ { "wep", CONNMAN_SERVICE_SECURITY_WEP },
3142+ { "psk", CONNMAN_SERVICE_SECURITY_PSK },
3143+ { "wpa", CONNMAN_SERVICE_SECURITY_PSK },
3144+ { "rsn", CONNMAN_SERVICE_SECURITY_PSK },
3145+ { "ieee8021x", CONNMAN_SERVICE_SECURITY_IEEE8021X },
3146+};
3147+
3148+struct service_type_string
3149+{
3150+ const gchar *str;
3151+ ConnmanServiceType type;
3152+};
3153+
3154+static const struct service_type_string service_type_map[] = {
3155+ { "ethernet", CONNMAN_SERVICE_TYPE_ETHERNET },
3156+ { "wifi", CONNMAN_SERVICE_TYPE_WIFI },
3157+ { "bluetooth", CONNMAN_SERVICE_TYPE_BLUETOOTH },
3158+ { "cellular", CONNMAN_SERVICE_TYPE_CELLULAR },
3159+};
3160+
3161+struct service_mode_string
3162+{
3163+ const gchar *str;
3164+ ConnmanServiceMode mode;
3165+};
3166+
3167+static const struct service_mode_string service_mode_map[] = {
3168+ { "managed", CONNMAN_SERVICE_MODE_MANAGED },
3169+ { "adhoc", CONNMAN_SERVICE_MODE_ADHOC },
3170+};
3171+
3172+void connman_service_connect(ConnmanService *self,
3173+ GAsyncReadyCallback callback,
3174+ gpointer user_data)
3175+{
3176+}
3177+
3178+void connman_service_connect_finish(ConnmanService *self,
3179+ GAsyncResult *res,
3180+ GError **error)
3181+{
3182+}
3183+
3184+void connman_service_disconnect(ConnmanService *self,
3185+ GAsyncReadyCallback callback,
3186+ gpointer user_data)
3187+{
3188+}
3189+
3190+void connman_service_disconnect_finish(ConnmanService *self,
3191+ GAsyncResult *res,
3192+ GError **error)
3193+{
3194+}
3195+
3196+ConnmanServiceState connman_service_get_state(ConnmanService *self)
3197+{
3198+ ConnmanServicePrivate *priv = GET_PRIVATE(self);
3199+
3200+ return priv->state;
3201+}
3202+
3203+const gchar *connman_service_get_error(ConnmanService *self)
3204+{
3205+ ConnmanServicePrivate *priv = GET_PRIVATE(self);
3206+
3207+ return priv->error;
3208+}
3209+
3210+const gchar *connman_service_get_name(ConnmanService *self)
3211+{
3212+ ConnmanServicePrivate *priv = GET_PRIVATE(self);
3213+
3214+ return priv->name;
3215+}
3216+
3217+ConnmanServiceType connman_service_get_service_type(ConnmanService *self)
3218+{
3219+ ConnmanServicePrivate *priv = GET_PRIVATE(self);
3220+
3221+ return priv->type;
3222+}
3223+
3224+ConnmanServiceSecurity connman_service_get_security(ConnmanService *self)
3225+{
3226+ ConnmanServicePrivate *priv = GET_PRIVATE(self);
3227+
3228+ return priv->security;
3229+}
3230+
3231+guint8 connman_service_get_strength(ConnmanService *self)
3232+{
3233+ ConnmanServicePrivate *priv = GET_PRIVATE(self);
3234+
3235+ return priv->strength;
3236+}
3237+
3238+gboolean connman_service_is_setup_required(ConnmanService *self)
3239+{
3240+ ConnmanServicePrivate *priv = GET_PRIVATE(self);
3241+
3242+ return priv->setup_required;
3243+}
3244+
3245+const gchar *connman_service_get_path(ConnmanService *self)
3246+{
3247+ ConnmanServicePrivate *priv = GET_PRIVATE(self);
3248+
3249+ g_return_val_if_fail(CONNMAN_IS_SERVICE(self), NULL);
3250+ g_return_val_if_fail(priv != NULL, NULL);
3251+
3252+ return priv->path;
3253+}
3254+
3255+gboolean connman_service_is_ready(ConnmanService *self)
3256+{
3257+ ConnmanServicePrivate *priv = GET_PRIVATE(self);
3258+
3259+ g_return_val_if_fail(CONNMAN_IS_SERVICE(self), FALSE);
3260+ g_return_val_if_fail(priv != NULL, FALSE);
3261+
3262+ return priv->ready;
3263+}
3264+
3265+ConnmanServiceState connman_service_str2state(const gchar *state)
3266+{
3267+ const struct service_state_string *s;
3268+ guint i;
3269+
3270+ for (i = 0; i < G_N_ELEMENTS(service_state_map); i++) {
3271+ s = &service_state_map[i];
3272+ if (g_strcmp0(s->str, state) == 0)
3273+ return s->state;
3274+ }
3275+
3276+ g_warning("unknown service state %s", state);
3277+
3278+ return CONNMAN_SERVICE_STATE_IDLE;
3279+}
3280+
3281+const gchar *connman_service_state2str(ConnmanServiceState state)
3282+{
3283+ const struct service_state_string *s;
3284+ guint i;
3285+
3286+ for (i = 0; i < G_N_ELEMENTS(service_state_map); i++) {
3287+ s = &service_state_map[i];
3288+ if (s->state == state)
3289+ return s->str;
3290+ }
3291+
3292+ g_warning("%s(): unknown state %d", __func__, state);
3293+
3294+ return "unknown";
3295+}
3296+
3297+ConnmanServiceType connman_service_str2type(const gchar *type)
3298+{
3299+ const struct service_type_string *s;
3300+ guint i;
3301+
3302+ for (i = 0; i < G_N_ELEMENTS(service_type_map); i++) {
3303+ s = &service_type_map[i];
3304+ if (g_strcmp0(s->str, type) == 0)
3305+ return s->type;
3306+ }
3307+
3308+ g_warning("unknown service type %s", type);
3309+
3310+ return CONNMAN_SERVICE_TYPE_ETHERNET;
3311+}
3312+
3313+const gchar *connman_service_type2str(ConnmanServiceType type)
3314+{
3315+ const struct service_type_string *s;
3316+ guint i;
3317+
3318+ for (i = 0; i < G_N_ELEMENTS(service_type_map); i++) {
3319+ s = &service_type_map[i];
3320+ if (s->type == type)
3321+ return s->str;
3322+ }
3323+
3324+ g_warning("%s(): unknown type %d", __func__, type);
3325+
3326+ return "unknown";
3327+}
3328+
3329+ConnmanServiceSecurity connman_service_str2security(const gchar *security)
3330+{
3331+ const struct service_security_string *s;
3332+ guint i;
3333+
3334+ for (i = 0; i < G_N_ELEMENTS(service_security_map); i++) {
3335+ s = &service_security_map[i];
3336+ if (g_strcmp0(s->str, security) == 0)
3337+ return s->security;
3338+ }
3339+
3340+ g_warning("unknown service security %s", security);
3341+
3342+ return CONNMAN_SERVICE_SECURITY_NONE;
3343+}
3344+
3345+const gchar *connman_service_security2str(ConnmanServiceSecurity security)
3346+{
3347+ const struct service_security_string *s;
3348+ guint i;
3349+
3350+ for (i = 0; i < G_N_ELEMENTS(service_security_map); i++) {
3351+ s = &service_security_map[i];
3352+ if (s->security == security)
3353+ return s->str;
3354+ }
3355+
3356+ g_warning("%s(): unknown security %d", __func__, security);
3357+
3358+ return "unknown";
3359+}
3360+
3361+ConnmanServiceMode connman_service_str2mode(const gchar *mode)
3362+{
3363+ const struct service_mode_string *s;
3364+ guint i;
3365+
3366+ for (i = 0; i < G_N_ELEMENTS(service_mode_map); i++) {
3367+ s = &service_mode_map[i];
3368+ if (g_strcmp0(s->str, mode) == 0)
3369+ return s->mode;
3370+ }
3371+
3372+ g_warning("unknown service mode %s", mode);
3373+
3374+ return CONNMAN_SERVICE_MODE_MANAGED;
3375+}
3376+
3377+const gchar *connman_service_mode2str(ConnmanServiceMode mode)
3378+{
3379+ const struct service_mode_string *s;
3380+ guint i;
3381+
3382+ for (i = 0; i < G_N_ELEMENTS(service_mode_map); i++) {
3383+ s = &service_mode_map[i];
3384+ if (s->mode == mode)
3385+ return s->str;
3386+ }
3387+
3388+ g_warning("%s(): unknown mode %d", __func__, mode);
3389+
3390+ return "unknown";
3391+}
3392+
3393+static void connman_service_set_property(GObject *object, guint property_id,
3394+ const GValue *value,
3395+ GParamSpec *pspec)
3396+{
3397+ ConnmanService *self = CONNMAN_SERVICE(object);
3398+ ConnmanServicePrivate *priv = GET_PRIVATE(self);
3399+
3400+ g_return_if_fail(priv != NULL);
3401+
3402+ switch(property_id) {
3403+ case PROP_PATH:
3404+ g_free(priv->path);
3405+ priv->path = g_value_dup_string(value);
3406+ break;
3407+ case PROP_READY:
3408+ priv->ready = g_value_get_boolean(value);
3409+ break;
3410+ case PROP_STATE:
3411+ priv->state = g_value_get_uint(value);
3412+ break;
3413+ case PROP_ERROR:
3414+ g_free(priv->error);
3415+ priv->error = g_value_dup_string(value);
3416+ break;
3417+ case PROP_NAME:
3418+ g_free(priv->name);
3419+ priv->name = g_value_dup_string(value);
3420+ break;
3421+ case PROP_TYPE:
3422+ priv->type = g_value_get_uint(value);
3423+ break;
3424+ case PROP_SECURITY:
3425+ priv->security = g_value_get_uint(value);
3426+ break;
3427+ case PROP_STRENGTH:
3428+ priv->strength = g_value_get_uchar(value);
3429+ break;
3430+ case PROP_SETUP_REQUIRED:
3431+ priv->setup_required = g_value_get_boolean(value);
3432+ break;
3433+ default:
3434+ /* We don't have any other property... */
3435+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
3436+ break;
3437+ }
3438+}
3439+
3440+static void connman_service_get_property(GObject *object, guint property_id,
3441+ GValue *value, GParamSpec *pspec)
3442+{
3443+ ConnmanService *self = CONNMAN_SERVICE(object);
3444+ ConnmanServicePrivate *priv = GET_PRIVATE(self);
3445+
3446+ g_return_if_fail(priv != NULL);
3447+
3448+ switch(property_id) {
3449+ case PROP_PATH:
3450+ g_value_set_string(value, priv->path);
3451+ break;
3452+ case PROP_READY:
3453+ g_value_set_boolean(value, priv->ready);
3454+ break;
3455+ case PROP_STATE:
3456+ g_value_set_uint(value, priv->state);
3457+ break;
3458+ case PROP_ERROR:
3459+ g_value_set_string(value, priv->error);
3460+ break;
3461+ case PROP_NAME:
3462+ g_value_set_string(value, priv->name);
3463+ break;
3464+ case PROP_TYPE:
3465+ g_value_set_uint(value, priv->type);
3466+ break;
3467+ case PROP_SECURITY:
3468+ g_value_set_uint(value, priv->security);
3469+ break;
3470+ case PROP_STRENGTH:
3471+ g_value_set_uchar(value, priv->strength);
3472+ break;
3473+ case PROP_SETUP_REQUIRED:
3474+ g_value_set_boolean(value, priv->setup_required);
3475+ break;
3476+ default:
3477+ /* We don't have any other property... */
3478+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
3479+ break;
3480+ }
3481+}
3482+
3483+static void connman_service_dispose(GObject *object)
3484+{
3485+ ConnmanService *self = CONNMAN_SERVICE(object);
3486+ ConnmanServicePrivate *priv = GET_PRIVATE(self);
3487+
3488+ G_OBJECT_CLASS(connman_service_parent_class)->dispose(object);
3489+
3490+ if (priv->path != NULL) {
3491+ g_free(priv->path);
3492+ priv->path = NULL;
3493+ }
3494+
3495+ if (priv->error != NULL) {
3496+ g_free(priv->error);
3497+ priv->error = NULL;
3498+ }
3499+
3500+ if (priv->name != NULL) {
3501+ g_free(priv->name);
3502+ priv->name = NULL;
3503+ }
3504+}
3505+
3506+static void connman_service_finalize(GObject *object)
3507+{
3508+ G_OBJECT_CLASS(connman_service_parent_class)->finalize(object);
3509+}
3510+
3511+static void connman_service_class_init(ConnmanServiceClass *klass)
3512+{
3513+ GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
3514+ GParamSpec *pspec;
3515+
3516+ g_type_class_add_private(klass, sizeof(ConnmanServicePrivate));
3517+
3518+ gobject_class->dispose = connman_service_dispose;
3519+ gobject_class->finalize = connman_service_finalize;
3520+ gobject_class->set_property = connman_service_set_property;
3521+ gobject_class->get_property = connman_service_get_property;
3522+
3523+ pspec = g_param_spec_string("path",
3524+ "ConnmanService's DBus path",
3525+ "Set DBus path for the service",
3526+ NULL,
3527+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
3528+ g_object_class_install_property(gobject_class, PROP_PATH, pspec);
3529+
3530+ pspec = g_param_spec_boolean("ready",
3531+ "ConnmanService's ready property",
3532+ "Informs when object is ready for use",
3533+ FALSE,
3534+ G_PARAM_READABLE);
3535+ g_object_class_install_property(gobject_class, PROP_READY, pspec);
3536+
3537+ pspec = g_param_spec_uint("state",
3538+ "ConnmanService's state property",
3539+ "The state of the service",
3540+ 0, G_MAXUINT,
3541+ CONNMAN_SERVICE_STATE_IDLE,
3542+ G_PARAM_READABLE);
3543+ g_object_class_install_property(gobject_class, PROP_STATE, pspec);
3544+
3545+ pspec = g_param_spec_string("error",
3546+ "ConnmanService's error property",
3547+ "Last error code",
3548+ NULL,
3549+ G_PARAM_READABLE);
3550+ g_object_class_install_property(gobject_class, PROP_ERROR, pspec);
3551+
3552+ pspec = g_param_spec_string("name",
3553+ "ConnmanService's name property",
3554+ "Name of the service",
3555+ SERVICE_NAME_UNKNOWN,
3556+ G_PARAM_READABLE);
3557+ g_object_class_install_property(gobject_class, PROP_NAME, pspec);
3558+
3559+ pspec = g_param_spec_uint("type",
3560+ "ConnmanService's type property",
3561+ "Type of the service",
3562+ 0, G_MAXUINT,
3563+ CONNMAN_SERVICE_TYPE_ETHERNET,
3564+ G_PARAM_READABLE);
3565+ g_object_class_install_property(gobject_class, PROP_TYPE, pspec);
3566+
3567+ pspec = g_param_spec_uint("security",
3568+ "ConnmanService's security property",
3569+ "Security type of the service",
3570+ 0, G_MAXUINT,
3571+ CONNMAN_SERVICE_SECURITY_NONE,
3572+ G_PARAM_READABLE);
3573+ g_object_class_install_property(gobject_class, PROP_SECURITY, pspec);
3574+
3575+ pspec = g_param_spec_uint("strength",
3576+ "ConnmanService's strength property",
3577+ "Current signal strength of the service",
3578+ 0, G_MAXUINT8,
3579+ 0,
3580+ G_PARAM_READABLE);
3581+ g_object_class_install_property(gobject_class, PROP_SECURITY, pspec);
3582+
3583+ pspec = g_param_spec_boolean("setup-required",
3584+ "ConnmanService's setup-required property",
3585+ "Is user configuration needed, eg APN",
3586+ FALSE,
3587+ G_PARAM_READABLE);
3588+ g_object_class_install_property(gobject_class, PROP_SETUP_REQUIRED, pspec);
3589+}
3590+
3591+static void connman_service_init(ConnmanService *self)
3592+{
3593+}
3594+
3595+ConnmanService *connman_service_new(const gchar *path)
3596+{
3597+ ConnmanService *self;
3598+
3599+ g_return_val_if_fail(path != NULL, NULL);
3600+
3601+ self = g_object_new(CONNMAN_TYPE_SERVICE, "path", path, NULL);
3602+
3603+ return self;
3604+}
3605
3606=== modified file 'tests/mock-manager.c'
3607--- tests/mock-manager.c 2010-11-05 12:49:36 +0000
3608+++ tests/mock-manager.c 2010-11-26 12:12:27 +0000
3609@@ -49,7 +49,7 @@
3610 struct service_state_string
3611 {
3612 const gchar *str;
3613- ServiceState state;
3614+ ConnmanServiceState state;
3615 };
3616
3617 static void manager_dispose(GObject *object)
3618@@ -89,7 +89,7 @@
3619 {
3620 }
3621
3622-const gchar *manager_icon_name(const gchar *technology, gint signal)
3623+const gchar *manager_icon_name(ConnmanServiceType type, gint signal)
3624 {
3625 return ICON_CONNECTED_DEFAULT;
3626 }
3627@@ -107,12 +107,12 @@
3628 {
3629 }
3630
3631-DBusGProxy *manager_get_agent(Manager *self)
3632+UIProxy *manager_get_ui(Manager *self)
3633 {
3634 return NULL;
3635 }
3636
3637-DBusGProxy *manager_get_connman(Manager *self)
3638+ConnmanManager *manager_get_connman(Manager *self)
3639 {
3640 return NULL;
3641 }
3642
3643=== modified file 'tests/mock-service-manager.c'
3644--- tests/mock-service-manager.c 2010-11-05 12:49:36 +0000
3645+++ tests/mock-service-manager.c 2010-11-26 12:12:27 +0000
3646@@ -111,7 +111,8 @@
3647 {
3648 }
3649
3650-void service_manager_update(ServiceManager *self, GValue *value)
3651+void service_manager_update_services(ServiceManager *self,
3652+ ConnmanService **services)
3653 {
3654 }
3655
3656@@ -145,9 +146,9 @@
3657 return 0;
3658 }
3659
3660-const gchar *service_manager_get_default_technology(ServiceManager *self)
3661+ConnmanServiceType service_manager_get_default_technology(ServiceManager *self)
3662 {
3663- return NULL;
3664+ return CONNMAN_SERVICE_TYPE_ETHERNET;
3665 }
3666
3667 Service *service_manager_get_default_service(ServiceManager *self)
3668
3669=== modified file 'tests/mock-service.c'
3670--- tests/mock-service.c 2010-10-05 14:42:29 +0000
3671+++ tests/mock-service.c 2010-11-26 12:12:27 +0000
3672@@ -20,7 +20,7 @@
3673
3674 #include "service.h"
3675
3676-Service *service_new(const gchar *path, Manager *ns)
3677+Service *service_new(ConnmanService *service, Manager *ns)
3678 {
3679 return NULL;
3680 }
3681@@ -30,12 +30,12 @@
3682 return "";
3683 }
3684
3685-const gchar *service_get_tech(Service *self)
3686+ConnmanServiceType service_get_service_type(Service *self)
3687 {
3688- return "";
3689+ return CONNMAN_SERVICE_TYPE_ETHERNET;
3690 }
3691
3692-ServiceState service_get_state(Service *self)
3693+ConnmanServiceState service_get_state(Service *self)
3694 {
3695 return 0;
3696 }
3697
3698=== added file 'tests/mock-ui-proxy.c'
3699--- tests/mock-ui-proxy.c 1970-01-01 00:00:00 +0000
3700+++ tests/mock-ui-proxy.c 2010-11-26 12:12:27 +0000
3701@@ -0,0 +1,159 @@
3702+/*
3703+ * indicator-network - user interface for connman
3704+ * Copyright 2010 Canonical Ltd.
3705+ *
3706+ * Authors:
3707+ * Kalle Valo <kalle.valo@canonical.com>
3708+ *
3709+ * This program is free software: you can redistribute it and/or modify it
3710+ * under the terms of the GNU General Public License version 3, as published
3711+ * by the Free Software Foundation.
3712+ *
3713+ * This program is distributed in the hope that it will be useful, but
3714+ * WITHOUT ANY WARRANTY; without even the implied warranties of
3715+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
3716+ * PURPOSE. See the GNU General Public License for more details.
3717+ *
3718+ * You should have received a copy of the GNU General Public License along
3719+ * with this program. If not, see <http://www.gnu.org/licenses/>.
3720+ */
3721+
3722+#include "ui-proxy.h"
3723+
3724+#include "indicator-network-agent-xml.h"
3725+#include "dbus-shared-names.h"
3726+
3727+G_DEFINE_TYPE(UIProxy, ui_proxy, G_TYPE_OBJECT)
3728+
3729+#define GET_PRIVATE(o) \
3730+ (G_TYPE_INSTANCE_GET_PRIVATE((o), TYPE_UI_PROXY, \
3731+ UIProxyPrivate))
3732+
3733+typedef struct _UIProxyPrivate UIProxyPrivate;
3734+
3735+struct _UIProxyPrivate {
3736+ gboolean connected;
3737+};
3738+
3739+enum
3740+{
3741+ /* reserved */
3742+ PROP_0,
3743+
3744+ PROP_CONNECTED,
3745+};
3746+
3747+void ui_proxy_start(UIProxy *self)
3748+{
3749+}
3750+
3751+void ui_proxy_stop(UIProxy *self)
3752+{
3753+}
3754+
3755+void ui_proxy_show_connect_error(UIProxy *self, const gchar *error_id)
3756+{
3757+}
3758+
3759+void ui_proxy_show_wireless_connect(UIProxy *self)
3760+{
3761+}
3762+
3763+void ui_proxy_set_debug(UIProxy *self, guint level)
3764+{
3765+}
3766+
3767+void ui_proxy_ask_pin(UIProxy *self, const gchar *type,
3768+ GCancellable *cancellable, GAsyncReadyCallback callback,
3769+ gpointer user_data)
3770+{
3771+}
3772+
3773+gchar *ui_proxy_ask_pin_finish(UIProxy *self, GAsyncResult *res, GError **error)
3774+{
3775+ return "1234";
3776+}
3777+
3778+gboolean ui_proxy_is_connected(UIProxy *self)
3779+{
3780+ UIProxyPrivate *priv = GET_PRIVATE(self);
3781+
3782+ return priv->connected;
3783+}
3784+
3785+static void ui_proxy_set_property(GObject *object, guint property_id,
3786+ const GValue *value, GParamSpec *pspec)
3787+{
3788+ UIProxy *self = UI_PROXY(object);
3789+ UIProxyPrivate *priv = GET_PRIVATE(self);
3790+
3791+ g_return_if_fail(priv != NULL);
3792+
3793+ switch(property_id) {
3794+ case PROP_CONNECTED:
3795+ priv->connected = g_value_get_boolean(value);
3796+ break;
3797+ default:
3798+ /* We don't have any other property... */
3799+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
3800+ break;
3801+ }
3802+}
3803+
3804+static void ui_proxy_get_property(GObject *object, guint property_id,
3805+ GValue *value, GParamSpec *pspec)
3806+{
3807+ UIProxy *self = UI_PROXY(object);
3808+ UIProxyPrivate *priv = GET_PRIVATE(self);
3809+
3810+ g_return_if_fail(priv != NULL);
3811+
3812+ switch(property_id) {
3813+ case PROP_CONNECTED:
3814+ g_value_set_boolean(value, priv->connected);
3815+ break;
3816+ default:
3817+ /* We don't have any other property... */
3818+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
3819+ break;
3820+ }
3821+}
3822+
3823+static void ui_proxy_dispose(GObject *object)
3824+{
3825+ G_OBJECT_CLASS(ui_proxy_parent_class)->dispose(object);
3826+}
3827+
3828+static void ui_proxy_finalize(GObject *object)
3829+{
3830+ G_OBJECT_CLASS(ui_proxy_parent_class)->finalize(object);
3831+}
3832+
3833+static void ui_proxy_class_init(UIProxyClass *klass)
3834+{
3835+ GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
3836+ GParamSpec *pspec;
3837+
3838+ g_type_class_add_private(klass, sizeof(UIProxyPrivate));
3839+
3840+ gobject_class->dispose = ui_proxy_dispose;
3841+ gobject_class->finalize = ui_proxy_finalize;
3842+ gobject_class->set_property = ui_proxy_set_property;
3843+ gobject_class->get_property = ui_proxy_get_property;
3844+
3845+ pspec = g_param_spec_boolean("connected",
3846+ "UiProxy's connected property",
3847+ "Informs when object is connected for use",
3848+ FALSE,
3849+ G_PARAM_READABLE);
3850+ g_object_class_install_property(gobject_class, PROP_CONNECTED, pspec);
3851+}
3852+
3853+static void ui_proxy_init(UIProxy *self)
3854+{
3855+}
3856+
3857+UIProxy *ui_proxy_new(void)
3858+{
3859+ return g_object_new(TYPE_UI_PROXY, NULL);
3860+}
3861
3862=== modified file 'tests/test-manager.c'
3863--- tests/test-manager.c 2010-10-07 07:56:49 +0000
3864+++ tests/test-manager.c 2010-11-26 12:12:27 +0000
3865@@ -24,6 +24,7 @@
3866 #include "manager.h"
3867 #include "mock-dbus-gproxy.h"
3868 #include "mock-network-menu.h"
3869+#include "mock-connman-manager.h"
3870
3871 #define DOMAIN "/Network/Backend/Manager"
3872
3873@@ -32,12 +33,16 @@
3874 static void test_new(void)
3875 {
3876 DBusGConnection *fake_connection = (DBusGConnection *) 0x1;
3877+ ConnmanManager *connman;
3878 NetworkMenu *menu;
3879
3880 sm = manager_new(fake_connection);
3881
3882 g_assert(sm != NULL);
3883
3884+ connman = manager_get_connman(sm);
3885+ connman_manager_mock_set_connected(connman, TRUE);
3886+
3887 while (g_main_context_iteration(NULL, FALSE));
3888
3889 menu = network_menu_mock_get_object();
3890@@ -47,10 +52,11 @@
3891
3892 static void test_destroyed_signal(void)
3893 {
3894- DBusGProxy *proxy = dbus_g_proxy_mock_get_object();
3895+ ConnmanManager *connman;
3896 NetworkMenu *menu;
3897
3898- dbus_g_proxy_mock_emit_destroyed(proxy);
3899+ connman = manager_get_connman(sm);
3900+ connman_manager_mock_set_connected(connman, FALSE);
3901
3902 while (g_main_context_iteration(NULL, FALSE));
3903
3904
3905=== modified file 'tests/test-network-menu.c'
3906--- tests/test-network-menu.c 2010-10-05 11:53:00 +0000
3907+++ tests/test-network-menu.c 2010-11-26 12:12:27 +0000
3908@@ -27,7 +27,7 @@
3909
3910 /* stubs */
3911
3912-Service *service_new(const gchar *path, Manager *ns)
3913+Service *service_new(ConnmanService *service, Manager *ns)
3914 {
3915 return NULL;
3916 }
3917@@ -37,12 +37,12 @@
3918 return "";
3919 }
3920
3921-const gchar *service_get_tech(Service *self)
3922+ConnmanServiceType service_get_service_type(Service *self)
3923 {
3924- return "";
3925+ return CONNMAN_SERVICE_TYPE_ETHERNET;
3926 }
3927
3928-ServiceState service_get_state(Service *self)
3929+ConnmanServiceState service_get_state(Service *self)
3930 {
3931 return 0;
3932 }
3933@@ -52,12 +52,6 @@
3934 return 0;
3935 }
3936
3937-void dbus_g_type_collection_value_iterate(const GValue *value,
3938- DBusGTypeSpecializedCollectionIterator iterator,
3939- gpointer user_data)
3940-{
3941-}
3942-
3943 /* tests */
3944
3945 static NetworkMenu *menu;
3946
3947=== modified file 'tests/test-service-manager.c'
3948--- tests/test-service-manager.c 2010-10-05 14:42:29 +0000
3949+++ tests/test-service-manager.c 2010-11-26 12:12:27 +0000
3950@@ -49,7 +49,6 @@
3951 {
3952 g_assert_cmpuint(service_manager_get_strength(sm), ==, 0);
3953 g_assert(service_manager_get_default_service(sm) == NULL);
3954- g_assert_cmpstr(service_manager_get_default_technology(sm), ==, "");
3955 g_assert(service_manager_get_connected(sm) == FALSE);
3956 g_assert(service_manager_is_connecting(sm) == FALSE);
3957
3958
3959=== modified file 'tests/test-service.c'
3960--- tests/test-service.c 2010-10-05 11:41:18 +0000
3961+++ tests/test-service.c 2010-11-26 12:12:27 +0000
3962@@ -37,7 +37,10 @@
3963
3964 static void test_new()
3965 {
3966- service = service_new(SERVICE_PATH_FOO, NULL);
3967+ ConnmanService *cs = connman_service_new("/foo");
3968+ Manager *m = manager_new(NULL);
3969+
3970+ service = service_new(cs, m);
3971
3972 g_assert(service != NULL);
3973 g_assert(IS_SERVICE(service));
3974@@ -45,22 +48,6 @@
3975 g_assert_cmpstr(service_get_path(service), ==, SERVICE_PATH_FOO);
3976 }
3977
3978-static void test_name_update()
3979-{
3980- DBusGProxy *proxy;
3981- GValue v = { 0 };
3982-
3983- proxy = dbus_g_proxy_mock_get_object();
3984- g_assert(proxy != NULL);
3985-
3986- g_value_init(&v, G_TYPE_STRING);
3987- g_value_set_string(&v, SERVICE_NAME_FOOBAR);
3988-
3989- dbus_g_proxy_mock_emit_property_changed(proxy, CONNMAN_PROPERTY_NAME, &v);
3990-
3991- g_assert_cmpstr(service_get_name(service), ==, SERVICE_NAME_FOOBAR);
3992-}
3993-
3994 gint main (gint argc, gchar *argv[])
3995 {
3996 g_type_init();
3997@@ -68,7 +55,6 @@
3998 g_test_init(&argc, &argv, NULL);
3999
4000 g_test_add_func(DOMAIN "/New", test_new);
4001- g_test_add_func(DOMAIN "/NameUpdate", test_name_update);
4002
4003 return g_test_run();
4004 }

Subscribers

People subscribed via source and target branches