Migration with svn revision 66792
[framework/uifw/edbus.git] / src / lib / hal / e_hal_manager.c
1 #include <stdlib.h>
2
3 #include "E_Hal.h"
4 #include "e_hal_private.h"
5
6 #define e_hal_manager_call_new(member) dbus_message_new_method_call(E_HAL_SENDER, E_HAL_MANAGER_PATH, E_HAL_MANAGER_INTERFACE, member)
7
8 /* GetAllDevices */
9
10 static void *
11 unmarshal_string_list(DBusMessage *msg, DBusError *err)
12 {
13   E_Hal_String_List_Return *ret = NULL;
14   DBusMessageIter iter, sub;
15
16   if (!dbus_message_has_signature(msg, "as")) 
17   {
18     dbus_set_error(err, DBUS_ERROR_INVALID_SIGNATURE, "");
19     return NULL;
20   }
21
22   ret = calloc(1, sizeof(E_Hal_String_List_Return));
23   if (!ret) 
24   {
25     dbus_set_error(err, DBUS_ERROR_NO_MEMORY, "");
26     return NULL;
27   }
28
29   ret->strings = NULL;
30
31   dbus_message_iter_init(msg, &iter);
32   dbus_message_iter_recurse(&iter, &sub);
33   while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID)
34   {
35     char *dev = NULL;
36
37     dbus_message_iter_get_basic(&sub, &dev);
38     if (dev)
39       ret->strings = eina_list_append(ret->strings, eina_stringshare_add(dev));
40     dbus_message_iter_next(&sub);
41   }
42
43   return ret;
44 }
45
46 static void
47 free_string_list(void *data)
48 {
49   E_Hal_String_List_Return *ret = data;
50   const char *str;
51
52   if (!ret) return;
53   EINA_LIST_FREE(ret->strings, str)
54     eina_stringshare_del(str);
55   free(ret);
56 }
57
58 EAPI DBusPendingCall *
59 e_hal_manager_get_all_devices(E_DBus_Connection *conn, E_DBus_Callback_Func cb_func, void *data)
60 {
61   DBusMessage *msg;
62   DBusPendingCall *ret;
63
64   msg = e_hal_manager_call_new("GetAllDevices");
65   ret = e_dbus_method_call_send(conn, msg, unmarshal_string_list, cb_func, free_string_list, -1, data);
66   dbus_message_unref(msg);
67   return ret;
68 }
69
70 /* Manager.DeviceExists(string udi) */
71
72 static void *
73 unmarshal_manager_device_exists(DBusMessage *msg, DBusError *err)
74 {
75   E_Hal_Manager_Device_Exists_Return *ret = NULL;
76   dbus_bool_t val;
77
78   ret = calloc(1, sizeof(E_Hal_Manager_Device_Exists_Return));
79   if (!ret) 
80   {
81     dbus_set_error(err, DBUS_ERROR_NO_MEMORY, "");
82     return NULL;
83   }
84
85   dbus_message_get_args(msg, err, DBUS_TYPE_BOOLEAN, &val, DBUS_TYPE_INVALID);
86
87   if (dbus_error_is_set(err))
88   {
89     free(ret);
90     return NULL;
91   }
92
93   ret->boolean = val;
94   return ret;
95 }
96
97 static void
98 free_manager_device_exists(void *data)
99 {
100   E_Hal_Manager_Device_Exists_Return *ret = data;
101
102   if (!ret) return;
103   free(ret);
104 }
105
106 EAPI DBusPendingCall *
107 e_hal_manager_device_exists(E_DBus_Connection *conn, const char *udi, E_DBus_Callback_Func cb_func, void *data)
108 {
109   DBusPendingCall *ret;
110   DBusMessage *msg;
111
112   msg = e_hal_manager_call_new("DeviceExists");
113   dbus_message_append_args(msg, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID);
114   ret = e_dbus_method_call_send(conn, msg, unmarshal_manager_device_exists, cb_func, free_manager_device_exists, -1, data);
115   dbus_message_unref(msg);
116   return ret;
117 }
118
119 /* Manager.FindDeviceStringMatch */
120 EAPI DBusPendingCall *
121 e_hal_manager_find_device_string_match(E_DBus_Connection *conn, const char *key, const char *value, E_DBus_Callback_Func cb_func, void *data)
122 {
123   DBusMessage *msg;
124   DBusPendingCall *ret;
125
126   msg = e_hal_manager_call_new("FindDeviceStringMatch");
127   dbus_message_append_args(msg, DBUS_TYPE_STRING, &key, DBUS_TYPE_STRING, &value, DBUS_TYPE_INVALID);
128   ret = e_dbus_method_call_send(conn, msg, unmarshal_string_list, cb_func, free_string_list, -1, data);
129   dbus_message_unref(msg);
130   return ret;
131 }
132
133 /* Manager.FindDeviceByCapability */
134
135 EAPI DBusPendingCall *
136 e_hal_manager_find_device_by_capability(E_DBus_Connection *conn, const char *capability, E_DBus_Callback_Func cb_func, void *data)
137 {
138   DBusMessage *msg;
139   DBusPendingCall *ret;
140
141   msg = e_hal_manager_call_new("FindDeviceByCapability");
142   dbus_message_append_args(msg, DBUS_TYPE_STRING, &capability, DBUS_TYPE_INVALID);
143   ret = e_dbus_method_call_send(conn, msg, unmarshal_string_list, cb_func, free_string_list, -1, data);
144   dbus_message_unref(msg);
145   return ret;
146 }