diff --git a/obexd/plugins/ftp.c b/obexd/plugins/ftp.c
index 0736095..f5a8fd0 100644
--- a/obexd/plugins/ftp.c
+++ b/obexd/plugins/ftp.c
return os_prepare_get(os, file, size);
}
+static void ftp_connect(obex_t *obex, obex_object_t *obj)
+{
+ struct obex_session *os = OBEX_GetUserData(obex);
+ obex_headerdata_t hd;
+
+ register_session(os->cid, os);
+ emit_session_created(os->cid);
+
+ /* Append received UUID in WHO header */
+ hd.bs = FTP_TARGET;
+ OBEX_ObjectAddHeader(obex, obj,
+ OBEX_HDR_WHO, hd, sizeof(FTP_TARGET),
+ OBEX_FL_FIT_ONE_PACKET);
+ hd.bq4 = os->cid;
+ OBEX_ObjectAddHeader(obex, obj,
+ OBEX_HDR_CONNECTION, hd, 4,
+ OBEX_FL_FIT_ONE_PACKET);
+
+ OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
+}
+
static void ftp_get(obex_t *obex, obex_object_t *obj)
{
obex_headerdata_t hv;
g_free(fullname);
}
+static void ftp_disconnect(obex_t *obex)
+{
+ struct obex_session *os = OBEX_GetUserData(obex);
+
+ emit_session_removed(os->cid);
+ unregister_session(os->cid);
+}
+
struct obex_service_driver pcsuite = {
.name = "Nokia OBEX PC Suite Services",
.service = OBEX_PCSUITE,
.channel = PCSUITE_CHANNEL,
.record = PCSUITE_RECORD,
.target = FTP_TARGET,
+ .connect = ftp_connect,
.get = ftp_get,
.put = ftp_put,
.chkput = ftp_chkput,
- .setpath = ftp_setpath
+ .setpath = ftp_setpath,
+ .disconnect = ftp_disconnect
};
struct obex_service_driver ftp = {
.channel = FTP_CHANNEL,
.record = FTP_RECORD,
.target = FTP_TARGET,
+ .connect = ftp_connect,
.get = ftp_get,
.put = ftp_put,
.chkput = ftp_chkput,
- .setpath = ftp_setpath
+ .setpath = ftp_setpath,
+ .disconnect = ftp_disconnect
};
static int ftp_init(void)
diff --git a/obexd/plugins/opp.c b/obexd/plugins/opp.c
index 64de753..d7f2999 100644
--- a/obexd/plugins/opp.c
+++ b/obexd/plugins/opp.c
</attribute> \
</record>"
+static void opp_connect(obex_t *obex, obex_object_t *obj)
+{
+ struct obex_session *os = OBEX_GetUserData(obex);
+
+ register_transfer(os->cid, os);
+ /* OPP doesn't contains target or connection id. */
+ OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
+}
+
static gint opp_chkput(obex_t *obex, obex_object_t *obj)
{
struct obex_session *os;
}
skip_auth:
+ emit_transfer_started(os->cid);
return os_prepare_put(os);
}
OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
}
+static void opp_disconnect(obex_t *obex)
+{
+ struct obex_session *os = OBEX_GetUserData(obex);
+
+ /* Got an error during a transfer. */
+ if (os->object)
+ emit_transfer_completed(os->cid, os->offset == os->size);
+
+ unregister_transfer(os->cid);
+}
+
+static void opp_reset(obex_t *obex)
+{
+ struct obex_session *os = OBEX_GetUserData(obex);
+
+ emit_transfer_completed(os->cid, !os->aborted);
+}
+
struct obex_service_driver driver = {
.name = "Object Push server",
.service = OBEX_OPP,
.channel = OPP_CHANNEL,
.record = OPP_RECORD,
+ .connect = opp_connect,
+ .disconnect = opp_disconnect,
.get = opp_get,
.put = opp_put,
.chkput = opp_chkput,
+ .reset = opp_reset
};
static int opp_init(void)
diff --git a/obexd/plugins/pbap.c b/obexd/plugins/pbap.c
index c553deb..340fb06 100644
--- a/obexd/plugins/pbap.c
+++ b/obexd/plugins/pbap.c
#include "service.h"
#include "phonebook.h"
#include "telephony.h"
+#include "dbus.h"
#define PHONEBOOK_TYPE "x-bt/phonebook"
#define VCARDLISTING_TYPE "x-bt/vcard-listing"
return err;
}
+static void pbap_connect(obex_t *obex, obex_object_t *obj)
+{
+ struct obex_session *os = OBEX_GetUserData(obex);
+ obex_headerdata_t hd;
+
+ register_session(os->cid, os);
+ emit_session_created(os->cid);
+
+ /* Append received UUID in WHO header */
+ hd.bs = PBAP_TARGET;
+ OBEX_ObjectAddHeader(obex, obj,
+ OBEX_HDR_WHO, hd, sizeof(PBAP_TARGET),
+ OBEX_FL_FIT_ONE_PACKET);
+ hd.bq4 = os->cid;
+ OBEX_ObjectAddHeader(obex, obj,
+ OBEX_HDR_CONNECTION, hd, 4,
+ OBEX_FL_FIT_ONE_PACKET);
+
+ OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
+}
+
static void pbap_get(obex_t *obex, obex_object_t *obj)
{
struct obex_session *session = OBEX_GetUserData(obex);
OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS);
}
+static void pbap_disconnect(obex_t *obex)
+{
+ struct obex_session *os = OBEX_GetUserData(obex);
+
+ emit_session_removed(os->cid);
+ unregister_session(os->cid);
+}
+
struct obex_service_driver pbap = {
.name = "Phonebook Access server",
.service = OBEX_PBAP,
.channel = PBAP_CHANNEL,
.record = PBAP_RECORD,
.target = PBAP_TARGET,
+ .connect = pbap_connect,
.get = pbap_get,
- .setpath = pbap_setpath
+ .setpath = pbap_setpath,
+ .disconnect = pbap_disconnect
};
static int pbap_init(void)
diff --git a/obexd/src/obex.c b/obexd/src/obex.c
index bdf3703..b333b6a 100644
--- a/obexd/src/obex.c
+++ b/obexd/src/obex.c
return;
}
- if (os->service->service == OBEX_OPP) {
- register_transfer(os->cid, os);
- /* OPP doesn't contains target or connection id. */
- OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
-
- return;
- }
-
- register_session(cid, os);
- emit_session_created(cid);
-
- /* Append received UUID in WHO header */
- hd.bs = os->service->target;
- OBEX_ObjectAddHeader(obex, obj,
- OBEX_HDR_WHO, hd, TARGET_SIZE,
- OBEX_FL_FIT_ONE_PACKET);
- hd.bq4 = cid;
- OBEX_ObjectAddHeader(obex, obj,
- OBEX_HDR_CONNECTION, hd, 4,
- OBEX_FL_FIT_ONE_PACKET);
-
- OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_SUCCESS);
+ if (os->service->connect)
+ os->service->connect(obex, obj);
}
static gboolean chk_cid(obex_t *obex, obex_object_t *obj, guint32 cid)
g_free(path);
- if (os->service->service == OBEX_OPP)
- emit_transfer_started(os->cid);
-
if (!os->buf) {
debug("PUT request checked, no buffered data");
return 0;
break;
case OBEX_EV_ABORT:
os->aborted = TRUE;
- if (os->service->service == OBEX_OPP)
- emit_transfer_completed(os->cid, FALSE);
+ if (os->service->reset)
+ os->service->reset(obex);
os_reset_session(os);
OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS);
break;
case OBEX_CMD_PUT:
case OBEX_CMD_GET:
os_session_mark_aborted(os);
- if (os->service->service == OBEX_OPP)
- emit_transfer_completed(os->cid, !os->aborted);
+ if (os->service->reset)
+ os->service->reset(obex);
os_reset_session(os);
break;
default:
os = OBEX_GetUserData(obex);
- if (os->service->service == OBEX_OPP) {
- /* Got an error during a transfer. */
- if (os->object)
- emit_transfer_completed(os->cid, os->offset == os->size);
-
- unregister_transfer(os->cid);
- } else {
- emit_session_removed(os->cid);
- unregister_session(os->cid);
- }
+ if (os->service && os->service->disconnect)
+ os->service->disconnect(obex);
obex_session_free(os);
diff --git a/obexd/src/service.h b/obexd/src/service.h
index 2cf3443..32720e1 100644
--- a/obexd/src/service.h
+++ b/obexd/src/service.h
guint8 channel;
const guint8 *target;
const gchar *record;
+ void (*connect) (obex_t *obex, obex_object_t *obj);
void (*get) (obex_t *obex, obex_object_t *obj);
void (*put) (obex_t *obex, obex_object_t *obj);
gint (*chkput) (obex_t *obex, obex_object_t *obj);
void (*setpath) (obex_t *obex, obex_object_t *obj);
+ void (*disconnect) (obex_t *obex);
+ void (*reset) (obex_t *obex);
};
int obex_service_driver_register(struct obex_service_driver *driver);