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