* Removed the "convert_to_html" option from text_to_server() because we no
[citadel.git] / webcit / serv_func.c
1 /*
2  * $Id$
3  */
4 /**
5  * \defgroup ServFuncs Handles various types of data transfer operations with the Citadel service.
6  * \ingroup CitadelCommunitacion
7  */
8
9 /*@{*/ 
10 #include "webcit.h"
11 #include "webserver.h"
12
13 struct serv_info serv_info; /**< our connection data to the server */
14
15 /**
16  * \brief get info about the server we've connected to
17  * \param browser_host the citadell we want to connect to
18  * \param user_agent which browser uses our client?
19  */
20 void get_serv_info(char *browser_host, char *user_agent)
21 {
22         char buf[SIZ];
23         int a;
24
25         /** Tell the server what kind of client is connecting */
26         serv_printf("IDEN %d|%d|%d|%s|%s",
27                 DEVELOPER_ID,
28                 CLIENT_ID,
29                 CLIENT_VERSION,
30                 user_agent,
31                 browser_host
32         );
33         serv_getln(buf, sizeof buf);
34
35         /** Tell the server what kind of richtext we prefer */
36         serv_puts("MSGP text/html|text/plain");
37         serv_getln(buf, sizeof buf);
38
39 #ifdef WEBCIT_WITH_CALENDAR_SERVICE
40         /**
41          * Tell the server that when we save a calendar event, we
42          * want invitations to be generated by the Citadel server
43          * instead of by the client.
44          */
45         serv_puts("ICAL sgi|1");
46         serv_getln(buf, sizeof buf);
47 #endif
48
49         /** Now ask the server to tell us a little bit about itself... */
50         serv_puts("INFO");
51         serv_getln(buf, sizeof buf);
52         if (buf[0] != '1')
53                 return;
54
55         a = 0;
56         while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
57                 switch (a) {
58                 case 0:
59                         serv_info.serv_pid = atoi(buf);
60                         WC->ctdl_pid = serv_info.serv_pid;
61                         break;
62                 case 1:
63                         safestrncpy(serv_info.serv_nodename, buf, sizeof serv_info.serv_nodename);
64                         break;
65                 case 2:
66                         safestrncpy(serv_info.serv_humannode, buf, sizeof serv_info.serv_humannode);
67                         break;
68                 case 3:
69                         safestrncpy(serv_info.serv_fqdn, buf, sizeof serv_info.serv_fqdn);
70                         break;
71                 case 4:
72                         safestrncpy(serv_info.serv_software, buf, sizeof serv_info.serv_software);
73                         break;
74                 case 5:
75                         serv_info.serv_rev_level = atoi(buf);
76                         break;
77                 case 6:
78                         safestrncpy(serv_info.serv_bbs_city, buf, sizeof serv_info.serv_bbs_city);
79                         break;
80                 case 7:
81                         safestrncpy(serv_info.serv_sysadm, buf, sizeof serv_info.serv_sysadm);
82                         break;
83                 case 9:
84                         safestrncpy(serv_info.serv_moreprompt, buf, sizeof serv_info.serv_moreprompt);
85                         break;
86                 case 14:
87                         serv_info.serv_supports_ldap = atoi(buf);
88                         break;
89                 }
90                 ++a;
91         }
92 }
93
94
95
96 /**
97  * \brief Read Citadel variformat text and spit it out as HTML.
98  * \param align html align string
99  */
100 void fmout(char *align)
101 {
102         int intext = 0;
103         int bq = 0;
104         char buf[SIZ];
105
106         wprintf("<div align=%s>\n", align);
107         while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
108
109                 if ((intext == 1) && (isspace(buf[0]))) {
110                         wprintf("<br />");
111                 }
112                 intext = 1;
113
114                 /**
115                  * Quoted text should be displayed in italics and in a
116                  * different colour.  This code understands Citadel-style
117                  * " >" quotes and will convert to <BLOCKQUOTE> tags.
118                  */
119                 if ((bq == 0) && (!strncmp(buf, " >", 2))) {
120                         wprintf("<BLOCKQUOTE>");
121                         bq = 1;
122                 } else if ((bq == 1) && (strncmp(buf, " >", 2))) {
123                         wprintf("</BLOCKQUOTE>");
124                         bq = 0;
125                 }
126                 if ((bq == 1) && (!strncmp(buf, " >", 2))) {
127                         strcpy(buf, &buf[2]);
128                 }
129                 /** Activate embedded URL's */
130                 url(buf);
131
132                 escputs(buf);
133                 wprintf("\n");
134         }
135         if (bq == 1) {
136                 wprintf("</I>");
137         }
138         wprintf("</div><br />\n");
139 }
140
141
142
143
144 /**
145  * \brief Read Citadel variformat text and spit it out as HTML in a form
146  * suitable for embedding in another message (forward/quote).
147  * (NO LINEBREAKS ALLOWED HERE!)
148  */
149 void pullquote_fmout(void) {
150         int intext = 0;
151         int bq = 0;
152         char buf[SIZ];
153
154         while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
155
156                 if ((intext == 1) && (isspace(buf[0]))) {
157                         wprintf("<br />");
158                 }
159                 intext = 1;
160
161                 /**
162                  * Quoted text should be displayed in italics and in a
163                  * different colour.  This code understands Citadel-style
164                  * " >" quotes and will convert to <BLOCKQUOTE> tags.
165                  */
166                 if ((bq == 0) && (!strncmp(buf, " >", 2))) {
167                         wprintf("<BLOCKQUOTE>");
168                         bq = 1;
169                 } else if ((bq == 1) && (strncmp(buf, " >", 2))) {
170                         wprintf("</BLOCKQUOTE>");
171                         bq = 0;
172                 }
173                 if ((bq == 1) && (!strncmp(buf, " >", 2))) {
174                         strcpy(buf, &buf[2]);
175                 }
176
177                 msgescputs(buf);
178         }
179         if (bq == 1) {
180                 wprintf("</I>");
181         }
182 }
183
184
185
186
187 /**
188  * \brief Transmit message text (in memory) to the server.
189  *
190  * \param ptr Pointer to the message being transmitted
191  */
192 void text_to_server(char *ptr)
193 {
194         char buf[256];
195         int ch, a, pos;
196
197         pos = 0;
198         buf[0] = 0;
199
200         while (ptr[pos] != 0) {
201                 ch = ptr[pos++];
202                 if (ch == 10) {
203                         while ( (isspace(buf[strlen(buf) - 1]))
204                           && (strlen(buf) > 1) )
205                                 buf[strlen(buf) - 1] = 0;
206                         serv_puts(buf);
207                         buf[0] = 0;
208                         if (ptr[pos] != 0) strcat(buf, " ");
209                 } else {
210                         a = strlen(buf);
211                         buf[a + 1] = 0;
212                         buf[a] = ch;
213                         if ((ch == 32) && (strlen(buf) > 200)) {
214                                 buf[a] = 0;
215                                 serv_puts(buf);
216                                 buf[0] = 0;
217                         }
218                         if (strlen(buf) > 250) {
219                                 serv_puts(buf);
220                                 buf[0] = 0;
221                         }
222                 }
223         }
224         serv_puts(buf);
225 }
226
227
228
229 /**
230  * \brief translate server message output to text
231  * (used for editing room info files and such)
232  */
233 void server_to_text()
234 {
235         char buf[SIZ];
236
237         int count = 0;
238
239         while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
240                 if ((buf[0] == 32) && (count > 0)) {
241                         wprintf("\n");
242                 }
243                 wprintf("%s", buf);
244                 ++count;
245         }
246 }
247
248
249
250 /**
251  * Read binary data from server into memory using a series of
252  * server READ commands.
253  * \param buffer the output buffer
254  * \param total_len the maximal length of buffer
255  */
256 void read_server_binary(char *buffer, size_t total_len) {
257         char buf[SIZ];
258         size_t bytes = 0;
259         size_t thisblock = 0;
260
261         memset(buffer, 0, total_len);
262         while (bytes < total_len) {
263                 thisblock = 4095;
264                 if ((total_len - bytes) < thisblock) {
265                         thisblock = total_len - bytes;
266                         if (thisblock == 0) return;
267                 }
268                 serv_printf("READ %d|%d", (int)bytes, (int)thisblock);
269                 serv_getln(buf, sizeof buf);
270                 if (buf[0] == '6') {
271                         thisblock = (size_t)atoi(&buf[4]);
272                         if (!WC->connected) return;
273                         serv_read(&buffer[bytes], thisblock);
274                         bytes += thisblock;
275                 }
276                 else {
277                         lprintf(3, "Error: %s\n", &buf[4]);
278                         return;
279                 }
280         }
281 }
282
283
284 /**
285  * \brief Read text from server, appending to a string buffer until the
286  * usual 000 terminator is found.  Caller is responsible for freeing
287  * the returned pointer.
288  */
289 char *read_server_text(void) {
290         char *text = NULL;
291         size_t bytes_allocated = 0;
292         size_t bytes_read = 0;
293         int linelen;
294         char buf[SIZ];
295
296         text = malloc(SIZ);
297         if (text == NULL) {
298                 return(NULL);
299         }
300         text[0] = 0;
301         bytes_allocated = SIZ;
302
303         while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
304                 linelen = strlen(buf);
305                 buf[linelen] = '\n';
306                 buf[linelen+1] = 0;
307                 ++linelen;
308
309                 if ((bytes_read + linelen) >= (bytes_allocated - 2)) {
310                         bytes_allocated = 2 * bytes_allocated;
311                         text = realloc(text, bytes_allocated);
312                 }
313
314                 strcpy(&text[bytes_read], buf);
315                 bytes_read += linelen;
316         }
317
318         return(text);
319 }
320
321
322
323 /*@}*/