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