diff options
author | Chris Young <chris@unsatisfactorysoftware.co.uk> | 2008-12-13 23:28:26 +0000 |
---|---|---|
committer | Chris Young <chris@unsatisfactorysoftware.co.uk> | 2008-12-13 23:28:26 +0000 |
commit | d36799e07ddbb42533ffdfc5113bbe38324bb1b1 (patch) | |
tree | ea4231e4b30f0228f5ef733117bbfa712cc599fd /amiga | |
parent | 689f2e42327f95a25a4ece115b67e235487a919a (diff) | |
download | netsurf-d36799e07ddbb42533ffdfc5113bbe38324bb1b1.tar.gz netsurf-d36799e07ddbb42533ffdfc5113bbe38324bb1b1.tar.bz2 |
First attempt at mailto: fetcher using openurl.library.
Doesn't quite work properly because it never calls the callback :)
Probably also gets into an infinite loop if "send mailto: URLs to email application"
is not ticked in OpenURL Prefs.
svn path=/trunk/netsurf/; revision=5910
Diffstat (limited to 'amiga')
-rwxr-xr-x | amiga/fetch_mailto.c | 318 | ||||
-rwxr-xr-x | amiga/fetch_mailto.h | 27 |
2 files changed, 345 insertions, 0 deletions
diff --git a/amiga/fetch_mailto.c b/amiga/fetch_mailto.c new file mode 100755 index 000000000..0e468a19c --- /dev/null +++ b/amiga/fetch_mailto.c @@ -0,0 +1,318 @@ +/* + * Copyright 2008 Chris Young <chris@unsatisfactorysoftware.co.uk> + * + * This file is part of NetSurf, http://www.netsurf-browser.org/ + * + * NetSurf is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * NetSurf is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/** \file + * Fetching of data from a file (implementation). + */ + +#include <string.h> +#include "content/fetch.h" +#include "utils/log.h" +#include "utils/url.h" +#include <proto/dos.h> +#include <proto/exec.h> +#include "amiga/object.h" +#include <malloc.h> +#include "content/content.h" +#include <time.h> +#include <proto/utility.h> +#include "utils/messages.h" +#include <proto/openurl.h> + +static struct MinList *ami_mailto_fetcher_list; +static UBYTE *ami_mailto_fetcher_buffer = NULL; + +struct Library *OpenURLBase; +struct OpenURLIFace *IOpenURL; + +/** Information for a single fetch. */ +struct ami_mailto_fetch_info { + struct fetch *fetch_handle; /**< The fetch handle we're parented by. */ + BPTR fh; /** File handle */ + bool only_2xx; /**< Only HTTP 2xx responses acceptable. */ + char *path; + char *url; /**< URL of this fetch. */ + bool aborted; + bool locked; + struct nsObject *obj; + int httpcode; + ULONG len; + char *mimetype; + struct cache_data cachedata; +}; + +static bool ami_fetch_mailto_initialise(const char *scheme); +static void ami_fetch_mailto_finalise(const char *scheme); +static void * ami_fetch_mailto_setup(struct fetch *parent_fetch, const char *url, + bool only_2xx, const char *post_urlenc, + struct form_successful_control *post_multipart, + const char **headers); +static bool ami_fetch_mailto_start(void *vfetch); +static void ami_fetch_mailto_abort(void *vf); +static void ami_fetch_mailto_free(void *f); +static void ami_fetch_mailto_poll(const char *scheme_ignored); + +/** + * Initialise the fetcher. + * + * Must be called once before any other function. + */ + +void ami_fetch_mailto_register(void) +{ + if(OpenURLBase = OpenLibrary("openurl.library",0)) + { + if(IOpenURL = (struct OpenURLIFace *)GetInterface(OpenURLBase,"main",1,NULL)) + { + if (!fetch_add_fetcher("mailto", + ami_fetch_mailto_initialise, + ami_fetch_mailto_setup, + ami_fetch_mailto_start, + ami_fetch_mailto_abort, + ami_fetch_mailto_free, + ami_fetch_mailto_poll, + ami_fetch_mailto_finalise)) { + LOG(("Unable to register Amiga fetcher for mailto:")); + } + } + } +} + + +/** + * Initialise a cURL fetcher. + */ + +bool ami_fetch_mailto_initialise(const char *scheme) +{ + LOG(("Initialise Amiga fetcher for %s", scheme)); + //ami_mailto_fetcher_list = NewObjList(); + + //if(ami_mailto_fetcher_list) + return true; + // else return false; +} + + +/** + * Finalise a cURL fetcher + */ + +void ami_fetch_mailto_finalise(const char *scheme) +{ + LOG(("Finalise Amiga fetcher %s", scheme)); +// FreeObjList(ami_mailto_fetcher_list); + if(IOpenURL) DropInterface((struct Interface *)IOpenURL); + if(OpenURLBase) CloseLibrary(OpenURLBase); + +} + + +/** + * Start fetching data for the given URL. + * + * The function returns immediately. The fetch may be queued for later + * processing. + * + * A pointer to an opaque struct curl_fetch_info is returned, which can be passed to + * fetch_abort() to abort the fetch at any time. Returns 0 if memory is + * exhausted (or some other fatal error occurred). + * + * The caller must supply a callback function which is called when anything + * interesting happens. The callback function is first called with msg + * FETCH_TYPE, with the Content-Type header in data, then one or more times + * with FETCH_DATA with some data for the url, and finally with + * FETCH_FINISHED. Alternatively, FETCH_ERROR indicates an error occurred: + * data contains an error message. FETCH_REDIRECT may replace the FETCH_TYPE, + * FETCH_DATA, FETCH_FINISHED sequence if the server sends a replacement URL. + * + * Some private data can be passed as the last parameter to fetch_start, and + * callbacks will contain this. + */ + +void * ami_fetch_mailto_setup(struct fetch *parent_fetch, const char *url, + bool only_2xx, const char *post_urlenc, + struct form_successful_control *post_multipart, + const char **headers) +{ + struct ami_mailto_fetch_info *fetch; + + fetch = AllocVec(sizeof (*fetch),MEMF_PRIVATE | MEMF_CLEAR); + if (!fetch) + return 0; + + fetch->fetch_handle = parent_fetch; + + /* construct a new fetch structure */ + fetch->fh = 0; + fetch->only_2xx = only_2xx; + fetch->url = strdup(url); +// fetch->path = url_to_path(url); + +// LOG(("fetch %p, url '%s', path '%s'", fetch, url,fetch->path)); + +// fetch->obj = AddObject(ami_mailto_fetcher_list,AMINS_FETCHER); +// fetch->obj->objstruct = fetch; + + return fetch; +} + + +/** + * Dispatch a single job + */ +bool ami_fetch_mailto_start(void *vfetch) +{ + struct ami_mailto_fetch_info *fetch = (struct ami_mailto_fetch_info*)vfetch; + + LOG(("ami file fetcher start")); + + fetch->cachedata.req_time = time(NULL); + fetch->cachedata.res_time = time(NULL); + fetch->cachedata.date = 0; + fetch->cachedata.expires = 0; + fetch->cachedata.age = INVALID_AGE; + fetch->cachedata.max_age = 0; + fetch->cachedata.no_cache = true; + fetch->cachedata.etag = NULL; + fetch->cachedata.last_modified = 0; + + URL_OpenA(fetch->url,NULL); + + return true; +} + +void ami_fetch_mailto_abort(void *vf) +{ + struct ami_mailto_fetch_info *fetch = (struct ami_mailto_fetch_info*)vf; + + LOG(("ami mailto fetcher abort")); +} + + +/** + * Free a fetch structure and associated resources. + */ + +void ami_fetch_mailto_free(void *vf) +{ + struct ami_mailto_fetch_info *fetch = (struct ami_mailto_fetch_info*)vf; + LOG(("ami file fetcher free %lx",fetch)); + + free(fetch->url); + FreeVec(fetch); + +// DelObject(fetch->obj); // delobject frees fetch +} + +static void ami_fetch_mailto_send_callback(fetch_msg msg, + struct ami_mailto_fetch_info *fetch, const void *data, + unsigned long size) +{ + fetch->locked = true; + LOG(("ami file fetcher callback %ld",msg)); + fetch_send_callback(msg,fetch->fetch_handle,data,size); + fetch->locked = false; +} + +/** + * Do some work on current fetches. + * + * Must be called regularly to make progress on fetches. + */ + +void ami_fetch_mailto_poll(const char *scheme_ignored) +{ +/* + struct nsObject *node; + struct nsObject *nnode; + struct ami_mailto_fetch_info *fetch; + + if(IsMinListEmpty(ami_mailto_fetcher_list)) return; + + node = (struct nsObject *)GetHead((struct List *)ami_mailto_fetcher_list); + + do + { + nnode=(struct nsObject *)GetSucc((struct Node *)node); + + fetch = (struct ami_mailto_fetch_info *)node->objstruct; + LOG(("polling %lx",fetch)); + + if(fetch->locked) continue; + + if(!fetch->aborted) + { + if(fetch->fh) + { + ULONG len; + + len = FRead(fetch->fh,ami_mailto_fetcher_buffer,1,1024); + + LOG(("fetch %lx read %ld",fetch,len)); + + ami_fetch_mailto_send_callback(FETCH_DATA, + fetch,ami_mailto_fetcher_buffer,len); + + if((len<1024) && (!fetch->aborted)) + { + ami_fetch_mailto_send_callback(FETCH_FINISHED, + fetch, &fetch->cachedata, 0); + + fetch->aborted = true; + } + } + else + { + fetch->fh = FOpen(fetch->path,MODE_OLDFILE,0); + + if(fetch->fh) + { + struct FileInfoBlock fib; + if(ExamineFH(fetch->fh,&fib)) + fetch->len = fib.fib_Size; + + fetch_set_http_code(fetch->fetch_handle,200); + fetch->mimetype = fetch_mimetype(fetch->path); + LOG(("mimetype %s len %ld",fetch->mimetype,fetch->len)); + + ami_fetch_mailto_send_callback(FETCH_TYPE, + fetch, fetch->mimetype, fetch->len); + } + else + { + STRPTR errorstring; + + errorstring = ASPrintf("%s %s",messages_get("FileError"),fetch->path); + fetch_set_http_code(fetch->fetch_handle,404); + ami_fetch_mailto_send_callback(FETCH_ERROR, fetch, + errorstring, 0); + fetch->aborted = true; + FreeVec(errorstring); + } + } + } + + if(fetch && fetch->aborted) + { + fetch_remove_from_queues(fetch->fetch_handle); + fetch_free(fetch->fetch_handle); + } + }while(node=nnode); +*/ +} diff --git a/amiga/fetch_mailto.h b/amiga/fetch_mailto.h new file mode 100755 index 000000000..4b23a9b49 --- /dev/null +++ b/amiga/fetch_mailto.h @@ -0,0 +1,27 @@ +/* + * Copyright 2008 Chris Young <chris@unsatisfactorysoftware.co.uk> + * + * This file is part of NetSurf. + * + * NetSurf is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * NetSurf is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/** \file + * Fetching of data from a URL (Registration). + */ + +#ifndef AMIGA_FETCH_MAILTO_H +#define AMIGA_FETCH_MAILTO_H + +void ami_fetch_mailto_register(void); +#endif |