Forgot some headers in last commit.
This commit is contained in:
parent
70bb78b833
commit
1557679259
|
@ -0,0 +1,184 @@
|
||||||
|
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */
|
||||||
|
/* GeoIP.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2006 MaxMind LLC
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GEOIP_H
|
||||||
|
#define GEOIP_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include<stdio.h>
|
||||||
|
#include<stdlib.h>
|
||||||
|
#include<string.h>
|
||||||
|
#include <sys/types.h> /* for fstat */
|
||||||
|
#include <sys/stat.h> /* for fstat */
|
||||||
|
|
||||||
|
#define SEGMENT_RECORD_LENGTH 3
|
||||||
|
#define STANDARD_RECORD_LENGTH 3
|
||||||
|
#define ORG_RECORD_LENGTH 4
|
||||||
|
#define MAX_RECORD_LENGTH 4
|
||||||
|
#define NUM_DB_TYPES 20
|
||||||
|
|
||||||
|
typedef struct GeoIPTag {
|
||||||
|
FILE *GeoIPDatabase;
|
||||||
|
char *file_path;
|
||||||
|
unsigned char *cache;
|
||||||
|
unsigned char *index_cache;
|
||||||
|
unsigned int *databaseSegments;
|
||||||
|
char databaseType;
|
||||||
|
time_t mtime;
|
||||||
|
int flags;
|
||||||
|
off_t size;
|
||||||
|
char record_length;
|
||||||
|
int charset; /* 0 iso-8859-1 1 utf8 */
|
||||||
|
int record_iter; /* used in GeoIP_next_record */
|
||||||
|
int netmask; /* netmask of last lookup - set using depth in _GeoIP_seek_record */
|
||||||
|
} GeoIP;
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
GEOIP_CHARSET_ISO_8859_1 = 0,
|
||||||
|
GEOIP_CHARSET_UTF8 = 1
|
||||||
|
} GeoIPCharset;
|
||||||
|
|
||||||
|
typedef struct GeoIPRegionTag {
|
||||||
|
char country_code[3];
|
||||||
|
char region[3];
|
||||||
|
} GeoIPRegion;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
GEOIP_STANDARD = 0,
|
||||||
|
GEOIP_MEMORY_CACHE = 1,
|
||||||
|
GEOIP_CHECK_CACHE = 2,
|
||||||
|
GEOIP_INDEX_CACHE = 4,
|
||||||
|
GEOIP_MMAP_CACHE = 8,
|
||||||
|
} GeoIPOptions;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
GEOIP_COUNTRY_EDITION = 1,
|
||||||
|
GEOIP_REGION_EDITION_REV0 = 7,
|
||||||
|
GEOIP_CITY_EDITION_REV0 = 6,
|
||||||
|
GEOIP_ORG_EDITION = 5,
|
||||||
|
GEOIP_ISP_EDITION = 4,
|
||||||
|
GEOIP_CITY_EDITION_REV1 = 2,
|
||||||
|
GEOIP_REGION_EDITION_REV1 = 3,
|
||||||
|
GEOIP_PROXY_EDITION = 8,
|
||||||
|
GEOIP_ASNUM_EDITION = 9,
|
||||||
|
GEOIP_NETSPEED_EDITION = 10,
|
||||||
|
GEOIP_DOMAIN_EDITION = 11
|
||||||
|
} GeoIPDBTypes;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
GEOIP_ANON_PROXY = 1,
|
||||||
|
GEOIP_HTTP_X_FORWARDED_FOR_PROXY = 2,
|
||||||
|
GEOIP_HTTP_CLIENT_IP_PROXY = 3,
|
||||||
|
} GeoIPProxyTypes;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
GEOIP_UNKNOWN_SPEED = 0,
|
||||||
|
GEOIP_DIALUP_SPEED = 1,
|
||||||
|
GEOIP_CABLEDSL_SPEED = 2,
|
||||||
|
GEOIP_CORPORATE_SPEED = 3,
|
||||||
|
} GeoIPNetspeedValues;
|
||||||
|
|
||||||
|
extern char **GeoIPDBFileName;
|
||||||
|
extern const char * GeoIPDBDescription[NUM_DB_TYPES];
|
||||||
|
extern const char *GeoIPCountryDBFileName;
|
||||||
|
extern const char *GeoIPRegionDBFileName;
|
||||||
|
extern const char *GeoIPCityDBFileName;
|
||||||
|
extern const char *GeoIPOrgDBFileName;
|
||||||
|
extern const char *GeoIPISPDBFileName;
|
||||||
|
|
||||||
|
extern const char GeoIP_country_code[253][3];
|
||||||
|
extern const char GeoIP_country_code3[253][4];
|
||||||
|
extern const char * GeoIP_country_name[253];
|
||||||
|
extern const char GeoIP_country_continent[253][3];
|
||||||
|
|
||||||
|
#ifdef DLL
|
||||||
|
#define GEOIP_API __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define GEOIP_API
|
||||||
|
#endif /* DLL */
|
||||||
|
|
||||||
|
GEOIP_API void GeoIP_setup_custom_directory(char *dir);
|
||||||
|
GEOIP_API GeoIP* GeoIP_open_type (int type, int flags);
|
||||||
|
GEOIP_API GeoIP* GeoIP_new(int flags);
|
||||||
|
GEOIP_API GeoIP* GeoIP_open(const char * filename, int flags);
|
||||||
|
GEOIP_API int GeoIP_db_avail(int type);
|
||||||
|
GEOIP_API void GeoIP_delete(GeoIP* gi);
|
||||||
|
GEOIP_API const char *GeoIP_country_code_by_addr (GeoIP* gi, const char *addr);
|
||||||
|
GEOIP_API const char *GeoIP_country_code_by_name (GeoIP* gi, const char *host);
|
||||||
|
GEOIP_API const char *GeoIP_country_code3_by_addr (GeoIP* gi, const char *addr);
|
||||||
|
GEOIP_API const char *GeoIP_country_code3_by_name (GeoIP* gi, const char *host);
|
||||||
|
GEOIP_API const char *GeoIP_country_name_by_addr (GeoIP* gi, const char *addr);
|
||||||
|
GEOIP_API const char *GeoIP_country_name_by_name (GeoIP* gi, const char *host);
|
||||||
|
GEOIP_API const char *GeoIP_country_name_by_ipnum (GeoIP* gi, unsigned long ipnum);
|
||||||
|
GEOIP_API const char *GeoIP_country_code_by_ipnum (GeoIP* gi, unsigned long ipnum);
|
||||||
|
GEOIP_API const char *GeoIP_country_code3_by_ipnum (GeoIP* gi, unsigned long ipnum);
|
||||||
|
|
||||||
|
/* Deprecated - for backwards compatibility only */
|
||||||
|
GEOIP_API int GeoIP_country_id_by_addr (GeoIP* gi, const char *addr);
|
||||||
|
GEOIP_API int GeoIP_country_id_by_name (GeoIP* gi, const char *host);
|
||||||
|
GEOIP_API char *GeoIP_org_by_addr (GeoIP* gi, const char *addr);
|
||||||
|
GEOIP_API char *GeoIP_org_by_name (GeoIP* gi, const char *host);
|
||||||
|
/* End deprecated */
|
||||||
|
|
||||||
|
GEOIP_API int GeoIP_id_by_addr (GeoIP* gi, const char *addr);
|
||||||
|
GEOIP_API int GeoIP_id_by_name (GeoIP* gi, const char *host);
|
||||||
|
GEOIP_API int GeoIP_id_by_ipnum (GeoIP* gi, unsigned long ipnum);
|
||||||
|
|
||||||
|
GEOIP_API GeoIPRegion * GeoIP_region_by_addr (GeoIP* gi, const char *addr);
|
||||||
|
GEOIP_API GeoIPRegion * GeoIP_region_by_name (GeoIP* gi, const char *host);
|
||||||
|
GEOIP_API GeoIPRegion * GeoIP_region_by_ipnum (GeoIP *gi, unsigned long ipnum);
|
||||||
|
|
||||||
|
/* Warning - don't call this after GeoIP_assign_region_by_inetaddr calls */
|
||||||
|
GEOIP_API void GeoIPRegion_delete (GeoIPRegion *gir);
|
||||||
|
|
||||||
|
GEOIP_API void GeoIP_assign_region_by_inetaddr(GeoIP* gi, unsigned long inetaddr, GeoIPRegion *gir);
|
||||||
|
|
||||||
|
/* Used to query GeoIP Organization, ISP and AS Number databases */
|
||||||
|
GEOIP_API char *GeoIP_name_by_ipnum (GeoIP* gi, unsigned long ipnum);
|
||||||
|
GEOIP_API char *GeoIP_name_by_addr (GeoIP* gi, const char *addr);
|
||||||
|
GEOIP_API char *GeoIP_name_by_name (GeoIP* gi, const char *host);
|
||||||
|
|
||||||
|
GEOIP_API char *GeoIP_database_info (GeoIP* gi);
|
||||||
|
GEOIP_API unsigned char GeoIP_database_edition (GeoIP* gi);
|
||||||
|
|
||||||
|
GEOIP_API int GeoIP_charset (GeoIP* gi);
|
||||||
|
GEOIP_API int GeoIP_set_charset (GeoIP* gi, int charset);
|
||||||
|
|
||||||
|
GEOIP_API int GeoIP_last_netmask (GeoIP* gi);
|
||||||
|
|
||||||
|
/* Convert region code to region name */
|
||||||
|
GEOIP_API const char * GeoIP_region_name_by_code(const char *country_code, const char *region_code);
|
||||||
|
|
||||||
|
/* Get timezone from country and region code */
|
||||||
|
GEOIP_API const char * GeoIP_time_zone_by_country_and_region(const char *country_code, const char *region_code);
|
||||||
|
|
||||||
|
#ifdef BSD
|
||||||
|
#define memcpy(dest, src, n) bcopy(src, dest, n)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* GEOIP_H */
|
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2008, Arvid Norberg
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the author nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TORRENT_DISK_BUFFER_HOLDER_HPP_INCLUDED
|
||||||
|
#define TORRENT_DISK_BUFFER_HOLDER_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include "libtorrent/config.hpp"
|
||||||
|
|
||||||
|
namespace libtorrent
|
||||||
|
{
|
||||||
|
|
||||||
|
namespace aux { class session_impl; }
|
||||||
|
class disk_io_thread;
|
||||||
|
|
||||||
|
struct TORRENT_EXPORT disk_buffer_holder
|
||||||
|
{
|
||||||
|
disk_buffer_holder(aux::session_impl& ses, char* buf);
|
||||||
|
disk_buffer_holder(disk_io_thread& iothread, char* buf);
|
||||||
|
~disk_buffer_holder();
|
||||||
|
char* release();
|
||||||
|
char* buffer() const { return m_buf; }
|
||||||
|
private:
|
||||||
|
disk_io_thread& m_iothread;
|
||||||
|
char* m_buf;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2007, Arvid Norberg
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the author nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TORRENT_SMART_BAN_HPP_INCLUDED
|
||||||
|
#define TORRENT_SMART_BAN_HPP_INCLUDED
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(push, 1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
|
#include "libtorrent/config.hpp"
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace libtorrent
|
||||||
|
{
|
||||||
|
struct torrent_plugin;
|
||||||
|
class torrent;
|
||||||
|
TORRENT_EXPORT boost::shared_ptr<torrent_plugin> create_smart_ban_plugin(torrent*, void*);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // TORRENT_SMART_BAN_HPP_INCLUDED
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2007, Arvid Norberg
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the author nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TORRENT_UT_METADATA_HPP_INCLUDED
|
||||||
|
#define TORRENT_UT_METADATA_HPP_INCLUDED
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(push, 1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
|
#include "libtorrent/config.hpp"
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace libtorrent
|
||||||
|
{
|
||||||
|
struct torrent_plugin;
|
||||||
|
class torrent;
|
||||||
|
TORRENT_EXPORT boost::shared_ptr<torrent_plugin> create_ut_metadata_plugin(torrent*, void*);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // TORRENT_UT_METADATA_HPP_INCLUDED
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2007, Arvid Norberg
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the author nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace libtorrent
|
||||||
|
{
|
||||||
|
|
||||||
|
TORRENT_EXPORT bool inflate_gzip(
|
||||||
|
char const* in, int size
|
||||||
|
, std::vector<char>& buffer
|
||||||
|
, int maximum_size
|
||||||
|
, std::string& error);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,111 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2008, Arvid Norberg
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the author nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TORRENT_HTTP_PARSER_HPP_INCLUDED
|
||||||
|
#define TORRENT_HTTP_PARSER_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(push, 1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <boost/cstdint.hpp>
|
||||||
|
#include <boost/tuple/tuple.hpp>
|
||||||
|
#include <boost/lexical_cast.hpp>
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "libtorrent/config.hpp"
|
||||||
|
#include "libtorrent/buffer.hpp"
|
||||||
|
#include "libtorrent/size_type.hpp"
|
||||||
|
|
||||||
|
namespace libtorrent
|
||||||
|
{
|
||||||
|
|
||||||
|
class http_parser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
http_parser();
|
||||||
|
std::string const& header(char const* key) const
|
||||||
|
{
|
||||||
|
static std::string empty;
|
||||||
|
std::map<std::string, std::string>::const_iterator i
|
||||||
|
= m_header.find(key);
|
||||||
|
if (i == m_header.end()) return empty;
|
||||||
|
return i->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string const& protocol() const { return m_protocol; }
|
||||||
|
int status_code() const { return m_status_code; }
|
||||||
|
std::string const& method() const { return m_method; }
|
||||||
|
std::string const& path() const { return m_path; }
|
||||||
|
std::string const& message() const { return m_server_message; }
|
||||||
|
buffer::const_interval get_body() const;
|
||||||
|
bool header_finished() const { return m_state == read_body; }
|
||||||
|
bool finished() const { return m_finished; }
|
||||||
|
boost::tuple<int, int> incoming(buffer::const_interval recv_buffer
|
||||||
|
, bool& error);
|
||||||
|
int body_start() const { return m_body_start_pos; }
|
||||||
|
size_type content_length() const { return m_content_length; }
|
||||||
|
|
||||||
|
void reset();
|
||||||
|
|
||||||
|
std::map<std::string, std::string> const& headers() const { return m_header; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_recv_pos;
|
||||||
|
int m_status_code;
|
||||||
|
std::string m_method;
|
||||||
|
std::string m_path;
|
||||||
|
std::string m_protocol;
|
||||||
|
std::string m_server_message;
|
||||||
|
|
||||||
|
size_type m_content_length;
|
||||||
|
|
||||||
|
enum { read_status, read_header, read_body, error_state } m_state;
|
||||||
|
|
||||||
|
std::map<std::string, std::string> m_header;
|
||||||
|
buffer::const_interval m_recv_buffer;
|
||||||
|
int m_body_start_pos;
|
||||||
|
|
||||||
|
bool m_finished;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // TORRENT_HTTP_PARSER_HPP_INCLUDED
|
||||||
|
|
|
@ -0,0 +1,202 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2003, Arvid Norberg
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the author nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TORRENT_LAZY_ENTRY_HPP_INCLUDED
|
||||||
|
#define TORRENT_LAZY_ENTRY_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
#include "libtorrent/assert.hpp"
|
||||||
|
#include <boost/cstdint.hpp>
|
||||||
|
#include <iosfwd>
|
||||||
|
|
||||||
|
namespace libtorrent
|
||||||
|
{
|
||||||
|
struct lazy_entry;
|
||||||
|
|
||||||
|
char const* parse_int(char const* start, char const* end, char delimiter, boost::int64_t& val);
|
||||||
|
// return 0 = success
|
||||||
|
int lazy_bdecode(char const* start, char const* end, lazy_entry& ret, int depth_limit = 1000);
|
||||||
|
|
||||||
|
struct lazy_entry
|
||||||
|
{
|
||||||
|
enum entry_type_t
|
||||||
|
{
|
||||||
|
none_t, dict_t, list_t, string_t, int_t
|
||||||
|
};
|
||||||
|
|
||||||
|
lazy_entry() : m_type(none_t), m_begin(0), m_end(0)
|
||||||
|
{ m_data.start = 0; }
|
||||||
|
|
||||||
|
entry_type_t type() const { return m_type; }
|
||||||
|
|
||||||
|
// start points to the first decimal digit
|
||||||
|
// length is the number of digits
|
||||||
|
void construct_int(char const* start, int length)
|
||||||
|
{
|
||||||
|
TORRENT_ASSERT(m_type == none_t);
|
||||||
|
m_type = int_t;
|
||||||
|
m_data.start = start;
|
||||||
|
m_size = length;
|
||||||
|
m_begin = start - 1; // include 'i'
|
||||||
|
m_end = start + length + 1; // include 'e'
|
||||||
|
}
|
||||||
|
|
||||||
|
boost::int64_t int_value() const;
|
||||||
|
|
||||||
|
// string functions
|
||||||
|
// ================
|
||||||
|
|
||||||
|
void construct_string(char const* start, int length);
|
||||||
|
|
||||||
|
// the string is not null-terminated!
|
||||||
|
char const* string_ptr() const
|
||||||
|
{
|
||||||
|
TORRENT_ASSERT(m_type == string_t);
|
||||||
|
return m_data.start;
|
||||||
|
}
|
||||||
|
|
||||||
|
// this will return a null terminated string
|
||||||
|
// it will write to the source buffer!
|
||||||
|
char const* string_cstr() const
|
||||||
|
{
|
||||||
|
TORRENT_ASSERT(m_type == string_t);
|
||||||
|
const_cast<char*>(m_data.start)[m_size] = 0;
|
||||||
|
return m_data.start;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string string_value() const
|
||||||
|
{
|
||||||
|
TORRENT_ASSERT(m_type == string_t);
|
||||||
|
return std::string(m_data.start, m_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
int string_length() const
|
||||||
|
{ return m_size; }
|
||||||
|
|
||||||
|
// dictionary functions
|
||||||
|
// ====================
|
||||||
|
|
||||||
|
void construct_dict(char const* begin)
|
||||||
|
{
|
||||||
|
TORRENT_ASSERT(m_type == none_t);
|
||||||
|
m_type = dict_t;
|
||||||
|
m_size = 0;
|
||||||
|
m_capacity = 0;
|
||||||
|
m_begin = begin;
|
||||||
|
}
|
||||||
|
|
||||||
|
lazy_entry* dict_append(char const* name);
|
||||||
|
lazy_entry* dict_find(char const* name);
|
||||||
|
lazy_entry const* dict_find(char const* name) const
|
||||||
|
{ return const_cast<lazy_entry*>(this)->dict_find(name); }
|
||||||
|
std::pair<char const*, lazy_entry const*> dict_at(int i) const
|
||||||
|
{
|
||||||
|
TORRENT_ASSERT(m_type == dict_t);
|
||||||
|
TORRENT_ASSERT(i < m_size);
|
||||||
|
return std::make_pair(m_data.dict[i].first, &m_data.dict[i].second);
|
||||||
|
}
|
||||||
|
|
||||||
|
int dict_size() const
|
||||||
|
{
|
||||||
|
TORRENT_ASSERT(m_type == dict_t);
|
||||||
|
return m_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
// list functions
|
||||||
|
// ==============
|
||||||
|
|
||||||
|
void construct_list(char const* begin)
|
||||||
|
{
|
||||||
|
TORRENT_ASSERT(m_type == none_t);
|
||||||
|
m_type = list_t;
|
||||||
|
m_size = 0;
|
||||||
|
m_capacity = 0;
|
||||||
|
m_begin = begin;
|
||||||
|
}
|
||||||
|
|
||||||
|
lazy_entry* list_append();
|
||||||
|
lazy_entry* list_at(int i)
|
||||||
|
{
|
||||||
|
TORRENT_ASSERT(m_type == list_t);
|
||||||
|
TORRENT_ASSERT(i < m_size);
|
||||||
|
return &m_data.list[i];
|
||||||
|
}
|
||||||
|
lazy_entry const* list_at(int i) const
|
||||||
|
{ return const_cast<lazy_entry*>(this)->list_at(i); }
|
||||||
|
|
||||||
|
int list_size() const
|
||||||
|
{
|
||||||
|
TORRENT_ASSERT(m_type == list_t);
|
||||||
|
return m_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
// end points one byte passed end
|
||||||
|
void set_end(char const* end)
|
||||||
|
{
|
||||||
|
TORRENT_ASSERT(end > m_begin);
|
||||||
|
m_end = end;
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear();
|
||||||
|
|
||||||
|
~lazy_entry()
|
||||||
|
{ clear(); }
|
||||||
|
|
||||||
|
// returns pointers into the source buffer where
|
||||||
|
// this entry has its bencoded data
|
||||||
|
std::pair<char const*, int> data_section();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
entry_type_t m_type;
|
||||||
|
union data_t
|
||||||
|
{
|
||||||
|
std::pair<char const*, lazy_entry>* dict;
|
||||||
|
lazy_entry* list;
|
||||||
|
char const* start;
|
||||||
|
} m_data;
|
||||||
|
int m_size; // if list or dictionary, the number of items
|
||||||
|
int m_capacity; // if list or dictionary, allocated number of items
|
||||||
|
// used for dictionaries and lists to record the range
|
||||||
|
// in the original buffer they are based on
|
||||||
|
char const* m_begin;
|
||||||
|
char const* m_end;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::ostream& operator<<(std::ostream& os, lazy_entry const& e);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2007, Arvid Norberg
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the author nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TORRENT_MAGNET_URI_HPP_INCLUDED
|
||||||
|
#define TORRENT_MAGNET_URI_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include "libtorrent/config.hpp"
|
||||||
|
#include "libtorrent/torrent_handle.hpp"
|
||||||
|
#include "libtorrent/session.hpp"
|
||||||
|
#include <boost/filesystem/path.hpp>
|
||||||
|
|
||||||
|
namespace libtorrent
|
||||||
|
{
|
||||||
|
namespace fs = boost::filesystem;
|
||||||
|
|
||||||
|
struct torrent_handle;
|
||||||
|
|
||||||
|
std::string TORRENT_EXPORT make_magnet_uri(torrent_handle const& handle);
|
||||||
|
|
||||||
|
torrent_handle TORRENT_EXPORT add_magnet_uri(session& ses, std::string const& uri
|
||||||
|
, fs::path const& save_path
|
||||||
|
, storage_mode_t storage_mode = storage_mode_sparse
|
||||||
|
, bool paused = false
|
||||||
|
, storage_constructor_type sc = default_storage_constructor
|
||||||
|
, void* userdata = 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,224 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2008, Arvid Norberg
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the author nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TORRENT_SSL_STREAM_HPP_INCLUDED
|
||||||
|
#define TORRENT_SSL_STREAM_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include "libtorrent/socket.hpp"
|
||||||
|
#include <asio/ssl.hpp>
|
||||||
|
|
||||||
|
// openssl seems to believe it owns
|
||||||
|
// this name in every single scope
|
||||||
|
#undef set_key
|
||||||
|
|
||||||
|
namespace libtorrent {
|
||||||
|
|
||||||
|
template <class Stream>
|
||||||
|
class ssl_stream
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
explicit ssl_stream(asio::io_service& io_service)
|
||||||
|
: m_context(io_service, asio::ssl::context::sslv23_client)
|
||||||
|
, m_sock(io_service, m_context)
|
||||||
|
{
|
||||||
|
m_context.set_verify_mode(asio::ssl::context::verify_none);
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef Stream next_layer_type;
|
||||||
|
typedef typename Stream::lowest_layer_type lowest_layer_type;
|
||||||
|
typedef typename Stream::endpoint_type endpoint_type;
|
||||||
|
typedef typename Stream::protocol_type protocol_type;
|
||||||
|
typedef typename asio::ssl::stream<Stream> sock_type;
|
||||||
|
|
||||||
|
typedef boost::function<void(asio::error_code const&)> handler_type;
|
||||||
|
|
||||||
|
template <class Handler>
|
||||||
|
void async_connect(endpoint_type const& endpoint, Handler const& handler)
|
||||||
|
{
|
||||||
|
// the connect is split up in the following steps:
|
||||||
|
// 1. connect to peer
|
||||||
|
// 2. perform SSL client handshake
|
||||||
|
|
||||||
|
// to avoid unnecessary copying of the handler,
|
||||||
|
// store it in a shaed_ptr
|
||||||
|
boost::shared_ptr<handler_type> h(new handler_type(handler));
|
||||||
|
|
||||||
|
m_sock.next_layer().async_connect(endpoint
|
||||||
|
, boost::bind(&ssl_stream::connected, this, _1, h));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Mutable_Buffers, class Handler>
|
||||||
|
void async_read_some(Mutable_Buffers const& buffers, Handler const& handler)
|
||||||
|
{
|
||||||
|
m_sock.async_read_some(buffers, handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Mutable_Buffers>
|
||||||
|
std::size_t read_some(Mutable_Buffers const& buffers, asio::error_code& ec)
|
||||||
|
{
|
||||||
|
return m_sock.read_some(buffers, ec);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_EXCEPTIONS
|
||||||
|
template <class Mutable_Buffers>
|
||||||
|
std::size_t read_some(Mutable_Buffers const& buffers)
|
||||||
|
{
|
||||||
|
return m_sock.read_some(buffers);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class IO_Control_Command>
|
||||||
|
void io_control(IO_Control_Command& ioc)
|
||||||
|
{
|
||||||
|
m_sock.next_layer().io_control(ioc);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template <class IO_Control_Command>
|
||||||
|
void io_control(IO_Control_Command& ioc, asio::error_code& ec)
|
||||||
|
{
|
||||||
|
m_sock.next_layer().io_control(ioc, ec);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Const_Buffers, class Handler>
|
||||||
|
void async_write_some(Const_Buffers const& buffers, Handler const& handler)
|
||||||
|
{
|
||||||
|
m_sock.async_write_some(buffers, handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_EXCEPTIONS
|
||||||
|
void bind(endpoint_type const& endpoint)
|
||||||
|
{
|
||||||
|
m_sock.next_layer().bind(endpoint);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void bind(endpoint_type const& endpoint, asio::error_code& ec)
|
||||||
|
{
|
||||||
|
m_sock.next_layer().bind(endpoint, ec);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_EXCEPTIONS
|
||||||
|
void open(protocol_type const& p)
|
||||||
|
{
|
||||||
|
m_sock.next_layer().open(p);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void open(protocol_type const& p, asio::error_code& ec)
|
||||||
|
{
|
||||||
|
m_sock.next_layer().open(p, ec);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_open() const
|
||||||
|
{
|
||||||
|
return const_cast<sock_type&>(m_sock).next_layer().is_open();
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_EXCEPTIONS
|
||||||
|
void close()
|
||||||
|
{
|
||||||
|
m_sock.next_layer().close();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void close(asio::error_code& ec)
|
||||||
|
{
|
||||||
|
m_sock.next_layer().close(ec);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_EXCEPTIONS
|
||||||
|
endpoint_type remote_endpoint() const
|
||||||
|
{
|
||||||
|
return const_cast<sock_type&>(m_sock).next_layer().remote_endpoint();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
endpoint_type remote_endpoint(asio::error_code& ec) const
|
||||||
|
{
|
||||||
|
return const_cast<sock_type&>(m_sock).next_layer().remote_endpoint(ec);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_EXCEPTIONS
|
||||||
|
endpoint_type local_endpoint() const
|
||||||
|
{
|
||||||
|
return const_cast<sock_type&>(m_sock).next_layer().local_endpoint();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
endpoint_type local_endpoint(asio::error_code& ec) const
|
||||||
|
{
|
||||||
|
return const_cast<sock_type&>(m_sock).next_layer().local_endpoint(ec);
|
||||||
|
}
|
||||||
|
|
||||||
|
asio::io_service& io_service()
|
||||||
|
{
|
||||||
|
return m_sock.io_service();
|
||||||
|
}
|
||||||
|
|
||||||
|
lowest_layer_type& lowest_layer()
|
||||||
|
{
|
||||||
|
return m_sock.lowest_layer();
|
||||||
|
}
|
||||||
|
|
||||||
|
next_layer_type& next_layer()
|
||||||
|
{
|
||||||
|
return m_sock.next_layer();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void connected(asio::error_code const& e, boost::shared_ptr<handler_type> h)
|
||||||
|
{
|
||||||
|
if (e)
|
||||||
|
{
|
||||||
|
(*h)(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_sock.async_handshake(asio::ssl::stream_base::client
|
||||||
|
, boost::bind(&ssl_stream::handshake, this, _1, h));
|
||||||
|
}
|
||||||
|
|
||||||
|
void handshake(asio::error_code const& e, boost::shared_ptr<handler_type> h)
|
||||||
|
{
|
||||||
|
(*h)(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
asio::ssl::context m_context;
|
||||||
|
asio::ssl::stream<Stream> m_sock;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,106 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2007, Arvid Norberg
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the author nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TORRENT_UDP_SOCKET_HPP_INCLUDED
|
||||||
|
#define TORRENT_UDP_SOCKET_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include "libtorrent/socket.hpp"
|
||||||
|
#include "libtorrent/session_settings.hpp"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <boost/function.hpp>
|
||||||
|
|
||||||
|
namespace libtorrent
|
||||||
|
{
|
||||||
|
class connection_queue;
|
||||||
|
|
||||||
|
class udp_socket
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef boost::function<void(asio::error_code const& ec
|
||||||
|
, udp::endpoint const&, char const* buf, int size)> callback_t;
|
||||||
|
|
||||||
|
udp_socket(asio::io_service& ios, callback_t const& c, connection_queue& cc);
|
||||||
|
|
||||||
|
bool is_open() const { return m_ipv4_sock.is_open() || m_ipv6_sock.is_open(); }
|
||||||
|
asio::io_service& get_io_service() { return m_ipv4_sock.get_io_service(); }
|
||||||
|
|
||||||
|
void send(udp::endpoint const& ep, char const* p, int len, asio::error_code& ec);
|
||||||
|
void bind(udp::endpoint const& ep, asio::error_code& ec);
|
||||||
|
void bind(int port);
|
||||||
|
void close();
|
||||||
|
int local_port() const { return m_bind_port; }
|
||||||
|
|
||||||
|
void set_proxy_settings(proxy_settings const& ps);
|
||||||
|
proxy_settings const& get_proxy_settings() { return m_proxy_settings; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
callback_t m_callback;
|
||||||
|
|
||||||
|
void on_read(udp::socket* sock, asio::error_code const& e, std::size_t bytes_transferred);
|
||||||
|
void on_name_lookup(asio::error_code const& e, tcp::resolver::iterator i);
|
||||||
|
void on_timeout();
|
||||||
|
void on_connect(int ticket);
|
||||||
|
void on_connected(asio::error_code const& ec);
|
||||||
|
void handshake1(asio::error_code const& e);
|
||||||
|
void handshake2(asio::error_code const& e);
|
||||||
|
void handshake3(asio::error_code const& e);
|
||||||
|
void handshake4(asio::error_code const& e);
|
||||||
|
void socks_forward_udp();
|
||||||
|
void connect1(asio::error_code const& e);
|
||||||
|
void connect2(asio::error_code const& e);
|
||||||
|
|
||||||
|
void wrap(udp::endpoint const& ep, char const* p, int len, asio::error_code& ec);
|
||||||
|
void unwrap(asio::error_code const& e, char const* buf, int size);
|
||||||
|
|
||||||
|
udp::socket m_ipv4_sock;
|
||||||
|
udp::socket m_ipv6_sock;
|
||||||
|
udp::endpoint m_v4_ep;
|
||||||
|
udp::endpoint m_v6_ep;
|
||||||
|
char m_v4_buf[1600];
|
||||||
|
char m_v6_buf[1600];
|
||||||
|
int m_bind_port;
|
||||||
|
|
||||||
|
tcp::socket m_socks5_sock;
|
||||||
|
int m_connection_ticket;
|
||||||
|
proxy_settings m_proxy_settings;
|
||||||
|
connection_queue& m_cc;
|
||||||
|
tcp::resolver m_resolver;
|
||||||
|
char m_tmp_buf[100];
|
||||||
|
bool m_tunnel_packets;
|
||||||
|
udp::endpoint m_proxy_addr;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue