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