From 00b6cfc57e27f8146d9b41ba8e63038a4f9df70e Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Mon, 26 May 2014 23:43:36 +0100 Subject: rework path to url mapping functions to convert from and to nsurl --- utils/file.c | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- utils/file.h | 78 ++++++++++++++++++++++++++++++---- 2 files changed, 198 insertions(+), 14 deletions(-) (limited to 'utils') diff --git a/utils/file.c b/utils/file.c index cb85d0e90..a2f1e94d0 100644 --- a/utils/file.c +++ b/utils/file.c @@ -22,10 +22,14 @@ #include #include +#include #include "desktop/gui_factory.h" -#include "utils/utils.h" +#include "utils/utils.h" +#include "utils/corestrings.h" +#include "utils/url.h" +#include "utils/nsurl.h" #include "utils/file.h" /** @@ -90,6 +94,118 @@ static nserror posix_basename(const char *path, char **str, size_t *size) return NSERROR_OK; } +/** + * Create a path from a nsurl using posix file handling. + * + * @parm[in] url The url to encode. + * @param[out] path_out A string containing the result path which should + * be freed by the caller. + * @return NSERROR_OK and the path is written to \a path or error code + * on faliure. + */ +static nserror posix_nsurl_to_path(struct nsurl *url, char **path_out) +{ + lwc_string *urlpath; + char *path; + bool match; + lwc_string *scheme; + nserror res; + + if ((url == NULL) || (path_out == NULL)) { + return NSERROR_BAD_PARAMETER; + } + + scheme = nsurl_get_component(url, NSURL_SCHEME); + + if (lwc_string_caseless_isequal(scheme, corestring_lwc_file, + &match) != lwc_error_ok) + { + return NSERROR_BAD_PARAMETER; + } + lwc_string_unref(scheme); + if (match == false) { + return NSERROR_BAD_PARAMETER; + } + + urlpath = nsurl_get_component(url, NSURL_PATH); + if (urlpath == NULL) { + return NSERROR_BAD_PARAMETER; + } + + res = url_unescape(lwc_string_data(urlpath), &path); + lwc_string_unref(urlpath); + if (res != NSERROR_OK) { + return res; + } + + *path_out = path; + + return NSERROR_OK; +} + +/** + * Create a nsurl from a path using posix file handling. + * + * Perform the necessary operations on a path to generate a nsurl. + * + * @param[in] path The path to convert. + * @param[out] url_out pointer to recive the nsurl, The returned url + * should be unreferenced by the caller. + * @return NSERROR_OK and the url is placed in \a url or error code on + * faliure. + */ +static nserror posix_path_to_nsurl(const char *path, struct nsurl **url_out) +{ + nserror ret; + int urllen; + char *urlstr; + char *escpath; /* escaped version of the path */ + char *escpaths; + + if ((path == NULL) || (url_out == NULL) || (*path == 0)) { + return NSERROR_BAD_PARAMETER; + } + + /* escape the path so it can be placed in a url */ + ret = url_escape(path, 0, false, "/", &escpath); + if (ret != NSERROR_OK) { + return ret; + } + /* remove unecessary / as file: paths are already absolute */ + escpaths = escpath; + while (*escpaths == '/') { + escpaths++; + } + + /* build url as a string for nsurl constructor */ + urllen = strlen(escpaths) + FILE_SCHEME_PREFIX_LEN + 1; + urlstr = malloc(urllen); + if (urlstr == NULL) { + free(escpath); + return NSERROR_NOMEM; + } + + snprintf(urlstr, urllen, "%s%s", FILE_SCHEME_PREFIX, escpaths); + free(escpath); + + ret = nsurl_create(urlstr, url_out); + free(urlstr); + + return ret; +} + +/** + * default to using the posix file handling + */ +static struct gui_file_table file_table = { + .mkpath = posix_vmkpath, + .basename = posix_basename, + .nsurl_to_path = posix_nsurl_to_path, + .path_to_nsurl = posix_path_to_nsurl, +}; + +struct gui_file_table *default_file_table = &file_table; + /* exported interface documented in utils/file.h */ nserror netsurf_mkpath(char **str, size_t *size, size_t nelm, ...) { @@ -103,10 +219,14 @@ nserror netsurf_mkpath(char **str, size_t *size, size_t nelm, ...) return ret; } -/* default to using the posix file handling */ -static struct gui_file_table file_table = { - .mkpath = posix_vmkpath, - .basename = posix_basename, -}; +/* exported interface documented in utils/file.h */ +nserror netsurf_nsurl_to_path(struct nsurl *url, char **path_out) +{ + return guit->file->nsurl_to_path(url, path_out); +} -struct gui_file_table *default_file_table = &file_table; +/* exported interface documented in utils/file.h */ +nserror netsurf_path_to_nsurl(const char *path, struct nsurl **url) +{ + return guit->file->path_to_nsurl(path, url); +} diff --git a/utils/file.h b/utils/file.h index f183337c5..2e47e1fa1 100644 --- a/utils/file.h +++ b/utils/file.h @@ -16,8 +16,20 @@ * along with this program. If not, see . */ -/** \file - * Default operations table for files. +/** + * \file utils/file.h + * \brief Default operations table for files. + * + * These are file operations that depend upon the filesystem the + * browser is operating on. These allow the core browser functionality + * to be filesystem agnostic. + * + * The provided defaults operate on POSIX path names with / as a + * directory separator in a single hieracy from a root directory. + * + * Other path conventions require the default operations to be + * overridden. For example windows frontend runs on a filesystem with + * drive letter and a \\ as a separator. */ #ifndef NETSURF_UTILS_FILE_H @@ -25,11 +37,15 @@ #include +struct nsurl; + /** - * function table for file and filename operations. + * /brief function table for file and filename operations. * - * function table implementing GUI interface to file and filename - * functionality appropriate for the OS. + * function table implementing an interface to file and filename + * functionality appropriate for the OS filesystem. All paths are in + * terms of the OS filesystem convention and must not require additional + * system specific changes. */ struct gui_file_table { /* Mandantory entries */ @@ -45,7 +61,7 @@ struct gui_file_table { * NULL on input and if not NULL set to the total * output length on output. * @param[in] nemb The number of elements. - * @param[in] ... The elements of the path as string pointers. + * @param[in] ap The elements of the path as string pointers. * @return NSERROR_OK and the complete path is written to str * or error code on faliure. */ @@ -62,10 +78,34 @@ struct gui_file_table { * @param[in,out] size The size of the space available if \a * str not NULL on input and set to the total * output length on output. - * @return NSERROR_OK and the complete path is written to str + * @return NSERROR_OK and the complete path is written to \a str * or error code on faliure. */ nserror (*basename)(const char *path, char **str, size_t *size); + + /** + * Create a path from a nsurl. + * + * @parm[in] url The url to encode. + * @param[out] path A string containing the result path which + * must be freed by the caller. + * @return NSERROR_OK and the path is written to \a path + * or error code on faliure. + */ + nserror (*nsurl_to_path)(struct nsurl *url, char **path); + + /** + * Create a nsurl from a path. + * + * Perform the necessary operations on a path to generate a nsurl. + * + * @param[in] path The path to convert. + * @param[out] url pointer to recive the nsurl, The returned + * url should be unreferenced by the caller. + * @return NSERROR_OK and the url is placed in \a url or error + * code on faliure. + */ + nserror (*path_to_nsurl)(const char *path, struct nsurl **url); }; /** Default (posix) file operation table. */ @@ -92,4 +132,28 @@ struct gui_file_table *default_file_table; */ nserror netsurf_mkpath(char **str, size_t *size, size_t nelm, ...); +/** + * Create a path from a nsurl. + * + * @parm[in] url The url to encode. + * @param[out] path_out A string containing the result path which must be + * freed by the caller. + * @return NSERROR_OK and the path is written to \a path_out or error code on + * faliure. + */ +nserror netsurf_nsurl_to_path(struct nsurl *url, char **path_out); + +/** + * Create a nsurl from a path. + * + * Perform the necessary operations on a path to generate a nsurl. + * + * @param[in] path The path to convert. + * @param[out] url pointer to recive the nsurl, The returned + * url should be unreferenced by the caller. + * @return NSERROR_OK and the url is placed in \a url or error + * code on faliure. + */ +nserror netsurf_path_to_nsurl(const char *path, struct nsurl **url); + #endif -- cgit v1.2.3