X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fwebcit.h;h=abcfb13cbffb89af7ecb471a2c4d0480a53e8dd3;hb=3d6fea2eca29405b8a90d91ee862e5a30aebdd3b;hp=717645ea9031e5d58e4c7eca3c994ea41560879e;hpb=53c742f994c6d4a32b91c41ec92bc7abe8760df2;p=citadel.git diff --git a/webcit/webcit.h b/webcit/webcit.h index 717645ea9..abcfb13cb 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -1,3 +1,4 @@ + /* $Id$ */ #include "sysdep.h" @@ -49,6 +50,9 @@ #endif #ifdef ENABLE_NLS +#ifdef HAVE_XLOCALE_H +#include +#endif #include #include #ifdef HAVE_USELOCALE @@ -107,9 +111,9 @@ 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 737 /* This version of WebCit */ -#define MINIMUM_CIT_VERSION 737 /* min required Citadel ver */ -#define LIBCITADEL_MIN 738 /* 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 TARGET "webcit01" /* Target for inline URL's */ @@ -134,33 +138,33 @@ extern locale_t wc_locales[]; * * bucket one... */ -#define QR_PERMANENT 1 /**< Room does not purge */ -#define QR_INUSE 2 /**< Set if in use, clear if avail */ -#define QR_PRIVATE 4 /**< Set for any type of private room */ -#define QR_PASSWORDED 8 /**< Set if there's a password too */ -#define QR_GUESSNAME 16 /**< Set if it's a guessname room */ -#define QR_DIRECTORY 32 /**< Directory room */ -#define QR_UPLOAD 64 /**< Allowed to upload */ -#define QR_DOWNLOAD 128 /**< Allowed to download */ -#define QR_VISDIR 256 /**< Visible directory */ -#define QR_ANONONLY 512 /**< Anonymous-Only room */ -#define QR_ANONOPT 1024 /**< Anonymous-Option room */ -#define QR_NETWORK 2048 /**< Shared network room */ -#define QR_PREFONLY 4096 /**< Preferred status needed to enter */ -#define QR_READONLY 8192 /**< Aide status required to post */ -#define QR_MAILBOX 16384 /**< Set if this is a private mailbox */ +#define QR_PERMANENT 1 /* Room does not purge */ +#define QR_INUSE 2 /* Set if in use, clear if avail */ +#define QR_PRIVATE 4 /* Set for any type of private room */ +#define QR_PASSWORDED 8 /* Set if there's a password too */ +#define QR_GUESSNAME 16 /* Set if it's a guessname room */ +#define QR_DIRECTORY 32 /* Directory room */ +#define QR_UPLOAD 64 /* Allowed to upload */ +#define QR_DOWNLOAD 128 /* Allowed to download */ +#define QR_VISDIR 256 /* Visible directory */ +#define QR_ANONONLY 512 /* Anonymous-Only room */ +#define QR_ANONOPT 1024 /* Anonymous-Option room */ +#define QR_NETWORK 2048 /* Shared network room */ +#define QR_PREFONLY 4096 /* Preferred status needed to enter */ +#define QR_READONLY 8192 /* Aide status required to post */ +#define QR_MAILBOX 16384 /* Set if this is a private mailbox */ -/** +/* * bucket two... */ -#define QR2_SYSTEM 1 /**< System room; hide by default */ -#define QR2_SELFLIST 2 /**< Self-service mailing list mgmt */ -#define QR2_COLLABDEL 4 /**< Anyone who can post can also delete*/ -#define QR2_SUBJECTREQ 8 /**< Subject strongly recommended */ +#define QR2_SYSTEM 1 /* System room; hide by default */ +#define QR2_SELFLIST 2 /* Self-service mailing list mgmt */ +#define QR2_COLLABDEL 4 /* Anyone who can post can also delete*/ +#define QR2_SUBJECTREQ 8 /* Subject strongly recommended */ #define QR2_SMTP_PUBLIC 16 /* smtp public postable room */ #define QR2_MODERATED 32 /* Listservice aide has to permit posts */ -/** +/* * user/room access */ #define UA_KNOWN 2 @@ -169,22 +173,22 @@ extern locale_t wc_locales[]; #define UA_ZAPPED 16 -/** +/* * User flags (from Citadel) */ -#define US_NEEDVALID 1 /**< User needs to be validated */ -#define US_PERM 4 /**< Permanent user */ -#define US_LASTOLD 16 /**< Print last old message with new */ -#define US_EXPERT 32 /**< Experienced user */ -#define US_UNLISTED 64 /**< Unlisted userlog entry */ -#define US_NOPROMPT 128 /**< Don't prompt after each message */ -#define US_PROMPTCTL 256 /**< ext & top work at prompt */ -#define US_DISAPPEAR 512 /**< Use "disappearing msg prompts" */ -#define US_REGIS 1024 /**< Registered user */ -#define US_PAGINATOR 2048 /**< Pause after each screen of text */ -#define US_INTERNET 4096 /**< Internet mail privileges */ -#define US_FLOORS 8192 /**< User wants to see floors */ -#define US_COLOR 16384 /**< User wants ANSI color support */ +#define US_NEEDVALID 1 /* User needs to be validated */ +#define US_PERM 4 /* Permanent user */ +#define US_LASTOLD 16 /* Print last old message with new */ +#define US_EXPERT 32 /* Experienced user */ +#define US_UNLISTED 64 /* Unlisted userlog entry */ +#define US_NOPROMPT 128 /* Don't prompt after each message */ +#define US_PROMPTCTL 256 /* ext & top work at prompt */ +#define US_DISAPPEAR 512 /* Use "disappearing msg prompts" */ +#define US_REGIS 1024 /* Registered user */ +#define US_PAGINATOR 2048 /* Pause after each screen of text */ +#define US_INTERNET 4096 /* Internet mail privileges */ +#define US_FLOORS 8192 /* User wants to see floors */ +#define US_COLOR 16384 /* User wants ANSI color support */ #define US_USER_SET (US_LASTOLD | US_EXPERT | US_UNLISTED | \ US_NOPROMPT | US_DISAPPEAR | US_PAGINATOR | \ US_FLOORS | US_COLOR | US_PROMPTCTL ) @@ -196,22 +200,16 @@ 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 */ - StrBuf *url_data; /**< its value */ + char url_key[32]; /* the variable name */ + StrBuf *url_data; /* its value */ }; -/** +/* * \brief information about us ??? */ struct serv_info { @@ -236,14 +234,14 @@ struct serv_info { -/** +/* * \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 */ + 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 */ }; /* * @@ -251,27 +249,15 @@ struct march { * 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 */ + 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 Dynamic content for variable substitution in templates - */ -typedef struct _wcsubst { - 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 */ - void (*wcs_function)(void); /**< funcion hook ???*/ -} wcsubst; - #define TYPE_STR 1 #define TYPE_LONG 2 #define MAXPARAM 20 @@ -290,6 +276,7 @@ typedef struct _TemplateToken { size_t TokenEnd; const char *pTokenEnd; int Flags; + void *PreEval; const char *pName; size_t NameEnd; @@ -299,94 +286,193 @@ typedef struct _TemplateToken { TemplateParam *Params[MAXPARAM]; } WCTemplateToken; +typedef void (*WCHandlerFunc)(); + + +/* + * \brief Dynamic content for variable substitution in templates + */ +typedef struct _wcsubst { + 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 +#define CTX_USERLIST 8 +#define CTX_MAILSUM 9 + -typedef void (*WCHandlerFunc)(StrBuf *Target, int nArgs, WCTemplateToken *Token, void *Context); void RegisterNS(const char *NSName, long len, int nMinArgs, int nMaxArgs, - WCHandlerFunc HandlerFunc); -#define RegisterNamespace(a, b, c, d) RegisterNS(a, sizeof(a)-1, b, c, d) + 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); +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); + WCConditionalFunc CondF, + int ContextRequired); typedef void (*SubTemplFunc)(StrBuf *TemplBuffer, void *Context, WCTemplateToken *Token); typedef HashList *(*RetrieveHashlistFunc)(WCTemplateToken *Token); -typedef void (*HashDestructorFunc) (HashList *KillMe); +typedef void (*HashDestructorFunc) (HashList **KillMe); void RegisterITERATOR(const char *Name, long len, int AdditionalParams, HashList *StaticList, RetrieveHashlistFunc GetHash, SubTemplFunc DoSubTempl, - HashDestructorFunc Destructor); -#define RegisterIterator(a, b, c, d, e, f) RegisterITERATOR(a, sizeof(a)-1, b, c, d, e, f) + 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, StrBuf *Target, void *Context, int ContextType); +#define do_template(a, b) DoTemplate(a, sizeof(a) -1, NULL, b, 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_STRBUF, /**< its a strbuf we own */ - WCS_STRBUF_REF, /**< its a strbuf we mustn't free */ - WCS_LONG /**< its an integer */ + 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 */ }; -/** +/* * \brief mail attachment ??? */ struct wc_attachment { - struct wc_attachment *next;/**< pointer to next in list */ - size_t length; /**< length of the contenttype */ - 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... */ + struct wc_attachment *next;/* pointer to next in list */ + size_t length; /* length of the contenttype */ + 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... */ }; -/** +typedef struct _wc_mime_attachment { + StrBuf *Name; + StrBuf *FileName; + StrBuf *PartNum; + StrBuf *Disposition; + StrBuf *ContentType; + StrBuf *Charset; + StrBuf *Data; + size_t length; /* length of the mimeatachment */ + 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... */ + long msgnum; /**< the message number on the citadel server derived from message_summary */ +}wc_mime_attachment; + + +typedef void (*RenderMimeFunc)(wc_mime_attachment *Mime, StrBuf *RawData); + +/* * \brief message summary structure. ??? */ -struct message_summary { +typedef struct _message_summary { time_t date; /**< its creation date */ long msgnum; /**< the message number on the citadel server */ - char from[128]; /**< the author */ - char to[128]; /**< the recipient */ - char subj[256]; /**< the title / subject */ - int hasattachments; /**< does it have atachments? */ + int nhdr; + int format_type; + StrBuf *from; /**< the author */ + StrBuf *to; /**< the recipient */ + StrBuf *subj; /**< the title / subject */ + StrBuf *reply_inreplyto; + StrBuf *reply_references; + StrBuf *reply_to; + StrBuf *cccc; + StrBuf *hnod; + StrBuf *AllRcpt; + StrBuf *Room; + StrBuf *Rfca; + StrBuf *OtherNode; + + HashList *Attachments; /**< list of Accachments */ + HashList *Submessages; + HashList *AttachLinks; + int is_new; /**< is it yet read? */ -}; + int hasattachments; /* does it have atachments? */ + + + /** The mime part of the message */ + wc_mime_attachment MsgBody; + + + /** Referencces; don't neeed to be freed: */ + wc_mime_attachment *cal_partnum_ref; + wc_mime_attachment *vcard_partnum_ref; +} message_summary; + +typedef void (*ExamineMsgHeaderFunc)(message_summary *Msg, StrBuf *HdrLine); + + + /** * \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 */ + 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 */ - char *from; /**< owner of this component */ - int unread; /**< already seen by the user? */ + 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; @@ -396,9 +482,9 @@ typedef struct _disp_cal { } disp_cal; -/** - * \brief One of these is kept for each active Citadel session. - * HTTP transactions are bound to on e at a time. +/* + * One of these is kept for each active Citadel session. + * HTTP transactions are bound to one at a time. */ struct wcsession { struct wcsession *next; /**< Linked list */ @@ -438,8 +524,7 @@ struct wcsession { struct march *march; /**< march mode room list */ char reply_to[512]; /**< reply-to address */ 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 */ + HashList *summ; /**< list of messages for mailbox summary view */ 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 */ @@ -470,15 +555,18 @@ struct wcsession { StrBuf *UrlFragment2; /**< second urlfragment, if NEED_URL is specified by the handler*/ StrBuf *WBuf; /**< Our output buffer */ StrBuf *HBuf; /**< Our HeaderBuffer */ - + StrBuf *CLineBuf; /**< linebuffering client stuff */ + StrBuf *DefaultCharset; /**< Charset the user preferes */ HashList *ServCfg; /**< cache our server config for editing */ HashList *InetCfg; /**< Our inet server config for editing */ + + StrBuf *trailing_javascript; /**< extra javascript to be appended to page */ }; -/** values for WC->current_iconbar */ +/* values for WC->current_iconbar */ enum { - current_iconbar_menu, /**< view the icon menue */ - current_iconbar_roomlist /**< view the roomtree */ + current_iconbar_menu, /* view the icon menue */ + current_iconbar_roomlist /* view the roomtree */ }; enum { S_SELECT, @@ -486,6 +574,27 @@ enum { MAX_SEMAPHORES }; + +/* + * 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 +}; + +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 @@ -525,7 +634,8 @@ extern HashList *GlobalNS; extern HashList *Iterators; extern HashList *ZoneHash; extern HashList *Contitionals; - +extern HashList *MsgHeaderHandler; +extern HashList *MimeRenderHandler; void InitialiseSemaphores(void); void begin_critical_section(int which_one); @@ -534,7 +644,7 @@ 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); @@ -554,6 +664,7 @@ int uds_connectsock(char *); int tcp_connectsock(char *, char *); int serv_getln(char *strbuf, int bufsize); int StrBuf_ServGetln(StrBuf *buf); +int GetServerStatus(StrBuf *Line, long* FullState); void serv_puts(const char *string); void who(void); void who_inner_div(void); @@ -563,6 +674,9 @@ void _fmout(StrBuf *Targt, char *align); void pullquote_fmout(void); void wDumpContent(int); +int Flathash(const char *str, long len); + + /* These may return NULL if not foud */ #define sbstr(a) SBstr(a, sizeof(a) - 1) const StrBuf *SBSTR(const char *key); @@ -652,11 +766,11 @@ void shutdown_sessions(void); void do_housekeeping(void); 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 http_redirect(const char *); @@ -664,28 +778,6 @@ 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 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, 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 SVPUTBuf(const char *keyname, int keylen, 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); -#define do_template(a, b) DoTemplate(a, sizeof(a) -1, b, NULL); -void url_do_template(void); - -int CompareSubstToToken(TemplateParam *ParamToCompare, TemplateParam *ParamToLookup); -int CompareSubstToStrBuf(StrBuf *Compare, TemplateParam *ParamToLookup); int lingering_close(int fd); char *memreadline(char *start, char *buf, int maxlen); @@ -730,18 +822,20 @@ void set_ROOM_PREFS(const char *key, size_t keylen, StrBuf *value, int save_to_s 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 output_html(char *, int); +void output_html(const char *, int, int, StrBuf *, StrBuf *); void do_listsub(void); void toggle_self_service(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 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 do_calendar_view(void); +void parse_calendar_view_request(struct calview *c); +void render_calendar_view(struct calview *c); void do_tasks_view(void); void calendar_summary_view(void); int load_msg_ptrs(char *servcmd, int with_headers); @@ -762,16 +856,18 @@ void display_pictureview(void); void display_edit_task(void); void display_edit_event(void); icaltimezone *get_default_icaltimezone(void); -void display_icaltimetype_as_webform(struct icaltimetype *, char *); +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); -void save_individual_event(icalcomponent *supplied_vtodo, long msgnum, char *from, int unread); +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(char *req); +void do_freebusy(const char *req); int ical_ctdl_is_overlap( struct icaltimetype t1start, struct icaltimetype t1end, @@ -796,15 +892,14 @@ void sleeeeeeeeeep(int); void http_transmit_thing(const char *content_type, int is_static); long unescape_input(char *buf); void do_selected_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 offer_languages(void); +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[]); @@ -813,7 +908,8 @@ void begin_tab(int tabnum, int num_tabs); void end_tab(int tabnum, int num_tabs); void str_wiki_index(char *s); int get_time_format_cached (void); -int xtoi(char *in, size_t len); +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); int fetch_http(char *url, char *target_buf, int maxbytes); @@ -838,7 +934,7 @@ 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); +int client_read_sslbuffer(StrBuf *buf, int timeout); void client_write_ssl(const StrBuf *Buf); #endif @@ -853,7 +949,7 @@ void utf8ify_rfc822_string(char *buf); void begin_burst(void); long end_burst(void); -extern char *hourname[]; /**< Names of hours (12am, 1am, etc.) */ +extern char *hourname[]; /* Names of hours (12am, 1am, etc.) */ void http_datestring(char *buf, size_t n, time_t xtime);