diff --git a/obexd/client/session.c b/obexd/client/session.c
index 46213c7..6e2bcf7 100644
--- a/obexd/client/session.c
+++ b/obexd/client/session.c
{
session->priv = priv;
}
+
+static void put_buf_xfer_progress(GwObexXfer *xfer, gpointer user_data)
+{
+ struct session_data *session = user_data;
+ gint written;
+
+ if (session->transferred == session->size)
+ goto complete;
+
+ if (gw_obex_xfer_write(xfer, session->buffer + session->transferred,
+ session->size - session->transferred,
+ &written, NULL) == FALSE)
+ goto complete;
+
+ if (gw_obex_xfer_flush(xfer, NULL) == FALSE)
+ goto complete;
+
+ session->transferred += written;
+
+ agent_notify_progress(session->conn, session->agent_name,
+ session->agent_path, session->transfer_path,
+ session->transferred);
+
+ return;
+
+complete:
+ if (session->transferred == session->size)
+ agent_notify_complete(session->conn, session->agent_name,
+ session->agent_path, session->transfer_path);
+ else
+ agent_notify_error(session->conn, session->agent_name,
+ session->agent_path, session->transfer_path,
+ "Error sending object");
+
+ unregister_transfer(session);
+ session_unref(session);
+}
+
+int session_put(struct session_data *session, char *buf, const char *targetname)
+{
+ GwObexXfer *xfer;
+
+ if (session->obex == NULL)
+ return -ENOTCONN;
+
+ session->transfer_path = register_transfer(session->conn, session);
+ if (session->transfer_path == NULL)
+ return -EIO;
+
+ session->size = strlen(buf);
+ session->transferred = 0;
+ session->name = g_strdup(targetname);
+ session->buffer = buf;
+
+ xfer = gw_obex_put_async(session->obex, session->name, NULL,
+ session->size, -1, NULL);
+ if (xfer == NULL)
+ return -ENOTCONN;
+
+ session_ref(session);
+
+ gw_obex_xfer_set_callback(xfer, put_buf_xfer_progress, session);
+
+ session->xfer = xfer;
+
+ agent_request(session->conn, session->agent_name,
+ session->agent_path, session->transfer_path);
+
+ agent_notify_progress(session->conn, session->agent_name,
+ session->agent_path, session->transfer_path, 0);
+
+ return 0;
+}
diff --git a/obexd/client/session.h b/obexd/client/session.h
index d713db8..8d770c5 100644
--- a/obexd/client/session.h
+++ b/obexd/client/session.h
int session_register(struct session_data *session);
void *session_get_data(struct session_data *session);
void session_set_data(struct session_data *session, void *priv);
+int session_put(struct session_data *session, char *buf,
+ const char *targetname);
diff --git a/obexd/client/sync.c b/obexd/client/sync.c
index 23b9708..d370b5d 100644
--- a/obexd/client/sync.c
+++ b/obexd/client/sync.c
static DBusMessage *sync_putphonebook(DBusConnection *connection,
DBusMessage *message, void *user_data)
{
- return g_dbus_create_error(message,
- ERROR_INF ".Failed", "Not implemented");
+ struct session_data *session = user_data;
+ struct sync_data *syncdata = session_get_data(session);
+ const char *buf;
+ char *buffer;
+
+ if (dbus_message_get_args(message, NULL,
+ DBUS_TYPE_STRING, &buf,
+ DBUS_TYPE_INVALID) == FALSE)
+ return g_dbus_create_error(message,
+ ERROR_INF ".InvalidArguments", NULL);
+
+ /* set default phonebook_path to memory internal phonebook */
+ if (!syncdata->phonebook_path)
+ syncdata->phonebook_path = g_strdup("telecom/pb.vcf");
+
+ buffer = g_strdup(buf);
+
+ if (session_put(session, buffer, syncdata->phonebook_path) < 0)
+ return g_dbus_create_error(message,
+ ERROR_INF ".Failed", "Failed");
+
+ return dbus_message_new_method_return(message);
}
static GDBusMethodTable sync_methods[] = {