* Replaced serv_gets() with serv_getln() - which now requires the caller
[citadel.git] / webcit / preferences.c
1 /*
2  * $Id$
3  *
4  * Manage user preferences with a little help from the Citadel server.
5  *
6  */
7
8 #include <ctype.h>
9 #include <stdlib.h>
10 #include <unistd.h>
11 #include <stdio.h>
12 #include <fcntl.h>
13 #include <signal.h>
14 #include <sys/types.h>
15 #include <sys/wait.h>
16 #include <sys/socket.h>
17 #include <sys/time.h>
18 #include <limits.h>
19 #include <netinet/in.h>
20 #include <netdb.h>
21 #include <string.h>
22 #include <pwd.h>
23 #include <errno.h>
24 #include <stdarg.h>
25 #include <pthread.h>
26 #include <signal.h>
27 #include "webcit.h"
28 #include "webserver.h"
29
30
31
32 void load_preferences(void) {
33         char buf[SIZ];
34         long msgnum = 0L;
35
36         serv_printf("GOTO %s", USERCONFIGROOM);
37         serv_getln(buf, sizeof buf);
38         if (buf[0] != '2') return;
39         
40         serv_puts("MSGS ALL|0|1");
41         serv_getln(buf, sizeof buf);
42         if (buf[0] == '8') {
43                 serv_puts("subj|__ WebCit Preferences __");
44                 serv_puts("000");
45         }
46         while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
47                 msgnum = atol(buf);
48         }
49
50         if (msgnum > 0L) {
51                 serv_printf("MSG0 %ld", msgnum);
52                 serv_getln(buf, sizeof buf);
53                 if (buf[0] == '1') {
54                         while (serv_getln(buf, sizeof buf),
55                                 (strcmp(buf, "text") && strcmp(buf, "000"))) {
56                         }
57                         if (!strcmp(buf, "text")) {
58                                 while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
59                                         if (WC->preferences == NULL) {
60                                                 WC->preferences = malloc(SIZ);
61                                                 strcpy(WC->preferences, "");
62                                         }
63                                         else {
64                                                 WC->preferences = realloc(
65                                                         WC->preferences,
66                                                         strlen(WC->preferences)
67                                                         +SIZ
68                                                 );
69                                         }
70                                         strcat(WC->preferences, buf);
71                                         strcat(WC->preferences, "\n");
72                                 }
73                         }
74                 }
75         }
76
77         /* Go back to the room we're supposed to be in */
78         serv_printf("GOTO %s", WC->wc_roomname);
79         serv_getln(buf, sizeof buf);
80 }
81
82 /*
83  * Goto the user's configuration room, creating it if necessary.
84  * Returns 0 on success or nonzero upon failure.
85  */
86 int goto_config_room(void) {
87         char buf[SIZ];
88
89         serv_printf("GOTO %s", USERCONFIGROOM);
90         serv_getln(buf, sizeof buf);
91         if (buf[0] != '2') { /* try to create the config room if not there */
92                 serv_printf("CRE8 1|%s|4|0", USERCONFIGROOM);
93                 serv_getln(buf, sizeof buf);
94                 serv_printf("GOTO %s", USERCONFIGROOM);
95                 serv_getln(buf, sizeof buf);
96                 if (buf[0] != '2') return(1);
97         }
98         return(0);
99 }
100
101
102 void save_preferences(void) {
103         char buf[SIZ];
104         long msgnum = 0L;
105
106         if (goto_config_room() != 0) return;    /* oh well. */
107         serv_puts("MSGS ALL|0|1");
108         serv_getln(buf, sizeof buf);
109         if (buf[0] == '8') {
110                 serv_puts("subj|__ WebCit Preferences __");
111                 serv_puts("000");
112         }
113         while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
114                 msgnum = atol(buf);
115         }
116
117         if (msgnum > 0L) {
118                 serv_printf("DELE %ld", msgnum);
119                 serv_getln(buf, sizeof buf);
120         }
121
122         serv_printf("ENT0 1||0|1|__ WebCit Preferences __|");
123         serv_getln(buf, sizeof buf);
124         if (buf[0] == '4') {
125                 serv_puts(WC->preferences);
126                 serv_puts("");
127                 serv_puts("000");
128         }
129
130         /* Go back to the room we're supposed to be in */
131         serv_printf("GOTO %s", WC->wc_roomname);
132         serv_getln(buf, sizeof buf);
133 }
134
135 void get_preference(char *key, char *value, size_t value_len) {
136         int num_prefs;
137         int i;
138         char buf[SIZ];
139         char thiskey[SIZ];
140
141         strcpy(value, "");
142
143         num_prefs = num_tokens(WC->preferences, '\n');
144         for (i=0; i<num_prefs; ++i) {
145                 extract_token(buf, WC->preferences, i, '\n', sizeof buf);
146                 extract_token(thiskey, buf, 0, '|', sizeof thiskey);
147                 if (!strcasecmp(thiskey, key)) {
148                         extract_token(value, buf, 1, '|', value_len);
149                 }
150         }
151 }
152
153 void set_preference(char *key, char *value) {
154         int num_prefs;
155         int i;
156         char buf[SIZ];
157         char thiskey[SIZ];
158         char *newprefs = NULL;
159
160         num_prefs = num_tokens(WC->preferences, '\n');
161         for (i=0; i<num_prefs; ++i) {
162                 extract_token(buf, WC->preferences, i, '\n', sizeof buf);
163                 if (num_tokens(buf, '|') == 2) {
164                         extract_token(thiskey, buf, 0, '|', sizeof thiskey);
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");
171                         }
172                 }
173         }
174
175
176         if (newprefs == NULL) newprefs = strdup("");
177         newprefs = realloc(newprefs, strlen(newprefs) + SIZ);
178         sprintf(&newprefs[strlen(newprefs)], "%s|%s\n", key, value);
179
180         free(WC->preferences);
181         WC->preferences = newprefs;
182
183         save_preferences();
184 }