mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-12-22 04:02:34 +03:00
rework path to url mapping functions to convert from and to nsurl
This commit is contained in:
parent
1f337f292d
commit
00b6cfc57e
@ -76,7 +76,7 @@ static const ULONG ami_file_asl_mime_hook(struct Hook *mh,
|
||||
|
||||
void ami_file_open(struct gui_window_2 *gwin)
|
||||
{
|
||||
char *temp, *temp2;
|
||||
char *temp;
|
||||
nsurl *url;
|
||||
|
||||
if(AslRequestTags(filereq,
|
||||
@ -93,9 +93,8 @@ void ami_file_open(struct gui_window_2 *gwin)
|
||||
{
|
||||
strlcpy(temp, filereq->fr_Drawer, 1024);
|
||||
AddPart(temp, filereq->fr_File, 1024);
|
||||
temp2 = path_to_url(temp);
|
||||
|
||||
if (nsurl_create(temp2, &url) != NSERROR_OK) {
|
||||
if (netsurf_path_to_nsurl(temp, &url) != NSERROR_OK) {
|
||||
warn_user("NoMemory", 0);
|
||||
} else {
|
||||
browser_window_navigate(gwin->bw,
|
||||
@ -108,7 +107,6 @@ void ami_file_open(struct gui_window_2 *gwin)
|
||||
nsurl_unref(url);
|
||||
}
|
||||
|
||||
free(temp2);
|
||||
FreeVec(temp);
|
||||
}
|
||||
}
|
||||
|
160
amiga/gui.c
160
amiga/gui.c
@ -222,127 +222,6 @@ static void gui_window_place_caret(struct gui_window *g, int x, int y, int heigh
|
||||
nsoptions_default[NSOPTION_##OPTION].value.i = VALUE
|
||||
|
||||
|
||||
/**
|
||||
* Generate a posix path from one or more component elemnts.
|
||||
*
|
||||
* If a string is allocated it must be freed by the caller.
|
||||
*
|
||||
* @param[in,out] str pointer to string pointer if this is NULL enough
|
||||
* storage will be allocated for the complete path.
|
||||
* @param[in,out] size The size of the space available if \a str not
|
||||
* 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.
|
||||
* @return NSERROR_OK and the complete path is written to str
|
||||
* or error code on faliure.
|
||||
*/
|
||||
static nserror amiga_vmkpath(char **str, size_t *size, size_t nelm, va_list ap)
|
||||
{
|
||||
const char *elm[16];
|
||||
size_t elm_len[16];
|
||||
size_t elm_idx;
|
||||
char *fname;
|
||||
size_t fname_len = 0;
|
||||
|
||||
/* check the parameters are all sensible */
|
||||
if ((nelm == 0) || (nelm > 16)) {
|
||||
return NSERROR_BAD_PARAMETER;
|
||||
}
|
||||
if ((*str != NULL) && (size == NULL)) {
|
||||
/* if the caller is providing the buffer they must say
|
||||
* how much space is available.
|
||||
*/
|
||||
return NSERROR_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
/* calculate how much storage we need for the complete path
|
||||
* with all the elements.
|
||||
*/
|
||||
for (elm_idx = 0; elm_idx < nelm; elm_idx++) {
|
||||
elm[elm_idx] = va_arg(ap, const char *);
|
||||
/* check the argument is not NULL */
|
||||
if (elm[elm_idx] == NULL) {
|
||||
return NSERROR_BAD_PARAMETER;
|
||||
}
|
||||
elm_len[elm_idx] = strlen(elm[elm_idx]);
|
||||
fname_len += elm_len[elm_idx];
|
||||
}
|
||||
fname_len += nelm; /* allow for separators and terminator */
|
||||
|
||||
/* ensure there is enough space */
|
||||
fname = *str;
|
||||
if (fname != NULL) {
|
||||
if (fname_len > *size) {
|
||||
return NSERROR_NOSPACE;
|
||||
}
|
||||
} else {
|
||||
fname = malloc(fname_len);
|
||||
if (fname == NULL) {
|
||||
return NSERROR_NOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
/* copy the first element complete */
|
||||
memmove(fname, elm[0], elm_len[0]);
|
||||
fname[elm_len[0]] = 0;
|
||||
|
||||
/* add the remaining elements */
|
||||
for (elm_idx = 1; elm_idx < nelm; elm_idx++) {
|
||||
if (!AddPart(fname, elm[elm_idx], fname_len)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
*str = fname;
|
||||
if (size != NULL) {
|
||||
*size = fname_len;
|
||||
}
|
||||
|
||||
return NSERROR_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the basename of a file using posix path handling.
|
||||
*
|
||||
* This gets the last element of a path and returns it.
|
||||
*
|
||||
* @param[in] path The path to extract the name from.
|
||||
* @param[in,out] str Pointer to string pointer if this is NULL enough
|
||||
* storage will be allocated for the path element.
|
||||
* @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
|
||||
* or error code on faliure.
|
||||
*/
|
||||
static nserror amiga_basename(const char *path, char **str, size_t *size)
|
||||
{
|
||||
const char *leafname;
|
||||
char *fname;
|
||||
|
||||
if (path == NULL) {
|
||||
return NSERROR_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
leafname = FilePart(path);
|
||||
if (leafname == NULL) {
|
||||
return NSERROR_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
fname = strdup(leafname);
|
||||
if (fname == NULL) {
|
||||
return NSERROR_NOMEM;
|
||||
}
|
||||
|
||||
*str = fname;
|
||||
if (size != NULL) {
|
||||
*size = strlen(fname);
|
||||
}
|
||||
return NSERROR_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
STRPTR ami_locale_langs(void)
|
||||
{
|
||||
@ -778,11 +657,7 @@ static nsurl *gui_get_resource_url(const char *path)
|
||||
else return NULL;
|
||||
}
|
||||
|
||||
raw = path_to_url(buf);
|
||||
if (raw != NULL) {
|
||||
nsurl_create(raw, &url);
|
||||
free(raw);
|
||||
}
|
||||
netsurf_path_to_nsurl(buf, &url);
|
||||
|
||||
return url;
|
||||
}
|
||||
@ -1036,7 +911,13 @@ static void gui_init2(int argc, char** argv)
|
||||
DevNameFromLock(wbarg->wa_Lock,fullpath,1024,DN_FULLPATH);
|
||||
AddPart(fullpath,wbarg->wa_Name,1024);
|
||||
|
||||
if(!temp_homepage_url) temp_homepage_url = path_to_url(fullpath);
|
||||
if(!temp_homepage_url) {
|
||||
nsurl temp_url;
|
||||
if (netsurf_path_to_nsurl(fullpath, &temp_url) == NSERROR_OK) {
|
||||
temp_homepage_url = strcpy(nsurl_data(temp_url));
|
||||
nsurl_unref(temp_url);
|
||||
}
|
||||
}
|
||||
|
||||
if(notalreadyrunning)
|
||||
{
|
||||
@ -2378,7 +2259,6 @@ void ami_handle_appmsg(void)
|
||||
int x, y;
|
||||
struct WBArg *appwinargs;
|
||||
STRPTR filename;
|
||||
char *urlfilename;
|
||||
int i = 0;
|
||||
|
||||
while(appmsg=(struct AppMessage *)GetMsg(appport))
|
||||
@ -2410,9 +2290,8 @@ void ami_handle_appmsg(void)
|
||||
appmsg->am_MouseX, appmsg->am_MouseY) == false)
|
||||
{
|
||||
nsurl *url;
|
||||
urlfilename = path_to_url(filename);
|
||||
|
||||
if (nsurl_create(urlfilename, &url) != NSERROR_OK) {
|
||||
if (netsurf_path_to_nsurl(filename, &url) != NSERROR_OK) {
|
||||
warn_user("NoMemory", 0);
|
||||
}
|
||||
else
|
||||
@ -2440,17 +2319,14 @@ void ami_handle_appmsg(void)
|
||||
}
|
||||
nsurl_unref(url);
|
||||
}
|
||||
|
||||
free(urlfilename);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(browser_window_drop_file_at_point(gwin->bw, x, y, filename) == false)
|
||||
{
|
||||
nsurl *url;
|
||||
urlfilename = path_to_url(filename);
|
||||
|
||||
if (nsurl_create(urlfilename, &url) != NSERROR_OK) {
|
||||
if (netsurf_path_to_nsurl(filename, &url) != NSERROR_OK) {
|
||||
warn_user("NoMemory", 0);
|
||||
}
|
||||
else
|
||||
@ -2480,7 +2356,6 @@ void ami_handle_appmsg(void)
|
||||
}
|
||||
nsurl_unref(url);
|
||||
}
|
||||
free(urlfilename);
|
||||
}
|
||||
}
|
||||
FreeVec(filename);
|
||||
@ -2527,11 +2402,8 @@ void ami_handle_applib(void)
|
||||
{
|
||||
struct ApplicationOpenPrintDocMsg *applibopdmsg =
|
||||
(struct ApplicationOpenPrintDocMsg *)applibmsg;
|
||||
char *tempurl;
|
||||
|
||||
tempurl = path_to_url(applibopdmsg->fileName);
|
||||
|
||||
error = nsurl_create(tempurl, &url);
|
||||
error = netsurf_path_to_nsurl(applibopdmsg->fileName, &url);
|
||||
if (error == NSERROR_OK) {
|
||||
error = browser_window_create(BW_CREATE_HISTORY,
|
||||
url,
|
||||
@ -2543,7 +2415,6 @@ void ami_handle_applib(void)
|
||||
if (error != NSERROR_OK) {
|
||||
warn_user(messages_get_errorcode(error), 0);
|
||||
}
|
||||
free(tempurl);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -5206,16 +5077,9 @@ static struct gui_window_table amiga_window_table = {
|
||||
.save_link = gui_window_save_link,
|
||||
};
|
||||
|
||||
/* amiga file handling operations */
|
||||
static struct gui_file_table amiga_file_table = {
|
||||
.mkpath = amiga_vmkpath,
|
||||
.basename = amiga_basename,
|
||||
};
|
||||
|
||||
static struct gui_fetch_table amiga_fetch_table = {
|
||||
.filetype = fetch_filetype,
|
||||
.path_to_url = path_to_url,
|
||||
.url_to_path = url_to_path,
|
||||
|
||||
.get_resource_url = gui_get_resource_url,
|
||||
};
|
||||
@ -5253,7 +5117,7 @@ int main(int argc, char** argv)
|
||||
.clipboard = amiga_clipboard_table,
|
||||
.download = amiga_download_table,
|
||||
.fetch = &amiga_fetch_table,
|
||||
.file = &amiga_file_table,
|
||||
.file = amiga_file_table,
|
||||
.utf8 = amiga_utf8_table,
|
||||
.search = amiga_search_table,
|
||||
.search_web = &amiga_search_web_table,
|
||||
|
@ -144,14 +144,12 @@ bool amiga_icon_convert(struct content *c)
|
||||
uint8 r, g, b, a;
|
||||
ULONG offset;
|
||||
const char *url;
|
||||
char *filename;
|
||||
char *filename = NULL;
|
||||
char *p;
|
||||
ULONG trans, pals1;
|
||||
struct ColorRegister *pal1;
|
||||
|
||||
url = nsurl_access(content_get_url(c));
|
||||
filename = url_to_path(url);
|
||||
|
||||
netsurf_nsurl_to_path(content_get_url(c), &filename);
|
||||
/* This loader will only work on local files, so fail if not a local path */
|
||||
if(filename == NULL)
|
||||
{
|
||||
|
222
amiga/misc.c
222
amiga/misc.c
@ -36,6 +36,7 @@
|
||||
#include "utils/log.h"
|
||||
#include "utils/messages.h"
|
||||
#include "utils/url.h"
|
||||
#include "utils/file.h"
|
||||
#include "utils/utils.h"
|
||||
|
||||
void warn_user(const char *warning, const char *detail)
|
||||
@ -105,54 +106,91 @@ void die(const char *error)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
char *url_to_path(const char *url)
|
||||
/**
|
||||
* Create a path from a nsurl using amiga 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 amiga_nsurl_to_path(struct nsurl *url, char **path_out)
|
||||
{
|
||||
char *unesc, *slash, *colon, *url2;
|
||||
lwc_string *urlpath;
|
||||
char *path;
|
||||
bool match;
|
||||
lwc_string *scheme;
|
||||
nserror res;
|
||||
char *colon;
|
||||
char *slash;
|
||||
|
||||
if (strncmp(url, "file://", SLEN("file://")) != 0)
|
||||
return NULL;
|
||||
if ((url == NULL) || (path_out == NULL)) {
|
||||
return NSERROR_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
url += SLEN("file://");
|
||||
scheme = nsurl_get_component(url, NSURL_SCHEME);
|
||||
|
||||
if (strncmp(url, "localhost", SLEN("localhost")) == 0)
|
||||
url += SLEN("localhost");
|
||||
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;
|
||||
}
|
||||
|
||||
if (strncmp(url, "/", SLEN("/")) == 0)
|
||||
url += SLEN("/");
|
||||
urlpath = nsurl_get_component(url, NSURL_PATH);
|
||||
if (urlpath == NULL) {
|
||||
return NSERROR_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
if(*url == '\0')
|
||||
return NULL; /* file:/// is not a valid path */
|
||||
res = url_unescape(lwc_string_data(urlpath) + 1, &path);
|
||||
lwc_string_unref(urlpath);
|
||||
if (res != NSERROR_OK) {
|
||||
return res;
|
||||
}
|
||||
|
||||
url2 = malloc(strlen(url) + 2);
|
||||
strcpy(url2, url);
|
||||
|
||||
colon = strchr(url2, ':');
|
||||
colon = strchr(path, ':');
|
||||
if(colon == NULL)
|
||||
{
|
||||
if(slash = strchr(url2, '/'))
|
||||
slash = strchr(path, '/');
|
||||
if(slash)
|
||||
{
|
||||
*slash = ':';
|
||||
}
|
||||
else
|
||||
{
|
||||
int len = strlen(url2);
|
||||
url2[len] = ':';
|
||||
url2[len + 1] = '\0';
|
||||
int len = strlen(path);
|
||||
path[len] = ':';
|
||||
path[len + 1] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
if(url_unescape(url2,&unesc) == NSERROR_OK)
|
||||
return unesc;
|
||||
*path_out = path;
|
||||
|
||||
return (char *)url2;
|
||||
return NSERROR_OK;
|
||||
}
|
||||
|
||||
char *path_to_url(const char *path)
|
||||
/**
|
||||
* Create a nsurl from a path using amiga 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
|
||||
* must be unreferenced by the caller.
|
||||
* @return NSERROR_OK and the url is placed in \a url or error code on
|
||||
* faliure.
|
||||
*/
|
||||
static nserror amiga_path_to_nsurl(const char *path, struct nsurl **url_out)
|
||||
{
|
||||
char *colon = NULL;
|
||||
char *r = NULL;
|
||||
char newpath[1024 + strlen(path)];
|
||||
BPTR lock = 0;
|
||||
nserror ret;
|
||||
|
||||
if(lock = Lock(path, MODE_OLDFILE))
|
||||
{
|
||||
@ -162,13 +200,19 @@ char *path_to_url(const char *path)
|
||||
else strlcpy(newpath, path, sizeof newpath);
|
||||
|
||||
r = malloc(strlen(newpath) + SLEN("file:///") + 1);
|
||||
if (r == NULL) {
|
||||
return NSERROR_NOMEM;
|
||||
}
|
||||
|
||||
if(colon = strchr(newpath, ':')) *colon = '/';
|
||||
|
||||
strcpy(r, "file:///");
|
||||
strcat(r, newpath);
|
||||
|
||||
return r;
|
||||
ret = nsurl_create(r, url_out);
|
||||
free(r);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -196,3 +240,133 @@ char *translate_escape_chars(const char *s)
|
||||
ret[ii] = '\0';
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a posix path from one or more component elemnts.
|
||||
*
|
||||
* If a string is allocated it must be freed by the caller.
|
||||
*
|
||||
* @param[in,out] str pointer to string pointer if this is NULL enough
|
||||
* storage will be allocated for the complete path.
|
||||
* @param[in,out] size The size of the space available if \a str not
|
||||
* 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.
|
||||
* @return NSERROR_OK and the complete path is written to str
|
||||
* or error code on faliure.
|
||||
*/
|
||||
static nserror amiga_vmkpath(char **str, size_t *size, size_t nelm, va_list ap)
|
||||
{
|
||||
const char *elm[16];
|
||||
size_t elm_len[16];
|
||||
size_t elm_idx;
|
||||
char *fname;
|
||||
size_t fname_len = 0;
|
||||
|
||||
/* check the parameters are all sensible */
|
||||
if ((nelm == 0) || (nelm > 16)) {
|
||||
return NSERROR_BAD_PARAMETER;
|
||||
}
|
||||
if ((*str != NULL) && (size == NULL)) {
|
||||
/* if the caller is providing the buffer they must say
|
||||
* how much space is available.
|
||||
*/
|
||||
return NSERROR_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
/* calculate how much storage we need for the complete path
|
||||
* with all the elements.
|
||||
*/
|
||||
for (elm_idx = 0; elm_idx < nelm; elm_idx++) {
|
||||
elm[elm_idx] = va_arg(ap, const char *);
|
||||
/* check the argument is not NULL */
|
||||
if (elm[elm_idx] == NULL) {
|
||||
return NSERROR_BAD_PARAMETER;
|
||||
}
|
||||
elm_len[elm_idx] = strlen(elm[elm_idx]);
|
||||
fname_len += elm_len[elm_idx];
|
||||
}
|
||||
fname_len += nelm; /* allow for separators and terminator */
|
||||
|
||||
/* ensure there is enough space */
|
||||
fname = *str;
|
||||
if (fname != NULL) {
|
||||
if (fname_len > *size) {
|
||||
return NSERROR_NOSPACE;
|
||||
}
|
||||
} else {
|
||||
fname = malloc(fname_len);
|
||||
if (fname == NULL) {
|
||||
return NSERROR_NOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
/* copy the first element complete */
|
||||
memmove(fname, elm[0], elm_len[0]);
|
||||
fname[elm_len[0]] = 0;
|
||||
|
||||
/* add the remaining elements */
|
||||
for (elm_idx = 1; elm_idx < nelm; elm_idx++) {
|
||||
if (!AddPart(fname, elm[elm_idx], fname_len)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
*str = fname;
|
||||
if (size != NULL) {
|
||||
*size = fname_len;
|
||||
}
|
||||
|
||||
return NSERROR_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the basename of a file using posix path handling.
|
||||
*
|
||||
* This gets the last element of a path and returns it.
|
||||
*
|
||||
* @param[in] path The path to extract the name from.
|
||||
* @param[in,out] str Pointer to string pointer if this is NULL enough
|
||||
* storage will be allocated for the path element.
|
||||
* @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
|
||||
* or error code on faliure.
|
||||
*/
|
||||
static nserror amiga_basename(const char *path, char **str, size_t *size)
|
||||
{
|
||||
const char *leafname;
|
||||
char *fname;
|
||||
|
||||
if (path == NULL) {
|
||||
return NSERROR_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
leafname = FilePart(path);
|
||||
if (leafname == NULL) {
|
||||
return NSERROR_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
fname = strdup(leafname);
|
||||
if (fname == NULL) {
|
||||
return NSERROR_NOMEM;
|
||||
}
|
||||
|
||||
*str = fname;
|
||||
if (size != NULL) {
|
||||
*size = strlen(fname);
|
||||
}
|
||||
return NSERROR_OK;
|
||||
}
|
||||
|
||||
/* amiga file handling operations */
|
||||
static struct gui_file_table file_table = {
|
||||
.mkpath = amiga_vmkpath,
|
||||
.basename = amiga_basename,
|
||||
.nsurl_to_path = amiga_nsurl_to_path,
|
||||
.path_to_nsurl = amiga_path_to_nsurl,
|
||||
};
|
||||
|
||||
struct gui_file_table *amiga_file_table = &file_table;
|
||||
|
@ -19,9 +19,10 @@
|
||||
#ifndef AMIGA_MISC_H
|
||||
#define AMIGA_MISC_H
|
||||
|
||||
extern struct gui_file_table *amiga_file_table;
|
||||
|
||||
char *translate_escape_chars(const char *s);
|
||||
int32 ami_warn_user_multi(const char *body, const char *opt1, const char *opt2, struct Window *win);
|
||||
char *url_to_path(const char *url);
|
||||
char *path_to_url(const char *path);
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -68,59 +68,6 @@ char * local_file_to_url( const char * filename )
|
||||
#undef BACKSLASH
|
||||
}
|
||||
|
||||
/* convert an local path to an URL, memory for URL is allocated. */
|
||||
char *path_to_url(const char *path_in)
|
||||
{
|
||||
#define BACKSLASH 0x5C
|
||||
char * path;
|
||||
|
||||
LOG(("path2url in: %s\n", path_in));
|
||||
|
||||
path = (char*)path_in;
|
||||
|
||||
int urllen = strlen(path) + FILE_SCHEME_PREFIX_LEN + 1;
|
||||
char *url = malloc(urllen);
|
||||
|
||||
snprintf(url, urllen, "%s%s", FILE_SCHEME_PREFIX, path);
|
||||
|
||||
int i=0;
|
||||
while( url[i] != 0 ){
|
||||
if( url[i] == BACKSLASH ){
|
||||
url[i] = '/';
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
LOG(("path2url out: %s\n", url));
|
||||
return url;
|
||||
#undef BACKSLASH
|
||||
}
|
||||
|
||||
|
||||
char *url_to_path(const char *url)
|
||||
{
|
||||
char *url_path = curl_unescape(url, 0);
|
||||
char *path;
|
||||
char abspath[PATH_MAX+1];
|
||||
|
||||
LOG(( "url2path in: %s (%s)\n", url, url_path ));
|
||||
|
||||
// is the URL relative?
|
||||
if (url_path[7] == '.') {
|
||||
// yes, make it absolute...
|
||||
gemdos_realpath(url_path + (FILE_SCHEME_PREFIX_LEN-1), abspath);
|
||||
path = strdup(abspath);
|
||||
} else {
|
||||
path = strdup(url_path + (FILE_SCHEME_PREFIX_LEN));
|
||||
}
|
||||
|
||||
curl_free(url_path);
|
||||
|
||||
LOG(( "url2path out: %s\n", path ));
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Locate a shared resource file by searching known places in order.
|
||||
|
@ -23,7 +23,5 @@
|
||||
extern char *atari_find_resource(char *buf, const char *filename, const char *def);
|
||||
char *local_file_to_url(const char *filename);
|
||||
|
||||
char *path_to_url(const char *path_in);
|
||||
char *url_to_path(const char *url);
|
||||
|
||||
#endif /* NETSURF_ATARI_FINDFILE_H */
|
||||
|
10
atari/gui.c
10
atari/gui.c
@ -890,15 +890,11 @@ static inline void create_cursor(int flags, short mode, void * form,
|
||||
static nsurl *gui_get_resource_url(const char *path)
|
||||
{
|
||||
char buf[PATH_MAX];
|
||||
char *raw;
|
||||
nsurl *url = NULL;
|
||||
|
||||
atari_find_resource((char*)&buf, path, path);
|
||||
raw = path_to_url((char*)&buf);
|
||||
if (raw != NULL) {
|
||||
nsurl_create(raw, &url);
|
||||
free(raw);
|
||||
}
|
||||
|
||||
netsurf_path_to_nsurl(buf, &url);
|
||||
|
||||
return url;
|
||||
}
|
||||
@ -1042,8 +1038,6 @@ static struct gui_clipboard_table atari_clipboard_table = {
|
||||
|
||||
static struct gui_fetch_table atari_fetch_table = {
|
||||
.filetype = fetch_filetype,
|
||||
.path_to_url = path_to_url,
|
||||
.url_to_path = url_to_path,
|
||||
|
||||
.get_resource_url = gui_get_resource_url,
|
||||
};
|
||||
|
20
atari/misc.c
20
atari/misc.c
@ -210,7 +210,6 @@ static nserror load_icon_callback(hlcache_handle *handle,
|
||||
hlcache_handle *load_icon(const char *name, hlcache_handle_callback cb,
|
||||
void * pw )
|
||||
{
|
||||
char *url = NULL;
|
||||
const char *icon_url = NULL;
|
||||
hlcache_handle *c;
|
||||
nserror err;
|
||||
@ -220,7 +219,7 @@ hlcache_handle *load_icon(const char *name, hlcache_handle_callback cb,
|
||||
/** @todo something like bitmap_from_disc is needed here */
|
||||
|
||||
if (!strncmp(name, "file://", 7)) {
|
||||
icon_url = name;
|
||||
err = nsurl_create(name, &icon_nsurl);
|
||||
} else {
|
||||
char *native_path = NULL;
|
||||
|
||||
@ -228,22 +227,15 @@ hlcache_handle *load_icon(const char *name, hlcache_handle_callback cb,
|
||||
return NULL;
|
||||
|
||||
err = netsurf_mkpath(&native_path, NULL, 2, icons_dir, name);
|
||||
if (err != NSERROR_OK) {
|
||||
warn_user(messages_get_errorcode(err), 0);
|
||||
return NULL;
|
||||
if (err == NSERROR_OK) {
|
||||
/* Convert native path to URL */
|
||||
err = netsurf_path_to_nsurl(native_path, &icon_nsurl);
|
||||
free(native_path);
|
||||
}
|
||||
|
||||
/* Convert native path to URL */
|
||||
url = path_to_url(native_path);
|
||||
|
||||
free(native_path);
|
||||
icon_url = url;
|
||||
}
|
||||
|
||||
err = nsurl_create(icon_url, &icon_nsurl);
|
||||
if (err != NSERROR_OK) {
|
||||
if (url != NULL)
|
||||
free(url);
|
||||
warn_user(messages_get_errorcode(err), 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
21
beos/gui.cpp
21
beos/gui.cpp
@ -964,25 +964,6 @@ static void nsbeos_create_ssl_verify_window(struct browser_window *bw,
|
||||
CALLED();
|
||||
}
|
||||
|
||||
static char *path_to_url(const char *path)
|
||||
{
|
||||
int urllen = strlen(path) + FILE_SCHEME_PREFIX_LEN + 1;
|
||||
char *url = (char *)malloc(urllen);
|
||||
|
||||
if (url == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (*path == '/') {
|
||||
path++; /* file: paths are already absolute */
|
||||
}
|
||||
|
||||
snprintf(url, urllen, "%s%s", FILE_SCHEME_PREFIX, path);
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
|
||||
static void *myrealloc(void *ptr, size_t len, void *pw)
|
||||
{
|
||||
if (len == 0) {
|
||||
@ -1001,8 +982,6 @@ static struct gui_clipboard_table beos_clipboard_table = {
|
||||
|
||||
static struct gui_fetch_table beos_fetch_table = {
|
||||
fetch_filetype,
|
||||
path_to_url,
|
||||
url_to_path,
|
||||
gui_get_resource_url,
|
||||
NULL //fetch_mimetype
|
||||
};
|
||||
|
@ -28,6 +28,7 @@
|
||||
|
||||
#import "utils/corestrings.h"
|
||||
#import "utils/filename.h"
|
||||
#import "utils/file.h"
|
||||
#import "utils/messages.h"
|
||||
#import "utils/url.h"
|
||||
#import "content/hlcache.h"
|
||||
@ -166,7 +167,7 @@
|
||||
struct hlcache_handle *content;
|
||||
size_t size;
|
||||
const char *source;
|
||||
const char *path = NULL;
|
||||
char *path = NULL;
|
||||
|
||||
if (browser == NULL)
|
||||
return;
|
||||
@ -178,14 +179,7 @@
|
||||
return;
|
||||
|
||||
/* try to load local files directly. */
|
||||
lwc_string *scheme = nsurl_get_component(hlcache_handle_get_url(content), NSURL_SCHEME);
|
||||
if (scheme == NULL)
|
||||
return;
|
||||
|
||||
bool match;
|
||||
if (lwc_string_isequal(scheme, corestring_lwc_file, &match) == lwc_error_ok && match == true)
|
||||
path = url_to_path(nsurl_access(hlcache_handle_get_url(content)));
|
||||
lwc_string_unref(scheme);
|
||||
netsurf_nsurl_to_path(hlcache_handle_get_url(content), &path);
|
||||
|
||||
if (path == NULL) {
|
||||
/* We cannot release the requested filename until after it
|
||||
|
@ -17,5 +17,3 @@
|
||||
*/
|
||||
|
||||
extern struct gui_fetch_table *cocoa_fetch_table;
|
||||
|
||||
char *url_to_path(const char *url);
|
||||
|
@ -95,18 +95,6 @@ static const char *fetch_filetype(const char *unix_path)
|
||||
return cocoafiletype;
|
||||
}
|
||||
|
||||
char *url_to_path(const char *url)
|
||||
{
|
||||
NSURL *nsurl = [NSURL URLWithString: [NSString stringWithUTF8String: url]];
|
||||
return strdup([[nsurl path] UTF8String]);
|
||||
}
|
||||
|
||||
static char *path_to_url(const char *path)
|
||||
{
|
||||
return strdup( [[[NSURL fileURLWithPath: [NSString stringWithUTF8String: path]]
|
||||
absoluteString] UTF8String] );
|
||||
}
|
||||
|
||||
static nsurl *gui_get_resource_url(const char *path)
|
||||
{
|
||||
nsurl *url = NULL;
|
||||
@ -118,8 +106,6 @@ static nsurl *gui_get_resource_url(const char *path)
|
||||
|
||||
static struct gui_fetch_table fetch_table = {
|
||||
.filetype = fetch_filetype,
|
||||
.path_to_url = path_to_url,
|
||||
.url_to_path = url_to_path,
|
||||
|
||||
.get_resource_url = gui_get_resource_url,
|
||||
};
|
||||
|
@ -24,9 +24,12 @@
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "content/dirlist.h"
|
||||
|
||||
#include "utils/nsurl.h"
|
||||
#include "utils/messages.h"
|
||||
|
||||
#include "content/dirlist.h"
|
||||
|
||||
static int dirlist_filesize_calculate(unsigned long *bytesize);
|
||||
static int dirlist_filesize_value(unsigned long bytesize);
|
||||
static char* dirlist_filesize_unit(unsigned long bytesize);
|
||||
@ -262,7 +265,7 @@ bool dirlist_generate_headings(char *buffer, int buffer_length)
|
||||
* dirlist_generate_bottom()
|
||||
*/
|
||||
|
||||
bool dirlist_generate_row(bool even, bool directory, char *url, char *name,
|
||||
bool dirlist_generate_row(bool even, bool directory, nsurl *url, char *name,
|
||||
const char *mimetype, long long size, char *date, char *time,
|
||||
char *buffer, int buffer_length)
|
||||
{
|
||||
@ -288,7 +291,7 @@ bool dirlist_generate_row(bool even, bool directory, char *url, char *name,
|
||||
"\t<span class=\"date\">%s</span>\n"
|
||||
"\t<span class=\"time\">%s</span>\n"
|
||||
"</a>\n",
|
||||
url, even ? "even" : "odd",
|
||||
nsurl_access(url), even ? "even" : "odd",
|
||||
directory ? "dir" : "file",
|
||||
name, mimetype, size_string, unit, date, time);
|
||||
if (error < 0 || error >= buffer_length)
|
||||
|
@ -39,7 +39,7 @@ bool dirlist_generate_title(const char *title, char *buffer, int buffer_length);
|
||||
bool dirlist_generate_parent_link(const char *parent, char *buffer,
|
||||
int buffer_length);
|
||||
bool dirlist_generate_headings(char *buffer, int buffer_length);
|
||||
bool dirlist_generate_row(bool even, bool directory, char *url, char *name,
|
||||
bool dirlist_generate_row(bool even, bool directory, nsurl *url, char *name,
|
||||
const char *mimetype, long long size, char *date, char *time,
|
||||
char *buffer, int buffer_length);
|
||||
bool dirlist_generate_bottom(char *buffer, int buffer_length);
|
||||
|
@ -44,7 +44,6 @@
|
||||
#include "testament.h"
|
||||
|
||||
#include "utils/config.h"
|
||||
#include "content/dirlist.h"
|
||||
#include "content/fetch.h"
|
||||
#include "content/fetchers/about.h"
|
||||
#include "content/urldb.h"
|
||||
|
@ -138,13 +138,14 @@ fetch_file_setup(struct fetch *fetchh,
|
||||
{
|
||||
struct fetch_file_context *ctx;
|
||||
int i;
|
||||
nserror ret;
|
||||
|
||||
ctx = calloc(1, sizeof(*ctx));
|
||||
if (ctx == NULL)
|
||||
return NULL;
|
||||
|
||||
ctx->path = guit->fetch->url_to_path(nsurl_access(url));
|
||||
if (ctx->path == NULL) {
|
||||
ret = guit->file->nsurl_to_path(url, &ctx->path);
|
||||
if (ret != NSERROR_OK) {
|
||||
free(ctx);
|
||||
return NULL;
|
||||
}
|
||||
@ -503,11 +504,11 @@ process_dir_ent(struct fetch_file_context *ctx,
|
||||
size_t buffer_len)
|
||||
{
|
||||
nserror ret;
|
||||
char *path; /* url for list entries */
|
||||
char *urlpath = NULL; /* buffer for leaf entry path */
|
||||
struct stat ent_stat; /* stat result of leaf entry */
|
||||
char datebuf[64]; /* buffer for date text */
|
||||
char timebuf[64]; /* buffer for time text */
|
||||
nsurl *url;
|
||||
|
||||
/* skip hidden files */
|
||||
if (ent->d_name[0] == '.') {
|
||||
@ -539,16 +540,17 @@ process_dir_ent(struct fetch_file_context *ctx,
|
||||
}
|
||||
}
|
||||
|
||||
if ((path = guit->fetch->path_to_url(urlpath)) == NULL) {
|
||||
ret = guit->file->path_to_nsurl(urlpath, &url);
|
||||
if (ret != NSERROR_OK) {
|
||||
free(urlpath);
|
||||
return NSERROR_NOMEM;
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (S_ISREG(ent_stat.st_mode)) {
|
||||
/* regular file */
|
||||
dirlist_generate_row(even,
|
||||
false,
|
||||
path,
|
||||
url,
|
||||
ent->d_name,
|
||||
guit->fetch->filetype(urlpath),
|
||||
ent_stat.st_size,
|
||||
@ -558,7 +560,7 @@ process_dir_ent(struct fetch_file_context *ctx,
|
||||
/* directory */
|
||||
dirlist_generate_row(even,
|
||||
true,
|
||||
path,
|
||||
url,
|
||||
ent->d_name,
|
||||
messages_get("FileDirectory"),
|
||||
-1,
|
||||
@ -568,7 +570,7 @@ process_dir_ent(struct fetch_file_context *ctx,
|
||||
/* something else */
|
||||
dirlist_generate_row(even,
|
||||
false,
|
||||
path,
|
||||
url,
|
||||
ent->d_name,
|
||||
"",
|
||||
-1,
|
||||
@ -576,7 +578,7 @@ process_dir_ent(struct fetch_file_context *ctx,
|
||||
buffer, buffer_len);
|
||||
}
|
||||
|
||||
free(path);
|
||||
nsurl_unref(url);
|
||||
free(urlpath);
|
||||
|
||||
return NSERROR_OK;
|
||||
|
@ -37,7 +37,6 @@
|
||||
#include <libwapcaplet/libwapcaplet.h>
|
||||
|
||||
#include "utils/config.h"
|
||||
#include "content/dirlist.h"
|
||||
#include "content/fetch.h"
|
||||
#include "content/fetchers/resource.h"
|
||||
#include "content/urldb.h"
|
||||
|
@ -331,23 +331,6 @@ struct gui_fetch_table {
|
||||
*/
|
||||
const char *(*filetype)(const char *unix_path);
|
||||
|
||||
/**
|
||||
* Convert a pathname to a file: URL.
|
||||
*
|
||||
* \param path pathname
|
||||
* \return URL, allocated on heap, or NULL on failure
|
||||
*/
|
||||
char *(*path_to_url)(const char *path);
|
||||
|
||||
/**
|
||||
* Convert a file: URL to a pathname.
|
||||
*
|
||||
* \param url a file: URL
|
||||
* \return pathname, allocated on heap, or NULL on failure
|
||||
*/
|
||||
char *(*url_to_path)(const char *url);
|
||||
|
||||
|
||||
/* Optional entries */
|
||||
|
||||
/**
|
||||
@ -379,7 +362,6 @@ struct gui_fetch_table {
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* User interface utf8 characterset conversion routines.
|
||||
*/
|
||||
|
@ -479,13 +479,6 @@ static nserror verify_fetch_register(struct gui_fetch_table *gft)
|
||||
if (gft->filetype == NULL) {
|
||||
return NSERROR_BAD_PARAMETER;
|
||||
}
|
||||
if (gft->path_to_url == NULL) {
|
||||
return NSERROR_BAD_PARAMETER;
|
||||
}
|
||||
if (gft->url_to_path == NULL) {
|
||||
return NSERROR_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
|
||||
/* fill in the optional entries with defaults */
|
||||
if (gft->get_resource_url == NULL) {
|
||||
|
@ -26,66 +26,15 @@
|
||||
#include <limits.h>
|
||||
|
||||
#include "utils/nsurl.h"
|
||||
#include "utils/url.h"
|
||||
#include "utils/log.h"
|
||||
#include "utils/filepath.h"
|
||||
#include "utils/file.h"
|
||||
#include "desktop/gui.h"
|
||||
|
||||
#include "framebuffer/findfile.h"
|
||||
#include "framebuffer/fetch.h"
|
||||
|
||||
|
||||
/**
|
||||
* Convert a pathname to a file: URL.
|
||||
*
|
||||
* \param path pathname
|
||||
* \return URL, allocated on heap, or NULL on failure
|
||||
*/
|
||||
static char *path_to_url(const char *path)
|
||||
{
|
||||
int urllen;
|
||||
char *url;
|
||||
|
||||
if (path == NULL)
|
||||
return NULL;
|
||||
|
||||
urllen = strlen(path) + FILE_SCHEME_PREFIX_LEN + 1;
|
||||
url = malloc(urllen);
|
||||
|
||||
if (*path == '/') {
|
||||
path++; /* file: paths are already absolute */
|
||||
}
|
||||
|
||||
snprintf(url, urllen, "%s%s", FILE_SCHEME_PREFIX, path);
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a file: URL to a pathname.
|
||||
*
|
||||
* \param url a file: URL
|
||||
* \return pathname, allocated on heap, or NULL on failure
|
||||
*/
|
||||
static char *url_to_path(const char *url)
|
||||
{
|
||||
char *path;
|
||||
char *respath;
|
||||
nserror res; /* result from url routines */
|
||||
|
||||
res = url_path(url, &path);
|
||||
if (res != NSERROR_OK) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
res = url_unescape(path, &respath);
|
||||
free(path);
|
||||
if (res != NSERROR_OK) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return respath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate resource to full url.
|
||||
@ -101,17 +50,12 @@ static char *url_to_path(const char *url)
|
||||
static nsurl *get_resource_url(const char *path)
|
||||
{
|
||||
char buf[PATH_MAX];
|
||||
char *raw;
|
||||
nsurl *url = NULL;
|
||||
|
||||
if (strcmp(path, "favicon.ico") == 0)
|
||||
path = "favicon.png";
|
||||
|
||||
raw = path_to_url(filepath_sfind(respaths, buf, path));
|
||||
if (raw != NULL) {
|
||||
nsurl_create(raw, &url);
|
||||
free(raw);
|
||||
}
|
||||
netsurf_path_to_nsurl(filepath_sfind(respaths, buf, path), &url);
|
||||
|
||||
return url;
|
||||
}
|
||||
@ -148,8 +92,6 @@ static const char *fetch_filetype(const char *unix_path)
|
||||
/* table for fetch operations */
|
||||
static struct gui_fetch_table fetch_table = {
|
||||
.filetype = fetch_filetype,
|
||||
.path_to_url = path_to_url,
|
||||
.url_to_path = url_to_path,
|
||||
|
||||
.get_resource_url = get_resource_url,
|
||||
};
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "utils/messages.h"
|
||||
#include "utils/url.h"
|
||||
#include "utils/utils.h"
|
||||
#include "utils/file.h"
|
||||
#include "desktop/netsurf.h"
|
||||
#include "desktop/browser_private.h"
|
||||
#include "render/html.h"
|
||||
@ -263,7 +264,6 @@ void nsgtk_source_tab_init(GtkWindow *parent, struct browser_window *bw)
|
||||
nserror error;
|
||||
nserror r;
|
||||
gchar *filename;
|
||||
char *fileurl;
|
||||
gint handle;
|
||||
|
||||
source_data = content_get_source_data(bw->current_content,
|
||||
@ -301,29 +301,21 @@ void nsgtk_source_tab_init(GtkWindow *parent, struct browser_window *bw)
|
||||
fprintf(f, "%s", ndata);
|
||||
fclose(f);
|
||||
free(ndata);
|
||||
fileurl = path_to_url(filename);
|
||||
g_free(filename);
|
||||
if (fileurl == NULL) {
|
||||
warn_user(messages_get("NoMemory"), 0);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Open tab */
|
||||
error = nsurl_create(fileurl, &url);
|
||||
if (error != NSERROR_OK) {
|
||||
warn_user(messages_get_errorcode(error), 0);
|
||||
} else {
|
||||
error = netsurf_path_to_nsurl(filename, &url);
|
||||
g_free(filename);
|
||||
if (error == NSERROR_OK) {
|
||||
error = browser_window_create(BW_CREATE_TAB,
|
||||
url,
|
||||
NULL,
|
||||
bw,
|
||||
NULL);
|
||||
nsurl_unref(url);
|
||||
if (error != NSERROR_OK) {
|
||||
warn_user(messages_get_errorcode(error), 0);
|
||||
}
|
||||
}
|
||||
free(fileurl);
|
||||
if (error != NSERROR_OK) {
|
||||
warn_user(messages_get_errorcode(error), 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void nsgtk_source_file_save(GtkWindow *parent, const char *filename,
|
||||
|
56
gtk/fetch.c
56
gtk/fetch.c
@ -25,9 +25,9 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "utils/hashtable.h"
|
||||
#include "utils/url.h"
|
||||
#include "utils/log.h"
|
||||
#include "utils/filepath.h"
|
||||
#include "utils/file.h"
|
||||
#include "desktop/gui.h"
|
||||
|
||||
#include "gtk/gui.h"
|
||||
@ -226,56 +226,10 @@ const char *fetch_filetype(const char *unix_path)
|
||||
return type;
|
||||
}
|
||||
|
||||
char *path_to_url(const char *path)
|
||||
{
|
||||
int urllen;
|
||||
char *url;
|
||||
|
||||
if (path == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
urllen = strlen(path) + FILE_SCHEME_PREFIX_LEN + 1;
|
||||
|
||||
url = malloc(urllen);
|
||||
if (url == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (*path == '/') {
|
||||
path++; /* file: paths are already absolute */
|
||||
}
|
||||
|
||||
snprintf(url, urllen, "%s%s", FILE_SCHEME_PREFIX, path);
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
|
||||
static char *url_to_path(const char *url)
|
||||
{
|
||||
char *path;
|
||||
char *respath;
|
||||
nserror res; /* result from url routines */
|
||||
|
||||
res = url_path(url, &path);
|
||||
if (res != NSERROR_OK) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
res = url_unescape(path, &respath);
|
||||
free(path);
|
||||
if (res != NSERROR_OK) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return respath;
|
||||
}
|
||||
|
||||
static nsurl *gui_get_resource_url(const char *path)
|
||||
{
|
||||
char buf[PATH_MAX];
|
||||
char *raw;
|
||||
nsurl *url = NULL;
|
||||
|
||||
/* default.css -> gtkdefault.css */
|
||||
@ -288,19 +242,13 @@ static nsurl *gui_get_resource_url(const char *path)
|
||||
path = "favicon.png";
|
||||
}
|
||||
|
||||
raw = path_to_url(filepath_sfind(respaths, buf, path));
|
||||
if (raw != NULL) {
|
||||
nsurl_create(raw, &url);
|
||||
free(raw);
|
||||
}
|
||||
netsurf_path_to_nsurl(filepath_sfind(respaths, buf, path), &url);
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
static struct gui_fetch_table fetch_table = {
|
||||
.filetype = fetch_filetype,
|
||||
.path_to_url = path_to_url,
|
||||
.url_to_path = url_to_path,
|
||||
|
||||
.get_resource_url = gui_get_resource_url,
|
||||
};
|
||||
|
@ -25,6 +25,4 @@ void gtk_fetch_filetype_init(const char *mimefile);
|
||||
void gtk_fetch_filetype_fin(void);
|
||||
const char *fetch_filetype(const char *unix_path);
|
||||
|
||||
char *path_to_url(const char *path);
|
||||
|
||||
#endif
|
||||
|
@ -23,7 +23,7 @@
|
||||
#include <limits.h>
|
||||
|
||||
#include "desktop/gui.h"
|
||||
#include "utils/url.h"
|
||||
#include "utils/file.h"
|
||||
#include "utils/nsurl.h"
|
||||
#include "utils/filepath.h"
|
||||
|
||||
@ -33,70 +33,18 @@
|
||||
extern char **respaths;
|
||||
|
||||
|
||||
static char *path_to_url(const char *path)
|
||||
{
|
||||
int urllen;
|
||||
char *url;
|
||||
|
||||
if (path == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
urllen = strlen(path) + FILE_SCHEME_PREFIX_LEN + 1;
|
||||
|
||||
url = malloc(urllen);
|
||||
if (url == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (*path == '/') {
|
||||
path++; /* file: paths are already absolute */
|
||||
}
|
||||
|
||||
snprintf(url, urllen, "%s%s", FILE_SCHEME_PREFIX, path);
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
static char *url_to_path(const char *url)
|
||||
{
|
||||
char *path;
|
||||
char *respath;
|
||||
nserror res; /* result from url routines */
|
||||
|
||||
res = url_path(url, &path);
|
||||
if (res != NSERROR_OK) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
res = url_unescape(path, &respath);
|
||||
free(path);
|
||||
if (res != NSERROR_OK) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return respath;
|
||||
}
|
||||
|
||||
static nsurl *gui_get_resource_url(const char *path)
|
||||
{
|
||||
char buf[PATH_MAX];
|
||||
char *raw;
|
||||
nsurl *url = NULL;
|
||||
|
||||
raw = path_to_url(filepath_sfind(respaths, buf, path));
|
||||
if (raw != NULL) {
|
||||
nsurl_create(raw, &url);
|
||||
free(raw);
|
||||
}
|
||||
netsurf_path_to_nsurl(filepath_sfind(respaths, buf, path), &url);
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
static struct gui_fetch_table fetch_table = {
|
||||
.filetype = monkey_fetch_filetype,
|
||||
.path_to_url = path_to_url,
|
||||
.url_to_path = url_to_path,
|
||||
|
||||
.get_resource_url = gui_get_resource_url,
|
||||
};
|
||||
|
319
riscos/gui.c
319
riscos/gui.c
@ -729,7 +729,17 @@ void ro_gui_check_resolvers(void)
|
||||
* \return URL, allocated on heap, or 0 on failure
|
||||
*/
|
||||
|
||||
static char *path_to_url(const char *path)
|
||||
/**
|
||||
* Create a nsurl from a RISC OS pathname.
|
||||
*
|
||||
* Perform the necessary operations on a path to generate a nsurl.
|
||||
*
|
||||
* @param[in] path The RISC OS pathname to convert.
|
||||
* @param[out] url pointer to recive the nsurl, The returned url must be
|
||||
* unreferenced by the caller.
|
||||
* @return NSERROR_OK and the url is placed in \a url or error code on faliure.
|
||||
*/
|
||||
static nserror ro_path_to_nsurl(const char *path, struct nsurl **url_out)
|
||||
{
|
||||
int spare;
|
||||
char *canonical_path; /* canonicalised RISC OS path */
|
||||
@ -746,15 +756,13 @@ static char *path_to_url(const char *path)
|
||||
LOG(("xosfscontrol_canonicalise_path failed: 0x%x: %s",
|
||||
error->errnum, error->errmess));
|
||||
warn_user("PathToURL", error->errmess);
|
||||
return NULL;
|
||||
return NSERROR_NOT_FOUND;
|
||||
}
|
||||
|
||||
canonical_path = malloc(1 - spare);
|
||||
if (canonical_path == NULL) {
|
||||
LOG(("malloc failed"));
|
||||
warn_user("NoMemory", 0);
|
||||
free(canonical_path);
|
||||
return NULL;
|
||||
return NSERROR_NOMEM;
|
||||
}
|
||||
|
||||
error = xosfscontrol_canonicalise_path(path, canonical_path, 0, 0, 1 - spare, 0);
|
||||
@ -763,7 +771,7 @@ static char *path_to_url(const char *path)
|
||||
error->errnum, error->errmess));
|
||||
warn_user("PathToURL", error->errmess);
|
||||
free(canonical_path);
|
||||
return NULL;
|
||||
return NSERROR_NOT_FOUND;
|
||||
}
|
||||
|
||||
/* create a unix path from teh cananocal risc os one */
|
||||
@ -772,7 +780,7 @@ static char *path_to_url(const char *path)
|
||||
if (unix_path == NULL) {
|
||||
LOG(("__unixify failed: %s", canonical_path));
|
||||
free(canonical_path);
|
||||
return NULL;
|
||||
return NSERROR_BAD_PARAMETER;
|
||||
}
|
||||
free(canonical_path);
|
||||
|
||||
@ -782,7 +790,7 @@ static char *path_to_url(const char *path)
|
||||
if (url == NULL) {
|
||||
LOG(("Unable to allocate url"));
|
||||
free(unix_path);
|
||||
return NULL;
|
||||
return NSERROR_NOMEM;
|
||||
}
|
||||
|
||||
if (*unix_path == '/') {
|
||||
@ -794,72 +802,93 @@ static char *path_to_url(const char *path)
|
||||
|
||||
/* We don't want '/' to be escaped. */
|
||||
url_err = url_escape(url, FILE_SCHEME_PREFIX_LEN, false, "/", &escurl);
|
||||
free(url); url = NULL;
|
||||
free(url);
|
||||
if (url_err != NSERROR_OK) {
|
||||
LOG(("url_escape failed: %s", url));
|
||||
return NULL;
|
||||
return url_err;
|
||||
}
|
||||
|
||||
return escurl;
|
||||
ret = nsurl_create(escurl, url_out);
|
||||
free(escurl);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert a file: URL to a RISC OS pathname.
|
||||
* Create a path from a nsurl using posix file handling.
|
||||
*
|
||||
* \param url a file: URL
|
||||
* \return RISC OS pathname, allocated on heap, or 0 on failure
|
||||
* @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.
|
||||
*/
|
||||
|
||||
char *url_to_path(const char *url)
|
||||
static nserror ro_nsurl_to_path(struct nsurl *url, char **path_out)
|
||||
{
|
||||
lwc_string *urlpath;
|
||||
char *unpath;
|
||||
char *path;
|
||||
char *filename;
|
||||
char *respath;
|
||||
nserror res; /* result from url routines */
|
||||
bool match;
|
||||
lwc_string *scheme;
|
||||
nserror res;
|
||||
char *r;
|
||||
|
||||
res = url_path(url, &path);
|
||||
if (res != NSERROR_OK) {
|
||||
warn_user("NoMemory", 0);
|
||||
return NULL;
|
||||
if ((url == NULL) || (path_out == NULL)) {
|
||||
return NSERROR_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
res = url_unescape(path, &respath);
|
||||
free(path);
|
||||
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), &unpath);
|
||||
lwc_string_unref(urlpath);
|
||||
if (res != NSERROR_OK) {
|
||||
return NULL;
|
||||
return res;
|
||||
}
|
||||
|
||||
/* RISC OS path should not be more than 100 characters longer */
|
||||
filename = malloc(strlen(respath) + 100);
|
||||
if (!filename) {
|
||||
free(respath);
|
||||
warn_user("NoMemory", 0);
|
||||
return NULL;
|
||||
path = malloc(strlen(unpath) + 100);
|
||||
if (path == NULL) {
|
||||
free(unpath);
|
||||
return NSERROR_NOMEM;
|
||||
}
|
||||
|
||||
r = __riscosify(respath, 0, __RISCOSIFY_NO_SUFFIX,
|
||||
filename, strlen(respath) + 100, 0);
|
||||
|
||||
free(respath);
|
||||
if (r == 0) {
|
||||
free(filename);
|
||||
LOG(("__riscosify failed"));
|
||||
return NULL;
|
||||
r = __riscosify(unpath, 0, __RISCOSIFY_NO_SUFFIX,
|
||||
path, strlen(unpath) + 100, 0);
|
||||
free(unpath);
|
||||
if (r == NULL) {
|
||||
free(path);
|
||||
return NSERROR_NOMEM;
|
||||
}
|
||||
|
||||
return filename;
|
||||
*path_out = path;
|
||||
|
||||
return NSERROR_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Last-minute gui init, after all other modules have initialised.
|
||||
*/
|
||||
|
||||
static void gui_init2(int argc, char** argv)
|
||||
{
|
||||
char *url = 0;
|
||||
bool open_window = nsoption_bool(open_browser_at_startup);
|
||||
nsurl *url;
|
||||
nserror ret;
|
||||
bool open_window;
|
||||
|
||||
/* Complete initialisation of the treeview modules. */
|
||||
|
||||
@ -875,13 +904,16 @@ static void gui_init2(int argc, char** argv)
|
||||
/* cookies window */
|
||||
ro_gui_cookies_postinitialise();
|
||||
|
||||
open_window = nsoption_bool(open_browser_at_startup);
|
||||
|
||||
/* parse command-line arguments */
|
||||
if (argc == 2) {
|
||||
LOG(("parameters: '%s'", argv[1]));
|
||||
/* this is needed for launching URI files */
|
||||
if (strcasecmp(argv[1], "-nowin") == 0)
|
||||
open_window = false;
|
||||
if (strcasecmp(argv[1], "-nowin") == 0) {
|
||||
return;
|
||||
}
|
||||
ret = nsurl_create(NETSURF_HOMEPAGE, &url);
|
||||
}
|
||||
else if (argc == 3) {
|
||||
LOG(("parameters: '%s' '%s'", argv[1], argv[2]));
|
||||
@ -889,27 +921,21 @@ static void gui_init2(int argc, char** argv)
|
||||
|
||||
/* HTML files */
|
||||
if (strcasecmp(argv[1], "-html") == 0) {
|
||||
url = path_to_url(argv[2]);
|
||||
if (!url) {
|
||||
LOG(("malloc failed"));
|
||||
die("Insufficient memory for URL");
|
||||
}
|
||||
ret = netsurf_path_to_nsurl(argv[2], &url);
|
||||
}
|
||||
/* URL files */
|
||||
else if (strcasecmp(argv[1], "-urlf") == 0) {
|
||||
url = ro_gui_url_file_parse(argv[2]);
|
||||
char *urlf = ro_gui_url_file_parse(argv[2]);
|
||||
if (!url) {
|
||||
LOG(("malloc failed"));
|
||||
die("Insufficient memory for URL");
|
||||
}
|
||||
ret = nsurl_create(urlf, &url);
|
||||
free(urlf);
|
||||
}
|
||||
/* ANT URL Load */
|
||||
else if (strcasecmp(argv[1], "-url") == 0) {
|
||||
url = strdup(argv[2]);
|
||||
if (!url) {
|
||||
LOG(("malloc failed"));
|
||||
die("Insufficient memory for URL");
|
||||
}
|
||||
ret = nsurl_create(argv[2], &url);
|
||||
}
|
||||
/* Unknown => exit here. */
|
||||
else {
|
||||
@ -919,42 +945,32 @@ static void gui_init2(int argc, char** argv)
|
||||
}
|
||||
}
|
||||
/* get user's homepage (if configured) */
|
||||
else if (nsoption_charp(homepage_url) && nsoption_charp(homepage_url)[0]) {
|
||||
url = calloc(strlen(nsoption_charp(homepage_url)) + 5, sizeof(char));
|
||||
if (!url) {
|
||||
LOG(("malloc failed"));
|
||||
die("Insufficient memory for URL");
|
||||
}
|
||||
sprintf(url, "%s", nsoption_charp(homepage_url));
|
||||
else if (nsoption_charp(homepage_url) &&
|
||||
nsoption_charp(homepage_url)[0]) {
|
||||
ret = nsurl_create(nsoption_charp(homepage_url), &url);
|
||||
}
|
||||
/* default homepage */
|
||||
else {
|
||||
url = strdup(NETSURF_HOMEPAGE);
|
||||
if (!url) {
|
||||
LOG(("malloc failed"));
|
||||
die("Insufficient memory for URL");
|
||||
}
|
||||
ret = nsurl_create(NETSURF_HOMEPAGE, &url);
|
||||
}
|
||||
|
||||
/* check for url creation error */
|
||||
if (ret != NSERROR_OK) {
|
||||
warn_user(messages_get_errorcode(ret), 0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (open_window) {
|
||||
nsurl *urlns;
|
||||
nserror errorns;
|
||||
|
||||
errorns = nsurl_create(url, &urlns);
|
||||
if (errorns == NSERROR_OK) {
|
||||
errorns = browser_window_create(BW_CREATE_HISTORY,
|
||||
urlns,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
nsurl_unref(urlns);
|
||||
}
|
||||
if (errorns != NSERROR_OK) {
|
||||
warn_user(messages_get_errorcode(errorns), 0);
|
||||
ret = browser_window_create(BW_CREATE_HISTORY,
|
||||
url,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
if (ret != NSERROR_OK) {
|
||||
warn_user(messages_get_errorcode(ret), 0);
|
||||
}
|
||||
}
|
||||
|
||||
free(url);
|
||||
nsurl_unref(url);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1471,12 +1487,20 @@ void ro_msg_dataload(wimp_message *message)
|
||||
case FILETYPE_ACORN_URI:
|
||||
urltxt = ro_gui_uri_file_parse(message->data.data_xfer.file_name,
|
||||
&title);
|
||||
error = nsurl_create(urltxt, &url);
|
||||
free(urltxt);
|
||||
break;
|
||||
|
||||
case FILETYPE_ANT_URL:
|
||||
urltxt = ro_gui_url_file_parse(message->data.data_xfer.file_name);
|
||||
error = nsurl_create(urltxt, &url);
|
||||
free(urltxt);
|
||||
break;
|
||||
|
||||
case FILETYPE_IEURL:
|
||||
urltxt = ro_gui_ieurl_file_parse(message->data.data_xfer.file_name);
|
||||
error = nsurl_create(urltxt, &url);
|
||||
free(urltxt);
|
||||
break;
|
||||
|
||||
case FILETYPE_HTML:
|
||||
@ -1494,50 +1518,40 @@ void ro_msg_dataload(wimp_message *message)
|
||||
case FILETYPE_ARTWORKS:
|
||||
case FILETYPE_SVG:
|
||||
/* display the actual file */
|
||||
urltxt = path_to_url(message->data.data_xfer.file_name);
|
||||
error = netsurf_path_to_nsurl(message->data.data_xfer.file_name, &url);
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
if (!urltxt)
|
||||
/* error has already been reported by one of the
|
||||
* functions called above */
|
||||
/* report error to user */
|
||||
if (error != NSERROR_OK) {
|
||||
warn_user(messages_get_errorcode(error), 0);
|
||||
return;
|
||||
|
||||
|
||||
error = nsurl_create(urltxt, &url);
|
||||
if (error == NSERROR_OK) {
|
||||
if (g) {
|
||||
error = browser_window_navigate(g->bw,
|
||||
url,
|
||||
NULL,
|
||||
BW_NAVIGATE_HISTORY,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
#ifdef DROPURLHOTLIST /** @todo This was commented out should it be removed? */
|
||||
} else if (ro_gui_hotlist_check_window(
|
||||
message->data.data_xfer.w)) {
|
||||
/* Drop URL into hotlist */
|
||||
ro_gui_hotlist_url_drop(message, urltxt);
|
||||
#endif
|
||||
} else {
|
||||
error = browser_window_create(BW_CREATE_HISTORY,
|
||||
url,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
}
|
||||
nsurl_unref(url);
|
||||
}
|
||||
|
||||
|
||||
if (g) {
|
||||
error = browser_window_navigate(g->bw,
|
||||
url,
|
||||
NULL,
|
||||
BW_NAVIGATE_HISTORY,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
} else {
|
||||
error = browser_window_create(BW_CREATE_HISTORY,
|
||||
url,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
}
|
||||
nsurl_unref(url);
|
||||
if (error != NSERROR_OK) {
|
||||
warn_user(messages_get_errorcode(error), 0);
|
||||
}
|
||||
|
||||
free(urltxt);
|
||||
|
||||
/* send DataLoadAck */
|
||||
message->action = message_DATA_LOAD_ACK;
|
||||
@ -1859,29 +1873,45 @@ void ro_msg_dataopen(wimp_message *message)
|
||||
os_error *oserror;
|
||||
nsurl *urlns;
|
||||
nserror error;
|
||||
size_t len;
|
||||
|
||||
if (file_type == 0xb28) /* ANT URL file */
|
||||
switch (file_type) {
|
||||
case 0xb28: /* ANT URL file */
|
||||
url = ro_gui_url_file_parse(message->data.data_xfer.file_name);
|
||||
else if (file_type == 0xfaf) /* HTML file */
|
||||
url = path_to_url(message->data.data_xfer.file_name);
|
||||
else if (file_type == 0x1ba) /* IEURL file */
|
||||
error = nsurl_create(url, &urlns);
|
||||
free(url);
|
||||
break;
|
||||
|
||||
case 0xfaf: /* HTML file */
|
||||
error = netsurf_path_to_nsurl(message->data.data_xfer.file_name,
|
||||
&urlns);
|
||||
break;
|
||||
|
||||
case 0x1ba: /* IEURL file */
|
||||
url = ro_gui_ieurl_file_parse(message->
|
||||
data.data_xfer.file_name);
|
||||
else if (file_type == 0x2000) { /* application */
|
||||
size_t len = strlen(message->data.data_xfer.file_name);
|
||||
error = nsurl_create(url, &urlns);
|
||||
free(url);
|
||||
break;
|
||||
|
||||
case 0x2000: /* application */
|
||||
len = strlen(message->data.data_xfer.file_name);
|
||||
if (len < 9 || strcmp(".!NetSurf",
|
||||
message->data.data_xfer.file_name + len - 9))
|
||||
return;
|
||||
|
||||
if (nsoption_charp(homepage_url) &&
|
||||
nsoption_charp(homepage_url)[0]) {
|
||||
url = strdup(nsoption_charp(homepage_url));
|
||||
nsoption_charp(homepage_url)[0]) {
|
||||
error = nsurl_create(nsoption_charp(homepage_url),
|
||||
&urlns);
|
||||
} else {
|
||||
url = strdup(NETSURF_HOMEPAGE);
|
||||
error = nsurl_create(NETSURF_HOMEPAGE, &urlns);
|
||||
}
|
||||
if (!url)
|
||||
warn_user("NoMemory", 0);
|
||||
} else
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
/* send DataLoadAck */
|
||||
message->action = message_DATA_LOAD_ACK;
|
||||
@ -1894,22 +1924,18 @@ void ro_msg_dataopen(wimp_message *message)
|
||||
return;
|
||||
}
|
||||
|
||||
if (!url)
|
||||
/* error has already been reported by one of the
|
||||
* functions called above */
|
||||
if (error != NSERROR_OK) {
|
||||
warn_user(messages_get_errorcode(error), 0);
|
||||
return;
|
||||
|
||||
error = nsurl_create(url, &urlns);
|
||||
free(url);
|
||||
if (error == NSERROR_OK) {
|
||||
/* create a new window with the file */
|
||||
error = browser_window_create(BW_CREATE_HISTORY,
|
||||
urlns,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
nsurl_unref(urlns);
|
||||
}
|
||||
|
||||
/* create a new window with the file */
|
||||
error = browser_window_create(BW_CREATE_HISTORY,
|
||||
urlns,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
nsurl_unref(urlns);
|
||||
if (error != NSERROR_OK) {
|
||||
warn_user(messages_get_errorcode(error), 0);
|
||||
}
|
||||
@ -2071,8 +2097,7 @@ void ro_gui_view_source(hlcache_handle *c)
|
||||
}
|
||||
|
||||
/* try to load local files directly. */
|
||||
temp_name = url_to_path(nsurl_access(hlcache_handle_get_url(c)));
|
||||
if (temp_name) {
|
||||
if (netsurf_nsurl_to_path(hlcache_handle_get_url(c), &temp_name) == NSERROR_OK) {
|
||||
error = xosfile_read_no_path(temp_name, &objtype, 0, 0, 0, 0);
|
||||
if ((!error) && (objtype == osfile_IS_FILE)) {
|
||||
snprintf(message.file_name, 212, "%s", temp_name);
|
||||
@ -2450,12 +2475,12 @@ static nserror riscos_basename(const char *path, char **str, size_t *size)
|
||||
static struct gui_file_table riscos_file_table = {
|
||||
.mkpath = riscos_mkpath,
|
||||
.basename = riscos_basename,
|
||||
.nsurl_to_path = ro_nsurl_to_path,
|
||||
.path_to_nsurl = ro_path_to_nsurl,
|
||||
};
|
||||
|
||||
static struct gui_fetch_table riscos_fetch_table = {
|
||||
.filetype = fetch_filetype,
|
||||
.path_to_url = path_to_url,
|
||||
.url_to_path = url_to_path,
|
||||
|
||||
.get_resource_url = gui_get_resource_url,
|
||||
.mimetype = fetch_mimetype,
|
||||
|
@ -123,7 +123,6 @@ void ro_gui_dump_browser_window(struct browser_window *bw);
|
||||
void ro_gui_drag_box_start(wimp_pointer *pointer);
|
||||
bool ro_gui_prequit(void);
|
||||
const char *ro_gui_default_language(void);
|
||||
char *url_to_path(const char *url);
|
||||
|
||||
/* in download.c */
|
||||
void ro_gui_download_init(void);
|
||||
|
@ -46,6 +46,7 @@
|
||||
#include "utils/log.h"
|
||||
#include "utils/talloc.h"
|
||||
#include "utils/url.h"
|
||||
#include "utils/file.h"
|
||||
#include "utils/utf8.h"
|
||||
#include "utils/utils.h"
|
||||
#include "utils/messages.h"
|
||||
@ -1673,7 +1674,7 @@ void ro_gui_window_close(wimp_w w)
|
||||
wimp_pointer pointer;
|
||||
os_error *error;
|
||||
char *temp_name, *r;
|
||||
char *filename;
|
||||
char *filename = NULL;
|
||||
hlcache_handle *h = NULL;
|
||||
bool destroy;
|
||||
|
||||
@ -1688,10 +1689,12 @@ void ro_gui_window_close(wimp_w w)
|
||||
h = g->bw->current_content;
|
||||
if (pointer.buttons & wimp_CLICK_ADJUST) {
|
||||
destroy = !ro_gui_shift_pressed();
|
||||
filename = (h && hlcache_handle_get_url(h)) ?
|
||||
url_to_path(nsurl_access(hlcache_handle_get_url(h))) :
|
||||
NULL;
|
||||
if (filename) {
|
||||
|
||||
if (h && hlcache_handle_get_url(h)) {
|
||||
netsurf_nsurl_to_path(hlcache_handle_get_url(h),
|
||||
&filename);
|
||||
}
|
||||
if (filename != NULL) {
|
||||
temp_name = malloc(strlen(filename) + 32);
|
||||
if (temp_name) {
|
||||
sprintf(temp_name, "Filer_OpenDir %s",
|
||||
|
134
utils/file.c
134
utils/file.c
@ -22,10 +22,14 @@
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#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);
|
||||
}
|
||||
|
78
utils/file.h
78
utils/file.h
@ -16,8 +16,20 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/** \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 <stdarg.h>
|
||||
|
||||
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
|
||||
|
@ -82,61 +82,6 @@ static char *realpath(const char *path, char *resolved_path)
|
||||
return strncpy(resolved_path, path, PATH_MAX);
|
||||
}
|
||||
|
||||
char *path_to_url(const char *path)
|
||||
{
|
||||
char *url;
|
||||
char *sidx;
|
||||
|
||||
if (path == NULL)
|
||||
return NULL;
|
||||
|
||||
url = malloc(strlen(path) + FILE_SCHEME_PREFIX_LEN + 3);
|
||||
|
||||
if (url == NULL)
|
||||
return NULL;
|
||||
|
||||
strcpy(url, FILE_SCHEME_PREFIX);
|
||||
if (*path == '/') {
|
||||
/* unix style path start, so try wine Z: */
|
||||
strcat(url, "Z:");
|
||||
}
|
||||
strcat(url, path);
|
||||
|
||||
sidx = strrchr(url, '\\');
|
||||
while (sidx != NULL) {
|
||||
*sidx = '/';
|
||||
sidx = strrchr(url, '\\');
|
||||
}
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
|
||||
char *url_to_path(const char *url)
|
||||
{
|
||||
char *url_path = curl_unescape(url, 0);
|
||||
char *path;
|
||||
char *sidx;
|
||||
|
||||
if ((url_path[FILE_SCHEME_PREFIX_LEN + 1] == ':') ||
|
||||
(url_path[FILE_SCHEME_PREFIX_LEN + 1] == '|')) {
|
||||
/* url_path contains a drive: prefix */
|
||||
path = strdup(url_path + FILE_SCHEME_PREFIX_LEN);
|
||||
|
||||
/* swap / for \ */
|
||||
sidx = strrchr(path, '/');
|
||||
while (sidx != NULL) {
|
||||
*sidx = '\\';
|
||||
sidx = strrchr(path, '/');
|
||||
}
|
||||
} else {
|
||||
/* return the absolute path including leading / */
|
||||
path = strdup(url_path + (FILE_SCHEME_PREFIX_LEN - 1));
|
||||
}
|
||||
curl_free(url_path);
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Locate a shared resource file by searching known places in order.
|
||||
|
@ -23,8 +23,4 @@ extern char *nsws_find_resource(char *buf, const char *filename, const char *def
|
||||
|
||||
char **nsws_init_resource(const char *resource_path);
|
||||
|
||||
char *path_to_url(const char *path);
|
||||
char *url_to_path(const char *url);
|
||||
|
||||
|
||||
#endif /* _NETSURF_WINDOWS_FINDFILE_H_ */
|
||||
|
144
windows/gui.c
144
windows/gui.c
@ -189,7 +189,7 @@ nsws_window_urlbar_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
||||
hFont = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0);
|
||||
if (hFont != NULL) {
|
||||
LOG(("Destroyed font object"));
|
||||
DeleteObject(hFont);
|
||||
DeleteObject(hFont);
|
||||
}
|
||||
|
||||
|
||||
@ -549,7 +549,7 @@ get_imagelist(int resid, int bsize, int bcnt)
|
||||
LOG(("resource id %d, bzize %d, bcnt %d",resid, bsize, bcnt));
|
||||
|
||||
hImageList = ImageList_Create(bsize, bsize, ILC_COLOR24 | ILC_MASK, 0, bcnt);
|
||||
if (hImageList == NULL)
|
||||
if (hImageList == NULL)
|
||||
return NULL;
|
||||
|
||||
hScrBM = LoadImage(hInstance, MAKEINTRESOURCE(resid),
|
||||
@ -557,7 +557,7 @@ get_imagelist(int resid, int bsize, int bcnt)
|
||||
|
||||
if (hScrBM == NULL) {
|
||||
win_perror("LoadImage");
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (ImageList_AddMasked(hImageList, hScrBM, 0xcccccc) == -1) {
|
||||
@ -669,17 +669,17 @@ nsws_window_create_toolbar(struct gui_window *gw, HWND hWndParent)
|
||||
|
||||
/* Create the standard image list and assign to toolbar. */
|
||||
hImageList = get_imagelist(IDR_TOOLBAR_BITMAP, gw->toolbuttonsize, gw->toolbuttonc);
|
||||
if (hImageList != NULL)
|
||||
if (hImageList != NULL)
|
||||
SendMessage(hWndToolbar, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
|
||||
|
||||
/* Create the disabled image list and assign to toolbar. */
|
||||
hImageList = get_imagelist(IDR_TOOLBAR_BITMAP_GREY, gw->toolbuttonsize, gw->toolbuttonc);
|
||||
if (hImageList != NULL)
|
||||
if (hImageList != NULL)
|
||||
SendMessage(hWndToolbar, TB_SETDISABLEDIMAGELIST, 0, (LPARAM)hImageList);
|
||||
|
||||
/* Create the hot image list and assign to toolbar. */
|
||||
hImageList = get_imagelist(IDR_TOOLBAR_BITMAP_HOT, gw->toolbuttonsize, gw->toolbuttonc);
|
||||
if (hImageList != NULL)
|
||||
if (hImageList != NULL)
|
||||
SendMessage(hWndToolbar, TB_SETHOTIMAGELIST, 0, (LPARAM)hImageList);
|
||||
|
||||
/* Add buttons. */
|
||||
@ -1090,7 +1090,7 @@ nsws_window_event_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
||||
if (msg == WM_CREATE) {
|
||||
/* To cause all the component child windows to be
|
||||
* re-sized correctly a WM_SIZE message of the actual
|
||||
* created size must be sent.
|
||||
* created size must be sent.
|
||||
*
|
||||
* The message must be posted here because the actual
|
||||
* size values of the component windows are not known
|
||||
@ -1794,7 +1794,7 @@ static void gui_set_clipboard(const char *buffer, size_t length,
|
||||
/**
|
||||
* Create the main window class.
|
||||
*/
|
||||
nserror
|
||||
nserror
|
||||
nsws_create_main_class(HINSTANCE hinstance) {
|
||||
nserror ret = NSERROR_OK;
|
||||
WNDCLASSEX w;
|
||||
@ -1885,10 +1885,134 @@ static nserror windows_basename(const char *path, char **str, size_t *size)
|
||||
return NSERROR_OK;
|
||||
}
|
||||
|
||||
/* default to using the posix file handling */
|
||||
/**
|
||||
* Create a path from a nsurl using windows 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 windows_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;
|
||||
}
|
||||
|
||||
/* if there is a drive: prefix treat path as DOS filename */
|
||||
if ((path[2] == ':') || (path[2] == '|')) {
|
||||
char *sidx; /* slash index */
|
||||
|
||||
/* move the string down to remove leading / note the
|
||||
* strlen is *not* copying too much data as we are
|
||||
* moving the null too!
|
||||
*/
|
||||
memmove(path, path + 1, strlen(path));
|
||||
|
||||
/* swap / for \ */
|
||||
sidx = strrchr(path, '/');
|
||||
while (sidx != NULL) {
|
||||
*sidx = '\\';
|
||||
sidx = strrchr(path, '/');
|
||||
}
|
||||
}
|
||||
/* if the path does not have a drive letter we return the
|
||||
* complete path.
|
||||
*/
|
||||
/** @todo Need to check returning the unaltered path in this
|
||||
* case is correct
|
||||
*/
|
||||
|
||||
*path_out = path;
|
||||
|
||||
return NSERROR_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a nsurl from a path using windows 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 windows_path_to_nsurl(const char *path, struct nsurl **url_out)
|
||||
{
|
||||
nserror ret;
|
||||
int urllen;
|
||||
char *urlstr;
|
||||
char *sidx; /* slash index */
|
||||
|
||||
if ((path == NULL) || (url_out == NULL) || (*path == 0)) {
|
||||
return NSERROR_BAD_PARAMETER;
|
||||
}
|
||||
|
||||
/* build url as a string for nsurl constructor */
|
||||
urllen = strlen(path) + FILE_SCHEME_PREFIX_LEN + 5;
|
||||
urlstr = malloc(urllen);
|
||||
if (urlstr == NULL) {
|
||||
return NSERROR_NOMEM;
|
||||
}
|
||||
|
||||
/** @todo check if this should be url escaping the path. */
|
||||
if (*path == '/') {
|
||||
/* unix style path start, so try wine Z: */
|
||||
snprintf(urlstr, urllen, "%sZ%%3A%s", FILE_SCHEME_PREFIX, path);
|
||||
} else {
|
||||
snprintf(urlstr, urllen, "%s%s", FILE_SCHEME_PREFIX, path);
|
||||
}
|
||||
|
||||
sidx = strrchr(urlstr, '\\');
|
||||
while (sidx != NULL) {
|
||||
*sidx = '/';
|
||||
sidx = strrchr(urlstr, '\\');
|
||||
}
|
||||
|
||||
ret = nsurl_create(urlstr, url_out);
|
||||
free(urlstr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* windows file handling */
|
||||
static struct gui_file_table file_table = {
|
||||
.mkpath = windows_mkpath,
|
||||
.basename = windows_basename,
|
||||
.nsurl_to_path = windows_nsurl_to_path,
|
||||
.path_to_nsurl = windows_path_to_nsurl,
|
||||
};
|
||||
|
||||
struct gui_file_table *win32_file_table = &file_table;
|
||||
@ -1926,8 +2050,6 @@ struct gui_clipboard_table *win32_clipboard_table = &clipboard_table;
|
||||
|
||||
static struct gui_fetch_table fetch_table = {
|
||||
.filetype = fetch_filetype,
|
||||
.path_to_url = path_to_url,
|
||||
.url_to_path = url_to_path,
|
||||
};
|
||||
struct gui_fetch_table *win32_fetch_table = &fetch_table;
|
||||
|
||||
|
@ -44,14 +44,9 @@ char *options_file_location;
|
||||
static nsurl *gui_get_resource_url(const char *path)
|
||||
{
|
||||
char buf[PATH_MAX];
|
||||
char *raw;
|
||||
nsurl *url = NULL;
|
||||
|
||||
raw = path_to_url(filepath_sfind(respaths, buf, path));
|
||||
if (raw != NULL) {
|
||||
nsurl_create(raw, &url);
|
||||
free(raw);
|
||||
}
|
||||
netsurf_path_to_nsurl(filepath_sfind(respaths, buf, path), &url);
|
||||
|
||||
return url;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user