X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fwebcit.h;h=468d1ae79e1b96ef722222e34ff1952363006214;hb=965dc19512d1f0873b23623fb8803f7ac989f993;hp=bec5aa6c1dd23c40b4a59bdababcac4133382532;hpb=64a9d779e6d2f3e8b9b8492aea68fbf881d6d71b;p=citadel.git diff --git a/webcit/webcit.h b/webcit/webcit.h index bec5aa6c1..468d1ae79 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -74,24 +74,7 @@ extern locale_t wc_locales[]; #include #endif - -/* Work around PACKAGE/VERSION defs that are (not supposed to be?) in ical.h */ -#ifdef PACKAGE -# define CTDL_PACKAGE PACKAGE -# undef PACKAGE -#endif - -#ifdef PACKAGE_STRING -# define CTDL_PACKAGE_STRING PACKAGE_STRING -//# undef PACKAGE_STRING -#endif - -#ifdef VERSION -# define CTDL_VERSION VERSION -# undef VERSION -#endif - -#include +#include #undef PACKAGE #undef VERSION @@ -124,14 +107,11 @@ extern locale_t wc_locales[]; #define PORT_NUM 2000 /* port number to listen on */ #define DEVELOPER_ID 0 #define CLIENT_ID 4 -#define CLIENT_VERSION 735 /* This version of WebCit */ -#define MINIMUM_CIT_VERSION 730 /* min required Citadel ver */ -#define LIBCITADEL_MIN 111 /* min required libcitadel ver */ +#define CLIENT_VERSION 739 /* This version of WebCit */ +#define MINIMUM_CIT_VERSION 739 /* min required Citadel ver */ +#define LIBCITADEL_MIN 739 /* min required libcitadel ver */ #define DEFAULT_HOST "localhost" /* Default Citadel server */ #define DEFAULT_PORT "504" -#define LB (1) /* Internal escape chars */ -#define RB (2) -#define QU (3) #define TARGET "webcit01" /* Target for inline URL's */ #define HOUSEKEEPING 15 /* Housekeeping frequency */ #define MIN_WORKER_THREADS 5 @@ -216,20 +196,13 @@ extern locale_t wc_locales[]; #define NLI "(not logged in)" -/** \brief Linked list of lines appearing in an HTTP client request */ -struct httprequest { - struct httprequest *next; /**< the next request in the list */ - char line[SIZ]; /**< the request line */ -}; - /** * \brief Linked list of session variables encoded in an x-www-urlencoded content type */ typedef struct urlcontent urlcontent; struct urlcontent { char url_key[32]; /**< the variable name */ - char *url_data; /**< its value */ - size_t url_data_size; /**< how big is it? */ + StrBuf *url_data; /**< its value */ }; /** @@ -252,6 +225,7 @@ struct serv_info { int serv_supports_sieve; /* Does the server support Sieve mail filtering? */ int serv_fulltext_enabled; /* Does the server have the full text index enabled? */ char serv_svn_revision[256]; /* SVN revision of the server */ + int serv_supports_openid; /* Does the server support authentication via OpenID? */ }; @@ -280,24 +254,124 @@ struct roomlisting { }; +#define TYPE_STR 1 +#define TYPE_LONG 2 +#define MAXPARAM 20 +typedef struct _TemplateParam { + const char *Start; + int Type; + long len; + long lvalue; +} TemplateParam; + +typedef struct _TemplateToken { + StrBuf *FlatToken; + long Line; + const char *pTokenStart; + size_t TokenStart; + size_t TokenEnd; + const char *pTokenEnd; + int Flags; + void *PreEval; + + const char *pName; + size_t NameEnd; + + int HaveParameters; + int nParameters; + TemplateParam *Params[MAXPARAM]; +} WCTemplateToken; + +typedef void (*WCHandlerFunc)(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context, int ContextType); + /** * \brief Dynamic content for variable substitution in templates */ typedef struct _wcsubst { - int wcs_type; /**< which type of ??? */ - char wcs_key[32]; /**< ??? what?*/ - void *wcs_value; /**< ???? what?*/ - void (*wcs_function)(void); /**< funcion hook ???*/ + int wcs_type; /**< which type of Substitution are we */ + char wcs_key[32]; /**< copy of our hashkey for debugging */ + StrBuf *wcs_value; /**< if we're a string, keep it here */ + long lvalue; /**< type long? keep data here */ + int ContextRequired; /**< do we require a context type? */ + WCHandlerFunc wcs_function; /**< funcion hook ???*/ } wcsubst; +#define CTX_NONE 0 +#define CTX_SITECFG 1 +#define CTX_SESSION 2 +#define CTX_INETCFG 3 +#define CTX_VNOTE 4 +#define CTX_WHO 5 +#define CTX_PREF 6 +#define CTX_NODECONF 7 + + +void RegisterNS(const char *NSName, long len, + int nMinArgs, + int nMaxArgs, + WCHandlerFunc HandlerFunc, + int ContextRequired); +#define RegisterNamespace(a, b, c, d, e) RegisterNS(a, sizeof(a)-1, b, c, d, e) + +typedef int (*WCConditionalFunc)(WCTemplateToken *Token, void *Context, int ContextType); +typedef struct _ConditionalStruct { + int nParams; + int ContextRequired; + WCConditionalFunc CondF; +} ConditionalStruct; +void RegisterConditional(const char *Name, long len, + int nParams, + WCConditionalFunc CondF, + int ContextRequired); + + + +typedef void (*SubTemplFunc)(StrBuf *TemplBuffer, void *Context, WCTemplateToken *Token); +typedef HashList *(*RetrieveHashlistFunc)(WCTemplateToken *Token); +typedef void (*HashDestructorFunc) (HashList **KillMe); +void RegisterITERATOR(const char *Name, long len, + int AdditionalParams, + HashList *StaticList, + RetrieveHashlistFunc GetHash, + SubTemplFunc DoSubTempl, + HashDestructorFunc Destructor, + int ContextType); +#define RegisterIterator(a, b, c, d, e, f, g) RegisterITERATOR(a, sizeof(a)-1, b, c, d, e, f, g) + +void SVPut(char *keyname, size_t keylen, int keytype, char *Data); +#define svput(a, b, c) SVPut(a, sizeof(a) - 1, b, c) +void SVPutLong(char *keyname, size_t keylen, long Data); +#define svputlong(a, b) SVPutLong(a, sizeof(a) - 1, b) +void svprintf(char *keyname, size_t keylen, int keytype, const char *format,...) __attribute__((__format__(__printf__,4,5))); +void SVPRINTF(char *keyname, int keytype, const char *format,...) __attribute__((__format__(__printf__,3,4))); +void SVCALLBACK(char *keyname, WCHandlerFunc fcn_ptr); +void SVCallback(char *keyname, size_t keylen, WCHandlerFunc fcn_ptr); +#define svcallback(a, b) SVCallback(a, sizeof(a) - 1, b) + +void SVPUTBuf(const char *keyname, int keylen, const StrBuf *Buf, int ref); +#define SVPutBuf(a, b, c); SVPUTBuf(a, sizeof(a) - 1, b, c) + +void DoTemplate(const char *templatename, long len, void *Context, StrBuf *Target, int ContextType); +#define do_template(a, b) DoTemplate(a, sizeof(a) -1, b, NULL, 0); +void url_do_template(void); + +int CompareSubstToToken(TemplateParam *ParamToCompare, TemplateParam *ParamToLookup); +int CompareSubstToStrBuf(StrBuf *Compare, TemplateParam *ParamToLookup); + + + + /** * \brief Values for wcs_type */ enum { - WCS_STRING, /**< its a string */ - WCS_FUNCTION, /**< its a function callback */ - WCS_SERVCMD /**< its a command to send to the citadel server */ + WCS_STRING, /**< its a string */ + WCS_FUNCTION, /**< its a function callback */ + WCS_SERVCMD, /**< its a command to send to the citadel server */ + WCS_STRBUF, /**< its a strbuf we own */ + WCS_STRBUF_REF, /**< its a strbuf we mustn't free */ + WCS_LONG /**< its an integer */ }; /** @@ -309,6 +383,7 @@ struct wc_attachment { char content_type[SIZ]; /**< the content itself ???*/ char filename[SIZ]; /**< the filename hooked to this content ??? */ char *data; /**< the data pool; aka this content */ + long lvalue; /**< if we put a long... */ }; /** @@ -338,6 +413,20 @@ struct folder { 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 */ + char *from; /**< owner of this component */ + int unread; /**< already seen by the user? */ + + time_t event_start; + time_t event_end; + + int multi_day_event; + int is_repeat; +} disp_cal; + + /** * \brief One of these is kept for each active Citadel session. * HTTP transactions are bound to on e at a time. @@ -382,40 +471,40 @@ struct wcsession { long msgarr[10000]; /**< for read operations */ int num_summ; /**< number of messages in mailbox summary view */ struct message_summary *summ; /**< array of messages for mailbox summary view */ - int is_wap; /**< Client is a WAP gateway */ + int is_mobile; /**< Client is a handheld browser */ HashList *urlstrings; /**< variables passed to webcit in a URL */ HashList *vars; /**< HTTP variable substitutions for this page */ char this_page[512]; /**< URL of current page */ char http_host[512]; /**< HTTP Host: header */ HashList *hash_prefs; /**< WebCit preferences for this user */ - struct disp_cal { - icalcomponent *cal; /**< cal items for display */ - long cal_msgnum; /**< cal msgids for display */ - char *from; /**< owner of this component */ - int unread; /**< already seen by the user? */ - } *disp_cal; - int num_cal; /**< number of calendar items for display */ + HashList *disp_cal_items; /**< sorted list of calendar items; startdate is the sort criteria. */ struct wc_attachment *first_attachment; /**< linked list of attachments for 'enter message' */ char last_chat_user[256]; /**< ??? todo */ char ImportantMessage[SIZ]; /**< ??? todo */ int ctdl_pid; /**< Session ID on the Citadel server */ char httpauth_user[256]; /**< only for GroupDAV sessions */ char httpauth_pass[256]; /**< only for GroupDAV sessions */ - size_t burst_len; /** current_iconbar */ @@ -459,7 +548,15 @@ extern char wizard_filename[]; extern time_t if_modified_since; extern int follow_xff; extern HashList *HandlerHash; -void do_setup_wizard(void); +extern HashList *PreferenceHooks; +extern HashList *WirelessTemplateCache; +extern HashList *WirelessLocalTemplateCache; +extern HashList *TemplateCache; +extern HashList *LocalTemplateCache; +extern HashList *GlobalNS; +extern HashList *Iterators; +extern HashList *ZoneHash; +extern HashList *Contitionals; void InitialiseSemaphores(void); @@ -469,67 +566,73 @@ void end_critical_section(int which_one); void stuff_to_cookie(char *cookie, size_t clen, int session, char *user, char *pass, char *room); -void cookie_to_stuff(char *cookie, int *session, +void cookie_to_stuff(StrBuf *cookie, int *session, char *user, size_t user_len, char *pass, size_t pass_len, char *room, size_t room_len); void locate_host(char *, int); void become_logged_in(char *, char *, char *); -void do_login(void); +void openid_manual_create(void); void display_login(char *mesg); +void display_openids(void); void do_welcome(void); void do_logout(void); void display_main_menu(void); void display_aide_menu(void); -void display_shutdown(void); void display_advanced_menu(void); void slrp_highest(void); -void gotonext(void); -void ungoto(void); void get_serv_info(char *, char *); int uds_connectsock(char *); int tcp_connectsock(char *, char *); int serv_getln(char *strbuf, int bufsize); -void serv_puts(char *string); +int StrBuf_ServGetln(StrBuf *buf); +void serv_puts(const char *string); void who(void); void who_inner_div(void); -void wholist_section(void); -void tasks_section(void); -void calendar_section(void); void ajax_mini_calendar(void); -void new_messages_section(void); void fmout(char *align); +void _fmout(StrBuf *Targt, char *align); void pullquote_fmout(void); void wDumpContent(int); -void serv_printf(const char *format,...); -/* TODO: get rid of the non-const-typecast */ -#define bstr(a) (char*) Bstr(a, sizeof(a) - 1) -const char *BSTR(char *key); -const char *Bstr(char *key, size_t keylen); +/* These may return NULL if not foud */ +#define sbstr(a) SBstr(a, sizeof(a) - 1) +const StrBuf *SBSTR(const char *key); +const StrBuf *SBstr(const char *key, size_t keylen); #define xbstr(a, b) (char*) XBstr(a, sizeof(a) - 1, b) -const char *XBstr(char *key, size_t keylen, size_t *len); -const char *XBSTR(char *key, size_t *len); +const char *XBstr(const char *key, size_t keylen, size_t *len); +const char *XBSTR(const char *key, size_t *len); #define lbstr(a) LBstr(a, sizeof(a) - 1) -long LBstr(char *key, size_t keylen); -long LBSTR(char *key); +long LBstr(const char *key, size_t keylen); +long LBSTR(const char *key); #define ibstr(a) IBstr(a, sizeof(a) - 1) -int IBstr(char *key, size_t keylen); -int IBSTR(char *key); +int IBstr(const char *key, size_t keylen); +int IBSTR(const char *key); #define havebstr(a) HaveBstr(a, sizeof(a) - 1) -int HaveBstr(char *key, size_t keylen); -int HAVEBSTR(char *key); +int HaveBstr(const char *key, size_t keylen); +int HAVEBSTR(const char *key); #define yesbstr(a) YesBstr(a, sizeof(a) - 1) -int YesBstr(char *key, size_t keylen); -int YESBSTR(char *key); +int YesBstr(const char *key, size_t keylen); +int YESBSTR(const char *key); + +/* TODO: get rid of the non-const-typecast */ +#define bstr(a) (char*) Bstr(a, sizeof(a) - 1) +const char *BSTR(const char *key); +const char *Bstr(const char *key, size_t keylen); + -void urlescputs(char *); +void UrlescPutStrBuf(const StrBuf *strbuf); +void StrEscPuts(const StrBuf *strbuf); +void StrEscputs1(const StrBuf *strbuf, int nbsp, int nolinebreaks); + +void urlescputs(const char *); +void hurlescputs(const char *); void jsesc(char *, size_t, char *); void jsescputs(char *); void output_headers( int do_httpheaders, @@ -538,7 +641,8 @@ void output_headers( int do_httpheaders, int unset_cookies, int suppress_check, int cache); -void wprintf(const char *format,...); +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 display_mime_icon(void); void print_menu_box(char* Title, char *Class, int nLines, ...); @@ -555,100 +659,43 @@ void embed_main_menu(void); void serv_read(char *buf, int bytes); void readloop(char *oper); void read_message(long msgnum, int printable_view, char *section); -void embed_message(char *msgnum_as_string); -void print_message(char *msgnum_as_string); -void display_headers(char *msgnum_as_string); void text_to_server(char *ptr); void text_to_server_qp(char *ptr); -void display_enter(void); -void post_message(void); void confirm_delete_msg(void); -void delete_msg(void); -void confirm_move_msg(void); -void move_msg(void); -void userlist(void); -void showuser(void); -void display_page(void); -void page_user(void); -void do_chat(void); -void display_private(char *rname, int req_pass); -void goto_private(void); -void zapped_list(void); -void display_zap(void); -void zap(void); void display_success(char *); void authorization_required(const char *message); -void display_entroom(void); -void entroom(void); -void display_editroom(void); -void netedit(void); -void editroom(void); -void display_whok(void); -void do_invt_kick(void); 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); int gotoroom(char *gname); void confirm_delete_room(void); -void delete_room(void); void validate(void); void display_graphics_upload(char *, char *, char *); void do_graphics_upload(char *upl_cmd); void serv_read(char *buf, int bytes); void serv_gets(char *strbuf); -void serv_write(char *buf, int nbytes); -void serv_puts(char *string); -void serv_printf(const char *format,...); +void serv_write(const char *buf, int nbytes); +void serv_puts(const char *string); +void serv_putbuf(const StrBuf *string); +void serv_printf(const char *format,...)__attribute__((__format__(__printf__,1,2))); void load_floorlist(void); -void display_reg(int); -void display_changepw(void); -void changepw(void); -void display_edit_node(void); -void edit_node(void); -void display_netconf(void); -void display_confirm_delete_node(void); -void delete_node(void); -void display_add_node(void); -void terminate_session(void); void shutdown_sessions(void); void do_housekeeping(void); -void edit_me(void); -void display_siteconfig(void); -void siteconfig(void); -void display_generic(void); -void do_generic(void); -void ajax_servcmd(void); -void display_menubar(int); void smart_goto(char *); void worker_entry(void); -void session_loop(struct httprequest *); +void session_loop(HashList *HTTPHeaders, StrBuf *ReqLine, StrBuf *ReqType, StrBuf *ReadBuf); 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 httpdate(char *buf, time_t thetime); -time_t httpdate_to_timestamp(char *buf); +time_t httpdate_to_timestamp(StrBuf *buf); void end_webcit_session(void); void page_popup(void); -void chat_recv(void); -void chat_send(void); -void http_redirect(char *); +void http_redirect(const char *); void clear_substs(struct wcsession *wc); void clear_local_substs(void); -typedef void (*var_callback_fptr)(); - - -void SVPut(char *keyname, size_t keylen, int keytype, char *Data); -#define svput(a, b, c) SVPut(a, sizeof(a) - 1, b, c) -void svprintf(char *keyname, size_t keylen, int keytype, const char *format,...); -void SVPRINTF(char *keyname, int keytype, const char *format,...); -void SVCALLBACK(char *keyname, var_callback_fptr fcn_ptr); -void SVCallback(char *keyname, size_t keylen, var_callback_fptr fcn_ptr); -#define svcallback(a, b) SVCallback(a, sizeof(a) - 1, b) - -void do_template(void *templatename); - int lingering_close(int fd); char *memreadline(char *start, char *buf, int maxlen); @@ -658,101 +705,83 @@ void remove_token(char *source, int parmnum, char separator); char *load_mimepart(long msgnum, char *partnum); int pattern2(char *search, char *patn); void do_edit_vcard(long, char *, char *, char *); -void edit_vcard(void); -void submit_vcard(void); void striplt(char *); void stripltlen(char *, int *); void select_user_to_edit(char *message, char *preselect); void delete_user(char *); -void display_edituser(char *who, int is_new); -void create_user(void); -void edituser(void); void do_change_view(int); -void change_view(void); void folders(void); + + void load_preferences(void); void save_preferences(void); -void get_preference(char *key, char *value, size_t value_len); -void set_preference(char *key, char *value, int save_to_server); -void knrooms(void); +#define get_preference(a, b) get_PREFERENCE(a, sizeof(a) - 1, b) +#define get_pref(a, b) get_PREFERENCE(ChrPtr(a), StrLength(a), b) +int get_PREFERENCE(const char *key, size_t keylen, StrBuf **value); +#define set_preference(a, b, c) set_PREFERENCE(a, sizeof(a) - 1, b, c) +#define set_pref(a, b, c) set_PREFERENCE(ChrPtr(a), StrLength(a), b, c) +void set_PREFERENCE(const char *key, size_t keylen, StrBuf *value, int save_to_server); + +#define get_pref_long(a, b, c) get_PREF_LONG(a, sizeof(a) - 1, b, c) +int get_PREF_LONG(const char *key, size_t keylen, long *value, long Default); +#define set_pref_long(a, b, c) set_PREF_LONG(a, sizeof(a) - 1, b, c) +void set_PREF_LONG(const char *key, size_t keylen, long value, int save_to_server); + +#define get_pref_yesno(a, b, c) get_PREF_YESNO(a, sizeof(a) - 1, b, c) +int get_PREF_YESNO(const char *key, size_t keylen, int *value, int Default); +#define set_pref_yesno(a, b, c) set_PREF_YESNO(a, sizeof(a) - 1, b, c) +void set_PREF_YESNO(const char *key, size_t keylen, int value, int save_to_server); + +#define get_room_pref(a) get_ROOM_PREFS(a, sizeof(a) - 1) +StrBuf *get_ROOM_PREFS(const char *key, size_t keylen); + +#define set_room_pref(a, b, c) set_ROOM_PREFS(a, sizeof(a) - 1, b, c) +void set_ROOM_PREFS(const char *key, size_t keylen, StrBuf *value, int save_to_server); + int is_msg_in_mset(char *mset, long msgnum); void display_addressbook(long msgnum, char alpha); -void offer_start_page(void); +void offer_start_page(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context, int ContextType); void convenience_page(char *titlebarcolor, char *titlebarmsg, char *messagetext); -void change_start_page(void); -void output_html(char *, int); -void display_floorconfig(char *); -void delete_floor(void); -void create_floor(void); -void rename_floor(void); +void output_html(char *, int, int); void do_listsub(void); void toggle_self_service(void); -void summary(void); -void summary_inner_div(void); ssize_t write(int fd, const void *buf, size_t count); void cal_process_attachment(char *part_source, long msgnum, char *cal_partnum); void display_calendar(long msgnum, int unread); void display_task(long msgnum, int unread); void display_note(long msgnum, int unread); void updatenote(void); -void ajax_update_note(void); void do_calendar_view(void); void do_tasks_view(void); -void free_calendar_buffer(void); void calendar_summary_view(void); int load_msg_ptrs(char *servcmd, int with_headers); void free_attachments(struct wcsession *sess); void free_march_list(struct wcsession *wcf); -void set_room_policy(void); -void display_inetconf(void); -void save_inetconf(void); -void display_smtpqueue(void); -void display_smtpqueue_inner_div(void); -void display_sieve(void); void display_rules_editor_inner_div(void); -void save_sieve(void); -void display_pushemail(void); -void save_pushemail(void); -void display_add_remove_scripts(char *); -void create_script(void); -void delete_script(void); void generate_uuid(char *); void CtdlMakeTempFileName(char *, int); -void display_preferences(void); -void set_preferences(void); -void recp_autocomplete(char *); void address_book_popup(void); -void display_address_book_middle_div(void); -void display_address_book_inner_div(void); void begin_ajax_response(void); void end_ajax_response(void); void initialize_viewdefs(void); void initialize_axdefs(void); void burn_folder_cache(time_t age); -void list_all_rooms_by_floor(char *viewpref); -void display_room_directory(void); -void display_picture(void); +void list_all_rooms_by_floor(const char *viewpref); void display_pictureview(void); -void download_file(char *); -void upload_file(void); void display_edit_task(void); -void save_task(void); void display_edit_event(void); -void save_event(void); icaltimezone *get_default_icaltimezone(void); void display_icaltimetype_as_webform(struct icaltimetype *, char *); 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); void save_individual_event(icalcomponent *supplied_vtodo, long msgnum, char *from, int unread); -void respond_to_request(void); -void handle_rsvp(void); 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(char *req); +void do_freebusy(const char *req); int ical_ctdl_is_overlap( struct icaltimetype t1start, struct icaltimetype t1end, @@ -762,42 +791,43 @@ int ical_ctdl_is_overlap( #ifdef ENABLE_NLS void initialize_locales(void); +void ShutdownLocale(void); #endif +void TmplGettext(StrBuf *Target, int nTokens, WCTemplateToken *Token); extern char *months[]; extern char *days[]; -void read_server_binary(char *buffer, size_t total_len); -char *read_server_text(void); +int read_server_binary(StrBuf *Ret, size_t total_len); +int StrBuf_ServGetBLOB(StrBuf *buf, long BlobSize); +int read_server_text(StrBuf *Buf, long *nLines);; int goto_config_room(void); long locate_user_vcard(char *username, long usernum); void sleeeeeeeeeep(int); -void http_transmit_thing(char *thing, size_t length, const char *content_type, - int is_static); +void http_transmit_thing(const char *content_type, int is_static); long unescape_input(char *buf); -void do_iconbar(void); -void do_iconbar_roomlist(void); void do_selected_iconbar(void); -void display_customize_iconbar(void); -void commit_iconbar(void); int CtdlDecodeQuotedPrintable(char *decoded, char *encoded, int sourcelen); void spawn_another_worker_thread(void); -void display_rss(char *roomname, char *request_method); -void set_floordiv_expanded(char *which_floordiv); -void offer_languages(void); -void set_selected_language(char *); +void display_rss(char *roomname, StrBuf *request_method); +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); void preset_locale(void); -void httplang_to_locale(char *LocaleString); +void httplang_to_locale(StrBuf *LocaleString); +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[]); void tabbed_dialog(int num_tabs, char *tabnames[]); void begin_tab(int tabnum, int num_tabs); void end_tab(int tabnum, int num_tabs); void str_wiki_index(char *s); -void display_wiki_page(void); int get_time_format_cached (void); -int xtoi(char *in, size_t len); +int xtoi(const char *in, size_t len); void webcit_fmt_date(char *buf, time_t thetime, int brief); +int fetch_http(char *url, char *target_buf, int maxbytes); +int is_mobile_ua(char *user_agent); #ifdef HAVE_ICONV iconv_t ctdl_iconv_open(const char *tocode, const char *fromcode); @@ -818,8 +848,8 @@ void endtls(void); void ssl_lock(int mode, int n, const char *file, int line); int starttls(int sock); extern SSL_CTX *ssl_ctx; -int client_read_ssl(char *buf, int bytes, int timeout); -void client_write_ssl(char *buf, int nbytes); +int client_read_sslbuffer(StrBuf *buf, int timeout); +void client_write_ssl(const StrBuf *Buf); #endif #ifdef HAVE_ZLIB @@ -831,7 +861,7 @@ int ZEXPORT compress_gzip(Bytef * dest, size_t * destLen, void utf8ify_rfc822_string(char *buf); void begin_burst(void); -void end_burst(void); +long end_burst(void); extern char *hourname[]; /**< Names of hours (12am, 1am, etc.) */ @@ -841,10 +871,13 @@ void http_datestring(char *buf, size_t n, time_t xtime); typedef void (*WebcitHandlerFunc)(void); typedef struct _WebcitHandler{ WebcitHandlerFunc F; - int IsAjax; + long Flags; } WebcitHandler; -void WebcitAddUrlHandler(const char * UrlString, long UrlSLen, WebcitHandlerFunc F, int IsAjax); +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 */