From bec136fcac1dd5f79240f862b6c4bee50aad7faf Mon Sep 17 00:00:00 2001 From: Vinicius Costa Gomes Date: Mon, 17 Nov 2008 20:01:38 -0300 Subject: [PATCH] obexd: Adds support for dynamic buffers --- obexd/client/session.c | 28 ++++++++++++++++++++++++---- obexd/client/session.h | 3 ++- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/obexd/client/session.c b/obexd/client/session.c index a682c8310..23bcd2361 100644 --- a/obexd/client/session.c +++ b/obexd/client/session.c @@ -51,6 +51,8 @@ #define FTP_INTERFACE "org.openobex.FileTransfer" +#define DEFAULT_BUFFER_SIZE 4096 + static guint64 counter = 0; struct callback_data { @@ -116,6 +118,7 @@ static void session_unref(struct session_data *session) g_free(session->agent_name); g_free(session->agent_path); g_free(session->owner); + g_free(session->buffer); g_free(session); } @@ -943,6 +946,12 @@ static void unregister_transfer(struct session_data *session) g_free(session->name); session->name = NULL; + g_free(session->buffer); + session->buffer = NULL; + + session->buffer_len = 0; + session->filled = 0; + if (session->transfer_path == NULL) return; @@ -1004,7 +1013,13 @@ static void get_xfer_progress(GwObexXfer *xfer, gpointer user_data) gint bsize, bread, err = 0; gboolean ret; - bsize = sizeof(session->buffer) - session->filled; + if (session->buffer_len == 0) { + session->buffer_len = DEFAULT_BUFFER_SIZE; + session->buffer = g_new0(char, DEFAULT_BUFFER_SIZE); + } + + bsize = session->buffer_len - session->filled; + ret = gw_obex_xfer_read(xfer, session->buffer + session->filled, bsize, &bread, &err); @@ -1072,10 +1087,10 @@ complete: session->agent_path, session->transfer_path, "Error getting object"); - unregister_transfer(session); - callback->func(callback->session, callback->data); + unregister_transfer(session); + if (session->fd > 0) close(session->fd); @@ -1326,8 +1341,13 @@ static void put_xfer_progress(GwObexXfer *xfer, gpointer user_data) ssize_t len; gint written; + if (session->buffer_len == 0) { + session->buffer_len = DEFAULT_BUFFER_SIZE; + session->buffer = g_new0(char, DEFAULT_BUFFER_SIZE); + } + len = read(session->fd, session->buffer + session->filled, - sizeof(session->buffer) - session->filled); + session->buffer_len - session->filled); if (len <= 0) goto complete; diff --git a/obexd/client/session.h b/obexd/client/session.h index 16c3392fc..f0c113cce 100644 --- a/obexd/client/session.h +++ b/obexd/client/session.h @@ -44,7 +44,8 @@ struct session_data { DBusMessage *msg; GwObex *obex; GwObexXfer *xfer; - char buffer[4096]; + char *buffer; + size_t buffer_len; int filled; ssize_t size; size_t transferred; -- 2.47.3