X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fpreferences.c;h=079fd6a7a8be2875c4417eb2881502bb72c58d89;hb=0f72e15a12dcc90e3dbfc01ff35c0e910a8d419e;hp=86c8cde9e605b4934df4941c934357c7f08b3ed1;hpb=7836de1a004d9353cadb71885e360715884d1601;p=citadel.git diff --git a/webcit/preferences.c b/webcit/preferences.c index 86c8cde9e..079fd6a7a 100644 --- a/webcit/preferences.c +++ b/webcit/preferences.c @@ -1,61 +1,47 @@ /* * $Id$ - * - * Manage user preferences with a little help from the Citadel server. + */ +/** + * \defgroup ManagePrefs Manage user preferences with a little help from the Citadel server. + * \ingroup CitadelConfig * */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +/*@{*/ #include "webcit.h" #include "webserver.h" +#include "groupdav.h" - +/** + * \brief display preferences dialog + */ void load_preferences(void) { char buf[SIZ]; long msgnum = 0L; serv_printf("GOTO %s", USERCONFIGROOM); - serv_gets(buf); + serv_getln(buf, sizeof buf); if (buf[0] != '2') return; serv_puts("MSGS ALL|0|1"); - serv_gets(buf); + serv_getln(buf, sizeof buf); if (buf[0] == '8') { serv_puts("subj|__ WebCit Preferences __"); serv_puts("000"); } - while (serv_gets(buf), strcmp(buf, "000")) { + while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { msgnum = atol(buf); } if (msgnum > 0L) { serv_printf("MSG0 %ld", msgnum); - serv_gets(buf); + serv_getln(buf, sizeof buf); if (buf[0] == '1') { - while (serv_gets(buf), + while (serv_getln(buf, sizeof buf), (strcmp(buf, "text") && strcmp(buf, "000"))) { } if (!strcmp(buf, "text")) { - while (serv_gets(buf), strcmp(buf, "000")) { + while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { if (WC->preferences == NULL) { WC->preferences = malloc(SIZ); strcpy(WC->preferences, ""); @@ -74,65 +60,73 @@ void load_preferences(void) { } } - /* Go back to the room we're supposed to be in */ + /** Go back to the room we're supposed to be in */ serv_printf("GOTO %s", WC->wc_roomname); - serv_gets(buf); + serv_getln(buf, sizeof buf); } -/* - * Goto the user's configuration room, creating it if necessary. - * Returns 0 on success or nonzero upon failure. +/** + * \brief Goto the user's configuration room, creating it if necessary. + * \return 0 on success or nonzero upon failure. */ int goto_config_room(void) { char buf[SIZ]; serv_printf("GOTO %s", USERCONFIGROOM); - serv_gets(buf); + serv_getln(buf, sizeof buf); if (buf[0] != '2') { /* try to create the config room if not there */ serv_printf("CRE8 1|%s|4|0", USERCONFIGROOM); - serv_gets(buf); + serv_getln(buf, sizeof buf); serv_printf("GOTO %s", USERCONFIGROOM); - serv_gets(buf); + serv_getln(buf, sizeof buf); if (buf[0] != '2') return(1); } return(0); } - +/** + * \brief save the modifications + */ void save_preferences(void) { char buf[SIZ]; long msgnum = 0L; if (goto_config_room() != 0) return; /* oh well. */ serv_puts("MSGS ALL|0|1"); - serv_gets(buf); + serv_getln(buf, sizeof buf); if (buf[0] == '8') { serv_puts("subj|__ WebCit Preferences __"); serv_puts("000"); } - while (serv_gets(buf), strcmp(buf, "000")) { + while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { msgnum = atol(buf); } if (msgnum > 0L) { serv_printf("DELE %ld", msgnum); - serv_gets(buf); + serv_getln(buf, sizeof buf); } serv_printf("ENT0 1||0|1|__ WebCit Preferences __|"); - serv_gets(buf); + serv_getln(buf, sizeof buf); if (buf[0] == '4') { serv_puts(WC->preferences); serv_puts(""); serv_puts("000"); } - /* Go back to the room we're supposed to be in */ + /** Go back to the room we're supposed to be in */ serv_printf("GOTO %s", WC->wc_roomname); - serv_gets(buf); + serv_getln(buf, sizeof buf); } -void get_preference(char *key, char *value) { +/** + * \brief query the actual setting of key in the citadel database + * \param key config key to query + * \param value value to the key to get + * \param value_len length of the value string + */ +void get_preference(char *key, char *value, size_t value_len) { int num_prefs; int i; char buf[SIZ]; @@ -142,43 +136,300 @@ void get_preference(char *key, char *value) { num_prefs = num_tokens(WC->preferences, '\n'); for (i=0; ipreferences, i, '\n'); - extract_token(thiskey, buf, 0, '|'); + extract_token(buf, WC->preferences, i, '\n', sizeof buf); + extract_token(thiskey, buf, 0, '|', sizeof thiskey); if (!strcasecmp(thiskey, key)) { - extract_token(value, buf, 1, '|'); + extract_token(value, buf, 1, '|', value_len); } } } -void set_preference(char *key, char *value) { +/** + * \brief Write a key into the webcit preferences database for this user + * + * \params key key whichs value is to be modified + * \param value value to set + * \param save_to_server 1 = flush all data to the server, 0 = cache it for now + */ +void set_preference(char *key, char *value, int save_to_server) { int num_prefs; int i; char buf[SIZ]; char thiskey[SIZ]; char *newprefs = NULL; + size_t newprefs_len = 0; + + newprefs_len = strlen(key) + strlen(value) + 10; + if (WC->preferences != NULL) newprefs_len += strlen(WC->preferences); + newprefs = malloc(newprefs_len); + if (newprefs == NULL) return; + strcpy(newprefs, ""); num_prefs = num_tokens(WC->preferences, '\n'); for (i=0; ipreferences, i, '\n'); + extract_token(buf, WC->preferences, i, '\n', sizeof buf); if (num_tokens(buf, '|') == 2) { - extract_token(thiskey, buf, 0, '|'); + extract_token(thiskey, buf, 0, '|', sizeof thiskey); if (strcasecmp(thiskey, key)) { - if (newprefs == NULL) newprefs = strdup(""); - newprefs = realloc(newprefs, - strlen(newprefs) + SIZ ); strcat(newprefs, buf); strcat(newprefs, "\n"); } } } - - if (newprefs == NULL) newprefs = strdup(""); - newprefs = realloc(newprefs, strlen(newprefs) + SIZ); sprintf(&newprefs[strlen(newprefs)], "%s|%s\n", key, value); - free(WC->preferences); WC->preferences = newprefs; - save_preferences(); + if (save_to_server) save_preferences(); } + + + + +/** + * \brief display form for changing your preferences and settings + */ +void display_preferences(void) +{ + output_headers(1, 1, 2, 0, 0, 0); + char ebuf[300]; + char buf[256]; + char calhourformat[16]; + int i; + + wprintf("
\n"); + wprintf(""); + wprintf("

