diff --git a/message_cache.cc b/message_cache.cc
index 9d15865..7f01bd9 100644
--- a/message_cache.cc
+++ b/message_cache.cc
@@ -17,23 +17,49 @@ namespace pEp {
}
PEP_STATUS MessageCache::cache_mime_encode_message(
- which one,
+ int one,
const message * msg,
bool omit_fields,
char **mimetext,
bool has_pEp_msg_attachment
)
{
- return message_cache.mime_encode_message(one, msg, omit_fields,
+ which _one = (which) one;
+ return message_cache.mime_encode_message(_one, msg, omit_fields,
mimetext, has_pEp_msg_attachment);
}
- void MessageCache::cache_release(std::string id)
+ PEP_STATUS MessageCache::cache_mime_decode_message(
+ const char *mimetext,
+ size_t size,
+ message **msg,
+ bool* has_possible_pEp_msg
+ )
+ {
+ return message_cache.mime_decode_message(mimetext, size, msg,
+ has_possible_pEp_msg);
+ }
+
+ PEP_STATUS MessageCache::cache_encrypt_message(
+ PEP_SESSION session,
+ message *src,
+ stringlist_t *extra,
+ message **dst,
+ PEP_enc_format enc_format,
+ PEP_encrypt_flags_t flags
+ )
+ {
+ return message_cache.encrypt_message(session, src, extra, dst,
+ enc_format, flags);
+ }
+
+ PEP_STATUS MessageCache::cache_release(const char *id)
{
try {
- message_cache._cache.erase(id);
+ message_cache._cache.erase(std::string(id));
}
catch (...) { }
+ return PEP_STATUS_OK;
}
static char *dup(const char *src)
@@ -153,12 +179,11 @@ namespace pEp {
dst->id = dup(src->id);
- dst->shortmsg = dup(src->shortmsg);
-
- if (!emptystr(src->longmsg))
+ if (!emptystr(src->shortmsg))
+ dst->shortmsg = dup(src->shortmsg);
+ else if (!emptystr(src->longmsg))
dst->longmsg = dup("pEp");
-
- if (!emptystr(src->longmsg_formatted))
+ else if (!emptystr(src->longmsg_formatted))
dst->longmsg_formatted = dup("");
// attachments are never copied
@@ -214,8 +239,6 @@ namespace pEp {
::message *_dst = *dst;
*dst = empty_message_copy(_dst);
- message_cache._cache.emplace(std::make_pair(std::string(_src->id),
- cache_entry(_src, _dst)));
return status;
}
@@ -279,5 +302,69 @@ namespace pEp {
return status;
}
+
+ PEP_STATUS MessageCache::mime_decode_message(
+ const char *mimetext,
+ size_t size,
+ message **msg,
+ bool* has_possible_pEp_msg
+ )
+ {
+ ::message *_msg = nullptr;
+ PEP_STATUS status = ::mime_decode_message(mimetext, size, &_msg,
+ has_possible_pEp_msg);
+ if (status)
+ return status;
+
+ *msg = empty_message_copy(_msg);
+
+ message_cache._cache.emplace(std::make_pair(std::string(_msg->id),
+ cache_entry(_msg, nullptr)));
+
+ return status;
+ }
+
+ PEP_STATUS MessageCache::encrypt_message(
+ PEP_SESSION session,
+ message *src,
+ stringlist_t *extra,
+ message **dst,
+ PEP_enc_format enc_format,
+ PEP_encrypt_flags_t flags
+ )
+ {
+ ::message *_msg = message_cache._cache.at(src->id).src;
+
+ free(src->longmsg);
+ src->longmsg = _msg->longmsg;
+ _msg->longmsg = nullptr;
+
+ free(src->longmsg_formatted);
+ src->longmsg_formatted = _msg->longmsg_formatted;
+ _msg->longmsg_formatted = nullptr;
+
+ free_bloblist(src->attachments);
+ src->attachments = _msg->attachments;
+ _msg->attachments = nullptr;
+
+ ::message *_dst = nullptr;
+ PEP_STATUS status = ::encrypt_message(session, src, extra, &_dst,
+ enc_format, flags);
+
+ _msg->longmsg = src->longmsg;
+ src->longmsg = nullptr;
+
+ _msg->longmsg_formatted = src->longmsg_formatted;
+ src->longmsg_formatted = nullptr;
+
+ _msg->attachments = src->attachments;
+ src->attachments = nullptr;
+
+ *dst = empty_message_copy(_dst);
+ ::free_message(message_cache._cache.at(src->id).dst);
+ message_cache._cache.at(src->id).dst = _dst;
+
+ return status;
+ }
};
diff --git a/message_cache.hh b/message_cache.hh
index 7e4502b..2787db2 100644
--- a/message_cache.hh
+++ b/message_cache.hh
@@ -22,29 +22,24 @@ namespace pEp {
std::mutex _mtx;
public:
- static PEP_STATUS cache_decrypt_message(
- PEP_SESSION session,
- message *src,
- message **dst,
- stringlist_t **keylist,
- PEP_rating *rating,
- PEP_decrypt_flags_t *flags
- );
+ enum which { msg_src, msg_dst };
- enum which { msg_src, msg_dst };;
+ static PEP_STATUS cache_mime_decode_message(
+ const char *mimetext,
+ size_t size,
+ message **msg,
+ bool* has_possible_pEp_msg
+ );
static PEP_STATUS cache_mime_encode_message(
- which one,
+ int one,
const message * msg,
bool omit_fields,
char **mimetext,
bool has_pEp_msg_attachment
);
- static void cache_release(std::string id);
-
- protected:
- DYNAMIC_API PEP_STATUS decrypt_message(
+ static PEP_STATUS cache_decrypt_message(
PEP_SESSION session,
message *src,
message **dst,
@@ -53,7 +48,26 @@ namespace pEp {
PEP_decrypt_flags_t *flags
);
- DYNAMIC_API PEP_STATUS mime_encode_message(
+ static PEP_STATUS cache_encrypt_message(
+ PEP_SESSION session,
+ message *src,
+ stringlist_t *extra,
+ message **dst,
+ PEP_enc_format enc_format,
+ PEP_encrypt_flags_t flags
+ );
+
+ static PEP_STATUS cache_release(const char *id);
+
+ protected:
+ PEP_STATUS mime_decode_message(
+ const char *mimetext,
+ size_t size,
+ message **msg,
+ bool* has_possible_pEp_msg
+ );
+
+ PEP_STATUS mime_encode_message(
which one,
const message * src,
bool omit_fields,
@@ -61,6 +75,24 @@ namespace pEp {
bool has_pEp_msg_attachment
);
+ PEP_STATUS decrypt_message(
+ PEP_SESSION session,
+ message *src,
+ message **dst,
+ stringlist_t **keylist,
+ PEP_rating *rating,
+ PEP_decrypt_flags_t *flags
+ );
+
+ PEP_STATUS encrypt_message(
+ PEP_SESSION session,
+ message *src,
+ stringlist_t *extra,
+ message **dst,
+ PEP_enc_format enc_format,
+ PEP_encrypt_flags_t flags
+ );
+
static ::message *empty_message_copy(::message *src);
};
diff --git a/test/test_message_cache.cc b/test/test_message_cache.cc
index dfbbda5..2346903 100644
--- a/test/test_message_cache.cc
+++ b/test/test_message_cache.cc
@@ -14,48 +14,76 @@ int main()
pEp_identity *alice = ::new_identity("alice@mail.com", nullptr, PEP_OWN_USERID, "Alice");
::myself(session, alice);
- pEp_identity *bob = ::new_identity("bob@mail.com", nullptr, PEP_OWN_USERID, "Bob");
- ::update_identity(session, bob);
+ char *mime = strdup("From: Alice \n"
+ "To: Bob \n"
+ "Subject: short message\n"
+ "Message-ID: <42>\n"
+ "\n"
+ "long message\n");
- ::message *src = new_message(PEP_dir_incoming);
- src->from = identity_dup(alice);
- src->to = ::new_identity_list(::identity_dup(bob));
+ // add to cache
+
+ ::message *src = nullptr;
+ bool has_possible_pEp_msg;
+ status = MessageCache::cache_mime_decode_message(mime, strlen(mime), &src, &has_possible_pEp_msg);
+ assert(status == PEP_STATUS_OK);
- src->shortmsg = strdup("short message");
- assert(src->shortmsg);
+ status = ::myself(session, src->from);
+ assert(status == PEP_STATUS_OK);
- src->longmsg = strdup("long message");
- assert(src->longmsg);
+ ::update_identity(session, src->to->ident);
+ assert(status == PEP_STATUS_OK);
- src->longmsg_formatted = strdup("");
- assert(src->longmsg_formatted);
+ pEp_identity *bob = identity_dup(src->to->ident);
- src->attachments = new_bloblist(strdup("blobdata"), 8, "application/octet-stream", "blob.data");
- assert(src->attachments && src->attachments->value);
+ src->dir = PEP_dir_outgoing;
+ ::message *dst = nullptr;
+ status = MessageCache::cache_encrypt_message(session, src, nullptr, &dst, PEP_enc_PEP, 0);
+ assert(status != PEP_ILLEGAL_VALUE);
+
+ assert(src->longmsg == nullptr);
+ assert(src->attachments == nullptr);
+
+ assert(dst == nullptr);
+
+ // remove from cache
+
+ free(mime);
+ mime = nullptr;
+ status = MessageCache::cache_mime_encode_message(MessageCache::msg_src, src, false, &mime, false);
+ assert(status == PEP_STATUS_OK);
+
+ cout << mime << endl;
// add to cache
- ::message *dst = nullptr;
+ ::free_message(src);
+ src = nullptr;
+ status = MessageCache::cache_mime_decode_message(mime, strlen(mime), &src, &has_possible_pEp_msg);
+ assert(status == PEP_STATUS_OK);
+
+ assert(src->longmsg == nullptr);
+ assert(src->attachments == nullptr);
+
PEP_rating rating;
PEP_decrypt_flags_t flags = 0;
stringlist_t *keylist = nullptr;
- status = MessageCache::cache_decrypt_message(session, src, &dst, &keylist, &rating, &flags);
- assert(status == PEP_ILLEGAL_VALUE);
-
- src->id = strdup("42");
- assert(src->id);
status = MessageCache::cache_decrypt_message(session, src, &dst, &keylist, &rating, &flags);
assert(status != PEP_ILLEGAL_VALUE);
- assert(string(src->longmsg) == "pEp");
+ assert(src->longmsg == nullptr);
assert(src->attachments == nullptr);
// remove from cache
- char *mime = nullptr;
+ free(mime);
+ mime = nullptr;
status = MessageCache::cache_mime_encode_message(MessageCache::msg_src, src, false, &mime, false);
+ assert(src->longmsg == nullptr);
+ assert(src->attachments == nullptr);
+
cout << mime << endl;
free(mime);