summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2009-07-03 12:22:01 -0300
committerLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2009-07-03 12:22:01 -0300
commitff4b4a1b9b64d156f5b42e3dbc6b67295451f1f8 (patch)
treebedee06ade6d25739074fe61739a0f79165b06d8
parent5cef936a5b9dcfe343d2d4760a0facbc56033c86 (diff)
downloadobexd-ff4b4a1b9b64d156f5b42e3dbc6b67295451f1f8.tar.gz
Add Channel property.
Channel can be used to connect to specific channel without resolving target record.
-rw-r--r--client/main.c31
-rw-r--r--client/session.c11
-rw-r--r--client/session.h3
-rw-r--r--doc/client-api.txt4
4 files changed, 38 insertions, 11 deletions
diff --git a/client/main.c b/client/main.c
index 985690d..e903a75 100644
--- a/client/main.c
+++ b/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/client/session.c b/client/session.c
index 1ee4229..b87585d 100644
--- a/client/session.c
+++ b/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/client/session.h b/client/session.h
index e391c73..b9e9d3f 100644
--- a/client/session.h
+++ b/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,
diff --git a/doc/client-api.txt b/doc/client-api.txt
index 9bd6c0a..3b8250a 100644
--- a/doc/client-api.txt
+++ b/doc/client-api.txt
@@ -43,6 +43,8 @@ Properties string Target
string Destination
+ byte Channel
+
Session hierarchy
=================
@@ -68,6 +70,8 @@ Properties string Source [read-only]
string Destination [read-only]
+ byte Channel [read-only]
+
string AgentPath [read-only]
Object Path of the assigned agent. This property will