summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGaute Hope <eg@gaute.vetsj.com>2018-10-20 09:26:13 +0200
committerGaute Hope <eg@gaute.vetsj.com>2018-10-20 20:46:52 +0200
commit2aa0d47bfcfb8ca494d4b831b53dcad590c0736b (patch)
treed15e5753a541fb9dcb9dd8c40b156b069b9aa04b
parentb41f3451448b606a51007b51066fdba080a6a386 (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.cc12
-rw-r--r--src/compose_message.hh1
-rw-r--r--src/message_thread.cc23
-rw-r--r--src/message_thread.hh2
-rw-r--r--src/modes/edit_message.cc19
-rw-r--r--src/modes/raw_message.cc6
-rw-r--r--tests/test_composed_message.cc31
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)