#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "pi-macros.h"
#include "pi-mail.h"
Include dependency graph for mail.c:

Go to the source code of this file.
Functions | |
| void | free_Mail (Mail_t *mail) |
| void | free_MailAppInfo (MailAppInfo_t *appinfo) |
| void | free_MailSyncPref (MailSyncPref_t *pref) |
| void | free_MailSignaturePref (MailSignaturePref_t *pref) |
| int | unpack_Mail (Mail_t *mail, unsigned char *buffer, size_t len) |
| int | pack_Mail (struct Mail *mail, unsigned char *buffer, size_t len) |
| int | unpack_MailAppInfo (MailAppInfo_t *appinfo, unsigned char *record, size_t len) |
| int | pack_MailAppInfo (struct MailAppInfo *appinfo, unsigned char *record, size_t len) |
| int | unpack_MailSyncPref (MailSyncPref_t *pref, unsigned char *record, size_t len) |
| int | pack_MailSyncPref (MailSyncPref_t *pref, unsigned char *record, size_t len) |
| int | unpack_MailSignaturePref (MailSignaturePref_t *pref, unsigned char *record, size_t len) |
| int | pack_MailSignaturePref (struct MailSignaturePref *pref, unsigned char *record, size_t len) |
Variables | |
| char * | MailSortTypeNames [] = { "Date", "Type", NULL } |
| char * | MailSyncTypeNames [] = { "All", "Send", "Filter", NULL } |
| void free_Mail | ( | Mail_t * | ) |
Definition at line 56 of file mail.c.
References Mail::bcc, Mail::body, Mail::cc, Mail::from, Mail::replyTo, Mail::sentTo, Mail::subject, and Mail::to.
00057 { 00058 if (mail->from != NULL) { 00059 free(mail->from); 00060 mail->from = NULL; 00061 } 00062 00063 if (mail->to != NULL) { 00064 free(mail->to); 00065 mail->to = NULL; 00066 } 00067 00068 if (mail->subject != NULL) { 00069 free(mail->subject); 00070 mail->to = NULL; 00071 } 00072 00073 if (mail->cc != NULL) { 00074 free(mail->cc); 00075 mail->cc = NULL; 00076 } 00077 00078 if (mail->bcc != NULL) { 00079 free(mail->bcc); 00080 mail->bcc = NULL; 00081 } 00082 00083 if (mail->replyTo) { 00084 free(mail->replyTo); 00085 mail->replyTo = NULL; 00086 } 00087 00088 if (mail->sentTo) { 00089 free(mail->sentTo); 00090 mail->sentTo = NULL; 00091 } 00092 00093 if (mail->body != NULL) { 00094 free(mail->body); 00095 mail->body = NULL; 00096 } 00097 }
| void free_MailAppInfo | ( | MailAppInfo_t * | appinfo | ) |
| void free_MailSignaturePref | ( | MailSignaturePref_t * | pref | ) |
| void free_MailSyncPref | ( | MailSyncPref_t * | pref | ) |
Definition at line 131 of file mail.c.
References MailSyncPref::filterFrom, MailSyncPref::filterSubject, and MailSyncPref::filterTo.
00132 { 00133 if (pref->filterTo != NULL) { 00134 free(pref->filterTo); 00135 pref->filterTo = NULL; 00136 } 00137 00138 if (pref->filterFrom != NULL) { 00139 free(pref->filterFrom); 00140 pref->filterFrom = NULL; 00141 } 00142 00143 if (pref->filterSubject != NULL) { 00144 free(pref->filterSubject); 00145 pref->filterSubject = NULL; 00146 } 00147 }
| int pack_Mail | ( | struct Mail * | mail, | |
| unsigned char * | buffer, | |||
| size_t | len | |||
| ) |
Definition at line 316 of file mail.c.
References Mail::addressing, Mail::bcc, Mail::body, Mail::cc, Mail::date, Mail::dated, Mail::from, Mail::priority, Mail::read, Mail::replyTo, Mail::sentTo, set_byte, set_long, set_short, Mail::signature, Mail::subject, and Mail::to.
Referenced by test_mail().
00317 { 00318 size_t destlen = 6 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1; 00319 unsigned char *start = buffer; 00320 00321 if (mail->subject) 00322 destlen += strlen(mail->subject); 00323 if (mail->from) 00324 destlen += strlen(mail->from); 00325 if (mail->to) 00326 destlen += strlen(mail->to); 00327 if (mail->cc) 00328 destlen += strlen(mail->cc); 00329 if (mail->bcc) 00330 destlen += strlen(mail->bcc); 00331 if (mail->replyTo) 00332 destlen += strlen(mail->replyTo); 00333 if (mail->sentTo) 00334 destlen += strlen(mail->sentTo); 00335 if (mail->body) 00336 destlen += strlen(mail->body); 00337 00338 if (!buffer) 00339 return destlen; 00340 if (len < destlen) 00341 return 0; 00342 00343 set_short(buffer, 00344 ((mail->date.tm_year - 4) << 9) | ((mail->date.tm_mon + 00345 1) << 5) | mail->date. 00346 tm_mday); 00347 set_byte(buffer + 2, mail->date.tm_hour); 00348 set_byte(buffer + 3, mail->date.tm_min); 00349 00350 if (!mail->dated) 00351 set_long(buffer, 0); 00352 00353 set_byte(buffer + 4, (mail->read ? (1 << 7) : 0) | 00354 (mail->signature ? (1 << 6) : 0) | (mail-> 00355 confirmRead ? (1 << 5) : 00356 0) | (mail-> 00357 confirmDelivery 00358 ? (1 << 4) : 0) | 00359 ((mail->priority & 3) << 2) | (mail->addressing & 3)); 00360 set_byte(buffer + 5, 0); 00361 00362 buffer += 6; 00363 00364 if (mail->subject) { 00365 strcpy((char *)buffer, mail->subject); 00366 buffer += strlen((char *)buffer); 00367 } else 00368 set_byte(buffer, 0); 00369 buffer++; 00370 if (mail->from) { 00371 strcpy((char *)buffer, mail->from); 00372 buffer += strlen((char *)buffer); 00373 } else 00374 set_byte(buffer, 0); 00375 buffer++; 00376 if (mail->to) { 00377 strcpy((char *)buffer, mail->to); 00378 buffer += strlen((char *)buffer); 00379 } else 00380 set_byte(buffer, 0); 00381 buffer++; 00382 if (mail->cc) { 00383 strcpy((char *)buffer, mail->cc); 00384 buffer += strlen((char *)buffer); 00385 } else 00386 set_byte(buffer, 0); 00387 buffer++; 00388 if (mail->bcc) { 00389 strcpy((char *)buffer, mail->bcc); 00390 buffer += strlen((char *)buffer); 00391 } else 00392 set_byte(buffer, 0); 00393 buffer++; 00394 if (mail->replyTo) { 00395 strcpy((char *)buffer, mail->replyTo); 00396 buffer += strlen((char *)buffer); 00397 } else 00398 set_byte(buffer, 0); 00399 buffer++; 00400 if (mail->sentTo) { 00401 strcpy((char *)buffer, mail->sentTo); 00402 buffer += strlen((char *)buffer); 00403 } else 00404 set_byte(buffer, 0); 00405 buffer++; 00406 if (mail->body) { 00407 strcpy((char *)buffer, mail->body); 00408 buffer += strlen((char *)buffer); 00409 } else 00410 set_byte(buffer, 0); 00411 buffer++; 00412 00413 return (buffer - start); 00414 }
| int pack_MailAppInfo | ( | struct MailAppInfo * | appinfo, | |
| unsigned char * | record, | |||
| size_t | len | |||
| ) |
Definition at line 468 of file mail.c.
References MailAppInfo::category, MailAppInfo::dirty, pack_CategoryAppInfo(), set_byte, set_long, set_short, MailAppInfo::sortOrder, and MailAppInfo::unsentMessage.
Referenced by test_mail().
00469 { 00470 int i; 00471 unsigned char *start = record; 00472 00473 i = pack_CategoryAppInfo(&appinfo->category, record, len); 00474 if (!record) 00475 return i + 11; 00476 if (!i) 00477 return i; 00478 record += i; 00479 len -= i; 00480 if (len < 8) 00481 return 0; 00482 set_short(record, appinfo->dirty); 00483 record += 2; 00484 set_short(record, 0); /* gapfill */ 00485 set_byte(record, appinfo->sortOrder); 00486 record += 2; 00487 set_long(record, appinfo->unsentMessage); 00488 record += 4; 00489 00490 set_short(record, (record - start + 2)); 00491 record += 2; 00492 00493 /* if (appinfo->signature) 00494 strcpy(record, appinfo->signature); 00495 else 00496 set_byte(record, 0); 00497 record += strlen(record); */ 00498 set_byte(record, 0); 00499 record++; 00500 00501 return (record - start); 00502 }
Here is the call graph for this function:

