@@ -52,6 +52,10 @@ object CreateSession(string destination, dict args)
Channel to be used.
+ :uint16 PSM:
+
+ L2CAP PSM to be used.
+
Possible errors:
:org.bluez.obex.Error.InvalidArguments:
@@ -50,6 +50,11 @@ byte Channel [readonly]
Bluetooth channel
+uint16 PSM [readonly]
+```````````````````````
+
+ Bluetooth L2CAP PSM
+
string Target [readonly]
````````````````````````
@@ -107,7 +107,8 @@ done:
}
static int parse_device_dict(DBusMessageIter *iter,
- const char **source, const char **target, uint8_t *channel)
+ const char **source, const char **target, uint8_t *channel,
+ uint16_t *psm)
{
while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_DICT_ENTRY) {
DBusMessageIter entry, value;
@@ -130,6 +131,10 @@ static int parse_device_dict(DBusMessageIter *iter,
if (g_str_equal(key, "Channel") == TRUE)
dbus_message_iter_get_basic(&value, channel);
break;
+ case DBUS_TYPE_UINT16:
+ if (g_str_equal(key, "PSM") == TRUE)
+ dbus_message_iter_get_basic(&value, psm);
+ break;
}
dbus_message_iter_next(iter);
@@ -160,6 +165,7 @@ static DBusMessage *create_session(DBusConnection *connection,
struct send_data *data;
const char *source = NULL, *dest = NULL, *target = NULL;
uint8_t channel = 0;
+ uint16_t psm = 0;
dbus_message_iter_init(message, &iter);
if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
@@ -175,8 +181,8 @@ static DBusMessage *create_session(DBusConnection *connection,
dbus_message_iter_recurse(&iter, &dict);
- parse_device_dict(&dict, &source, &target, &channel);
- if (dest == NULL || target == NULL)
+ parse_device_dict(&dict, &source, &target, &channel, &psm);
+ if (dest == NULL || target == NULL || (channel && psm))
return g_dbus_create_error(message,
ERROR_INTERFACE ".InvalidArguments", NULL);
@@ -188,7 +194,7 @@ static DBusMessage *create_session(DBusConnection *connection,
data->connection = dbus_connection_ref(connection);
data->message = dbus_message_ref(message);
- session = obc_session_create(source, dest, target, channel,
+ session = obc_session_create(source, dest, target, channel, psm,
dbus_message_get_sender(message),
create_callback, data);
if (session != NULL) {
@@ -88,6 +88,7 @@ struct obc_session {
char *source;
char *destination;
uint8_t channel;
+ uint16_t psm;
struct obc_transport *transport;
struct obc_driver *driver;
char *path; /* Session path */
@@ -471,6 +472,7 @@ static struct obc_session *session_find(const char *source,
const char *destination,
const char *service,
uint8_t channel,
+ uint16_t psm,
const char *owner)
{
GSList *l;
@@ -490,6 +492,9 @@ static struct obc_session *session_find(const char *source,
if (channel && session->channel != channel)
continue;
+ if (psm && session->psm != psm)
+ continue;
+
if (g_strcmp0(owner, session->owner))
continue;
@@ -541,8 +546,9 @@ static int session_connect(struct obc_session *session,
}
session->id = transport->connect(session->source, session->destination,
- driver->uuid, session->channel,
- transport_func, callback);
+ driver->uuid,
+ session->channel ? session->channel : session->psm,
+ transport_func, callback);
if (session->id == 0) {
obc_session_unref(callback->session);
g_free(callback);
@@ -558,6 +564,7 @@ struct obc_session *obc_session_create(const char *source,
const char *destination,
const char *service,
uint8_t channel,
+ uint16_t psm,
const char *owner,
session_callback_t function,
void *user_data)
@@ -570,7 +577,8 @@ struct obc_session *obc_session_create(const char *source,
if (destination == NULL)
return NULL;
- session = session_find(source, destination, service, channel, owner);
+ session = session_find(source, destination, service, channel, psm,
+ owner);
if (session != NULL)
goto proceed;
@@ -598,6 +606,7 @@ struct obc_session *obc_session_create(const char *source,
session->source = g_strdup(source);
session->destination = g_strdup(destination);
session->channel = channel;
+ session->psm = psm;
session->queue = g_queue_new();
session->folder = g_strdup("/");
@@ -762,6 +771,17 @@ static gboolean get_channel(const GDBusPropertyTable *property,
return TRUE;
}
+static gboolean get_psm(const GDBusPropertyTable *property,
+ DBusMessageIter *iter, void *data)
+{
+ struct obc_session *session = data;
+
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16,
+ &session->psm);
+
+ return TRUE;
+}
+
static const GDBusMethodTable session_methods[] = {
{ GDBUS_ASYNC_METHOD("GetCapabilities",
NULL, GDBUS_ARGS({ "capabilities", "s" }),
@@ -794,6 +814,7 @@ static const GDBusPropertyTable session_properties[] = {
{ "Source", "s", get_source, NULL, source_exists },
{ "Destination", "s", get_destination },
{ "Channel", "y", get_channel },
+ { "PSM", "q", get_psm },
{ "Target", "s", get_target, NULL, target_exists },
{ }
};
@@ -22,6 +22,7 @@ struct obc_session *obc_session_create(const char *source,
const char *destination,
const char *service,
uint8_t channel,
+ uint16_t psm,
const char *owner,
session_callback_t function,
void *user_data);