diff options
author | Gaute Hope <eg@gaute.vetsj.com> | 2018-10-20 09:26:13 +0200 |
---|---|---|
committer | Gaute Hope <eg@gaute.vetsj.com> | 2018-10-20 20:46:52 +0200 |
commit | 2aa0d47bfcfb8ca494d4b831b53dcad590c0736b (patch) | |
tree | d15e5753a541fb9dcb9dd8c40b156b069b9aa04b | |
parent | b41f3451448b606a51007b51066fdba080a6a386 (diff) |
cm: use GMimeStreamMem to avoid writing tmp file
Following classes updated to use mem:
* EditMessage
* RawMessage
* Message
test in test_composed_message
-rw-r--r-- | src/compose_message.cc | 12 | ||||
-rw-r--r-- | src/compose_message.hh | 1 | ||||
-rw-r--r-- | src/message_thread.cc | 23 | ||||
-rw-r--r-- | src/message_thread.hh | 2 | ||||
-rw-r--r-- | src/modes/edit_message.cc | 19 | ||||
-rw-r--r-- | src/modes/raw_message.cc | 6 | ||||
-rw-r--r-- | tests/test_composed_message.cc | 31 |
7 files changed, 86 insertions, 8 deletions
diff --git a/src/compose_message.cc b/src/compose_message.cc index 20d23dd..e90c6f0 100644 --- a/src/compose_message.cc +++ b/src/compose_message.cc @@ -731,6 +731,18 @@ namespace Astroid { LOG (debug) << "cm: wrote file: " << fname; } + void ComposeMessage::write (GMimeStream * stream) { + g_object_ref (stream); + + g_mime_object_write_to_stream (GMIME_OBJECT(message), g_mime_format_options_get_default (), stream); + g_mime_stream_flush (stream); + g_mime_stream_seek (stream, 0, GMIME_STREAM_SEEK_SET); + + g_object_unref(stream); + + LOG (debug) << "cm: wrote to stream."; + } + ComposeMessage::Attachment::Attachment () { } diff --git a/src/compose_message.hh b/src/compose_message.hh index ca687c6..655dccd 100644 --- a/src/compose_message.hh +++ b/src/compose_message.hh @@ -93,6 +93,7 @@ namespace Astroid { bool cancel_sending (); ustring write_tmp (); // write message to tmpfile void write (ustring); // write message to some file + void write (GMimeStream *); // write to stream /* encryption */ bool encryption_success = false; diff --git a/src/message_thread.cc b/src/message_thread.cc index 134ccd1..e562127 100644 --- a/src/message_thread.cc +++ b/src/message_thread.cc @@ -99,6 +99,23 @@ namespace Astroid { load_message (_msg); } + Message::Message (GMimeStream * s) { + LOG (info) << "msg: loading message from GMimeStream."; + in_notmuch = false; + has_file = false; + missing_content = false; + + g_object_ref (s); + GMimeParser * parser = g_mime_parser_new_with_stream (s); + GMimeMessage * _message = g_mime_parser_construct_message (parser, g_mime_parser_options_get_default ()); + + load_message (_message); + + g_object_unref (_message); + g_object_unref (s); + g_object_unref (parser); + } + Message::~Message () { LOG (debug) << "ms: deconstruct"; if (message) g_object_unref (message); @@ -971,6 +988,12 @@ namespace Astroid { } } + void MessageThread::add_message (refptr<Message> m) { + if (!first_subject_set) set_first_subject (m->subject); + m->subject_is_different = subject_is_different (m->subject); + messages.push_back (m); + } + std::vector<refptr<Message>> MessageThread::messages_by_time () { auto f = [&] (refptr<Message> a, refptr<Message> b) { return a->time < b->time; diff --git a/src/message_thread.hh b/src/message_thread.hh index 15c8075..eca9225 100644 --- a/src/message_thread.hh +++ b/src/message_thread.hh @@ -17,6 +17,7 @@ namespace Astroid { Message (ustring _mid, ustring _fname); Message (notmuch_message_t *, int _level); Message (GMimeMessage *); + Message (GMimeStream *); Message (refptr<NotmuchMessage>, int _level = 0); ~Message (); @@ -145,6 +146,7 @@ namespace Astroid { void load_messages (Db *); void add_message (ustring); void add_message (refptr<Chunk>); + void add_message (refptr<Message>); }; } diff --git a/src/modes/edit_message.cc b/src/modes/edit_message.cc index f563531..07285fa 100644 --- a/src/modes/edit_message.cc +++ b/src/modes/edit_message.cc @@ -337,10 +337,14 @@ namespace Astroid { [&] (Key) { /* view raw source of to be sent message */ ComposeMessage * c = make_message (); - ustring tmpf = c->write_tmp (); - main_window->add_mode (new RawMessage (main_window, tmpf.c_str(), true)); - /* tmp file deleted by RawMessage */ + GMimeStream * m = g_mime_stream_mem_new (); + assert (g_mime_stream_mem_get_owner (GMIME_STREAM_MEM(m)) == true); + c->write (m); + + main_window->add_mode (new RawMessage (main_window, refptr<Message>(new Message(m)))); + + g_object_unref (m); delete c; @@ -806,16 +810,17 @@ namespace Astroid { subject = c->subject; body = ustring(c->body.str()); - ustring tmpf = c->write_tmp (); + GMimeStream * m = g_mime_stream_mem_new (); + assert (g_mime_stream_mem_get_owner (GMIME_STREAM_MEM(m)) == true); + c->write (m); auto msgt = refptr<MessageThread>(new MessageThread()); - msgt->add_message (tmpf); + msgt->add_message (refptr<Message>(new Message(m))); thread_view->load_message_thread (msgt); + g_object_unref (m); delete c; - unlink (tmpf.c_str()); - in_read = false; } diff --git a/src/modes/raw_message.cc b/src/modes/raw_message.cc index ed8dece..95b80c3 100644 --- a/src/modes/raw_message.cc +++ b/src/modes/raw_message.cc @@ -132,7 +132,11 @@ namespace Astroid { stringstream s; /* add filenames */ - s << "Filename: " << msg->fname << endl << endl; + if (msg->has_file) { + s << "Filename: " << msg->fname << endl << endl; + } else { + s << "Filename: (none, memory)"<< endl << endl; + } auto c = msg->raw_contents (); auto cnv = UstringUtils::bytearray_to_ustring (c); diff --git a/tests/test_composed_message.cc b/tests/test_composed_message.cc index b9411d4..792d4d0 100644 --- a/tests/test_composed_message.cc +++ b/tests/test_composed_message.cc @@ -52,7 +52,38 @@ BOOST_AUTO_TEST_SUITE(Composing) unlink (fn.c_str ()); teardown (); + } + + BOOST_AUTO_TEST_CASE (compose_test_mem) + { + using Astroid::ComposeMessage; + using Astroid::Message; + setup (); + + ComposeMessage * c = new ComposeMessage (); + + ustring bdy = "This is test: æøå.\n > testing\ntesting\n..."; + + LOG (trace) << "cm: writing utf-8 text to message body: " << bdy; + c->body << bdy; + c->build (); + c->finalize (); + + GMimeStream * ms = g_mime_stream_mem_new (); + assert (g_mime_stream_mem_get_owner (GMIME_STREAM_MEM(ms)) == true); + c->write (ms); + + Message m (ms); + + delete c; + g_object_unref (ms); + + ustring rbdy = m.plain_text (false); + + BOOST_CHECK_MESSAGE (bdy == rbdy, "message reading produces the same output as compose message input"); + + teardown (); } BOOST_AUTO_TEST_CASE (compose_test_references) |