Improved the http progress display, includes truncated names, download

progress and 10 second delay on hiding.


git-svn-id: svn://rakshasa.no/libtorrent/trunk/rtorrent@286 e378c898-3ddf-0310-93e7-cc216c733640
This commit is contained in:
rakshasa
2005-02-17 21:20:18 +00:00
parent f9975ae9f2
commit 78d3d78ef3
14 changed files with 254 additions and 29 deletions
+5
View File
@@ -3,3 +3,8 @@ up.
Polling during last phase of shutdown should be very quick, don't use Polling during last phase of shutdown should be very quick, don't use
normal timeout. normal timeout.
Make clear distinction of upload/download throttle.
"Caught exception: "Tried to add an existing DownloadMain to DownloadManager""
Properly handle duplicate torrents.
+17
View File
@@ -58,6 +58,23 @@ CurlGet::close() {
m_handle = NULL; m_handle = NULL;
} }
double
CurlGet::get_size_done() {
double d = 0.0;
curl_easy_getinfo(m_handle, CURLINFO_SIZE_DOWNLOAD, &d);
return d;
}
double
CurlGet::get_size_total() {
double d = 0.0;
curl_easy_getinfo(m_handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &d);
return d;
}
void void
CurlGet::perform(CURLMsg* msg) { CurlGet::perform(CURLMsg* msg) {
if (msg->msg != CURLMSG_DONE) if (msg->msg != CURLMSG_DONE)
+3
View File
@@ -25,6 +25,9 @@ class CurlGet : public torrent::Http {
bool is_busy() { return m_handle; } bool is_busy() { return m_handle; }
double get_size_done();
double get_size_total();
protected: protected:
CURL* handle() { return m_handle; } CURL* handle() { return m_handle; }
+8 -3
View File
@@ -2,6 +2,7 @@
#include <memory> #include <memory>
#include <sstream> #include <sstream>
#include <functional.h>
#include <sigc++/bind.h> #include <sigc++/bind.h>
#include <sigc++/hide.h> #include <sigc++/hide.h>
#include <torrent/http.h> #include <torrent/http.h>
@@ -14,7 +15,7 @@ namespace core {
HttpQueue::iterator HttpQueue::iterator
HttpQueue::insert(const std::string& url) { HttpQueue::insert(const std::string& url) {
std::auto_ptr<torrent::Http> h(m_slotFactory()); std::auto_ptr<CurlGet> h(m_slotFactory());
std::auto_ptr<std::stringstream> s(new std::stringstream); std::auto_ptr<std::stringstream> s(new std::stringstream);
h->set_url(url); h->set_url(url);
@@ -31,11 +32,15 @@ HttpQueue::insert(const std::string& url) {
h.release(); h.release();
s.release(); s.release();
m_signalInsert.emit(*itr);
return itr; return itr;
} }
void void
HttpQueue::erase(iterator itr) { HttpQueue::erase(iterator itr) {
m_signalErase.emit(*itr);
delete (*itr)->get_stream(); delete (*itr)->get_stream();
delete *itr; delete *itr;
@@ -44,8 +49,8 @@ HttpQueue::erase(iterator itr) {
void void
HttpQueue::clear() { HttpQueue::clear() {
std::for_each(begin(), end(), func::on(func::call_delete(), std::mem_fun(&CurlGet::get_stream))); while (!empty())
std::for_each(begin(), end(), func::call_delete()); erase(begin());
Base::clear(); Base::clear();
} }
+13 -9
View File
@@ -3,18 +3,17 @@
#include <list> #include <list>
#include <iosfwd> #include <iosfwd>
#include <sigc++/slot.h> #include <sigc++/signal.h>
namespace torrent {
class Http;
}
namespace core { namespace core {
class HttpQueue : private std::list<torrent::Http*> { class CurlGet;
class HttpQueue : private std::list<CurlGet*> {
public: public:
typedef std::list<torrent::Http*> Base; typedef std::list<CurlGet*> Base;
typedef sigc::slot0<torrent::Http*> SlotFactory; typedef sigc::signal1<void, CurlGet*> SignalHttp;
typedef sigc::slot0<CurlGet*> SlotFactory;
using Base::iterator; using Base::iterator;
using Base::const_iterator; using Base::const_iterator;
@@ -29,7 +28,7 @@ public:
using Base::empty; using Base::empty;
using Base::size; using Base::size;
// Note that any slots connected to the torrent::Http signals must be // Note that any slots connected to the CurlGet signals must be
// pushed in front of the erase slot added by HttpQueue::insert. // pushed in front of the erase slot added by HttpQueue::insert.
iterator insert(const std::string& url); iterator insert(const std::string& url);
void erase(iterator itr); void erase(iterator itr);
@@ -38,8 +37,13 @@ public:
void slot_factory(SlotFactory s) { m_slotFactory = s; } void slot_factory(SlotFactory s) { m_slotFactory = s; }
SignalHttp& signal_insert() { return m_signalInsert; }
SignalHttp& signal_erase() { return m_signalErase; }
private: private:
SlotFactory m_slotFactory; SlotFactory m_slotFactory;
SignalHttp m_signalInsert;
SignalHttp m_signalErase;
}; };
} }
+2 -2
View File
@@ -6,10 +6,10 @@
#include <istream> #include <istream>
#include <sigc++/bind.h> #include <sigc++/bind.h>
#include <torrent/exceptions.h> #include <torrent/exceptions.h>
#include <torrent/http.h>
#include <torrent/torrent.h> #include <torrent/torrent.h>
#include "manager.h" #include "manager.h"
#include "curl_get.h"
namespace core { namespace core {
@@ -95,7 +95,7 @@ Manager::create_http(const std::string& uri) {
} }
void void
Manager::receive_http_done(torrent::Http* http) { Manager::receive_http_done(CurlGet* http) {
DownloadList::iterator itr = m_downloadList.end(); DownloadList::iterator itr = m_downloadList.end();
try { try {
+1 -1
View File
@@ -29,7 +29,7 @@ public:
void stop(Download* d); void stop(Download* d);
private: private:
void receive_http_done(torrent::Http* http); void receive_http_done(CurlGet* http);
void create_file(const std::string& uri); void create_file(const std::string& uri);
void create_http(const std::string& uri); void create_http(const std::string& uri);
+5 -7
View File
@@ -6,17 +6,15 @@
#include "curl_stack.h" #include "curl_stack.h"
namespace torrent {
class Http;
}
namespace core { namespace core {
class CurlGet;
class Poll { class Poll {
public: public:
typedef sigc::slot0<void> Slot; typedef sigc::slot0<void> Slot;
typedef sigc::slot1<void, int> SlotInt; typedef sigc::slot1<void, int> SlotInt;
typedef sigc::slot0<torrent::Http*> SlotFactory; typedef sigc::slot0<CurlGet*> SlotFactory;
Poll() : m_readSet(new fd_set), m_writeSet(new fd_set), m_exceptSet(new fd_set) {} Poll() : m_readSet(new fd_set), m_writeSet(new fd_set), m_exceptSet(new fd_set) {}
~Poll() { delete m_readSet; delete m_writeSet; delete m_exceptSet; } ~Poll() { delete m_readSet; delete m_writeSet; delete m_exceptSet; }
+2
View File
@@ -13,6 +13,8 @@ libsub_display_a_SOURCES = \
window_download_statusbar.h \ window_download_statusbar.h \
window_download_list.cc \ window_download_list.cc \
window_download_list.h \ window_download_list.h \
window_http_queue.cc \
window_http_queue.h \
window_input.cc \ window_input.cc \
window_input.h \ window_input.h \
window_peer_info.cc \ window_peer_info.cc \
+120
View File
@@ -0,0 +1,120 @@
#include "config.h"
#include <stdexcept>
#include "core/curl_get.h"
#include "core/http_queue.h"
#include "canvas.h"
#include "functional.h"
#include "window_http_queue.h"
namespace display {
WindowHttpQueue::WindowHttpQueue(core::HttpQueue* q) :
Window(new Canvas, false, 1),
m_queue(q) {
set_active(false);
m_connInsert = m_queue->signal_insert().connect(sigc::mem_fun(*this, &WindowHttpQueue::receive_insert));
m_connErase = m_queue->signal_erase().connect(sigc::mem_fun(*this, &WindowHttpQueue::receive_erase));
}
void
WindowHttpQueue::redraw() {
if (Timer::cache() - m_lastDraw < 1000000)
return;
m_lastDraw = Timer::cache();
cleanup_list();
if (m_container.empty()) {
set_active(false);
m_slotAdjust();
return;
}
m_canvas->erase();
m_canvas->print(0, 0, "Http [%2i]", m_container.size());
int pos = 10;
Container::iterator itr = m_container.begin();
while (itr != m_container.end() && pos + 20 < m_canvas->get_width()) {
if (itr->m_http == NULL)
m_canvas->print(pos, 0, "%s done", itr->m_name.c_str());
else if (itr->m_http->get_size_total() == 0)
m_canvas->print(pos, 0, "%s ---%%", itr->m_name.c_str());
else
m_canvas->print(pos, 0, "%s %3i%%",
itr->m_name.c_str(),
(int)(100.0 * itr->m_http->get_size_done() / itr->m_http->get_size_total()));
pos += itr->m_name.size() + 6;
++itr;
}
}
void
WindowHttpQueue::cleanup_list() {
for (Container::iterator itr = m_container.begin(); itr != m_container.end();)
if (itr->m_http == NULL && itr->m_timer < Timer::cache())
itr = m_container.erase(itr);
else
++itr;
mark_dirty();
}
std::string
WindowHttpQueue::create_name(core::CurlGet* h) {
std::string n = h->get_url().substr(h->get_url().rfind('/', h->get_url().size() - std::min((size_t)10, h->get_url().size())));
if (n.empty())
throw std::logic_error("WindowHttpQueue::create_name(...) made a bad string");
if (n.size() > 2 && n[0] == '/')
n = n.substr(1);
if (n.size() > 9 &&
(n.substr(n.size() - 8) == ".torrent" ||
n.substr(n.size() - 8) == ".TORRENT"))
n = n.substr(0, n.size() - 8);
if (n.size() > 20)
n = n.substr(0, 20);
return n;
}
void
WindowHttpQueue::receive_insert(core::CurlGet* h) {
m_container.push_back(Node(h, create_name(h)));
if (!is_active()) {
set_active(true);
m_slotAdjust();
}
mark_dirty();
}
void
WindowHttpQueue::receive_erase(core::CurlGet* h) {
Container::iterator itr = std::find_if(m_container.begin(), m_container.end(),
func::equal(h, std::mem_fun_ref(&Node::get_http)));
if (itr == m_container.end())
throw std::logic_error("WindowHttpQueue::receive_erase(...) tried to remove an object we don't have");
itr->m_http = NULL;
itr->m_timer = Timer::cache() + 10000000;
mark_dirty();
}
}
+57
View File
@@ -0,0 +1,57 @@
#ifndef RTORRENT_DISPLAY_WINDOW_HTTP_QUEUE_H
#define RTORRENT_DISPLAY_WINDOW_HTTP_QUEUE_H
#include <sigc++/slot.h>
#include <sigc++/connection.h>
#include "window.h"
namespace core {
class CurlGet;
class HttpQueue;
}
namespace display {
class WindowHttpQueue : public Window {
public:
typedef sigc::slot0<void> Slot;
WindowHttpQueue(core::HttpQueue* q);
~WindowHttpQueue() { m_connInsert.disconnect(); m_connErase.disconnect(); }
void slot_adjust(Slot s) { m_slotAdjust = s; }
virtual void redraw();
private:
struct Node {
Node(core::CurlGet* h, const std::string& n) : m_http(h), m_name(n) {}
core::CurlGet* get_http() { return m_http; }
core::CurlGet* m_http;
std::string m_name;
Timer m_timer;
};
typedef std::list<Node> Container;
void cleanup_list();
void receive_insert(core::CurlGet* h);
void receive_erase(core::CurlGet* h);
static std::string create_name(core::CurlGet* h);
core::HttpQueue* m_queue;
Slot m_slotAdjust;
sigc::connection m_connInsert;
sigc::connection m_connErase;
Container m_container;
};
}
#endif
+3 -1
View File
@@ -61,6 +61,8 @@ do_shutdown(ui::Control* c) {
std::mem_fun_ref(&core::Download::close)); std::mem_fun_ref(&core::Download::close));
} }
start_shutdown = false;
} }
void void
@@ -124,7 +126,7 @@ main(int argc, char** argv) {
uiControl.get_display().adjust_layout(); uiControl.get_display().adjust_layout();
while (!is_shutting_down || !torrent::get(torrent::SHUTDOWN_DONE)) { while (!is_shutting_down || !torrent::get(torrent::SHUTDOWN_DONE)) {
if (start_shutdown && !is_shutting_down) if (start_shutdown)
do_shutdown(&uiControl); do_shutdown(&uiControl);
Timer::update(); Timer::update();
+10 -2
View File
@@ -6,10 +6,12 @@
#include "input/bindings.h" #include "input/bindings.h"
#include "input/text_input.h" #include "input/text_input.h"
#include "display/window_title.h"
#include "display/window_download_list.h" #include "display/window_download_list.h"
#include "display/window_statusbar.h" #include "display/window_http_queue.h"
#include "display/window_input.h" #include "display/window_input.h"
#include "display/window_statusbar.h"
#include "display/window_title.h"
#include "control.h" #include "control.h"
#include "download.h" #include "download.h"
@@ -21,6 +23,8 @@ DownloadList::DownloadList(Control* c) :
m_title(new WTitle("rtorrent " VERSION " - " + torrent::get(torrent::LIBRARY_NAME))), m_title(new WTitle("rtorrent " VERSION " - " + torrent::get(torrent::LIBRARY_NAME))),
m_status(new WStatus), m_status(new WStatus),
m_textInput(new WInput(new input::TextInput)), m_textInput(new WInput(new input::TextInput)),
m_windowHttpQueue(new WHttp(&c->get_core().get_http_queue())),
m_download(NULL), m_download(NULL),
m_focus(c->get_core().get_download_list().end()), m_focus(c->get_core().get_download_list().end()),
m_control(c), m_control(c),
@@ -31,6 +35,7 @@ DownloadList::DownloadList(Control* c) :
bind_keys(m_bindings); bind_keys(m_bindings);
m_textInput->get_input()->slot_dirty(sigc::mem_fun(*m_textInput, &WInput::mark_dirty)); m_textInput->get_input()->slot_dirty(sigc::mem_fun(*m_textInput, &WInput::mark_dirty));
m_windowHttpQueue->slot_adjust(sigc::mem_fun(c->get_display(), &display::Manager::adjust_layout));
} }
DownloadList::~DownloadList() { DownloadList::~DownloadList() {
@@ -41,6 +46,7 @@ DownloadList::~DownloadList() {
delete m_textInput->get_input(); delete m_textInput->get_input();
delete m_textInput; delete m_textInput;
delete m_windowHttpQueue;
} }
void void
@@ -49,6 +55,7 @@ DownloadList::activate() {
m_control->get_input().push_front(m_bindings); m_control->get_input().push_front(m_bindings);
m_control->get_display().push_back(m_windowHttpQueue);
m_control->get_display().push_back(m_textInput); m_control->get_display().push_back(m_textInput);
m_control->get_display().push_back(m_status); m_control->get_display().push_back(m_status);
m_control->get_display().push_front(m_window); m_control->get_display().push_front(m_window);
@@ -68,6 +75,7 @@ DownloadList::disable() {
m_control->get_display().erase(m_window); m_control->get_display().erase(m_window);
m_control->get_display().erase(m_status); m_control->get_display().erase(m_status);
m_control->get_display().erase(m_textInput); m_control->get_display().erase(m_textInput);
m_control->get_display().erase(m_windowHttpQueue);
} }
void void
+8 -4
View File
@@ -4,10 +4,11 @@
#include <sigc++/slot.h> #include <sigc++/slot.h>
namespace display { namespace display {
class WindowTitle;
class WindowDownloadList; class WindowDownloadList;
class WindowStatusbar; class WindowHttpQueue;
class WindowInput; class WindowInput;
class WindowStatusbar;
class WindowTitle;
} }
namespace ui { namespace ui {
@@ -18,9 +19,11 @@ class Download;
class DownloadList { class DownloadList {
public: public:
typedef display::WindowDownloadList WList; typedef display::WindowDownloadList WList;
typedef display::WindowTitle WTitle; typedef display::WindowHttpQueue WHttp;
typedef display::WindowStatusbar WStatus;
typedef display::WindowInput WInput; typedef display::WindowInput WInput;
typedef display::WindowStatusbar WStatus;
typedef display::WindowTitle WTitle;
typedef core::DownloadList DList; typedef core::DownloadList DList;
typedef sigc::slot1<void, const std::string&> SlotOpenUri; typedef sigc::slot1<void, const std::string&> SlotOpenUri;
@@ -63,6 +66,7 @@ private:
WTitle* m_title; WTitle* m_title;
WStatus* m_status; WStatus* m_status;
WInput* m_textInput; WInput* m_textInput;
WHttp* m_windowHttpQueue;
Download* m_download; Download* m_download;