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