X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fwebcit.h;h=188c034d65ddea9a74b4bf63cf4827e187fb14d2;hb=275bbb751736a849fcda6da0e8b6d1ab3eee06d4;hp=8bd95462ac20b5b30c7871264abb43c474ef891d;hpb=80666738ccd7cd0b735ad94a1110d9bf70f126b0;p=citadel.git diff --git a/webcit/webcit.h b/webcit/webcit.h index 8bd95462a..188c034d6 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -87,12 +87,10 @@ #include "sysdep.h" #include "subst.h" -#include "wc_gettext.h" #include "messages.h" #include "paramhandling.h" #include "preferences.h" - #ifdef HAVE_OPENSSL /* Work around RedHat's b0rken OpenSSL includes */ #define OPENSSL_NO_KRB5 @@ -113,9 +111,9 @@ #define PORT_NUM 2000 /* port number to listen on */ #define DEVELOPER_ID 0 #define CLIENT_ID 4 -#define CLIENT_VERSION 741 /* This version of WebCit */ -#define MINIMUM_CIT_VERSION 741 /* min required Citadel ver */ -#define LIBCITADEL_MIN 741 /* min required libcitadel ver */ +#define CLIENT_VERSION 762 /* This version of WebCit */ +#define MINIMUM_CIT_VERSION 761 /* min required Citadel ver */ +#define LIBCITADEL_MIN 761 /* min required libcitadel ver */ #define DEFAULT_HOST "localhost" /* Default Citadel server */ #define DEFAULT_PORT "504" #define TARGET "webcit01" /* Target for inline URL's */ @@ -195,6 +193,42 @@ US_NOPROMPT | US_DISAPPEAR | US_PAGINATOR | \ US_FLOORS | US_COLOR | US_PROMPTCTL ) + +#define MAJORCODE(a) (((int)(a / 100) ) * 100) + +#define LISTING_FOLLOWS 100 +#define CIT_OK 200 +#define MORE_DATA 300 +#define SEND_LISTING 400 +#define ERROR 500 +#define BINARY_FOLLOWS 600 +#define SEND_BINARY 700 +#define START_CHAT_MODE 800 +#define ASYNC_MSG 900 + +#define MINORCODE(a) (a % 100) +#define ASYNC_GEXP 02 +#define INTERNAL_ERROR 10 +#define TOO_BIG 11 +#define ILLEGAL_VALUE 12 +#define NOT_LOGGED_IN 20 +#define CMD_NOT_SUPPORTED 30 +#define SERVER_SHUTTING_DOWN 31 +#define PASSWORD_REQUIRED 40 +#define ALREADY_LOGGED_IN 41 +#define USERNAME_REQUIRED 42 +#define HIGHER_ACCESS_REQUIRED 50 +#define MAX_SESSIONS_EXCEEDED 51 +#define RESOURCE_BUSY 52 +#define RESOURCE_NOT_OPEN 53 +#define NOT_HERE 60 +#define INVALID_FLOOR_OPERATION 61 +#define NO_SUCH_USER 70 +#define FILE_NOT_FOUND 71 +#define ROOM_NOT_FOUND 72 +#define NO_SUCH_SYSTEM 73 +#define ALREADY_EXISTS 74 +#define MESSAGE_NOT_FOUND 75 /* * NLI is the string that shows up in a who's online listing for sessions * that are active, but for which no user has yet authenticated. @@ -235,50 +269,6 @@ typedef struct _serv_info { } ServInfo; - -/* - * \brief This struct holds a list of rooms for \\\oto operations. - */ -struct march { - struct march *next; /* pointer to next in linked list */ - char march_name[128]; /* name of room */ - int march_floor; /* floor number of room */ - int march_order; /* sequence in which we are to visit this room */ -}; - -/* * - * \brief This struct holds a list of rooms for client display. - * It is a binary tree. - */ -struct roomlisting { - struct roomlisting *lnext; /* pointer to 'left' tree node */ - struct roomlisting *rnext; /* pointer to 'right' tree node */ - char rlname[128]; /* name of room */ - unsigned rlflags; /* room flags */ - int rlfloor; /* the floor it resides on */ - int rlorder; /* room listing order */ -}; - - - - - - - -/** - * \brief Data structure for roomlist-to-folderlist conversion - */ -struct folder { - int floor; /* which floor is it on */ - char room[SIZ]; /* which roomname ??? */ - char name[SIZ]; /* which is its own name??? */ - int hasnewmsgs; /* are there unread messages inside */ - int is_mailbox; /* is it a mailbox? */ - int selectable; /* can we select it ??? */ - int view; /* whats its default view? inbox/calendar.... */ - int num_rooms; /* If this is a floor, how many rooms does it have */ -}; - typedef struct _disp_cal { icalcomponent *cal; /* cal items for display */ long cal_msgnum; /* cal msgids for display */ @@ -290,9 +280,15 @@ typedef struct _disp_cal { int multi_day_event; int is_repeat; + icalcomponent *SortBy; /* cal items for display */ + icalproperty_status Status; } disp_cal; - +typedef struct _IcalEnumMap { + const char *Name; + long NameLen; + icalproperty_kind map; +} IcalEnumMap; /* * Address book entry (keep it short and sweet, it's just a quickie lookup @@ -304,6 +300,26 @@ typedef struct _addrbookent { } addrbookent; +#define AJAX (1<<0) +#define ANONYMOUS (1<<1) +#define NEED_URL (1<<2) +#define XHTTP_COMMANDS (1<<3) +#define BOGUS (1<<4) +#define URLNAMESPACE (1<<4) +#define LOGCHATTY (1<<5) +#define COOKIEUNNEEDED (1<<6) +#define ISSTATIC (1<<7) +#define FORCE_SESSIONCLOSE (1<<8) + + +typedef void (*WebcitHandlerFunc)(void); +typedef struct _WebcitHandler{ + WebcitHandlerFunc F; + long Flags; + StrBuf *Name; +} WebcitHandler; +void WebcitAddUrlHandler(const char * UrlString, long UrlSLen, WebcitHandlerFunc F, long Flags); + typedef struct _headereval { ExamineMsgHeaderFunc evaluator; int Type; @@ -322,6 +338,72 @@ enum { eNone }; +enum { + eGET, + ePOST, + eOPTIONS, + ePROPFIND, + ePUT, + eDELETE, + eHEAD, + eMOVE, + eCOPY, + eNONE +}; +const char *ReqStrs[eNONE]; + +#define NO_AUTH 0 +#define AUTH_COOKIE 1 +#define AUTH_BASIC 2 + + + +typedef struct _HdrRefs { + long eReqType; /**< eGET, ePOST.... */ + int desired_session; + int SessionKey; + + int got_auth; + int DontNeedAuth; + long ContentLength; + time_t if_modified_since; + int gzip_ok; /**< Nonzero if Accept-encoding: gzip */ + int prohibit_caching; + int dav_depth; + + /* these are references into Hdr->HTTPHeaders, so we don't need to free them. */ + StrBuf *ContentType; + StrBuf *RawCookie; + StrBuf *ReqLine; + StrBuf *http_host; /**< HTTP Host: header */ + StrBuf *browser_host; + StrBuf *user_agent; + StrBuf *plainauth; + StrBuf *dav_ifmatch; + + const WebcitHandler *Handler; +} HdrRefs; + +typedef struct _ParsedHttpHdrs { + int http_sock; /**< HTTP server socket */ + const char *Pos; + StrBuf *ReadBuf; + + StrBuf *c_username; + StrBuf *c_password; + StrBuf *c_roomname; + StrBuf *c_language; + StrBuf *this_page; /**< URL of current page */ + StrBuf *PlainArgs; + + HashList *urlstrings; /**< variables passed to webcit in a URL */ + HashList *HTTPHeaders; /**< the headers the client sent us */ + int nWildfireHeaders; /**< how many wildfire headers did we already send? */ + + HdrRefs HR; +} ParsedHttpHdrs; + + /* * One of these is kept for each active Citadel session. * HTTP transactions are bound to one at a time. @@ -336,37 +418,32 @@ struct wcsession { int is_mobile; /**< Client is a handheld browser */ int ctdl_pid; /**< Session ID on the Citadel server */ int nonce; /**< session nonce (to prevent session riding) */ + int SessionKey; /* Session local Members */ - int http_sock; /**< HTTP server socket */ int serv_sock; /**< Client socket to Citadel server */ - StrBuf *ReadBuf; + StrBuf *ReadBuf; /**< here we keep our stuff while reading linebuffered from the server. */ + StrBuf *MigrateReadLineBuf; /**< here we buffer legacy server read stuff */ + const char *ReadPos; /**< whats our read position in ReadBuf? */ int chat_sock; /**< Client socket to Citadel server - for chat */ time_t lastreq; /**< Timestamp of most recent HTTP */ time_t last_pager_check; /**< last time we polled for instant msgs */ ServInfo *serv_info; /**< Iformation about the citserver we're connected to */ + int is_ajax; /** < are we doing an ajax request? */ + /* Request local Members */ StrBuf *CLineBuf; /**< linebuffering client stuff */ - StrBuf *UrlFragment1; /**< first urlfragment, if NEED_URL is specified by the handler*/ - StrBuf *UrlFragment2; /**< second urlfragment, if NEED_URL is specified by the handler*/ - StrBuf *UrlFragment3; /**< third urlfragment, if NEED_URL is specified by the handler*/ - StrBuf *UrlFragment4; /**< fourth urlfragment, if NEED_URL is specified by the handler*/ + ParsedHttpHdrs *Hdr; StrBuf *WBuf; /**< Our output buffer */ StrBuf *HBuf; /**< Our HeaderBuffer */ - StrBuf *this_page; /**< URL of current page */ - HashList *urlstrings; /**< variables passed to webcit in a URL */ - HashList *vars; /**< HTTP variable substitutions for this page */ - StrBuf *http_host; /**< HTTP Host: header */ - int is_ajax; /** < are we doing an ajax request? */ - int gzip_ok; /**< Nonzero if Accept-encoding: gzip */ - int nWildfireHeaders; /**< how many wildfire headers did we already send? */ + HashList *vars; /**< HTTP variable substitutions for this page */ StrBuf *trailing_javascript; /**< extra javascript to be appended to page */ char ImportantMessage[SIZ]; /**< ??? todo */ + StrBuf *ImportantMsg; /* accounting */ StrBuf *wc_username; /**< login name of current user */ - StrBuf *httpauth_user; /**< only for GroupDAV sessions */ StrBuf *wc_fullname; /**< Screen name of current user */ StrBuf *wc_password; /**< Password of current user */ StrBuf *httpauth_pass; /**< only for GroupDAV sessions */ @@ -379,7 +456,7 @@ struct wcsession { int need_vali; /**< New users require validation. */ /* Preferences */ - char cs_inet_email[256]; /**< User's preferred Internet addr. */ + StrBuf *cs_inet_email; /**< User's preferred Internet addr. */ char reply_to[512]; /**< reply-to address */ HashList *hash_prefs; /**< WebCit preferences for this user */ StrBuf *DefaultCharset; /**< Charset the user preferes */ @@ -406,7 +483,7 @@ struct wcsession { /* Uploading; mime attachments for composing messages */ HashList *attachments; /**< list of attachments for 'enter message' */ int upload_length; /**< content length of http-uploaded data */ - char *upload; /**< pointer to http-uploaded data */ + StrBuf *upload; /**< pointer to http-uploaded data */ char upload_filename[PATH_MAX]; /**< filename of http-uploaded data */ char upload_content_type[256]; /**< content type of http-uploaded data */ @@ -414,6 +491,7 @@ struct wcsession { int remember_new_mail; /**< last count of new mail messages */ /* Roomiew control */ + HashList *Floors; /**< floors our citserver has... */ HashList *summ; /**< list of messages for mailbox summary view */ /** Perhaps these should be within a struct instead */ long startmsg; /**< message number to start at */ @@ -425,7 +503,7 @@ struct wcsession { char last_chat_user[256]; /**< ??? todo */ /* Iconbar controls */ - struct folder *cache_fold; /**< cache the iconbar room list */ + struct __ofolder *cache_fold; /**< cache the iconbar room list */ int cache_max_folders; /**< ??? todo */ int cache_num_floors; /**< ??? todo */ time_t cache_timestamp; /**< ??? todo */ @@ -440,11 +518,18 @@ struct wcsession { }; -/* values for WC->current_iconbar */ -enum { - current_iconbar_menu, /* view the icon menue */ - current_iconbar_roomlist /* view the roomtree */ -}; + +typedef void (*Header_Evaluator)(StrBuf *Line, ParsedHttpHdrs *hdr); + +typedef struct _HttpHeader { + Header_Evaluator H; + StrBuf *Val; + int HaveEvaluator; +} OneHttpHeader; + +void RegisterHeaderHandler(const char *Name, long Len, Header_Evaluator F); + + enum { S_SELECT, S_SHUTDOWN, @@ -452,27 +537,6 @@ enum { }; -/* - * calview contains data passed back and forth between the message fetching loop - * and the calendar view renderer. - */ -enum { - calview_month, - calview_day, - calview_week, - calview_brief, - calview_summary -}; - -struct calview { - int view; - int year; - int month; - int day; - time_t lower_bound; - time_t upper_bound; -}; - #ifndef num_parms #define num_parms(source) num_tokens(source, '|') #endif @@ -499,24 +563,26 @@ extern char *server_cookie; extern int is_https; extern int setup_wizard; extern char wizard_filename[]; -extern time_t if_modified_since; extern int follow_xff; -extern HashList *HandlerHash; -extern HashList *PreferenceHooks; -extern HashList *ZoneHash; -extern HashList *SortHash; void InitialiseSemaphores(void); void begin_critical_section(int which_one); void end_critical_section(int which_one); - -void stuff_to_cookie(char *cookie, size_t clen, int session, - StrBuf *user, StrBuf *pass, StrBuf *room); -void cookie_to_stuff(StrBuf *cookie, int *session, - StrBuf *user, - StrBuf *pass, - StrBuf *room); +void stuff_to_cookie(char *cookie, size_t clen, + int session, + StrBuf *user, + StrBuf *pass, + StrBuf *room, + const char *language +); +void cookie_to_stuff(StrBuf *cookie, + int *session, + StrBuf *user, + StrBuf *pass, + StrBuf *room, + StrBuf *language +); void locate_host(StrBuf *TBuf, int); void become_logged_in(const StrBuf *user, const StrBuf *pass, StrBuf *serv_response); void openid_manual_create(void); @@ -528,13 +594,13 @@ void display_main_menu(void); void display_aide_menu(void); void display_advanced_menu(void); void slrp_highest(void); -ServInfo *get_serv_info(StrBuf *, char *); +ServInfo *get_serv_info(StrBuf *, StrBuf *); +int GetConnected(void); void DeleteServInfo(ServInfo **FreeMe); int uds_connectsock(char *); int tcp_connectsock(char *, char *); int serv_getln(char *strbuf, int bufsize); int StrBuf_ServGetln(StrBuf *buf); -int StrBuf_ServGetlnBuffered(StrBuf *buf); int GetServerStatus(StrBuf *Line, long* FullState); void serv_puts(const char *string); void who(void); @@ -569,7 +635,7 @@ void output_headers( int do_httpheaders, void output_custom_content_header(const char *ctype); void wprintf(const char *format,...)__attribute__((__format__(__printf__,1,2))); void hprintf(const char *format,...)__attribute__((__format__(__printf__,1,2))); -void output_static(char *what); +void output_static(const char* What); void print_menu_box(char* Title, char *Class, int nLines, ...); long stresc(char *target, long tSize, char *strbuf, int nbsp, int nolinebreaks); @@ -582,12 +648,10 @@ void msgescputs(char *strbuf); void msgescputs1(char *strbuf); void dump_vars(void); void embed_main_menu(void); -void serv_read(char *buf, int bytes); -void SetAccessCommand(long Oper); void do_addrbook_view(addrbookent *addrbook, int num_ab); -void fetch_ab_name(message_summary *Msg, char *namebuf); -void display_vcard(StrBuf *Target, const char *vcard_source, char alpha, int full, char *storename, long msgnum); +void fetch_ab_name(message_summary *Msg, char **namebuf); +void display_vcard(StrBuf *Target, StrBuf *vcard_source, char alpha, int full, char **storename, long msgnum); void jsonMessageList(void); void new_summary_view(void); void getseen(void); @@ -595,12 +659,15 @@ void text_to_server(char *ptr); void text_to_server_qp(char *ptr); void confirm_delete_msg(void); void display_success(char *); -void authorization_required(const char *message); +void CheckAuthBasic(ParsedHttpHdrs *hdr); +void GetAuthBasic(ParsedHttpHdrs *hdr); void server_to_text(void); void save_edit(char *description, char *enter_cmd, int regoto); void display_edit(char *description, char *check_cmd, char *read_cmd, char *save_cmd, int with_room_banner); long gotoroom(const StrBuf *gname); +void remove_march(const StrBuf *aaa); +void dotskip(void); void confirm_delete_room(void); void validate(void); void display_graphics_upload(char *, char *, char *); @@ -609,14 +676,14 @@ void serv_gets(char *strbuf); void serv_write(const char *buf, int nbytes); void serv_putbuf(const StrBuf *string); void serv_printf(const char *format,...)__attribute__((__format__(__printf__,1,2))); -void load_floorlist(void); +void load_floorlist(StrBuf *Buf); void shutdown_sessions(void); void do_housekeeping(void); void smart_goto(const StrBuf *); void worker_entry(void); -void session_loop(HashList *HTTPHeaders, StrBuf *ReqLine, StrBuf *ReqType, StrBuf *ReadBuf); +void session_loop(void); size_t wc_strftime(char *s, size_t max, const char *format, const struct tm *tm); -void fmt_time(char *buf, time_t thetime); +void fmt_time(char *buf, size_t siz, time_t thetime); void httpdate(char *buf, time_t thetime); time_t httpdate_to_timestamp(StrBuf *buf); void end_webcit_session(void); @@ -632,13 +699,16 @@ char *memreadline(char *start, char *buf, int maxlen); char *memreadlinelen(char *start, char *buf, int maxlen, int *retlen); long extract_token(char *dest, const char *source, int parmnum, char separator, int maxlen); void remove_token(char *source, int parmnum, char separator); -char *load_mimepart(long msgnum, char *partnum); +StrBuf *load_mimepart(long msgnum, char *partnum); void MimeLoadData(wc_mime_attachment *Mime); int pattern2(char *search, char *patn); -void do_edit_vcard(long, char *, char *, const char *); -void striplt(char *); -void stripltlen(char *, int *); -void select_user_to_edit(char *message, char *preselect); +void do_edit_vcard(long msgnum, char *partnum, + message_summary *VCMsg, + wc_mime_attachment *VCAtt, + char *return_to, + const char *force_room); + +void select_user_to_edit(const char *preselect); void delete_user(char *); void do_change_view(int); void folders(void); @@ -647,18 +717,14 @@ void folders(void); void display_addressbook(long msgnum, char alpha); void offer_start_page(StrBuf *Target, WCTemplputParams *TP); -void convenience_page(char *titlebarcolor, char *titlebarmsg, char *messagetext); +void convenience_page(const char *titlebarcolor, const char *titlebarmsg, const char *messagetext); void output_html(const char *, int, int, StrBuf *, StrBuf *); void do_listsub(void); ssize_t write(int fd, const void *buf, size_t count); void cal_process_attachment(wc_mime_attachment *Mime); -void load_calendar_item(message_summary *Msg, int unread, struct calview *c); void display_calendar(message_summary *Msg, int unread); -void display_task(message_summary *Msg, int unread); void display_note(message_summary *Msg, int unread); void updatenote(void); -void parse_calendar_view_request(struct calview *c); -void render_calendar_view(struct calview *c); void do_tasks_view(void); int calendar_summary_view(void); void free_march_list(wcsession *wcf); @@ -680,15 +746,9 @@ icaltimezone *get_default_icaltimezone(void); void display_icaltimetype_as_webform(struct icaltimetype *, char *, int); void icaltime_from_webform(struct icaltimetype *result, char *prefix); void icaltime_from_webform_dateonly(struct icaltimetype *result, char *prefix); -void display_edit_individual_event(icalcomponent *supplied_vtodo, long msgnum, char *from, - int unread, struct calview *calv); -void save_individual_event(icalcomponent *supplied_vtodo, long msgnum, char *from, - int unread, struct calview *calv); -void ical_dezonify(icalcomponent *cal); void partstat_as_string(char *buf, icalproperty *attendee); icalcomponent *ical_encapsulate_subcomponent(icalcomponent *subcomp); void check_attendee_availability(icalcomponent *supplied_vevent); -void do_freebusy(const char *req); int ical_ctdl_is_overlap( struct icaltimetype t1start, struct icaltimetype t1end, @@ -699,17 +759,18 @@ int ical_ctdl_is_overlap( extern char *months[]; extern char *days[]; -int read_server_binary(StrBuf *Ret, size_t total_len); +int read_server_binary(StrBuf *Ret, size_t total_len, StrBuf *Buf); int StrBuf_ServGetBLOB(StrBuf *buf, long BlobSize); +int StrBuf_ServGetBLOBBuffered(StrBuf *buf, long BlobSize); int read_server_text(StrBuf *Buf, long *nLines); -int goto_config_room(void); -long locate_user_vcard_in_this_room(void); +int goto_config_room(StrBuf *Buf); +long locate_user_vcard_in_this_room(message_summary **VCMsg, + wc_mime_attachment **VCAtt); void sleeeeeeeeeep(int); void http_transmit_thing(const char *content_type, int is_static); long unescape_input(char *buf); void do_selected_iconbar(void); void spawn_another_worker_thread(void); -void display_rss(const StrBuf *roomname, StrBuf *request_method); void StrEndTab(StrBuf *Target, int tabnum, int num_tabs); void StrBeginTab(StrBuf *Target, int tabnum, int num_tabs); void StrTabbedDialog(StrBuf *Target, int num_tabs, StrBuf *tabnames[]); @@ -721,7 +782,12 @@ long guess_calhourformat(void); int get_time_format_cached (void); int xtoi(const char *in, size_t len); const char *get_selected_language(void); -void webcit_fmt_date(char *buf, time_t thetime, int brief); + +#define DATEFMT_FULL 0 +#define DATEFMT_BRIEF 1 +#define DATEFMT_RAWDATE 2 +#define DATEFMT_LOCALEDATE 3 +void webcit_fmt_date(char *buf, size_t siz, time_t thetime, int Format); int fetch_http(char *url, char *target_buf, int maxbytes); void free_attachments(wcsession *sess); void summary(void); @@ -729,14 +795,6 @@ void summary(void); int is_mobile_ua(char *user_agent); void embed_room_banner(char *, int); -#define FLOOR_PARAM_LEN 3 -extern const char FLOOR_PARAM_NAMES[(FLOOR_PARAM_LEN + 1)][15]; -extern const int FLOOR_PARAM_NAMELEN[(FLOOR_PARAM_LEN + 1)]; -#define FPKEY(a) FLOOR_PARAM_NAMES[a], FLOOR_PARAM_NAMELEN[a] -#define ROOM_PARAM_LEN 8 -extern const char ROOM_PARAM_NAMES[(ROOM_PARAM_LEN + 1)][20]; -extern const int ROOM_PARAM_NAMELEN[(ROOM_PARAM_LEN +1)]; -#define RPKEY(a) ROOM_PARAM_NAMES[a], ROOM_PARAM_NAMELEN[a] HashList *GetFloorListHash(StrBuf *Target, WCTemplputParams *TP); HashList *GetRoomListHash(StrBuf *Target, WCTemplputParams *TP); int SortRoomsByListOrder(const void *room1, const void *room2); @@ -746,6 +804,12 @@ enum { navbar_default }; +/* actual supported locales */ +void TmplGettext(StrBuf *Target, WCTemplputParams *TP); +void offer_languages(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context, int ContextType); +void set_selected_language(const char *); +void go_selected_language(void); +void stop_selected_language(void); #ifdef HAVE_OPENSSL void init_ssl(void); @@ -767,18 +831,6 @@ extern char *hourname[]; /* Names of hours (12am, 1am, etc.) */ void http_datestring(char *buf, size_t n, time_t xtime); -typedef void (*WebcitHandlerFunc)(void); -typedef struct _WebcitHandler{ - WebcitHandlerFunc F; - long Flags; -} WebcitHandler; -void WebcitAddUrlHandler(const char * UrlString, long UrlSLen, WebcitHandlerFunc F, long Flags); - -#define AJAX (1<<0) -#define ANONYMOUS (1<<1) -#define NEED_URL (1<<2) - - /* These should be empty, but we have them for testing */ #define DEFAULT_HTTPAUTH_USER "" #define DEFAULT_HTTPAUTH_PASS "" @@ -795,5 +847,3 @@ void WebcitAddUrlHandler(const char * UrlString, long UrlSLen, WebcitHandlerFunc #define WC_TIMEFORMAT_AMPM 1 #define WC_TIMEFORMAT_24 2 - -void LoadIconSettings(void);