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