]> code.citadel.org Git - citadel.git/blob - webcit/preferences.c
* When editing another user's vCard, do a "transient goto" to their config
[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         lprintf(9, "entering load_preferences()\n");
38
39         serv_printf("GOTO %s", USERCONFIGROOM);
40         serv_gets(buf);
41         if (buf[0] != '2') return;
42         
43         serv_puts("MSGS ALL|0|1");
44         serv_gets(buf);
45         if (buf[0] == '8') {
46                 serv_puts("subj|__ WebCit Preferences __");
47                 serv_puts("000");
48         }
49         while (serv_gets(buf), strcmp(buf, "000")) {
50                 msgnum = atol(buf);
51         }
52
53         if (msgnum > 0L) {
54                 serv_printf("MSG0 %ld", msgnum);
55                 serv_gets(buf);
56                 if (buf[0] == '1') {
57                         while (serv_gets(buf),
58                                 (strcmp(buf, "text") && strcmp(buf, "000"))) {
59                         }
60                         if (!strcmp(buf, "text")) {
61                                 while (serv_gets(buf), strcmp(buf, "000")) {
62                                         if (WC->preferences == NULL) {
63                                                 WC->preferences = malloc(SIZ);
64                                                 strcpy(WC->preferences, "");
65                                         }
66                                         else {
67                                                 WC->preferences = realloc(
68                                                         WC->preferences,
69                                                         strlen(WC->preferences)
70                                                         +SIZ
71                                                 );
72                                         }
73                                         strcat(WC->preferences, buf);
74                                         strcat(WC->preferences, "\n");
75                                 }
76                         }
77                 }
78         }
79
80         /* Go back to the room we're supposed to be in */
81         serv_printf("GOTO %s", WC->wc_roomname);
82         serv_gets(buf);
83         lprintf(9, "exiting load_preferences()\n");
84 }
85
86 void save_preferences(void) {
87         char buf[SIZ];
88         long msgnum = 0L;
89
90         lprintf(9, "entering save_preferences()\n");
91         serv_printf("GOTO %s", USERCONFIGROOM);
92         serv_gets(buf);
93         if (buf[0] != '2') { /* try to create the config room if not there */
94                 serv_printf("CRE8 1|%s|4|0", USERCONFIGROOM);
95                 serv_gets(buf);
96                 serv_printf("GOTO %s", USERCONFIGROOM);
97                 serv_gets(buf);
98                 if (buf[0] != '2') return;      /* oh well. */
99         }
100
101         serv_puts("MSGS ALL|0|1");
102         serv_gets(buf);
103         if (buf[0] == '8') {
104                 serv_puts("subj|__ WebCit Preferences __");
105                 serv_puts("000");
106         }
107         while (serv_gets(buf), strcmp(buf, "000")) {
108                 msgnum = atol(buf);
109         }
110
111         if (msgnum > 0L) {
112                 serv_printf("DELE %ld", msgnum);
113                 serv_gets(buf);
114         }
115
116         serv_printf("ENT0 1||0|1|__ WebCit Preferences __|");
117         serv_gets(buf);
118         if (buf[0] == '4') {
119                 serv_puts(WC->preferences);
120                 serv_puts("");
121                 serv_puts("000");
122         }
123
124         /* Go back to the room we're supposed to be in */
125         serv_printf("GOTO %s", WC->wc_roomname);
126         serv_gets(buf);
127         lprintf(9, "exiting save_preferences()\n");
128 }
129
130 void get_preference(char *key, char *value) {
131         int num_prefs;
132         int i;
133         char buf[SIZ];
134         char thiskey[SIZ];
135
136         lprintf(9, "entering get_preference(%s)\n", key);
137         strcpy(value, "");
138
139         num_prefs = num_tokens(WC->preferences, '\n');
140         for (i=0; i<num_prefs; ++i) {
141                 extract_token(buf, WC->preferences, i, '\n');
142                 extract_token(thiskey, buf, 0, '|');
143                 if (!strcasecmp(thiskey, key)) {
144                         extract_token(value, buf, 1, '|');
145                 }
146         }
147         lprintf(9, "exiting get_preference() = %s\n", value);
148 }
149
150 void set_preference(char *key, char *value) {
151         int num_prefs;
152         int i;
153         char buf[SIZ];
154         char thiskey[SIZ];
155         char *newprefs = NULL;
156
157         lprintf(9, "entering set_preference(%s, %s)\n", key, value);
158         num_prefs = num_tokens(WC->preferences, '\n');
159         for (i=0; i<num_prefs; ++i) {
160                 extract_token(buf, WC->preferences, i, '\n');
161                 if (num_tokens(buf, '|') == 2) {
162                         extract_token(thiskey, buf, 0, '|');
163                         if (strcasecmp(thiskey, key)) {
164                                 if (newprefs == NULL) newprefs = strdup("");
165                                 newprefs = realloc(newprefs,
166                                         strlen(newprefs) + SIZ );
167                                 strcat(newprefs, buf);
168                                 strcat(newprefs, "\n");
169                         }
170                 }
171         }
172
173
174         if (newprefs == NULL) newprefs = strdup("");
175         newprefs = realloc(newprefs, strlen(newprefs) + SIZ);
176         sprintf(&newprefs[strlen(newprefs)], "%s|%s\n", key, value);
177
178         free(WC->preferences);
179         WC->preferences = newprefs;
180
181         save_preferences();
182         lprintf(9, "exiting set_preference()\n");
183 }