summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClaudio Takahasi <claudio.takahasi@openbossa.org>2007-05-01 11:50:48 +0000
committerClaudio Takahasi <claudio.takahasi@openbossa.org>2007-05-01 11:50:48 +0000
commit7c21f8711c39949419c35aba60b007d1b9d2b1d5 (patch)
tree8795e06fe142a4570d9d733e158b9633e767093c
parentcdb1b7c3435688bc6f30a3953f1152247ec51b95 (diff)
serial: added manager methods skeleton
-rw-r--r--serial/manager.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/serial/manager.c b/serial/manager.c
index 79601624..ee250b37 100644
--- a/serial/manager.c
+++ b/serial/manager.c
@@ -25,21 +25,107 @@
#include <config.h>
#endif
+#include <errno.h>
+#include <string.h>
+
#include "dbus.h"
+#include "logging.h"
#include "manager.h"
+#define SERIAL_PATH "/org/bluez/serial"
+#define SERIAL_MANAGER_INTERFACE "org.bluez.serial.Manager"
+#define SERIAL_ERROR_INTERFACE "org.bluez.serial.Error"
+
static DBusConnection *connection = NULL;
+DBusHandlerResult err_unknown_port(DBusConnection *conn, DBusMessage *msg)
+{
+ return send_message_and_unref(conn,
+ dbus_message_new_error(msg,
+ SERIAL_ERROR_INTERFACE ".UnknownPort",
+ "Unknown port path"));
+}
+
+static DBusHandlerResult create_port(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+}
+
+static DBusHandlerResult remove_port(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+}
+
+static DBusHandlerResult list_ports(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+}
+
+static DBusHandlerResult manager_message(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ const char *path, *iface, *member;
+
+ path = dbus_message_get_path(msg);
+ iface = dbus_message_get_interface(msg);
+ member = dbus_message_get_member(msg);
+
+ /* Catching fallback paths */
+ if (strcmp(SERIAL_PATH, path) != 0)
+ return err_unknown_port(conn, msg);
+
+ /* Accept messages from the manager interface only */
+ if (strcmp(SERIAL_MANAGER_INTERFACE, iface))
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+ if (strcmp(member, "CreatePort") == 0)
+ return create_port(conn, msg, data);
+
+ if (strcmp(member, "RemovePort") == 0)
+ return remove_port(conn, msg, data);
+
+ if (strcmp(member, "ListPorts") == 0)
+ return list_ports(conn, msg, data);
+
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+}
+
+static void manager_unregister(DBusConnection *conn, void *data)
+{
+}
+
+/* Virtual table to handle manager object path hierarchy */
+static const DBusObjectPathVTable manager_table = {
+ .message_function = manager_message,
+ .unregister_function = manager_unregister,
+};
+
int serial_init(DBusConnection *conn)
{
connection = dbus_connection_ref(conn);
+ /* Fallback to catch invalid serial path */
+ if (dbus_connection_register_fallback(connection, SERIAL_PATH,
+ &manager_table, NULL) == FALSE) {
+ error("D-Bus failed to register %s path", SERIAL_PATH);
+ dbus_connection_unref(connection);
+
+ return -1;
+ }
+
+ info("Registered manager path:%s", SERIAL_PATH);
+
return 0;
}
void serial_exit(void)
{
+ dbus_connection_unregister_object_path(connection, SERIAL_PATH);
+
dbus_connection_unref(connection);
connection = NULL;
}