4 * Manage user preferences with a little help from the Citadel server.
15 #include <sys/types.h>
17 #include <sys/socket.h>
20 #include <netinet/in.h>
29 #include "webserver.h"
33 void load_preferences(void) {
37 serv_printf("GOTO %s", USERCONFIGROOM);
39 if (buf[0] != '2') return;
41 serv_puts("MSGS ALL|0|1");
44 serv_puts("subj|__ WebCit Preferences __");
47 while (serv_gets(buf), strcmp(buf, "000")) {
52 serv_printf("MSG0 %ld", msgnum);
55 while (serv_gets(buf),
56 (strcmp(buf, "text") && strcmp(buf, "000"))) {
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, "");
65 WC->preferences = realloc(
67 strlen(WC->preferences)
71 strcat(WC->preferences, buf);
72 strcat(WC->preferences, "\n");
78 /* Go back to the room we're supposed to be in */
79 serv_printf("GOTO %s", WC->wc_roomname);
84 * Goto the user's configuration room, creating it if necessary.
85 * Returns 0 on success or nonzero upon failure.
87 int goto_config_room(void) {
90 serv_printf("GOTO %s", USERCONFIGROOM);
92 if (buf[0] != '2') { /* try to create the config room if not there */
93 serv_printf("CRE8 1|%s|4|0", USERCONFIGROOM);
95 serv_printf("GOTO %s", USERCONFIGROOM);
97 if (buf[0] != '2') return(1);
103 void save_preferences(void) {
107 if (goto_config_room() != 0) return; /* oh well. */
108 serv_puts("MSGS ALL|0|1");
111 serv_puts("subj|__ WebCit Preferences __");
114 while (serv_gets(buf), strcmp(buf, "000")) {
119 serv_printf("DELE %ld", msgnum);
123 serv_printf("ENT0 1||0|1|__ WebCit Preferences __|");
126 serv_puts(WC->preferences);
131 /* Go back to the room we're supposed to be in */
132 serv_printf("GOTO %s", WC->wc_roomname);
136 void get_preference(char *key, char *value) {
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, '|');
154 void set_preference(char *key, char *value) {
159 char *newprefs = NULL;
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");
177 if (newprefs == NULL) newprefs = strdup("");
178 newprefs = realloc(newprefs, strlen(newprefs) + SIZ);
179 sprintf(&newprefs[strlen(newprefs)], "%s|%s\n", key, value);
181 free(WC->preferences);
182 WC->preferences = newprefs;