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