|
|
@ -84,7 +84,61 @@ namespace pEpMIME |
|
|
|
return o; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
// a shallow copy of pEpEngine's struct message with own opt_fields
|
|
|
|
class MessageCopy |
|
|
|
{ |
|
|
|
public: |
|
|
|
MessageCopy(const message* _msg_orig) |
|
|
|
: msg_orig(_msg_orig) |
|
|
|
, msg_copy(*msg_orig) |
|
|
|
{ |
|
|
|
if(msg_orig->opt_fields) |
|
|
|
{ |
|
|
|
msg_copy.opt_fields = stringpair_list_dup(msg_orig->opt_fields); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void add_header(sv key, sv value) |
|
|
|
{ |
|
|
|
stringpair_t* sp = new_stringpair(key.data(), value.data()); |
|
|
|
if(sp==nullptr) |
|
|
|
{ |
|
|
|
throw std::runtime_error("Out of memory. new_stringpair() in add_header() fails."); |
|
|
|
} |
|
|
|
|
|
|
|
auto success = stringpair_list_add(msg_copy.opt_fields, sp); |
|
|
|
if(!success) |
|
|
|
{ |
|
|
|
free_stringpair(sp); |
|
|
|
throw std::runtime_error("Out of memory. stringpair_list_add() in add_header() fails."); |
|
|
|
} |
|
|
|
|
|
|
|
// there were no opt_fields, yet? So set them to the "last" (and only) element:
|
|
|
|
if(msg_copy.opt_fields == nullptr) |
|
|
|
{ |
|
|
|
msg_copy.opt_fields = success; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Neither copy nor move!
|
|
|
|
MessageCopy(const MessageCopy&) = delete; |
|
|
|
MessageCopy(MessageCopy&&) = delete; |
|
|
|
|
|
|
|
~MessageCopy() |
|
|
|
{ |
|
|
|
free_stringpair_list(msg_copy.opt_fields); |
|
|
|
msg_copy.opt_fields = nullptr; |
|
|
|
} |
|
|
|
|
|
|
|
operator const message* () const { return &msg_copy; } |
|
|
|
const message* operator->() const { return &msg_copy; } |
|
|
|
|
|
|
|
private: |
|
|
|
const message* msg_orig; |
|
|
|
message msg_copy; |
|
|
|
}; |
|
|
|
|
|
|
|
} // end of anonymous namespace
|
|
|
|
|
|
|
|
|
|
|
|
template<class LineEnding> |
|
|
@ -153,12 +207,18 @@ message* parse_message(const char* mime_text, size_t length, bool* raise_attachm |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
char* generate_message(const message* msg, bool omit_fields, bool has_pEp_msg_attachment) |
|
|
|
char* generate_message(const message* msg_orig, bool omit_fields, bool has_pEp_msg_attachment) |
|
|
|
{ |
|
|
|
if(msg == nullptr) |
|
|
|
if(msg_orig == nullptr) |
|
|
|
return nullptr; |
|
|
|
|
|
|
|
LOG << "GEN_MSG omit=" << omit_fields << ", has_pEp_msg_att=" << has_pEp_msg_attachment << std::endl; |
|
|
|
MessageCopy msg{msg_orig}; |
|
|
|
|
|
|
|
if(has_pEp_msg_attachment) |
|
|
|
{ |
|
|
|
msg.add_header(Pseudo_Header_Forwarded, "no"); |
|
|
|
} |
|
|
|
|
|
|
|
const auto attachments = parse_attachments(msg->attachments); |
|
|
|
const unsigned inline_attachments = std::count_if( |
|
|
@ -206,7 +266,7 @@ char* generate_message(const message* msg, bool omit_fields, bool has_pEp_msg_at |
|
|
|
default: |
|
|
|
throw std::logic_error("Determinant ouf of range 0...15: det=" + std::to_string(det) ); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return new_string( smsg.data(), smsg.size() ); // make a C-compatible copy allocated by the "right" allocator. *sigh*
|
|
|
|
} |
|
|
|
|
|
|
|