diff options
| author | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2007-05-01 11:50:48 +0000 | 
|---|---|---|
| committer | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2007-05-01 11:50:48 +0000 | 
| commit | 7c21f8711c39949419c35aba60b007d1b9d2b1d5 (patch) | |
| tree | 8795e06fe142a4570d9d733e158b9633e767093c | |
| parent | cdb1b7c3435688bc6f30a3953f1152247ec51b95 (diff) | |
serial: added manager methods skeleton
| -rw-r--r-- | serial/manager.c | 86 | 
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;  } | 