| int pack_MailSignaturePref | ( | struct MailSignaturePref * | pref, | |
| unsigned char * | record, | |||
| size_t | len | |||
| ) |
Definition at line 655 of file mail.c.
References MailSignaturePref::signature.
Referenced by test_mail().
00657 { 00658 size_t destlen = 1; 00659 unsigned char *start = record; 00660 00661 if (pref->signature) 00662 destlen += strlen(pref->signature); 00663 00664 if (!record) 00665 return destlen; 00666 if (len < destlen) 00667 return 0; 00668 if (pref->signature) { 00669 strcpy((char *)record, pref->signature); 00670 record += strlen(pref->signature); 00671 } 00672 *record = 0; 00673 record++; 00674 00675 return (record - start); 00676 }
| int pack_MailSyncPref | ( | MailSyncPref_t * | pref, | |
| unsigned char * | record, | |||
| size_t | len | |||
| ) |
Definition at line 565 of file mail.c.
References MailSyncPref::filterFrom, MailSyncPref::filterSubject, MailSyncPref::filterTo, MailSyncPref::getContaining, MailSyncPref::getHigh, set_byte, set_short, MailSyncPref::syncType, and MailSyncPref::truncate.
Referenced by test_mail().
00566 { 00567 size_t destlen = 6 + 1 + 1 + 1; 00568 unsigned char *start = record; 00569 00570 if (pref->filterTo) 00571 destlen += strlen(pref->filterTo); 00572 if (pref->filterSubject) 00573 destlen += strlen(pref->filterSubject); 00574 if (pref->filterFrom) 00575 destlen += strlen(pref->filterFrom); 00576 00577 if (!record) 00578 return destlen; 00579 if (len < destlen) 00580 return 0; 00581 00582 set_byte(record, pref->syncType); 00583 record++; 00584 set_byte(record, pref->getHigh); 00585 record++; 00586 set_byte(record, pref->getContaining); 00587 record++; 00588 set_byte(record, 0); 00589 record++; /* gapfill */ 00590 set_short(record, pref->truncate); 00591 record += 2; 00592 00593 if (pref->filterTo) { 00594 strcpy((char *)record, pref->filterTo); 00595 record += strlen(pref->filterTo); 00596 } 00597 *record++ = 0; 00598 00599 if (pref->filterFrom) { 00600 strcpy((char *)record, pref->filterFrom); 00601 record += strlen(pref->filterFrom); 00602 } 00603 *record++ = 0; 00604 00605 if (pref->filterSubject) { 00606 strcpy((char *)record, pref->filterSubject); 00607 record += strlen(pref->filterSubject); 00608 } 00609 *record++ = 0; 00610 00611 return (record - start); 00612 }
| int unpack_Mail | ( | Mail_t * | mail, | |
| unsigned char * | buffer, | |||
| size_t | len | |||
| ) |
Definition at line 183 of file mail.c.
References Mail::addressing, Mail::bcc, Mail::body, Mail::cc, Mail::confirmDelivery, Mail::confirmRead, Mail::date, Mail::dated, flags, Mail::from, get_byte, get_short, Mail::priority, Mail::read, Mail::replyTo, Mail::sentTo, Mail::signature, strdup(), Mail::subject, and Mail::to.
Referenced by test_mail().
00184 { 00185 int flags; 00186 unsigned long d; 00187 unsigned char *start = buffer; 00188 00189 if (len < 6) 00190 return 0; 00191 00192 d = (unsigned short int) get_short(buffer); 00193 mail->date.tm_year = (d >> 9) + 4; 00194 mail->date.tm_mon = ((d >> 5) & 15) - 1; 00195 mail->date.tm_mday = d & 31; 00196 mail->date.tm_hour = get_byte(buffer + 2); 00197 mail->date.tm_min = get_byte(buffer + 3); 00198 mail->date.tm_sec = 0; 00199 mail->date.tm_isdst = -1; 00200 mktime(&mail->date); 00201 00202 if (d) 00203 mail->dated = 1; 00204 else 00205 mail->dated = 0; 00206 00207 flags = get_byte(buffer + 4); 00208 00209 mail->read = (flags & (1 << 7)) ? 1 : 0; 00210 mail->signature = (flags & (1 << 6)) ? 1 : 0; 00211 mail->confirmRead = (flags & (1 << 5)) ? 1 : 0; 00212 mail->confirmDelivery = (flags & (1 << 4)) ? 1 : 0; 00213 mail->priority = (flags & (3 << 2)) >> 2; 00214 mail->addressing = (flags & 3); 00215 00216 buffer += 6; 00217 len -= 6; 00218 00219 if (len < 1) 00220 return 0; 00221 if (get_byte(buffer)) { 00222 mail->subject = strdup((char *)buffer); 00223 buffer += strlen((char *)buffer); 00224 len -= strlen((char *)buffer); 00225 } else 00226 mail->subject = 0; 00227 buffer++; 00228 len--; 00229 if (len < 1) 00230 return 0; 00231 if (get_byte(buffer)) { 00232 mail->from = strdup((char *)buffer); 00233 buffer += strlen((char *)buffer); 00234 len -= strlen((char *)buffer); 00235 } else 00236 mail->from = 0; 00237 buffer++; 00238 len--; 00239 if (len < 1) 00240 return 0; 00241 if (get_byte(buffer)) { 00242 mail->to = strdup((char *)buffer); 00243 buffer += strlen((char *)buffer); 00244 len -= strlen((char *)buffer); 00245 } else 00246 mail->to = 0; 00247 buffer++; 00248 len--; 00249 if (len < 1) 00250 return 0; 00251 if (get_byte(buffer)) { 00252 mail->cc = strdup((char *)buffer); 00253 buffer += strlen((char *)buffer); 00254 len -= strlen((char *)buffer); 00255 } else 00256 mail->cc = 0; 00257 buffer++; 00258 len--; 00259 if (len < 1) 00260 return 0; 00261 if (get_byte(buffer)) { 00262 mail->bcc = strdup((char *)buffer); 00263 buffer += strlen((char *)buffer); 00264 len -= strlen((char *)buffer); 00265 } else 00266 mail->bcc = 0; 00267 buffer++; 00268 len--; 00269 if (len < 1) 00270 return 0; 00271 if (get_byte(buffer)) { 00272 mail->replyTo = strdup((char *)buffer); 00273 buffer += strlen((char *)buffer); 00274 len -= strlen((char *)buffer); 00275 } else 00276 mail->replyTo = 0; 00277 buffer++; 00278 len--; 00279 if (len < 1) 00280 return 0; 00281 if (get_byte(buffer)) { 00282 mail->sentTo = strdup((char *)buffer); 00283 buffer += strlen((char *)buffer); 00284 len -= strlen((char *)buffer); 00285 } else 00286 mail->sentTo = 0; 00287 buffer++; 00288 len--; 00289 if (len < 1) 00290 return 0; 00291 if (get_byte(buffer)) { 00292 mail->body = strdup((char *)buffer); 00293 buffer += strlen((char *)buffer); 00294 len -= strlen((char *)buffer); 00295 } else 00296 mail->body = 0; 00297 buffer++; 00298 len--; 00299 00300 return (buffer - start); 00301 }
Here is the call graph for this function:

| int unpack_MailAppInfo | ( | MailAppInfo_t * | appinfo, | |
| unsigned char * | record, | |||
| size_t | len | |||
| ) |
Definition at line 429 of file mail.c.
References MailAppInfo::category, MailAppInfo::dirty, get_byte, get_long, get_short, MailAppInfo::sortOrder, unpack_CategoryAppInfo(), and MailAppInfo::unsentMessage.
Referenced by test_mail().
00430 { 00431 int i; 00432 unsigned char *start = record; 00433 00434 i = unpack_CategoryAppInfo(&appinfo->category, record, len); 00435 if (!i) 00436 return i; 00437 record += i; 00438 len -= i; 00439 if (len < 11) 00440 return 0; 00441 appinfo->dirty = get_short(record); 00442 record += 2; 00443 appinfo->sortOrder = get_byte(record); 00444 record += 2; 00445 appinfo->unsentMessage = get_long(record); 00446 record += 4; 00447 00448 /* ai->signature = 0; */ 00449 /* strdup(start + get_short(record)); */ 00450 record += 3; 00451 00452 return (record - start); 00453 }
Here is the call graph for this function:

| int unpack_MailSignaturePref | ( | MailSignaturePref_t * | pref, | |
| unsigned char * | record, | |||
| size_t | len | |||
| ) |
Definition at line 627 of file mail.c.
References MailSignaturePref::signature, and strdup().
Referenced by test_mail().
00629 { 00630 unsigned char *start = record; 00631 00632 if (len < 1) 00633 return 0; 00634 00635 pref->signature = strdup((char *)record); 00636 00637 record += strlen(pref->signature) + 1; 00638 00639 return (record - start); 00640 }
Here is the call graph for this function:

| int unpack_MailSyncPref | ( | MailSyncPref_t * | pref, | |
| unsigned char * | record, | |||
| size_t | len | |||
| ) |
Definition at line 517 of file mail.c.
References MailSyncPref::filterFrom, MailSyncPref::filterSubject, MailSyncPref::filterTo, get_byte, get_short, MailSyncPref::getContaining, MailSyncPref::getHigh, strdup(), MailSyncPref::syncType, and MailSyncPref::truncate.
Referenced by test_mail().
00518 { 00519 unsigned char *start = record; 00520 00521 pref->syncType = get_byte(record); 00522 record += 1; 00523 pref->getHigh = get_byte(record); 00524 record += 1; 00525 pref->getContaining = get_byte(record); 00526 record += 2; 00527 pref->truncate = get_short(record); 00528 record += 2; 00529 00530 if (get_byte(record)) { 00531 pref->filterTo = strdup((char *)record); 00532 record += strlen((char *)record); 00533 } else 00534 pref->filterTo = 0; 00535 record++; 00536 if (get_byte(record)) { 00537 pref->filterFrom = strdup((char *)record); 00538 record += strlen((char *)record); 00539 } else 00540 pref->filterFrom = 0; 00541 record++; 00542 if (get_byte(record)) { 00543 pref->filterSubject = strdup((char *)record); 00544 record += strlen((char *)record); 00545 } else 00546 pref->filterSubject = 0; 00547 record++; 00548 00549 return (record - start); 00550 }
Here is the call graph for this function:

| char* MailSortTypeNames[] = { "Date", "Type", NULL } |
| char* MailSyncTypeNames[] = { "All", "Send", "Filter", NULL } |