4 * Manage user preferences with a little help from the Citadel server.
14 #include <sys/types.h>
16 #include <sys/socket.h>
19 #include <netinet/in.h>
28 #include "webserver.h"
32 void load_preferences(void) {
36 serv_printf("GOTO %s", USERCONFIGROOM);
38 if (buf[0] != '2') return;
40 serv_puts("MSGS ALL|0|1");
43 serv_puts("subj|__ WebCit Preferences __");
46 while (serv_gets(buf), strcmp(buf, "000")) {
51 serv_printf("MSG0 %ld", msgnum);
54 while (serv_gets(buf),
55 (strcmp(buf, "text") && strcmp(buf, "000"))) {
57 if (!strcmp(buf, "text")) {
58 while (serv_gets(buf), strcmp(buf, "000")) {
59 if (WC->preferences == NULL) {
60 WC->preferences = malloc(SIZ);
61 strcpy(WC->preferences, "");
64 WC->preferences = realloc(
66 strlen(WC->preferences)
70 strcat(WC->preferences, buf);
71 strcat(WC->preferences, "\n");
77 /* Go back to the room we're supposed to be in */
78 serv_printf("GOTO %s", WC->wc_roomname);
83 * Goto the user's configuration room, creating it if necessary.
84 * Returns 0 on success or nonzero upon failure.
86 int goto_config_room(void) {
89 serv_printf("GOTO %s", USERCONFIGROOM);
91 if (buf[0] != '2') { /* try to create the config room if not there */
92 serv_printf("CRE8 1|%s|4|0", USERCONFIGROOM);
94 serv_printf("GOTO %s", USERCONFIGROOM);
96 if (buf[0] != '2') return(1);
102 void save_preferences(void) {
106 if (goto_config_room() != 0) return; /* oh well. */
107 serv_puts("MSGS ALL|0|1");
110 serv_puts("subj|__ WebCit Preferences __");
113 while (serv_gets(buf), strcmp(buf, "000")) {
118 serv_printf("DELE %ld", msgnum);
122 serv_printf("ENT0 1||0|1|__ WebCit Preferences __|");
125 serv_puts(WC->preferences);
130 /* Go back to the room we're supposed to be in */
131 serv_printf("GOTO %s", WC->wc_roomname);
135 void get_preference(char *key, char *value) {
143 num_prefs = num_tokens(WC->preferences, '\n');
144 for (i=0; i<num_prefs; ++i) {
145 extract_token(buf, WC->preferences, i, '\n');
146 extract_token(thiskey, buf, 0, '|');
147 if (!strcasecmp(thiskey, key)) {
148 extract_token(value, buf, 1, '|');
153 void set_preference(char *key, char *value) {
158 char *newprefs = NULL;
160 num_prefs = num_tokens(WC->preferences, '\n');
161 for (i=0; i<num_prefs; ++i) {
162 extract_token(buf, WC->preferences, i, '\n');
163 if (num_tokens(buf, '|') == 2) {
164 extract_token(thiskey, buf, 0, '|');
165 if (strcasecmp(thiskey, key)) {
166 if (newprefs == NULL) newprefs = strdup("");
167 newprefs = realloc(newprefs,
168 strlen(newprefs) + SIZ );
169 strcat(newprefs, buf);
170 strcat(newprefs, "\n");
176 if (newprefs == NULL) newprefs = strdup("");
177 newprefs = realloc(newprefs, strlen(newprefs) + SIZ);
178 sprintf(&newprefs[strlen(newprefs)], "%s|%s\n", key, value);
180 free(WC->preferences);
181 WC->preferences = newprefs;