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

Proposed by Kalle Valo on 2010-12-03
Status: Merged
Merged at revision: 114
Proposed branch: lp:~kvalo/indicator-network/libconnman-sort-services
Merge into: lp:~indicator-applet-developers/indicator-network/indicator-network
Diff against target: 170 lines (+132/-1)
2 files modified
src/backend/service-manager.c (+121/-1)
tests/mock-service.c (+11/-0)
To merge this branch: bzr merge lp:~kvalo/indicator-network/libconnman-sort-services
Reviewer Review Type Date Requested Status
Conor Curran (community) 2010-12-03 Approve on 2010-12-03
Review via email: mp+42611@code.launchpad.net
To post a comment you must log in.
Conor Curran (cjcurran) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/backend/service-manager.c'
2--- src/backend/service-manager.c 2010-12-03 09:39:02 +0000
3+++ src/backend/service-manager.c 2010-12-03 11:58:18 +0000
4@@ -160,11 +160,130 @@
5 priv->services = NULL;
6 }
7
8+/*
9+ * Beginnings of proper sorting of services. Needs a lot more work, for example
10+ * need to give more priority for favourite services
11+ */
12+static gint cmp_services(gconstpointer a, gconstpointer b)
13+{
14+ Service *a_service, *b_service;
15+ ConnmanServiceType a_type, b_type;
16+ gboolean a_connected, b_connected;
17+ guint a_strength, b_strength;
18+
19+ a_service = SERVICE(a);
20+ b_service = SERVICE(b);
21+
22+ a_type = service_get_service_type(a_service);
23+ b_type = service_get_service_type(b_service);
24+
25+ if (service_get_state(a_service) == CONNMAN_SERVICE_STATE_READY ||
26+ service_get_state(a_service) == CONNMAN_SERVICE_STATE_ONLINE)
27+ a_connected = TRUE;
28+ else
29+ a_connected = FALSE;
30+
31+ if (service_get_state(b_service) == CONNMAN_SERVICE_STATE_READY ||
32+ service_get_state(b_service) == CONNMAN_SERVICE_STATE_ONLINE)
33+ b_connected = TRUE;
34+ else
35+ b_connected = FALSE;
36+
37+ a_strength = service_get_strength(a_service);
38+ b_strength = service_get_strength(b_service);
39+
40+ /* ethernet */
41+
42+ if (a_type == CONNMAN_SERVICE_TYPE_ETHERNET &&
43+ b_type == CONNMAN_SERVICE_TYPE_ETHERNET)
44+ return 0;
45+
46+ if (a_type == CONNMAN_SERVICE_TYPE_ETHERNET &&
47+ b_type == CONNMAN_SERVICE_TYPE_WIFI)
48+ return -1;
49+
50+ if (a_type == CONNMAN_SERVICE_TYPE_ETHERNET &&
51+ b_type == CONNMAN_SERVICE_TYPE_BLUETOOTH)
52+ return -1;
53+
54+ if (a_type == CONNMAN_SERVICE_TYPE_ETHERNET &&
55+ b_type == CONNMAN_SERVICE_TYPE_CELLULAR)
56+ return -1;
57+
58+ /* wifi */
59+
60+ if (a_type == CONNMAN_SERVICE_TYPE_WIFI &&
61+ b_type == CONNMAN_SERVICE_TYPE_ETHERNET)
62+ return 1;
63+
64+ if (a_type == CONNMAN_SERVICE_TYPE_WIFI &&
65+ b_type == CONNMAN_SERVICE_TYPE_WIFI) {
66+ if (a_connected && !b_connected)
67+ return -1;
68+ else if (!a_connected && b_connected)
69+ return 1;
70+ else
71+ return b_strength - a_strength;
72+ }
73+
74+ if (a_type == CONNMAN_SERVICE_TYPE_WIFI &&
75+ b_type == CONNMAN_SERVICE_TYPE_BLUETOOTH)
76+ return -1;
77+
78+ if (a_type == CONNMAN_SERVICE_TYPE_WIFI &&
79+ b_type == CONNMAN_SERVICE_TYPE_CELLULAR)
80+ return -1;
81+
82+ /* bluetooth */
83+
84+ if (a_type == CONNMAN_SERVICE_TYPE_BLUETOOTH &&
85+ b_type == CONNMAN_SERVICE_TYPE_ETHERNET)
86+ return 1;
87+
88+ if (a_type == CONNMAN_SERVICE_TYPE_BLUETOOTH &&
89+ b_type == CONNMAN_SERVICE_TYPE_WIFI)
90+ return 1;
91+
92+ if (a_type == CONNMAN_SERVICE_TYPE_BLUETOOTH &&
93+ b_type == CONNMAN_SERVICE_TYPE_BLUETOOTH)
94+ return 0;
95+
96+ if (a_type == CONNMAN_SERVICE_TYPE_BLUETOOTH &&
97+ b_type == CONNMAN_SERVICE_TYPE_CELLULAR)
98+ return 1;
99+
100+ /* cellular */
101+
102+ if (a_type == CONNMAN_SERVICE_TYPE_CELLULAR &&
103+ b_type == CONNMAN_SERVICE_TYPE_ETHERNET)
104+ return 1;
105+
106+ if (a_type == CONNMAN_SERVICE_TYPE_CELLULAR &&
107+ b_type == CONNMAN_SERVICE_TYPE_WIFI)
108+ return 1;
109+
110+ if (a_type == CONNMAN_SERVICE_TYPE_CELLULAR &&
111+ b_type == CONNMAN_SERVICE_TYPE_BLUETOOTH)
112+ return -1;
113+
114+ if (a_type == CONNMAN_SERVICE_TYPE_CELLULAR &&
115+ b_type == CONNMAN_SERVICE_TYPE_CELLULAR)
116+ return b_strength - a_strength;
117+
118+ return 0;
119+}
120+
121 static void service_state_changed(Service *service, gpointer user_data)
122 {
123 ServiceManager *self = SERVICE_MANAGER(user_data);
124+ ServiceManagerPrivate *priv = GET_PRIVATE(self);
125
126 g_signal_emit(self, signals[STATE_CHANGED], 0);
127+
128+ /* services need to be sorted again due to the state change */
129+ priv->services = g_list_sort(priv->services, cmp_services);
130+
131+ g_signal_emit(self, signals[SERVICES_UPDATED], 0);
132 }
133
134 static void service_strength_updated(Service *service, gpointer user_data)
135@@ -209,7 +328,8 @@
136 if (service == NULL)
137 continue;
138
139- priv->services = g_list_append(priv->services, service);
140+ priv->services = g_list_insert_sorted(priv->services, service,
141+ cmp_services);
142 }
143
144 g_debug("services updated (total %d, new %d, removed %d)",
145
146=== modified file 'tests/mock-service.c'
147--- tests/mock-service.c 2010-11-24 12:35:47 +0000
148+++ tests/mock-service.c 2010-12-03 11:58:18 +0000
149@@ -20,6 +20,9 @@
150
151 #include "service.h"
152
153+/* FIXME: should derive from DBUSMENU_TYPE_MENUITEM */
154+G_DEFINE_TYPE(Service, service, G_TYPE_OBJECT)
155+
156 Service *service_new(ConnmanService *service, Manager *ns)
157 {
158 return NULL;
159@@ -44,3 +47,11 @@
160 {
161 return 0;
162 }
163+
164+static void service_class_init(ServiceClass *klass)
165+{
166+}
167+
168+static void service_init(Service *self)
169+{
170+}

Subscribers

People subscribed via source and target branches