summaryrefslogtreecommitdiff
path: root/libgphoto2/gphoto2-filesys.c
diff options
context:
space:
mode:
authorMarcus Meissner <marcus@jet.franken.de>2012-03-11 23:14:01 +0000
committerMarcus Meissner <marcus@jet.franken.de>2012-03-11 23:14:01 +0000
commit7453186e26dbe3fe2569da76cc4637a776996998 (patch)
treef730a40a137b2a37d7bf089066606caef2d78f09 /libgphoto2/gphoto2-filesys.c
parent975553f8b29e46847e6ee214b0b4af5f583260fc (diff)
downloadlibgphoto2-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.c65
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);
}