summaryrefslogtreecommitdiffstats
path: root/network/manager.c
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2007-03-20 15:10:58 +0000
committerLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2007-03-20 15:10:58 +0000
commitc41c67efc320d5f8b15963246cc0c2aa006446d5 (patch)
tree0330298a51b4c9efa6267430a2f4c2594b6eeb3f /network/manager.c
parent6e2ea33ba70a7d6b6ffa614a8fe57fe7662b7c70 (diff)
Initial code of CreateServer and RemoveServer methods.
Diffstat (limited to 'network/manager.c')
-rw-r--r--network/manager.c69
1 files changed, 67 insertions, 2 deletions
diff --git a/network/manager.c b/network/manager.c
index e10a4e33..91e71c37 100644
--- a/network/manager.c
+++ b/network/manager.c
@@ -32,6 +32,7 @@
#include <glib.h>
#include "logging.h"
+#include "dbus.h"
#define NETWORK_PATH "/org/bluez/network"
#define NETWORK_MANAGER_INTERFACE "org.bluez.network.Manager"
@@ -39,6 +40,7 @@
#include "error.h"
#include "bridge.h"
#include "manager.h"
+#include "server.h"
struct manager {
bdaddr_t src; /* Local adapter BT address */
@@ -79,13 +81,73 @@ static DBusHandlerResult list_servers(DBusConnection *conn,
static DBusHandlerResult create_server(DBusConnection *conn,
DBusMessage *msg, void *data)
{
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ struct manager *mgr = data;
+ DBusMessage *reply;
+ DBusError derr;
+ const char *uuid;
+ char *path;
+
+ dbus_error_init(&derr);
+ if (!dbus_message_get_args(msg, &derr,
+ DBUS_TYPE_STRING, &uuid,
+ DBUS_TYPE_INVALID)) {
+ err_generic(conn, msg, derr.name, derr.message);
+ dbus_error_free(&derr);
+ return DBUS_HANDLER_RESULT_HANDLED;
+ }
+
+ path = g_new0(char, 32);
+ snprintf(path, 32, NETWORK_PATH "/server/%s", uuid);
+ if (!g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp)) {
+ if (server_register(conn, path) != -1) {
+ mgr->servers = g_slist_append(mgr->servers,
+ g_strdup(path));
+ }
+ }
+
+ reply = dbus_message_new_method_return(msg);
+ if (!reply)
+ return DBUS_HANDLER_RESULT_NEED_MEMORY;
+
+ dbus_message_append_args(reply, DBUS_TYPE_STRING, &path,
+ DBUS_TYPE_INVALID);
+
+ g_free(path);
+ return send_message_and_unref(connection, reply);
}
static DBusHandlerResult remove_server(DBusConnection *conn,
DBusMessage *msg, void *data)
{
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ struct manager *mgr = data;
+ const char *path;
+ DBusMessage *reply;
+ DBusError derr;
+ GSList *l;
+
+ dbus_error_init(&derr);
+ if (!dbus_message_get_args(msg, &derr,
+ DBUS_TYPE_STRING, &path,
+ DBUS_TYPE_INVALID)) {
+ err_generic(conn, msg, derr.name, derr.message);
+ dbus_error_free(&derr);
+ return DBUS_HANDLER_RESULT_HANDLED;
+ }
+
+ l = g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp);
+ if (!l)
+ return err_does_not_exist(conn, msg, "Server doesn't exist");
+
+ mgr->servers = g_slist_remove(mgr->servers, l->data);
+
+ reply = dbus_message_new_method_return(msg);
+ if (!reply)
+ return DBUS_HANDLER_RESULT_NEED_MEMORY;
+
+ if (!dbus_connection_unregister_object_path(conn, path))
+ error("Network server path unregister failed");
+
+ return send_message_and_unref(conn, reply);
}
static DBusHandlerResult list_connections(DBusConnection *conn,
@@ -149,6 +211,9 @@ static void manager_free(struct manager *mgr)
if (!mgr)
return;
+ if (mgr->servers)
+ g_slist_free(mgr->servers);
+
g_free (mgr);
}