4 * vNote implementation for Citadel
6 * Copyright (C) 1999-2007 by the citadel.org development team.
7 * This code is freely redistributable under the terms of the GNU General
8 * Public License. All other rights reserved.
18 #if TIME_WITH_SYS_TIME
19 # include <sys/time.h>
23 # include <sys/time.h>
34 #include <libcitadel.h>
37 /* move this into the header file when we're done */
38 #define CTDL_VNOTE_MAGIC 0xa1fa
54 struct vnote *vnote_new(void) {
57 v = (struct vnote *) malloc(sizeof(struct vnote));
59 memset(v, 0, sizeof(struct vnote));
60 v->magic = CTDL_VNOTE_MAGIC;
61 v->pos_left = rand() % 256;
62 v->pos_top = rand() % 256;
66 v->color_green = 0xFF;
72 struct vnote *vnote_new_from_str(char *s) {
78 /* FIXME finish this */
83 void vnote_free(struct vnote *v) {
85 if (v->magic != CTDL_VNOTE_MAGIC) return;
87 if (v->uid) free(v->uid);
88 if (v->summary) free(v->summary);
89 if (v->body) free(v->body);
91 memset(v, 0, sizeof(struct vnote));
96 /* helper function for vnote_serialize() */
97 void vnote_serialize_output_field(char *append_to, char *field, char *label) {
106 if (!append_to) return;
110 mydup = malloc((strlen(field) * 3) + 1);
114 while (ptr[pos] != 0) {
115 ch = (unsigned char)(ptr[pos++]);
118 mydup[output_len++] = ch;
120 else if ( (ch >= 32) && (ch <= 60) ) {
121 mydup[output_len++] = ch;
123 else if ( (ch >= 62) && (ch <= 126) ) {
124 mydup[output_len++] = ch;
127 sprintf((char *)&mydup[output_len], "=%02X", ch);
132 mydup[output_len] = 0;
134 sprintf(&append_to[strlen(append_to)], "%s%s:%s\r\n",
136 (is_qp ? ";ENCODING=QUOTED-PRINTABLE" : ""),
142 char *vnote_serialize(struct vnote *v) {
144 int bytes_needed = 0;
147 if (v->magic != CTDL_VNOTE_MAGIC) return NULL;
150 if (v->summary) bytes_needed += strlen(v->summary);
151 if (v->body) bytes_needed += strlen(v->body);
152 s = malloc(bytes_needed);
156 vnote_serialize_output_field(s, "vnote", "BEGIN");
157 vnote_serialize_output_field(s, "//Citadel//vNote handler library//EN", "PRODID");
158 vnote_serialize_output_field(s, "1.1", "VERSION");
159 vnote_serialize_output_field(s, "PUBLIC", "CLASS");
160 vnote_serialize_output_field(s, v->uid, "UID");
161 vnote_serialize_output_field(s, v->body, "BODY");
162 vnote_serialize_output_field(s, v->body, "NOTE");
163 sprintf(&s[strlen(s)], "X-OUTLOOK-COLOR:#%02X%02X%02X\r\n",
164 v->color_red, v->color_green, v->color_blue);
165 sprintf(&s[strlen(s)], "X-OUTLOOK-LEFT:%d\r\n", v->pos_left);
166 sprintf(&s[strlen(s)], "X-OUTLOOK-TOP:%d\r\n", v->pos_top);
167 sprintf(&s[strlen(s)], "X-OUTLOOK-WIDTH:%d\r\n", v->pos_width);
168 sprintf(&s[strlen(s)], "X-OUTLOOK-HEIGHT:%d\r\n", v->pos_height);
169 vnote_serialize_output_field(s, "vnote", "END");
174 #ifdef VNOTE_TEST_HARNESS
176 char *bynari_sample =
179 "PRODID://Bynari Insight Connector 3.1.3-0605191//Import from Outlook//EN\n"
181 "UID:040000008200E00074C5B7101A82E00800000000000000000000000000820425CE8571864B8D141CB3FB8CAC62\n"
182 "NOTE;ENCODING=QUOTED-PRINTABLE:blah blah blah=0D=0A=0D=0A\n"
183 "SUMMARY:blah blah blah=0D=0A=0D=0A\n"
184 "X-OUTLOOK-COLOR:#FFFF00\n"
185 "X-OUTLOOK-WIDTH:200\n"
186 "X-OUTLOOK-HEIGHT:166\n"
187 "X-OUTLOOK-LEFT:80\n"
189 "X-OUTLOOK-CREATE-TIME:20070611T204615Z\n"
190 "REV:20070611T204621Z\n"
197 "UID:20061129111109.7chx73xdok1s at 172.16.45.2\n"
199 "DCREATED:20061129T101109Z\n"
208 printf("Before:\n-------------\n%s-------------\nAfter:\n-----------\n", bynari_sample);
209 v = vnote_new_from_str(bynari_sample);
210 s = vnote_serialize(v);