diff --git a/obexd/client/session.c b/obexd/client/session.c
index 44e2bf8..632e114 100644
--- a/obexd/client/session.c
+++ b/obexd/client/session.c
guint watch;
GQueue *queue;
guint process_id;
+ char *folder;
};
static GSList *sessions = NULL;
g_free(session->owner);
g_free(session->source);
g_free(session->destination);
+ g_free(session->folder);
g_free(session);
}
session->destination = g_strdup(destination);
session->channel = channel;
session->queue = g_queue_new();
+ session->folder = g_strdup("/");
if (owner)
obc_session_set_owner(session, owner, owner_disconnected);
return session->driver->target;
}
+const char *obc_session_get_folder(struct obc_session *session)
+{
+ return session->folder;
+}
+
static void setpath_complete(struct obc_session *session,
struct obc_transfer *transfer,
GError *err, void *user_data)
data->func(session, NULL, err, data->user_data);
}
+static void setpath_set_folder(struct obc_session *session, const char *cur)
+{
+ char *folder = NULL;
+ const char *delim;
+
+ delim = strrchr(session->folder, '/');
+ if (strlen(cur) == 0 || delim == NULL ||
+ (strcmp(cur, "..") == 0 && delim == session->folder)) {
+ folder = g_strdup("/");
+ } else {
+ if (strcmp(cur, "..") == 0) {
+ folder = g_strndup(session->folder,
+ delim - session->folder);
+ } else {
+ if (g_str_has_suffix(session->folder, "/"))
+ folder = g_strconcat(session->folder,
+ cur, NULL);
+ else
+ folder = g_strconcat(session->folder, "/",
+ cur, NULL);
+ }
+ }
+ g_free(session->folder);
+ session->folder = folder;
+}
+
static void setpath_cb(GObex *obex, GError *err, GObexPacket *rsp,
gpointer user_data)
{
struct pending_request *p = user_data;
struct setpath_data *data = p->data;
char *next;
+ char *current;
guint8 code;
p->req_id = 0;
return;
}
+ current = data->remaining[data->index - 1];
+ setpath_set_folder(p->session, current);
+
/* Ignore empty folder names to avoid resetting the current path */
while ((next = data->remaining[data->index]) && strlen(next) == 0)
data->index++;
diff --git a/obexd/client/session.h b/obexd/client/session.h
index 319d529..35899bc 100644
--- a/obexd/client/session.h
+++ b/obexd/client/session.h
const void *obc_session_get_attribute(struct obc_session *session,
int attribute_id);
+const char *obc_session_get_folder(struct obc_session *session);
+
guint obc_session_queue(struct obc_session *session,
struct obc_transfer *transfer,
session_callback_t func, void *user_data,