libgphoto2 photo camera library (libgphoto2) Internals
2.5.23
|
Go to the documentation of this file.
26 #define _DEFAULT_SOURCE
42 # include <libexif/exif-data.h>
48 # define _(String) dgettext (GETTEXT_PACKAGE, String)
50 # define N_(String) gettext_noop (String)
52 # define N_(String) (String)
55 # define textdomain(String) (String)
56 # define gettext(String) (String)
57 # define dgettext(Domain,Message) (Message)
58 # define dcgettext(Domain,Message,Type) (Message)
59 # define bindtextdomain(Domain,Directory) (Domain)
60 # define _(String) (String)
61 # define N_(String) (String)
65 # define PATH_MAX 4096
102 #define PICTURES_TO_KEEP 2
112 const char *folder,
const char *filename,
122 get_time_from_exif_tag(ExifEntry *e) {
125 e->data[4] = e->data[ 7] = e->data[10] = e->data[13] = e->data[16] = 0;
126 ts.tm_year = atoi ((
char*)e->data) - 1900;
127 ts.tm_mon = atoi ((
char*)(e->data + 5)) - 1;
128 ts.tm_mday = atoi ((
char*)(e->data + 8));
129 ts.tm_hour = atoi ((
char*)(e->data + 11));
130 ts.tm_min = atoi ((
char*)(e->data + 14));
131 ts.tm_sec = atoi ((
char*)(e->data + 17));
137 get_exif_mtime (
const unsigned char *data,
unsigned long size)
141 time_t t, t1 = 0, t2 = 0, t3 = 0;
143 ed = exif_data_new_from_data (data, size);
145 GP_LOG_E (
"Could not parse data for EXIF information.");
152 #ifdef HAVE_LIBEXIF_IFD
153 e = exif_content_get_entry (ed->ifd[EXIF_IFD_0], EXIF_TAG_DATE_TIME);
155 t1 = get_time_from_exif_tag(e);
156 e = exif_content_get_entry (ed->ifd[EXIF_IFD_EXIF],
157 EXIF_TAG_DATE_TIME_ORIGINAL);
159 t2 = get_time_from_exif_tag(e);
160 e = exif_content_get_entry (ed->ifd[EXIF_IFD_EXIF],
161 EXIF_TAG_DATE_TIME_DIGITIZED);
163 t3 = get_time_from_exif_tag(e);
165 e = exif_content_get_entry (ed->ifd0, EXIF_TAG_DATE_TIME);
167 t1 = get_time_from_exif_tag(e);
170 e = exif_content_get_entry (ed->ifd_exif,
171 EXIF_TAG_DATE_TIME_ORIGINAL);
173 t2 = get_time_from_exif_tag(e);
176 e = exif_content_get_entry (ed->ifd_exif,
177 EXIF_TAG_DATE_TIME_DIGITIZED);
179 t3 = get_time_from_exif_tag(e);
183 exif_data_unref (ed);
184 if (!t1 && !t2 && !t3) {
185 GP_LOG_D (
"EXIF data has not date/time tags.");
197 GP_LOG_D (
"Found time in EXIF data: '%s'.", asctime (localtime (&t)));
203 const char *filename)
206 const char *data = NULL;
207 unsigned long int size = 0;
214 if ( !strstr(filename,
"jpg") && !strstr(filename,
"JPG") &&
215 !strstr(filename,
"jpeg") && !strstr(filename,
"JPEG")
222 GP_LOG_E (
"Could not get EXIF data of '%s' in folder '%s'.",
229 t = get_exif_mtime ((
unsigned char*)data, size);
266 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
268 #define CR(result) {int __r = (result); if (__r < 0) return (__r);}
270 #define CL(result,list) \
272 int __r = (result); \
275 gp_list_free (list); \
280 #define CU(result,file) \
282 int __r = (result); \
285 gp_file_unref (file); \
290 #define CC(context) \
292 if (gp_context_cancel (context) == GP_CONTEXT_FEEDBACK_CANCEL) \
293 return GP_ERROR_CANCEL; \
298 if ((f)[0] != '/') { \
299 gp_context_error ((c), \
300 _("The path '%s' is not absolute."), (f)); \
301 return (GP_ERROR_PATH_NOT_ABSOLUTE); \
311 GP_LOG_D (
"Delete all files in folder %p/%s", folder, folder->
name);
313 file = folder->
files;
347 folder->
files = NULL;
357 GP_LOG_D (
"Delete one folder %p/%s", *folder, (*folder)->
name);
358 next = (*folder)->
next;
360 free ((*folder)->name);
373 const char *curpt = foldername;
376 GP_LOG_D (
"Lookup folder '%s'...", foldername);
379 while (curpt[0]==
'/')
382 GP_LOG_D (
"Found! %s is %p", foldername, folder);
386 s = strchr(curpt,
'/');
390 char *copy = strdup (foldername);
397 copy[curpt-foldername] =
'\0';
398 GP_LOG_D (
"Folder %s is dirty. "
399 "Listing folders in there to make folder clean...", copy);
404 GP_LOG_D (
"Done making folder %s clean...", copy);
406 GP_LOG_D (
"Making folder %s clean failed: %d", copy, ret);
413 if (!strncmp(f->
name,curpt, (s-curpt)) &&
414 (strlen(f->
name) == (s-curpt))
421 if (!strcmp(f->
name,curpt))
434 const char *folder,
const char *filename,
441 GP_LOG_D (
"Lookup folder %s file %s", folder, filename);
451 GP_LOG_D (
"Folder %s is dirty. "
452 "Listing files in there to make folder clean...", folder);
457 GP_LOG_D (
"Done making folder %s clean...", folder);
460 GP_LOG_D (
"Making folder %s clean failed: %d", folder, ret);
465 if (!strcmp (f->
name, filename)) {
480 GP_LOG_D (
"Recurse delete folder %p/%s", folder, folder->
name);
495 GP_LOG_D (
"Internally deleting "
496 "all folders from '%s'...", foldername);
498 C_PARAMS (fs && foldername);
500 CA (foldername, context);
503 if (!folder)
return GP_OK;
516 GP_LOG_D (
"Append one folder %s", name);
518 f->
name = strdup (name);
529 if (newfolder) *newfolder = f;
536 const char *foldername,
542 GP_LOG_D (
"Append to folder %p/%s - %s", folder, folder->
name, foldername);
544 while (foldername[0]==
'/')
546 if (!foldername[0]) {
547 if (newfolder) *newfolder = folder;
551 s = strchr(foldername,
'/');
555 if (!strncmp(f->
name,foldername, (s-foldername)) &&
556 (strlen(f->
name) == (s-foldername))
560 if (!strcmp(f->
name,foldername)) {
561 if (newfolder) *newfolder = f;
570 C_MEM (x = calloc ((s-foldername)+1,1));
571 memcpy (x, foldername, (s-foldername));
587 GP_LOG_D (
"Appending folder %s...", folder);
591 CA (folder, context);
600 C_PARAMS (fs && file);
601 GP_LOG_D (
"Appending file %s...", name);
603 new = &folder->
files;
605 if (!strcmp((*new)->name, name)) {
606 GP_LOG_E (
"File %s already exists!", name);
609 new = &((*new)->next);
614 C_MEM ((*new)->name = strdup (name));
615 (*new)->info_dirty = 1;
616 (*new)->normal = file;
633 GP_LOG_D (
"resetting filesystem");
640 GP_LOG_E (
"root folder is gone?");
662 if (!(*fs)->rootfolder) {
666 (*fs)->rootfolder->name = strdup(
"/");
667 if (!(*fs)->rootfolder->name) {
668 free ((*fs)->rootfolder);
672 (*fs)->rootfolder->files_dirty = 1;
673 (*fs)->rootfolder->folders_dirty = 1;
715 const char *filename,
GPContext *context)
721 GP_LOG_D (
"Internal append %s to folder %s", filename, f->
name);
725 if (!strcmp((*new)->name, filename))
break;
726 new = &((*new)->next);
732 (*new)->name = strdup (filename);
738 (*new)->info_dirty = 1;
744 const char *filename,
GPContext *context)
749 C_PARAMS (fs && folder);
751 CA (folder, context);
753 GP_LOG_D (
"Append %s/%s to filesystem", folder, filename);
763 if (ret !=
GP_OK)
return ret;
766 if (ret !=
GP_OK)
return ret;
770 if (filename && strlen(filename)!=0)
783 GP_LOG_D (
"%*sFolder %s", depth,
" ", folder->
name);
785 xfile = folder->
files;
787 GP_LOG_D (
"%*s %s", depth,
" ", xfile->
name);
807 GP_LOG_D (
"Dumping Filesystem:");
844 prev = &(folder->
files);
845 while ((*prev) && ((*prev) != file))
846 prev = &((*prev)->next);
864 GP_LOG_D (
"Deleting all 1 by 1 from %s", folder);
868 for (x = count ; x--; ) {
897 C_PARAMS (fs && folder);
899 CA (folder, context);
901 GP_LOG_D (
"Deleting all from %s", folder);
921 "delete_all failed (%s). Falling back to "
922 "deletion one-by-one.",
960 GP_LOG_D (
"Listing files in %s", folder);
962 C_PARAMS (fs && list && folder);
964 CA (folder, context);
974 GP_LOG_D (
"Querying folder %s...", folder);
983 for (y = 0; y < count; y++) {
985 GP_LOG_D (
"Added '%s'", name);
996 "Listed '%s'", file->
name);
1025 GP_LOG_D (
"Listing folders in %s", folder);
1027 C_PARAMS (fs && folder && list);
1029 CA (folder, context);
1040 GP_LOG_D (
"... is dirty, getting from camera");
1042 fs->
data, context));
1046 for (y = 0; y < count; y++) {
1061 GP_LOG_D (
"Folder %s contains %i subfolders.", folder,
gp_list_count (list));
1083 C_PARAMS (fs && folder);
1085 CA (folder, context);
1114 const char *filename,
GPContext *context)
1119 C_PARAMS (fs && folder && filename);
1121 CA (folder, context);
1126 "'%s' from folder '%s', but the filesystem does not "
1127 "support deletion of files."), filename, folder);
1134 GP_LOG_D (
"Deleting '%s' from folder '%s'...", filename, folder);
1138 fs->
data, context));
1158 const char *filename,
GPContext *context)
1163 C_PARAMS (fs && folder && filename);
1165 CA (folder, context);
1188 C_PARAMS (fs && folder && name);
1190 CA (folder, context);
1223 C_PARAMS (fs && folder && name);
1225 CA (folder, context);
1244 GP_LOG_D (
"Folder %s is dirty. "
1245 "Listing folders in there to make folder clean...", folder);
1250 GP_LOG_D (
"Done making folder %s clean...", folder);
1255 if (!strcmp (name, (*prev)->name))
1257 prev = &((*prev)->next);
1261 if ((*prev)->folders) {
1263 "folder '%s/%s' that you are trying to remove."), folder, name);
1266 if ((*prev)->files) {
1268 "folder '%s/%s' that you are trying to remove."), folder,name);
1293 const char *folder,
const char *filename,
1300 C_PARAMS (fs && folder && file);
1302 CA (folder, context);
1307 "upload of files."));
1318 ret =
append_file (fs, f, filename, file, context);
1339 const char **filename,
GPContext *context)
1344 C_PARAMS (fs && folder);
1346 CA (folder, context);
1354 if (filenumber == 0)
1363 "%i files, but you requested a file with number %i."),
1364 folder, count, filenumber);
1367 *filename = file->
name;
1385 const char *filename,
GPContext *context)
1392 C_PARAMS (fs && folder && filename);
1394 CA (folder, context);
1402 if (!strcmp (file->
name, filename))
1411 "in folder '%s'."), filename, folder);
1423 const char *filename,
GPContext *context)
1430 GP_LOG_D (
"Scanning %s for %s...", folder, filename);
1432 C_PARAMS (fs && folder && filename);
1434 CA (folder, context);
1439 for (x = 0; x < count; x++) {
1441 if (!strcmp (filename, name)) {
1449 for (x = 0; x < count; x++) {
1451 strncpy (path, folder,
sizeof (path));
1452 if (path[strlen (path) - 1] !=
'/')
1453 strncat (path,
"/",
sizeof (path) - strlen (path) - 1);
1454 strncat (path, name,
sizeof (path) - strlen (path) - 1);
1470 file = folder->
files;
1472 if (!strcmp(file->
name, lookforfile)) {
1473 *foldername = strdup (folder->
name);
1483 C_MEM ((*foldername) = malloc (strlen (folder->
name) + 1 + strlen (xfolder) + 1));
1484 strcpy ((*foldername),folder->
name);
1485 strcat ((*foldername),
"/");
1486 strcat ((*foldername),xfolder);
1520 C_PARAMS (fs && filename && folder);
1526 if (ret ==
GP_OK)
return ret;
1540 C_PARAMS (fs && folder && file && filename);
1542 CA (folder, context);
1544 GP_LOG_D (
"Getting file '%s' from folder '%s' (type %i)...",
1545 filename, folder, type);
1551 _(
"The filesystem doesn't support getting files"));
1589 GP_LOG_D (
"LRU cache used for type %d!", type);
1593 GP_LOG_D (
"Downloading '%s' from folder '%s'...", filename, folder);
1596 fs->
data, context));
1641 const char *data = NULL;
1643 unsigned int buf_size;
1644 unsigned long int size = 0;
1659 GP_LOG_D (
"Getting previews is not supported. Trying EXIF data...");
1664 ed = exif_data_new_from_data ((
unsigned char*)data, size);
1667 GP_LOG_E (
"Could not parse EXIF data of '%s' in folder '%s'.", filename, folder);
1671 GP_LOG_E (
"EXIF data does not contain a thumbnail.");
1672 exif_data_unref (ed);
1682 exif_data_unref (ed);
1687 exif_data_unref (ed);
1693 GP_LOG_D (
"Getting previews is not supported and "
1694 "libgphoto2 has been compiled without exif "
1706 GP_LOG_D (
"Getting EXIF data is not supported. Trying thumbnail...");
1711 ed = exif_data_new_from_data ((
unsigned char*)data, size);
1714 GP_LOG_D (
"Could not parse EXIF data of thumbnail of "
1715 "'%s' in folder '%s'.", filename, folder);
1718 exif_data_save_data (ed, &buf, &buf_size);
1719 exif_data_unref (ed);
1730 GP_LOG_D (
"Getting EXIF data is not supported and libgphoto2 "
1731 "has been compiled without EXIF support.");
1735 GP_LOG_D (
"Download of '%s' from '%s' (type %i) failed. "
1736 "Reason: '%s'", filename, folder, type,
1769 uint64_t offset,
char *buf, uint64_t *size,
1774 unsigned long xsize;
1777 C_PARAMS (fs && folder && filename && buf && size);
1779 CA (folder, context);
1783 offset, buf, size, fs->
data, context);
1795 if (offset > *size) {
1800 if ((offset != 0) || (offset + *size != xsize)) {
1806 if (offset + (*size) > xsize)
1807 *size = xsize-offset;
1808 memcpy (buf, xdata+offset, *size);
1867 C_PARAMS (fs && folder && filename && info);
1869 CA (folder, context);
1871 GP_LOG_D (
"Getting information about '%s' in '%s'...", filename,
1876 _(
"The filesystem doesn't support getting file "
1887 fs->
data, context));
1897 GP_LOG_D (
"Did not get mtime. Trying EXIF information...");
1898 t = gp_filesystem_get_exif_mtime (fs, folder, filename);
1915 GP_LOG_D (
"Clearing fscache LRU list...");
1918 GP_LOG_D (
"fscache LRU list already empty");
1923 while (ptr != NULL) {
1926 GP_LOG_D (
"fscache LRU list corrupted (%i)", n);
1940 GP_LOG_D (
"fscache LRU list cleared (removed %i items)", n);
1987 unsigned long int size;
1993 GP_LOG_D (
"Freeing cached data for file '%s'...", ptr->
name);
2043 const char *folder,
const char *filename,
2050 unsigned long int size;
2052 char cached_images[1024];
2054 C_PARAMS (fs && folder && file);
2089 GP_LOG_D (
"Adding file '%s' from folder '%s' to the fscache LRU list "
2090 "(type %i)...", filename, folder, type);
2106 oldfile = xfile->
raw;
2109 oldfile = xfile->
audio;
2149 GP_LOG_D (
"File '%s' from folder '%s' added in fscache LRU list.",
2161 GP_LOG_D (
"Checking fscache LRU list integrity...");
2164 GP_LOG_D (
"fscache LRU list empty");
2169 while (ptr != NULL) {
2172 GP_LOG_E (
"fscache LRU list corrupted (%i)", n);
2179 GP_LOG_D (
"fscache LRU list ok with %i items (%ld bytes)", n,
2201 const char *folder,
const char *filename,
2211 C_PARAMS (fs && folder && file);
2213 CA (folder, context);
2215 GP_LOG_D (
"Adding file '%s' to folder '%s' (type %i)...",
2216 filename, folder, type);
2256 xfile->
audio = file;
2281 GP_LOG_D (
"File does not contain mtime. Trying information on the file...");
2294 unsigned long int size;
2297 GP_LOG_D (
"Searching data for mtime...");
2299 if (size < 32*1024*1024) {
2301 t = get_exif_mtime ((
unsigned char*)data, size);
2309 GP_LOG_D (
"Trying EXIF information...");
2310 t = gp_filesystem_get_exif_mtime (fs, folder, filename);
2336 const char *folder,
const char *filename,
2342 C_PARAMS (fs && folder);
2344 CA (folder, context);
2375 C_PARAMS (fs && folder && filename);
2377 CA (folder, context);
2381 _(
"The filesystem doesn't support setting file "
2404 "like width and height can not be changed."));
2452 int *nrofstorageinfos,
2455 C_PARAMS (fs && storageinfo && nrofstorageinfos);
2460 _(
"The filesystem doesn't support getting storage "
2465 storageinfo, nrofstorageinfos,
int gp_file_set_mime_type(CameraFile *file, const char *mime_type)
static int lookup_folder_file(CameraFilesystem *fs, const char *folder, const char *filename, CameraFilesystemFolder **xfolder, CameraFilesystemFile **xfile, GPContext *context)
static int gp_filesystem_scan(CameraFilesystem *fs, const char *folder, const char *filename, GPContext *context)
int gp_file_unref(CameraFile *file)
Decrease reference counter for CameraFile object.
static int append_file(CameraFilesystem *fs, CameraFilesystemFolder *folder, const char *name, CameraFile *file, GPContext *context)
static void recursive_fs_dump(CameraFilesystemFolder *folder, int depth)
int gp_file_adjust_name_for_mime_type(CameraFile *file)
int gp_setting_set(char *id, char *key, char *value)
Set a specific gphoto setting.
CameraFilesystemListFunc file_list_func
CameraFilesystemPutFileFunc put_file_func
int gp_file_get_mtime(CameraFile *file, time_t *mtime)
int gp_file_new(CameraFile **file)
int gp_filesystem_get_folder(CameraFilesystem *fs, const char *filename, char **folder, GPContext *context)
Search a folder that contains a given filename.
int(* CameraFilesystemDeleteFileFunc)(CameraFilesystem *fs, const char *folder, const char *filename, void *data, GPContext *context)
struct _CameraFilesystemFolder * next
int gp_filesystem_get_info(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileInfo *info, GPContext *context)
Get information about the specified file.
CameraFilesystemDirFunc remove_dir_func
static int internal_append(CameraFilesystem *fs, CameraFilesystemFolder *f, const char *filename, GPContext *context)
Append a file to a folder in a filesystem.
CameraFilesystemDeleteAllFunc delete_all_func
CameraFilesystemSetInfoFunc set_info_func
int gp_list_get_name(CameraList *list, int index, const char **name)
int gp_filesystem_make_dir(CameraFilesystem *fs, const char *folder, const char *name, GPContext *context)
Create a subfolder within a folder.
#define GP_ERROR_FILE_NOT_FOUND
Specified file was not found.
struct _CameraFilesystemFolder CameraFilesystemFolder
int gp_filesystem_count(CameraFilesystem *fs, const char *folder, GPContext *context)
Count files a folder of a filesystem.
static int gp_filesystem_lru_remove_one(CameraFilesystem *fs, CameraFilesystemFile *item)
int gp_filesystem_append(CameraFilesystem *fs, const char *folder, const char *filename, GPContext *context)
CameraFilesystemDeleteAllFunc delete_all_func
CameraFileInfoPreview preview
CameraFilesystemDirFunc make_dir_func
@ GP_FILE_INFO_TYPE
The MIME type is set.
static int gp_filesystem_lru_free(CameraFilesystem *fs)
struct _CameraFilesystemFile * files
static int delete_file(CameraFilesystem *fs, CameraFilesystemFolder *folder, CameraFilesystemFile *file)
static int delete_all_folders(CameraFilesystem *fs, const char *foldername, GPContext *context)
int gp_list_count(CameraList *list)
int gp_filesystem_dump(CameraFilesystem *fs)
Dump the current filesystem.
int gp_filesystem_reset(CameraFilesystem *fs)
Clear the filesystem.
CameraFileInfoFields fields
Bitmask containing the set members.
struct _CameraFilesystemFile CameraFilesystemFile
int(* CameraFilesystemGetInfoFunc)(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileInfo *info, void *data, GPContext *context)
CameraFilePermissions permissions
Permissions of the file.
CameraFileInfoAudio audio
int gp_list_reset(CameraList *list)
#define GP_ERROR_NO_MEMORY
Out of memory.
CameraFilesystemStorageInfoFunc storage_info_func
CameraFilesystemListFunc folder_list_func
@ GP_FILE_INFO_HEIGHT
The height is set.
@ GP_FILE_INFO_WIDTH
The width is set.
#define GP_ERROR_FILE_EXISTS
File already exists.
int(* CameraFilesystemStorageInfoFunc)(CameraFilesystem *fs, CameraStorageInformation **, int *nrofstorageinformations, void *data, GPContext *context)
CameraFileType
The type of view on the specified file.
int gp_file_get_data_and_size(CameraFile *file, const char **data, unsigned long int *size)
CameraFilesystemListFunc file_list_func
int gp_file_set_name(CameraFile *file, const char *name)
int gp_list_free(CameraList *list)
@ GP_FILE_INFO_STATUS
The status is set (downloaded).
int gp_filesystem_set_info(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileInfo info, GPContext *context)
Set information about a file.
int gp_filesystem_delete_file(CameraFilesystem *fs, const char *folder, const char *filename, GPContext *context)
Delete a file from a folder.
CameraFilesystemGetInfoFunc get_info_func
CameraFileInfoFields fields
Bitmask containing the set members.
int gp_filesystem_free(CameraFilesystem *fs)
Free filesystem struct.
static int recurse_delete_folder(CameraFilesystem *fs, CameraFilesystemFolder *folder)
unsigned long int lru_size
int gp_list_append(CameraList *list, const char *name, const char *value)
CameraFileInfoFields fields
Bitmask containing the set members.
int gp_filesystem_put_file(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileType type, CameraFile *file, GPContext *context)
Upload a file to a folder on the device filesystem.
struct _CameraFilesystemFile * lru_prev
CameraFilesystemSetInfoFunc set_info_func
static int delete_folder(CameraFilesystem *fs, CameraFilesystemFolder **folder)
int gp_filesystem_set_file_noop(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileType type, CameraFile *file, GPContext *context)
Attach file content to a specified file.
CameraFilesystemFile * lru_first
#define GP_ERROR_BAD_PARAMETERS
Bad parameters passed.
int gp_filesystem_list_files(CameraFilesystem *fs, const char *folder, CameraList *list, GPContext *context)
Get the list of files in a folder.
static int gp_filesystem_lru_update(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileType type, CameraFile *file, GPContext *context)
int gp_filesystem_read_file(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileType type, uint64_t offset, char *buf, uint64_t *size, GPContext *context)
Get partial file data from the filesystem.
#define GP_OK
Everything is OK.
struct _CameraFilesystemFolder * folders
int gp_filesystem_set_funcs(CameraFilesystem *fs, CameraFilesystemFuncs *funcs, void *data)
Set all filesystem related function pointers.
int gp_filesystem_delete_file_noop(CameraFilesystem *fs, const char *folder, const char *filename, GPContext *context)
Delete a virtal file from a folder in the filesystem.
CameraFilesystemReadFileFunc read_file_func
static int recursive_folder_scan(CameraFilesystemFolder *folder, const char *lookforfile, char **foldername)
int(* CameraFilesystemListFunc)(CameraFilesystem *fs, const char *folder, CameraList *list, void *data, GPContext *context)
static int gp_filesystem_lru_check(CameraFilesystem *fs)
int gp_file_ref(CameraFile *file)
Increase reference counter for CameraFile object.
int(* CameraFilesystemGetFileFunc)(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileType type, CameraFile *file, void *data, GPContext *context)
CameraFilesystemGetFileFunc get_file_func
static int gp_filesystem_lru_count(CameraFilesystem *fs)
int(* CameraFilesystemDirFunc)(CameraFilesystem *fs, const char *folder, const char *name, void *data, GPContext *context)
time_t mtime
Modification time of the file.
CameraFilesystemGetFileFunc get_file_func
int gp_filesystem_set_info_noop(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileInfo info, GPContext *context)
Store the file information in the virtual fs.
int(* CameraFilesystemDeleteAllFunc)(CameraFilesystem *fs, const char *folder, void *data, GPContext *context)
CameraFilesystemDirFunc remove_dir_func
Filesystem related operations and declarations.
File information structure.
static int append_folder_one(CameraFilesystemFolder *folder, const char *name, CameraFilesystemFolder **newfolder)
#define GP_ERROR
Generic Error.
int gp_setting_get(char *id, char *key, char *value)
Retrieve a specific gphoto setting.
static int append_folder(CameraFilesystem *fs, const char *folder, CameraFilesystemFolder **newfolder, GPContext *context)
int(* CameraFilesystemPutFileFunc)(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileType type, CameraFile *file, void *data, GPContext *context)
static int gp_filesystem_lru_clear(CameraFilesystem *fs)
@ GP_FILE_INFO_PERMISSIONS
The access permissions are set.
const char * gp_result_as_string(int result)
Translate a gphoto error code into a localized string.
int gp_filesystem_new(CameraFilesystem **fs)
Create a new filesystem struct.
CameraFilesystemDeleteFileFunc del_file_func
struct _CameraFilesystemFile * next
static int delete_all_files(CameraFilesystem *fs, CameraFilesystemFolder *folder)
void gp_context_error(GPContext *context, const char *format,...)
struct _CameraFilesystemFile * lru_next
CameraFilesystemReadFileFunc read_file_func
int gp_list_new(CameraList **list)
Creates a new CameraList.
int gp_file_set_mtime(CameraFile *file, time_t mtime)
CameraFilesystemListFunc folder_list_func
@ GP_FILE_INFO_SIZE
The filesize is set.
CameraFilesystemPutFileFunc put_file_func
CameraFilesystemDirFunc make_dir_func
#define GP_ERROR_CORRUPTED_DATA
Corrupted data received.
int gp_filesystem_get_file(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileType type, CameraFile *file, GPContext *context)
Get file data from the filesystem.
CameraFilesystemStorageInfoFunc storage_info_func
The internal camera filesystem structure.
int gp_file_copy(CameraFile *destination, CameraFile *source)
int gp_filesystem_number(CameraFilesystem *fs, const char *folder, const char *filename, GPContext *context)
Get the index of a file in specified folder.
static int gp_filesystem_delete_all_one_by_one(CameraFilesystem *fs, const char *folder, GPContext *context)
CameraFilesystemFolder * rootfolder
@ GP_FILE_INFO_MTIME
The modification time is set.
int gp_filesystem_remove_dir(CameraFilesystem *fs, const char *folder, const char *name, GPContext *context)
Remove a subfolder from within a folder.
int gp_filesystem_get_storageinfo(CameraFilesystem *fs, CameraStorageInformation **storageinfo, int *nrofstorageinfos, GPContext *context)
Get the storage information about this filesystem.
static int pictures_to_keep
static int append_to_folder(CameraFilesystemFolder *folder, const char *foldername, CameraFilesystemFolder **newfolder)
int gp_filesystem_name(CameraFilesystem *fs, const char *folder, int filenumber, const char **filename, GPContext *context)
Lookup the filename of an indexed file within a folder.
CameraFilesystemDeleteFileFunc delete_file_func
int gp_filesystem_delete_all(CameraFilesystem *fs, const char *folder, GPContext *context)
Delete all files in specified folder.
int(* CameraFilesystemSetInfoFunc)(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileInfo info, void *data, GPContext *context)
int gp_file_set_data_and_size(CameraFile *file, char *data, unsigned long int size)
int(* CameraFilesystemReadFileFunc)(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileType type, uint64_t offset, char *buf, uint64_t *size, void *data, GPContext *context)
#define GP_ERROR_DIRECTORY_EXISTS
Specified directory already exists.
static int gp_filesystem_get_file_impl(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileType type, CameraFile *file, GPContext *context)
int gp_filesystem_list_folders(CameraFilesystem *fs, const char *folder, CameraList *list, GPContext *context)
List all subfolders within a filesystem folder.
#define GP_ERROR_DIRECTORY_NOT_FOUND
Specified directory was not found.
#define GP_ERROR_NOT_SUPPORTED
Functionality not supported.
CameraFilesystemGetInfoFunc get_info_func
static CameraFilesystemFolder * lookup_folder(CameraFilesystem *fs, CameraFilesystemFolder *folder, const char *foldername, GPContext *context)
CameraFilesystemFile * lru_last