diff --git a/src/core/download_list.cc b/src/core/download_list.cc index 6e99fe8f..66a7cb8e 100644 --- a/src/core/download_list.cc +++ b/src/core/download_list.cc @@ -20,13 +20,14 @@ DownloadList::insert(std::istream* str) { return itr; } -void +DownloadList::iterator DownloadList::erase(iterator itr) { (*itr)->release_download(); torrent::download_remove((*itr)->get_hash()); delete *itr; - Base::erase(itr); + + return Base::erase(itr); } void diff --git a/src/core/download_list.h b/src/core/download_list.h index e70d0a55..7ba01c4c 100644 --- a/src/core/download_list.h +++ b/src/core/download_list.h @@ -28,7 +28,7 @@ public: ~DownloadList() { clear(); } iterator insert(std::istream* str); - void erase(iterator itr); + iterator erase(iterator itr); private: void clear(); diff --git a/src/core/download_store.cc b/src/core/download_store.cc index fca69b2e..b9248309 100644 --- a/src/core/download_store.cc +++ b/src/core/download_store.cc @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -30,6 +31,9 @@ DownloadStore::disable() { void DownloadStore::save(Download* d) { + if (!is_active()) + return; + std::fstream f(create_filename(d).c_str(), std::ios::out | std::ios::trunc); if (!f.is_open()) @@ -43,6 +47,10 @@ DownloadStore::save(Download* d) { void DownloadStore::remove(Download* d) { + if (!is_active()) + return; + + unlink(create_filename(d).c_str()); } std::string diff --git a/src/core/manager.cc b/src/core/manager.cc index f932848a..faae5be7 100644 --- a/src/core/manager.cc +++ b/src/core/manager.cc @@ -39,15 +39,17 @@ Manager::insert(const std::string& uri) { create_http(uri); } -void +Manager::iterator Manager::erase(DownloadList::iterator itr) { if ((*itr)->get_download().is_active()) throw std::logic_error("core::Manager::erase(...) called on an active download"); - if ((*itr)->get_download().is_open()) - (*itr)->close(); + if (!(*itr)->get_download().is_open()) + throw std::logic_error("core::Manager::erase(...) called on an closed download"); - m_downloadList.erase(itr); + m_downloadStore.remove(*itr); + + return m_downloadList.erase(itr); } void diff --git a/src/core/manager.h b/src/core/manager.h index d2e68386..1c5b9198 100644 --- a/src/core/manager.h +++ b/src/core/manager.h @@ -11,6 +11,7 @@ namespace core { class Manager { public: + typedef DownloadList::iterator iterator; typedef sigc::slot1 SlotReady; typedef sigc::slot0 SlotFailed; @@ -27,7 +28,7 @@ public: void cleanup(); void insert(const std::string& uri); - void erase(DownloadList::iterator itr); + iterator erase(DownloadList::iterator itr); void start(Download* d); void stop(Download* d); diff --git a/src/display/window_peer_info.cc b/src/display/window_peer_info.cc index 0637577b..9fb386ce 100644 --- a/src/display/window_peer_info.cc +++ b/src/display/window_peer_info.cc @@ -27,7 +27,7 @@ WindowPeerInfo::redraw() { int y = 0; - m_canvas->print(0, y++, "Hash: %s", utils::escape_string(m_download->get_download().get_hash()).c_str()); + m_canvas->print(0, y++, "Hash: %s", utils::string_to_hex(m_download->get_download().get_hash()).c_str()); m_canvas->print(0, y++, "Chunks: %u / %u * %u", m_download->get_download().get_chunks_done(), m_download->get_download().get_chunks_total(), diff --git a/src/ui/download_list.cc b/src/ui/download_list.cc index d1fbd838..61ea888d 100644 --- a/src/ui/download_list.cc +++ b/src/ui/download_list.cc @@ -123,7 +123,7 @@ DownloadList::receive_stop_download() { if ((*m_focus)->get_download().is_active()) m_control->get_core().stop(*m_focus); else - m_control->get_core().erase(m_focus); + m_focus = m_control->get_core().erase(m_focus); } void