]> code.citadel.org Git - citadel.git/blob - libcitadel/lib/vnote.c
vnote serialization
[citadel.git] / libcitadel / lib / vnote.c
1 /*
2  * $Id: $
3  *
4  * vNote implementation for Citadel
5  *
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.
9  */
10
11
12 #include <stdlib.h>
13 #include <unistd.h>
14 #include <stdio.h>
15 #include <fcntl.h>
16 #include <signal.h>
17
18 #if TIME_WITH_SYS_TIME
19 # include <sys/time.h>
20 # include <time.h>
21 #else
22 # if HAVE_SYS_TIME_H
23 #  include <sys/time.h>
24 # else
25 #  include <time.h>
26 # endif
27 #endif
28
29 #include <ctype.h>
30 #include <string.h>
31 #include <errno.h>
32 #include <limits.h>
33 #include <string.h>
34 #include <libcitadel.h>
35
36
37 /* move this into the header file when we're done */
38 #define CTDL_VNOTE_MAGIC        0xa1fa
39 struct vnote {
40         int magic;
41         char *uid;
42         char *summary;
43         char *body;
44         int pos_left;
45         int pos_top;
46         int pos_width;
47         int pos_height;
48         int color_red;
49         int color_green;
50         int color_blue;
51 };
52
53
54 struct vnote *vnote_new(void) {
55         struct vnote *v;
56
57         v = (struct vnote *) malloc(sizeof(struct vnote));
58         if (v) {
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;
63                 v->pos_width = 200;
64                 v->pos_height = 150;
65                 v->color_red = 0xFF;
66                 v->color_green = 0xFF;
67                 v->color_blue = 0x00;
68         }
69         return v;
70 }
71
72 struct vnote *vnote_new_from_str(char *s) {
73         struct vnote *v;
74
75         v = vnote_new();
76         if (!v) return NULL;
77
78         /* FIXME finish this */
79
80         return(v);
81 }
82
83 void vnote_free(struct vnote *v) {
84         if (!v) return;
85         if (v->magic != CTDL_VNOTE_MAGIC) return;
86
87         if (v->uid) free(v->uid);
88         if (v->summary) free(v->summary);
89         if (v->body) free(v->body);
90         
91         memset(v, 0, sizeof(struct vnote));
92         free(v);
93 }
94
95
96 /* helper function for vnote_serialize() */
97 void vnote_serialize_output_field(char *append_to, char *field, char *label) {
98
99         char *mydup;
100
101         if (!append_to) return;
102         if (!field) return;
103         if (!label) return;
104
105         mydup = strdup(field);
106         if (!mydup) return;
107
108         /* FIXME  --  do quoted-printable encoding here */
109
110         sprintf(&append_to[strlen(append_to)], "%s:%s\r\n", label, mydup);
111         free(mydup);
112 }
113
114
115 char *vnote_serialize(struct vnote *v) {
116         char *s;
117         int bytes_needed = 0;
118
119         if (!v) return NULL;
120         if (v->magic != CTDL_VNOTE_MAGIC) return NULL;
121
122         bytes_needed = 1024;
123         if (v->summary) bytes_needed += strlen(v->summary);
124         if (v->body) bytes_needed += strlen(v->body);
125         s = malloc(bytes_needed);
126         if (!s) return NULL;
127
128         strcpy(s, "");
129         vnote_serialize_output_field(s, "vnote", "BEGIN");
130         vnote_serialize_output_field(s, "//Citadel//vNote handler library//EN", "PRODID");
131         vnote_serialize_output_field(s, "1.1", "VERSION");
132         vnote_serialize_output_field(s, "PUBLIC", "CLASS");
133         vnote_serialize_output_field(s, v->uid, "UID");
134         vnote_serialize_output_field(s, v->body, "BODY");
135         vnote_serialize_output_field(s, v->body, "NOTE");
136         vnote_serialize_output_field(s, "vnote", "END");
137         return(s);
138 }
139
140
141 #ifdef VNOTE_TEST_HARNESS
142
143 char *bynari_sample =
144         "BEGIN:vnote\n"
145         "VERSION:1.1\n"
146         "PRODID://Bynari Insight Connector 3.1.3-0605191//Import from Outlook//EN\n"
147         "CLASS:PUBLIC\n"
148         "UID:040000008200E00074C5B7101A82E00800000000000000000000000000820425CE8571864B8D141CB3FB8CAC62\n"
149         "NOTE;ENCODING=QUOTED-PRINTABLE:blah blah blah=0D=0A=0D=0A\n"
150         "SUMMARY:blah blah blah=0D=0A=0D=0A\n"
151         "X-OUTLOOK-COLOR:#FFFF00\n"
152         "X-OUTLOOK-WIDTH:200\n"
153         "X-OUTLOOK-HEIGHT:166\n"
154         "X-OUTLOOK-LEFT:80\n"
155         "X-OUTLOOK-TOP:80\n"
156         "X-OUTLOOK-CREATE-TIME:20070611T204615Z\n"
157         "REV:20070611T204621Z\n"
158         "END:vnote\n"
159 ;
160
161 char *horde_sample =
162         "BEGIN:VNOTE\n"
163         "VERSION:1.1\n"
164         "UID:20061129111109.7chx73xdok1s at 172.16.45.2\n"
165         "BODY:HORDE_1\n"
166         "DCREATED:20061129T101109Z\n"
167         "END:VNOTE\n"
168 ;
169
170
171 main() {
172         char *s;
173         struct vnote *v;
174
175         printf("Before:\n-------------\n%s-------------\nAfter:\n-----------\n", bynari_sample);
176         v = vnote_new_from_str(bynari_sample);
177         s = vnote_serialize(v);
178         vnote_free(v);
179         if (s) {
180                 printf("%s", s);
181                 free(s);
182         }
183
184         exit(0);
185 }
186 #endif