]> code.citadel.org Git - citadel.git/blob - webcit/preferences.c
* Preferences framework
[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
30
31
32 void load_preferences(void) {
33         char buf[SIZ];
34         long msgnum = 0L;
35
36         serv_printf("GOTO My Citadel Config");
37         serv_gets(buf);
38         if (buf[0] != '2') return;
39         
40         serv_puts("MSGS ALL|0|1");
41         serv_gets(buf);
42         if (buf[0] == '8') {
43                 serv_puts("subj|__ WebCit Preferences __");
44                 serv_puts("000");
45         }
46         while (serv_gets(buf), strcmp(buf, "000")) {
47                 msgnum = atol(buf);
48         }
49
50         if (msgnum > 0L) {
51                 serv_printf("MSG0 %ld", msgnum);
52                 serv_gets(buf);
53                 if (buf[0] == '1') {
54                         while (serv_gets(buf),
55                                 (strcmp(buf, "text") && strcmp(buf, "000"))) {
56                         }
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, "");
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_gets(buf);
80 }
81
82 void save_preferences(void) {
83         char buf[SIZ];
84         long msgnum = 0L;
85
86         serv_printf("GOTO My Citadel Config");
87         serv_gets(buf);
88         if (buf[0] != '2') { /* try to create the config room if not there */
89                 serv_printf("CRE8 1|My Citadel Config|4|0");
90                 serv_gets(buf);
91                 serv_printf("GOTO My Citadel Config");
92                 serv_gets(buf);
93                 if (buf[0] != '2') return;      /* oh well. */
94         }
95
96         serv_puts("MSGS ALL|0|1");
97         serv_gets(buf);
98         if (buf[0] == '8') {
99                 serv_puts("subj|__ WebCit Preferences __");
100                 serv_puts("000");
101         }
102         while (serv_gets(buf), strcmp(buf, "000")) {
103                 msgnum = atol(buf);
104         }
105
106         if (msgnum > 0L) {
107                 serv_printf("DELE %ld", msgnum);
108                 serv_gets(buf);
109         }
110
111         serv_printf("ENT0 1||0|1|__ WebCit Preferences __|");
112         serv_gets(buf);
113         if (buf[0] == '4') {
114                 serv_puts(WC->preferences);
115                 serv_puts("");
116                 serv_puts("000");
117         }
118
119         /* Go back to the room we're supposed to be in */
120         serv_printf("GOTO %s", WC->wc_roomname);
121         serv_gets(buf);
122 }
123
124 void get_preference(char *key, char *value) {
125         int num_prefs;
126         int i;
127         char buf[SIZ];
128         char thiskey[SIZ];
129
130         strcpy(value, "");
131
132         num_prefs = num_tokens(WC->preferences, '\n');
133         for (i=0; i<num_prefs; ++i) {
134                 extract_token(buf, WC->preferences, i, '\n');
135                 extract_token(thiskey, buf, 0, '|');
136                 if (!strcasecmp(thiskey, key)) {
137                         extract_token(value, buf, 1, '|');
138                 }
139         }
140 }
141
142 void set_preference(char *key, char *value) {
143         int num_prefs;
144         int i;
145         char buf[SIZ];
146         char thiskey[SIZ];
147         char *newprefs = NULL;
148
149         num_prefs = num_tokens(WC->preferences, '\n');
150         for (i=0; i<num_prefs; ++i) {
151                 extract_token(buf, WC->preferences, i, '\n');
152                 extract_token(thiskey, buf, 0, '|');
153                 if (strcasecmp(thiskey, key)) {
154                         if (newprefs == NULL) newprefs = strdup("");
155                         else {
156                                 newprefs = realloc(newprefs,
157                                                 strlen(newprefs) + SIZ );
158                         }
159                         strcat(newprefs, buf);
160                         strcat(newprefs, "\n");
161                 }
162         }
163
164
165         if (newprefs == NULL) newprefs = strdup("");
166         else {
167                 newprefs = realloc(newprefs,
168                                 strlen(newprefs) + SIZ );
169         }
170         sprintf(&newprefs[strlen(newprefs)], "%s|%s\n", key, value);
171
172         save_preferences();
173 }