From 6a40f1133fbfed26317f3d422c996d0225377a19 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Fri, 3 Jul 2009 12:22:01 -0300 Subject: [PATCH] obexd: Add Channel property. Channel can be used to connect to specific channel without resolving target record. --- obexd/client/main.c | 31 ++++++++++++++++++++++--------- obexd/client/session.c | 11 ++++++++++- obexd/client/session.h | 3 ++- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/obexd/client/main.c b/obexd/client/main.c index 985690d4f..e903a752b 100644 --- a/obexd/client/main.c +++ b/obexd/client/main.c @@ -97,7 +97,8 @@ done: } static int parse_device_dict(DBusMessageIter *iter, - const char **source, const char **dest, const char **target) + const char **source, const char **dest, const char **target, + uint8_t *channel) { while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_DICT_ENTRY) { DBusMessageIter entry, value; @@ -117,6 +118,11 @@ static int parse_device_dict(DBusMessageIter *iter, dbus_message_iter_get_basic(&value, dest); else if (g_str_equal(key, "Target") == TRUE) dbus_message_iter_get_basic(&value, target); + break; + case DBUS_TYPE_BYTE: + if (g_str_equal(key, "Channel") == TRUE) + dbus_message_iter_get_basic(&value, channel); + break; } dbus_message_iter_next(iter); @@ -132,11 +138,12 @@ static DBusMessage *send_files(DBusConnection *connection, GPtrArray *files; struct send_data *data; const char *agent, *source = NULL, *dest = NULL, *target = NULL; + uint8_t channel = 0; dbus_message_iter_init(message, &iter); dbus_message_iter_recurse(&iter, &array); - parse_device_dict(&array, &source, &dest, &target); + parse_device_dict(&array, &source, &dest, &target, &channel); if (dest == NULL) return g_dbus_create_error(message, "org.openobex.Error.InvalidArguments", NULL); @@ -180,7 +187,8 @@ static DBusMessage *send_files(DBusConnection *connection, data->agent = g_strdup(agent); data->files = files; - if (session_create(NULL, dest, "OPP", create_callback, data) == 0) + if (session_create(NULL, dest, "OPP", channel, create_callback, + data) == 0) return NULL; g_ptr_array_free(data->files, TRUE); @@ -238,11 +246,12 @@ static DBusMessage *pull_business_card(DBusConnection *connection, DBusMessageIter iter, dict; struct send_data *data; const char *source = NULL, *dest = NULL, *target = NULL; + uint8_t channel = 0; dbus_message_iter_init(message, &iter); dbus_message_iter_recurse(&iter, &dict); - parse_device_dict(&dict, &source, &dest, &target); + parse_device_dict(&dict, &source, &dest, &target, &channel); if (dest == NULL) return g_dbus_create_error(message, "org.openobex.Error.InvalidArguments", NULL); @@ -256,7 +265,7 @@ static DBusMessage *pull_business_card(DBusConnection *connection, data->message = dbus_message_ref(message); data->sender = g_strdup(dbus_message_get_sender(message)); - if (session_create(source, dest, "OPP", + if (session_create(source, dest, "OPP", channel, pull_session_callback, data) == 0) return NULL; @@ -280,11 +289,12 @@ static DBusMessage *create_session(DBusConnection *connection, DBusMessageIter iter, dict; struct send_data *data; const char *source = NULL, *dest = NULL, *target = NULL; + uint8_t channel = 0; dbus_message_iter_init(message, &iter); dbus_message_iter_recurse(&iter, &dict); - parse_device_dict(&dict, &source, &dest, &target); + parse_device_dict(&dict, &source, &dest, &target, &channel); if (dest == NULL || target == NULL) return g_dbus_create_error(message, "org.openobex.Error.InvalidArguments", NULL); @@ -298,7 +308,8 @@ static DBusMessage *create_session(DBusConnection *connection, data->message = dbus_message_ref(message); data->sender = g_strdup(dbus_message_get_sender(message)); - if (session_create(source, dest, target, create_callback, data) == 0) + if (session_create(source, dest, target, channel, create_callback, + data) == 0) return NULL; dbus_message_unref(data->message); @@ -368,11 +379,12 @@ static DBusMessage *get_capabilities(DBusConnection *connection, DBusMessageIter iter, dict; struct send_data *data; const char *source = NULL, *dest = NULL, *target = NULL; + uint8_t channel = 0; dbus_message_iter_init(message, &iter); dbus_message_iter_recurse(&iter, &dict); - parse_device_dict(&dict, &source, &dest, &target); + parse_device_dict(&dict, &source, &dest, &target, &channel); if (dest == NULL) return g_dbus_create_error(message, "org.openobex.Error.InvalidArguments", NULL); @@ -389,7 +401,8 @@ static DBusMessage *get_capabilities(DBusConnection *connection, if (!target) target = "OPP"; - if (session_create(source, dest, target, capability_session_callback, data) == 0) + if (session_create(source, dest, target, channel, capability_session_callback, + data) == 0) return NULL; dbus_message_unref(data->message); diff --git a/obexd/client/session.c b/obexd/client/session.c index 1ee422932..b87585dfc 100644 --- a/obexd/client/session.c +++ b/obexd/client/session.c @@ -286,6 +286,8 @@ static void search_callback(uint8_t type, uint16_t status, if (channel == 0) goto failed; + callback->session->channel = channel; + if (rfcomm_connect(&callback->session->src, &callback->session->dst, channel, rfcomm_callback, callback) == 0) { sdp_close(callback->sdp); @@ -380,7 +382,8 @@ static sdp_session_t *service_connect(const bdaddr_t *src, const bdaddr_t *dst, int session_create(const char *source, const char *destination, const char *target, - session_callback_t function, void *user_data) + uint8_t channel, session_callback_t function, + void *user_data) { struct session_data *session; struct callback_data *callback; @@ -395,6 +398,7 @@ int session_create(const char *source, session->refcount = 1; session->sock = -1; + session->channel = channel; session->conn = dbus_bus_get(DBUS_BUS_SESSION, NULL); if (session->conn == NULL) { @@ -618,6 +622,9 @@ static void append_entry(DBusMessageIter *dict, case DBUS_TYPE_STRING: signature = DBUS_TYPE_STRING_AS_STRING; break; + case DBUS_TYPE_BYTE: + signature = DBUS_TYPE_BYTE_AS_STRING; + break; case DBUS_TYPE_UINT64: signature = DBUS_TYPE_UINT64_AS_STRING; break; @@ -855,6 +862,8 @@ static DBusMessage *session_get_properties(DBusConnection *connection, ba2str(&session->dst, addr); append_entry(&dict, "Destination", DBUS_TYPE_STRING, &paddr); + append_entry(&dict, "Channel", DBUS_TYPE_BYTE, &session->channel); + if (session->agent_path) append_entry(&dict, "AgentPath", DBUS_TYPE_STRING, &session->agent_path); diff --git a/obexd/client/session.h b/obexd/client/session.h index e391c7319..b9e9d3f7b 100644 --- a/obexd/client/session.h +++ b/obexd/client/session.h @@ -65,7 +65,8 @@ typedef void (*session_callback_t) (struct session_data *session, int session_create(const char *source, const char *destination, const char *target, - session_callback_t function, void *user_data); + uint8_t channel, session_callback_t function, + void *user_data); int session_set_agent(struct session_data *session, const char *name, const char *path); int session_send(struct session_data *session, const char *filename, -- 2.47.3