From fba78dbad8dd062de443102a707fcf0047432196 Mon Sep 17 00:00:00 2001 From: Forrest Zhao Date: Fri, 23 Jan 2009 06:11:55 +0800 Subject: [PATCH] obexd: add support for Sync Putphonebook --- obexd/client/session.c | 73 ++++++++++++++++++++++++++++++++++++++++++ obexd/client/session.h | 2 ++ obexd/client/sync.c | 24 ++++++++++++-- 3 files changed, 97 insertions(+), 2 deletions(-) diff --git a/obexd/client/session.c b/obexd/client/session.c index 46213c748..6e2bcf7fb 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 d713db8a2..8d770c542 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 23b970824..d370b5de5 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[] = { -- 2.47.3