diff --git a/obexd/plugins/ftp.c b/obexd/plugins/ftp.c
index ccba5f2..1b4b272 100644
--- a/obexd/plugins/ftp.c
+++ b/obexd/plugins/ftp.c
return obex_stream_start(os, file);
}
-static int ftp_connect(struct obex_session *os)
+static gpointer ftp_connect(struct obex_session *os, int *err)
{
manager_register_session(os);
- return 0;
+ if (err)
+ *err = 0;
+
+ return NULL;
}
-static int ftp_get(struct obex_session *os, obex_object_t *obj)
+static int ftp_get(struct obex_session *os, obex_object_t *obj,
+ gpointer user_data)
{
const char *folder = obex_get_folder(os);
const char *type = obex_get_type(os);
return ret;
}
-static gint ftp_chkput(struct obex_session *os)
+static gint ftp_chkput(struct obex_session *os, gpointer user_data)
{
if (obex_get_size(os) == OBJECT_SIZE_DELETE)
return obex_prepare_put(os);
}
-static int ftp_put(struct obex_session *os)
+static int ftp_put(struct obex_session *os, gpointer user_data)
{
const char *folder = obex_get_folder(os);
const char *name = obex_get_name(os);
return 0;
}
-static int ftp_setpath(struct obex_session *os, obex_object_t *obj)
+static int ftp_setpath(struct obex_session *os, obex_object_t *obj,
+ gpointer user_data)
{
const gchar *root_folder, *current_folder, *name;
guint8 *nonhdr;
return err;
}
-static void ftp_disconnect(struct obex_session *os)
+static void ftp_disconnect(struct obex_session *os, gpointer user_data)
{
manager_unregister_session(os);
}
diff --git a/obexd/plugins/opp.c b/obexd/plugins/opp.c
index 60ef1a2..9c1d959 100644
--- a/obexd/plugins/opp.c
+++ b/obexd/plugins/opp.c
</attribute> \
</record>"
-static int opp_connect(struct obex_session *os)
+static gpointer opp_connect(struct obex_session *os, int *err)
{
manager_register_transfer(os);
- return 0;
+ if (err)
+ *err = 0;
+
+ return NULL;
}
-static void opp_progress(struct obex_session *os)
+static void opp_progress(struct obex_session *os, gpointer user_data)
{
manager_emit_transfer_progress(os);
}
-static gint opp_chkput(struct obex_session *os)
+static gint opp_chkput(struct obex_session *os, gpointer user_data)
{
gchar *new_folder, *new_name;
gint32 time;
return obex_prepare_put(os);
}
-static int opp_put(struct obex_session *os)
+static int opp_put(struct obex_session *os, gpointer user_data)
{
const char *name = obex_get_name(os);
const char *folder = obex_get_folder(os);
return 0;
}
-static int opp_get(struct obex_session *os, obex_object_t *obj)
+static int opp_get(struct obex_session *os, obex_object_t *obj,
+ gpointer user_data)
{
const char *type;
return 0;
}
-static void opp_disconnect(struct obex_session *os)
+static void opp_disconnect(struct obex_session *os, gpointer user_data)
{
manager_unregister_transfer(os);
}
-static void opp_reset(struct obex_session *os)
+static void opp_reset(struct obex_session *os, gpointer user_data)
{
manager_emit_transfer_completed(os);
}
diff --git a/obexd/plugins/pbap.c b/obexd/plugins/pbap.c
index 1866854..a37b738 100644
--- a/obexd/plugins/pbap.c
+++ b/obexd/plugins/pbap.c
0x79, 0x61, 0x35, 0xF0, 0xF0, 0xC5, 0x11, 0xD8,
0x09, 0x66, 0x08, 0x00, 0x20, 0x0C, 0x9A, 0x66 };
-static int pbap_connect(struct obex_session *os)
+static gpointer pbap_connect(struct obex_session *os, int *err)
{
manager_register_session(os);
- return 0;
+ if (*err)
+ err = 0;
+
+ return NULL;
}
-static int pbap_get(struct obex_session *os, obex_object_t *obj)
+static int pbap_get(struct obex_session *os, obex_object_t *obj,
+ gpointer user_data)
{
const gchar *type = obex_get_type(os);
const gchar *folder = obex_get_folder(os);
}
-static int pbap_setpath(struct obex_session *os, obex_object_t *obj)
+static int pbap_setpath(struct obex_session *os, obex_object_t *obj,
+ gpointer user_data)
{
const gchar *current_folder, *name;
guint8 *nonhdr;
return 0;
}
-static void pbap_disconnect(struct obex_session *os)
+static void pbap_disconnect(struct obex_session *os,
+ gpointer user_data)
{
manager_unregister_session(os);
}
-static gint pbap_chkput(struct obex_session *os)
+static gint pbap_chkput(struct obex_session *os,
+ gpointer user_data)
{
/* Rejects all PUTs */
return -EINVAL;
diff --git a/obexd/plugins/syncevolution.c b/obexd/plugins/syncevolution.c
index c255ebf..a352ede 100644
--- a/obexd/plugins/syncevolution.c
+++ b/obexd/plugins/syncevolution.c
dbus_message_unref(reply);
}
-static int synce_connect(struct obex_session *os)
+static gpointer synce_connect(struct obex_session *os, int *err)
{
manager_register_session(os);
- return 0;
+ if (err)
+ *err = 0;
+
+ return NULL;
}
-static int synce_put(struct obex_session *os)
+static int synce_put(struct obex_session *os, gpointer user_data)
{
return 0;
}
-static int synce_get(struct obex_session *os, obex_object_t *obj)
+static int synce_get(struct obex_session *os, obex_object_t *obj, gpointer user_data)
{
return 0;
}
dbus_message_unref(reply);
}
-static void synce_disconnect(struct obex_session *os)
+static void synce_disconnect(struct obex_session *os, gpointer user_data)
{
}
diff --git a/obexd/src/obex-priv.h b/obexd/src/obex-priv.h
index 7bc4dbd..28deef2 100644
--- a/obexd/src/obex-priv.h
+++ b/obexd/src/obex-priv.h
gpointer object;
gboolean aborted;
struct obex_service_driver *service;
+ gpointer service_data;
struct server *server;
gboolean checked;
obex_t *obex;
diff --git a/obexd/src/obex.c b/obexd/src/obex.c
index 3092fc6..ab701e2 100644
--- a/obexd/src/obex.c
+++ b/obexd/src/obex.c
const guint8 *target = NULL, *who = NULL;
guint target_size = 0, who_size = 0;
int err;
+ gpointer user_data;
if (OBEX_ObjectGetNonHdrData(obj, &buffer) != sizeof(*nonhdr)) {
OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
return;
}
- err = os->service->connect(os);
+ user_data = os->service->connect(os, &err);
if (err == 0 && os->service->target) {
hd.bs = os->service->target;
OBEX_ObjectAddHeader(obex, obj,
OBEX_ObjectAddHeader(obex, obj,
OBEX_HDR_CONNECTION, hd, 4,
OBEX_FL_FIT_ONE_PACKET);
+
+ os->service_data = user_data;
}
os_set_response(obj, err);
}
}
- err = os->service->get(os, obj);
+ err = os->service->get(os, obj, os->service_data);
if (err == 0) {
if (os->size != OBJECT_SIZE_UNKNOWN) {
hd.bq4 = os->size;
break;
}
- err = os->service->setpath(os, obj);
+ err = os->service->setpath(os, obj, os->service_data);
os_set_response(obj, err);
}
return FALSE;
}
- ret = os->service->chkput(os);
+ ret = os->service->chkput(os, os->service_data);
switch (ret) {
case 0:
break;
return;
}
- os->service->put(os);
+ os->service->put(os, os->service_data);
}
static void obex_event(obex_t *obex, obex_object_t *obj, gint mode,
switch (evt) {
case OBEX_EV_PROGRESS:
if (os->service->progress)
- os->service->progress(os);
+ os->service->progress(os, os->service_data);
break;
case OBEX_EV_ABORT:
os->aborted = TRUE;
if (os->service->reset)
- os->service->reset(os);
+ os->service->reset(os, os->service_data);
os_reset_session(os);
OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS);
break;
default:
os_session_mark_aborted(os);
if (os->service->reset)
- os->service->reset(os);
+ os->service->reset(os, os->service_data);
os_reset_session(os);
break;
}
os = OBEX_GetUserData(obex);
if (os->service && os->service->disconnect)
- os->service->disconnect(os);
+ os->service->disconnect(os, os->service_data);
obex_session_free(os);
diff --git a/obexd/src/service.h b/obexd/src/service.h
index 615f359..1ff9603 100644
--- a/obexd/src/service.h
+++ b/obexd/src/service.h
const guint8 *who;
guint who_size;
const gchar *record;
- int (*connect) (struct obex_session *os);
- void (*progress) (struct obex_session *os);
- int (*get) (struct obex_session *os, obex_object_t *obj);
- int (*put) (struct obex_session *os);
- gint (*chkput) (struct obex_session *os);
- int (*setpath) (struct obex_session *os, obex_object_t *obj);
- void (*disconnect) (struct obex_session *os);
- void (*reset) (struct obex_session *os);
+ gpointer (*connect) (struct obex_session *os, int *err);
+ void (*progress) (struct obex_session *os, gpointer user_data);
+ int (*get) (struct obex_session *os, obex_object_t *obj, gpointer user_data);
+ int (*put) (struct obex_session *os, gpointer user_data);
+ gint (*chkput) (struct obex_session *os, gpointer user_data);
+ int (*setpath) (struct obex_session *os, obex_object_t *obj, gpointer user_data);
+ void (*disconnect) (struct obex_session *os, gpointer user_data);
+ void (*reset) (struct obex_session *os, gpointer user_data);
};
int obex_service_driver_register(struct obex_service_driver *driver);