diff --git a/src/display/Makefile.am b/src/display/Makefile.am index 674df477..bbc34ab6 100644 --- a/src/display/Makefile.am +++ b/src/display/Makefile.am @@ -11,6 +11,8 @@ libsub_display_a_SOURCES = \ utils.h \ window.cc \ window.h \ + window_download_chunks_seen.cc \ + window_download_chunks_seen.h \ window_download_list.cc \ window_download_list.h \ window_download_statusbar.cc \ diff --git a/src/display/window_download_chunks_seen.cc b/src/display/window_download_chunks_seen.cc new file mode 100644 index 00000000..84eaf034 --- /dev/null +++ b/src/display/window_download_chunks_seen.cc @@ -0,0 +1,84 @@ +// rTorrent - BitTorrent client +// Copyright (C) 2005-2006, Jari Sundell +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// In addition, as a special exception, the copyright holders give +// permission to link the code of portions of this program with the +// OpenSSL library under certain conditions as described in each +// individual source file, and distribute linked combinations +// including the two. +// +// You must obey the GNU General Public License in all respects for +// all of the code used other than OpenSSL. If you modify file(s) +// with this exception, you may extend this exception to your version +// of the file(s), but you are not obligated to do so. If you do not +// wish to do so, delete this exception statement from your version. +// If you delete this exception statement from all source files in the +// program, then also delete it here. +// +// Contact: Jari Sundell +// +// Skomakerveien 33 +// 3185 Skoppum, NORWAY + +#include "config.h" + +#include +#include + +#include "core/download.h" + +#include "window_download_chunks_seen.h" + +namespace display { + +WindowDownloadChunksSeen::WindowDownloadChunksSeen(core::Download* d) : + Window(new Canvas, true), + m_download(d) { +} + +void +WindowDownloadChunksSeen::redraw() { + // TODO: Make this depend on tracker signal. + m_slotSchedule(this, (cachedTime + rak::timer::from_seconds(10)).round_seconds()); + m_canvas->erase(); + + if (m_canvas->get_height() < 3 || m_canvas->get_width() < 10) + return; + + m_canvas->print(2, 0, "Chunks seen: [C/A %i/%i]", + (int)m_download->get_download().peers_complete(), + (int)m_download->get_download().peers_accounted()); + + const uint8_t* seen = m_download->get_download().chunks_seen(); + const uint8_t* last = seen + m_download->get_download().chunks_total(); + + if (seen == NULL) { + m_canvas->print(2, 2, "Not available."); + return; + } + + for (int y = 1; y < m_canvas->get_height() && seen != last; ++y) { + + for (int x = 2; x < m_canvas->get_width() && seen != last; ++x) { + m_canvas->print(x, y, "%c", rak::value_to_hexchar<0>(std::min(*seen, 0xF))); + + seen++; + } + } +} + +} diff --git a/src/display/window_download_chunks_seen.h b/src/display/window_download_chunks_seen.h new file mode 100644 index 00000000..f4635a42 --- /dev/null +++ b/src/display/window_download_chunks_seen.h @@ -0,0 +1,62 @@ +// rTorrent - BitTorrent client +// Copyright (C) 2005-2006, Jari Sundell +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// In addition, as a special exception, the copyright holders give +// permission to link the code of portions of this program with the +// OpenSSL library under certain conditions as described in each +// individual source file, and distribute linked combinations +// including the two. +// +// You must obey the GNU General Public License in all respects for +// all of the code used other than OpenSSL. If you modify file(s) +// with this exception, you may extend this exception to your version +// of the file(s), but you are not obligated to do so. If you do not +// wish to do so, delete this exception statement from your version. +// If you delete this exception statement from all source files in the +// program, then also delete it here. +// +// Contact: Jari Sundell +// +// Skomakerveien 33 +// 3185 Skoppum, NORWAY + +#ifndef RTORRENT_DISPLAY_WINDOW_DOWNLOAD_CHUNKS_SEEN_H +#define RTORRENT_DISPLAY_WINDOW_DOWNLOAD_CHUNKS_SEEN_H + +#include + +#include "window.h" + +namespace core { + class Download; +} + +namespace display { + +class WindowDownloadChunksSeen : public Window { +public: + WindowDownloadChunksSeen(core::Download* d); + + virtual void redraw(); + +private: + core::Download* m_download; +}; + +} + +#endif diff --git a/src/display/window_download_statusbar.cc b/src/display/window_download_statusbar.cc index 93f2ae68..621ea651 100644 --- a/src/display/window_download_statusbar.cc +++ b/src/display/window_download_statusbar.cc @@ -65,7 +65,7 @@ WindowDownloadStatusbar::redraw() { position = print_download_info(buffer, last, m_download); m_canvas->print(0, 0, "%s", buffer); - position = buffer + std::max(snprintf(buffer, last - buffer, "Peers: %i(%i) Min/Max: %i/%i Uploads: %i U/I/C: %i/%i/%i Failed: %i", + position = buffer + std::max(snprintf(buffer, last - buffer, "Peers: %i(%i) Min/Max: %i/%i Uploads: %i U/I/C/A: %i/%i/%i/%i Failed: %i", (int)m_download->get_download().peers_connected(), (int)m_download->get_download().peers_not_connected(), (int)m_download->get_download().peers_min(), @@ -74,6 +74,7 @@ WindowDownloadStatusbar::redraw() { (int)m_download->get_download().peers_currently_unchoked(), (int)m_download->get_download().peers_currently_interested(), (int)m_download->get_download().peers_complete(), + (int)m_download->get_download().peers_accounted(), (int)m_download->chunks_failed()), 0); // position = buffer + std::max(snprintf(position, last - buffer, " Priority: %s", diff --git a/src/ui/Makefile.am b/src/ui/Makefile.am index 4efdb7ff..ec3f08e7 100644 --- a/src/ui/Makefile.am +++ b/src/ui/Makefile.am @@ -6,6 +6,8 @@ libsub_ui_a_SOURCES = \ download_list.cc \ download_list.h \ element_base.h \ + element_chunks_seen.cc \ + element_chunks_seen.h \ element_download_list.cc \ element_download_list.h \ element_file_list.cc \ diff --git a/src/ui/download.cc b/src/ui/download.cc index 32628431..2195e75f 100644 --- a/src/ui/download.cc +++ b/src/ui/download.cc @@ -53,6 +53,7 @@ #include "element_peer_info.h" #include "element_peer_list.h" #include "element_tracker_list.h" +#include "element_chunks_seen.h" namespace ui { @@ -74,6 +75,7 @@ Download::Download(DPtr d, Control* c) : m_uiArray[DISPLAY_PEER_INFO] = new ElementPeerInfo(d, &m_peers, &m_focus); m_uiArray[DISPLAY_FILE_LIST] = new ElementFileList(d); m_uiArray[DISPLAY_TRACKER_LIST] = new ElementTrackerList(d); + m_uiArray[DISPLAY_CHUNKS_SEEN] = new ElementChunksSeen(d); bind_keys(); @@ -267,6 +269,7 @@ Download::bind_keys() { (*m_bindings)['p'] = sigc::bind(sigc::mem_fun(*this, &Download::receive_change), DISPLAY_PEER_INFO); (*m_bindings)['o'] = sigc::bind(sigc::mem_fun(*this, &Download::receive_change), DISPLAY_TRACKER_LIST); + (*m_bindings)['i'] = sigc::bind(sigc::mem_fun(*this, &Download::receive_change), DISPLAY_CHUNKS_SEEN); (*m_bindings)[KEY_UP] = sigc::mem_fun(*this, &Download::receive_prev); (*m_bindings)[KEY_DOWN] = sigc::mem_fun(*this, &Download::receive_next); @@ -276,6 +279,7 @@ Download::bind_keys() { m_uiArray[DISPLAY_PEER_INFO]->get_bindings()[KEY_LEFT] = sigc::bind(sigc::mem_fun(*this, &Download::receive_change), DISPLAY_PEER_LIST); m_uiArray[DISPLAY_FILE_LIST]->get_bindings()[KEY_LEFT] = sigc::bind(sigc::mem_fun(*this, &Download::receive_change), DISPLAY_PEER_LIST); m_uiArray[DISPLAY_TRACKER_LIST]->get_bindings()[KEY_LEFT] = sigc::bind(sigc::mem_fun(*this, &Download::receive_change), DISPLAY_PEER_LIST); + m_uiArray[DISPLAY_CHUNKS_SEEN]->get_bindings()[KEY_LEFT] = sigc::bind(sigc::mem_fun(*this, &Download::receive_change), DISPLAY_PEER_LIST); // Doesn't belong here. m_uiArray[DISPLAY_PEER_LIST]->get_bindings()['*'] = sigc::mem_fun(*this, &Download::receive_snub_peer); diff --git a/src/ui/download.h b/src/ui/download.h index 6fd1b18f..00e11a3d 100644 --- a/src/ui/download.h +++ b/src/ui/download.h @@ -74,6 +74,7 @@ public: DISPLAY_PEER_INFO, DISPLAY_FILE_LIST, DISPLAY_TRACKER_LIST, + DISPLAY_CHUNKS_SEEN, DISPLAY_MAX_SIZE } Display; diff --git a/src/ui/element_chunks_seen.cc b/src/ui/element_chunks_seen.cc new file mode 100644 index 00000000..25f114ce --- /dev/null +++ b/src/ui/element_chunks_seen.cc @@ -0,0 +1,93 @@ +// rTorrent - BitTorrent client +// Copyright (C) 2005-2006, Jari Sundell +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// In addition, as a special exception, the copyright holders give +// permission to link the code of portions of this program with the +// OpenSSL library under certain conditions as described in each +// individual source file, and distribute linked combinations +// including the two. +// +// You must obey the GNU General Public License in all respects for +// all of the code used other than OpenSSL. If you modify file(s) +// with this exception, you may extend this exception to your version +// of the file(s), but you are not obligated to do so. If you do not +// wish to do so, delete this exception statement from your version. +// If you delete this exception statement from all source files in the +// program, then also delete it here. +// +// Contact: Jari Sundell +// +// Skomakerveien 33 +// 3185 Skoppum, NORWAY + +#include "config.h" + +#include + +#include "display/window_download_chunks_seen.h" +#include "input/manager.h" + +#include "control.h" +#include "element_chunks_seen.h" + +namespace ui { + +ElementChunksSeen::ElementChunksSeen(core::Download* d) : + m_download(d), + m_window(NULL) { + +// m_bindings[KEY_DOWN] = sigc::mem_fun(*this, &ElementChunksSeen::receive_next); +// m_bindings[KEY_UP] = sigc::mem_fun(*this, &ElementChunksSeen::receive_prev); +// m_bindings[' '] = sigc::mem_fun(*this, &ElementChunksSeen::receive_cycle_group); +// m_bindings['*'] = sigc::mem_fun(*this, &ElementChunksSeen::receive_disable); +} + +void +ElementChunksSeen::activate(Control* c, MItr mItr) { + if (m_window != NULL) + throw std::logic_error("ui::ElementChunksSeen::activate(...) called on an object in the wrong state"); + + c->input()->push_front(&m_bindings); + + *mItr = m_window = new WChunksSeen(m_download); +} + +void +ElementChunksSeen::disable(Control* c) { + if (m_window == NULL) + throw std::logic_error("ui::ElementChunksSeen::disable(...) called on an object in the wrong state"); + + c->input()->erase(&m_bindings); + + delete m_window; + m_window = NULL; +} + +// void +// ElementChunksSeen::receive_disable() { +// if (m_window == NULL) +// throw std::logic_error("ui::ElementChunksSeen::receive_disable(...) called on a disabled object"); + +// if (m_download->get_download().tracker(m_focus).is_enabled()) +// m_download->get_download().tracker(m_focus).disable(); +// else +// m_download->get_download().tracker(m_focus).enable(); + +// m_window->mark_dirty(); +// } + +} diff --git a/src/ui/element_chunks_seen.h b/src/ui/element_chunks_seen.h new file mode 100644 index 00000000..aeda92b9 --- /dev/null +++ b/src/ui/element_chunks_seen.h @@ -0,0 +1,70 @@ +// rTorrent - BitTorrent client +// Copyright (C) 2005-2006, Jari Sundell +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// In addition, as a special exception, the copyright holders give +// permission to link the code of portions of this program with the +// OpenSSL library under certain conditions as described in each +// individual source file, and distribute linked combinations +// including the two. +// +// You must obey the GNU General Public License in all respects for +// all of the code used other than OpenSSL. If you modify file(s) +// with this exception, you may extend this exception to your version +// of the file(s), but you are not obligated to do so. If you do not +// wish to do so, delete this exception statement from your version. +// If you delete this exception statement from all source files in the +// program, then also delete it here. +// +// Contact: Jari Sundell +// +// Skomakerveien 33 +// 3185 Skoppum, NORWAY + +#ifndef RTORRENT_UI_ELEMENT_CHUNKS_SEEN_H +#define RTORRENT_UI_ELEMENT_CHUNKS_SEEN_H + +#include "core/download.h" + +#include "element_base.h" + +class Control; + +namespace display { + class WindowDownloadChunksSeen; +} + +namespace ui { + +class ElementChunksSeen : public ElementBase { +public: + typedef display::WindowDownloadChunksSeen WChunksSeen; + + ElementChunksSeen(core::Download* d); + + void activate(Control* c, MItr mItr); + void disable(Control* c); + +private: +// void receive_disable(); + + core::Download* m_download; + WChunksSeen* m_window; +}; + +} + +#endif