Rename is_wap to is_mobile
[citadel.git] / webcit / webcit.h
index 7dd9d277c3d0632e8cc84da84ffe304663f78f0e..21cf11f844c4bf2677f9b59450c9a52fd87bf481 100644 (file)
@@ -124,9 +124,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         734             /* This version of WebCit */
-#define MINIMUM_CIT_VERSION    730             /* min required Citadel ver */
-#define        LIBCITADEL_MIN          109             /* min required libcitadel ver */
+#define CLIENT_VERSION         737             /* This version of WebCit */
+#define MINIMUM_CIT_VERSION    737             /* min required Citadel ver */
+#define        LIBCITADEL_MIN          737             /* min required libcitadel ver */
 #define DEFAULT_HOST           "localhost"     /* Default Citadel server */
 #define DEFAULT_PORT           "504"
 #define LB                     (1)             /* Internal escape chars */
@@ -225,10 +225,11 @@ struct httprequest {
 /**
  * \brief      Linked list of session variables encoded in an x-www-urlencoded content type
  */
+typedef struct urlcontent urlcontent;
 struct urlcontent {
-       struct urlcontent *next;   /**< the next variable in the list */ 
        char url_key[32];          /**< the variable name */
        char *url_data;            /**< its value */
+       size_t url_data_size;      /**< how big is it? */
 };
 
 /**
@@ -251,6 +252,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? */
 };
 
 
@@ -283,13 +285,12 @@ struct roomlisting {
 /**
  * \brief Dynamic content for variable substitution in templates
  */
-struct wcsubst {
-       struct wcsubst *next;       /**< next item in the list */  
+typedef struct _wcsubst {
        int wcs_type;                       /**< which type of ??? */
        char wcs_key[32];                   /**< ??? what?*/
        void *wcs_value;                    /**< ???? what?*/
        void (*wcs_function)(void); /**< funcion hook ???*/
-};
+} wcsubst;
 
 /**
  * \brief Values for wcs_type
@@ -319,7 +320,7 @@ struct message_summary {
        long msgnum;            /**< the message number on the citadel server */
        char from[128];         /**< the author */
        char to[128];           /**< the recipient */
-       char subj[128];         /**< the title / subject */
+       char subj[256];         /**< the title / subject */
        int hasattachments;     /**< does it have atachments? */
        int is_new;         /**< is it yet read? */
 };
@@ -338,6 +339,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,19 +397,13 @@ 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 */
-       struct urlcontent *urlstrings;          /**< variables passed to webcit in a URL */
-       struct wcsubst *vars;                   /**< HTTP variable substitutions for this page */
+       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 */
@@ -458,6 +467,7 @@ extern int setup_wizard;
 extern char wizard_filename[];
 extern time_t if_modified_since;
 extern int follow_xff;
+extern HashList *HandlerHash;
 void do_setup_wizard(void);
 
 
@@ -475,7 +485,14 @@ void cookie_to_stuff(char *cookie, int *session,
 void locate_host(char *, int);
 void become_logged_in(char *, char *, char *);
 void do_login(void);
+void do_openid_login(void);
+void finalize_openid_login(void);
+void openid_manual_create(void);
 void display_login(char *mesg);
+void display_openid_login(char *mesg);
+void display_openids(void);
+void openid_attach(void);
+void openid_detach(void);
 void do_welcome(void);
 void do_logout(void);
 void display_main_menu(void);
@@ -501,7 +518,33 @@ void fmout(char *align);
 void pullquote_fmout(void);
 void wDumpContent(int);
 void serv_printf(const char *format,...);
-char *bstr(char *key);
+
+/* 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);
+
+#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);
+
+#define lbstr(a) LBstr(a, sizeof(a) - 1)
+long LBstr(char *key, size_t keylen);
+long LBSTR(char *key);
+
+#define ibstr(a) IBstr(a, sizeof(a) - 1)
+int IBstr(char *key, size_t keylen);
+int IBSTR(char *key);
+
+#define havebstr(a) HaveBstr(a, sizeof(a) - 1)
+int HaveBstr(char *key, size_t keylen);
+int HAVEBSTR(char *key);
+
+#define yesbstr(a) YesBstr(a, sizeof(a) - 1)
+int YesBstr(char *key, size_t keylen);
+int YESBSTR(char *key);
+
+
 void urlescputs(char *);
 void jsesc(char *, size_t, char *);
 void jsescputs(char *);
@@ -517,7 +560,7 @@ void display_mime_icon(void);
 void print_menu_box(char* Title, char *Class, int nLines, ...);
 long stresc(char *target, long tSize, char *strbuf, int nbsp, int nolinebreaks);
 void escputs(char *strbuf);
-void url(char *buf);
+void url(char *buf, size_t bufsize);
 void escputs1(char *strbuf, int nbsp, int nolinebreaks);
 void msgesc(char *target, size_t tlen, char *strbuf);
 void msgescputs(char *strbuf);
@@ -607,9 +650,22 @@ void chat_send(void);
 void http_redirect(char *);
 void clear_substs(struct wcsession *wc);
 void clear_local_substs(void);
-void svprintf(char *keyname, int keytype, const char *format,...);
-void svcallback(char *keyname, void (*fcn_ptr)() );
+
+
+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);
 char *memreadlinelen(char *start, char *buf, int maxlen, int *retlen);
@@ -654,10 +710,11 @@ 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 add_new_note(void);
 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);
@@ -699,6 +756,7 @@ 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);
@@ -731,7 +789,7 @@ 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 unescape_input(char *buf);
+long unescape_input(char *buf);
 void do_iconbar(void);
 void do_iconbar_roomlist(void);
 void do_selected_iconbar(void);
@@ -755,7 +813,9 @@ void display_wiki_page(void);
 int get_time_format_cached (void);
 int xtoi(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);
@@ -796,6 +856,15 @@ 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;
+       int IsAjax;
+} WebcitHandler;
+void WebcitAddUrlHandler(const char * UrlString, long UrlSLen, WebcitHandlerFunc F, int IsAjax);
+
+
+
 /* These should be empty, but we have them for testing */
 #define DEFAULT_HTTPAUTH_USER  ""
 #define DEFAULT_HTTPAUTH_PASS  ""