diff --git a/rak/error_number.h b/rak/error_number.h index d2964b0f..99c7ba4d 100644 --- a/rak/error_number.h +++ b/rak/error_number.h @@ -47,6 +47,8 @@ public: error_number() : m_errno(0) {} error_number(int e) : m_errno(e) {} + bool is_valid() const { return m_errno != 0; } + int value() const { return m_errno; } const char* c_str() const { return strerror(m_errno); } diff --git a/rak/ranges.h b/rak/ranges.h new file mode 100644 index 00000000..87c19074 --- /dev/null +++ b/rak/ranges.h @@ -0,0 +1,132 @@ +// libTorrent - BitTorrent library +// Copyright (C) 2005, 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 RAK_RANGES_H +#define RAK_RANGES_H + +#include +#include +#include + +namespace rak { + +template +class ranges : private std::vector > { +public: + typedef std::vector > Base; + typedef typename Base::value_type value_type; + typedef typename Base::reference reference; + typedef typename Base::iterator iterator; + typedef typename Base::const_iterator const_iterator; + typedef typename Base::reverse_iterator reverse_iterator; + + using Base::clear; + using Base::size; + using Base::begin; + using Base::end; + using Base::rbegin; + using Base::rend; + + void insert(Type first, Type last) { insert(std::make_pair(first, last)); } +// void erase(Type first, Type last) { erase(std::make_pair(first, last)); } + + void insert(value_type r); +// void erase(value_type r); + + // Find the first ranges that has an end greater than index. + inline iterator find(Type index); + + // Use find with no closest match. + inline bool has(Type index); + +private: + inline void unify(iterator itr); +}; + +template +void +ranges::insert(value_type r) { + if (r.first >= r.second) + return; + + iterator first = std::find_if(begin(), end(), rak::less_equal(r.first, rak::mem_ptr_ref(&value_type::second))); + + if (first == end() || r.second < first->first) { + // The new range is before the first, after the last or between + // two ranges. + Base::insert(first, r); + return; + } + + first->first = std::min(r.first, first->first); + first->second = std::max(r.second, first->second); + + unify(first); +} + +// template +// void +// ranges::erase(value_type r) { +// } + +// Find the first ranges that has an end greater than index. +template +inline typename ranges::iterator +ranges::find(Type index) { + return std::find_if(begin(), end(), rak::less(index, rak::mem_ptr_ref(&value_type::second))); +} + +// Use find with no closest match. +template +inline bool +ranges::has(Type index) { + const_iterator itr = find(index); + + return itr != end() && index >= itr->first; +} + +template +inline void +ranges::unify(iterator first) { + iterator last = std::find_if((first + 1), end(), rak::less(first->second, rak::mem_ptr_ref(&value_type::first))); + + first->second = std::max(first->second, (last - 1)->second); + Base::erase((first + 1), last); +} + +} + +#endif diff --git a/src/core/curl_get.cc b/src/core/curl_get.cc index de18a3b6..5f6750ea 100644 --- a/src/core/curl_get.cc +++ b/src/core/curl_get.cc @@ -141,6 +141,10 @@ CurlGet::perform(CURLMsg* msg) { m_signalDone.emit(); else m_signalFailed.emit(curl_easy_strerror(msg->data.result)); + + if (m_handle != NULL) + throw std::logic_error("CurlGet::perform finished but the object wasn't closed."); + } } diff --git a/src/core/download_list.h b/src/core/download_list.h index 1b0d54c9..3c770c24 100644 --- a/src/core/download_list.h +++ b/src/core/download_list.h @@ -46,6 +46,10 @@ namespace core { class Download; +// Container for all downloads. Add slots to the slot maps to cause +// some action to be taken when the torrent changes states. Don't +// change the states from outside of core. + class DownloadList : private std::list { public: typedef std::list Base;