diff --git a/obexd/client/main.c b/obexd/client/main.c
index 18f4d2f..19ca436 100644
--- a/obexd/client/main.c
+++ b/obexd/client/main.c
{
struct transfer_data *transfer = session_get_transfer(session);
struct send_data *data = user_data;
- char *capabilities;
+ const char *capabilities;
+ int size;
if (err != NULL) {
DBusMessage *error = g_dbus_create_error(data->message,
goto done;
}
- capabilities = g_strndup(transfer->buffer, transfer->filled);
+ capabilities = transfer_get_buffer(transfer, &size);
+ if (size == 0)
+ capabilities = "";
g_dbus_send_reply(data->connection, data->message,
DBUS_TYPE_STRING, &capabilities,
DBUS_TYPE_INVALID);
- g_free(capabilities);
-
done:
shutdown_session(session);
diff --git a/obexd/client/pbap.c b/obexd/client/pbap.c
index a7017bd..38d5a47 100644
--- a/obexd/client/pbap.c
+++ b/obexd/client/pbap.c
guint16 *phone_book_size, guint8 *new_missed_calls)
{
struct transfer_data *transfer = session_get_transfer(session);
- GwObexXfer *xfer = transfer->xfer;
+ struct transfer_params params;
unsigned char *buf;
size_t size = 0;
*phone_book_size = 0;
*new_missed_calls = 0;
- if (xfer == NULL)
+ if (transfer_get_params(transfer, ¶ms) < 0)
return;
- buf = gw_obex_xfer_object_apparam(xfer, &size);
-
- if (size < APPARAM_HDR_SIZE)
+ if (params.size < APPARAM_HDR_SIZE)
return;
while (size > APPARAM_HDR_SIZE) {
- struct apparam_hdr *hdr = (struct apparam_hdr *) buf;
+ struct apparam_hdr *hdr = (struct apparam_hdr *) params.data;
if (hdr->len > size - APPARAM_HDR_SIZE) {
error("Unexpected PBAP pullphonebook app"
struct transfer_data *transfer = session_get_transfer(session);
struct pbap_data *pbap = user_data;
DBusMessage *reply;
- char *buf = "";
+ const char *buf;
+ int size;
if (pbap->msg == NULL)
goto done;
reply = dbus_message_new_method_return(pbap->msg);
- if (transfer->filled > 0)
- buf = transfer->buffer;
+ buf = transfer_get_buffer(transfer, &size);
+ if (size == 0)
+ buf = "";
dbus_message_append_args(reply,
DBUS_TYPE_STRING, &buf,
DBUS_TYPE_INVALID);
- transfer->filled = 0;
+ transfer_clear_buffer(transfer);
send:
g_dbus_send_message(pbap->conn, reply);
DBUS_TYPE_UINT16, &phone_book_size,
DBUS_TYPE_INVALID);
- transfer->filled = 0;
+ transfer_clear_buffer(transfer);
send:
g_dbus_send_message(pbap->conn, reply);
GMarkupParseContext *ctxt;
DBusMessage *reply;
DBusMessageIter iter, array;
- int i;
+ const char *buf;
+ int size;
if (pbap->msg == NULL)
goto complete;
reply = dbus_message_new_method_return(pbap->msg);
- if (transfer->filled == 0)
- goto send;
-
- for (i = transfer->filled - 1; i > 0; i--) {
- if (transfer->buffer[i] != '\0')
- break;
-
- transfer->filled--;
- }
+ buf = transfer_get_buffer(transfer, &size);
+ if (size == 0)
+ buf = "";
dbus_message_iter_init_append(reply, &iter);
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_STRING_AS_STRING
DBUS_STRUCT_END_CHAR_AS_STRING, &array);
ctxt = g_markup_parse_context_new(&listing_parser, 0, &array, NULL);
- g_markup_parse_context_parse(ctxt, transfer->buffer,
- transfer->filled, NULL);
+ g_markup_parse_context_parse(ctxt, buf, strlen(buf) - 1, NULL);
g_markup_parse_context_free(ctxt);
dbus_message_iter_close_container(&iter, &array);
- transfer->filled = 0;
+ transfer_clear_buffer(transfer);
send:
g_dbus_send_message(pbap->conn, reply);
diff --git a/obexd/client/session.c b/obexd/client/session.c
index 64bcb78..8ad9a49 100644
--- a/obexd/client/session.c
+++ b/obexd/client/session.c
struct pending_data {
DBusPendingCall *call;
session_callback_t cb;
+ struct session_data *session;
struct transfer_data *transfer;
};
GMarkupParseContext *ctxt;
DBusMessage *reply;
DBusMessageIter iter, array;
- int i;
-
- reply = dbus_message_new_method_return(session->msg);
+ const char *buf;
+ int size;
- if (transfer->filled == 0)
+ if (err != NULL) {
+ reply = g_dbus_create_error(session->msg,
+ "org.openobex.Error.Failed",
+ "%s", err->message);
goto done;
+ } else
+ reply = dbus_message_new_method_return(session->msg);
- for (i = transfer->filled - 1; i > 0; i--) {
- if (transfer->buffer[i] != '\0')
- break;
-
- transfer->filled--;
- }
+ buf = transfer_get_buffer(transfer, &size);
+ if (size == 0)
+ buf = "";
dbus_message_iter_init_append(reply, &iter);
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &array);
ctxt = g_markup_parse_context_new(&parser, 0, &array, NULL);
- g_markup_parse_context_parse(ctxt, transfer->buffer,
- transfer->filled, NULL);
+ g_markup_parse_context_parse(ctxt, buf, strlen(buf) - 1, NULL);
g_markup_parse_context_free(ctxt);
dbus_message_iter_close_container(&iter, &array);
- transfer->filled = 0;
+ transfer_clear_buffer(transfer);
done:
g_dbus_send_message(session->conn, reply);
DBG("Agent.Request() reply: %s", name);
- if (strlen(name)) {
- g_free(pending->transfer->name);
- pending->transfer->name = g_strdup(name);
- }
+ if (strlen(name))
+ transfer_set_name(pending->transfer, name);
agent->pending = NULL;
struct pending_data *pending = data;
struct transfer_data *transfer = pending->transfer;
- pending->cb(transfer->session, NULL, transfer);
+ pending->cb(pending->session, NULL, transfer);
free_pending(pending);
return FALSE;
struct agent_data *agent = session->agent;
DBusMessage *message;
struct pending_data *pending;
+ const char *path;
pending = g_new0(struct pending_data, 1);
pending->cb = cb;
+ pending->session = session;
pending->transfer = transfer;
- if (agent == NULL || transfer->path == NULL) {
+ path = transfer_get_path(transfer);
+
+ if (agent == NULL || path == NULL) {
g_idle_add(session_request_proceed, pending);
return 0;
}
agent->path, AGENT_INTERFACE, "Request");
dbus_message_append_args(message,
- DBUS_TYPE_OBJECT_PATH, &transfer->path,
+ DBUS_TYPE_OBJECT_PATH, &path,
DBUS_TYPE_INVALID);
if (!dbus_connection_send_with_reply(session->conn, message,
dbus_pending_call_set_notify(pending->call, session_request_reply,
session, NULL);
- DBG("Agent.Request(\"%s\")", transfer->path);
+ DBG("Agent.Request(\"%s\")", path);
return 0;
}
{
struct agent_data *agent = session->agent;
DBusMessage *message;
+ const char *path;
+
+ path = transfer_get_path(transfer);
- if (agent == NULL || transfer->path == NULL)
+ if (agent == NULL || path == NULL)
goto done;
message = dbus_message_new_method_call(agent->name,
dbus_message_set_no_reply(message, TRUE);
dbus_message_append_args(message,
- DBUS_TYPE_OBJECT_PATH, &transfer->path,
+ DBUS_TYPE_OBJECT_PATH, &path,
DBUS_TYPE_INVALID);
g_dbus_send_message(session->conn, message);
{
struct agent_data *agent = session->agent;
DBusMessage *message;
+ const char *path;
if (session->msg) {
DBusMessage *reply;
session->msg = NULL;
}
- if (agent == NULL || transfer->path == NULL)
+ path = transfer_get_path(transfer);
+ if (agent == NULL || path == NULL)
goto done;
message = dbus_message_new_method_call(agent->name,
dbus_message_set_no_reply(message, TRUE);
dbus_message_append_args(message,
- DBUS_TYPE_OBJECT_PATH, &transfer->path,
+ DBUS_TYPE_OBJECT_PATH, &path,
DBUS_TYPE_STRING, &err->message,
DBUS_TYPE_INVALID);
{
struct agent_data *agent = session->agent;
DBusMessage *message;
+ const char *path;
/* For GetFile reply on the first received stream */
- if (transfer->fd > 0 && session->msg) {
+ if (session->msg &&
+ dbus_message_has_member(session->msg, "GetFile")) {
DBusMessage *reply;
reply = dbus_message_new_method_return(session->msg);
session->msg = NULL;
}
- if (agent == NULL || transfer->path == NULL)
+ path = transfer_get_path(transfer);
+ if (agent == NULL || path == NULL)
goto done;
message = dbus_message_new_method_call(agent->name,
dbus_message_set_no_reply(message, TRUE);
dbus_message_append_args(message,
- DBUS_TYPE_OBJECT_PATH, &transfer->path,
+ DBUS_TYPE_OBJECT_PATH, &path,
DBUS_TYPE_UINT64, &transferred,
DBUS_TYPE_INVALID);
DBG("Transfer(%p) progress: %ld bytes", transfer,
(long int ) transferred);
- if (transferred == transfer->size)
+ if (transferred == transfer_get_size(transfer))
session_notify_complete(session, transfer);
}
params->size = apparam_size;
}
- transfer = transfer_register(session, filename, targetname, type,
- params);
+ transfer = transfer_register(session->conn, filename, targetname, type,
+ params, session);
if (transfer == NULL) {
if (params != NULL) {
g_free(params->data);
if (session->obex == NULL)
return -ENOTCONN;
- transfer = transfer_register(session, filename, targetname, NULL,
- NULL);
+ transfer = transfer_register(session->conn, filename, targetname, NULL,
+ NULL, session);
if (transfer == NULL)
return -EINVAL;
if (session->obex == NULL)
return -ENOTCONN;
- transfer = transfer_register(session, NULL, filename, type, NULL);
+ transfer = transfer_register(session->conn, NULL, filename, type, NULL,
+ session);
if (transfer == NULL) {
return -EIO;
}
if (session->pending != NULL)
return -EISCONN;
- transfer = transfer_register(session, NULL, targetname, NULL, NULL);
+ transfer = transfer_register(session->conn, NULL, targetname, NULL,
+ NULL, session);
if (transfer == NULL)
return -EIO;
- transfer->size = strlen(buf);
- transfer->buffer = buf;
+ transfer_set_buffer(transfer, buf);
err = session_request(session, session_prepare_put, transfer);
if (err < 0)
diff --git a/obexd/client/sync.c b/obexd/client/sync.c
index 9271bf3..d9b6af7 100644
--- a/obexd/client/sync.c
+++ b/obexd/client/sync.c
struct transfer_data *transfer = session_get_transfer(session);
struct sync_data *sync = user_data;
DBusMessage *reply;
- char *buf = NULL;
+ const char *buf;
+ int size;
reply = dbus_message_new_method_return(sync->msg);
- if (transfer->filled > 0)
- buf = transfer->buffer;
+ buf = transfer_get_buffer(transfer, &size);
+ if (size == 0)
+ buf = "";
dbus_message_append_args(reply,
DBUS_TYPE_STRING, &buf,
DBUS_TYPE_INVALID);
- transfer->filled = 0;
g_dbus_send_message(sync->conn, reply);
dbus_message_unref(sync->msg);
sync->msg = NULL;
diff --git a/obexd/client/transfer.c b/obexd/client/transfer.c
index 9e6f0ad..39b0c91 100644
--- a/obexd/client/transfer.c
+++ b/obexd/client/transfer.c
void *data;
};
+struct transfer_data {
+ struct session_data *session;
+ struct transfer_params *params;
+ struct transfer_callback *callback;
+ DBusConnection *conn;
+ char *path; /* Transfer path */
+ gchar *filename; /* Transfer file location */
+ char *name; /* Transfer object name */
+ char *type; /* Transfer object type */
+ int fd;
+ GwObexXfer *xfer;
+ char *buffer;
+ size_t buffer_len;
+ int filled;
+ gint64 size;
+ gint64 transferred;
+ int err;
+};
+
static void append_entry(DBusMessageIter *dict,
const char *key, int type, void *val)
{
g_free(transfer);
}
-struct transfer_data *transfer_register(struct session_data *session,
+struct transfer_data *transfer_register(DBusConnection *conn,
const char *filename,
const char *name,
const char *type,
- struct transfer_params *params)
+ struct transfer_params *params,
+ void *user_data)
{
+ struct session_data *session = user_data;
struct transfer_data *transfer;
transfer = g_new0(struct transfer_data, 1);
callback->func(transfer, transfer->transferred, -ECANCELED,
callback->data);
}
+
+int transfer_get_params(struct transfer_data *transfer,
+ struct transfer_params *params)
+{
+ if (!transfer->xfer)
+ return -ENOTCONN;
+
+ params->data = gw_obex_xfer_object_apparam(transfer->xfer,
+ ¶ms->size);
+
+ return 0;
+}
+
+void transfer_clear_buffer(struct transfer_data *transfer)
+{
+ transfer->filled = 0;
+}
+
+const char *transfer_get_buffer(struct transfer_data *transfer, int *size)
+{
+ if (size)
+ *size = transfer->filled;
+
+ return transfer->buffer;
+}
+
+void transfer_set_buffer(struct transfer_data *transfer, char *buffer)
+{
+ transfer->size = strlen(buffer);
+ transfer->buffer = buffer;
+}
+
+void transfer_set_name(struct transfer_data *transfer, const char *name)
+{
+ g_free(transfer->name);
+ transfer->name = g_strdup(name);
+}
+
+const char *transfer_get_path(struct transfer_data *transfer)
+{
+ return transfer->path;
+}
+
+gint64 transfer_get_size(struct transfer_data *transfer)
+{
+ return transfer->size;
+}
diff --git a/obexd/client/transfer.h b/obexd/client/transfer.h
index 7392267..ac14623 100644
--- a/obexd/client/transfer.h
+++ b/obexd/client/transfer.h
struct transfer_params {
guint8 *data;
- gint size;
+ size_t size;
};
struct transfer_callback;
-
-struct transfer_data {
- struct session_data *session;
- struct transfer_params *params;
- struct transfer_callback *callback;
- DBusConnection *conn;
- char *path; /* Transfer path */
- gchar *filename; /* Transfer file location */
- char *name; /* Transfer object name */
- char *type; /* Transfer object type */
- int fd;
- GwObexXfer *xfer;
- char *buffer;
- size_t buffer_len;
- int filled;
- gint64 size;
- gint64 transferred;
- int err;
-};
+struct transfer_data;
typedef void (*transfer_callback_t) (struct transfer_data *transfer,
gint64 transferred, gint err,
void *user_data);
-struct transfer_data *transfer_register(struct session_data *session,
+struct transfer_data *transfer_register(DBusConnection *conn,
const char *filename,
const char *name,
const char *type,
- struct transfer_params *params);
+ struct transfer_params *params,
+ void *user_data);
void transfer_unregister(struct transfer_data *transfer);
int transfer_put(struct transfer_data *transfer, transfer_callback_t func,
void *user_data);
void transfer_abort(struct transfer_data *transfer);
+
+int transfer_get_params(struct transfer_data *transfer,
+ struct transfer_params *params);
+const char *transfer_get_buffer(struct transfer_data *transfer, int *size);
+void transfer_set_buffer(struct transfer_data *transfer, char *buffer);
+void transfer_clear_buffer(struct transfer_data *transfer);
+
+void transfer_set_name(struct transfer_data *transfer, const char *name);
+const char *transfer_get_path(struct transfer_data *transfer);
+gint64 transfer_get_size(struct transfer_data *transfer);