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