From 7e0d5956b5bdf9de99ac25163464be8e24e84646 Mon Sep 17 00:00:00 2001 From: rakshasa Date: Mon, 12 Mar 2012 20:41:19 +0900 Subject: [PATCH] Use new logging buffer for complete log view. --- src/core/manager.cc | 31 ++++++++++++++++-------------- src/core/manager.h | 4 ++-- src/display/window_log.cc | 8 +++++--- src/display/window_log_complete.cc | 25 +++++++++--------------- src/display/window_log_complete.h | 13 ++++--------- src/main.cc | 3 ++- src/ui/download_list.cc | 2 +- src/ui/element_log_complete.cc | 14 +++++++++++++- src/ui/element_log_complete.h | 8 +++++--- 9 files changed, 58 insertions(+), 50 deletions(-) diff --git a/src/core/manager.cc b/src/core/manager.cc index 417187c6..75b717bd 100644 --- a/src/core/manager.cc +++ b/src/core/manager.cc @@ -103,34 +103,34 @@ Manager::handshake_log(const sockaddr* sa, int msg, int err, const torrent::Hash switch (msg) { case torrent::ConnectionManager::handshake_incoming: - m_logComplete.push_front("Incoming connection from " + peer + download); + push_log_complete("Incoming connection from " + peer + download); break; case torrent::ConnectionManager::handshake_outgoing: - m_logComplete.push_front("Outgoing connection to " + peer + download); + push_log_complete("Outgoing connection to " + peer + download); break; case torrent::ConnectionManager::handshake_outgoing_encrypted: - m_logComplete.push_front("Outgoing encrypted connection to " + peer + download); + push_log_complete("Outgoing encrypted connection to " + peer + download); break; case torrent::ConnectionManager::handshake_outgoing_proxy: - m_logComplete.push_front("Outgoing proxy connection to " + peer + download); + push_log_complete("Outgoing proxy connection to " + peer + download); break; case torrent::ConnectionManager::handshake_success: - m_logComplete.push_front("Successful handshake: " + peer + download); + push_log_complete("Successful handshake: " + peer + download); break; case torrent::ConnectionManager::handshake_dropped: - m_logComplete.push_front("Dropped handshake: " + peer + " - " + torrent::strerror(err) + download); + push_log_complete("Dropped handshake: " + peer + " - " + torrent::strerror(err) + download); break; case torrent::ConnectionManager::handshake_failed: - m_logComplete.push_front("Handshake failed: " + peer + " - " + torrent::strerror(err) + download); + push_log_complete("Handshake failed: " + peer + " - " + torrent::strerror(err) + download); break; case torrent::ConnectionManager::handshake_retry_plaintext: - m_logComplete.push_front("Trying again without encryption: " + peer + download); + push_log_complete("Trying again without encryption: " + peer + download); break; case torrent::ConnectionManager::handshake_retry_encrypted: - m_logComplete.push_front("Trying again encrypted: " + peer + download); + push_log_complete("Trying again encrypted: " + peer + download); break; default: - m_logComplete.push_front("Unknown handshake message for " + peer + download); + push_log_complete("Unknown handshake message for " + peer + download); break; } } @@ -141,14 +141,16 @@ Manager::push_log(const char* msg) { throw torrent::internal_error("Manager::push_log(...): Cannot call this function from other threads than 'main'."); m_logImportant.push_front(msg); - m_logComplete.push_front(msg); + push_log_complete(msg); m_log_important->lock_and_push_log(msg, strlen(msg), 0); + m_log_complete->lock_and_push_log(msg, strlen(msg), 0); } Manager::Manager() : m_hashingView(NULL), - m_log_important(torrent::log_open_log_buffer("important")) + m_log_important(torrent::log_open_log_buffer("important")), + m_log_complete(torrent::log_open_log_buffer("complete")) { m_downloadStore = new DownloadStore(); m_downloadList = new DownloadList(); @@ -165,6 +167,8 @@ Manager::~Manager() { torrent::Throttle::destroy_throttle(m_throttles["NULL"].first); delete m_downloadList; + // TODO: Clean up logs objects. + delete m_downloadStore; delete m_httpQueue; delete m_fileStatusCache; @@ -374,8 +378,7 @@ Manager::set_proxy_address(const std::string& addr) { void Manager::receive_http_failed(std::string msg) { - m_logImportant.push_front("Http download error: \"" + msg + "\""); - m_logComplete.push_front("Http download error: \"" + msg + "\""); + push_log_std("Http download error: \"" + msg + "\""); } void diff --git a/src/core/manager.h b/src/core/manager.h index be2d03bc..d7031f97 100644 --- a/src/core/manager.h +++ b/src/core/manager.h @@ -90,7 +90,7 @@ public: Log& get_log_complete() { return m_logComplete; } torrent::log_buffer* log_important() { return m_log_important; } - // torrent::log_buffer* log_complete() { return m_log_complete; } + torrent::log_buffer* log_complete() { return m_log_complete; } ThrottleMap& throttles() { return m_throttles; } torrent::ThrottlePair get_throttle(const std::string& name); @@ -160,7 +160,7 @@ private: Log m_logComplete; torrent::log_buffer* m_log_important; - // torrent::log_buffer* m_log_complete; + torrent::log_buffer* m_log_complete; }; // Meh, cleanup. diff --git a/src/display/window_log.cc b/src/display/window_log.cc index e6c15e0d..11540224 100644 --- a/src/display/window_log.cc +++ b/src/display/window_log.cc @@ -71,13 +71,15 @@ void WindowLog::redraw() { m_canvas->erase(); - int pos = 0; + int pos = m_canvas->height(); + + for (iterator itr = m_log->end(), last = find_older(); itr != last && pos > 0; --pos) { + itr--; - for (iterator itr = find_older(), last = m_log->end(); itr != last && pos < m_canvas->height(); ++itr, ++pos) { char buffer[16]; print_hhmmss_local(buffer, buffer + 16, static_cast(itr->timestamp)); - m_canvas->print(0, pos, "(%s) %s", buffer, itr->message.c_str()); + m_canvas->print(0, pos - 1, "(%s) %s", buffer, itr->message.c_str()); } } diff --git a/src/display/window_log_complete.cc b/src/display/window_log_complete.cc index cf142d91..c8f9c979 100644 --- a/src/display/window_log_complete.cc +++ b/src/display/window_log_complete.cc @@ -44,21 +44,17 @@ namespace display { -WindowLogComplete::WindowLogComplete(core::Log* l) : +WindowLogComplete::WindowLogComplete(torrent::log_buffer* l) : Window(new Canvas, 0, 30, 1, extent_full, extent_full), m_log(l) { - - // We're trying out scheduled tasks instead. - m_connUpdate = l->signal_update().connect(sigc::mem_fun(*this, &WindowLogComplete::receive_update)); } WindowLogComplete::~WindowLogComplete() { - m_connUpdate.disconnect(); } WindowLogComplete::iterator WindowLogComplete::find_older() { - return m_log->find_older(cachedTime - rak::timer::from_seconds(60)); + return m_log->find_older(cachedTime.seconds() - 60); } void @@ -70,28 +66,25 @@ WindowLogComplete::redraw() { int pos = m_canvas->height(); - for (core::Log::iterator itr = m_log->begin(), last = m_log->end(); itr != last && pos > 0; ++itr) { + for (iterator itr = m_log->end(), last = m_log->begin(); itr != last && pos > 0; ) { + itr--; + char buffer[16]; // Use an arbitrary min width of 60 for allowing multiple // lines. This should ensure we don't mess up the display when the // screen is shrunk too much. - unsigned int timeWidth = 3 + print_hhmmss_local(buffer, buffer + 16, static_cast(itr->first.seconds())) - buffer; + unsigned int timeWidth = 3 + print_hhmmss_local(buffer, buffer + 16, static_cast(itr->timestamp)) - buffer; unsigned int logWidth = m_canvas->width() > 60 ? (m_canvas->width() - timeWidth) : (60 - timeWidth); - unsigned int logHeight = (itr->second.size() + logWidth - 1) / logWidth; + unsigned int logHeight = (itr->message.size() + logWidth - 1) / logWidth; for (unsigned int j = logHeight; j > 0 && pos > 0; --j, --pos) if (j == 1) - m_canvas->print(0, pos - 1, "(%s) %s", buffer, itr->second.substr(0, m_canvas->width() - timeWidth).c_str()); + m_canvas->print(0, pos - 1, "(%s) %s", buffer, itr->message.substr(0, m_canvas->width() - timeWidth).c_str()); else - m_canvas->print(timeWidth, pos - 1, "%s", itr->second.substr(logWidth * (j - 1), m_canvas->width() - timeWidth).c_str()); + m_canvas->print(timeWidth, pos - 1, "%s", itr->message.substr(logWidth * (j - 1), m_canvas->width() - timeWidth).c_str()); } } -void -WindowLogComplete::receive_update() { - mark_dirty(); -} - } diff --git a/src/display/window_log_complete.h b/src/display/window_log_complete.h index 7b40a85f..b4c07b1d 100644 --- a/src/display/window_log_complete.h +++ b/src/display/window_log_complete.h @@ -37,9 +37,7 @@ #ifndef RTORRENT_DISPLAY_WINDOW_LOG_COMPLETE_H #define RTORRENT_DISPLAY_WINDOW_LOG_COMPLETE_H -#include - -#include "core/log.h" +#include #include "window.h" @@ -47,20 +45,17 @@ namespace display { class WindowLogComplete : public Window { public: - typedef core::Log::iterator iterator; + typedef torrent::log_buffer::const_iterator iterator; - WindowLogComplete(core::Log* l); + WindowLogComplete(torrent::log_buffer* l); ~WindowLogComplete(); virtual void redraw(); - void receive_update(); - private: inline iterator find_older(); - core::Log* m_log; - sigc::connection m_connUpdate; + torrent::log_buffer* m_log; }; } diff --git a/src/main.cc b/src/main.cc index 0af31ce9..2d50006c 100644 --- a/src/main.cc +++ b/src/main.cc @@ -208,7 +208,8 @@ main(int argc, char** argv) { // to process new non-socket events. SignalHandler::set_handler(SIGUSR1, sigc::ptr_fun(&do_nothing)); - torrent::log_add_group_output(torrent::LOG_INFO, "important"); + torrent::log_add_group_output(torrent::LOG_NOTICE, "important"); + torrent::log_add_group_output(torrent::LOG_INFO, "complete"); torrent::Poll::slot_create_poll() = std::tr1::bind(&core::create_poll); diff --git a/src/ui/download_list.cc b/src/ui/download_list.cc index 03642cdd..edacc9b1 100644 --- a/src/ui/download_list.cc +++ b/src/ui/download_list.cc @@ -74,7 +74,7 @@ DownloadList::DownloadList() : m_uiArray[DISPLAY_DOWNLOAD] = NULL; m_uiArray[DISPLAY_DOWNLOAD_LIST] = new ElementDownloadList(); - m_uiArray[DISPLAY_LOG] = new ElementLogComplete(&control->core()->get_log_complete()); + m_uiArray[DISPLAY_LOG] = new ElementLogComplete(control->core()->log_complete()); m_uiArray[DISPLAY_STRING_LIST] = new ElementStringList(); m_windowLog = new WLog(control->core()->log_important()); diff --git a/src/ui/element_log_complete.cc b/src/ui/element_log_complete.cc index 194645ce..45602a5c 100644 --- a/src/ui/element_log_complete.cc +++ b/src/ui/element_log_complete.cc @@ -37,6 +37,8 @@ #include "config.h" #include +#include +#include #include "display/frame.h" #include "display/manager.h" @@ -48,9 +50,13 @@ namespace ui { -ElementLogComplete::ElementLogComplete(core::Log* l) : +ElementLogComplete::ElementLogComplete(torrent::log_buffer* l) : m_window(NULL), m_log(l) { + + unsigned int signal_index = torrent::main_thread()->signal_bitfield()->add_signal(std::tr1::bind(&ElementLogComplete::received_update, this)); + + m_log->lock_and_set_update_slot(std::tr1::bind(&torrent::thread_base::send_event_signal, torrent::main_thread(), signal_index, false)); } void @@ -86,4 +92,10 @@ ElementLogComplete::window() { return m_window; } +void +ElementLogComplete::received_update() { + if (m_window != NULL) + m_window->mark_dirty(); +} + } diff --git a/src/ui/element_log_complete.h b/src/ui/element_log_complete.h index c02e2c4c..e867206d 100644 --- a/src/ui/element_log_complete.h +++ b/src/ui/element_log_complete.h @@ -37,7 +37,7 @@ #ifndef RTORRENT_UI_ELEMENT_LOG_COMPLETE_H #define RTORRENT_UI_ELEMENT_LOG_COMPLETE_H -#include "core/log.h" +#include #include "element_base.h" @@ -53,7 +53,7 @@ class ElementLogComplete : public ElementBase { public: typedef display::WindowLogComplete WLogComplete; - ElementLogComplete(core::Log* l); + ElementLogComplete(torrent::log_buffer* l); void activate(display::Frame* frame, bool focus = true); void disable(); @@ -61,9 +61,11 @@ public: display::Window* window(); private: + void received_update(); + WLogComplete* m_window; - core::Log* m_log; + torrent::log_buffer* m_log; }; }