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