1 /* umapisdm.c - *.MSG messagebase */
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <time.h>
7 #include <ctype.h>
8 #include "typesize.h"
9 #include "umapi.h"
10 #include "umapisdm.h"
11 #include "umdate.h"
12
sdmIntReadMsgHdr(FILE * f)13 tSdmMsgHdr *sdmIntReadMsgHdr(FILE *f)
14 {
15 tSdmMsgHdr *hdr;
16 UCHAR b1, b2;
17
18 hdr = malloc(sizeof(tSdmMsgHdr));
19
20 rewind(f);
21 fread(hdr->fromUserName, 36, 1, f);
22 hdr->fromUserName[36] = 0;
23 fread(hdr->toUserName, 36, 1, f);
24 hdr->toUserName[36] = 0;
25 fread(hdr->subject, 72, 1, f);
26 hdr->subject[72] = 0;
27 fread(hdr->dateTime, 20, 1, f);
28 hdr->dateTime[20] = 0;
29
30 fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
31 hdr->timesRead = (b2 * 256) + b1;
32 fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
33 hdr->destNode = (b2 * 256) + b1;
34 fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
35 hdr->origNode = (b2 * 256) + b1;
36 fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
37 hdr->cost = (b2 * 256) + b1;
38 fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
39 hdr->origNet = (b2 * 256) + b1;
40 fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
41 hdr->destNet = (b2 * 256) + b1;
42 fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
43 hdr->destZone = (b2 * 256) + b1;
44 fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
45 hdr->origZone = (b2 * 256) + b1;
46 fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
47 hdr->destPoint = (b2 * 256) + b1;
48 fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
49 hdr->origPoint = (b2 * 256) + b1;
50 fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
51 hdr->replyTo = (b2 * 256) + b1;
52 fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
53 hdr->attrib = (b2 * 256) + b1;
54 fread(&b1, 1, 1, f); fread(&b2, 1, 1, f);
55 hdr->nextReply = (b2 * 256) + b1;
56
57 return hdr;
58 }
59
sdmIntConvHdr(tSdmMsgHdr * sdmHdr,tUmMsgNr msgNr)60 tUmMsgHdr *sdmIntConvHdr(tSdmMsgHdr *sdmHdr, tUmMsgNr msgNr)
61 {
62 tUmMsgHdr *msgHdr;
63
64 msgHdr = malloc(sizeof(tUmMsgHdr));
65 msgHdr->areaType = cUmAreaTypeSdm;
66 msgHdr->msgNr = msgNr;
67 msgHdr->flags = 0;
68 if (sdmHdr->attrib & cSdmMsgFlagPriv) msgHdr->flags |= cUmMsgFlagPriv;
69 if (sdmHdr->attrib & cSdmMsgFlagCrash) msgHdr->flags |= cUmMsgFlagCrash;
70 if (sdmHdr->attrib & cSdmMsgFlagRcvd) msgHdr->flags |= cUmMsgFlagRead;
71 if (sdmHdr->attrib & cSdmMsgFlagSent) msgHdr->flags |= cUmMsgFlagSent;
72 if (sdmHdr->attrib & cSdmMsgFlagAttach) msgHdr->flags |= cUmMsgFlagAttach;
73 if (sdmHdr->attrib & cSdmMsgFlagIntrans) msgHdr->flags |= cUmMsgFlagIntrans;
74 if (sdmHdr->attrib & cSdmMsgFlagOrphan) msgHdr->flags |= cUmMsgFlagOrphan;
75 if (sdmHdr->attrib & cSdmMsgFlagKillSent) msgHdr->flags |= cUmMsgFlagKillSent;
76 if (sdmHdr->attrib & cSdmMsgFlagLocal) msgHdr->flags |= cUmMsgFlagLocal;
77 if (sdmHdr->attrib & cSdmMsgFlagHold) msgHdr->flags |= cUmMsgFlagHold;
78 if (sdmHdr->attrib & cSdmMsgFlagFReq) msgHdr->flags |= cUmMsgFlagFReq;
79 if (sdmHdr->attrib & cSdmMsgFlagRcptReq) msgHdr->flags |= cUmMsgFlagRcptReq;
80 if (sdmHdr->attrib & cSdmMsgFlagRcpt) msgHdr->flags |= cUmMsgFlagRcpt;
81 if (sdmHdr->attrib & cSdmMsgFlagAuditReq) msgHdr->flags |= cUmMsgFlagAuditReq;
82 if (sdmHdr->attrib & cSdmMsgFlagUpdReq) msgHdr->flags |= cUmMsgFlagUpdReq;
83
84 msgHdr->fromAddr.zone = sdmHdr->origZone;
85 msgHdr->fromAddr.net = sdmHdr->origNet;
86 msgHdr->fromAddr.node = sdmHdr->origNode;
87 msgHdr->fromAddr.point = sdmHdr->origPoint;
88 msgHdr->fromAddr.domain = NULL;
89 msgHdr->toAddr.zone = sdmHdr->destZone;
90 msgHdr->toAddr.net = sdmHdr->destNet;
91 msgHdr->toAddr.node = sdmHdr->destNode;
92 msgHdr->toAddr.point = sdmHdr->destPoint;
93 msgHdr->toAddr.domain = NULL;
94 msgHdr->fromName = strdup(sdmHdr->fromUserName);
95 msgHdr->toName = strdup(sdmHdr->toUserName);
96 msgHdr->subject = strdup(sdmHdr->subject);
97
98 msgHdr->dateWritten = ftscDate2UnixDate(sdmHdr->dateTime);
99
100 msgHdr->dateArrived = 0;
101 msgHdr->dateRead = 0;
102 msgHdr->replyTo = sdmHdr->replyTo;
103
104 if (sdmHdr->nextReply != 0)
105 {
106 msgHdr->replies = malloc(sizeof(tUmMsgNr));
107 msgHdr->replies[0] = sdmHdr->nextReply;
108 msgHdr->numReplies = 1;
109 }
110 else
111 {
112 msgHdr->replies = NULL;
113 msgHdr->numReplies = 0;
114 }
115
116 msgHdr->data = (void *) sdmHdr;
117
118 return msgHdr;
119 }
120
sdmAreaOpen(char * areaName)121 tUmArea *sdmAreaOpen(char *areaName)
122 {
123 tUmArea *area;
124 tSdmArea *sdmArea;
125
126 if ((areaName == NULL) || (*areaName == 0)) return NULL;
127
128 area = calloc(1, sizeof(tUmArea));
129 sdmArea = calloc(1, sizeof(tSdmArea));
130
131 if (areaName[strlen(areaName) - 1] == dirSepC)
132 {
133 area->areaName = malloc(strlen(areaName));
134 strncpy(area->areaName, areaName, strlen(areaName) - 1);
135 area->areaName[strlen(areaName) - 1] = 0;
136 }
137 else area->areaName = strdup(areaName);
138 area->areaType = cUmAreaTypeSdm;
139 area->data = (void *) sdmArea;
140
141 return area;
142 }
143
sdmAreaClose(tUmArea * area)144 void sdmAreaClose(tUmArea *area)
145 {
146 free(area->data);
147 free(area->areaName);
148 free(area);
149 }
150
sdmAreaEmptyMsg(tUmArea * area)151 tUmMsg *sdmAreaEmptyMsg(tUmArea *area)
152 {
153 tUmMsg *msg;
154 tSdmMsg *sdmMsg;
155 tUmMsgHdr *hdr;
156 tSdmMsgHdr *sdmHdr;
157
158 msg = calloc(1, sizeof(tUmMsg));
159 sdmMsg = calloc(1, sizeof(tSdmMsg));
160 hdr = calloc(1, sizeof(tUmMsgHdr));
161 sdmHdr = calloc(1, sizeof(tSdmMsgHdr));
162 msg->data = (void *) sdmMsg;
163 msg->msgHdr = hdr;
164 hdr->dateWritten = time(NULL);
165 hdr->areaType = cUmAreaTypeSdm;
166 hdr->data = (void *) sdmHdr;
167
168 return msg;
169 }
170
sdmAreaReadMsgHdr(tUmArea * area,tUmMsgNr msgNr)171 tUmMsgHdr *sdmAreaReadMsgHdr(tUmArea *area, tUmMsgNr msgNr)
172 {
173 tSdmMsgHdr *sdmHdr;
174 tUmMsgHdr *msgHdr;
175 FILE *f;
176 char *fname;
177
178 fname = malloc(strlen(area->areaName)+11); // %u: max. 65535
179 sprintf(fname, "%s%c%u.msg", area->areaName, dirSepC, msgNr);
180 f = fopen(fname, "r");
181 free(fname);
182
183 if (f == NULL) return NULL;
184
185 sdmHdr = sdmIntReadMsgHdr(f);
186 fclose(f);
187
188 msgHdr = sdmIntConvHdr(sdmHdr, msgNr);
189 // don't dispose sdmHdr, because it's in msgHdr now
190
191 return msgHdr;
192 }
193
sdmAreaReadMsg(tUmArea * area,tUmMsgNr msgNr)194 tUmMsg *sdmAreaReadMsg(tUmArea *area, tUmMsgNr msgNr)
195 {
196 tUmMsg *msg;
197 tSdmMsg *sdmMsg;
198 tSdmMsgHdr *sdmHdr;
199 tUmMsgHdr *msgHdr;
200 FILE *f;
201 char *fname;
202 char buf[1024];
203 char *msgBuf;
204 char *msgBufPos;
205 size_t br;
206 UINT32 msgBufSize;
207
208 fname = malloc(strlen(area->areaName)+11); // %u: max. 65535
209 sprintf(fname, "%s%c%u.msg", area->areaName, dirSepC, msgNr);
210 f = fopen(fname, "r");
211 free(fname);
212
213 if (f == NULL) return NULL;
214
215 sdmHdr = sdmIntReadMsgHdr(f);
216
217 msgHdr = sdmIntConvHdr(sdmHdr, msgNr);
218 // don't dispose sdmHdr, because it's in msgHdr now
219
220 msg = malloc(sizeof(tUmMsg));
221 sdmMsg = malloc(sizeof(tSdmMsg));
222 msg->msgHdr = msgHdr;
223 msg->kludges = NULL;
224 msg->body = NULL;
225 msg->data = (void *) sdmMsg;
226
227 // read whole message into memory
228 msgBuf = NULL;
229 msgBufSize = 0;
230 fseek(f, 0xbeL, SEEK_SET);
231 while (feof(f) == 0)
232 {
233 // read message in 1k-blocks
234 br = fread(buf, 1, 1024, f);
235 if (br > 0)
236 {
237 msgBuf = realloc(msgBuf, msgBufSize + br + 1);
238 msgBufPos = &msgBuf[msgBufSize];
239 strncpy(msgBufPos, buf, br);
240 msgBufSize += br;
241 msgBuf[msgBufSize] = 0;
242 }
243 }
244 fclose(f);
245
246 // split into kludge- and body-lines
247 msgBufPos = msgBuf;
248 msg->numKludges = 0;
249 msg->numBody = 0;
250 while (*msgBufPos != 0)
251 {
252 char *crPos;
253
254 // CR gets filtered out (no trailing CR)
255 crPos = strchr(msgBufPos, 13);
256
257 // kludge or body?
258 if (*msgBufPos == 1)
259 {
260 if (crPos != NULL)
261 {
262 msg->numKludges++;
263 msg->kludges = realloc(msg->kludges,
264 msg->numKludges * sizeof(char *));
265 msg->kludges[msg->numKludges - 1] = malloc((crPos - msgBufPos) + 1);
266 strncpy(msg->kludges[msg->numKludges - 1],
267 msgBufPos, crPos - msgBufPos);
268 msg->kludges[msg->numKludges - 1][crPos - msgBufPos] = 0;
269 }
270 else
271 {
272 msg->numKludges++;
273 msg->kludges = realloc(msg->kludges,
274 msg->numKludges * sizeof(char *));
275 msg->kludges[msg->numKludges - 1] = malloc(strlen(msgBufPos) + 1);
276 strncpy(msg->kludges[msg->numKludges - 1],
277 msgBufPos, strlen(msgBufPos));
278 msg->kludges[msg->numKludges - 1][strlen(msgBufPos)] = 0;
279 }
280 }
281 else
282 {
283 if (crPos != NULL)
284 {
285 msg->numBody++;
286 msg->body = realloc(msg->body,
287 msg->numBody * sizeof(char *));
288 msg->body[msg->numBody - 1] = malloc((crPos - msgBufPos) + 1);
289 strncpy(msg->body[msg->numBody - 1],
290 msgBufPos, crPos - msgBufPos);
291 msg->body[msg->numBody - 1][crPos - msgBufPos] = 0;
292 }
293 else
294 {
295 msg->numBody++;
296 msg->body = realloc(msg->body,
297 msg->numBody * sizeof(char *));
298 msg->body[msg->numBody - 1] = malloc(strlen(msgBufPos) + 1);
299 strncpy(msg->body[msg->numBody - 1],
300 msgBufPos, strlen(msgBufPos));
301 msg->body[msg->numBody - 1][strlen(msgBufPos)] = 0;
302 }
303 }
304
305 if (crPos != NULL) msgBufPos = crPos + 1;
306 else msgBufPos = &msgBufPos[strlen(msgBufPos)];
307 }
308
309 free(msgBuf);
310
311 return msg;
312 }
313
sdmAreaChangeMsgHdr(tUmArea * area,tUmMsgNr msgNr,tUmMsgHdr * msgHdr)314 CHAR sdmAreaChangeMsgHdr(tUmArea *area, tUmMsgNr msgNr, tUmMsgHdr *msgHdr)
315 {
316
317 }
318
sdmAreaChangeMsg(tUmArea * area,tUmMsgNr msgNr,tUmMsg * msg)319 CHAR sdmAreaChangeMsg(tUmArea *area, tUmMsgNr msgNr, tUmMsg *msg)
320 {
321
322 }
323
sdmAreaAppendMsg(tUmArea * area,tUmMsg * msg)324 tUmMsgNr sdmAreaAppendMsg(tUmArea *area, tUmMsg *msg)
325 {
326
327 }
328
sdmAreaDeleteMsg(tUmArea * area,tUmMsgNr msgNr)329 CHAR sdmAreaDeleteMsg(tUmArea *area, tUmMsgNr msgNr)
330 {
331
332 }
333
sdmAreaLock(tUmArea * area)334 CHAR sdmAreaLock(tUmArea *area)
335 {
336
337 }
338
sdmAreaUnlock(tUmArea * area)339 CHAR sdmAreaUnlock(tUmArea *area)
340 {
341
342 }
343
sdmAreaLockMsg(tUmArea * area,tUmMsgNr msgNr)344 CHAR sdmAreaLockMsg(tUmArea *area, tUmMsgNr msgNr)
345 {
346
347 }
348
sdmAreaUnlockMsg(tUmArea * area,tUmMsgNr msgNr)349 CHAR sdmAreaUnlockMsg(tUmArea *area, tUmMsgNr msgNr)
350 {
351
352 }
353
sdmAreaGetLastread(tUmArea * area,tUmUserNr userNr)354 tUmMsgNr sdmAreaGetLastread(tUmArea *area, tUmUserNr userNr)
355 {
356
357 }
358
sdmAreaSetLastread(tUmArea * area,tUmUserNr userNr,tUmMsgNr msgNr)359 CHAR sdmAreaSetLastread(tUmArea *area, tUmUserNr userNr, tUmMsgNr msgNr)
360 {
361
362 }
363
sdmAreaNumMsgs(tUmArea * area)364 tUmMsgNr sdmAreaNumMsgs(tUmArea *area)
365 {
366
367 }
368
369 // allocates needed memory
sdmAreaMsgList(tUmArea * area,tUmMsgNr * numMsgs)370 tUmMsgNr *sdmAreaMsgList(tUmArea *area, tUmMsgNr *numMsgs)
371 {
372
373 }
374
sdmMsgDispose(tUmMsg * msg)375 void sdmMsgDispose(tUmMsg *msg)
376 {
377 free(msg->msgHdr->data);
378 free(msg->msgHdr->fromName);
379 free(msg->msgHdr->toName);
380 free(msg->msgHdr->subject);
381 free(msg->msgHdr->replies);
382 free(msg->msgHdr);
383 if (msg->kludges != NULL) free(msg->kludges);
384 if (msg->body != NULL) free(msg->body);
385 free(msg);
386 }
387
sdmMsgHdrDispose(tUmMsgHdr * msgHdr)388 void sdmMsgHdrDispose(tUmMsgHdr *msgHdr)
389 {
390 free(msgHdr->data);
391 free(msgHdr->fromName);
392 free(msgHdr->toName);
393 free(msgHdr->subject);
394 free(msgHdr->replies);
395 free(msgHdr);
396 }
397
398
399