Skip to content

Commit

Permalink
cm, em: delay sending of message configurable amount of time, in orde…
Browse files Browse the repository at this point in the history
…r to cancel wrongly sent messages
  • Loading branch information
gauteh committed Feb 22, 2017
1 parent 53cdf94 commit 44d8b42
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 7 deletions.
3 changes: 3 additions & 0 deletions History.txt
Expand Up @@ -15,6 +15,9 @@
* Add optional drop-down terminal ('|') which has session-persistent
working directory. Will silently be disabled if VTE is missing.

* Delay sending of message with configured time, in order to be able to
cancel wrongly sent messages.

== v0.7 / 2017-01-02

* Messages are marked unread after a delay (default 2 sec) in
Expand Down
64 changes: 63 additions & 1 deletion src/compose_message.cc
Expand Up @@ -33,6 +33,8 @@ namespace Astroid {

d_message_sent.connect (
sigc::mem_fun (this, &ComposeMessage::message_sent_event));
d_message_send_status.connect (
sigc::mem_fun (this, &ComposeMessage::message_send_status_event));
}

ComposeMessage::~ComposeMessage () {
Expand Down Expand Up @@ -312,6 +314,8 @@ namespace Astroid {
}

bool ComposeMessage::cancel_sending () {
cancel_send_during_delay = true;

if (pid > 0) {
LOG (warn) << "cm: cancel sendmail pid: " << pid;

Expand All @@ -330,6 +334,7 @@ namespace Astroid {
void ComposeMessage::send_threaded ()
{
LOG (info) << "cm: sending (threaded)..";
cancel_send_during_delay = false;
Glib::Threads::Thread::create (
[&] () {
this->send (true);
Expand All @@ -339,6 +344,33 @@ namespace Astroid {
bool ComposeMessage::send (bool output) {
dryrun = astroid->config().get<bool>("astroid.debug.dryrun_sending");

message_send_status_warn = false;
message_send_status_msg = "";

unsigned int delay = astroid->config ().get<unsigned int> ("mail.send_delay");
while (delay > 0 && !cancel_send_during_delay) {
LOG (debug) << "cm: sending in " << delay << " seconds..";
message_send_status_msg = ustring::compose ("sending message in %1 seconds..", delay);
d_message_send_status ();
sleep (1);
delay--;
}

if (cancel_send_during_delay) {
LOG (error) << "cm: cancelled sending before message could be sent.";
message_send_status_msg = "sending message.. cancelled before sending.";
message_send_status_warn = true;
d_message_send_status ();

message_sent_result = false;
d_message_sent ();
pid = 0;
return false;
}

message_send_status_msg = "sending message..";
d_message_send_status ();

/* Send the message */
if (!dryrun) {
if (output)
Expand All @@ -360,6 +392,11 @@ namespace Astroid {
} catch (Glib::SpawnError &ex) {
if (output)
LOG (error) << "cm: could not send message!";

message_send_status_msg = "message could not be sent!";
message_send_status_warn = true;
d_message_send_status ();

message_sent_result = false;
d_message_sent ();
pid = 0;
Expand All @@ -385,7 +422,6 @@ namespace Astroid {
fclose (sendMailPipe);

/* wait for sendmail to finish */

int status;
waitpid (pid, &status, 0);
g_spawn_close_pid (pid);
Expand All @@ -404,6 +440,10 @@ namespace Astroid {
write (save_to.c_str());
}

message_send_status_msg = "message sent successfully!";
message_send_status_warn = false;
d_message_send_status ();

pid = 0;
message_sent_result = true;
d_message_sent ();
Expand All @@ -412,6 +452,11 @@ namespace Astroid {
} else {
if (output)
LOG (error) << "cm: could not send message!";

message_send_status_msg = "message could not be sent!";
message_send_status_warn = true;
d_message_send_status ();

message_sent_result = false;
d_message_sent ();
pid = 0;
Expand All @@ -421,6 +466,9 @@ namespace Astroid {
ustring fname = "/tmp/" + id;
if (output)
LOG (warn) << "cm: sending disabled in config, message written to: " << fname;
message_send_status_msg = "sending disabled, message written to: " + fname;
message_send_status_warn = true;
d_message_send_status ();

write (fname);
message_sent_result = false;
Expand Down Expand Up @@ -491,6 +539,20 @@ namespace Astroid {
emit_message_sent (message_sent_result);
}

ComposeMessage::type_message_send_status
ComposeMessage::message_send_status ()
{
return m_message_send_status;
}

void ComposeMessage::emit_message_send_status (bool warn, ustring msg) {
m_message_send_status.emit (warn, msg);
}

void ComposeMessage::message_send_status_event () {
emit_message_send_status (message_send_status_warn, message_send_status_msg);
}

ustring ComposeMessage::write_tmp () {
char * temporaryFilePath;

Expand Down
14 changes: 14 additions & 0 deletions src/compose_message.hh
Expand Up @@ -97,6 +97,7 @@ namespace Astroid {
bool dryrun;

/* sendmail process */
bool cancel_send_during_delay = false;
int pid;
int stdin;
int stdout;
Expand All @@ -118,7 +119,20 @@ namespace Astroid {
void message_sent_event ();
Glib::Dispatcher d_message_sent;

/* message send status update */
typedef sigc::signal <void, bool, ustring> type_message_send_status;
type_message_send_status message_send_status ();

void emit_message_send_status (bool, ustring);

bool message_send_status_warn = false;
ustring message_send_status_msg = "";

void message_send_status_event ();
Glib::Dispatcher d_message_send_status;

protected:
type_message_sent m_message_sent;
type_message_send_status m_message_send_status;
};
}
1 change: 1 addition & 0 deletions src/config.cc
Expand Up @@ -200,6 +200,7 @@ namespace Astroid {
default_config.put ("mail.message_id_fqdn", ""); // custom fqdn for the message id: default: local hostname
default_config.put ("mail.message_id_user", ""); // custom user for the message id: default: 'astroid'
default_config.put ("mail.user_agent", "default");
default_config.put ("mail.send_delay", 2); // wait seconds before sending, allowing to cancel

/* polling */
default_config.put ("poll.interval", Poll::DEFAULT_POLL_INTERVAL); // seconds
Expand Down
20 changes: 14 additions & 6 deletions src/modes/edit_message.cc
Expand Up @@ -958,6 +958,8 @@ namespace Astroid {

c->message_sent().connect (
sigc::mem_fun (this, &EditMessage::send_message_finished));
c->message_send_status ().connect (
sigc::mem_fun (this, &EditMessage::update_send_message_status));

fields_hide ();
sending_in_progress.store (true);
Expand All @@ -980,6 +982,18 @@ namespace Astroid {
return true;
}

void EditMessage::update_send_message_status (bool warn, ustring msg) {
if (warn) {
info_str = "";
warning_str = msg;
} else {
info_str = msg;
warning_str = "";
}

on_tv_ready ();
}

void EditMessage::send_message_finished (bool result_from_sender) {
LOG (info) << "em: message sending done.";
status_icon_visible = true;
Expand All @@ -988,8 +1002,6 @@ namespace Astroid {
Glib::RefPtr<Gdk::Pixbuf> pixbuf;

if (result_from_sender) {
info_str = "message sent successfully!";
warning_str = "";
lock_message_after_send ();

pixbuf = theme->load_icon (
Expand All @@ -1004,8 +1016,6 @@ namespace Astroid {
}

} else {
warning_str = "message could not be sent!";
info_str = "";
fields_show ();

pixbuf = theme->load_icon (
Expand All @@ -1019,8 +1029,6 @@ namespace Astroid {

delete sending_message;

on_tv_ready ();

emit_message_sent_attempt (result_from_sender);
}

Expand Down
1 change: 1 addition & 0 deletions src/modes/edit_message.hh
Expand Up @@ -96,6 +96,7 @@ namespace Astroid {
ComposeMessage * sending_message;
std::atomic<bool> sending_in_progress;
void send_message_finished (bool result);
void update_send_message_status (bool warn, ustring msg);

/* make a draft message that can be edited */
void prepare_message ();
Expand Down

0 comments on commit 44d8b42

Please sign in to comment.