diff --git a/obexd/client/main.c b/obexd/client/main.c
index 8244586..3b2762e 100644
--- a/obexd/client/main.c
+++ b/obexd/client/main.c
shutdown_session(session);
}
-static void create_callback(struct session_data *session, void *user_data)
+static void create_callback(struct session_data *session, GError *err,
+ void *user_data)
{
struct send_data *data = user_data;
unsigned int i;
- if (session->obex == NULL) {
+ if (err != NULL) {
DBusMessage *error = g_dbus_create_error(data->message,
- "org.openobex.Error.Failed", NULL);
+ "org.openobex.Error.Failed",
+ err->message);
g_dbus_send_message(data->connection, error);
shutdown_session(session);
goto done;
}
static void pull_complete_callback(struct session_data *session,
- void *user_data)
+ GError *err, void *user_data)
{
struct send_data *data = user_data;
- struct transfer_data *transfer = session->pending->data;
- if (transfer->err != 0) {
+ if (err != NULL) {
DBusMessage *error = g_dbus_create_error(data->message,
"org.openobex.Error.Failed",
- transfer->err > 0 ?
- OBEX_ResponseToString(transfer->err) :
- strerror(-transfer->err));
+ err->message);
g_dbus_send_message(data->connection, error);
goto done;
}
}
static void pull_session_callback(struct session_data *session,
- void *user_data)
+ GError *err, void *user_data)
{
struct send_data *data = user_data;
- if (session->obex == NULL) {
+ if (err != NULL) {
DBusMessage *error = g_dbus_create_error(data->message,
- "org.openobex.Error.Failed", NULL);
+ "org.openobex.Error.Failed",
+ err->message);
g_dbus_send_message(data->connection, error);
shutdown_session(session);
goto done;
}
static void capabilities_complete_callback(struct session_data *session,
- void *user_data)
+ GError *err, void *user_data)
{
struct transfer_data *transfer = session->pending->data;
struct send_data *data = user_data;
char *capabilities;
- if (transfer->filled == 0) {
+ if (err != NULL) {
DBusMessage *error = g_dbus_create_error(data->message,
- "org.openobex.Error.Failed", NULL);
+ "org.openobex.Error.Failed",
+ err->message);
g_dbus_send_message(data->connection, error);
goto done;
}
}
static void capability_session_callback(struct session_data *session,
- void *user_data)
+ GError *err, void *user_data)
{
struct send_data *data = user_data;
- if (session->obex == NULL) {
+ if (err != NULL) {
DBusMessage *error = g_dbus_create_error(data->message,
- "org.openobex.Error.Failed", NULL);
+ "org.openobex.Error.Failed",
+ err->message);
g_dbus_send_message(data->connection, error);
shutdown_session(session);
goto done;
diff --git a/obexd/client/pbap.c b/obexd/client/pbap.c
index 6070585..8f4441b 100644
--- a/obexd/client/pbap.c
+++ b/obexd/client/pbap.c
}
static void pull_phonebook_callback(struct session_data *session,
- void *user_data)
+ GError *err, void *user_data)
{
struct transfer_data *transfer = session->pending->data;
DBusMessage *reply;
}
static void phonebook_size_callback(struct session_data *session,
- void *user_data)
+ GError *err, void *user_data)
{
struct transfer_data *transfer = session->pending->data;
DBusMessage *reply;
}
static void pull_vcard_listing_callback(struct session_data *session,
- void *user_data)
+ GError *err, void *user_data)
{
struct transfer_data *transfer = session->pending->data;
GMarkupParseContext *ctxt;
diff --git a/obexd/client/session.c b/obexd/client/session.c
index d761bfb..7a71ecc 100644
--- a/obexd/client/session.c
+++ b/obexd/client/session.c
#define FTP_INTERFACE "org.openobex.FileTransfer"
+#define OBEX_IO_ERROR obex_io_error_quark()
+
static guint64 counter = 0;
static unsigned char pcsuite_uuid[] = { 0x00, 0x00, 0x50, 0x05, 0x00, 0x00,
struct pending_data *pending;
};
-static void session_prepare_put(struct session_data *session, void *data);
+static void session_prepare_put(struct session_data *session, GError *err,
+ void *data);
+
+static GQuark obex_io_error_quark(void)
+{
+ return g_quark_from_static_string("obex-io-error-quark");
+}
struct session_data *session_ref(struct session_data *session)
{
session->obex = obex;
done:
- callback->func(callback->session, callback->data);
+ callback->func(callback->session, err, callback->data);
session_unref(callback->session);
unsigned int scanned, bytesleft = size;
int seqlen = 0;
uint8_t dataType, channel = 0;
+ GError *gerr = NULL;
if (status || type != SDP_SVC_SEARCH_ATTR_RSP)
goto failed;
failed:
sdp_close(callback->sdp);
- callback->func(callback->session, callback->data);
+ g_set_error(&gerr, OBEX_IO_ERROR, -EIO,
+ "Unable to find service record");
+ callback->func(callback->session, gerr, callback->data);
+ g_clear_error(&gerr);
+
session_unref(callback->session);
g_free(callback);
}
struct callback_data *callback = user_data;
sdp_list_t *search, *attrid;
uint32_t range = 0x0000ffff;
+ GError *gerr = NULL;
if (cond & (G_IO_NVAL | G_IO_ERR))
goto failed;
failed:
sdp_close(callback->sdp);
- callback->func(callback->session, callback->data);
+ g_set_error(&gerr, OBEX_IO_ERROR, -EIO,
+ "Unable to find service record");
+ callback->func(callback->session, gerr, callback->data);
+ g_clear_error(&gerr);
+
session_unref(callback->session);
g_free(callback);
return FALSE;
};
static void list_folder_callback(struct session_data *session,
- void *user_data)
+ GError *err, void *user_data)
{
struct transfer_data *transfer = session->pending->data;
GMarkupParseContext *ctxt;
session->msg = NULL;
}
-static void get_file_callback(struct session_data *session, void *user_data)
+static void get_file_callback(struct session_data *session, GError *err,
+ void *user_data)
{
}
pending->transfer->name = g_strdup(name);
}
- pending->cb(session, pending->transfer);
+ pending->cb(session, NULL, pending->transfer);
dbus_message_unref(reply);
free_pending(pending);
agent->pending = NULL;
struct pending_data *pending = data;
struct transfer_data *transfer = pending->transfer;
- pending->cb(transfer->session, transfer);
+ pending->cb(transfer->session, NULL, transfer);
free_pending(pending);
return FALSE;
}
static void session_terminate_transfer(struct session_data *session,
- struct transfer_data *transfer)
+ struct transfer_data *transfer,
+ GError *gerr)
{
struct session_callback *callback = session->callback;
if (callback) {
- callback->func(session, callback->data);
+ callback->func(session, gerr, callback->data);
return;
}
DBG("Transfer(%p) complete", transfer);
- session_terminate_transfer(session, transfer);
+ session_terminate_transfer(session, transfer, NULL);
}
static void session_notify_error(struct session_data *session,
struct transfer_data *transfer,
- const char *err)
+ GError *err)
{
struct agent_data *agent = session->agent;
DBusMessage *message;
reply = g_dbus_create_error(session->msg,
"org.openobex.Error.Failed",
- err);
+ err->message);
g_dbus_send_message(session->conn, reply);
dbus_message_unref(session->msg);
dbus_message_append_args(message,
DBUS_TYPE_OBJECT_PATH, &transfer->path,
- DBUS_TYPE_STRING, &err,
+ DBUS_TYPE_STRING, &err->message,
DBUS_TYPE_INVALID);
g_dbus_send_message(session->conn, message);
done:
- error("Transfer(%p) Error: %s", transfer, err);
+ error("Transfer(%p) Error: %s", transfer, err->message);
- session_terminate_transfer(session, transfer);
+ session_terminate_transfer(session, transfer, err);
}
static void session_notify_progress(struct session_data *session,
int err, void *user_data)
{
struct session_data *session = user_data;
+ GError *gerr = NULL;
if (err != 0)
goto fail;
return;
fail:
- session_notify_error(session, transfer,
+ g_set_error(&gerr, OBEX_IO_ERROR, err, "%s",
err > 0 ? OBEX_ResponseToString(err) : strerror(-err));
+ session_notify_error(session, transfer, gerr);
+ g_clear_error(&gerr);
}
-static void session_prepare_get(struct session_data *session, void *data)
+static void session_prepare_get(struct session_data *session,
+ GError *err, void *data)
{
struct transfer_data *transfer = data;
- int err;
+ int ret;
- err = transfer_get(transfer, transfer_progress, session);
- if (err < 0) {
- session_notify_error(session, transfer, strerror(-err));
+ ret = transfer_get(transfer, transfer_progress, session);
+ if (ret < 0) {
+ GError *gerr = NULL;
+
+ g_set_error(&gerr, OBEX_IO_ERROR, ret, "%s", strerror(-ret));
+ session_notify_error(session, transfer, gerr);
+ g_clear_error(&gerr);
return;
}
session->priv = priv;
}
-static void session_prepare_put(struct session_data *session, void *data)
+static void session_prepare_put(struct session_data *session,
+ GError *err, void *data)
{
struct transfer_data *transfer = data;
- int err;
+ int ret;
- err = transfer_put(transfer, transfer_progress, session);
- if (err < 0) {
- session_notify_error(session, transfer, strerror(-err));
+ ret = transfer_put(transfer, transfer_progress, session);
+ if (ret < 0) {
+ GError *gerr = NULL;
+
+ g_set_error(&gerr, OBEX_IO_ERROR, ret, "%s (%d)",
+ strerror(-ret), -ret);
+ session_notify_error(session, transfer, gerr);
+ g_clear_error(&gerr);
return;
}
diff --git a/obexd/client/session.h b/obexd/client/session.h
index 9451c25..546849e 100644
--- a/obexd/client/session.h
+++ b/obexd/client/session.h
};
typedef void (*session_callback_t) (struct session_data *session,
- void *user_data);
+ GError *err, void *user_data);
struct session_data *session_create(const char *source,
const char *destination, const char *target,
diff --git a/obexd/client/sync.c b/obexd/client/sync.c
index af0b38e..3622a3d 100644
--- a/obexd/client/sync.c
+++ b/obexd/client/sync.c
}
static void sync_getphonebook_callback(struct session_data *session,
- void *user_data)
+ GError *err, void *user_data)
{
struct transfer_data *transfer = session->pending->data;
DBusMessage *reply;