387 lines
15 KiB
C
387 lines
15 KiB
C
/** \file
|
|
* \brief Filesystem related operations and declarations.
|
|
*
|
|
* \author Copyright 2000 Scott Fritzinger
|
|
* \author Copyright 2008-2009 Marcus Meissner
|
|
*
|
|
* \note
|
|
* Contributions:
|
|
* Lutz Mueller <lutz@users.sf.net> (2001)
|
|
*
|
|
* \note
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* \note
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* \note
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the
|
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
* Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#ifndef LIBGPHOTO2_GPHOTO2_FILESYS_H
|
|
#define LIBGPHOTO2_GPHOTO2_FILESYS_H
|
|
|
|
#include <time.h>
|
|
#include <stdint.h>
|
|
|
|
#include <gphoto2/gphoto2-context.h>
|
|
#include <gphoto2/gphoto2-list.h>
|
|
#include <gphoto2/gphoto2-file.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif /* __cplusplus */
|
|
|
|
/**
|
|
* \brief Bitmask on what fields are set in the CameraFileInfo structure.
|
|
*
|
|
* Bitmask to mark up which fields are set in the CameraFileInfo
|
|
* structure. The other fields might be uninitialized.
|
|
* If you set information via gp_camera_file_set_info() you
|
|
* need to set those flags. If you retrieve information via
|
|
* gp_camera_file_get_info() you need to check those flags.
|
|
* They are separate for both "normal" and "preview" parts
|
|
* and are mostly image related.
|
|
*/
|
|
typedef enum {
|
|
GP_FILE_INFO_NONE = 0, /**< \brief No fields set. */
|
|
GP_FILE_INFO_TYPE = 1 << 0, /**< \brief The MIME type is set. */
|
|
GP_FILE_INFO_SIZE = 1 << 2, /**< \brief The filesize is set. */
|
|
GP_FILE_INFO_WIDTH = 1 << 3, /**< \brief The width is set. */
|
|
GP_FILE_INFO_HEIGHT = 1 << 4, /**< \brief The height is set. */
|
|
GP_FILE_INFO_PERMISSIONS = 1 << 5, /**< \brief The access permissions are set. */
|
|
GP_FILE_INFO_STATUS = 1 << 6, /**< \brief The status is set (downloaded). */
|
|
GP_FILE_INFO_MTIME = 1 << 7, /**< \brief The modification time is set. */
|
|
GP_FILE_INFO_ALL = 0xFF /**< \brief All possible fields set. Internal. */
|
|
} CameraFileInfoFields;
|
|
|
|
/**
|
|
* \brief Bitmask containing the file permission flags.
|
|
*
|
|
* Possible flag values of the permission entry in the file information.
|
|
*/
|
|
typedef enum {
|
|
GP_FILE_PERM_NONE = 0, /**< \brief No permissions. */
|
|
GP_FILE_PERM_READ = 1 << 0, /**< \brief Read permissions. */
|
|
GP_FILE_PERM_DELETE = 1 << 1, /**< \brief Write permissions */
|
|
GP_FILE_PERM_ALL = 0xFF /**< \brief Internal. */
|
|
} CameraFilePermissions;
|
|
|
|
/**
|
|
* \brief Possible status values.
|
|
*
|
|
* Bitmask of possible stati. Currently only download is supported.
|
|
*/
|
|
typedef enum {
|
|
GP_FILE_STATUS_NOT_DOWNLOADED, /**< File is not downloaded. */
|
|
GP_FILE_STATUS_DOWNLOADED /**< File is already downloaded. */
|
|
} CameraFileStatus;
|
|
|
|
/**
|
|
* \brief File information of a regular file.
|
|
*
|
|
* Contains information a regular file with fields being
|
|
* set depending on the bitmask in the fields member.
|
|
*/
|
|
typedef struct _CameraFileInfoFile {
|
|
CameraFileInfoFields fields; /**< \brief Bitmask containing the set members. */
|
|
CameraFileStatus status; /**< \brief Status of the file. */
|
|
uint64_t size; /**< \brief Size of the file. */
|
|
char type[64]; /**< \brief MIME type of the file. */
|
|
uint32_t width; /**< \brief Height of the file. */
|
|
uint32_t height; /**< \brief Width of the file. */
|
|
CameraFilePermissions permissions;/**< \brief Permissions of the file. */
|
|
time_t mtime; /**< \brief Modification time of the file. */
|
|
} CameraFileInfoFile;
|
|
|
|
/**
|
|
* \brief File information of a preview file.
|
|
*
|
|
* Contains information of a preview file with fields being
|
|
* set depending on the bitmask in the fields member.
|
|
*/
|
|
typedef struct _CameraFileInfoPreview {
|
|
CameraFileInfoFields fields; /**< \brief Bitmask containing the set members. */
|
|
CameraFileStatus status; /**< \brief Status of the preview. */
|
|
uint64_t size; /**< \brief Size of the preview. */
|
|
char type[64]; /**< \brief MIME type of the preview. */
|
|
|
|
uint32_t width; /**< \brief Width of the preview. */
|
|
uint32_t height; /**< \brief Height of the preview. */
|
|
} CameraFileInfoPreview;
|
|
|
|
/**
|
|
* \brief File information of an audio file.
|
|
*
|
|
* Contains information of an audio file with fields being
|
|
* set depending on the bitmask in the fields member.
|
|
*/
|
|
typedef struct _CameraFileInfoAudio {
|
|
CameraFileInfoFields fields; /**< \brief Bitmask containing the set members. */
|
|
CameraFileStatus status; /**< \brief Status of the preview file. */
|
|
uint64_t size; /**< \brief Size of the audio file. */
|
|
char type[64]; /**< \brief MIME type of the audio file. */
|
|
} CameraFileInfoAudio;
|
|
|
|
/**
|
|
* \brief File information structure.
|
|
*
|
|
* Contains the normal, preview and audio file information structures
|
|
* for a specific file.
|
|
*/
|
|
typedef struct _CameraFileInfo {
|
|
CameraFileInfoPreview preview;
|
|
CameraFileInfoFile file;
|
|
CameraFileInfoAudio audio;
|
|
} CameraFileInfo;
|
|
|
|
/**
|
|
* \brief Storage information flags.
|
|
*
|
|
* Bitmask to specify which entries of the filesystem
|
|
* storage information is set.
|
|
*/
|
|
typedef enum {
|
|
GP_STORAGEINFO_BASE = (1<<0), /**< \brief The base directory.
|
|
* Usually / if just 1 storage is attached.
|
|
*/
|
|
GP_STORAGEINFO_LABEL = (1<<1), /**< \brief Label of the filesystem.
|
|
* Could also be a DOS label.
|
|
*/
|
|
GP_STORAGEINFO_DESCRIPTION = (1<<2), /**< \brief More verbose description. */
|
|
GP_STORAGEINFO_ACCESS = (1<<3), /**< \brief Access permissions. */
|
|
GP_STORAGEINFO_STORAGETYPE = (1<<4), /**< \brief Hardware type. */
|
|
GP_STORAGEINFO_FILESYSTEMTYPE = (1<<5), /**< \brief Filesystem type. */
|
|
GP_STORAGEINFO_MAXCAPACITY = (1<<6), /**< \brief Maximum capacity in kbytes */
|
|
GP_STORAGEINFO_FREESPACEKBYTES = (1<<7), /**< \brief Free space in kbytes. */
|
|
GP_STORAGEINFO_FREESPACEIMAGES = (1<<8) /**< \brief Free space in images. */
|
|
} CameraStorageInfoFields;
|
|
|
|
/**
|
|
* \brief Hardware storage types.
|
|
*
|
|
* Type of hardware this storage is on. The types and values
|
|
* are the same as the PTP standard uses (PTP_ST_xxx).
|
|
*/
|
|
typedef enum {
|
|
GP_STORAGEINFO_ST_UNKNOWN = 0, /**< \brief Unknown storage type. */
|
|
GP_STORAGEINFO_ST_FIXED_ROM = 1, /**< \brief A fixed ROM storage. */
|
|
GP_STORAGEINFO_ST_REMOVABLE_ROM = 2, /**< \brief A removable ROM storage. */
|
|
GP_STORAGEINFO_ST_FIXED_RAM = 3, /**< \brief A fixed RAM storage. (e.g. SDRAM) */
|
|
GP_STORAGEINFO_ST_REMOVABLE_RAM = 4 /**< \brief A removable RAM storage. (any kind of cards etc) */
|
|
} CameraStorageType;
|
|
|
|
/**
|
|
* \brief Storage access modes.
|
|
*
|
|
* The modes we can access the storage with. Uses the same
|
|
* types and values as the PTP standard (PTP_AC_xxx).
|
|
*/
|
|
typedef enum {
|
|
GP_STORAGEINFO_AC_READWRITE = 0, /**< \brief Storage is Read / Write. */
|
|
GP_STORAGEINFO_AC_READONLY = 1, /**< \brief Storage is Ready Only. */
|
|
GP_STORAGEINFO_AC_READONLY_WITH_DELETE = 2 /**< \brief Storage is Ready Only, but allows Delete.*/
|
|
} CameraStorageAccessType;
|
|
|
|
/**
|
|
* \brief Filesystem hierarchy types.
|
|
*
|
|
* The type of the filesystem hierarchy the devices uses.
|
|
* Same types and values as the PTP standard defines (PTP_FST_xxx).
|
|
*/
|
|
typedef enum {
|
|
GP_STORAGEINFO_FST_UNDEFINED = 0, /**< \brief Undefined or unknown filesystem hierarchy. */
|
|
GP_STORAGEINFO_FST_GENERICFLAT = 1, /**< \brief Generic flat storage (all in 1 directory). */
|
|
GP_STORAGEINFO_FST_GENERICHIERARCHICAL = 2, /**< \brief Generic tree hierarchy. */
|
|
GP_STORAGEINFO_FST_DCF = 3 /**< \brief DCIM style storage. */
|
|
} CameraStorageFilesystemType;
|
|
|
|
/**
|
|
* \brief Storage information structue.
|
|
*
|
|
* This structure contains the information of a specific camera storage.
|
|
* Only the members as specified by the \a fields member are valid.
|
|
*/
|
|
typedef struct _CameraStorageInformation {
|
|
CameraStorageInfoFields fields; /**< \brief Bitmask of struct members that are specified. */
|
|
char basedir[256]; /**< \brief Basedirectory of the storage. Will be "/" if just 1 storage on the camera. */
|
|
char label[256]; /**< \brief Label of the storage. Similar to DOS label. */
|
|
char description[256];/**< \brief Description of the storage. */
|
|
CameraStorageType type; /**< \brief Hardware type of the storage. */
|
|
CameraStorageFilesystemType fstype; /**< \brief Hierarchy type of the filesystem. */
|
|
CameraStorageAccessType access; /**< \brief Access permissions. */
|
|
uint64_t capacitykbytes; /**< \brief Total capacity in kbytes. */
|
|
uint64_t freekbytes; /**< \brief Free space in kbytes. */
|
|
uint64_t freeimages; /**< \brief Free space in images (guessed by camera). */
|
|
} CameraStorageInformation;
|
|
|
|
/**
|
|
* \brief Filesystem structure, only exposed to camera drivers.
|
|
*
|
|
* Internal structure, contents not exposed to frontends. Camera
|
|
* drivers get these passed to filesystem related functions and
|
|
* are supposed to use it only via the accessor functions.
|
|
*/
|
|
typedef struct _CameraFilesystem CameraFilesystem;
|
|
|
|
int gp_filesystem_new (CameraFilesystem **fs);
|
|
int gp_filesystem_free (CameraFilesystem *fs);
|
|
|
|
/* Manual editing */
|
|
int gp_filesystem_append (CameraFilesystem *fs, const char *folder,
|
|
const char *filename, GPContext *context);
|
|
int gp_filesystem_set_info_noop (CameraFilesystem *fs,
|
|
const char *folder, const char *filename,
|
|
CameraFileInfo info, GPContext *context);
|
|
int gp_filesystem_set_info_dirty (CameraFilesystem *fs,
|
|
const char *folder, const char *filename,
|
|
GPContext *context);
|
|
int gp_filesystem_set_file_noop (CameraFilesystem *fs,
|
|
const char *folder, const char *filename,
|
|
CameraFileType type,
|
|
CameraFile *file, GPContext *context);
|
|
int gp_filesystem_delete_file_noop (CameraFilesystem *fs, const char *folder,
|
|
const char *filename, GPContext *context);
|
|
int gp_filesystem_reset (CameraFilesystem *fs);
|
|
|
|
/* Information retrieval */
|
|
int gp_filesystem_count (CameraFilesystem *fs, const char *folder,
|
|
GPContext *context);
|
|
int gp_filesystem_name (CameraFilesystem *fs, const char *folder,
|
|
int filenumber, const char **filename,
|
|
GPContext *context);
|
|
int gp_filesystem_get_folder (CameraFilesystem *fs, const char *filename,
|
|
char **folder, GPContext *context);
|
|
int gp_filesystem_number (CameraFilesystem *fs, const char *folder,
|
|
const char *filename, GPContext *context);
|
|
|
|
/* Listings */
|
|
typedef int (*CameraFilesystemListFunc) (CameraFilesystem *fs,
|
|
const char *folder, CameraList *list,
|
|
void *data, GPContext *context);
|
|
int gp_filesystem_list_files (CameraFilesystem *fs, const char *folder,
|
|
CameraList *list, GPContext *context);
|
|
int gp_filesystem_list_folders (CameraFilesystem *fs, const char *folder,
|
|
CameraList *list, GPContext *context);
|
|
|
|
/* File information */
|
|
typedef int (*CameraFilesystemSetInfoFunc) (CameraFilesystem *fs,
|
|
const char *folder,
|
|
const char *filename,
|
|
CameraFileInfo info, void *data,
|
|
GPContext *context);
|
|
typedef int (*CameraFilesystemGetInfoFunc) (CameraFilesystem *fs,
|
|
const char *folder,
|
|
const char *filename,
|
|
CameraFileInfo *info, void *data,
|
|
GPContext *context);
|
|
int gp_filesystem_get_info (CameraFilesystem *fs, const char *folder,
|
|
const char *filename, CameraFileInfo *info,
|
|
GPContext *context);
|
|
int gp_filesystem_set_info (CameraFilesystem *fs, const char *folder,
|
|
const char *filename, CameraFileInfo info,
|
|
GPContext *context);
|
|
|
|
/* Files */
|
|
typedef int (*CameraFilesystemGetFileFunc) (CameraFilesystem *fs,
|
|
const char *folder,
|
|
const char *filename,
|
|
CameraFileType type,
|
|
CameraFile *file, void *data,
|
|
GPContext *context);
|
|
typedef int (*CameraFilesystemReadFileFunc) (CameraFilesystem *fs,
|
|
const char *folder,
|
|
const char *filename,
|
|
CameraFileType type,
|
|
uint64_t offset,
|
|
char *buf,
|
|
uint64_t *size,
|
|
void *data,
|
|
GPContext *context);
|
|
typedef int (*CameraFilesystemDeleteFileFunc) (CameraFilesystem *fs,
|
|
const char *folder,
|
|
const char *filename,
|
|
void *data, GPContext *context);
|
|
int gp_filesystem_get_file (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);
|
|
int gp_filesystem_delete_file (CameraFilesystem *fs, const char *folder,
|
|
const char *filename, GPContext *context);
|
|
|
|
/* Folders */
|
|
typedef int (*CameraFilesystemPutFileFunc) (CameraFilesystem *fs,
|
|
const char *folder,
|
|
const char *filename,
|
|
CameraFileType type,
|
|
CameraFile *file,
|
|
void *data,
|
|
GPContext *context);
|
|
typedef int (*CameraFilesystemDeleteAllFunc) (CameraFilesystem *fs,
|
|
const char *folder, void *data,
|
|
GPContext *context);
|
|
typedef int (*CameraFilesystemDirFunc) (CameraFilesystem *fs,
|
|
const char *folder,
|
|
const char *name, void *data,
|
|
GPContext *context);
|
|
|
|
typedef int (*CameraFilesystemStorageInfoFunc) (CameraFilesystem *fs,
|
|
CameraStorageInformation **,
|
|
int *nrofstorageinformations,
|
|
void *data, GPContext *context);
|
|
|
|
int gp_filesystem_get_storageinfo (CameraFilesystem *fs,
|
|
CameraStorageInformation **,
|
|
int *nrofstorageinformations,
|
|
GPContext *context);
|
|
|
|
typedef struct _CameraFilesystemFuncs CameraFilesystemFuncs;
|
|
struct _CameraFilesystemFuncs {
|
|
CameraFilesystemListFunc file_list_func;
|
|
CameraFilesystemListFunc folder_list_func;
|
|
CameraFilesystemPutFileFunc put_file_func;
|
|
CameraFilesystemDeleteAllFunc delete_all_func;
|
|
CameraFilesystemGetInfoFunc get_info_func;
|
|
CameraFilesystemSetInfoFunc set_info_func;
|
|
CameraFilesystemDirFunc make_dir_func;
|
|
CameraFilesystemDirFunc remove_dir_func;
|
|
CameraFilesystemGetFileFunc get_file_func;
|
|
CameraFilesystemReadFileFunc read_file_func;
|
|
CameraFilesystemDeleteFileFunc del_file_func;
|
|
CameraFilesystemStorageInfoFunc storage_info_func;
|
|
|
|
/* for later use. Remove one if you add a new function */
|
|
void *unused[31];
|
|
};
|
|
int gp_filesystem_set_funcs (CameraFilesystem *fs,
|
|
CameraFilesystemFuncs *funcs,
|
|
void *data);
|
|
int gp_filesystem_put_file (CameraFilesystem *fs, const char *folder, const char *filename,
|
|
CameraFileType type, CameraFile *file, GPContext *context);
|
|
int gp_filesystem_delete_all (CameraFilesystem *fs, const char *folder,
|
|
GPContext *context);
|
|
int gp_filesystem_make_dir (CameraFilesystem *fs, const char *folder,
|
|
const char *name, GPContext *context);
|
|
int gp_filesystem_remove_dir (CameraFilesystem *fs, const char *folder,
|
|
const char *name, GPContext *context);
|
|
|
|
/* For debugging */
|
|
int gp_filesystem_dump (CameraFilesystem *fs);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif /* __cplusplus */
|
|
|
|
#endif /* !defined(LIBGPHOTO2_GPHOTO2_FILESYS_H) */
|