]> code.citadel.org Git - citadel.git/blob - webcit/vcard_edit.c
* Final polish for initial round of vCard editing functions. Only show "edit"
[citadel.git] / webcit / vcard_edit.c
1 /*
2  * vcard_edit.c
3  *
4  * Handles editing of vCard objects.
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 "vcard.h"
30
31
32
33 void edit_vcard(void) {
34         char buf[SIZ];
35         char *serialized_vcard = NULL;
36         size_t total_len = 0;
37         size_t bytes = 0;
38         size_t thisblock = 0;
39         struct vCard *v;
40         int i;
41         char *key, *value;
42         char whatuser[SIZ];
43
44         char lastname[SIZ];
45         char firstname[SIZ];
46         char middlename[SIZ];
47         char prefix[SIZ];
48         char suffix[SIZ];
49         char pobox[SIZ];
50         char extadr[SIZ];
51         char street[SIZ];
52         char city[SIZ];
53         char state[SIZ];
54         char zipcode[SIZ];
55         char country[SIZ];
56         char hometel[SIZ];
57         char worktel[SIZ];
58         char extrafields[SIZ];
59
60         lastname[0] = 0;
61         firstname[0] = 0;
62         middlename[0] = 0;
63         prefix[0] = 0;
64         suffix[0] = 0;
65         pobox[0] = 0;
66         extadr[0] = 0;
67         street[0] = 0;
68         city[0] = 0;
69         state[0] = 0;
70         zipcode[0] = 0;
71         country[0] = 0;
72         hometel[0] = 0;
73         worktel[0] = 0;
74         extrafields[0] = 0;
75
76         output_headers(1);
77
78         strcpy(whatuser, "");
79         sprintf(buf, "MSG0 %s|1", bstr("msgnum") );
80         serv_puts(buf);
81         serv_gets(buf);
82         if (buf[0] != '1') {
83                 wDumpContent(1);
84                 return;
85         }
86         while (serv_gets(buf), strcmp(buf, "000")) {
87                 if (!strncasecmp(buf, "from=", 5)) {
88                         strcpy(whatuser, &buf[5]);
89                 }
90                 else if (!strncasecmp(buf, "node=", 5)) {
91                         strcat(whatuser, " @ ");
92                         strcat(whatuser, &buf[5]);
93                 }
94         }
95
96         total_len = atoi(&buf[4]);
97
98
99         sprintf(buf, "OPNA %s|%s", bstr("msgnum"), bstr("partnum") );
100         serv_puts(buf);
101         serv_gets(buf);
102         if (buf[0] != '2') {
103                 wDumpContent(1);
104                 return;
105         }
106
107         total_len = atoi(&buf[4]);
108         serialized_vcard = malloc(total_len + 1);
109         while (bytes < total_len) {
110                 thisblock = 4000;
111                 if ((total_len - bytes) < thisblock) thisblock = total_len - bytes;
112                 sprintf(buf, "READ %d|%d", bytes, thisblock);
113                 serv_puts(buf);
114                 serv_gets(buf);
115                 if (buf[0] == '6') {
116                         thisblock = atoi(&buf[4]);
117                         serv_read(&serialized_vcard[bytes], thisblock);
118                         bytes += thisblock;
119                 }
120                 else {
121                         wprintf("Error: %s<BR>\n", &buf[4]);
122                 }
123         }
124
125         serv_puts("CLOS");
126         serv_gets(buf);
127         serialized_vcard[total_len + 1] = 0;
128
129         v = vcard_load(serialized_vcard);
130         free(serialized_vcard);
131
132         /* Populate the variables for our form */
133         i = 0;
134         while (key = vcard_get_prop(v, "", 0, i, 1), key != NULL) {
135                 value = vcard_get_prop(v, "", 0, i++, 0);
136
137                 if (!strcasecmp(key, "n")) {
138                         extract_token(lastname, value, 0, ';');
139                         extract_token(firstname, value, 1, ';');
140                         extract_token(middlename, value, 2, ';');
141                         extract_token(prefix, value, 3, ';');
142                         extract_token(suffix, value, 4, ';');
143                 }
144
145                 else if (!strcasecmp(key, "adr")) {
146                         extract_token(pobox, value, 0, ';');
147                         extract_token(extadr, value, 1, ';');
148                         extract_token(street, value, 2, ';');
149                         extract_token(city, value, 3, ';');
150                         extract_token(state, value, 4, ';');
151                         extract_token(zipcode, value, 5, ';');
152                         extract_token(country, value, 6, ';');
153                 }
154
155                 else if (!strcasecmp(key, "tel;home")) {
156                         extract_token(hometel, value, 0, ';');
157                 }
158
159                 else if (!strcasecmp(key, "tel;work")) {
160                         extract_token(worktel, value, 0, ';');
161                 }
162
163                 else {
164                         strcat(extrafields, key);
165                         strcat(extrafields, ":");
166                         strcat(extrafields, value);
167                         strcat(extrafields, "\n");
168                 }
169
170         }
171         
172         vcard_free(v);
173
174         /* Display the form */
175         wprintf("<FORM METHOD=\"POST\" ACTION=\"/submit_vcard\">\n");
176         wprintf("<H2><IMG VALIGN=CENTER SRC=\"/static/vcard.gif\">"
177                 "Contact information for ");
178         escputs(whatuser);
179         wprintf("</H2>\n");
180
181         wprintf("<TABLE border=0><TR>"
182                 "<TD>Prefix</TD>"
183                 "<TD>First</TD>"
184                 "<TD>Middle</TD>"
185                 "<TD>Last</TD>"
186                 "<TD>Suffix</TD></TR>\n");
187         wprintf("<TR><TD><INPUT TYPE=\"text\" NAME=\"prefix\" "
188                 "VALUE=\"%s\" MAXLENGTH=\"5\"></TD>",
189                 prefix);
190         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"firstname\" "
191                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD>",
192                 firstname);
193         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"middlename\" "
194                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD>",
195                 middlename);
196         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"lastname\" "
197                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD>",
198                 lastname);
199         wprintf("<TD><INPUT TYPE=\"text\" NAME=\"suffix\" "
200                 "VALUE=\"%s\" MAXLENGTH=\"10\"></TD></TR></TABLE>\n",
201                 suffix);
202
203         wprintf("<TABLE border=0><TR><TD>PO box (optional):</TD>"
204                 "<TD><INPUT TYPE=\"text\" NAME=\"pobox\" "
205                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD></TR>\n",
206                 pobox);
207         wprintf("<TR><TD>Address line 1:</TD>"
208                 "<TD><INPUT TYPE=\"text\" NAME=\"extadr\" "
209                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD></TR>\n",
210                 extadr);
211         wprintf("<TR><TD>Address line 2:</TD>"
212                 "<TD><INPUT TYPE=\"text\" NAME=\"street\" "
213                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD></TR>\n",
214                 street);
215         wprintf("<TR><TD>City:</TD>"
216                 "<TD><INPUT TYPE=\"text\" NAME=\"city\" "
217                 "VALUE=\"%s\" MAXLENGTH=\"29\">\n",
218                 city);
219         wprintf(" State: "
220                 "<INPUT TYPE=\"text\" NAME=\"state\" "
221                 "VALUE=\"%s\" MAXLENGTH=\"2\">\n",
222                 state);
223         wprintf(" ZIP code: "
224                 "<INPUT TYPE=\"text\" NAME=\"zipcode\" "
225                 "VALUE=\"%s\" MAXLENGTH=\"10\"></TD></TR>\n",
226                 zipcode);
227         wprintf("<TR><TD>Country:</TD>"
228                 "<TD><INPUT TYPE=\"text\" NAME=\"country\" "
229                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD></TR></TABLE>\n",
230                 country);
231
232         wprintf("<TABLE BORDER=0><TR><TD>Home telephone:</TD>"
233                 "<TD><INPUT TYPE=\"text\" NAME=\"hometel\" "
234                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD></TR>\n",
235                 hometel);
236         wprintf("<TR><TD>Work telephone:</TD>"
237                 "<TD><INPUT TYPE=\"text\" NAME=\"worktel\" "
238                 "VALUE=\"%s\" MAXLENGTH=\"29\"></TD></TR></TABLE>\n",
239                 worktel);
240
241         wprintf("<INPUT TYPE=\"hidden\" NAME=\"extrafields\" VALUE=\"");
242         escputs(extrafields);
243         wprintf("\">\n");
244
245         wprintf("<CENTER>\n");
246                 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"OK\">");
247                 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\">");
248                 wprintf("</CENTER></FORM>\n");
249
250          
251         wDumpContent(1);
252 }
253
254
255
256 void submit_vcard(void) {
257         char buf[SIZ];
258
259         if (strcmp(bstr("sc"), "OK")) { 
260                 readloop("readnew");
261                 return;
262         }
263
264         sprintf(buf, "ENT0 1|||4||");
265         fprintf(stderr, "%s\n", buf);
266         serv_puts(buf);
267         serv_gets(buf);
268         fprintf(stderr, "%s\n", buf);
269         if (buf[0] != '4') {
270                 edit_vcard();
271                 return;
272         }
273
274         serv_puts("Content-type: text/x-vcard");
275         serv_puts("");
276         serv_puts("begin:vcard");
277         serv_printf("n:%s;%s;%s;%s;%s",
278                 bstr("lastname"),
279                 bstr("firstname"),
280                 bstr("middlename"),
281                 bstr("prefix"),
282                 bstr("suffix") );
283         serv_printf("adr:%s;%s;%s;%s;%s;%s;%s",
284                 bstr("pobox"),
285                 bstr("extadr"),
286                 bstr("street"),
287                 bstr("city"),
288                 bstr("state"),
289                 bstr("zipcode"),
290                 bstr("country") );
291         serv_printf("tel;home:%s", bstr("hometel") );
292         serv_printf("tel;work:%s", bstr("worktel") );
293         serv_printf("%s", bstr("extrafields") );
294         serv_puts("end:vcard");
295         serv_puts("000");
296
297         readloop("readnew");
298 }