Diff between 2077c66ccfc9676a3929c6b75ead696798de7a7c and fba78dbad8dd062de443102a707fcf0047432196

Changed Files

File Additions Deletions Status
obexd/client/session.c +73 -0 modified
obexd/client/session.h +2 -0 modified
obexd/client/sync.c +22 -2 modified

Full Patch

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
@@ -1647,3 +1647,76 @@ void session_set_data(struct session_data *session, void *priv)
 {
 	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
@@ -80,3 +80,5 @@ int session_pull(struct session_data *session,
 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
@@ -119,8 +119,28 @@ static DBusMessage *sync_getphonebook(DBusConnection *connection,
 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[] = {