src/message.c
author Volker Birk <vb@pep-project.org>
Wed, 29 Apr 2015 14:51:33 +0200
changeset 229 313d152239bf
parent 125 5119178815d8
child 281 9f7691853773
permissions -rw-r--r--
fixing preprocessor
     1 #include "pEp_internal.h"
     2 
     3 #include <stdlib.h>
     4 #include <string.h>
     5 #include <assert.h>
     6 
     7 #include "message.h"
     8 
     9 DYNAMIC_API message *new_message(
    10         PEP_msg_direction dir,
    11         pEp_identity *from,
    12         identity_list *to,
    13         const char *shortmsg
    14     )
    15 {
    16     message *msg = calloc(1, sizeof(message));
    17     assert(msg);
    18     if (msg == NULL)
    19         return NULL;
    20 
    21     if (shortmsg) {
    22         msg->shortmsg = strdup(shortmsg);
    23         assert(msg->shortmsg);
    24         if (msg->shortmsg == NULL) {
    25             free(msg);
    26             return NULL;
    27         }
    28     }
    29 
    30     msg->dir = dir;
    31     msg->from = from;
    32     msg->to = to;
    33 
    34     stringpair_t version;
    35     version.key = "X-pEp-Version";
    36     version.value = PEP_VERSION;
    37 
    38     msg->opt_fields = new_stringpair_list(&version);
    39     if (msg->opt_fields == NULL) {
    40         free_message(msg);
    41         return NULL;
    42     }
    43 
    44     return msg;
    45 }
    46 
    47 DYNAMIC_API void free_message(message *msg)
    48 {
    49     if (msg) {
    50         free(msg->id);
    51         free(msg->shortmsg);
    52         free(msg->longmsg);
    53         free(msg->longmsg_formatted);
    54         free_bloblist(msg->attachments);
    55         free_timestamp(msg->sent);
    56         free_timestamp(msg->recv);
    57         free_identity(msg->from);
    58         free_identity_list(msg->to);
    59         free_identity(msg->recv_by);
    60         free_identity_list(msg->cc);
    61         free_identity_list(msg->bcc);
    62         free_identity_list(msg->reply_to);
    63         free_stringlist(msg->in_reply_to);
    64         free_stringlist(msg->references);
    65         free_stringlist(msg->keywords);
    66         free(msg->comments);
    67         free_stringpair_list(msg->opt_fields);
    68         free(msg);
    69     }
    70 }
    71 
    72 DYNAMIC_API message * message_dup(const message *src)
    73 {
    74     message * msg = NULL;
    75     pEp_identity * from = NULL;
    76     identity_list * to = NULL;
    77 
    78     assert(src);
    79 
    80     from = identity_dup(src->from);
    81     if (from == NULL)
    82         goto enomem;
    83 
    84     to = identity_list_dup(src->to);
    85     if (to == NULL)
    86         goto enomem;
    87 
    88     msg = new_message(src->dir, from, to, src->shortmsg);
    89     if (msg == NULL)
    90         goto enomem;
    91 
    92     if (src->id) {
    93         msg->id = strdup(src->id);
    94         assert(msg->id);
    95         if (msg->id == NULL)
    96             goto enomem;
    97     }
    98 
    99     if (src->longmsg) {
   100         msg->longmsg = strdup(src->longmsg);
   101         assert(msg->longmsg);
   102         if (msg->longmsg == NULL)
   103             goto enomem;
   104     }
   105     
   106     if (src->longmsg_formatted) {
   107         msg->longmsg_formatted = strdup(src->longmsg_formatted);
   108         assert(msg->longmsg_formatted);
   109         if (msg->longmsg_formatted == NULL)
   110             goto enomem;
   111     }
   112 
   113     if (src->attachments) {
   114         msg->attachments = bloblist_dup(src->attachments);
   115         if (msg->attachments == NULL)
   116             goto enomem;
   117     }
   118 
   119     msg->rawmsg_ref = src->rawmsg_ref;
   120     msg->rawmsg_size = src->rawmsg_size;
   121 
   122     if (src->sent) {
   123         msg->sent = timestamp_dup(src->sent);
   124         if (msg->sent == NULL)
   125             goto enomem;
   126     }
   127 
   128     if (src->recv) {
   129         msg->recv = timestamp_dup(src->recv);
   130         if (msg->recv == NULL)
   131             goto enomem;
   132     }
   133 
   134     if (src->recv_by) {
   135         msg->recv_by = identity_dup(src->recv_by);
   136         if (msg->recv_by == NULL)
   137             goto enomem;
   138     }
   139 
   140     if (src->cc) {
   141         msg->cc = identity_list_dup(src->cc);
   142         if (msg->cc == NULL)
   143             goto enomem;
   144     }
   145 
   146     if (src->bcc) {
   147         msg->bcc = identity_list_dup(src->bcc);
   148         if (msg->bcc == NULL)
   149             goto enomem;
   150     }
   151 
   152     if (src->reply_to) {
   153         msg->reply_to = identity_list_dup(src->reply_to);
   154         if (msg->reply_to == NULL)
   155             goto enomem;
   156     }
   157 
   158     if (src->in_reply_to) {
   159         msg->in_reply_to = stringlist_dup(src->in_reply_to);
   160         assert(msg->in_reply_to);
   161         if (msg->in_reply_to == NULL)
   162             goto enomem;
   163     }
   164 
   165     msg->refering_msg_ref = src->refering_msg_ref;
   166     
   167     if (src->references) {
   168         msg->references = stringlist_dup(src->references);
   169         if (msg->references == NULL)
   170             goto enomem;
   171     }
   172 
   173     if (src->refered_by) {
   174         msg->refered_by = message_ref_list_dup(src->refered_by);
   175         if (msg->refered_by == NULL)
   176             goto enomem;
   177     }
   178 
   179     if (src->keywords) {
   180         msg->keywords = stringlist_dup(src->keywords);
   181         if (msg->keywords == NULL)
   182             goto enomem;
   183     }
   184 
   185     if (src->comments) {
   186         msg->comments = strdup(src->comments);
   187         assert(msg->comments);
   188         if (msg->comments == NULL)
   189             goto enomem;
   190     }
   191 
   192     if (src->opt_fields) {
   193         msg->opt_fields = stringpair_list_dup(src->opt_fields);
   194         if (msg->opt_fields == NULL)
   195             goto enomem;
   196     }
   197 
   198     msg->enc_format = src->enc_format;
   199 
   200     return msg;
   201 
   202 enomem:
   203     if (msg) {
   204         free_message(msg);
   205     }
   206     else {
   207         free_identity(from);
   208         free_identity_list(to);
   209     }
   210 
   211     return NULL;
   212 }
   213 
   214 DYNAMIC_API message_ref_list *new_message_ref_list(message *msg)
   215 {
   216     message_ref_list *msg_list = calloc(1, sizeof(message_ref_list));
   217     assert(msg_list);
   218     if (msg_list == NULL)
   219         return NULL;
   220 
   221     msg_list->msg_ref = msg;
   222 
   223     return msg_list;
   224 }
   225 
   226 DYNAMIC_API void free_message_ref_list(message_ref_list *msg_list)
   227 {
   228     if (msg_list) {
   229         free_message_ref_list(msg_list->next);
   230         free(msg_list);
   231     }
   232 }
   233 
   234 DYNAMIC_API message_ref_list *message_ref_list_dup(
   235         const message_ref_list *src
   236     )
   237 {
   238     message_ref_list * msg_list = NULL;
   239 
   240     assert(src);
   241 
   242     msg_list = new_message_ref_list(src->msg_ref);
   243     if (msg_list == NULL)
   244         goto enomem;
   245 
   246     if (src->next) {
   247         msg_list->next = message_ref_list_dup(src->next);
   248         if (msg_list->next == NULL)
   249             goto enomem;
   250     }
   251 
   252     return msg_list;
   253 
   254 enomem:
   255     free_message_ref_list(msg_list);
   256     return NULL;
   257 }
   258 
   259 DYNAMIC_API message_ref_list *message_ref_list_add(message_ref_list *msg_list, message *msg)
   260 {
   261     assert(msg);
   262 
   263     if (msg_list == NULL)
   264         return new_message_ref_list(msg);
   265 
   266     if (msg_list->msg_ref == NULL) {
   267         msg_list->msg_ref = msg;
   268         return msg_list;
   269     }
   270     else if (msg_list->next == NULL) {
   271         msg_list->next = new_message_ref_list(msg);
   272         assert(msg_list->next);
   273         return msg_list->next;
   274     }
   275     else {
   276         return message_ref_list_add(msg_list->next, msg);
   277     }
   278 }
   279