1
// libTorrent - BitTorrent library
2
// Copyright (C) 2005-2007, Jari Sundell
4
// This program is free software; you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation; either version 2 of the License, or
7
// (at your option) any later version.
9
// This program is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
// GNU General Public License for more details.
14
// You should have received a copy of the GNU General Public License
15
// along with this program; if not, write to the Free Software
16
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
// In addition, as a special exception, the copyright holders give
19
// permission to link the code of portions of this program with the
20
// OpenSSL library under certain conditions as described in each
21
// individual source file, and distribute linked combinations
24
// You must obey the GNU General Public License in all respects for
25
// all of the code used other than OpenSSL. If you modify file(s)
26
// with this exception, you may extend this exception to your version
27
// of the file(s), but you are not obligated to do so. If you do not
28
// wish to do so, delete this exception statement from your version.
29
// If you delete this exception statement from all source files in the
30
// program, then also delete it here.
32
// Contact: Jari Sundell <jaris@ifi.uio.no>
35
// 3185 Skoppum, NORWAY
37
#ifndef LIBTORRENT_HTTP_H
38
#define LIBTORRENT_HTTP_H
42
#include <sigc++/signal.h>
43
#include <torrent/common.h>
47
// The client should set the user agent to something like
48
// "CLIENT_NAME/CLIENT_VERSION/LIBRARY_VERSION".
50
// Keep in mind that these objects get reused.
51
class LIBTORRENT_EXPORT Http {
53
typedef sigc::signal0<void> Signal;
54
typedef sigc::signal1<void, const std::string&> SignalString;
55
typedef sigc::slot0<Http*> SlotFactory;
57
Http() : m_stream(NULL), m_timeout(0) {}
60
// Start must never throw on bad input. Calling start/stop on an
61
// object in the wrong state should throw a torrent::internal_error.
62
virtual void start() = 0;
63
virtual void close() = 0;
65
const std::string& url() const { return m_url; }
66
void set_url(const std::string& url) { m_url = url; }
68
// Make sure the output stream does not have any bad/failed bits set.
69
std::iostream* stream() { return m_stream; }
70
void set_stream(std::iostream* str) { m_stream = str; }
72
uint32_t timeout() const { return m_timeout; }
73
void set_timeout(uint32_t seconds) { m_timeout = seconds; }
75
// The owner of the Http object must close it as soon as possible
76
// after receiving the signal, as the implementation may allocate
77
// limited resources during its lifetime.
78
Signal& signal_done() { return m_signalDone; }
79
SignalString& signal_failed() { return m_signalFailed; }
81
// Set the factory function that constructs and returns a valid Http* object.
82
static void set_factory(const SlotFactory& f);
84
// Guaranteed to return a valid object or throw a internal_error. The
85
// caller takes ownership of the returned object. Is there any
86
// interest in making a destructor slot?
87
static Http* call_factory();
91
std::iostream* m_stream;
95
SignalString m_signalFailed;
99
void operator = (const Http&);
101
static SlotFactory m_factory;