"); + wprintf(_("Preferences and settings")); + wprintf("

"); + wprintf("
  • "); + offer_start_page(); + wprintf("
\n"); + wprintf("
\n"); + + wprintf("
\n"); + + wprintf("
" + "
\n"); + + /** begin form */ + wprintf("
\n" + "
\n" + "\n"); + wprintf("\n", WC->nonce); + + /** + * Room list view + */ + get_preference("roomlistview", buf, sizeof buf); + wprintf("\n"); + + /** + * Calendar hour format + */ + get_preference("calhourformat", calhourformat, sizeof calhourformat); + if (calhourformat[0] == 0) strcpy(calhourformat, "12"); + wprintf("\n"); + + /** + * Calendar day view -- day start time + */ + get_preference("daystart", buf, sizeof buf); + if (buf[0] == 0) strcpy(buf, "8"); + wprintf("\n"); + + /** + * Calendar day view -- day end time + */ + get_preference("dayend", buf, sizeof buf); + if (buf[0] == 0) strcpy(buf, "17"); + wprintf("\n"); + + /** + * Signature + */ + get_preference("use_sig", buf, sizeof buf); + if (buf[0] == 0) strcpy(buf, "no"); + wprintf("\n"); + + wprintf(" " + ); + + /** Character set to assume is in use for improperly encoded headers */ + get_preference("default_header_charset", buf, sizeof buf); + if (buf[0] == 0) strcpy(buf, "UTF-8"); + wprintf(""); + + /** submit buttons */ + wprintf("
"); + wprintf(_("Room list view")); + wprintf(""); + + wprintf(""); + wprintf(_("Tree (folders) view")); + wprintf("
\n"); + + wprintf(""); + wprintf(_("Table (rooms) view")); + wprintf("
\n"); + + wprintf("
"); + wprintf(_("Calendar hour format")); + wprintf(""); + + wprintf(""); + wprintf(_("12 hour (am/pm)")); + wprintf("
\n"); + + wprintf(""); + wprintf(_("24 hour")); + wprintf("
\n"); + + wprintf("
"); + wprintf(_("Calendar day view begins at:")); + wprintf(""); + + wprintf("\n"); + wprintf("
"); + wprintf(_("Calendar day view ends at:")); + wprintf(""); + + wprintf("\n"); + wprintf("
"); + wprintf(_("Attach signature to email messages?")); + wprintf(""); + + wprintf(" " + ); + + wprintf(""); + wprintf(_("No signature")); + wprintf("
\n"); + + wprintf(""); + wprintf(_("Use this signature:")); + wprintf("
" + "
" + "
" + ); + + wprintf("
\n"); + + wprintf("
"); + wprintf(_("Default character set for email headers:")); + wprintf(""); + wprintf(""); + wprintf("
\n" + "" + " " + "\n", + _("Change"), + _("Cancel") + ); + + /** end form */ + wprintf("
\n"); + wprintf("
\n"); + wDumpContent(1); +} + +/** + * \brief Commit new preferences and settings + */ +void set_preferences(void) +{ + char ebuf[300]; + + if (IsEmptyStr(bstr("change_button"))) { + safestrncpy(WC->ImportantMessage, + _("Cancelled. No settings were changed."), + sizeof WC->ImportantMessage); + display_main_menu(); + return; + } + + /** + * Set the last argument to 1 only for the final setting, so + * we don't send the prefs file to the server repeatedly + */ + set_preference("roomlistview", bstr("roomlistview"), 0); + set_preference("calhourformat", bstr("calhourformat"), 0); + set_preference("use_sig", bstr("use_sig"), 0); + set_preference("daystart", bstr("daystart"), 0); + set_preference("dayend", bstr("dayend"), 0); + set_preference("default_header_charset", bstr("default_header_charset"), 0); + + euid_escapize(ebuf, bstr("signature")); + set_preference("signature", ebuf, 1); + + display_main_menu(); +} + + +/*@}*/