[PATCH obexd v3 1/3] MAP/dummy: Actual code for folder listing retrieval
From: Slawomir Bochenski <hidden>
Date: 2012-03-09 07:06:32
--- v3: Corrected wrong value passed to strerror after v2 fixes plugins/messages-dummy.c | 63 +++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 62 insertions(+), 1 deletions(-)
diff --git a/plugins/messages-dummy.c b/plugins/messages-dummy.c
index db15a75..cfb24e2 100644
--- a/plugins/messages-dummy.c
+++ b/plugins/messages-dummy.c@@ -31,6 +31,8 @@ #include <stdlib.h> #include <string.h> +#include "log.h" + #include "messages.h" static char *root_folder = NULL;
@@ -50,9 +52,68 @@ struct folder_listing_data { void *user_data; }; +static char *get_next_subdir(DIR *dp, char *path) +{ + struct dirent *ep; + char *abs, *name; + + for (;;) { + if ((ep = readdir(dp)) == NULL) + return NULL; + + if (strcmp(ep->d_name, ".") == 0 || strcmp(ep->d_name, "..") == 0) + continue; + + abs = g_build_filename(path, ep->d_name, NULL); + + if (g_file_test(abs, G_FILE_TEST_IS_DIR)) { + g_free(abs); + break; + } + + g_free(abs); + } + + name = g_filename_to_utf8(ep->d_name, -1, NULL, NULL, NULL); + + if (name == NULL) { + DBG("g_filename_to_utf8(): invalid filename"); + return NULL; + } + + return name; +} + static ssize_t get_subdirs(struct folder_listing_data *fld, GSList **list) { - return 0; + DIR *dp; + char *path, *name; + size_t n; + + path = g_build_filename(fld->session->cwd_absolute, fld->name, NULL); + dp = opendir(path); + + if (dp == NULL) { + int err = -errno; + + DBG("opendir(): %d, %s", -err, strerror(-err)); + g_free(path); + + return err; + } + + n = 0; + + while ((name = get_next_subdir(dp, path)) != NULL) { + n++; + if (fld->max > 0) + *list = g_slist_prepend(*list, name); + } + + closedir(dp); + g_free(path); + + return n; } static void return_folder_listing(struct folder_listing_data *fld, GSList *list)
--
1.7.4.1