From e7a379551cd0b0a2589f8db8a4406d1cd28c298b Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Thu, 13 Apr 2017 06:48:01 -0700 Subject: [PATCH] discourage forward declarations of libtorrent types, introduce forward declaration header (#1910) --- ChangeLog | 2 + docs/manual.rst | 16 +- docs/troubleshooting.rst | 6 +- examples/session_view.cpp | 36 ++++ examples/session_view.hpp | 36 +++- examples/torrent_view.cpp | 33 ++++ examples/torrent_view.hpp | 35 +++- include/libtorrent/Makefile.am | 1 + include/libtorrent/alert_types.hpp | 2 +- include/libtorrent/error_code.hpp | 2 +- include/libtorrent/fwd.hpp | 265 +++++++++++++++++++++++++++++ include/libtorrent/magnet_uri.hpp | 22 +-- include/libtorrent/session.hpp | 2 +- tools/gen_fwd.py | 96 +++++++++++ 14 files changed, 532 insertions(+), 22 deletions(-) create mode 100644 include/libtorrent/fwd.hpp create mode 100644 tools/gen_fwd.py diff --git a/ChangeLog b/ChangeLog index 2b15ce583..694518b00 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,5 @@ + * forward declaring libtorrent types is discouraged. a new fwd.hpp header is provided + 1.1.3 release * removed (broken) support for incoming connections over socks5 diff --git a/docs/manual.rst b/docs/manual.rst index 722512315..678e66e23 100644 --- a/docs/manual.rst +++ b/docs/manual.rst @@ -46,8 +46,15 @@ For a description on how to create torrent files, see create_torrent. .. _make_torrent: make_torrent.html -things to keep in mind -====================== +forward declarations +==================== + +Forward declaring types from the libtorrent namespace is discouraged as it may +break in future releases. Instead include ``libtorrent/fwd.hpp`` for forward +declarations of all public types in libtorrent. + +trouble shooting +================ A common problem developers are facing is torrents stopping without explanation. Here is a description on which conditions libtorrent will stop your torrents, @@ -73,6 +80,11 @@ from certain disk errors if the problem is resolved. If the torrent is not auto managed, you have to call set_upload_mode() to turn downloading back on again. +For a more detailed guide on how to trouble shoot performance issues, see +troubleshooting_ + +.. _troubleshooting: troubleshooting.html + network primitives ================== diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst index bb851bcb4..e2682f878 100644 --- a/docs/troubleshooting.rst +++ b/docs/troubleshooting.rst @@ -10,9 +10,9 @@ libtorrent manual :backlinks: none The following troubleshooting chart may help in finding out why torrents fail -to download. It is not complete, please submit suggestions via mail to -arvid@libtorrent.org or to the `mailing list`_. Ideally in the form of patches -against ``docs/troubleshooting.dot``. +to download. It is not complete, please submit suggestions via pull requests at +https://github.com/arvidn/libtorrent or to the `mailing list`_. Ideally in the +form of patches against ``docs/troubleshooting.dot``. .. _`mailing list`: http://lists.sourceforge.net/lists/listinfo/libtorrent-discuss diff --git a/examples/session_view.cpp b/examples/session_view.cpp index a2011d2b4..2cfc10df6 100644 --- a/examples/session_view.cpp +++ b/examples/session_view.cpp @@ -1,8 +1,44 @@ +/* + +Copyright (c) 2003-2017, 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. + +*/ + #include "session_view.hpp" #include "print.hpp" +#include "libtorrent/session_stats.hpp" +#include "libtorrent/torrent_handle.hpp" #include // for std::max +namespace lt = libtorrent; + session_view::session_view() : m_position(0) , m_print_utp_stats(false) diff --git a/examples/session_view.hpp b/examples/session_view.hpp index 12fa29860..e7a7484fe 100644 --- a/examples/session_view.hpp +++ b/examples/session_view.hpp @@ -1,10 +1,40 @@ +/* + +Copyright (c) 2003-2017, 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 SESSION_VIEW_HPP_ #define SESSION_VIEW_HPP_ -#include "libtorrent/session_stats.hpp" #include - -namespace lt = libtorrent; +#include struct session_view { diff --git a/examples/torrent_view.cpp b/examples/torrent_view.cpp index 75c8a5d0c..4c6ebf21b 100644 --- a/examples/torrent_view.cpp +++ b/examples/torrent_view.cpp @@ -1,5 +1,38 @@ +/* + +Copyright (c) 2003-2017, 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. + +*/ + #include "torrent_view.hpp" #include "print.hpp" +#include "libtorrent/torrent_handle.hpp" #include "libtorrent/torrent_status.hpp" const int header_size = 2; diff --git a/examples/torrent_view.hpp b/examples/torrent_view.hpp index 0060b8c47..15946e081 100644 --- a/examples/torrent_view.hpp +++ b/examples/torrent_view.hpp @@ -1,3 +1,35 @@ +/* + +Copyright (c) 2003-2017, 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_VIEW_HPP_ #define TORRENT_VIEW_HPP_ @@ -5,7 +37,8 @@ #include #include -#include "libtorrent/torrent_handle.hpp" +#include "libtorrent/fwd.hpp" +#include "libtorrent/torrent_status.hpp" namespace lt = libtorrent; diff --git a/include/libtorrent/Makefile.am b/include/libtorrent/Makefile.am index 508541838..7c6d42480 100644 --- a/include/libtorrent/Makefile.am +++ b/include/libtorrent/Makefile.am @@ -51,6 +51,7 @@ nobase_include_HEADERS = \ file_pool.hpp \ file_storage.hpp \ fingerprint.hpp \ + fwd.hpp \ gzip.hpp \ hasher.hpp \ hex.hpp \ diff --git a/include/libtorrent/alert_types.hpp b/include/libtorrent/alert_types.hpp index 93af05996..ff93750d5 100644 --- a/include/libtorrent/alert_types.hpp +++ b/include/libtorrent/alert_types.hpp @@ -1885,7 +1885,7 @@ namespace libtorrent }; #ifndef TORRENT_NO_DEPRECATE - struct TORRENT_DEPRECATED TORRENT_EXPORT mmap_cache_alert TORRENT_FINAL : alert + struct TORRENT_DEPRECATED_EXPORT mmap_cache_alert TORRENT_FINAL : alert { mmap_cache_alert(aux::stack_allocator& alloc , error_code const& ec); diff --git a/include/libtorrent/error_code.hpp b/include/libtorrent/error_code.hpp index 8cffcc11f..fa1ac1721 100644 --- a/include/libtorrent/error_code.hpp +++ b/include/libtorrent/error_code.hpp @@ -500,7 +500,7 @@ namespace libtorrent #endif #ifndef BOOST_NO_EXCEPTIONS - struct TORRENT_EXPORT libtorrent_exception: std::exception + struct TORRENT_EXPORT libtorrent_exception : std::exception { libtorrent_exception(error_code const& s): m_error(s), m_msg(0) {} virtual const char* what() const TORRENT_EXCEPTION_THROW_SPECIFIER; diff --git a/include/libtorrent/fwd.hpp b/include/libtorrent/fwd.hpp new file mode 100644 index 000000000..b9f44ddd2 --- /dev/null +++ b/include/libtorrent/fwd.hpp @@ -0,0 +1,265 @@ +/* + +Copyright (c) 2017, 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_FWD_HPP +#define TORRENT_FWD_HPP + +#include "libtorrent/export.hpp" + +namespace libtorrent { + +// include/libtorrent/add_torrent_params.hpp +struct add_torrent_params; + +// include/libtorrent/alert.hpp +class alert; + +// include/libtorrent/alert_types.hpp +struct torrent_alert; +struct peer_alert; +struct tracker_alert; +struct torrent_removed_alert; +struct read_piece_alert; +struct file_completed_alert; +struct file_renamed_alert; +struct file_rename_failed_alert; +struct performance_alert; +struct state_changed_alert; +struct tracker_error_alert; +struct tracker_warning_alert; +struct scrape_reply_alert; +struct scrape_failed_alert; +struct tracker_reply_alert; +struct dht_reply_alert; +struct tracker_announce_alert; +struct hash_failed_alert; +struct peer_ban_alert; +struct peer_unsnubbed_alert; +struct peer_snubbed_alert; +struct peer_error_alert; +struct peer_connect_alert; +struct peer_disconnected_alert; +struct invalid_request_alert; +struct torrent_finished_alert; +struct piece_finished_alert; +struct request_dropped_alert; +struct block_timeout_alert; +struct block_finished_alert; +struct block_downloading_alert; +struct unwanted_block_alert; +struct storage_moved_alert; +struct storage_moved_failed_alert; +struct torrent_deleted_alert; +struct torrent_delete_failed_alert; +struct save_resume_data_alert; +struct save_resume_data_failed_alert; +struct torrent_paused_alert; +struct torrent_resumed_alert; +struct torrent_checked_alert; +struct url_seed_alert; +struct file_error_alert; +struct metadata_failed_alert; +struct metadata_received_alert; +struct udp_error_alert; +struct external_ip_alert; +struct listen_failed_alert; +struct listen_succeeded_alert; +struct portmap_error_alert; +struct portmap_alert; +struct portmap_log_alert; +struct fastresume_rejected_alert; +struct peer_blocked_alert; +struct dht_announce_alert; +struct dht_get_peers_alert; +struct stats_alert; +struct cache_flushed_alert; +struct anonymous_mode_alert; +struct lsd_peer_alert; +struct trackerid_alert; +struct dht_bootstrap_alert; +struct torrent_error_alert; +struct torrent_need_cert_alert; +struct incoming_connection_alert; +struct add_torrent_alert; +struct state_update_alert; +struct session_stats_alert; +struct torrent_update_alert; +struct rss_item_alert; +struct dht_error_alert; +struct dht_immutable_item_alert; +struct dht_mutable_item_alert; +struct dht_put_alert; +struct i2p_alert; +struct dht_outgoing_get_peers_alert; +struct log_alert; +struct torrent_log_alert; +struct peer_log_alert; +struct lsd_error_alert; +struct dht_lookup; +struct dht_routing_bucket; +struct dht_stats_alert; +struct incoming_request_alert; +struct dht_log_alert; +struct dht_pkt_alert; +struct dht_get_peers_reply_alert; +struct dht_direct_response_alert; +struct picker_log_alert; + +// include/libtorrent/announce_entry.hpp +struct announce_entry; + +// include/libtorrent/bdecode.hpp +struct bdecode_node; + +// include/libtorrent/bitfield.hpp +struct bitfield; + +// include/libtorrent/create_torrent.hpp +struct create_torrent; + +// include/libtorrent/disk_buffer_holder.hpp +struct disk_buffer_holder; + +// include/libtorrent/disk_io_thread.hpp +struct cache_status; + +// include/libtorrent/entry.hpp +class entry; + +// include/libtorrent/error_code.hpp +struct libtorrent_exception; +struct storage_error; + +// include/libtorrent/extensions.hpp +struct plugin; +struct torrent_plugin; +struct peer_plugin; +struct crypto_plugin; + +// include/libtorrent/file_pool.hpp +struct file_pool; + +// include/libtorrent/file_storage.hpp +struct file_slice; +class file_storage; + +// include/libtorrent/hasher.hpp +class hasher; + +// include/libtorrent/ip_filter.hpp +struct ip_filter; +class port_filter; + +// include/libtorrent/kademlia/dht_storage.hpp +struct dht_storage_counters; +struct dht_storage_interface; + +// include/libtorrent/peer_connection_handle.hpp +struct peer_connection_handle; +struct bt_peer_connection_handle; + +// include/libtorrent/peer_info.hpp +struct peer_info; +struct peer_list_entry; + +// include/libtorrent/peer_request.hpp +struct peer_request; + +// include/libtorrent/rss.hpp +struct feed_item; +struct feed_settings; +struct feed_status; +struct feed_handle; + +// include/libtorrent/session.hpp +class session_proxy; +class session; + +// include/libtorrent/session_handle.hpp +struct session_handle; + +// include/libtorrent/session_settings.hpp +struct session_settings; +struct dht_settings; +struct pe_settings; + +// include/libtorrent/session_stats.hpp +struct stats_metric; + +// include/libtorrent/session_status.hpp +struct utp_status; +struct session_status; + +// include/libtorrent/settings_pack.hpp +struct settings_pack; + +// include/libtorrent/sha1_hash.hpp +class sha1_hash; + +// include/libtorrent/storage.hpp +struct storage_interface; +class default_storage; + +// include/libtorrent/storage_defs.hpp +struct storage_params; + +// include/libtorrent/torrent_handle.hpp +struct block_info; +struct partial_piece_info; +struct torrent_handle; + +// include/libtorrent/torrent_info.hpp +struct web_seed_entry; +class torrent_info; + +// include/libtorrent/torrent_status.hpp +struct torrent_status; + +#ifndef TORRENT_NO_DEPRECATE + +// include/libtorrent/alert_types.hpp +struct torrent_added_alert; +struct mmap_cache_alert; + +// include/libtorrent/file_storage.hpp +struct file_entry; +struct internal_file_entry; + +// include/libtorrent/lazy_entry.hpp +struct pascal_string; +struct lazy_entry; + +#endif // TORRENT_NO_DEPRECATE + +} + +#endif // TORRENT_FWD_HPP diff --git a/include/libtorrent/magnet_uri.hpp b/include/libtorrent/magnet_uri.hpp index 9b0f7b66b..444751735 100644 --- a/include/libtorrent/magnet_uri.hpp +++ b/include/libtorrent/magnet_uri.hpp @@ -48,14 +48,14 @@ namespace libtorrent // // For more information about magnet links, see magnet-links_. // - std::string TORRENT_EXPORT make_magnet_uri(torrent_handle const& handle); - std::string TORRENT_EXPORT make_magnet_uri(torrent_info const& info); + TORRENT_EXPORT std::string make_magnet_uri(torrent_handle const& handle); + TORRENT_EXPORT std::string make_magnet_uri(torrent_info const& info); #ifndef TORRENT_NO_DEPRECATE #ifndef BOOST_NO_EXCEPTIONS // deprecated in 0.14 - TORRENT_DEPRECATED - torrent_handle TORRENT_EXPORT add_magnet_uri(session& ses, std::string const& uri + TORRENT_DEPRECATED_EXPORT + torrent_handle add_magnet_uri(session& ses, std::string const& uri , std::string const& save_path , storage_mode_t storage_mode = storage_mode_sparse , bool paused = false @@ -63,24 +63,26 @@ namespace libtorrent , void* userdata = 0); // deprecated in 0.16. Instead, pass in the magnet link as add_torrent_params::url - TORRENT_DEPRECATED - torrent_handle TORRENT_EXPORT add_magnet_uri(session& ses, std::string const& uri + TORRENT_DEPRECATED_EXPORT + torrent_handle add_magnet_uri(session& ses, std::string const& uri , add_torrent_params const& p); #endif // deprecated in 0.16. Instead, pass in the magnet link as add_torrent_params::url - TORRENT_DEPRECATED - torrent_handle TORRENT_EXPORT add_magnet_uri(session& ses, std::string const& uri + TORRENT_DEPRECATED_EXPORT + torrent_handle add_magnet_uri(session& ses, std::string const& uri , add_torrent_params const& p, error_code& ec); #endif // This function parses out information from the magnet link and populates the // add_torrent_params object. - TORRENT_EXPORT void parse_magnet_uri(std::string const& uri, add_torrent_params& p, error_code& ec); + TORRENT_EXPORT + void parse_magnet_uri(std::string const& uri, add_torrent_params& p, error_code& ec); // internal, delete when merge in master - TORRENT_EXTRA_EXPORT void parse_magnet_uri_peers(std::string const& uri, std::vector& peers); + TORRENT_EXTRA_EXPORT + void parse_magnet_uri_peers(std::string const& uri, std::vector& peers); } #endif diff --git a/include/libtorrent/session.hpp b/include/libtorrent/session.hpp index 6a0476d3a..7f6e91650 100644 --- a/include/libtorrent/session.hpp +++ b/include/libtorrent/session.hpp @@ -155,7 +155,7 @@ namespace libtorrent // the settings to be set and pass it in to ``session::apply_settings()``. // // see apply_settings(). - class TORRENT_EXPORT session: public boost::noncopyable, public session_handle + class TORRENT_EXPORT session : public boost::noncopyable, public session_handle { public: diff --git a/tools/gen_fwd.py b/tools/gen_fwd.py new file mode 100644 index 000000000..8febe76e8 --- /dev/null +++ b/tools/gen_fwd.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python + +import os +import sys + +file_header ='''/* + +Copyright (c) 2017, 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_FWD_HPP +#define TORRENT_FWD_HPP + +#include "libtorrent/export.hpp" + +namespace libtorrent { +''' + +file_footer = ''' + +} + +#endif // TORRENT_FWD_HPP +''' + +classes = os.popen('git grep TORRENT_EXPORT').read().split('\n') + +deprecated_classes = os.popen('git grep TORRENT_DEPRECATED_EXPORT').read().split('\n') + +def filter_classes(classes, keyword): + current_file = '' + ret = '' + for c in classes: + line = c.split(':', 1) + if not line[0].endswith('.hpp'): continue + # ignore the forward header itself, that's the one we're generating + if line[0].endswith('/fwd.hpp'): continue + # don't provide forward declarations of internal types + if '/aux_/' in line[0]: continue + this_file = line[0].strip() + decl = ':'.join(line[1:]).strip().split(' ') + + if decl[0].strip() not in ['struct', 'class']: continue + # TODO: support TORRENT_DEPRECATED_EXPORT + if decl[1].strip() != keyword: continue + + if this_file != current_file: + ret += '\n// ' + this_file + '\n' + current_file = this_file; + decl = decl[0] + ' ' + decl[2] + if not decl.endswith(';'): decl += ';' + ret += decl + '\n' + return ret + +os.remove('include/libtorrent/fwd.hpp') +with open('include/libtorrent/fwd.hpp', 'w+') as f: + f.write(file_header) + + f.write(filter_classes(classes, 'TORRENT_EXPORT')); + + f.write('\n#ifndef TORRENT_NO_DEPRECATE\n') + + f.write(filter_classes(deprecated_classes, 'TORRENT_DEPRECATED_EXPORT')); + + f.write('\n#endif // TORRENT_NO_DEPRECATE') + + f.write(file_footer) + +