summaryrefslogtreecommitdiff
path: root/src/syncevo/LocalTransportAgent.cpp
diff options
context:
space:
mode:
authorPatrick Ohly <patrick.ohly@intel.com>2011-02-16 09:50:43 +0100
committerPatrick Ohly <patrick.ohly@intel.com>2011-02-16 11:55:43 +0100
commit067a370f40f87239c3d3d39597d3a4eff2ccfb92 (patch)
tree8b968a12aaffe156b6738fdcf9d56aef8e234023 /src/syncevo/LocalTransportAgent.cpp
parent6a89155131ad0dead184ad434cf239f445d3d923 (diff)
local sync: better abort handling
When the glib event loop is left because the D-Bus client has requested an abort, the LocalTransportAgent should simply return a "failed" status and let the caller handle the abort. The return code of write/readMessage() must be able to convey that - extended from boolean to an enum. SyncContext did not do that correctly in server mode: the check for abort must be done before giving up by throwing an exception. The D-Bus test now checks that the right status is recorded (wasn't the case earlier).
Diffstat (limited to 'src/syncevo/LocalTransportAgent.cpp')
-rw-r--r--src/syncevo/LocalTransportAgent.cpp31
1 files changed, 16 insertions, 15 deletions
diff --git a/src/syncevo/LocalTransportAgent.cpp b/src/syncevo/LocalTransportAgent.cpp
index 5affc2c2..7bdc4eb5 100644
--- a/src/syncevo/LocalTransportAgent.cpp
+++ b/src/syncevo/LocalTransportAgent.cpp
@@ -375,7 +375,7 @@ void LocalTransportAgent::receiveChildReport()
try {
SE_LOG_DEBUG(NULL, NULL, "parent: receiving report");
m_receiveBuffer.m_used = 0;
- if (readMessage(statusFD, m_receiveBuffer, deadline())) {
+ if (readMessage(statusFD, m_receiveBuffer, deadline()) == ACTIVE) {
boost::shared_ptr<std::string> data(new std::string);
data->assign(m_receiveBuffer.m_message->m_data, m_receiveBuffer.m_message->getDataLength());
boost::shared_ptr<StringDataBlob> dump(new StringDataBlob("buffer", data, false));
@@ -439,10 +439,10 @@ void LocalTransportAgent::send(const char *data, size_t len)
m_receiveBuffer.m_used -= len;
}
m_sendStartTime = time(NULL);
- writeMessage(m_messageFD, m_sendType, data, len, deadline());
+ m_status = writeMessage(m_messageFD, m_sendType, data, len, deadline());
}
-bool LocalTransportAgent::writeMessage(int fd, Message::Type type, const char *data, size_t len, time_t deadline)
+TransportAgent::Status LocalTransportAgent::writeMessage(int fd, Message::Type type, const char *data, size_t len, time_t deadline)
{
Message header;
header.m_type = type;
@@ -465,7 +465,7 @@ bool LocalTransportAgent::writeMessage(int fd, Message::Type type, const char *d
if (deadline) {
time_t now = time(NULL);
if (now >= deadline) {
- return false;
+ return TIME_OUT;
} else {
timeout.tv_sec = deadline - now;
}
@@ -484,7 +484,8 @@ bool LocalTransportAgent::writeMessage(int fd, Message::Type type, const char *d
res = 1;
break;
case GLIB_SELECT_QUIT:
- SE_THROW("quit transport as requested as part of GLib event loop");
+ SE_LOG_DEBUG(NULL, NULL, "quit transport as requested as part of GLib event loop");
+ return FAILED;
break;
}
} else {
@@ -498,7 +499,7 @@ bool LocalTransportAgent::writeMessage(int fd, Message::Type type, const char *d
case 0:
SE_LOG_DEBUG(NULL, NULL, "%s: select timeout",
m_pid ? "parent" : "child");
- return false;
+ return TIME_OUT;
break;
case 1: {
ssize_t sent = writev(fd, vec, 2);
@@ -533,7 +534,7 @@ bool LocalTransportAgent::writeMessage(int fd, Message::Type type, const char *d
SE_LOG_DEBUG(NULL, NULL, "%s: sending %ld bytes done",
m_pid ? "parent" : "child",
(long)len);
- return true;
+ return ACTIVE;
}
void LocalTransportAgent::cancel()
@@ -548,7 +549,8 @@ TransportAgent::Status LocalTransportAgent::wait(bool noReply)
m_status = INACTIVE;
} else {
if (!m_receiveBuffer.haveMessage()) {
- if (readMessage(m_messageFD, m_receiveBuffer, deadline())) {
+ m_status = readMessage(m_messageFD, m_receiveBuffer, deadline());
+ if (m_status == ACTIVE) {
// complete message received, check if it is SyncML
switch (m_receiveBuffer.m_message->m_type) {
case Message::MSG_SYNCML_XML:
@@ -560,8 +562,6 @@ TransportAgent::Status LocalTransportAgent::wait(bool noReply)
SE_THROW("unsupported message type");
break;
}
- } else {
- m_status = TIME_OUT;
}
}
}
@@ -569,7 +569,7 @@ TransportAgent::Status LocalTransportAgent::wait(bool noReply)
return m_status;
}
-bool LocalTransportAgent::readMessage(int fd, Buffer &buffer, time_t deadline)
+TransportAgent::Status LocalTransportAgent::readMessage(int fd, Buffer &buffer, time_t deadline)
{
while (!buffer.haveMessage()) {
int res = 0;
@@ -580,7 +580,7 @@ bool LocalTransportAgent::readMessage(int fd, Buffer &buffer, time_t deadline)
time_t now = time(NULL);
if (now >= deadline) {
// already too late
- return false;
+ return TIME_OUT;
} else {
timeout.tv_sec = deadline - now;
}
@@ -599,7 +599,8 @@ bool LocalTransportAgent::readMessage(int fd, Buffer &buffer, time_t deadline)
res = 1;
break;
case GLIB_SELECT_QUIT:
- SE_THROW("quit transport as requested as part of GLib event loop");
+ SE_LOG_DEBUG(NULL, NULL, "quit transport as requested as part of GLib event loop");
+ return FAILED;
break;
}
} else {
@@ -614,7 +615,7 @@ bool LocalTransportAgent::readMessage(int fd, Buffer &buffer, time_t deadline)
case 0:
SE_LOG_DEBUG(NULL, NULL, "%s: select timeout",
m_pid ? "parent" : "child");
- return false;
+ return TIME_OUT;
break;
case 1: {
// data ready, ensure that buffer is available
@@ -671,7 +672,7 @@ bool LocalTransportAgent::readMessage(int fd, Buffer &buffer, time_t deadline)
}
}
- return true;
+ return ACTIVE;
}
void LocalTransportAgent::getReply(const char *&data, size_t &len, std::string &contentType)