efl/src/lib/ecore_file/Ecore_File.h

703 lines
24 KiB
C

#ifndef ECORE_FILE_H
#define ECORE_FILE_H
/*
* TODO:
* - More events, move/rename of directory file
*/
#include <Eina.h>
#ifdef EAPI
# undef EAPI
#endif
#ifdef _WIN32
# ifdef EFL_ECORE_FILE_BUILD
# ifdef DLL_EXPORT
# define EAPI __declspec(dllexport)
# else
# define EAPI
# endif /* ! DLL_EXPORT */
# else
# define EAPI __declspec(dllimport)
# endif /* ! EFL_ECORE_FILE_BUILD */
#else
# ifdef __GNUC__
# if __GNUC__ >= 4
# define EAPI __attribute__ ((visibility("default")))
# else
# define EAPI
# endif
# else
# define EAPI
# endif
#endif /* ! _WIN32 */
/**
* @file Ecore_File.h
* @brief Files utility functions
*/
#ifdef __cplusplus
extern "C" {
#endif
/**
* @defgroup Ecore_File_Group Ecore_File - Files and directories convenience functions
* @ingroup Ecore
*
* @{
*/
/**
* @typedef Ecore_File_Monitor
* Abstract type used when monitoring a directory.
*/
typedef struct _Ecore_File_Monitor Ecore_File_Monitor;
/**
* @typedef Ecore_File_Download_Job
* Abstract type used when aborting a download.
*/
typedef struct _Ecore_File_Download_Job Ecore_File_Download_Job;
/**
* @typedef _Ecore_File_Event
* The event type returned when a file or directory is monitored.
*/
typedef enum _Ecore_File_Event
{
ECORE_FILE_EVENT_NONE, /**< No event. */
ECORE_FILE_EVENT_CREATED_FILE, /**< Created file event. */
ECORE_FILE_EVENT_CREATED_DIRECTORY, /**< Created directory event. */
ECORE_FILE_EVENT_DELETED_FILE, /**< Deleted file event. */
ECORE_FILE_EVENT_DELETED_DIRECTORY, /**< Deleted directory event. */
ECORE_FILE_EVENT_DELETED_SELF, /**< Deleted monitored directory event. */
ECORE_FILE_EVENT_MODIFIED, /**< Modified file or directory event. */
ECORE_FILE_EVENT_CLOSED /**< Closed file event */
} Ecore_File_Event;
/**
* @typedef Ecore_File_Monitor_Cb
* Callback type used when a monitored directory has changes.
*/
typedef void (*Ecore_File_Monitor_Cb)(void *data, Ecore_File_Monitor *em, Ecore_File_Event event, const char *path);
/**
* @typedef Ecore_File_Download_Completion_Cb
* Callback type used when a download is finished.
*/
typedef void (*Ecore_File_Download_Completion_Cb)(void *data, const char *file, int status);
/**
* @typedef _Ecore_File_Progress_Return
* What to do with the download as a return from the
* Ecore_File_Download_Progress_Cb function, if provided.
*/
typedef enum _Ecore_File_Progress_Return
{
ECORE_FILE_PROGRESS_CONTINUE = 0, /**< Continue the download. */
ECORE_FILE_PROGRESS_ABORT = 1 /**< Abort the download. */
} Ecore_File_Progress_Return;
/**
* @typedef Ecore_File_Download_Progress_Cb
* Callback type used while a download is in progress.
*/
typedef int (*Ecore_File_Download_Progress_Cb)(void *data,
const char *file,
long int dltotal,
long int dlnow,
long int ultotal,
long int ulnow);
/* File operations */
/**
* @brief Initialize the Ecore_File library.
*
* @return 1 or greater on success, 0 on error.
*
* This function sets up Ecore_File and the services it will use
* (monitoring, downloading, PATH related feature). It returns 0 on
* failure, otherwise it returns the number of times it has already
* been called.
*
* When Ecore_File is not used anymore, call ecore_file_shutdown()
* to shut down the Ecore_File library.
*/
EAPI int ecore_file_init (void);
/**
* @brief Shut down the Ecore_File library.
*
* @return 0 when the library is completely shut down, 1 or
* greater otherwise.
*
* This function shuts down the Ecore_File library. It returns 0 when it has
* been called the same number of times than ecore_file_init(). In that case
* it shuts down all the services it uses.
*/
EAPI int ecore_file_shutdown (void);
/**
* @brief Get the time of the last modification to the given file.
*
* @param file The name of the file.
* @return Return the time of the last data modification, or 0 on
* failure.
*
* This function returns the time of the last modification of
* @p file. On failure, it returns 0.
*/
EAPI long long ecore_file_mod_time (const char *file);
/**
* @brief Get the size of the given file.
*
* @param file The name of the file.
* @return Return the size of the file in bytes, or 0 on failure.
*
* This function returns the size of @p file in bytes. On failure, it
* returns 0.
*/
EAPI long long ecore_file_size (const char *file);
/**
* @brief Check if the given file exists.
*
* @param file The name of the file.
* @return @c EINA_TRUE if the @p file exists, @c EINA_FALSE otherwise.
*
* This function returns @c EINA_TRUE if @p file exists on local filesystem,
* @c EINA_FALSE otherwise.
*/
EAPI Eina_Bool ecore_file_exists (const char *file);
/**
* @brief Check if the given file is a directory.
*
* @param file The name of the file.
* @return @c EINA_TRUE if the file exists and is a directory, @c EINA_FALSE
* otherwise.
*
* This function returns @c EINA_TRUE if @p file exists exists and is a
* directory on local filesystem, @c EINA_FALSE otherwise.
*/
EAPI Eina_Bool ecore_file_is_dir (const char *file);
/**
* @brief Create a new directory.
*
* @param dir The name of the directory to create
* @return @c EINA_TRUE on successful creation, @c EINA_FALSE otherwise.
*
* This function creates the directory @p dir, with the mode S_IRUSR |
* S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH on UNIX
* (mode is unsued on Windows). On success, it returns @c EINA_TRUE,
* @c EINA_FALSE otherwise.
*/
EAPI Eina_Bool ecore_file_mkdir (const char *dir);
/**
* @brief Create complete directory in a batch.
*
* @param dirs The list of directories, null terminated.
* @return The number of successful directories created, -1 if dirs is
* @c NULL.
*
* This function creates all the directories that are in the null
* terminated array @p dirs. The function loops over the directories
* and call ecore_file_mkdir(). This function returns -1 if @p dirs is
* @c NULL, otherwise if returns the number of suceesfully created
* directories.
*/
EAPI int ecore_file_mkdirs (const char **dirs);
/**
* @brief Create complete list of sub-directories in a batch (optimized).
*
* @param base The base directory to act on.
* @param subdirs The list of directories, null terminated.
* @return number of successful directories created, -1 on failure.
*
* This function creates all the directories that are in the null
* terminated array @p subdirs in the @p base directory. If @p base does
* not exist, it will be created. The function loops over the directories
* and call ecore_file_mkdir(). The whole path of the directories must
* exist. So if base/a/b/c wants to be created, @p subdirs must
* contain "a", "a/b" and "a/b/c", in that order. This function
* returns -1 if @p subdirs or @p base are @c NULL, or if @p base is
* empty ("\0"). It returns 0 is @p base is not a directory or
* invalid, or if it can't be created. Otherwise if returns the number
* of suceesfully created directories.
*/
EAPI int ecore_file_mksubdirs (const char *base, const char **subdirs);
/**
* @brief Delete the given directory.
*
* @param dir The name of the directory to delete.
* @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
*
* This function deletes @p dir. It returns @c EINA_TRUE on success,
* @c EINA_FALSE otherwise.
*/
EAPI Eina_Bool ecore_file_rmdir (const char *dir);
/**
* @brief Delete the given directory and all its contents.
*
* @param dir The name of the directory to delete.
* @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
*
* This function delete @p dir and all its contents. If @p dir is a
* link only the link is removed. It returns @c EINA_TRUE on success,
* @c EINA_FALSE otherwise.
*/
EAPI Eina_Bool ecore_file_recursive_rm (const char *dir);
/**
* @brief Create a complete path.
*
* @param path The path to create
* @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
*
* This function creates @p path and all the subdirectories it
* contains. The separator is '/' or '\'. If @p path exists, this
* function returns @c EINA_TRUE immediately. It returns @c EINA_TRUE on
* success, @c EINA_FALSE otherwise.
*/
EAPI Eina_Bool ecore_file_mkpath (const char *path);
/**
* @brief Create complete paths in a batch.
*
* @param paths list of paths, null terminated.
* @return number of successful paths created, -1 if paths is NULL.
*
* This function creates all the directories that are in the null
* terminated array @p paths. The function loops over the directories
* and call ecore_file_mkpath(), hence on Windows, '\' must be
* replaced by '/' before calling that function. This function
* returns -1 if @p paths is @c NULL. Otherwise if returns the number
* of suceesfully created directories.
*/
EAPI int ecore_file_mkpaths (const char **paths);
/**
* @brief Copy the given file to the given destination.
*
* @param src The name of the source file.
* @param dst The name of the destination file.
* @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
*
* This function copies @p src to @p dst. If the absolute path name of
* @p src and @p dst can not be computed, or if they are equal, or if
* the copy fails, the function returns @c EINA_FALSE, otherwise it
* returns @c EINA_TRUE.
*/
EAPI Eina_Bool ecore_file_cp (const char *src, const char *dst);
/**
* @brief Move the given file to the given destination.
*
* @param src The name of the source file.
* @param dst The name of the destination file.
* @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
*
* This function moves @p src to @p dst. It returns @c EINA_TRUE on
* success, @c EINA_FALSE otherwise.
*/
EAPI Eina_Bool ecore_file_mv (const char *src, const char *dst);
/**
* @brief Create a symbolic link.
*
* @param src The name of the file to link.
* @param dest The name of link.
* @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
*
* This function create the symbolic link @p dest of @p src. This
* function does not work on Windows. It returns @c EINA_TRUE on success,
* @c EINA_FALSE otherwise.
*/
EAPI Eina_Bool ecore_file_symlink (const char *src, const char *dest);
/**
* @brief Get the canonicalized absolute path name.
*
* @param file The file path.
* @return The canonicalized absolute pathname or an empty string on
* failure.
*
* This function returns the absolute path name of @p file as a newly
* allocated string. If @p file is @c NULL, or on error, this function
* returns an empty string. Otherwise, it returns the absolute path
* name. When not needed anymore, the returned value must be freed.
*/
EAPI char *ecore_file_realpath (const char *file);
/**
* @brief Delete the given file.
*
* @param file The name of the file to delete.
* @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
*
* This function deletes @p file. It returns @c EINA_TRUE on success,
* @c EINA_FALSE otherwise.
*/
EAPI Eina_Bool ecore_file_unlink (const char *file);
/**
* @brief Remove the given file or directory.
*
* @param file The name of the file or directory to delete.
* @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
*
* This function removes @p file. It returns @c EINA_TRUE on success,
* @c EINA_FALSE otherwise.
*/
EAPI Eina_Bool ecore_file_remove (const char *file);
/**
* Get the filename from a given path.
*
* @param path The complete path.
* @return The file name.
*
* This function returns the file name of @p path. If @p path is
* @c NULL, the functions returns @c NULL.
*/
EAPI const char *ecore_file_file_get (const char *path);
/**
* @brief Get the directory where the given file resides.
*
* @param file The name of the file.
* @return The directory name.
*
* This function returns the directory where @p file resides as anewly
* allocated string. If @p file is @c NULL or on error, this function
* returns @c NULL. When not needed anymore, the returned value must
* be freed.
*/
EAPI char *ecore_file_dir_get (const char *path);
/**
* @brief Check if the given file can be read.
*
* @param file The name of the file.
* @return @c EINA_TRUE if the @p file is readable, @c EINA_FALSE otherwise.
*
* This function returns @c EINA_TRUE if @p file can be read, @c EINA_FALSE
* otherwise.
*/
EAPI Eina_Bool ecore_file_can_read (const char *file);
/**
* @brief Check if the given file can be written.
*
* @param file The name of the file.
* @return @c EINA_TRUE if the @p file is writable, @c EINA_FALSE otherwise.
*
* This function returns @c EINA_TRUE if @p file can be written, @c EINA_FALSE
* otherwise.
*/
EAPI Eina_Bool ecore_file_can_write (const char *file);
/**
* @brief Check if the given file can be executed.
*
* @param file The name of the file.
* @return @c EINA_TRUE if the @p file can be executed, @c EINA_FALSE
* otherwise.
*
* This function returns @c EINA_TRUE if @p file can be executed, @c EINA_FALSE
* otherwise.
*/
EAPI Eina_Bool ecore_file_can_exec (const char *file);
/**
* @brief Get the path pointed by the given link.
*
* @param lnk The name of the link.
* @return The path pointed by link or NULL.
*
* This function returns the path pointed by @p link as a newly
* allocated string. This function does not work on Windows. On
* failure, the function returns @c NULL. When not needed anymore, the
* returned value must be freed.
*/
EAPI char *ecore_file_readlink (const char *link);
/**
* @brief Get the list of the files and directories in the given
* directory.
*
* @param dir The name of the directory to list
* @return Return an Eina_List containing all the files in the directory;
* on failure it returns NULL.
*
* This function returns a list of allocated strings of all the files
* and directories contained in @p dir. The list will be sorted with
* strcoll as compare function. That means that you may want to set
* the current locale for the category LC_COLLATE with
* setlocale(). For more information see the manual pages of strcoll
* and setlocale. The list will not contain the directory entries for
* '.' and '..'. On failure, @c NULL is returned. When not needed
* anymore, the list elements must be freed.
*/
EAPI Eina_List *ecore_file_ls (const char *dir);
/**
* @brief Return the executable from the given command.
*
* @param app The application command, with parameters.
* @return The executable from @p app as a newly allocated string. Arguments
* are removed and escape characters are handled. If @p app is @c NULL, or
* on failure, the function returns @c NULL. When not needed anymore, the
* returned value must be freed.
*/
EAPI char *ecore_file_app_exe_get (const char *app);
/**
* @brief Add the escape sequence ('\\') to the given file name.
*
* @param filename The file name.
* @return The file name with special characters escaped.
*
* This function adds the escape sequence ('\\') to the given file
* name and returns the result as a newly allocated string. If the
* length of the returned string is longer than PATH_MAX, or on
* failure, @c NULL is returned. When not needed anymore, the returned
* value must be freed.
*/
EAPI char *ecore_file_escape_name (const char *filename);
/**
* @brief Remove the extension from the given file name.
*
* @param path The name of the file.
* @return A newly allocated string with the extension stripped out or
* @c NULL on errors.
*
* This function removes the extension from @p path and returns the
* result as a newly allocated string. If @p path is @c NULL, or on
* failure, the function returns @c NULL. When not needed anymore, the
* returned value must be freed.
*/
EAPI char *ecore_file_strip_ext (const char *file);
/**
* @brief Check if the given directory is empty.
*
* @param dir The name of the directory to check.
* @return @c 1 if directory is empty, @c 0 if it has at least one file or
* @c -1 in case of errors.
*
* This functions checks if @p dir is empty. The '.' and '..' files
* will be ignored. If @p dir is empty, 1 is returned, if it contains
* at least one file, @c 0 is returned. On failure, @c -1 is returned.
*/
EAPI int ecore_file_dir_is_empty (const char *dir);
/* Monitoring */
/**
* @brief Monitor the given path using inotify, Windows notification, or polling.
*
* @param path The path to monitor.
* @param func The function to call on changes.
* @param data The data passed to func.
* @return An Ecore_File_Monitor pointer or NULL on failure.
*
* This function monitors @p path. If @p path is @c NULL, or is an
* empty string, or none of the notify methods (Inotify, Windows
* notification or polling) is available, or if @p path does not exist
* the function returns @c NULL. Otherwise, it returns a newly
* allocated Ecore_File_Monitor object and the monitoring begins.
* When one of the Ecore_File_Event event is notified, @p func is called
* and @p data is passed to @p func.Call ecore_file_monitor_del() to
* stop the monitoring.
*/
EAPI Ecore_File_Monitor *ecore_file_monitor_add(const char *path,
Ecore_File_Monitor_Cb func,
void *data);
/**
* @brief Stop the monitoring of the given path.
*
* @param em The Ecore_File_Monitor to stop.
*
* This function stops the the monitoring of the path that has been
* monitored by ecore_file_monitor_add(). @p em must be the value
* returned by ecore_file_monitor_add(). If @p em is @c NULL, or none
* of the notify methods (Inotify, Windows notification or polling) is
* availablethis function does nothing.
*/
EAPI void ecore_file_monitor_del(Ecore_File_Monitor *ecore_file_monitor);
/**
* @brief Get the monitored path.
*
* @param em The Ecore_File_Monitor to query.
* @return The path that is monitored by @p em.
*
* This function returns the monitored path that has been
* monitored by ecore_file_monitor_add(). @p em must be the value
* returned by ecore_file_monitor_add(). If @p em is @c NULL, the
* function returns @c NULL.
*/
EAPI const char *ecore_file_monitor_path_get(Ecore_File_Monitor *ecore_file_monitor);
/* Path */
/**
* @brief Check if the given directory is in PATH.
*
* @param in_dir The name of the directory to search in PATH.
* @return @c EINA_TRUE if the directory exist in PATH, @c EINA_FALSE otherwise.
*
* This function checks if @p in_dir is in the environment variable
* PATH. If @p in_dir is @c NULL, or if PATH is empty, or @p in_dir is
* not in PATH, the function returns @c EINA_FALSE, otherwise it returns
* @c EINA_TRUE.
*/
EAPI Eina_Bool ecore_file_path_dir_exists(const char *in_dir);
/**
* @brief Check if the given application is installed.
*
* @param exe The name of the application
* @return @c EINA_TRUE if the @p exe is in PATH and is executable,
* @c EINA_FALSE otherwise.
*
* This function checks if @p exe exists in PATH and is executable. If
* @p exe is @c NULL or is not executable, the function returns
* @c EINA_FALSE, otherwise it returns @c EINA_TRUE.
*/
EAPI Eina_Bool ecore_file_app_installed(const char *exe);
/**
* @brief Get a list of all the applications installed on the system.
*
* @return An Eina_List containing all the executable files in the
* system.
*
* This function returns a list of allocated strings of all the
* executable files. If no files are found, the function returns
* @c NULL. When not needed anymore, the element of the list must be
* freed.
*/
EAPI Eina_List *ecore_file_app_list(void);
/* Download */
/**
* @brief Download the given url to the given destination.
*
* @param url The complete url to download.
* @param dst The local file to save the downloaded to.
* @param completion_cb A callback called on download complete.
* @param progress_cb A callback called during the download operation.
* @param data User data passed to both callbacks.
* @param job_ret Job used to abort the download.
* @return @c EINA_TRUE if the download start or @c EINA_FALSE on failure.
*
* This function starts the download of the URL @p url and saves it to
* @p dst. @p url must provide the protocol, including 'http://',
* 'ftp://' or 'file://'. Ecore_File must be compiled with CURL to
* download using http and ftp protocols. If @p dst is ill-formed, or
* if it already exists, the function returns @c EINA_FALSE. When the
* download is complete, the callback @p completion_cb is called and
* @p data is passed to it. The @p status parameter of @p completion_cb
* will be filled with the status of the download (200, 404,...). The
* @p progress_cb is called during the download operation, each time a
* packet is received or when CURL wants. It can be used to display the
* percentage of the downloaded file. Return 0 from this callback, if provided,
* to continue the operation or anything else to abort the download. The only
* operations that can be aborted are those with protocol 'http' or 'ftp'. In
* that case @p job_ret can be passed to ecore_file_download_abort() to abort
* that download job. Similarly ecore_file_download_abort_all() can be used to
* abort all download operations. This function returns @c EINA_TRUE if the
* download starts, @c EINA_FALSE otherwise.
*/
EAPI Eina_Bool ecore_file_download(const char *url,
const char *dst,
Ecore_File_Download_Completion_Cb completion_cb,
Ecore_File_Download_Progress_Cb progress_cb,
void *data,
Ecore_File_Download_Job **job_ret);
/**
* @brief Download the given url to the given destination with additional headers.
*
* @param url The complete url to download.
* @param dst The local file to save the downloaded to.
* @param completion_cb A callback called on download complete.
* @param progress_cb A callback called during the download operation.
* @param data User data passed to both callbacks.
* @param job_ret Job used to abort the download.
* @param headers pointer of header lists.
* @return @c EINA_TRUE if the download start or @c EINA_FALSE on failure.
*/
EAPI Eina_Bool ecore_file_download_full(const char *url,
const char *dst,
Ecore_File_Download_Completion_Cb completion_cb,
Ecore_File_Download_Progress_Cb progress_cb,
void *data,
Ecore_File_Download_Job **job_ret,
Eina_Hash *headers);
/**
* @brief Abort all downloads.
*
* This function aborts all the downloads that have been started by
* ecore_file_download(). It loops over the started downloads and call
* ecore_file_download_abort() for each of them. To abort only one
* specific download operation, call ecore_file_download_abort().
*/
EAPI void ecore_file_download_abort_all(void);
/**
* @brief Abort the given download job and call the completion_cb
* callbck with a status of 1 (error).
*
* @param job The download job to abort.
*
* This function aborts a download operation started by
* ecore_file_download(). @p job is the #Ecore_File_Download_Job
* structure filled by ecore_file_download(). If it is @c NULL, this
* function does nothing. To abort all the currently downloading
* operations, call ecore_file_download_abort_all().
*/
EAPI void ecore_file_download_abort(Ecore_File_Download_Job *job);
/**
* @brief Check if the given protocol is available.
*
* @param protocol The protocol to check.
* @return @c EINA_TRUE if protocol is handled, @c EINA_FALSE otherwise.
*
* This function returns @c EINA_TRUE if @p protocol is supported,
* @c EINA_FALSE otherwise. @p protocol can be 'http://', 'ftp://' or
* 'file://'. Ecore_FILE must be compiled with CURL to handle http and
* ftp protocols.
*/
EAPI Eina_Bool ecore_file_download_protocol_available(const char *protocol);
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#undef EAPI
#define EAPI
#endif