/* $Id: def_url.h,v 1.6 2006/06/25 10:41:05 hurtta Exp $ */
/******************************************************************************
* The Elm (ME+) Mail System - $Revision: 1.6 $ $State: Exp $
*
* Author: Kari Hurtta <hurtta+elm@posti.FMI.FI>
* or Kari Hurtta <elm@elmme-mailer.org>
*****************************************************************************/
#include "headers.h"
#include "mboxlib.h"
#include "mailerlib.h"
#include "me.h"
/* url.c ------------------------------------------------------------------- */
#define URL_magic 0xEC00
struct url {
unsigned short magic; /* URL_magic */
int scheme; /* -1 invalid */
struct url_handler * current_handler;
struct host_part {
struct url_element * user;
struct url_element * password;
struct url_element * host;
uint16 port; /* 0 == not set */
} * host;
struct url_path * path;
union {
void * dummy;
struct no_url * NO_URL;
struct url_mailto * mailto;
struct url_http * http;
struct url_imap * imap;
} u;
/* This considers that fragment do not have structure */
struct url_element * fragment;
};
extern struct scheme {
CONST char * scheme;
struct url_handler * handler;
} * index_to_schema P_((int idx));
#define URL_handler_magic 0xEC01
#define URLFLAG_common 0x01
#define URLFLAG_username 0x02
#define URLFLAG_port 0x04
#define URLFLAG_path 0x08
#define URLFLAG_params 0x10
#define URLFLAG_query 0x20
#define URLFLAG_password 0x40
typedef void uh_init_url P_((struct url *url));
typedef void uh_free_url P_((struct url *url));
typedef int uh_parse_url_not_path P_((struct url *url,
struct string *scheme_pesifix,
struct header_errors **header_error));
typedef int uh_dup_url_not_path P_((struct url *url,
struct url *source));
typedef int uh_parse_url_params P_((struct url *url,
struct string *scheme_pesifix,
struct header_errors **header_error));
typedef int uh_dup_url_params P_((struct url *url,
struct url *source));
typedef int uh_parse_url_query P_((struct url *url,
struct string *scheme_pesifix,
struct header_errors **header_error));
typedef int uh_dup_url_query P_((struct url *url,
struct url *source));
typedef int uh_set_mailing_headers_from_url P_((struct mailing_headers *hdrs,
const struct url *url,
struct mailer_info
*mailer_info));
typedef CONST struct string * uh_get_body_string_from_url P_((const struct url
*url,
int *errors));
typedef struct string * uh_not_path_to_raw_url P_((const struct url *url));
typedef int uh_params_to_raw_url P_((const struct url *url,
struct string **result));
typedef int uh_query_to_raw_url P_((const struct url *url,
struct string **result));
typedef struct folder_info * uh_get_folder_from_url P_((
const struct url *url,
verify_remote_url_f * verify_remote));
typedef enum url_type uh_get_url_type P_((const struct url *url));
extern struct url_handler {
unsigned short magic; /* URL_handler_magic */
int flag;
enum url_type url_type;
uh_init_url * uh_init_it;
uh_free_url * uh_free_it;
uh_parse_url_not_path * uh_parse_it_not_path;
uh_dup_url_not_path * uh_dup_it_not_path;
uh_parse_url_params * uh_parse_it_params;
uh_dup_url_params * uh_dup_it_params;
uh_parse_url_query * uh_parse_it_query;
uh_dup_url_query * uh_dup_it_query;
uh_set_mailing_headers_from_url * uh_set_mailing_headers_from_it;
uh_get_body_string_from_url * uh_get_body_string_from_it;
uh_not_path_to_raw_url * uh_not_path_to_raw_it;
uh_params_to_raw_url * uh_params_to_raw_it;
uh_query_to_raw_url * uh_query_to_raw_it;
uh_get_folder_from_url * uh_get_folder_from_it;
uh_get_url_type * uh_get_it_type;
} NO_URL_HANDLER, URL_mailto_handler, DUMMY_http_HANDLER,
URL_imap_handler;
extern int name_to_scheme_idx P_((const char * name));
extern enum url_type get_url_type_default P_((const struct url *url));
#ifdef REMOTE_MBX
extern struct folder_browser * get_browser_from_host_url P_((
const struct url *url,
const struct browser_url_method *method,
verify_remote_url_f * verify_remote));
extern int browser_select_url_path P_((
struct folder_browser *browser,
const struct url *url,
const struct browser_url_method *method ));
#endif
/* url_element.c ----------------------------------------------------------- */
/* Decodes %XX,
* IF there is %XX > %7F returns type is RAW_BUFFER (charset unknown)
* otherwise uses charset of raw
* If codes with %XX > %7F is able to handle as UTF-8, that is returned
*/
extern struct string * raw_to_parsed P_((struct string *raw,
struct header_errors **header_error));
/* Does %XX escaping, escaping is done according of UTF-8
except if type is RAW_BUFFER
returns US-ASCII string
*/
extern char * parsed_to_raw P_((struct string *parsed));
extern struct url_element * element_from_raw P_((struct string *raw));
extern struct url_element * element_from_parsed P_((struct string *parsed));
extern void free_url_element P_((struct url_element **ptr));
/* Shared -- do not free */
extern CONST struct string * parsed_from_element P_((struct url_element
*elem,
struct header_errors **
header_error));
extern CONST struct string * raw_from_element P_((struct url_element *elem));
extern struct url_element * dup_url_element P_((struct url_element *elem));
/* url_path.c -------------------------------------------------------------- */
extern struct url_path * raw_to_url_path P_((struct string *raw));
extern struct string * url_path_to_raw P_((struct url_path *url_path));
extern int url_path_len P_((struct url_path *path));
#define URL_path_elem_magic 0xEC03
/* Returns reference to url_path_element, do not free! */
CONST extern struct url_path_elem {
unsigned short magic; /* URL_path_elem_magic */
struct url_element * elem;
int trailing_slash; /* traling slash / is not included on elem */
} * get_url_path_element P_((struct url_path *path, int idx));
/* For absolute paths, element 0 is:
elem == NULL
trailing_slash == 1
On all elements except last, there is always
trailing_slash == 1
*/
extern void free_url_path P_((struct url_path **path));
extern struct url_path * join_url_path P_((struct url_path *parent,
struct url_path *relative));
extern struct url_path * dup_url_path P_((struct url_path *path));
/*
* Local Variables:
* mode:c
* c-basic-offset:4
* buffer-file-coding-system: iso-8859-1
* End:
*/
syntax highlighted by Code2HTML, v. 0.9.1