summaryrefslogtreecommitdiffstats
path: root/network
diff options
context:
space:
mode:
Diffstat (limited to 'network')
-rw-r--r--network/manager.c100
1 files changed, 79 insertions, 21 deletions
diff --git a/network/manager.c b/network/manager.c
index 91e71c37..4d17bfc1 100644
--- a/network/manager.c
+++ b/network/manager.c
@@ -41,20 +41,20 @@
#include "bridge.h"
#include "manager.h"
#include "server.h"
+#include "connection.h"
struct manager {
bdaddr_t src; /* Local adapter BT address */
GSList *servers; /* Network registered servers paths */
+ GSList *connections; /* Network registered connections paths */
};
static DBusConnection *connection = NULL;
-static DBusHandlerResult list_servers(DBusConnection *conn,
- DBusMessage *msg, void *data)
+static DBusHandlerResult list_paths(DBusConnection *conn, DBusMessage *msg,
+ GSList *list)
{
- struct manager *mgr = data;
DBusMessage *reply;
- GSList *l;
DBusMessageIter iter;
DBusMessageIter array_iter;
@@ -66,11 +66,12 @@ static DBusHandlerResult list_servers(DBusConnection *conn,
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
DBUS_TYPE_STRING_AS_STRING, &array_iter);
- for (l = mgr->servers; l; l = l->next) {
- const char *server = l->data;
-
- dbus_message_iter_append_basic(&array_iter,
- DBUS_TYPE_STRING, &server);
+ if (g_slist_length(list)) {
+ for (; list; list = list->next) {
+ dbus_message_iter_append_basic(&array_iter,
+ DBUS_TYPE_STRING,
+ &list->data);
+ }
}
dbus_message_iter_close_container(&iter, &array_iter);
@@ -78,6 +79,14 @@ static DBusHandlerResult list_servers(DBusConnection *conn,
return send_message_and_unref(conn, reply);
}
+static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg,
+ void *data)
+{
+ struct manager *mgr = data;
+
+ return list_paths(conn, msg, mgr->servers);
+}
+
static DBusHandlerResult create_server(DBusConnection *conn,
DBusMessage *msg, void *data)
{
@@ -116,10 +125,9 @@ static DBusHandlerResult create_server(DBusConnection *conn,
return send_message_and_unref(connection, reply);
}
-static DBusHandlerResult remove_server(DBusConnection *conn,
- DBusMessage *msg, void *data)
+static DBusHandlerResult remove_path(DBusConnection *conn,
+ DBusMessage *msg, GSList **list)
{
- struct manager *mgr = data;
const char *path;
DBusMessage *reply;
DBusError derr;
@@ -134,11 +142,12 @@ static DBusHandlerResult remove_server(DBusConnection *conn,
return DBUS_HANDLER_RESULT_HANDLED;
}
- l = g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp);
+ l = g_slist_find_custom(*list, 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);
+ g_free(l->data);
+ *list = g_slist_remove(*list, l->data);
reply = dbus_message_new_method_return(msg);
if (!reply)
@@ -150,22 +159,67 @@ static DBusHandlerResult remove_server(DBusConnection *conn,
return send_message_and_unref(conn, reply);
}
+static DBusHandlerResult remove_server(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ struct manager *mgr = data;
+
+ return remove_path(conn, msg, &mgr->servers);
+}
+
static DBusHandlerResult list_connections(DBusConnection *conn,
DBusMessage *msg, void *data)
{
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ struct manager *mgr = data;
+
+ return list_paths(conn, msg, mgr->connections);
}
static DBusHandlerResult create_connection(DBusConnection *conn,
DBusMessage *msg, void *data)
{
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ struct manager *mgr = data;
+ static int uid = 0;
+ DBusMessage *reply;
+ DBusError derr;
+ const char *addr;
+ const char *uuid;
+ char *path;
+
+ dbus_error_init(&derr);
+ if (!dbus_message_get_args(msg, &derr,
+ DBUS_TYPE_STRING, &addr,
+ 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 "/connection%d", uid++);
+ if (connection_register(conn, path) != -1) {
+ mgr->connections = g_slist_append(mgr->connections,
+ 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_connections(DBusConnection *conn,
+static DBusHandlerResult remove_connection(DBusConnection *conn,
DBusMessage *msg, void *data)
{
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ struct manager *mgr = data;
+
+ return remove_path(conn, msg, &mgr->connections);
}
static DBusHandlerResult manager_message(DBusConnection *conn,
@@ -200,8 +254,8 @@ static DBusHandlerResult manager_message(DBusConnection *conn,
if (strcmp(member, "CreateConnection") == 0)
return create_connection(conn, msg, data);
- if (strcmp(member, "RemoveConnections") == 0)
- return remove_connections(conn, msg, data);
+ if (strcmp(member, "RemoveConnection") == 0)
+ return remove_connection(conn, msg, data);
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
@@ -214,6 +268,9 @@ static void manager_free(struct manager *mgr)
if (mgr->servers)
g_slist_free(mgr->servers);
+ if (mgr->connections)
+ g_slist_free(mgr->connections);
+
g_free (mgr);
}
@@ -303,7 +360,8 @@ void internal_service(const char *identifier)
DBUS_TYPE_STRING, &name,
DBUS_TYPE_STRING, &desc, DBUS_TYPE_INVALID);
- reply = dbus_connection_send_with_reply_and_block(connection, msg, -1, NULL);
+ reply = dbus_connection_send_with_reply_and_block(connection, msg, -1,
+ NULL);
if (!reply) {
error("Can't register service");
return;