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