From fe414878b2b0c0bfd2db1359be947fe2156395e2 Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Sun, 17 Nov 2013 22:38:37 +0000 Subject: [PATCH] cleanup of ABI breaking configuration options. TORRENT_DEBUG is believed to no longer affect the ABI of libtorrent. introduce a warning in gen_reference_doc.py for when defines are used in public structs. fix build with deprecated functions off --- docs/gen_reference_doc.py | 17 +++++++++-- include/libtorrent/add_torrent_params.hpp | 9 ++++-- include/libtorrent/build_config.hpp | 21 +------------ include/libtorrent/peer_info.hpp | 2 -- include/libtorrent/torrent_info.hpp | 26 ++++------------ src/file_storage.cpp | 37 ++++++++++++----------- src/peer_connection.cpp | 4 +-- src/torrent_info.cpp | 16 ++++------ 8 files changed, 55 insertions(+), 77 deletions(-) diff --git a/docs/gen_reference_doc.py b/docs/gen_reference_doc.py index 02a0ecebe..391d2b302 100644 --- a/docs/gen_reference_doc.py +++ b/docs/gen_reference_doc.py @@ -254,7 +254,7 @@ def parse_class(lno, lines, filename): continue if l.startswith('#'): - lno = consume_ifdef(lno - 1, lines) + lno = consume_ifdef(lno - 1, lines, True) continue if 'TORRENT_DEFINE_ALERT' in l: @@ -438,7 +438,7 @@ def consume_comment(lno, lines): return lno -def consume_ifdef(lno, lines): +def consume_ifdef(lno, lines, warn_on_ifdefs = False): l = lines[lno].strip() lno += 1 @@ -447,6 +447,19 @@ def consume_ifdef(lno, lines): if verbose: print 'prep %s' % l + if warn_on_ifdefs and ('TORRENT_DEBUG' in l or 'TORRENT_DISABLE_FULL_STATS' in l): + print '***\nWARNING: possible ABI breakage in public struct!\n %s:%d\n***' % \ + (filename, lno) + + if warn_on_ifdefs and '#if' in l: + define = l.replace('#ifndef', '').replace('#ifdef', '') \ + .replace('#if', '').replace('defined', '') \ + .replace('TORRENT_USE_IPV6', '').replace('TORRENT_NO_DEPRECATE', '') \ + .replace('||', '').replace('&&', '').replace('(', '').replace(')','') \ + .replace('!', '').strip() + if define != '': + print 'sensitive define in public struct: "%s"\n %s:%d' % (define, filename, lno) + if l == '#ifndef TORRENT_NO_DEPRECATE' or \ l == '#ifdef TORRENT_DEBUG' or \ l == '#ifdef TORRENT_ASIO_DEBUGGING' or \ diff --git a/include/libtorrent/add_torrent_params.hpp b/include/libtorrent/add_torrent_params.hpp index 561e1e8ad..8e00c338a 100644 --- a/include/libtorrent/add_torrent_params.hpp +++ b/include/libtorrent/add_torrent_params.hpp @@ -48,6 +48,10 @@ POSSIBILITY OF SUCH DAMAGE. namespace libtorrent { class torrent_info; +#ifdef TORRENT_DISABLE_EXTENSIONS + struct torrent; + struct torrent_plugin; +#endif // The add_torrent_params is a parameter pack for adding torrents to a session. // The key fields when adding a torrent are: @@ -330,15 +334,14 @@ namespace libtorrent int upload_limit; int download_limit; -#ifndef TORRENT_DISABLE_EXTENSIONS // torrent extension construction functions can be added to this // vector to have them be added immediately when the torrent is // constructed. This may be desired over the torrent_handle::add_extension() // in order to avoid race conditions. For instance it may be important // to have the plugin catch events that happen very early on after // the torrent is created. - std::vector(torrent*, void*)> > extensions; -#endif + std::vector(torrent*, void*)> > + extensions; }; } diff --git a/include/libtorrent/build_config.hpp b/include/libtorrent/build_config.hpp index f4159fb7a..82514cad8 100644 --- a/include/libtorrent/build_config.hpp +++ b/include/libtorrent/build_config.hpp @@ -37,12 +37,6 @@ POSSIBILITY OF SUCH DAMAGE. #include #include -#ifdef TORRENT_DEBUG -#define TORRENT_CFG_DEBUG dbg_ -#else -#define TORRENT_CFG_DEBUG rel_ -#endif - #if TORRENT_USE_BOOST_DATE_TIME #define TORRENT_CFG_TIME boosttime_ #elif TORRENT_USE_ABSOLUTE_TIME @@ -63,29 +57,16 @@ POSSIBILITY OF SUCH DAMAGE. #define TORRENT_CFG_IPV6 noipv_- #endif -#ifdef _UNICODE -#define TORRENT_CFG_UNICODE unicode_ -#else -#define TORRENT_CFG_UNICODE ansi_ -#endif - #ifdef TORRENT_NO_DEPRECATE #define TORRENT_CFG_DEPR nodeprecate_ #else #define TORRENT_CFG_DEPR deprecated_ #endif -#ifdef TORRENT_DISABLE_FULL_STATS -#define TORRENT_CFG_STATS partialstats_ -#else -#define TORRENT_CFG_STATS fullstats_ -#endif - #define TORRENT_CFG \ - BOOST_PP_CAT(TORRENT_CFG_DEBUG, \ BOOST_PP_CAT(TORRENT_CFG_TIME, \ BOOST_PP_CAT(TORRENT_CFG_LOG, \ - TORRENT_CFG_DEPR))) + TORRENT_CFG_DEPR)) #define TORRENT_CFG_STRING BOOST_PP_STRINGIZE(TORRENT_CFG) diff --git a/include/libtorrent/peer_info.hpp b/include/libtorrent/peer_info.hpp index 6a7a202a5..a36a37051 100644 --- a/include/libtorrent/peer_info.hpp +++ b/include/libtorrent/peer_info.hpp @@ -272,14 +272,12 @@ namespace libtorrent // __ http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html char country[2]; -#ifndef TORRENT_DISABLE_GEO_IP // the name of the AS this peer is located in. This might be // an empty string if there is no name in the geo ip database. std::string inet_as_name; // the AS number the peer is located in. int inet_as; -#endif // a measurement of the balancing of free download (that we get) // and free upload that we give. Every peer gets a certain amount of free upload, but diff --git a/include/libtorrent/torrent_info.hpp b/include/libtorrent/torrent_info.hpp index 22d9ed56f..3db87ebc6 100644 --- a/include/libtorrent/torrent_info.hpp +++ b/include/libtorrent/torrent_info.hpp @@ -299,10 +299,6 @@ namespace libtorrent { public: -#ifdef TORRENT_DEBUG - void check_invariant() const; -#endif - // The constructor that takes an info-hash will initialize the info-hash to the given value, // but leave all other fields empty. This is used internally when downloading torrents without // the metadata. The metadata will be created by libtorrent as soon as it has been downloaded @@ -527,15 +523,7 @@ namespace libtorrent // Returns the SSL root certificate for the torrent, if it is an SSL // torrent. Otherwise returns an empty string. The certificate is // the the public certificate in x509 format. -#ifdef TORRENT_USE_OPENSSL - std::string const& ssl_cert() const { return m_ssl_root_cert; } -#else - std::string ssl_cert() const - { - if (m_info_dict.type() != lazy_entry::dict_t) return ""; - return m_info_dict.dict_find_string_value("ssl-cert"); - } -#endif + std::string ssl_cert() const; // returns true if this torrent_info object has a torrent loaded. // This is primarily used to determine if a magnet link has had its @@ -673,6 +661,11 @@ namespace libtorrent private: #endif +#ifdef TORRENT_DEBUG + friend class invariant_access; + void check_invariant() const; +#endif + // not assignable torrent_info const& operator=(torrent_info const&); @@ -717,13 +710,6 @@ namespace libtorrent // to create the torrent file std::string m_created_by; -#ifdef TORRENT_USE_OPENSSL - // for ssl-torrens, this contains the root - // certificate, in .pem format (i.e. ascii - // base64 encoded with head and tails) - std::string m_ssl_root_cert; -#endif - // the info section parsed. points into m_info_section // parsed lazily mutable lazy_entry m_info_dict; diff --git a/src/file_storage.cpp b/src/file_storage.cpp index babd5a2d0..3dd3c17a4 100644 --- a/src/file_storage.cpp +++ b/src/file_storage.cpp @@ -137,8 +137,8 @@ namespace libtorrent internal_file_entry::internal_file_entry(internal_file_entry const& fe) : name(0) , offset(fe.offset) - , symlink_index(fe.symlink_index) , size(fe.size) + , symlink_index(fe.symlink_index) , name_len(fe.name_len) , pad_file(fe.pad_file) , hidden_attribute(fe.hidden_attribute) @@ -518,7 +518,22 @@ namespace libtorrent { TORRENT_ASSERT(index >= 0 && index < int(m_files.size())); internal_file_entry const& fe = m_files[index]; - return file_path(fe, save_path); + + // -2 means this is an absolute path filename + if (fe.path_index == -2) return fe.filename(); + + // -1 means no path + if (fe.path_index == -1) return combine_path(save_path, fe.filename()); + + if (fe.no_root_dir) + return combine_path(save_path + , combine_path(m_paths[fe.path_index] + , fe.filename())); + + return combine_path(save_path + , combine_path(m_name + , combine_path(m_paths[fe.path_index] + , fe.filename()))); } std::string file_storage::file_name(int index) const @@ -601,22 +616,8 @@ namespace libtorrent std::string file_storage::file_path(internal_file_entry const& fe , std::string const& save_path) const { - TORRENT_ASSERT(fe.path_index >= -2 && fe.path_index < int(m_paths.size())); - // -2 means this is an absolute path filename - if (fe.path_index == -2) return fe.filename(); - - // -1 means no path - if (fe.path_index == -1) return combine_path(save_path, fe.filename()); - - if (fe.no_root_dir) - return combine_path(save_path - , combine_path(m_paths[fe.path_index] - , fe.filename())); - - return combine_path(save_path - , combine_path(m_name - , combine_path(m_paths[fe.path_index] - , fe.filename()))); + int index = &fe - &m_files[0]; + return file_path(index); } std::string file_storage::file_name(internal_file_entry const& fe) const diff --git a/src/peer_connection.cpp b/src/peer_connection.cpp index c10131d52..8feaf3155 100644 --- a/src/peer_connection.cpp +++ b/src/peer_connection.cpp @@ -3862,6 +3862,8 @@ namespace libtorrent p.flags |= pi->optimistically_unchoked ? peer_info::optimistic_unchoke : 0; #ifndef TORRENT_DISABLE_GEO_IP p.inet_as = pi->inet_as ? pi->inet_as->first : 0xffff; +#else + p.inet_as = 0xffff; #endif } else @@ -3869,9 +3871,7 @@ namespace libtorrent p.source = 0; p.failcount = 0; p.num_hashfails = 0; -#ifndef TORRENT_DISABLE_GEO_IP p.inet_as = 0xffff; -#endif } p.remote_dl_rate = m_remote_dl_rate; diff --git a/src/torrent_info.cpp b/src/torrent_info.cpp index 794d11db9..299c267d2 100644 --- a/src/torrent_info.cpp +++ b/src/torrent_info.cpp @@ -576,9 +576,6 @@ namespace libtorrent , m_piece_hashes(t.m_piece_hashes) , m_comment(t.m_comment) , m_created_by(t.m_created_by) -#ifdef TORRENT_USE_OPENSSL - , m_ssl_root_cert(t.m_ssl_root_cert) -#endif , m_creation_date(t.m_creation_date) , m_info_hash(t.m_info_hash) , m_info_section_size(t.m_info_section_size) @@ -884,9 +881,6 @@ namespace libtorrent swap(m_creation_date, ti.m_creation_date); m_comment.swap(ti.m_comment); m_created_by.swap(ti.m_created_by); -#ifdef TORRENT_USE_OPENSSL - m_ssl_root_cert.swap(ti.m_ssl_root_cert); -#endif boost::uint32_t tmp; SWAP(m_multifile, ti.m_multifile); SWAP(m_private, ti.m_private); @@ -901,6 +895,12 @@ namespace libtorrent #undef SWAP + std::string torrent_info::ssl_cert() const + { + if (m_info_dict.type() != lazy_entry::dict_t) return ""; + return m_info_dict.dict_find_string_value("ssl-cert"); + } + bool torrent_info::parse_info_section(lazy_entry const& info, error_code& ec, int flags) { if (info.type() != lazy_entry::dict_t) @@ -1064,10 +1064,6 @@ namespace libtorrent m_private = info.dict_find_int_value("private", 0); -#ifdef TORRENT_USE_OPENSSL - m_ssl_root_cert = info.dict_find_string_value("ssl-cert"); -#endif - return true; }