home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1997 August / PCO0897.ISO / filesbbs / os2 / plnk065.arj / PLNK065.ZIP / pilot-link.0.6.5 / libsock / mail.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-23  |  6.4 KB  |  301 lines

  1. /* mail.c:  Translate Pilot mail data formats
  2.  *
  3.  * Copyright (c) 1997, Kenneth Albanowski
  4.  *
  5.  * This is free software, licensed under the GNU Public License V2.
  6.  * See the file COPYING for details.
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include "pi-source.h"
  13. #include "pi-socket.h"
  14. #include "pi-dlp.h"
  15. #include "pi-mail.h"
  16.  
  17. void free_Mail(struct Mail * a) {
  18.   if (a->from)
  19.     free(a->from);
  20.   if (a->to)
  21.     free(a->to);
  22.   if (a->subject)
  23.     free(a->subject);
  24.   if (a->cc)
  25.     free(a->cc);
  26.   if (a->bcc)
  27.     free(a->bcc);
  28.   if (a->replyTo)
  29.     free(a->replyTo);
  30.   if (a->sentTo)
  31.     free(a->sentTo);
  32.   if (a->body)
  33.     free(a->body);
  34. }
  35.  
  36. void free_MailAppInfo(struct MailAppInfo * a) {
  37.   if (a->signature)
  38.     free(a->signature);
  39. }
  40.  
  41. void free_MailPrefs(struct MailPrefs * a) {
  42.   if (a->filterto);
  43.     free(a->filterto);
  44.   if (a->filterfrom);
  45.     free(a->filterfrom);
  46.   if (a->filtersubject);
  47.     free(a->filtersubject);
  48. }
  49.  
  50. void unpack_Mail(struct Mail * a, unsigned char * buffer, int len)
  51. {
  52.   unsigned long d;
  53.   int flags;
  54.  
  55.   d = (unsigned short int)get_short(buffer);
  56.   a->date.tm_year = (d >> 9) + 4;
  57.   a->date.tm_mon = ((d >> 5) & 15) - 1;
  58.   a->date.tm_mday = d & 31;
  59.   a->date.tm_hour = get_byte(buffer+2);
  60.   a->date.tm_min = get_byte(buffer+3);
  61.   a->date.tm_sec = 0;
  62.   a->date.tm_isdst = -1;
  63.   mktime(&a->date);
  64.   
  65.   if (d)
  66.     a->dated = 1;
  67.   else
  68.     a->dated = 0;
  69.   
  70.   flags = get_byte(buffer+4);
  71.   
  72.   a->read = (flags & (1 << 7)) ? 1 : 0;
  73.   a->signature = (flags & (1 << 6)) ? 1 : 0;
  74.   a->confirmRead = (flags & (1 << 5)) ? 1 : 0;
  75.   a->confirmDelivery = (flags & (1 << 4)) ? 1 : 0;
  76.   a->priority = (flags & (3 << 2)) >> 2;
  77.   a->addressing = (flags & 3);
  78.   
  79.   buffer += 6;
  80.   
  81.   if (get_byte(buffer)) {
  82.     a->subject = strdup(buffer);
  83.     buffer += strlen(buffer);
  84.   } else
  85.     a->subject = 0;
  86.   buffer++;
  87.   if (get_byte(buffer)) {
  88.     a->from = strdup(buffer);
  89.     buffer += strlen(buffer);
  90.   } else
  91.     a->from = 0;
  92.   buffer++;
  93.   if (get_byte(buffer)) {
  94.     a->to = strdup(buffer);
  95.     buffer += strlen(buffer);
  96.   } else
  97.     a->to = 0;
  98.   buffer++;
  99.   if (get_byte(buffer)) {
  100.     a->cc = strdup(buffer);
  101.     buffer += strlen(buffer);
  102.   } else
  103.     a->cc = 0;
  104.   buffer++;
  105.   if (get_byte(buffer)) {
  106.     a->bcc = strdup(buffer);
  107.     buffer += strlen(buffer);
  108.   } else
  109.     a->bcc = 0;
  110.   buffer++;
  111.   if (get_byte(buffer)) {
  112.     a->replyTo = strdup(buffer);
  113.     buffer += strlen(buffer);
  114.   } else
  115.     a->replyTo = 0;
  116.   buffer++;
  117.   if (get_byte(buffer)) {
  118.     a->sentTo = strdup(buffer);
  119.     buffer += strlen(buffer);
  120.   } else
  121.     a->sentTo = 0;
  122.   buffer++;
  123.   if (get_byte(buffer)) {
  124.     a->body = strdup(buffer);
  125.     buffer += strlen(buffer);
  126.   } else
  127.     a->body = 0;
  128.   buffer++;
  129. }
  130.  
  131. void pack_Mail(struct Mail * a, unsigned char * buffer, int * len)
  132. {
  133.   unsigned char * start = buffer;
  134.  
  135.   set_short(buffer, ((a->date.tm_year - 4) << 9) |
  136.                     ((a->date.tm_mon  + 1) << 5) |
  137.                     a->date.tm_mday);
  138.   set_byte(buffer+2, a->date.tm_hour);
  139.   set_byte(buffer+3, a->date.tm_min);
  140.   
  141.   if (!a->dated)
  142.     set_long(buffer, 0);
  143.   
  144.   set_byte(buffer+4, (a->read ? (1 << 7) : 0) |
  145.                      (a->signature ? (1 << 6) : 0) |
  146.                      (a->confirmRead ? (1 << 5) : 0) |
  147.                      (a->confirmDelivery ? (1 << 4) : 0) |
  148.                      ((a->priority & 3) << 2) |
  149.                      (a->addressing & 3)
  150.            );
  151.   set_byte(buffer+5, 0);
  152.   
  153.   buffer += 6;
  154.   
  155.   if (a->subject) {
  156.     strcpy(buffer, a->subject);
  157.     buffer += strlen(buffer);
  158.   } else
  159.     set_byte(buffer, 0);
  160.   buffer++;
  161.   if (a->from) {
  162.     strcpy(buffer, a->from);
  163.     buffer += strlen(buffer);
  164.   } else
  165.     set_byte(buffer, 0);
  166.   buffer++;
  167.   if (a->to) {
  168.     strcpy(buffer, a->to);
  169.     buffer += strlen(buffer);
  170.   } else
  171.     set_byte(buffer, 0);
  172.   buffer++;
  173.   if (a->cc) {
  174.     strcpy(buffer, a->cc);
  175.     buffer += strlen(buffer);
  176.   } else
  177.     set_byte(buffer, 0);
  178.   buffer++;
  179.   if (a->bcc) {
  180.     strcpy(buffer, a->bcc);
  181.     buffer += strlen(buffer);
  182.   } else
  183.     set_byte(buffer, 0);
  184.   buffer++;
  185.   if (a->replyTo) {
  186.     strcpy(buffer, a->replyTo);
  187.     buffer += strlen(buffer);
  188.   } else
  189.     set_byte(buffer, 0);
  190.   buffer++;
  191.   if (a->sentTo) {
  192.     strcpy(buffer, a->sentTo);
  193.     buffer += strlen(buffer);
  194.   } else
  195.     set_byte(buffer, 0);
  196.   buffer++;
  197.   if (a->body) {
  198.     strcpy(buffer, a->body);
  199.     buffer += strlen(buffer);
  200.   } else
  201.     set_byte(buffer, 0);
  202.   buffer++;
  203.   
  204.   if (len)
  205.     *len = buffer - start;
  206. }
  207.  
  208.  
  209. void unpack_MailAppInfo(struct MailAppInfo * ai, unsigned char * record, int len)
  210. {
  211.   int i;
  212.   
  213.   ai->renamedcategories = get_short(record);
  214.   record+=2;
  215.   for(i=0;i<16;i++) {
  216.     memcpy(ai->CategoryName[i], record, 16);
  217.     record += 16;
  218.   }
  219.   memcpy(ai->CategoryID, record, 16);
  220.   record += 16;
  221.   ai->lastUniqueID = get_byte(record);
  222.   record += 4;
  223.   ai->dirtyfieldlabels = get_short(record);
  224.   record += 2;
  225.   ai->sortOrder = get_byte(record);
  226.   record += 2;
  227.   ai->unsentMessage = get_long(record);
  228.   record += 4;
  229.   
  230.   ai->signature = 0; /*strdup(start + get_short(record));*/
  231.   
  232.   return;
  233. }
  234.  
  235. void pack_MailAppInfo(struct MailAppInfo * ai, unsigned char * record, int * len)
  236. {
  237.   int i;
  238.   unsigned char * start = record;
  239.   
  240.   set_short(record, ai->renamedcategories);
  241.   record += 2;
  242.   for(i=0;i<16;i++) {
  243.     memcpy(record, ai->CategoryName[i], 16);
  244.     record += 16;
  245.   }
  246.   memcpy(record, ai->CategoryID, 16);
  247.   record += 16;
  248.   set_long(record, 0); /* gapfil */
  249.   set_byte(record, ai->lastUniqueID);
  250.   record += 4;
  251.   set_short(record, ai->dirtyfieldlabels);
  252.   record += 2;
  253.   set_short(record, 0); /* gapfil */
  254.   set_byte(record, ai->sortOrder);
  255.   record += 2;
  256.   set_long(record, ai->unsentMessage);
  257.   record += 4;
  258.   
  259.   set_short(record, (record-start+2));
  260.   record += 2;
  261.   
  262.   if (ai->signature)
  263.     strcpy(record, ai->signature);
  264.   else
  265.     set_byte(record, 0);
  266.   record += strlen(record);
  267.  
  268.   if (len)
  269.     *len = record-start;
  270. }
  271.  
  272. void unpack_MailPrefs(struct MailPrefs * a, unsigned char * record, int len) {
  273.   a->synctype = get_byte(record);
  274.   record += 1;
  275.   a->gethigh = get_byte(record);
  276.   record += 1;
  277.   a->getcontaining = get_byte(record);
  278.   record += 2;
  279.   a->truncate = get_short(record);
  280.   record += 2;
  281.   
  282.   if (get_byte(record)) {
  283.     a->filterto = strdup(record);
  284.     record += strlen(record);
  285.   } else
  286.     a->filterto = 0;
  287.   record++;
  288.   if (get_byte(record)) {
  289.     a->filterfrom = strdup(record);
  290.     record += strlen(record);
  291.   } else
  292.     a->filterfrom = 0;
  293.   record++;
  294.   if (get_byte(record)) {
  295.     a->filtersubject = strdup(record);
  296.     record += strlen(record);
  297.   } else
  298.     a->filtersubject = 0;
  299.   record++;  
  300. }
  301.