diff options
author | Marcus Meissner <marcus@jet.franken.de> | 2012-03-11 23:14:01 +0000 |
---|---|---|
committer | Marcus Meissner <marcus@jet.franken.de> | 2012-03-11 23:14:01 +0000 |
commit | 7453186e26dbe3fe2569da76cc4637a776996998 (patch) | |
tree | f730a40a137b2a37d7bf089066606caef2d78f09 /libgphoto2/gphoto2-filesys.c | |
parent | 975553f8b29e46847e6ee214b0b4af5f583260fc (diff) | |
download | libgphoto2-7453186e26dbe3fe2569da76cc4637a776996998.tar.gz |
fixed conflict between folder index read and folder file append from cameralib during capture
git-svn-id: https://svn.code.sf.net/p/gphoto/code/trunk/libgphoto2@13901 67ed7778-7388-44ab-90cf-0a291f65f57c
Diffstat (limited to 'libgphoto2/gphoto2-filesys.c')
-rw-r--r-- | libgphoto2/gphoto2-filesys.c | 65 |
1 files changed, 47 insertions, 18 deletions
diff --git a/libgphoto2/gphoto2-filesys.c b/libgphoto2/gphoto2-filesys.c index 0e33d9887..dc9d74cc4 100644 --- a/libgphoto2/gphoto2-filesys.c +++ b/libgphoto2/gphoto2-filesys.c @@ -712,34 +712,23 @@ gp_filesystem_free (CameraFilesystem *fs) * * \return a gphoto2 error code. **/ -int -gp_filesystem_append (CameraFilesystem *fs, const char *folder, +static int +internal_append (CameraFilesystem *fs, CameraFilesystemFolder *f, const char *filename, GPContext *context) { CameraFilesystemFile **new; - CameraFilesystemFolder *f; - CHECK_NULL (fs && folder); - CC (context); - CA (folder, context); + CHECK_NULL (fs && f); - gp_log (GP_LOG_DEBUG, "gphoto2-filesystem", "Append %s/%s to filesystem", folder, filename); + gp_log (GP_LOG_DEBUG, "gphoto2-filesystem", "Internal append %s to folder %s", filename, f->name); /* Check folder for existence, if not, create it. */ - f = lookup_folder (fs, fs->rootfolder, folder, context); - if (!f) - CR (append_folder (fs, folder, &f, context)); - new = &f->files; while (*new) { if (!strcmp((*new)->name, filename)) break; new = &((*new)->next); } - if (*new) { - gp_context_error (context, - _("Could not append '%s' to folder '%s' because " - "this file already exists."), filename, folder); + if (*new) return (GP_ERROR_FILE_EXISTS); - } CHECK_MEM ((*new) = calloc (sizeof (CameraFilesystemFile), 1)) (*new)->name = strdup (filename); @@ -749,15 +738,55 @@ gp_filesystem_append (CameraFilesystem *fs, const char *folder, return (GP_ERROR_NO_MEMORY); } (*new)->info_dirty = 1; - f->files_dirty = 0; return (GP_OK); } +int +gp_filesystem_append (CameraFilesystem *fs, const char *folder, + const char *filename, GPContext *context) +{ + CameraFilesystemFolder *f; + int ret; + + CHECK_NULL (fs && folder); + CC (context); + CA (folder, context); + + gp_log (GP_LOG_DEBUG, "gphoto2-filesystem", "Append %s/%s to filesystem", folder, filename); + /* Check folder for existence, if not, create it. */ + f = lookup_folder (fs, fs->rootfolder, folder, context); + if (!f) + CR (append_folder (fs, folder, &f, context)); + if (f->files_dirty) { /* Need to load folder from driver first ... capture case */ + CameraList *xlist; + int ret; + + ret = gp_list_new (&xlist); + if (ret != GP_OK) return ret; + ret = gp_filesystem_list_files (fs, folder, xlist, context); + gp_list_free (xlist); + if (ret != GP_OK) return ret; + } + ret = internal_append (fs, f, filename, context); + if (ret == GP_ERROR_FILE_EXISTS) /* not an error here ... just in case we add files twice to the list */ + ret = GP_OK; + return ret; +} + + static void recursive_fs_dump (CameraFilesystemFolder *folder, int depth) { CameraFilesystemFolder *f; + CameraFilesystemFile *xfile; gp_log (GP_LOG_DEBUG, "gphoto2-filesys", "%*sFolder %s", depth, " ", folder->name); + + xfile = folder->files; + while (xfile) { + gp_log (GP_LOG_DEBUG, "gphoto2-filesys", "%*s %s", depth, " ", xfile->name); + xfile = xfile->next; + } + f = folder->folders; while (f) { recursive_fs_dump (f, depth+4); @@ -952,7 +981,7 @@ gp_filesystem_list_files (CameraFilesystem *fs, const char *folder, CR (gp_list_get_name (list, y, &name)); gp_log (GP_LOG_DEBUG, "gphoto2-filesystem", "Added '%s'", name); - CR (gp_filesystem_append (fs, folder, name, context)); + CR (internal_append (fs, f, name, context)); } gp_list_reset (list); } |