3 * neard - Near Field Communication manager
5 * Copyright (C) 2011 Intel Corporation. All rights reserved.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
36 static DBusConnection *connection;
38 static DBusMessage *get_properties(DBusConnection *conn,
39 DBusMessage *msg, void *data)
42 DBusMessageIter array, dict;
46 reply = dbus_message_new_method_return(msg);
50 dbus_message_iter_init_append(reply, &array);
52 near_dbus_dict_open(&array, &dict);
54 near_dbus_dict_append_array(&dict, "Adapters",
55 DBUS_TYPE_OBJECT_PATH, __near_adapter_list, NULL);
57 near_dbus_dict_close(&array, &dict);
62 static DBusMessage *set_property(DBusConnection *conn,
63 DBusMessage *msg, void *data)
67 return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
70 int __near_manager_adapter_add(uint32_t idx, const char *name,
71 uint32_t protocols, near_bool_t powered)
73 struct near_adapter *adapter;
79 adapter = __near_adapter_create(idx, name, protocols, powered);
83 path = __near_adapter_get_path(adapter);
85 __near_adapter_destroy(adapter);
89 err = __near_adapter_add(adapter);
91 __near_adapter_destroy(adapter);
93 near_dbus_property_changed_array(NFC_MANAGER_PATH,
94 NFC_MANAGER_INTERFACE, "Adapters",
95 DBUS_TYPE_OBJECT_PATH, __near_adapter_list,
98 g_dbus_emit_signal(connection, "/",
99 NFC_MANAGER_INTERFACE, "AdapterAdded",
100 DBUS_TYPE_OBJECT_PATH, &path,
107 void __near_manager_adapter_remove(uint32_t idx)
109 struct near_adapter *adapter;
114 adapter = __near_adapter_get(idx);
118 path = __near_adapter_get_path(adapter);
123 g_dbus_emit_signal(connection, "/",
124 NFC_MANAGER_INTERFACE, "AdapterRemoved",
125 DBUS_TYPE_OBJECT_PATH, &path,
128 __near_adapter_remove(adapter);
130 near_dbus_property_changed_array(NFC_MANAGER_PATH,
131 NFC_MANAGER_INTERFACE, "Adapters",
132 DBUS_TYPE_OBJECT_PATH, __near_adapter_list,
136 static DBusMessage *register_handover_agent(DBusConnection *conn,
137 DBusMessage *msg, void *data)
139 const char *sender, *path;
142 DBG("conn %p", conn);
144 sender = dbus_message_get_sender(msg);
146 dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
149 err = __near_agent_handover_register(sender, path);
151 return __near_error_failed(msg, -err);
153 return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
156 static DBusMessage *unregister_handover_agent(DBusConnection *conn,
157 DBusMessage *msg, void *data)
159 const char *sender, *path;
162 DBG("conn %p", conn);
164 sender = dbus_message_get_sender(msg);
166 dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
169 err = __near_agent_handover_unregister(sender, path);
171 return __near_error_failed(msg, -err);
173 return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
176 static DBusMessage *register_ndef_agent(DBusConnection *conn,
177 DBusMessage *msg, void *data)
179 DBusMessageIter iter;
180 const char *sender, *path, *type;
183 DBG("conn %p", conn);
185 sender = dbus_message_get_sender(msg);
187 if (dbus_message_iter_init(msg, &iter) == FALSE)
188 return __near_error_invalid_arguments(msg);
190 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH)
191 return __near_error_invalid_arguments(msg);
193 dbus_message_iter_get_basic(&iter, &path);
194 dbus_message_iter_next(&iter);
196 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
197 return __near_error_invalid_arguments(msg);
199 dbus_message_iter_get_basic(&iter, &type);
201 err = __near_agent_ndef_register(sender, path, type);
203 return __near_error_failed(msg, -err);
205 return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
208 static DBusMessage *unregister_ndef_agent(DBusConnection *conn,
209 DBusMessage *msg, void *data)
211 DBusMessageIter iter;
212 const char *sender, *path, *type;
215 DBG("conn %p", conn);
217 sender = dbus_message_get_sender(msg);
219 if (dbus_message_iter_init(msg, &iter) == FALSE)
220 return __near_error_invalid_arguments(msg);
222 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH)
223 return __near_error_invalid_arguments(msg);
225 dbus_message_iter_get_basic(&iter, &path);
226 dbus_message_iter_next(&iter);
228 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
229 return __near_error_invalid_arguments(msg);
231 dbus_message_iter_get_basic(&iter, &type);
233 err = __near_agent_ndef_unregister(sender, path, type);
235 return __near_error_failed(msg, -err);
237 return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
240 static const GDBusMethodTable manager_methods[] = {
241 { GDBUS_METHOD("GetProperties",
242 NULL, GDBUS_ARGS({"properties", "a{sv}"}),
244 { GDBUS_METHOD("SetProperty",
245 GDBUS_ARGS({"name", "s"}, {"value", "v"}),
246 NULL, set_property) },
247 { GDBUS_METHOD("RegisterHandoverAgent",
248 GDBUS_ARGS({ "path", "o" }), NULL,
249 register_handover_agent) },
250 { GDBUS_METHOD("UnregisterHandoverAgent",
251 GDBUS_ARGS({ "path", "o" }), NULL,
252 unregister_handover_agent) },
253 { GDBUS_METHOD("RegisterNDEFAgent",
254 GDBUS_ARGS({"path", "o"}, {"type", "s"}),
255 NULL, register_ndef_agent) },
256 { GDBUS_METHOD("UnregisterNDEFAgent",
257 GDBUS_ARGS({"path", "o"}, {"type", "s"}),
258 NULL, unregister_ndef_agent) },
262 static const GDBusSignalTable manager_signals[] = {
263 { GDBUS_SIGNAL("PropertyChanged",
264 GDBUS_ARGS({"name", "s"}, {"value", "v"})) },
265 { GDBUS_SIGNAL("AdapterAdded", GDBUS_ARGS({"adapter", "o" })) },
266 { GDBUS_SIGNAL("AdapterRemoved", GDBUS_ARGS({"adapter", "o" })) },
270 int __near_manager_init(DBusConnection *conn)
274 connection = dbus_connection_ref(conn);
276 DBG("connection %p", connection);
278 g_dbus_register_interface(connection, NFC_MANAGER_PATH,
279 NFC_MANAGER_INTERFACE,
281 manager_signals, NULL, NULL, NULL);
283 return __near_netlink_get_adapters();
286 void __near_manager_cleanup(void)
290 g_dbus_unregister_interface(connection, NFC_MANAGER_PATH,
291 NFC_MANAGER_INTERFACE);
293 dbus_connection_unref(connection);