* add more module handlers:
[citadel.git] / webcit / webcit.h
index 5b2aa23ce95835f6d7640685a0332c8cff44b162..1efdeec091589fb36e8cb1f3a598f78508486306 100644 (file)
 #define PORT_NUM               2000            /* port number to listen on */
 #define DEVELOPER_ID           0
 #define CLIENT_ID              4
-#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 CLIENT_VERSION         760             /* This version of WebCit */
+#define MINIMUM_CIT_VERSION    744             /* min required Citadel ver */
+#define        LIBCITADEL_MIN          744             /* min required libcitadel ver */
 #define DEFAULT_HOST           "localhost"     /* Default Citadel server */
 #define DEFAULT_PORT           "504"
 #define TARGET                 "webcit01"      /* Target for inline URL's */
@@ -214,7 +214,7 @@ struct urlcontent {
 /*
  * \brief information about us ???
  */ 
-struct serv_info {
+typedef struct _serv_info {
        int serv_pid;                   /* Process ID of the Citadel server */
        StrBuf *serv_nodename;          /* Node name of the Citadel server */
        StrBuf *serv_humannode;         /* human readable node name of the Citadel server */
@@ -232,7 +232,7 @@ struct serv_info {
        int serv_fulltext_enabled;      /* Does the server have the full text index enabled? */
        StrBuf *serv_svn_revision;      /* SVN revision of the server */
        int serv_supports_openid;       /* Does the server support authentication via OpenID? */
-};
+} ServInfo;
 
 
 
@@ -290,9 +290,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
@@ -340,19 +346,25 @@ struct wcsession {
 /* Session local Members */
        int http_sock;                          /**< HTTP server socket */
        int serv_sock;                          /**< Client socket to Citadel server */
+       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 */
 /* 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*/
        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 */
+       HashList *headers;                      /**< the headers the client sent us */
        StrBuf *http_host;                      /**< HTTP Host: header */
        int is_ajax;                            /** < are we doing an ajax request? */
        int gzip_ok;                            /**< Nonzero if Accept-encoding: gzip */
@@ -360,6 +372,7 @@ struct wcsession {
 
        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 */
@@ -376,7 +389,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 */
@@ -488,7 +501,6 @@ extern char file_crpt_file_csr[PATH_MAX];
 extern char file_crpt_file_cer[PATH_MAX];
 #endif
 
-struct serv_info serv_info;
 extern char floorlist[128][SIZ];
 extern char *axdefs[];
 extern char *ctdlhost, *ctdlport;
@@ -499,10 +511,6 @@ 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);
@@ -526,7 +534,8 @@ void display_main_menu(void);
 void display_aide_menu(void);
 void display_advanced_menu(void);
 void slrp_highest(void);
-void get_serv_info(StrBuf *, char *);
+ServInfo *get_serv_info(StrBuf *, char *);
+void DeleteServInfo(ServInfo **FreeMe);
 int uds_connectsock(char *);
 int tcp_connectsock(char *, char *);
 int serv_getln(char *strbuf, int bufsize);
@@ -565,7 +574,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);
@@ -576,15 +585,13 @@ void escputs1(const char *strbuf, int nbsp, int nolinebreaks);
 void msgesc(char *target, size_t tlen, char *strbuf);
 void msgescputs(char *strbuf);
 void msgescputs1(char *strbuf);
-void stripout(char *str, char leftboundary, char rightboundary);
 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);
@@ -602,20 +609,21 @@ void confirm_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(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 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(StrBuf *ReqLine, 
+                 StrBuf *ReqType, 
+                 StrBuf *ReadBuf, 
+                 const char **Pos);
 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);
@@ -631,13 +639,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);
@@ -646,7 +657,7 @@ 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);
@@ -698,11 +709,13 @@ 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);
@@ -720,7 +733,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);
@@ -765,6 +783,7 @@ extern char *hourname[];    /* Names of hours (12am, 1am, etc.) */
 
 void http_datestring(char *buf, size_t n, time_t xtime);
 
+typedef void (*IcalCallbackFunc)(icalcomponent *, long, char*, int, struct calview *);
 
 typedef void (*WebcitHandlerFunc)(void);
 typedef struct  _WebcitHandler{