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 ((ssize_t)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 ((ssize_t)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");
644 GP_LOG_E (
"root folder is gone?");
666 if (!(*fs)->rootfolder) {
670 (*fs)->rootfolder->name = strdup(
"/");
671 if (!(*fs)->rootfolder->name) {
672 free ((*fs)->rootfolder);
676 (*fs)->rootfolder->files_dirty = 1;
677 (*fs)->rootfolder->folders_dirty = 1;
719 const char *filename,
GPContext *context)
725 GP_LOG_D (
"Internal append %s to folder %s", filename, f->
name);
729 if (!strcmp((*new)->name, filename))
break;
730 new = &((*new)->next);
736 (*new)->name = strdup (filename);
742 (*new)->info_dirty = 1;
748 const char *filename,
GPContext *context)
753 C_PARAMS (fs && folder);
755 CA (folder, context);
757 GP_LOG_D (
"Append %s/%s to filesystem", folder, filename);
767 if (ret !=
GP_OK)
return ret;
770 if (ret !=
GP_OK)
return ret;
774 if (filename && strlen(filename)!=0)
787 GP_LOG_D (
"%*sFolder %s", depth,
" ", folder->
name);
789 xfile = folder->
files;
791 GP_LOG_D (
"%*s %s", depth,
" ", xfile->
name);
811 GP_LOG_D (
"Dumping Filesystem:");
848 prev = &(folder->
files);
849 while ((*prev) && ((*prev) != file))
850 prev = &((*prev)->next);
868 GP_LOG_D (
"Deleting all 1 by 1 from %s", folder);
872 for (x = count ; x--; ) {
901 C_PARAMS (fs && folder);
903 CA (folder, context);
905 GP_LOG_D (
"Deleting all from %s", folder);
925 "delete_all failed (%s). Falling back to "
926 "deletion one-by-one.",
964 GP_LOG_D (
"Listing files in %s", folder);
966 C_PARAMS (fs && list && folder);
968 CA (folder, context);
978 GP_LOG_D (
"Querying folder %s...", folder);
987 for (y = 0; y < count; y++) {
989 GP_LOG_D (
"Added '%s'", name);
1000 "Listed '%s'", file->
name);
1029 GP_LOG_D (
"Listing folders in %s", folder);
1031 C_PARAMS (fs && folder && list);
1033 CA (folder, context);
1044 GP_LOG_D (
"... is dirty, getting from camera");
1046 fs->
data, context));
1050 for (y = 0; y < count; y++) {
1065 GP_LOG_D (
"Folder %s contains %i subfolders.", folder,
gp_list_count (list));
1087 C_PARAMS (fs && folder);
1089 CA (folder, context);
1118 const char *filename,
GPContext *context)
1123 C_PARAMS (fs && folder && filename);
1125 CA (folder, context);
1130 "'%s' from folder '%s', but the filesystem does not "
1131 "support deletion of files."), filename, folder);
1138 GP_LOG_D (
"Deleting '%s' from folder '%s'...", filename, folder);
1142 fs->
data, context));
1162 const char *filename,
GPContext *context)
1167 C_PARAMS (fs && folder && filename);
1169 CA (folder, context);
1192 C_PARAMS (fs && folder && name);
1194 CA (folder, context);
1227 C_PARAMS (fs && folder && name);
1229 CA (folder, context);
1248 GP_LOG_D (
"Folder %s is dirty. "
1249 "Listing folders in there to make folder clean...", folder);
1254 GP_LOG_D (
"Done making folder %s clean...", folder);
1259 if (!strcmp (name, (*prev)->name))
1261 prev = &((*prev)->next);
1265 if ((*prev)->folders) {
1267 "folder '%s/%s' that you are trying to remove."), folder, name);
1270 if ((*prev)->files) {
1272 "folder '%s/%s' that you are trying to remove."), folder,name);
1297 const char *folder,
const char *filename,
1304 C_PARAMS (fs && folder && file);
1306 CA (folder, context);
1311 "upload of files."));
1322 ret =
append_file (fs, f, filename, file, context);
1343 const char **filename,
GPContext *context)
1348 C_PARAMS (fs && folder);
1350 CA (folder, context);
1358 if (filenumber == 0)
1367 "%i files, but you requested a file with number %i."),
1368 folder, count, filenumber);
1371 *filename = file->
name;
1389 const char *filename,
GPContext *context)
1396 C_PARAMS (fs && folder && filename);
1398 CA (folder, context);
1406 if (!strcmp (file->
name, filename))
1415 "in folder '%s'."), filename, folder);
1427 const char *filename,
GPContext *context)
1434 GP_LOG_D (
"Scanning %s for %s...", folder, filename);
1436 C_PARAMS (fs && folder && filename);
1438 CA (folder, context);
1443 for (x = 0; x < count; x++) {
1445 if (!strcmp (filename, name)) {
1453 for (x = 0; x < count; x++) {
1455 strncpy (path, folder,
sizeof (path));
1456 if (path[strlen (path) - 1] !=
'/')
1457 strncat (path,
"/",
sizeof (path) - strlen (path) - 1);
1458 strncat (path, name,
sizeof (path) - strlen (path) - 1);
1474 file = folder->
files;
1476 if (!strcmp(file->
name, lookforfile)) {
1477 *foldername = strdup (folder->
name);
1487 C_MEM ((*foldername) = malloc (strlen (folder->
name) + 1 + strlen (xfolder) + 1));
1488 strcpy ((*foldername),folder->
name);
1489 strcat ((*foldername),
"/");
1490 strcat ((*foldername),xfolder);
1524 C_PARAMS (fs && filename && folder);
1530 if (ret ==
GP_OK)
return ret;
1544 C_PARAMS (fs && folder && file && filename);
1546 CA (folder, context);
1548 GP_LOG_D (
"Getting file '%s' from folder '%s' (type %i)...",
1549 filename, folder, type);
1555 _(
"The filesystem doesn't support getting files"));
1593 GP_LOG_D (
"LRU cache used for type %d!", type);
1597 GP_LOG_D (
"Downloading '%s' from folder '%s'...", filename, folder);
1600 fs->
data, context));
1645 const char *data = NULL;
1647 unsigned int buf_size;
1648 unsigned long int size = 0;
1663 GP_LOG_D (
"Getting previews is not supported. Trying EXIF data...");
1668 ed = exif_data_new_from_data ((
unsigned char*)data, size);
1671 GP_LOG_E (
"Could not parse EXIF data of '%s' in folder '%s'.", filename, folder);
1675 GP_LOG_E (
"EXIF data does not contain a thumbnail.");
1676 exif_data_unref (ed);
1686 exif_data_unref (ed);
1691 exif_data_unref (ed);
1697 GP_LOG_D (
"Getting previews is not supported and "
1698 "libgphoto2 has been compiled without exif "
1710 GP_LOG_D (
"Getting EXIF data is not supported. Trying thumbnail...");
1715 ed = exif_data_new_from_data ((
unsigned char*)data, size);
1718 GP_LOG_D (
"Could not parse EXIF data of thumbnail of "
1719 "'%s' in folder '%s'.", filename, folder);
1722 exif_data_save_data (ed, &buf, &buf_size);
1723 exif_data_unref (ed);
1734 GP_LOG_D (
"Getting EXIF data is not supported and libgphoto2 "
1735 "has been compiled without EXIF support.");
1739 GP_LOG_D (
"Download of '%s' from '%s' (type %i) failed. "
1740 "Reason: '%s'", filename, folder, type,
1773 uint64_t offset,
char *buf, uint64_t *size,
1778 unsigned long xsize;
1781 C_PARAMS (fs && folder && filename && buf && size);
1783 CA (folder, context);
1787 offset, buf, size, fs->
data, context);
1799 if (offset > *size) {
1804 if ((offset != 0) || (offset + *size != xsize)) {
1810 if (offset + (*size) > xsize)
1811 *size = xsize-offset;
1812 memcpy (buf, xdata+offset, *size);
1871 C_PARAMS (fs && folder && filename && info);
1873 CA (folder, context);
1875 GP_LOG_D (
"Getting information about '%s' in '%s'...", filename,
1880 _(
"The filesystem doesn't support getting file "
1891 fs->
data, context));
1901 GP_LOG_D (
"Did not get mtime. Trying EXIF information...");
1902 t = gp_filesystem_get_exif_mtime (fs, folder, filename);
1919 GP_LOG_D (
"Clearing fscache LRU list...");
1922 GP_LOG_D (
"fscache LRU list already empty");
1927 while (ptr != NULL) {
1930 GP_LOG_D (
"fscache LRU list corrupted (%i)", n);
1944 GP_LOG_D (
"fscache LRU list cleared (removed %i items)", n);
1991 unsigned long int size;
1997 GP_LOG_D (
"Freeing cached data for file '%s'...", ptr->
name);
2047 const char *folder,
const char *filename,
2054 unsigned long int size;
2056 char cached_images[1024];
2058 C_PARAMS (fs && folder && file);
2093 GP_LOG_D (
"Adding file '%s' from folder '%s' to the fscache LRU list "
2094 "(type %i)...", filename, folder, type);
2110 oldfile = xfile->
raw;
2113 oldfile = xfile->
audio;
2153 GP_LOG_D (
"File '%s' from folder '%s' added in fscache LRU list.",
2165 GP_LOG_D (
"Checking fscache LRU list integrity...");
2168 GP_LOG_D (
"fscache LRU list empty");
2173 while (ptr != NULL) {
2176 GP_LOG_E (
"fscache LRU list corrupted (%i)", n);
2183 GP_LOG_D (
"fscache LRU list ok with %i items (%ld bytes)", n,
2205 const char *folder,
const char *filename,
2215 C_PARAMS (fs && folder && file);
2217 CA (folder, context);
2219 GP_LOG_D (
"Adding file '%s' to folder '%s' (type %i)...",
2220 filename, folder, type);
2260 xfile->
audio = file;
2285 GP_LOG_D (
"File does not contain mtime. Trying information on the file...");
2298 unsigned long int size;
2301 GP_LOG_D (
"Searching data for mtime...");
2303 if (size < 32*1024*1024) {
2305 t = get_exif_mtime ((
unsigned char*)data, size);
2313 GP_LOG_D (
"Trying EXIF information...");
2314 t = gp_filesystem_get_exif_mtime (fs, folder, filename);
2340 const char *folder,
const char *filename,
2346 C_PARAMS (fs && folder);
2348 CA (folder, context);
2379 C_PARAMS (fs && folder && filename);
2381 CA (folder, context);
2385 _(
"The filesystem doesn't support setting file "
2408 "like width and height can not be changed."));
2456 int *nrofstorageinfos,
2459 C_PARAMS (fs && storageinfo && nrofstorageinfos);
2464 _(
"The filesystem doesn't support getting storage "
2469 storageinfo, nrofstorageinfos,
void gp_context_error(GPContext *context, const char *format,...)
int gp_file_adjust_name_for_mime_type(CameraFile *file)
int gp_file_set_data_and_size(CameraFile *file, char *data, unsigned long int size)
int gp_file_copy(CameraFile *destination, CameraFile *source)
int gp_file_unref(CameraFile *file)
Decrease reference counter for CameraFile object.
int gp_file_set_mime_type(CameraFile *file, const char *mime_type)
int gp_file_set_name(CameraFile *file, const char *name)
int gp_file_get_mtime(CameraFile *file, time_t *mtime)
int gp_file_ref(CameraFile *file)
Increase reference counter for CameraFile object.
int gp_file_set_mtime(CameraFile *file, time_t mtime)
int gp_file_new(CameraFile **file)
int gp_file_get_data_and_size(CameraFile *file, const char **data, unsigned long int *size)
CameraFileType
The type of view on the specified file.
static int delete_folder(CameraFilesystem *fs, CameraFilesystemFolder **folder)
int gp_filesystem_get_folder(CameraFilesystem *fs, const char *filename, char **folder, GPContext *context)
Search a folder that contains a given filename.
int gp_filesystem_free(CameraFilesystem *fs)
Free filesystem struct.
int gp_filesystem_dump(CameraFilesystem *fs)
Dump the current filesystem.
static int recurse_delete_folder(CameraFilesystem *fs, CameraFilesystemFolder *folder)
static int gp_filesystem_lru_count(CameraFilesystem *fs)
static int delete_all_files(CameraFilesystem *fs, CameraFilesystemFolder *folder)
static int append_folder(CameraFilesystem *fs, const char *folder, CameraFilesystemFolder **newfolder, GPContext *context)
static int gp_filesystem_delete_all_one_by_one(CameraFilesystem *fs, const char *folder, GPContext *context)
static int gp_filesystem_lru_free(CameraFilesystem *fs)
int gp_filesystem_new(CameraFilesystem **fs)
Create a new filesystem struct.
static int gp_filesystem_lru_update(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileType type, CameraFile *file, GPContext *context)
int gp_filesystem_set_info(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileInfo info, GPContext *context)
Set information about a file.
static int gp_filesystem_get_file_impl(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileType type, CameraFile *file, GPContext *context)
static CameraFilesystemFolder * lookup_folder(CameraFilesystem *fs, CameraFilesystemFolder *folder, const char *foldername, GPContext *context)
int gp_filesystem_make_dir(CameraFilesystem *fs, const char *folder, const char *name, GPContext *context)
Create a subfolder within a folder.
int gp_filesystem_delete_file(CameraFilesystem *fs, const char *folder, const char *filename, GPContext *context)
Delete a file from a folder.
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.
static int internal_append(CameraFilesystem *fs, CameraFilesystemFolder *f, const char *filename, GPContext *context)
Append a file to a folder in a filesystem.
static int append_to_folder(CameraFilesystemFolder *folder, const char *foldername, CameraFilesystemFolder **newfolder)
int gp_filesystem_reset(CameraFilesystem *fs)
Clear the filesystem.
static int recursive_folder_scan(CameraFilesystemFolder *folder, const char *lookforfile, char **foldername)
static int append_file(CameraFilesystem *fs, CameraFilesystemFolder *folder, const char *name, CameraFile *file, GPContext *context)
int gp_filesystem_delete_all(CameraFilesystem *fs, const char *folder, GPContext *context)
Delete all files in specified folder.
static int gp_filesystem_scan(CameraFilesystem *fs, const char *folder, const char *filename, GPContext *context)
int gp_filesystem_set_funcs(CameraFilesystem *fs, CameraFilesystemFuncs *funcs, void *data)
Set all filesystem related function pointers.
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.
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.
int gp_filesystem_count(CameraFilesystem *fs, const char *folder, GPContext *context)
Count files a folder of a filesystem.
static int append_folder_one(CameraFilesystemFolder *folder, const char *name, CameraFilesystemFolder **newfolder)
struct _CameraFilesystemFile CameraFilesystemFile
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_check(CameraFilesystem *fs)
struct _CameraFilesystemFolder CameraFilesystemFolder
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.
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)
static int delete_file(CameraFilesystem *fs, CameraFilesystemFolder *folder, CameraFilesystemFile *file)
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.
static int gp_filesystem_lru_clear(CameraFilesystem *fs)
static int delete_all_folders(CameraFilesystem *fs, const char *foldername, GPContext *context)
int gp_filesystem_get_info(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileInfo *info, GPContext *context)
Get information about the specified file.
static int pictures_to_keep
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.
static void recursive_fs_dump(CameraFilesystemFolder *folder, int depth)
int gp_filesystem_list_folders(CameraFilesystem *fs, const char *folder, CameraList *list, GPContext *context)
List all subfolders within a filesystem folder.
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.
static int lookup_folder_file(CameraFilesystem *fs, const char *folder, const char *filename, CameraFilesystemFolder **xfolder, CameraFilesystemFile **xfile, GPContext *context)
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.
int gp_filesystem_number(CameraFilesystem *fs, const char *folder, const char *filename, GPContext *context)
Get the index of a file in specified folder.
Filesystem related operations and declarations.
int(* CameraFilesystemDeleteFileFunc)(CameraFilesystem *fs, const char *folder, const char *filename, void *data, GPContext *context)
int(* CameraFilesystemReadFileFunc)(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileType type, uint64_t offset, char *buf, uint64_t *size, void *data, GPContext *context)
@ GP_FILE_INFO_WIDTH
The width is set.
@ GP_FILE_INFO_HEIGHT
The height is set.
@ GP_FILE_INFO_TYPE
The MIME type is set.
@ GP_FILE_INFO_STATUS
The status is set (downloaded).
@ GP_FILE_INFO_SIZE
The filesize is set.
@ GP_FILE_INFO_MTIME
The modification time is set.
@ GP_FILE_INFO_PERMISSIONS
The access permissions are set.
int(* CameraFilesystemDeleteAllFunc)(CameraFilesystem *fs, const char *folder, void *data, GPContext *context)
int(* CameraFilesystemListFunc)(CameraFilesystem *fs, const char *folder, CameraList *list, void *data, GPContext *context)
int(* CameraFilesystemStorageInfoFunc)(CameraFilesystem *fs, CameraStorageInformation **, int *nrofstorageinformations, void *data, GPContext *context)
int(* CameraFilesystemGetFileFunc)(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileType type, CameraFile *file, void *data, GPContext *context)
int(* CameraFilesystemDirFunc)(CameraFilesystem *fs, const char *folder, const char *name, void *data, GPContext *context)
int(* CameraFilesystemPutFileFunc)(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileType type, CameraFile *file, void *data, GPContext *context)
int(* CameraFilesystemGetInfoFunc)(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileInfo *info, void *data, GPContext *context)
int(* CameraFilesystemSetInfoFunc)(CameraFilesystem *fs, const char *folder, const char *filename, CameraFileInfo info, void *data, GPContext *context)
int gp_list_new(CameraList **list)
Creates a new CameraList.
int gp_list_reset(CameraList *list)
int gp_list_free(CameraList *list)
int gp_list_append(CameraList *list, const char *name, const char *value)
int gp_list_count(CameraList *list)
int gp_list_get_name(CameraList *list, int index, const char **name)
#define GP_ERROR_NO_MEMORY
Out of memory.
#define GP_OK
Everything is OK.
#define GP_ERROR_NOT_SUPPORTED
Functionality not supported.
#define GP_ERROR_BAD_PARAMETERS
Bad parameters passed.
#define GP_ERROR
Generic Error.
const char * gp_result_as_string(int result)
Translate a gphoto error code into a localized string.
#define GP_ERROR_FILE_EXISTS
File already exists.
#define GP_ERROR_FILE_NOT_FOUND
Specified file was not found.
#define GP_ERROR_DIRECTORY_NOT_FOUND
Specified directory was not found.
#define GP_ERROR_DIRECTORY_EXISTS
Specified directory already exists.
#define GP_ERROR_CORRUPTED_DATA
Corrupted data received.
int gp_setting_get(char *id, char *key, char *value)
Retrieve a specific gphoto setting.
int gp_setting_set(char *id, char *key, char *value)
Set a specific gphoto setting.
CameraFileInfoFields fields
Bitmask containing the set members.
CameraFileInfoFields fields
Bitmask containing the set members.
CameraFilePermissions permissions
Permissions of the file.
time_t mtime
Modification time of the file.
CameraFileInfoFields fields
Bitmask containing the set members.
File information structure.
CameraFileInfoPreview preview
CameraFileInfoAudio audio
struct _CameraFilesystemFile * next
struct _CameraFilesystemFile * lru_next
struct _CameraFilesystemFile * lru_prev
struct _CameraFilesystemFolder * next
struct _CameraFilesystemFile * files
struct _CameraFilesystemFolder * folders
CameraFilesystemListFunc file_list_func
CameraFilesystemStorageInfoFunc storage_info_func
CameraFilesystemListFunc folder_list_func
CameraFilesystemDirFunc remove_dir_func
CameraFilesystemGetInfoFunc get_info_func
CameraFilesystemGetFileFunc get_file_func
CameraFilesystemSetInfoFunc set_info_func
CameraFilesystemDeleteAllFunc delete_all_func
CameraFilesystemReadFileFunc read_file_func
CameraFilesystemDirFunc make_dir_func
CameraFilesystemPutFileFunc put_file_func
CameraFilesystemDeleteFileFunc del_file_func
The internal camera filesystem structure.
CameraFilesystemDirFunc remove_dir_func
CameraFilesystemGetFileFunc get_file_func
CameraFilesystemDeleteAllFunc delete_all_func
CameraFilesystemListFunc folder_list_func
CameraFilesystemDirFunc make_dir_func
CameraFilesystemReadFileFunc read_file_func
CameraFilesystemGetInfoFunc get_info_func
CameraFilesystemStorageInfoFunc storage_info_func
unsigned long int lru_size
CameraFilesystemDeleteFileFunc delete_file_func
CameraFilesystemPutFileFunc put_file_func
CameraFilesystemSetInfoFunc set_info_func
CameraFilesystemListFunc file_list_func
CameraFilesystemFile * lru_last
CameraFilesystemFile * lru_first
CameraFilesystemFolder * rootfolder