e_nms_connection_get_settings()
[framework/uifw/edbus.git] / src / lib / nm / e_nm.c
1 #include "E_Nm.h"
2 #include "e_nm_private.h"
3
4 #include <string.h>
5
6 static Property properties[] = {
7   { .name = "WirelessEnabled", .sig = "b", .offset = offsetof(E_NM, wireless_enabled) },
8   { .name = "WirelessHardwareEnabled", .sig = "b", .offset = offsetof(E_NM, wireless_hardware_enabled) },
9   { .name = "ActiveConnections", .sig = "ao", .offset = offsetof(E_NM, active_connections) },
10   { .name = "State", .sig = "u", .offset = offsetof(E_NM, state) },
11   { .name = NULL }
12 };
13  
14 static void
15 cb_state_changed(void *data, DBusMessage *msg)
16 {
17   E_NM_Internal *nmi;
18   unsigned int   state;
19   DBusError      err;
20   if (!msg || !data) return;
21
22   nmi = data;
23   dbus_error_init(&err);
24   dbus_message_get_args(msg, &err, DBUS_TYPE_UINT32, &state, DBUS_TYPE_INVALID);
25   if (dbus_error_is_set(&err))
26   {
27     printf("Error: %s - %s\n", err.name, err.message);
28     return;
29   }
30
31   nmi->nm.state = state;
32   if (nmi->state_changed)
33     nmi->state_changed(&(nmi->nm), state);
34 }
35
36 static void
37 cb_properties_changed(void *data, DBusMessage *msg)
38 {
39   E_NM_Internal *nmi;
40   if (!msg || !data) return;
41
42   nmi = data;
43   parse_properties(nmi, properties, msg);
44
45   if (nmi->properties_changed)
46     nmi->properties_changed(&(nmi->nm));
47 }
48
49 static void
50 cb_device_added(void *data, DBusMessage *msg)
51 {
52   E_NM_Internal *nmi;
53   const char *device;
54   DBusError err;
55   if (!msg || !data) return;
56
57   nmi = data;
58   dbus_error_init(&err);
59   dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &device, DBUS_TYPE_INVALID);
60   if (dbus_error_is_set(&err))
61   {
62     printf("Error: %s - %s\n", err.name, err.message);
63     return;
64   }
65
66   if (nmi->device_added)
67     nmi->device_added(&(nmi->nm), device);
68 }
69
70 static void
71 cb_device_removed(void *data, DBusMessage *msg)
72 {
73   E_NM_Internal *nmi;
74   const char *device;
75   DBusError err;
76   if (!msg || !data) return;
77
78   nmi = data;
79   dbus_error_init(&err);
80   dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &device, DBUS_TYPE_INVALID);
81   if (dbus_error_is_set(&err))
82   {
83     printf("Error: %s - %s\n", err.name, err.message);
84     return;
85   }
86
87   if (nmi->device_removed)
88     nmi->device_removed(&(nmi->nm), device);
89 }
90
91 EAPI int
92 e_nm_get(int (*cb_func)(void *data, E_NM *nm), void *data)
93 {
94   E_NM_Internal *nmi = NULL;
95   Property_Data *d = NULL;
96
97   nmi = calloc(1, sizeof(E_NM_Internal));
98   if (!nmi) goto error;
99   d = calloc(1, sizeof(Property_Data));
100   if (!d) goto error;
101   d->nmi = nmi;
102   d->cb_func = OBJECT_CB(cb_func);
103   d->data = data;
104   d->property = properties;
105   d->object = strdup(E_NM_PATH);
106   d->reply = nmi;
107
108   nmi->conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
109   if (!nmi->conn) goto error;
110   nmi->handlers = ecore_list_new();
111   ecore_list_append(nmi->handlers, e_nm_signal_handler_add(nmi->conn, "StateChanged", cb_state_changed, nmi));
112   ecore_list_append(nmi->handlers, e_nm_signal_handler_add(nmi->conn, "PropertiesChanged", cb_properties_changed, nmi));
113   ecore_list_append(nmi->handlers, e_nm_signal_handler_add(nmi->conn, "DeviceAdded", cb_device_added, nmi));
114   ecore_list_append(nmi->handlers, e_nm_signal_handler_add(nmi->conn, "DeviceRemoved", cb_device_removed, nmi));
115
116   return e_nm_device_properties_get(nmi->conn, d->object, d->property->name, property, d) ? 1 : 0;
117
118 error:
119   if (d) free(d);
120   if (nmi) free(nmi);
121   return 0;
122 }
123
124 EAPI void
125 e_nm_free(E_NM *nm)
126 {
127   E_NM_Internal *nmi;
128
129   if (!nm) return;
130   nmi = (E_NM_Internal *)nm;
131   if (nmi->nm.active_connections) ecore_list_destroy(nmi->nm.active_connections);
132   if (nmi->handlers)
133   {
134     E_DBus_Signal_Handler *sh;
135
136     while ((sh = ecore_list_first_remove(nmi->handlers)))
137       e_dbus_signal_handler_del(nmi->conn, sh);
138     ecore_list_destroy(nmi->handlers);
139   }
140   e_dbus_connection_close(nmi->conn);
141   free(nmi);
142 }
143
144 EAPI void
145 e_nm_dump(E_NM *nm)
146 {
147   const char *conn;
148
149   if (!nm) return;
150   printf("E_NM:\n");
151   printf("wireless_enabled         : %d\n", nm->wireless_enabled);
152   printf("wireless_hardware_enabled: %d\n", nm->wireless_hardware_enabled);
153   printf("active_connections       :\n");
154   if (nm->active_connections)
155   {
156     ecore_list_first_goto(nm->active_connections);
157     while ((conn = ecore_list_next(nm->active_connections)))
158       printf(" - %s\n", conn);
159   }
160   printf("state                    : ");
161   switch (nm->state)
162   {
163     case E_NM_STATE_UNKNOWN:
164       printf("E_NM_STATE_UNKNOWN\n");
165       break;
166     case E_NM_STATE_ASLEEP:
167       printf("E_NM_STATE_ASLEEP\n");
168       break;
169     case E_NM_STATE_CONNECTING:
170       printf("E_NM_STATE_CONNECTING\n");
171       break;
172     case E_NM_STATE_CONNECTED:
173       printf("E_NM_STATE_CONNECTED\n");
174       break;
175     case E_NM_STATE_DISCONNECTED:
176       printf("E_NM_STATE_DISCONNECTED\n");
177       break;
178   }
179   printf("\n");
180 }
181
182 EAPI void
183 e_nm_data_set(E_NM *nm, void *data)
184 {
185   E_NM_Internal *nmi;
186
187   nmi = (E_NM_Internal *)nm;
188   nmi->data = data;
189 }
190
191 EAPI void *
192 e_nm_data_get(E_NM *nm)
193 {
194   E_NM_Internal *nmi;
195
196   nmi = (E_NM_Internal *)nm;
197   return nmi->data;
198 }
199
200 EAPI void
201 e_nm_callback_state_changed_set(E_NM *nm, int (*cb_func)(E_NM *nm, E_NM_State state))
202 {
203   E_NM_Internal *nmi;
204
205   nmi = (E_NM_Internal *)nm;
206   nmi->state_changed = cb_func;
207 }
208
209 EAPI void
210 e_nm_callback_properties_changed_set(E_NM *nm, int (*cb_func)(E_NM *nm))
211 {
212   E_NM_Internal *nmi;
213
214   nmi = (E_NM_Internal *)nm;
215   nmi->properties_changed = cb_func;
216 }
217
218 EAPI void
219 e_nm_callback_device_added_set(E_NM *nm, int (*cb_func)(E_NM *nm, const char *device))
220 {
221   E_NM_Internal *nmi;
222
223   nmi = (E_NM_Internal *)nm;
224   nmi->device_added = cb_func;
225 }
226
227 EAPI void
228 e_nm_callback_device_removed_set(E_NM *nm, int (*cb_func)(E_NM *nm, const char *device))
229 {
230   E_NM_Internal *nmi;
231
232   nmi = (E_NM_Internal *)nm;
233   nmi->device_removed = cb_func;
234 }