mirror of https://github.com/aria2/aria2
Merge branch 'master' into random-webseeding
commit
c81b132112
|
@ -0,0 +1,36 @@
|
||||||
|
language: cpp
|
||||||
|
compiler:
|
||||||
|
- clang
|
||||||
|
- gcc
|
||||||
|
sudo: false
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
- ubuntu-toolchain-r-test
|
||||||
|
packages:
|
||||||
|
- g++-4.9
|
||||||
|
- libstdc++-4.9-dev
|
||||||
|
- autoconf
|
||||||
|
- automake
|
||||||
|
- autotools-dev
|
||||||
|
- autopoint
|
||||||
|
- libtool
|
||||||
|
- pkg-config
|
||||||
|
- libssl-dev
|
||||||
|
- libc-ares-dev
|
||||||
|
- libxml2-dev
|
||||||
|
- zlib1g-dev
|
||||||
|
- libsqlite3-dev
|
||||||
|
- libssh2-1-dev
|
||||||
|
- libcppunit-dev
|
||||||
|
before_install:
|
||||||
|
- $CC --version
|
||||||
|
- if [ "$CXX" = "g++" ]; then export CXX="g++-4.9" CC="gcc-4.9"; fi
|
||||||
|
- $CC --version
|
||||||
|
before_script:
|
||||||
|
- autoreconf -i
|
||||||
|
- automake
|
||||||
|
- autoconf
|
||||||
|
- ./configure
|
||||||
|
script:
|
||||||
|
- make check
|
|
@ -26,9 +26,10 @@ RUN apt-get install -y make binutils autoconf automake autotools-dev libtool \
|
||||||
|
|
||||||
RUN curl -L -O https://gmplib.org/download/gmp/gmp-6.0.0a.tar.lz
|
RUN curl -L -O https://gmplib.org/download/gmp/gmp-6.0.0a.tar.lz
|
||||||
RUN curl -L -O http://downloads.sourceforge.net/project/expat/expat/2.1.0/expat-2.1.0.tar.gz
|
RUN curl -L -O http://downloads.sourceforge.net/project/expat/expat/2.1.0/expat-2.1.0.tar.gz
|
||||||
RUN curl -L -O http://www.sqlite.org/2015/sqlite-autoconf-3080802.tar.gz
|
RUN curl -L -O http://www.sqlite.org/2015/sqlite-autoconf-3080803.tar.gz
|
||||||
RUN curl -L -O http://zlib.net/zlib-1.2.8.tar.xz
|
RUN curl -L -O http://zlib.net/zlib-1.2.8.tar.xz
|
||||||
RUN curl -L -O http://c-ares.haxx.se/download/c-ares-1.10.0.tar.gz
|
RUN curl -L -O http://c-ares.haxx.se/download/c-ares-1.10.0.tar.gz
|
||||||
|
RUN curl -L -O http://libssh2.org/download/libssh2-1.5.0.tar.gz
|
||||||
|
|
||||||
RUN tar xf gmp-6.0.0a.tar.lz
|
RUN tar xf gmp-6.0.0a.tar.lz
|
||||||
RUN cd gmp-6.0.0 && \
|
RUN cd gmp-6.0.0 && \
|
||||||
|
@ -52,8 +53,8 @@ RUN cd expat-2.1.0 && \
|
||||||
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` && \
|
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` && \
|
||||||
make install
|
make install
|
||||||
|
|
||||||
RUN tar xf sqlite-autoconf-3080700.tar.gz
|
RUN tar xf sqlite-autoconf-3080803.tar.gz
|
||||||
RUN cd sqlite-autoconf-3080700 && \
|
RUN cd sqlite-autoconf-3080803 && \
|
||||||
./configure \
|
./configure \
|
||||||
--disable-shared \
|
--disable-shared \
|
||||||
--enable-static \
|
--enable-static \
|
||||||
|
@ -88,6 +89,19 @@ RUN cd c-ares-1.10.0 && \
|
||||||
LIBS="-lws2_32" && \
|
LIBS="-lws2_32" && \
|
||||||
make install
|
make install
|
||||||
|
|
||||||
|
RUN tar xf libssh2-1.5.0.tar.gz
|
||||||
|
RUN cd libssh2-1.5.0 && \
|
||||||
|
./configure \
|
||||||
|
--disable-shared \
|
||||||
|
--enable-static \
|
||||||
|
--prefix=/usr/local/$HOST \
|
||||||
|
--host=$HOST \
|
||||||
|
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||||
|
--without-openssl \
|
||||||
|
--with-wincng \
|
||||||
|
LIBS="-lws2_32" && \
|
||||||
|
make install
|
||||||
|
|
||||||
RUN git clone https://github.com/tatsuhiro-t/aria2
|
RUN git clone https://github.com/tatsuhiro-t/aria2
|
||||||
RUN cd aria2 && autoreconf -i && ./mingw-config && make && \
|
RUN cd aria2 && autoreconf -i && ./mingw-config && make && \
|
||||||
$HOST-strip src/aria2c.exe
|
$HOST-strip src/aria2c.exe
|
||||||
|
|
|
@ -0,0 +1,101 @@
|
||||||
|
FROM ubuntu:trusty
|
||||||
|
|
||||||
|
MAINTAINER Igor Khomyakov
|
||||||
|
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y make binutils autoconf automake autotools-dev libtool \
|
||||||
|
pkg-config git curl dpkg-dev autopoint libcppunit-dev libxml2-dev \
|
||||||
|
libgcrypt11-dev lzip
|
||||||
|
|
||||||
|
RUN git clone https://github.com/raspberrypi/tools.git --depth=1 /tools
|
||||||
|
|
||||||
|
ENV ARCH armhf
|
||||||
|
ENV HOST arm-linux-gnueabihf
|
||||||
|
ENV LOCAL_DIR /local
|
||||||
|
|
||||||
|
ENV TOOL_BIN_DIR /tools/arm-bcm2708/gcc-linaro-$HOST-raspbian-x64/bin
|
||||||
|
ENV PATH ${TOOL_BIN_DIR}:$PATH
|
||||||
|
|
||||||
|
RUN mkdir $LOCAL_DIR && mkdir zlib && cd zlib && \
|
||||||
|
curl -Ls -o - 'http://prdownloads.sourceforge.net/libpng/zlib-1.2.8.tar.gz?download' | \
|
||||||
|
tar xzf - --strip-components=1 && \
|
||||||
|
prefix=${LOCAL_DIR} \
|
||||||
|
CC=$HOST-gcc \
|
||||||
|
STRIP=$HOST-strip \
|
||||||
|
RANLIB=$HOST-ranlib \
|
||||||
|
AR=$HOST-ar \
|
||||||
|
LD=$HOST-ld \
|
||||||
|
./configure --static \
|
||||||
|
--libdir=$LOCAL_DIR/lib && \
|
||||||
|
make -s && \
|
||||||
|
make -s install
|
||||||
|
|
||||||
|
RUN mkdir -p expat && cd expat && \
|
||||||
|
curl -Ls -o - 'http://sourceforge.net/projects/expat/files/latest/download' | \
|
||||||
|
tar xzf - --strip-components=1 && \
|
||||||
|
./configure \
|
||||||
|
--host=$HOST \
|
||||||
|
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||||
|
--enable-shared=no \
|
||||||
|
--enable-static=yes \
|
||||||
|
--prefix=${LOCAL_DIR} && \
|
||||||
|
make -s && \
|
||||||
|
make -s install
|
||||||
|
|
||||||
|
RUN mkdir c-ares && cd c-ares && \
|
||||||
|
curl -Ls -o - http://c-ares.haxx.se/download/c-ares-1.10.0.tar.gz | \
|
||||||
|
tar xzf - --strip-components=1 && \
|
||||||
|
./configure \
|
||||||
|
--host=$HOST \
|
||||||
|
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||||
|
--enable-shared=no \
|
||||||
|
--enable-static=yes \
|
||||||
|
--prefix=${LOCAL_DIR} && \
|
||||||
|
make -s && \
|
||||||
|
make -s install
|
||||||
|
|
||||||
|
RUN mkdir gmp && cd gmp && \
|
||||||
|
curl -Ls -o - 'https://gmplib.org/download/gmp/gmp-6.0.0a.tar.lz' | \
|
||||||
|
lzip -d | tar xf - --strip-components=1 && \
|
||||||
|
./configure \
|
||||||
|
--disable-shared \
|
||||||
|
--enable-static \
|
||||||
|
--prefix=$LOCAL_DIR \
|
||||||
|
--host=$HOST \
|
||||||
|
--disable-cxx \
|
||||||
|
--enable-fat && \
|
||||||
|
make -s && \
|
||||||
|
make -s install
|
||||||
|
|
||||||
|
RUN mkdir sqlite && cd sqlite && \
|
||||||
|
curl -Ls -o - https://www.sqlite.org/2015/sqlite-autoconf-3080900.tar.gz | \
|
||||||
|
tar xzf - --strip-components=1 && \
|
||||||
|
./configure \
|
||||||
|
--disable-shared \
|
||||||
|
--enable-static \
|
||||||
|
--prefix=$LOCAL_DIR \
|
||||||
|
--host=$HOST \
|
||||||
|
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` && \
|
||||||
|
make -s && \
|
||||||
|
make -s install
|
||||||
|
|
||||||
|
RUN mkdir aria && cd aria && \
|
||||||
|
curl -Ls -o - http://sourceforge.net/projects/aria2/files/latest/download | \
|
||||||
|
tar xjf - --strip-components=1 && \
|
||||||
|
./configure \
|
||||||
|
--host=$HOST \
|
||||||
|
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||||
|
--disable-nls \
|
||||||
|
--disable-ssl \
|
||||||
|
--without-gnutls \
|
||||||
|
--without-libxml2 \
|
||||||
|
--with-libz --with-libz-prefix=${LOCAL_DIR} \
|
||||||
|
--with-libexpat --with-libexpat-prefix=${LOCAL_DIR} \
|
||||||
|
--with-slite3 --with-sqlite3-prefix=${LOCAL_DIR} \
|
||||||
|
--with-libcares --with-libcares-prefix=${LOCAL_DIR} \
|
||||||
|
--prefix=${LOCAL_DIR} \
|
||||||
|
LDFLAGS="-L$LOCAL_DIR/lib" \
|
||||||
|
PKG_CONFIG_PATH="$LOCAL_DIR/lib/pkgconfig" \
|
||||||
|
ARIA2_STATIC=yes && \
|
||||||
|
make -s && \
|
||||||
|
make -s install-strip
|
|
@ -10,6 +10,7 @@ EXTRA_DIST = config.rpath \
|
||||||
android-config android-make \
|
android-config android-make \
|
||||||
makerelease-osx.mk osx-package/DS_Store osx-package/etc/paths.d/aria2c osx-package/etc/manpaths.d/aria2 \
|
makerelease-osx.mk osx-package/DS_Store osx-package/etc/paths.d/aria2c osx-package/etc/manpaths.d/aria2 \
|
||||||
Dockerfile.mingw \
|
Dockerfile.mingw \
|
||||||
|
Dockerfile.raspberrypi \
|
||||||
examples/libaria2ex.cc examples/libaria2wx.cc
|
examples/libaria2ex.cc examples/libaria2wx.cc
|
||||||
|
|
||||||
dist_doc_DATA = README README.rst README.html
|
dist_doc_DATA = README README.rst README.html
|
||||||
|
|
748
NEWS
748
NEWS
|
@ -1,716 +1,170 @@
|
||||||
aria2 1.18.9
|
aria2 1.19.1
|
||||||
============
|
============
|
||||||
|
|
||||||
Release Note
|
Release Note
|
||||||
------------
|
------------
|
||||||
|
|
||||||
This releases fixes memory leak with OpenSSL and crash on OSX when
|
This release fixes TLS handshake error with servers which only support
|
||||||
proxy is used. We added several new features. Adler32 checksum is
|
RSA-SHA1 signature algorithm. We removed RSA-SHA1 for enchanced
|
||||||
now available in --checksum option and hash element in Metalink files.
|
security, but many users reported there were servers which could not
|
||||||
We added --bt-detach-seed-only option, which excludes seed-only
|
talk aria2 1.19.0, so added it again for compatibility reasons. For
|
||||||
downloads when counting concurrent active downloads (-j option). We
|
Windows build, we fixed potential infinite loop bug when TLS is used.
|
||||||
disabled SSLv3 by default. If you ever want to enable it or further
|
|
||||||
tune the TLS protocols to enable, use new --min-tls-version option.
|
We changed the location where dht.dat and aria2.conf are looked up.
|
||||||
--bt-force-encryption option was added to make requiring BitTorrent
|
The aria2 manual page described details. Basically we now follow XDG
|
||||||
full encryption easier. From this release, we build Android binary
|
specification (http://standards.freedesktop.org/basedir-spec/latest/).
|
||||||
using API level 16.
|
For dht.dat, the default location is $XDG_CACHE_HOME/aria2/ directory.
|
||||||
|
For aria2.conf, the default location is $XDG_CONFIG_HOME/aria2/
|
||||||
|
directory. To keep the current user configuration working, if aria2
|
||||||
|
detects dht.dat under $HOME/.aria2/ directory, it is used instead.
|
||||||
|
Similarly, if aria2.conf exists under $HOME/.aria2/ directory, it is
|
||||||
|
used instead.
|
||||||
|
|
||||||
|
Previously, we return 500 HTTP status if RPC method execution
|
||||||
|
encountered error. Now it returns with 400 HTTP status with error
|
||||||
|
code. This is more natural because server processed request and found
|
||||||
|
an error, and returned error reply correctly. This is not something
|
||||||
|
server crashed or something. Also, there is RPC libraries which
|
||||||
|
throws exception if it sees 5XX status code, where 400 is better
|
||||||
|
because we can examine the error.
|
||||||
|
|
||||||
Changes
|
Changes
|
||||||
-------
|
-------
|
||||||
|
|
||||||
* Support HTTP date ending "+0000" as well as "GMT".
|
* Update README.android
|
||||||
|
|
||||||
Closes GH-330
|
Providing some workarounds about CA certificates and standard output
|
||||||
|
|
||||||
* Revise getRandom facilities
|
Patch from amtlib-dot-dll
|
||||||
|
|
||||||
Use one of the following to provide random bytes:
|
* Return 400 HTTP status code if exception was caught while executing
|
||||||
- Windows CryptGenRandom
|
RPC method
|
||||||
- Linux getrandom (syscall interface to urandom, without nasty
|
|
||||||
corner cases such as file descriptor exhaustion or re-linked
|
|
||||||
/dev/urandom)
|
|
||||||
- std::device_random (C++ random device, which usually will be
|
|
||||||
urandom)
|
|
||||||
|
|
||||||
This also equalizes util::getRandom and SimpleRandomizer (the former
|
Previously, we returned 500 HTTP status code. I think the found in
|
||||||
will now use the latter) instead of having essentially two different
|
RPC level, not in HTTP protocol, so 500 is not appropriate.
|
||||||
PRNG interfaces with potentially different quality.
|
|
||||||
|
|
||||||
Closes GH-320
|
* WinTLS: Fix potential infinite loop
|
||||||
|
|
||||||
* Added debug log of all Metalink URLs with final priorities
|
* Fix on-download-error is executed even if download succeeded
|
||||||
|
|
||||||
Patch from Dan Fandrich
|
* Update Dockerfile.mingw
|
||||||
|
|
||||||
* Use gcc-4.9 and android-16 API level for android build
|
Patch from Adam Baxter
|
||||||
|
|
||||||
* Add --bt-force-encryption option
|
* Increase --select-file upper bound to 1m for torrent containing lots
|
||||||
|
of files
|
||||||
|
|
||||||
This option requires BitTorrent message payload encryption with
|
* Fix busy loop with --dry-run and 4xx response for URI listed in
|
||||||
arc4. This is a shorthand of --bt-requre-crypto
|
metalink
|
||||||
--bt-min-crypto-level=arc4. If true is given, deny legacy
|
|
||||||
BitTorrent handshake and only use Obfuscation handshake and always
|
|
||||||
encrypt message payload. This option defaults to false.
|
|
||||||
|
|
||||||
* TLS: Fix memory leak with OpenSSL
|
See GH-430
|
||||||
|
|
||||||
Based on the patch submitted by midnight2k
|
* Update sqlite in OSX build to 3.8.10.2
|
||||||
|
|
||||||
* Warn about insecure SSL connections.
|
* Make LibuvEventPoll compatible with the latest libuv again
|
||||||
|
|
||||||
Fixed GH-313
|
* gnutls: Allow SIGN-RSA-SHA1 for compatibility reason
|
||||||
|
|
||||||
* Add --min-tls-version option
|
* Make script compatible with both Python 2 and 3
|
||||||
|
|
||||||
The --min-tls-version option specifies minimum SSL/TLS version to
|
Patch from Vasilij Schneidermann
|
||||||
enable. Possible Values: SSLv3, TLSv1, TLSv1.1, TLSv1.2 Default:
|
|
||||||
TLSv1
|
|
||||||
|
|
||||||
* LibsslTLSContext: Disable SSLv3 and enable ECDHE cipher suites
|
* Make config and cache files conform to XDG
|
||||||
|
|
||||||
* Add Dockerfile.mingw
|
See http://standards.freedesktop.org/basedir-spec/latest/ for
|
||||||
|
further details. This implementation decides the default based on
|
||||||
|
whether a file exists at the legacy location, if it doesn't, it
|
||||||
|
picks the XDG-conforming location instead.
|
||||||
|
|
||||||
Dockerfile.mingw builds aria2 Windows binary. It is probably the
|
Patch from Vasilij Schneidermann
|
||||||
easiest way to build the Windows binary.
|
|
||||||
|
|
||||||
* Fix crash when JSON batch response vector is empty
|
* ftp, sftp: Fix heap-after-free bug on exception
|
||||||
|
|
||||||
* Fix doc: Wrong rpc secret token prefix
|
* ftp: Fix timeout when reusing FTP connection
|
||||||
|
|
||||||
* Add --bt-detach-seed-only option
|
* Various MinGW-w64 build improvements
|
||||||
|
|
||||||
This option excludes seed only downloads when counting concurrent
|
- Fix detection of localtime_r and asctime_r on MinGW-w64
|
||||||
active downloads (-j option). This means that if -j3 is given and
|
- Fix linking with libintl on MinGW-w64
|
||||||
this option is turned on and 3 downloads are active and one of those
|
|
||||||
enters seed mode, then it is excluded from active download count
|
|
||||||
(thus it becomes 2), and the next download waiting in queue gets
|
|
||||||
started. But be aware that seeding item is still recognized as
|
|
||||||
active download in RPC method.
|
|
||||||
|
|
||||||
* mingw: Use MoveFileExW for better atomic move
|
|
||||||
|
|
||||||
* Work around libintl's vprintf macro messing with OutputFile::vprintf
|
|
||||||
|
|
||||||
Patch from David Macek
|
Patch from David Macek
|
||||||
|
|
||||||
* Fix crash on OSX when proxy is used
|
|
||||||
|
|
||||||
See GH-275
|
|
||||||
|
|
||||||
* Support Adler32 checksum
|
|
||||||
|
|
||||||
Adler32 checksum is available for --checksum option and hash element
|
|
||||||
in Metalink files. Currently, we use Adler32 implementation in
|
|
||||||
Zlib.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
aria2 1.18.8
|
aria2 1.19.0
|
||||||
============
|
============
|
||||||
|
|
||||||
Release Note
|
Release Note
|
||||||
------------
|
------------
|
||||||
|
|
||||||
This releases fixes the bug that aria2 cannot read piped stdin on
|
This releases adds SFTP support, and fixes several bugs. SFTP support
|
||||||
mingw32. It also fixes busy loop on mingw32 when SSL/TLS is used. We
|
has been implemented using libssh2. We added several new options.
|
||||||
also fixed 2 crashes which can occur on all platforms.
|
--multiple-interface option is like --interface option, but can take
|
||||||
|
several interfaces. They are used in round-robin manner, and it works
|
||||||
|
like link aggregation. Previously, .netrc search path is fixed under
|
||||||
|
$HOME directory, and cannot be changed. In this release, --netrc-path
|
||||||
|
option has been added to override the search path. The runtime bug
|
||||||
|
concerning getrandom has been fixed in this release. Previously if
|
||||||
|
download failed because checksum error, aria2 exited with error code 1
|
||||||
|
(unknown error). Now it exits with dedicated error code 32. We fixed
|
||||||
|
long outstanding bug that aria2 crashes when downloading multi-file
|
||||||
|
torrent.
|
||||||
|
|
||||||
Changes
|
Changes
|
||||||
-------
|
-------
|
||||||
|
|
||||||
* WinTLS: Fix abrupt connection closing and closing in general.
|
* android: Build and link with zlib
|
||||||
|
|
||||||
Fixes GH-277
|
Previously, we linked with zlib shipped with NDK, but it seems this
|
||||||
|
is not part of NDK API, and thus could break our app.
|
||||||
|
|
||||||
* LibsslTLSSession: Treat 0 from readData as EOF
|
* Allow netrc-path to be specified in the config file
|
||||||
|
|
||||||
* Enable dynamicbase and nxcompat in Windows binaries
|
Adds --netrc-path to override default .netrc search path. Patch
|
||||||
|
from Ryan Steinmetz
|
||||||
|
|
||||||
* Fix crash in OpenedFileCounter::ensureMaxOpenFileLimit()
|
* Exit with 32 status code if checksum verification failed
|
||||||
|
|
||||||
The crash happens if PieceStorage and/or DiskAdaptor are not
|
* Add SFTP support using libssh2
|
||||||
initialized in one of active RequestGroups.
|
|
||||||
|
|
||||||
* mingw32: Fix bug that aria2 does not read piped stdin
|
aria2 can now download files via sftp protocol: aria2c sftp://....
|
||||||
|
--ssh-host-key-md option is added to specify expected server's
|
||||||
|
fingerprint.
|
||||||
|
|
||||||
* Fix std::length_error when no_proxy is used
|
* Added Dockerfile to cross complile aria2 for RaspberryPI (armhf)
|
||||||
|
|
||||||
This is regression introduced in 8cada497.
|
Patch from Igor Khomyakov
|
||||||
|
|
||||||
* Try to set sane limits for RLIMIT_NO_FILE
|
* multiple interface support for link aggregation
|
||||||
|
|
||||||
E.g. on OSX the default is 256, which isn't exactly compatible with
|
Adds --multiple-interface option. Patch from Sarim Khan
|
||||||
torrent downloads.
|
|
||||||
|
|
||||||
Closes GH-257
|
* Run on-bt-download-complete command when -V reports download finished
|
||||||
|
|
||||||
* Delay auth failures instead of PBKDF2
|
Fixes GH-355
|
||||||
|
|
||||||
Closes GH-256
|
* Use dedicated DiskWriter in MultiDiskFileAllocationIterator
|
||||||
|
|
||||||
|
We have to use dedicated DiskWriter instead of
|
||||||
|
(*entryItr_)->getDiskWriter(). This is because
|
||||||
|
SingleFileAllocationIterator cannot reopen file if file is closed by
|
||||||
|
OpenedFileCounter. Fixes GH-350
|
||||||
|
|
||||||
aria2 1.18.7
|
* Fix getrandom for system with libc not including errno or systems
|
||||||
============
|
|
||||||
|
|
||||||
Release Note
|
not supporting ENOSYS in the first place. Fixes GH-347
|
||||||
------------
|
|
||||||
|
|
||||||
This release fixes regression which makes 100% CPU utilization in
|
* Don't send back rpc-secret option value in aria2.getGlobalOption RPC
|
||||||
multi-file torrent download with -V option. It also fixes build error
|
method
|
||||||
on big endian platforms.
|
|
||||||
|
|
||||||
Changes
|
* Make libuv default off
|
||||||
-------
|
|
||||||
|
|
||||||
* Fixed segfault unsupported encodings
|
See GH-241 for discussion
|
||||||
|
|
||||||
Patch from diadistis
|
* Fixed slow RPC response
|
||||||
|
|
||||||
* Fix regression 100% CPU utility when -V is used and download is
|
Fxies GH-345
|
||||||
multi-file bittorrent downloads.
|
|
||||||
|
|
||||||
This is regression of a3426821c8a7f9cf8d80a81726157d4eb844f661
|
* Fix getrandom interface detection
|
||||||
|
|
||||||
* Fix compile error on big endian platform
|
Fixes GH-346
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
aria2 1.18.6
|
|
||||||
============
|
|
||||||
|
|
||||||
Release Note
|
|
||||||
------------
|
|
||||||
|
|
||||||
This release fixes several bugs reported in github issues and adds a
|
|
||||||
feature to make RPC authentication more resilient to certain attacks.
|
|
||||||
New option --pause-metadata is added. The explanation is a bit log,
|
|
||||||
so check the changelog and manual. The session is now only saved if
|
|
||||||
there are changes from the last saved state.
|
|
||||||
|
|
||||||
From this release, MinGW32 build uses Windows native TLS
|
|
||||||
implementation and no longer use OpenSSL library.
|
|
||||||
|
|
||||||
Changes
|
|
||||||
-------
|
|
||||||
|
|
||||||
* Disard cache when checking checksum
|
|
||||||
|
|
||||||
This will slow down checksum checking but does not thrash cache.
|
|
||||||
|
|
||||||
* Compat with libuv 0.11 (Unstable)
|
|
||||||
|
|
||||||
Fixes #241
|
|
||||||
|
|
||||||
* Drop WinMessageDigestImpl.
|
|
||||||
|
|
||||||
The algorithms the `CryptProv` on Windows supports does not
|
|
||||||
currently include SHA-224, so there is a "dark spot" in this
|
|
||||||
implementation. Also on Win XP < SP3, most of the SHA-2 family is
|
|
||||||
not actually supported. All other implementation provide support
|
|
||||||
for MD5, SHA-1 and all of the SHA-2 family, hence drop the
|
|
||||||
incomplete WinMessageDigest implementation in favor of any other
|
|
||||||
supported implementation (at least the internal implementation is
|
|
||||||
always available at compile-time).
|
|
||||||
|
|
||||||
* Add --pause-metadata option
|
|
||||||
|
|
||||||
This option pauses downloads created as a result of metadata
|
|
||||||
download. There are 3 types of metadata downloads in aria2: (1)
|
|
||||||
downloading .torrent file. (2) downloading torrent metadata using
|
|
||||||
magnet link. (3) downloading metalink file. These metadata
|
|
||||||
downloads will generate downloads using their metadata. This option
|
|
||||||
pauses these subsequent downloads.
|
|
||||||
|
|
||||||
* Improve compiler/platform/libs information in logs
|
|
||||||
|
|
||||||
Add and use usedCompilerAndPlatform(). This adds compiler
|
|
||||||
information to INFO logs and the --version output, and may be
|
|
||||||
helpful when trying to diagnose/reproduce user-reported problems.
|
|
||||||
|
|
||||||
Also make INFO logs include usedLibs() output.
|
|
||||||
|
|
||||||
Closes #235
|
|
||||||
|
|
||||||
* Fix use-after-free on exit with multi-file torrent download + DHT
|
|
||||||
|
|
||||||
DefaultPieceStorage may be referenced by one of DHT task (e.g.,
|
|
||||||
DHTPeerLookupTask), after RequestGroup was deleted, and even after
|
|
||||||
RequestGroupMan was deleted. DefaultPieceStorage has a reference to
|
|
||||||
MultiDiskAdaptor which calls RequestGroupMan object on destruction.
|
|
||||||
So when DHT task is destroyed, DefaultPieceStorage is destroyed,
|
|
||||||
which in turn destroys MultiDiskAdaptor. DHT task is destroyed
|
|
||||||
after RequestGroupMan was destroyed, MultiDiskAdaptor will use now
|
|
||||||
freed RequestGroupMan object, this is use-after-free.
|
|
||||||
|
|
||||||
* Fix bug that zero length file is not opened when flushing cache
|
|
||||||
|
|
||||||
This bug was only seen when MultiDiskAdaptor was used.
|
|
||||||
|
|
||||||
* Support PREF_DIR change for Metalink files
|
|
||||||
|
|
||||||
Reworked previous commit adeead6f0396e2f8551d1182972e277728fd6c8b,
|
|
||||||
and now support changing PREF_DIR for Metalink downloads.
|
|
||||||
|
|
||||||
* Fix assertion failure when dir option of paused HTTP/FTP download is
|
|
||||||
changed
|
|
||||||
|
|
||||||
When the directory is changed via aria2.changeOption RPC method, we
|
|
||||||
directly change first FileEntry's path using FileEntry::setPath().
|
|
||||||
If there is no PREF_OUT option is given, basically file name is
|
|
||||||
unknown, so we just set empty string and let the next run determine
|
|
||||||
the correct file name and new directory is applied there. But
|
|
||||||
previous code does not reset length property of FileEntry, so the
|
|
||||||
unexpected code path is taken when unpaused and its path expects
|
|
||||||
path is not empty string. This commit fixes this issue by setting
|
|
||||||
length to 0 using FileEntry::setLength().
|
|
||||||
|
|
||||||
* Save session only when there is change since the last serialization
|
|
||||||
|
|
||||||
This is a slight optimization not to cause useless disk access.
|
|
||||||
This only applies to saving session automatically (see
|
|
||||||
--save-session-interval). aria2.saveSession and serialization at
|
|
||||||
the end of the session are always performed as before.
|
|
||||||
|
|
||||||
When serialization, we first check that whether there is any change
|
|
||||||
since the last serialization. To do this, we first calculate hash
|
|
||||||
value of serialized content without writing into file. Then compare
|
|
||||||
this value to the value of last serialization. If they do not
|
|
||||||
match, perform serialization.
|
|
||||||
|
|
||||||
* Fix (unknown length) downloads larger than 2GiB
|
|
||||||
|
|
||||||
Closes #215
|
|
||||||
|
|
||||||
* Fix F_PREALLOC based allocation on some OSX versions
|
|
||||||
|
|
||||||
* Use index.html as filename for conditional-get when file is missing
|
|
||||||
in URI
|
|
||||||
|
|
||||||
Previously we disabled conditional-get if file part is missing in
|
|
||||||
URI. But we use constant string "index.html" in this case, so we
|
|
||||||
can do the same to determine the modification time. In this patch,
|
|
||||||
if we have file part in URI, we are not going to set absolute file
|
|
||||||
path in FileEntry, since it prevents content-disposition from
|
|
||||||
working.
|
|
||||||
|
|
||||||
* Always add README.html to dist_doc_DATA
|
|
||||||
|
|
||||||
rst2html is required to produce README.html from README.rst. We
|
|
||||||
include generated README.html to distribution. And rst2html is not
|
|
||||||
required when compiling sources in distribution and always
|
|
||||||
README.html is available.
|
|
||||||
|
|
||||||
* Validate token using PBKDF2-HMAC-SHA1.
|
|
||||||
|
|
||||||
This change should make token validation more resilient to:
|
|
||||||
- timing attacks (constant time array compare)
|
|
||||||
- brute-force/dictionary attacks (PBKDF2)
|
|
||||||
|
|
||||||
Closes #220
|
|
||||||
|
|
||||||
* Add --disable-websocket configure option
|
|
||||||
|
|
||||||
* mingw32: Enable wintls and compile with GMP
|
|
||||||
|
|
||||||
By enabling wintls, we can use Windows certificate store to validate
|
|
||||||
server's certificate. Previously, we built windows build using
|
|
||||||
openssl and since we don't bundle CA certificates, aria2 fails to
|
|
||||||
validate server's certificate unless user setups their CA
|
|
||||||
certificates. GMP provides fast big integer calculations, whic is
|
|
||||||
used in BitTorrent encryption.
|
|
||||||
|
|
||||||
* AppleTLS: Enable BEAST mitigations in ST
|
|
||||||
|
|
||||||
Only available in 10.9+, but since we might be building on a
|
|
||||||
previous version but running on 10.9+, always try to set the option.
|
|
||||||
|
|
||||||
* WinTLS: Accept chains with no revocation information.
|
|
||||||
|
|
||||||
This is kind what browser do anyway (IE, Firefox, Chrome tested),
|
|
||||||
what AppleTLS does, what GnuTLS does and what OpenSSL
|
|
||||||
does. Actually, most browsers will also be OK with the CRL/OCSP
|
|
||||||
provider being offline. WinTLS will still fail in that case.
|
|
||||||
|
|
||||||
Should revocation information be available in the trust chain (CRL
|
|
||||||
or OCSP) the certificate still will be checked!
|
|
||||||
|
|
||||||
"Real" CAs, aka. those provided by the OS or system CA bundle,
|
|
||||||
usually provide revocation information and are thus still checked.
|
|
||||||
It should be mostly (only?) custom (organization) CAs that lack
|
|
||||||
revocation information, but those users might want to use aria2 in
|
|
||||||
their intranets and VPNs anyway ;)
|
|
||||||
|
|
||||||
See #217
|
|
||||||
|
|
||||||
* Fix GnuTLS 2.x compatiblity
|
|
||||||
|
|
||||||
Closes GH-216
|
|
||||||
|
|
||||||
* AppleTLS: Use newer, non-deprecated API in 10.8+
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
aria2 1.18.5
|
|
||||||
============
|
|
||||||
|
|
||||||
Release Note
|
|
||||||
------------
|
|
||||||
|
|
||||||
This release fixes BitTorrent download failure on Mingw build.
|
|
||||||
|
|
||||||
Changes
|
|
||||||
-------
|
|
||||||
|
|
||||||
* Ignore error when setting DSCP value
|
|
||||||
|
|
||||||
Setting DSCP is additional feature and failure to enable it should
|
|
||||||
not abort download entirely. This change fixes the bug that windows
|
|
||||||
build does not perform bittorrent downloads.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
aria2 1.18.4
|
|
||||||
============
|
|
||||||
|
|
||||||
Release Note
|
|
||||||
------------
|
|
||||||
|
|
||||||
This release adds new RPC authorization mechanism using --rpc-secret
|
|
||||||
option. The existing --rpc-user and --rpc-passwd options are now
|
|
||||||
deprecated, and all applications using RPC API is strongly encouraged
|
|
||||||
to migrate to the new mechanism. See RPC INTERFACE section in aria2
|
|
||||||
manual page for the details. The new RPC method, aria2.saveSession,
|
|
||||||
was added, which tells aria2 server to save session file immediately.
|
|
||||||
There are several enhancements and bug fixes. See the changes for the
|
|
||||||
details.
|
|
||||||
|
|
||||||
Changes
|
|
||||||
-------
|
|
||||||
|
|
||||||
* Added support for RPC channel encryption in aria2rpc
|
|
||||||
|
|
||||||
Patch from David Macek
|
|
||||||
|
|
||||||
* Add aria2.saveSession RPC method
|
|
||||||
|
|
||||||
This method saves the current session to a file specified by
|
|
||||||
--save-session option. This method returns "OK" if it succeeds.
|
|
||||||
|
|
||||||
* Add numStoppedTotal key to aria2.getGlobalStat() RPC method response
|
|
||||||
|
|
||||||
It shows the number of stopped downloads in the current session and
|
|
||||||
not capped by --max-download-result option. On the other hand, the
|
|
||||||
existing numStopped key also shows the number of stopped downloads,
|
|
||||||
but it is capped by --max-download-result option.
|
|
||||||
|
|
||||||
* Better handling of 30x HTTP status codes
|
|
||||||
|
|
||||||
Reference: http://greenbytes.de/tech/tc/httpredirects/
|
|
||||||
|
|
||||||
* Implement new RPC authorization using --rpc-secret option
|
|
||||||
|
|
||||||
Add future deprecation warning to --rpc-user and --rpc-passwd. Warn
|
|
||||||
if neither --rpc-secret nor a combination of --rpc-user/rpc-passwd
|
|
||||||
is set.
|
|
||||||
|
|
||||||
* Add --enable-color option to enable/disable terminal color output
|
|
||||||
|
|
||||||
* Add DSCP support
|
|
||||||
|
|
||||||
* gnutls: Don't fail handshake if returned error is not fatal
|
|
||||||
|
|
||||||
* Add workaround GnuTLS bug with OCSP status extension and
|
|
||||||
non-blocking socket
|
|
||||||
|
|
||||||
GnuTLS version 3.1.3 - 3.1.18 and 3.2.0 - 3.2.8, inclusive, has this
|
|
||||||
bug. For these versions, we disable OCSP status extension.
|
|
||||||
|
|
||||||
* Make GnuTLS log level dependent on the aria2 ones
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
aria2 1.18.3
|
|
||||||
============
|
|
||||||
|
|
||||||
Release Note
|
|
||||||
------------
|
|
||||||
|
|
||||||
This release fixes the bug which may cause assertion failure after
|
|
||||||
multi-file downloads (e.g., multi-file metalink or torrent) are
|
|
||||||
performed several times due to the bad handling of --bt-max-open-files
|
|
||||||
option.
|
|
||||||
|
|
||||||
Changes
|
|
||||||
-------
|
|
||||||
|
|
||||||
* Fix crash if unpause failed before assigning BtProgressInfoFile
|
|
||||||
object
|
|
||||||
|
|
||||||
* Enable and check PIE in makerelease-osx
|
|
||||||
|
|
||||||
* Fix bug that numOpenFile_ is not reduced when MultiDiskAdaptor is
|
|
||||||
deleted
|
|
||||||
|
|
||||||
This bug caused assertion error in
|
|
||||||
RequestGroupMan::ensureMaxOpenFileLimit
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
aria2 1.18.2
|
|
||||||
============
|
|
||||||
|
|
||||||
Release Note
|
|
||||||
------------
|
|
||||||
|
|
||||||
This release fixes the wrong handling of return value of fork(), which
|
|
||||||
leads to high CPU usage. The progress readout has some color output.
|
|
||||||
Mingw32 build now receives colorized output. Mingw32 build now can
|
|
||||||
read unicode command-line arguments. The build script of OSX was
|
|
||||||
rewritten. The --bt-max-open-files now limits the number of opened
|
|
||||||
file globally for multi-file downloads instead of per download basis.
|
|
||||||
|
|
||||||
Changes
|
|
||||||
-------
|
|
||||||
|
|
||||||
* Remove the outdated, broken build_osx_release.sh
|
|
||||||
|
|
||||||
* Initial revision of the a new OSX release Makefile
|
|
||||||
|
|
||||||
* Allow using libgmp with AppleTLS/WinTLS
|
|
||||||
|
|
||||||
* Fix crash when metaurl contains unsupported URI or text
|
|
||||||
|
|
||||||
* Fix bad fork() return value handling
|
|
||||||
|
|
||||||
* Use some colors in progress reports (where available)
|
|
||||||
|
|
||||||
* Implement basic color support for the Windows console
|
|
||||||
|
|
||||||
Only \033[*m (SGR) is supported, with a 16+16 color terminal.
|
|
||||||
|
|
||||||
* AppleTLS: Implement PKCS12 loading.
|
|
||||||
|
|
||||||
* Limit number of opened file globally with --bt-max-open-files option
|
|
||||||
|
|
||||||
This change changes the behavior of --bt-max-open-files. Previously,
|
|
||||||
it specifies the maximum number of opened files for each multi-file
|
|
||||||
download. Since it is more useful to limit the number globally, the
|
|
||||||
option now specifies the global limit. This change suggests that
|
|
||||||
aria2.changeOption() method now ignores --bt-max-open-files and
|
|
||||||
aria2.changeGlobalOption now reads it and dynamically change the
|
|
||||||
limit.
|
|
||||||
|
|
||||||
* Don't fail multiple concurrent dl same file if auto-file-renaming is
|
|
||||||
enabled
|
|
||||||
|
|
||||||
* mingw32: Use CommandLineToArgvW() and GetCommandLineW() to read
|
|
||||||
cmd-line args
|
|
||||||
|
|
||||||
This change enables aria2 to read unicode characters in
|
|
||||||
command-line.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
aria2 1.18.1
|
|
||||||
============
|
|
||||||
|
|
||||||
Release Note
|
|
||||||
------------
|
|
||||||
|
|
||||||
This release fixes the percent-encoding bug which affects file name
|
|
||||||
encodings. It adds PKCS12 support in certificate import. It also adds
|
|
||||||
experimental internal implementation of message digest functions, ARC4
|
|
||||||
cipher and bignum. It means that no external libraries are required to
|
|
||||||
build BitTorrent support, but this feature is still marked as
|
|
||||||
experimental. This release also fixes the android build with NDK r9.
|
|
||||||
|
|
||||||
Changes
|
|
||||||
-------
|
|
||||||
|
|
||||||
* LibsslTLSContext: Remove weak cipher suite
|
|
||||||
|
|
||||||
* AppleTLS: Enable --certificate
|
|
||||||
|
|
||||||
* util::percentEncodeMini: Fix regression bug removed unsignedness
|
|
||||||
|
|
||||||
srange-based for around std::string is convenient but several
|
|
||||||
functions depend unsigned char for correctness and readability.
|
|
||||||
|
|
||||||
* Log exception; throw error if loading private key and/or certificate
|
|
||||||
failed
|
|
||||||
|
|
||||||
* Provide internal ARC4 implementation
|
|
||||||
|
|
||||||
Now you can build bittorrent support without without external
|
|
||||||
libraries, meaning you can skip libnettle, libgmp, libgcrypt, GnuTLS
|
|
||||||
and OpenSSL on OSX (for now).
|
|
||||||
|
|
||||||
* Internal implementation of DHKeyExchange
|
|
||||||
|
|
||||||
Reusing a bignum (well, unsigned very-long) implementation I had
|
|
||||||
lying around for years and just cleaned up a bit and brought to
|
|
||||||
C++11 land.
|
|
||||||
|
|
||||||
It might not be the most performant implementation, but it shoud be
|
|
||||||
fast enough for our purposes and will go a long way of removing
|
|
||||||
gcrypt, nettle, gmp, openssl dependencies when using AppleTLS and
|
|
||||||
WinTLS (upcoming).
|
|
||||||
|
|
||||||
* PKCS12 support in --certificate and --rpc-certificate options.
|
|
||||||
|
|
||||||
* Add --disable-ssl configure option
|
|
||||||
|
|
||||||
* Add internal md5 and sha1 message digests
|
|
||||||
|
|
||||||
* Fix AppleMessageDigestImpl use with large data
|
|
||||||
|
|
||||||
* Set old cookie's creation-time to new cookie on replacement
|
|
||||||
|
|
||||||
As described in http://tools.ietf.org/html/rfc6265#section-5.3
|
|
||||||
|
|
||||||
* Fix link error with Android NDK r9
|
|
||||||
|
|
||||||
Since Android ndk r9, __set_errno is deprecated. It is now defined
|
|
||||||
as inline function in errno.h. The syscall assembly calls
|
|
||||||
__set_errno, but since libc.so does not export it, the link
|
|
||||||
fails. To workaround this, replace all occurrences of __set_errno
|
|
||||||
with a2_set_errno and define it as normal C function.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
aria2 1.18.0
|
|
||||||
============
|
|
||||||
|
|
||||||
Release Note
|
|
||||||
------------
|
|
||||||
|
|
||||||
This release changes the default disk cache size to 16 MiB. To change
|
|
||||||
the default size, --with-disk-cache configure option was added. Now
|
|
||||||
used URIs are also saved by --save-session option. The control file is
|
|
||||||
now always saved if --force-save is given. The ctrl-c handling on
|
|
||||||
Mingw build was improved. The internal intl library is no longer
|
|
||||||
supplied. From this release, C++11 compiler is required to build aria2
|
|
||||||
executable. For gcc, at least 4.6.3 is required.
|
|
||||||
|
|
||||||
Changes
|
|
||||||
-------
|
|
||||||
|
|
||||||
* Use AM subdir-objects
|
|
||||||
|
|
||||||
Doing so in AM_INIT_AUTOMAKE seems to be the most compatible way of
|
|
||||||
doing so.
|
|
||||||
|
|
||||||
Closes GH-120
|
|
||||||
|
|
||||||
* AM_SILENT_RULES([yes]) with backwards-compatiblity
|
|
||||||
|
|
||||||
Supported since automake-1.11. There is no point in having the very
|
|
||||||
verbose compile stuff running about, which cannot even silenced
|
|
||||||
properly with `make -s` by default. Otherwise, `make V=1` or
|
|
||||||
`--disable-silent-rules` are your friends
|
|
||||||
|
|
||||||
* Fix automake-1.14 am_aux_dir
|
|
||||||
|
|
||||||
AC_USE_SYSTEM_EXTENSIONS will cause AC_PROG_CC, which is overridden
|
|
||||||
by automake-1.14, which will then init (part) of automake, in
|
|
||||||
particular am_aux_dir expansion, which in turn relies on ac_aux-dir,
|
|
||||||
which is not initialized at this point, and thus: certain doom (or
|
|
||||||
fun, depending on your POV and mood :p)
|
|
||||||
|
|
||||||
Hence call AC_USE_SYSTEM_EXTENSIONS only after
|
|
||||||
AM_INIT_AUTOMAKE. This, of course, caused a lot of related macro
|
|
||||||
shuffling.
|
|
||||||
|
|
||||||
Tested against automake-1.10 (OSX Lion/XCode version) and
|
|
||||||
automake-1.14 (homebrew version)
|
|
||||||
|
|
||||||
* Require external gettext for --enable-nls
|
|
||||||
|
|
||||||
And stop using the internal flavor with ./intl
|
|
||||||
|
|
||||||
* Make AX_CXX_COMPILE_STDCXX_11 test for -stdlib=libc++ via std::shared_ptr
|
|
||||||
|
|
||||||
The clang shipped with OSX XCode and clangs not build enabling
|
|
||||||
libcpp, will default to the libstdc++ headers and lib installed on
|
|
||||||
the system. In the OSX case, that libstdc++ is the one bundles with
|
|
||||||
gcc-4.2, which is far too old to provide all required C++11 types,
|
|
||||||
such as std::shared_ptr. Hence, the C++11 check should try to
|
|
||||||
compile a program with a C++11 type and try -stdlib=libc++ if the
|
|
||||||
default lib fails to compile said program.
|
|
||||||
|
|
||||||
* Make the configure check for C++11 compiler mandatory
|
|
||||||
|
|
||||||
Remove stray "dnl", so that mandatory actually works with (my)
|
|
||||||
autoreconf.
|
|
||||||
|
|
||||||
* Always build doc/manual-src
|
|
||||||
|
|
||||||
Should sphinx-build be not available AND the man file not be prsent,
|
|
||||||
then just "touch" it into existence (and warn about that)
|
|
||||||
|
|
||||||
* Win: Use SetConsoleCtrlHandler for SIGINT/SIGTERM
|
|
||||||
|
|
||||||
* Implement a simple resource lock (threading)
|
|
||||||
|
|
||||||
In this initial implementation Locks are no-ops on platforms other
|
|
||||||
than Windows.
|
|
||||||
|
|
||||||
* Check for sphinx-build during configure
|
|
||||||
|
|
||||||
* Add --with-disk-cache configure option
|
|
||||||
|
|
||||||
Enables packagers more fine grained control over the default value
|
|
||||||
without having to mess with config files.
|
|
||||||
|
|
||||||
See GH-115
|
|
||||||
|
|
||||||
* Change defaults: Enable 16M disk cache by default.
|
|
||||||
|
|
||||||
* Always save control file if --force-save is given
|
|
||||||
|
|
||||||
* Set log level DEBUG for unittests
|
|
||||||
|
|
||||||
* Check that C++ compiler supports override keyword
|
|
||||||
|
|
||||||
If the compiler supports override, define CXX11_OVERRIDE as
|
|
||||||
override, otherwise define it as empty. Use CXX11_OVERRIDE instead
|
|
||||||
of override.
|
|
||||||
|
|
||||||
* AppleTLS: Fix MessageDigestImpl
|
|
||||||
|
|
||||||
* AppleTLS: Fix session CFRelease stuff
|
|
||||||
|
|
||||||
* Use AX_CXX_COMPILE_STDCXX_11 macro to detect C++0x/C++11 support in
|
|
||||||
compiler
|
|
||||||
|
|
||||||
* Require -std=c++11 and use std::shared_ptr instead of SharedHandle
|
|
||||||
|
|
||||||
* Join URI on redirect
|
|
||||||
|
|
||||||
* Send HAVE message to the peer which the piece is downloaded from
|
|
||||||
|
|
||||||
Historically, aria2 did not send HAVE message to the peer which the
|
|
||||||
piece is coming from, thinking it is obvious that the peer knows we
|
|
||||||
have the piece. But it is not obvious if one piece is download from
|
|
||||||
more than 1 peers (e.g., end game mode). So it is better to send
|
|
||||||
HAVE to all peers connected.
|
|
||||||
|
|
||||||
* Improvements to --follow-torrent=false documentation.
|
|
||||||
|
|
||||||
Patch from gt
|
|
||||||
|
|
||||||
* SessionSerializer: Truly unique URIs
|
|
||||||
|
|
||||||
Before, only spent uris where sanitized not to be contained within
|
|
||||||
remaining uris. Change this so that each uri in the
|
|
||||||
union(remaining,spent) get saved once at most. The order of the
|
|
||||||
uris will won't be changed, with remaining uris going first followed
|
|
||||||
by spent uris.
|
|
||||||
|
|
||||||
Also avoid copying the uri std::strings around during dupe checking,
|
|
||||||
usually resulting in better performance regarding CPU and space.
|
|
||||||
|
|
||||||
* Make getOption RPC method return option for stopped downloads
|
|
||||||
|
|
||||||
* SessionSerializer: Save spent URIs as well as remaining ones
|
|
||||||
|
|
|
@ -38,13 +38,14 @@ See `the online manual
|
||||||
Notes
|
Notes
|
||||||
-----
|
-----
|
||||||
|
|
||||||
aria2c executable was generated using android-ndk-r10b.
|
aria2c executable was generated using android-ndk-r10d.
|
||||||
|
|
||||||
The following libraries were statically linked.
|
The following libraries were statically linked.
|
||||||
|
|
||||||
* openssl 1.0.2
|
* openssl 1.0.2d
|
||||||
* expat 2.1.0
|
* expat 2.1.0
|
||||||
* c-ares 1.10.0
|
* c-ares 1.10.0
|
||||||
|
* libssh2 1.6.0
|
||||||
|
|
||||||
Since Android does not have ``/etc/resolv.conf``, c-ares (asynchronous
|
Since Android does not have ``/etc/resolv.conf``, c-ares (asynchronous
|
||||||
DNS resolver) is disabled by default. But name resolution is sometimes
|
DNS resolver) is disabled by default. But name resolution is sometimes
|
||||||
|
@ -54,11 +55,19 @@ using ``--async-dns`` and specify DNS servers using
|
||||||
|
|
||||||
--async-dns --async-dns-server=`getprop net.dns1`,`getprop net.dns2`
|
--async-dns --async-dns-server=`getprop net.dns1`,`getprop net.dns2`
|
||||||
|
|
||||||
|
Additionally, the CA certificates shipped with Android don't locate in
|
||||||
|
the same place as those of normal Unix-like systems do, so this
|
||||||
|
workaround might be useful to securely download files via HTTPS::
|
||||||
|
|
||||||
|
cat /etc/security/cacerts/* | aria2c --ca-certificate=/proc/self/fd/0 $@
|
||||||
|
|
||||||
Because it is tedious to type these long parameters every time you use
|
Because it is tedious to type these long parameters every time you use
|
||||||
aria2c, the following wrapper shell script would be handy::
|
aria2c, the following wrapper shell script would be handy::
|
||||||
|
|
||||||
#!/system/bin/sh
|
#!/system/bin/sh
|
||||||
|
cat /etc/security/cacerts/* | \
|
||||||
/data/data/jackpal.androidterm/aria2c \
|
/data/data/jackpal.androidterm/aria2c \
|
||||||
|
--ca-certificate=/proc/self/fd/0 \
|
||||||
--async-dns \
|
--async-dns \
|
||||||
--async-dns-server=`getprop net.dns1`,`getprop net.dns2` \
|
--async-dns-server=`getprop net.dns1`,`getprop net.dns2` \
|
||||||
"$@"
|
"$@"
|
||||||
|
@ -70,6 +79,7 @@ Known Issues
|
||||||
------------
|
------------
|
||||||
|
|
||||||
* Since Android does not have ``/dev/stdout``, ``-l-`` does not work.
|
* Since Android does not have ``/dev/stdout``, ``-l-`` does not work.
|
||||||
|
``/proc/self/fd/0`` is a workaround for Android.
|
||||||
|
|
||||||
* Android Terminal Emulator sometimes stops updating console. It looks
|
* Android Terminal Emulator sometimes stops updating console. It looks
|
||||||
like aria2c hangs, but aria2c continues to run.
|
like aria2c hangs, but aria2c continues to run.
|
||||||
|
|
|
@ -5,18 +5,19 @@ aria2 Windows build is provided in 2 flavors: 32bit version and 64bit
|
||||||
version. The executable was compiled using mingw-w64 cross compiler on
|
version. The executable was compiled using mingw-w64 cross compiler on
|
||||||
Debian Linux.
|
Debian Linux.
|
||||||
|
|
||||||
* gcc-mingw-w64 4.9.0-2+13
|
* gcc-mingw-w64 4.9.2-21+15.4
|
||||||
* binutils-mingw-w64-i686 2.24-2+3+b1
|
* binutils-mingw-w64-i686 2.25-8+6.2
|
||||||
* binutils-mingw-w64-x86-64 2.24-2+3+b1
|
* binutils-mingw-w64-x86-64 2.25-8+6.2
|
||||||
|
|
||||||
The executable is statically linked, so no extra DLLs are
|
The executable is statically linked, so no extra DLLs are
|
||||||
necessary. The linked libraries are:
|
necessary. The linked libraries are:
|
||||||
|
|
||||||
* gmp 6.0.0
|
* gmp 6.0.0
|
||||||
* expat 2.1.0
|
* expat 2.1.0
|
||||||
* sqlite 3.8.8.2
|
* sqlite 3.8.11.1
|
||||||
* zlib 1.2.8
|
* zlib 1.2.8
|
||||||
* c-ares 1.10.0 with the dns.patch [1] applied
|
* c-ares 1.10.0 with the dns.patch [1] applied
|
||||||
|
* libssh2 1.6.0
|
||||||
|
|
||||||
[1] http://c-ares.haxx.se/mail/c-ares-archive-2014-05/0008.shtml
|
[1] http://c-ares.haxx.se/mail/c-ares-archive-2014-05/0008.shtml
|
||||||
|
|
||||||
|
|
58
README.rst
58
README.rst
|
@ -10,14 +10,15 @@ You must use this program at your own risk.
|
||||||
|
|
||||||
Introduction
|
Introduction
|
||||||
------------
|
------------
|
||||||
|
|
||||||
aria2 is a utility for downloading files. The supported protocols are
|
aria2 is a utility for downloading files. The supported protocols are
|
||||||
HTTP(S), FTP, BitTorrent, and Metalink. aria2 can download a file from
|
HTTP(S), FTP, SFTP, BitTorrent, and Metalink. aria2 can download a
|
||||||
multiple sources/protocols and tries to utilize your maximum download
|
file from multiple sources/protocols and tries to utilize your maximum
|
||||||
bandwidth. It supports downloading a file from HTTP(S)/FTP and
|
download bandwidth. It supports downloading a file from
|
||||||
BitTorrent at the same time, while the data downloaded from
|
HTTP(S)/FTP/SFTP and BitTorrent at the same time, while the data
|
||||||
HTTP(S)/FTP is uploaded to the BitTorrent swarm. Using Metalink's
|
downloaded from HTTP(S)/FTP/SFTP is uploaded to the BitTorrent
|
||||||
chunk checksums, aria2 automatically validates chunks of data while
|
swarm. Using Metalink's chunk checksums, aria2 automatically validates
|
||||||
downloading a file like BitTorrent.
|
chunks of data while downloading a file like BitTorrent.
|
||||||
|
|
||||||
The project page is located at http://aria2.sourceforge.net/.
|
The project page is located at http://aria2.sourceforge.net/.
|
||||||
|
|
||||||
|
@ -33,10 +34,10 @@ Features
|
||||||
Here is a list of features:
|
Here is a list of features:
|
||||||
|
|
||||||
* Command-line interface
|
* Command-line interface
|
||||||
* Download files through HTTP(S)/FTP/BitTorrent
|
* Download files through HTTP(S)/FTP/SFTP/BitTorrent
|
||||||
* Segmented downloading
|
* Segmented downloading
|
||||||
* Metalink version 4 (RFC 5854) support(HTTP/FTP/BitTorrent)
|
* Metalink version 4 (RFC 5854) support(HTTP/FTP/SFTP/BitTorrent)
|
||||||
* Metalink version 3.0 support(HTTP/FTP/BitTorrent)
|
* Metalink version 3.0 support(HTTP/FTP/SFTP/BitTorrent)
|
||||||
* Metalink/HTTP (RFC 6249) support
|
* Metalink/HTTP (RFC 6249) support
|
||||||
* HTTP/1.1 implementation
|
* HTTP/1.1 implementation
|
||||||
* HTTP Proxy support
|
* HTTP Proxy support
|
||||||
|
@ -54,7 +55,7 @@ Here is a list of features:
|
||||||
* Save Cookies in the Mozilla/Firefox (1.x/2.x)/Netscape format.
|
* Save Cookies in the Mozilla/Firefox (1.x/2.x)/Netscape format.
|
||||||
* Custom HTTP Header support
|
* Custom HTTP Header support
|
||||||
* Persistent Connections support
|
* Persistent Connections support
|
||||||
* FTP through HTTP Proxy
|
* FTP/SFTP through HTTP Proxy
|
||||||
* Download/Upload speed throttling
|
* Download/Upload speed throttling
|
||||||
* BitTorrent extensions: Fast extension, DHT, PEX, MSE/PSE,
|
* BitTorrent extensions: Fast extension, DHT, PEX, MSE/PSE,
|
||||||
Multi-Tracker, UDP tracker
|
Multi-Tracker, UDP tracker
|
||||||
|
@ -98,6 +99,7 @@ Dependency
|
||||||
features dependency
|
features dependency
|
||||||
======================== ========================================
|
======================== ========================================
|
||||||
HTTPS OSX or GnuTLS or OpenSSL or Windows
|
HTTPS OSX or GnuTLS or OpenSSL or Windows
|
||||||
|
SFTP libssh2
|
||||||
BitTorrent None. Optional: libnettle+libgmp or libgcrypt
|
BitTorrent None. Optional: libnettle+libgmp or libgcrypt
|
||||||
or OpenSSL (see note)
|
or OpenSSL (see note)
|
||||||
Metalink libxml2 or Expat.
|
Metalink libxml2 or Expat.
|
||||||
|
@ -183,6 +185,7 @@ distribution you use):
|
||||||
* libgnutls-dev (Required for HTTPS, BitTorrent, Checksum support)
|
* libgnutls-dev (Required for HTTPS, BitTorrent, Checksum support)
|
||||||
* nettle-dev (Required for BitTorrent, Checksum support)
|
* nettle-dev (Required for BitTorrent, Checksum support)
|
||||||
* libgmp-dev (Required for BitTorrent)
|
* libgmp-dev (Required for BitTorrent)
|
||||||
|
* libssh2-1-dev (Required for SFTP support)
|
||||||
* libc-ares-dev (Required for async DNS support)
|
* libc-ares-dev (Required for async DNS support)
|
||||||
* libxml2-dev (Required for Metalink support)
|
* libxml2-dev (Required for Metalink support)
|
||||||
* zlib1g-dev (Required for gzip, deflate decoding support in HTTP)
|
* zlib1g-dev (Required for gzip, deflate decoding support in HTTP)
|
||||||
|
@ -206,8 +209,13 @@ You can use libexpat1-dev instead of libxml2-dev:
|
||||||
On Fedora you need the following packages: gcc, gcc-c++, kernel-devel,
|
On Fedora you need the following packages: gcc, gcc-c++, kernel-devel,
|
||||||
libgcrypt-devel, libxml2-devel, openssl-devel, gettext-devel, cppunit
|
libgcrypt-devel, libxml2-devel, openssl-devel, gettext-devel, cppunit
|
||||||
|
|
||||||
If you downloaded source code from git repository, you have to run
|
If you downloaded source code from git repository, you have to install
|
||||||
following command to generate configure script and other files
|
following packages to get autoconf macros:
|
||||||
|
|
||||||
|
* libxml2-dev
|
||||||
|
* libcppunit-dev
|
||||||
|
|
||||||
|
And run following command to generate configure script and other files
|
||||||
necessary to build the program::
|
necessary to build the program::
|
||||||
|
|
||||||
$ autoreconf -i
|
$ autoreconf -i
|
||||||
|
@ -301,6 +309,7 @@ following libraries have been built for cross-compile:
|
||||||
* expat
|
* expat
|
||||||
* sqlite3
|
* sqlite3
|
||||||
* zlib
|
* zlib
|
||||||
|
* libssh2
|
||||||
* cppunit
|
* cppunit
|
||||||
|
|
||||||
Some environment variables can be adjusted to change build settings:
|
Some environment variables can be adjusted to change build settings:
|
||||||
|
@ -341,6 +350,8 @@ assumes the following libraries have been built for cross-compile:
|
||||||
* c-ares
|
* c-ares
|
||||||
* openssl
|
* openssl
|
||||||
* expat
|
* expat
|
||||||
|
* zlib
|
||||||
|
* libssh2
|
||||||
|
|
||||||
When building the above libraries, make sure that disable shared
|
When building the above libraries, make sure that disable shared
|
||||||
library and enable only static library. We are going to link those
|
library and enable only static library. We are going to link those
|
||||||
|
@ -419,9 +430,11 @@ DHT
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
aria2 supports mainline compatible DHT. By default, the routing table
|
aria2 supports mainline compatible DHT. By default, the routing table
|
||||||
for IPv4 DHT is saved to ``$HOME/.aria2/dht.dat`` and the routing
|
for IPv4 DHT is saved to ``$XDG_CACHE_HOME/aria2/dht.dat`` and the
|
||||||
table for IPv6 DHT is saved to ``$HOME/.aria2/dht6.dat``. aria2 uses
|
routing table for IPv6 DHT is saved to
|
||||||
same port number to listen on for both IPv4 and IPv6 DHT.
|
``$XDG_CACHE_HOME/aria2/dht6.dat`` unless files exist at
|
||||||
|
``$HOME/.aria2/dht.dat`` or ``$HOME/.aria2/dht6.dat``. aria2 uses same
|
||||||
|
port number to listen on for both IPv4 and IPv6 DHT.
|
||||||
|
|
||||||
UDP tracker
|
UDP tracker
|
||||||
~~~~~~~~~~~
|
~~~~~~~~~~~
|
||||||
|
@ -449,9 +462,9 @@ Other things should be noted
|
||||||
Metalink
|
Metalink
|
||||||
--------
|
--------
|
||||||
|
|
||||||
The current implementation supports HTTP(S)/FTP/BitTorrent. The other
|
The current implementation supports HTTP(S)/FTP/SFTP/BitTorrent. The
|
||||||
P2P protocols are ignored. Both Metalink4 (RFC 5854) and Metalink
|
other P2P protocols are ignored. Both Metalink4 (RFC 5854) and
|
||||||
version 3.0 documents are supported.
|
Metalink version 3.0 documents are supported.
|
||||||
|
|
||||||
For checksum verification, md5, sha-1, sha-224, sha-256, sha-384 and
|
For checksum verification, md5, sha-1, sha-224, sha-256, sha-384 and
|
||||||
sha-512 are supported. If multiple hash algorithms are provided, aria2
|
sha-512 are supported. If multiple hash algorithms are provided, aria2
|
||||||
|
@ -497,9 +510,10 @@ which location you prefer, you can use ``--metalink-location`` option.
|
||||||
|
|
||||||
netrc
|
netrc
|
||||||
-----
|
-----
|
||||||
netrc support is enabled by default for HTTP(S)/FTP. To disable netrc
|
|
||||||
support, specify -n command-line option. Your .netrc file should have
|
netrc support is enabled by default for HTTP(S)/FTP/SFTP. To disable
|
||||||
correct permissions(600).
|
netrc support, specify -n command-line option. Your .netrc file
|
||||||
|
should have correct permissions(600).
|
||||||
|
|
||||||
WebSocket
|
WebSocket
|
||||||
---------
|
---------
|
||||||
|
|
|
@ -44,21 +44,15 @@ PATH=$TOOLCHAIN/bin:$PATH
|
||||||
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||||
--disable-nls \
|
--disable-nls \
|
||||||
--without-gnutls \
|
--without-gnutls \
|
||||||
--with-openssl --with-openssl-prefix=$PREFIX \
|
--with-openssl \
|
||||||
--without-sqlite3 \
|
--without-sqlite3 \
|
||||||
--without-libxml2 \
|
--without-libxml2 \
|
||||||
--with-libexpat --with-libexpat-prefix=$PREFIX \
|
--with-libexpat \
|
||||||
--with-libcares --with-libcares-prefix=$PREFIX \
|
--with-libcares \
|
||||||
--with-libz --with-libz-prefix=$PREFIX \
|
--with-libz \
|
||||||
|
--with-libssh2 \
|
||||||
CXXFLAGS="-Os -g" \
|
CXXFLAGS="-Os -g" \
|
||||||
CFLAGS="-Os -g" \
|
CFLAGS="-Os -g" \
|
||||||
CPPFLAGS="-fPIE" \
|
CPPFLAGS="-fPIE" \
|
||||||
LDFLAGS="-fPIE -pie -L$PREFIX/lib" \
|
LDFLAGS="-fPIE -pie -L$PREFIX/lib" \
|
||||||
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \
|
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig"
|
||||||
ZLIB_LIBS="-lz" \
|
|
||||||
ZLIB_CFLAGS="-I$TOOLCHAIN/sysroot/usr/include"
|
|
||||||
|
|
||||||
# ZLIB_LIBS and ZLIB_CFLAGS are needed because aria2 configure script
|
|
||||||
# checks zlib availability using pkg-config, but android toochain does
|
|
||||||
# not provide pkg-config file. We need to specify these variables
|
|
||||||
# manually.
|
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
if [ -z "$ANDROID_HOME" ]; then
|
||||||
|
echo 'No $ANDROID_HOME specified.'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
PREFIX=$ANDROID_HOME/usr/local
|
||||||
|
TOOLCHAIN=$ANDROID_HOME/toolchain
|
||||||
|
PATH=$TOOLCHAIN/bin:$PATH
|
||||||
|
|
||||||
|
HOST=arm-linux-androideabi
|
||||||
|
|
||||||
|
CC=$HOST-gcc \
|
||||||
|
AR=$HOST-ar \
|
||||||
|
LD=$HOST-ld \
|
||||||
|
RANLIB=$HOST-ranlib \
|
||||||
|
STRIP=$HOST-strip \
|
||||||
|
./configure \
|
||||||
|
--prefix=$PREFIX \
|
||||||
|
--libdir=$PREFIX/lib \
|
||||||
|
--includedir=$PREFIX/include \
|
||||||
|
--static
|
|
@ -28,6 +28,10 @@ build()
|
||||||
&& LANG=C make clean \
|
&& LANG=C make clean \
|
||||||
&& LANG=C make -j2 check 2>&1 |tee "$BUILDDIR/aria2c_$2.log" \
|
&& LANG=C make -j2 check 2>&1 |tee "$BUILDDIR/aria2c_$2.log" \
|
||||||
&& cp src/aria2c "$BUILDDIR/aria2c_$2"
|
&& cp src/aria2c "$BUILDDIR/aria2c_$2"
|
||||||
|
|
||||||
|
if [ -f "test/aria2c.log" ]; then
|
||||||
|
cat "test/aria2c.log" >> "$BUILDDIR/aria2c_$2.log"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
clear()
|
clear()
|
||||||
|
@ -53,11 +57,13 @@ case "$1" in
|
||||||
build "--without-libxml2 --without-libexpat" "noxml"
|
build "--without-libxml2 --without-libexpat" "noxml"
|
||||||
build "--without-libz" "nozlib"
|
build "--without-libz" "nozlib"
|
||||||
build "--without-sqlite3" "nosqlite3"
|
build "--without-sqlite3" "nosqlite3"
|
||||||
|
build "--without-libssh2" "nolibssh2"
|
||||||
# Feature combinations
|
# Feature combinations
|
||||||
build "--disable-bittorrent" "nobt"
|
build "--disable-bittorrent" "nobt"
|
||||||
build "--disable-metalink" "noml"
|
build "--disable-metalink" "noml"
|
||||||
build "--disable-bittorrent --disable-metalink" "nobt_noml"
|
build "--disable-bittorrent --disable-metalink" "nobt_noml"
|
||||||
build "--disable-epoll" "noepoll"
|
build "--disable-epoll" "noepoll"
|
||||||
build "--disable-epoll --without-libcares" "noepoll_nocares"
|
build "--disable-epoll --without-libcares" "noepoll_nocares"
|
||||||
|
build "--enable-libaria2" "libaria2"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
91
configure.ac
91
configure.ac
|
@ -2,7 +2,7 @@
|
||||||
# Process this file with autoconf to produce a configure script.
|
# Process this file with autoconf to produce a configure script.
|
||||||
#
|
#
|
||||||
AC_PREREQ([2.67])
|
AC_PREREQ([2.67])
|
||||||
AC_INIT([aria2],[1.18.9],[https://github.com/tatsuhiro-t/aria2/issues],[aria2],[http://aria2.sourceforge.net/])
|
AC_INIT([aria2],[1.19.1],[https://github.com/tatsuhiro-t/aria2/issues],[aria2],[http://aria2.sourceforge.net/])
|
||||||
|
|
||||||
AC_CANONICAL_HOST
|
AC_CANONICAL_HOST
|
||||||
AC_CANONICAL_TARGET
|
AC_CANONICAL_TARGET
|
||||||
|
@ -29,9 +29,10 @@ case "$host" in
|
||||||
*mingw*)
|
*mingw*)
|
||||||
win_build=yes
|
win_build=yes
|
||||||
LIBS="$LIBS -lws2_32 -lwsock32 -lgdi32 -lwinmm -liphlpapi -lpsapi"
|
LIBS="$LIBS -lws2_32 -lwsock32 -lgdi32 -lwinmm -liphlpapi -lpsapi"
|
||||||
# C++ headers defines __USE_MINGW_ANSI_STDIO to 1 unconditionally.
|
# Define _POSIX_C_SOURCE to 1. This makes {asc,local}time_r available
|
||||||
# We have to use it as well nonetheless.
|
# from <time.h> even without (un)helpful interference from <pthread.h>,
|
||||||
CPPFLAGS="-D__USE_MINGW_ANSI_STDIO=1 $CPPFLAGS"
|
# and also defines __USE_MINGW_ANSI_STDIO.
|
||||||
|
CPPFLAGS="-D_POSIX_C_SOURCE=1 $CPPFLAGS"
|
||||||
# Build with ASLR (dynamicbase) and NX compatiblity (nxcompat)
|
# Build with ASLR (dynamicbase) and NX compatiblity (nxcompat)
|
||||||
# Enable pie once upstream/binutils gets fixed to produce correct binaries with it.
|
# Enable pie once upstream/binutils gets fixed to produce correct binaries with it.
|
||||||
LDFLAGS="$LDFLAGS -Wl,--dynamicbase -Wl,--nxcompat"
|
LDFLAGS="$LDFLAGS -Wl,--dynamicbase -Wl,--nxcompat"
|
||||||
|
@ -43,7 +44,7 @@ AC_DEFINE_UNQUOTED([HOST], ["$host"], [Define build-type])
|
||||||
AC_DEFINE_UNQUOTED([TARGET], ["$target"], [Define target-type])
|
AC_DEFINE_UNQUOTED([TARGET], ["$target"], [Define target-type])
|
||||||
|
|
||||||
# Checks for arguments.
|
# Checks for arguments.
|
||||||
ARIA2_ARG_WITHOUT([libuv])
|
ARIA2_ARG_WITH([libuv])
|
||||||
ARIA2_ARG_WITHOUT([appletls])
|
ARIA2_ARG_WITHOUT([appletls])
|
||||||
ARIA2_ARG_WITHOUT([wintls])
|
ARIA2_ARG_WITHOUT([wintls])
|
||||||
ARIA2_ARG_WITHOUT([gnutls])
|
ARIA2_ARG_WITHOUT([gnutls])
|
||||||
|
@ -58,6 +59,7 @@ ARIA2_ARG_WITHOUT([libcares])
|
||||||
ARIA2_ARG_WITHOUT([libz])
|
ARIA2_ARG_WITHOUT([libz])
|
||||||
ARIA2_ARG_WITH([tcmalloc])
|
ARIA2_ARG_WITH([tcmalloc])
|
||||||
ARIA2_ARG_WITH([jemalloc])
|
ARIA2_ARG_WITH([jemalloc])
|
||||||
|
ARIA2_ARG_WITHOUT([libssh2])
|
||||||
|
|
||||||
ARIA2_ARG_DISABLE([ssl])
|
ARIA2_ARG_DISABLE([ssl])
|
||||||
ARIA2_ARG_DISABLE([bittorrent])
|
ARIA2_ARG_DISABLE([bittorrent])
|
||||||
|
@ -106,14 +108,6 @@ if test "x$AR" = "x:"; then
|
||||||
fi
|
fi
|
||||||
AC_SUBST([AR])
|
AC_SUBST([AR])
|
||||||
|
|
||||||
AC_PATH_PROG([A2X], [a2x])
|
|
||||||
AC_SUBST([A2X])
|
|
||||||
AM_CONDITIONAL([HAVE_A2X], [ test "x$A2X" != "x" ])
|
|
||||||
|
|
||||||
AC_PATH_PROG([ASCIIDOC], [asciidoc])
|
|
||||||
AC_SUBST([ASCIIDOC])
|
|
||||||
AM_CONDITIONAL([HAVE_ASCIIDOC], [ test "x$ASCIIDOC" != "x" ])
|
|
||||||
|
|
||||||
AC_PATH_PROGS([SPHINXBUILD], [sphinx-build])
|
AC_PATH_PROGS([SPHINXBUILD], [sphinx-build])
|
||||||
AC_SUBST([SPHINXBUILD])
|
AC_SUBST([SPHINXBUILD])
|
||||||
AM_CONDITIONAL([HAVE_SPHINXBUILD], [ test "x$SPHINXBUILD" != "x" ])
|
AM_CONDITIONAL([HAVE_SPHINXBUILD], [ test "x$SPHINXBUILD" != "x" ])
|
||||||
|
@ -131,6 +125,16 @@ PKG_PROG_PKG_CONFIG([0.20])
|
||||||
# Check C++ compiler supports C++0x/C++11 feature
|
# Check C++ compiler supports C++0x/C++11 feature
|
||||||
AX_CXX_COMPILE_STDCXX_11([noext], [mandatory])
|
AX_CXX_COMPILE_STDCXX_11([noext], [mandatory])
|
||||||
|
|
||||||
|
# Check C++ compiler actually supports nullptr
|
||||||
|
AC_MSG_CHECKING([whether the c++ compiler supports nullptr])
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||||
|
]],
|
||||||
|
[[
|
||||||
|
int *a = nullptr;
|
||||||
|
]])],
|
||||||
|
[],
|
||||||
|
[AC_MSG_FAILURE([C++ compiler does not understand nullptr, perhaps C++ compiler is too old. Try again with new one (gcc >= 4.8.3 or clang >= 3.4)])])
|
||||||
|
|
||||||
# i686-w64-mingw32-g++ 4.6 does not support override keyword. For
|
# i686-w64-mingw32-g++ 4.6 does not support override keyword. For
|
||||||
# those compilers, define CXX11_OVERRIDE to empty string. Otherwise
|
# those compilers, define CXX11_OVERRIDE to empty string. Otherwise
|
||||||
# define it as override. Use CXX11_OVERRIDE instead of override.
|
# define it as override. Use CXX11_OVERRIDE instead of override.
|
||||||
|
@ -470,6 +474,20 @@ if test "x$have_openssl" != "xyes"; then
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test "x$with_libssh2" = "xyes"; then
|
||||||
|
PKG_CHECK_MODULES([LIBSSH2], [libssh2], [have_libssh2=yes], [have_libssh2=no])
|
||||||
|
if test "x$have_libssh2" = "xyes"; then
|
||||||
|
AC_DEFINE([HAVE_LIBSSH2], [1], [Define to 1 if you have libssh2.])
|
||||||
|
LIBS="$LIBSSH2_LIBS $LIBS"
|
||||||
|
CPPFLAGS="$LIBSSH2_CFLAGS $CPPFLAGS"
|
||||||
|
else
|
||||||
|
AC_MSG_WARN([$LIBSSH2_PKG_ERRORS])
|
||||||
|
if test "x$with_libssh2_requested" = "xyes"; then
|
||||||
|
ARIA2_DEP_NOT_MET([libssh2])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
if test "x$with_libcares" = "xyes"; then
|
if test "x$with_libcares" = "xyes"; then
|
||||||
PKG_CHECK_MODULES([LIBCARES], [libcares >= 1.7.0], [have_libcares=yes],
|
PKG_CHECK_MODULES([LIBCARES], [libcares >= 1.7.0], [have_libcares=yes],
|
||||||
[have_libcares=no])
|
[have_libcares=no])
|
||||||
|
@ -613,6 +631,9 @@ AM_CONDITIONAL([HAVE_ZLIB], [test "x$have_zlib" = "xyes"])
|
||||||
# Set conditional for sqlite3
|
# Set conditional for sqlite3
|
||||||
AM_CONDITIONAL([HAVE_SQLITE3], [test "x$have_sqlite3" = "xyes"])
|
AM_CONDITIONAL([HAVE_SQLITE3], [test "x$have_sqlite3" = "xyes"])
|
||||||
|
|
||||||
|
# Set conditional for libssh2
|
||||||
|
AM_CONDITIONAL([HAVE_LIBSSH2], [test "x$have_libssh2" = "xyes"])
|
||||||
|
|
||||||
AC_SEARCH_LIBS([clock_gettime], [rt])
|
AC_SEARCH_LIBS([clock_gettime], [rt])
|
||||||
|
|
||||||
case "$host" in
|
case "$host" in
|
||||||
|
@ -758,10 +779,12 @@ AC_CHECK_FUNCS([__argz_count \
|
||||||
|
|
||||||
AC_MSG_CHECKING([for getrandom linux syscall interface])
|
AC_MSG_CHECKING([for getrandom linux syscall interface])
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||||
|
#include <sys/syscall.h>
|
||||||
#include <linux/random.h>
|
#include <linux/random.h>
|
||||||
]],
|
]],
|
||||||
[[
|
[[
|
||||||
int x = GRND_NONBLOCK;
|
int x = GRND_NONBLOCK;
|
||||||
|
int y = (int)SYS_getrandom;
|
||||||
]])],
|
]])],
|
||||||
[have_getrandom_interface=yes
|
[have_getrandom_interface=yes
|
||||||
AC_DEFINE([HAVE_GETRANDOM_INTERFACE], [1], [Define to 1 if getrandom linux syscall interface is available.])],
|
AC_DEFINE([HAVE_GETRANDOM_INTERFACE], [1], [Define to 1 if getrandom linux syscall interface is available.])],
|
||||||
|
@ -839,10 +862,32 @@ AM_CONDITIONAL([HAVE_SOME_FALLOCATE],
|
||||||
[test "x$have_posix_fallocate" = "xyes" || test "x$have_fallocate" = "xyes" \
|
[test "x$have_posix_fallocate" = "xyes" || test "x$have_fallocate" = "xyes" \
|
||||||
|| test "x$have_osx" = "xyes" || test "x$win_build" = "xyes"])
|
|| test "x$have_osx" = "xyes" || test "x$win_build" = "xyes"])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([for asctime_r])
|
||||||
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||||
|
#include <time.h>
|
||||||
|
]], [[
|
||||||
|
struct tm r; char *c;
|
||||||
|
asctime_r(&r, c);
|
||||||
|
]])],
|
||||||
|
[AM_CONDITIONAL([HAVE_ASCTIME_R], true)
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
AC_DEFINE([HAVE_ASCTIME_R], [1], [Define to 1 if you have the `asctime_r' function or macro.])],
|
||||||
|
[AC_MSG_RESULT([no])
|
||||||
|
AM_CONDITIONAL([HAVE_ASCTIME_R], false)])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([for localtime_r])
|
||||||
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||||
|
#include <time.h>
|
||||||
|
]], [[
|
||||||
|
time_t t; struct tm r;
|
||||||
|
localtime_r(&t, &r);
|
||||||
|
]])],
|
||||||
|
[AM_CONDITIONAL([HAVE_LOCALTIME_R], true)
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
AC_DEFINE([HAVE_LOCALTIME_R], [1], [Define to 1 if you have the `localtime_r' function or macro.])],
|
||||||
|
[AC_MSG_RESULT([no])
|
||||||
|
AM_CONDITIONAL([HAVE_LOCALTIME_R], false)])
|
||||||
|
|
||||||
AC_CHECK_FUNCS([asctime_r],
|
|
||||||
[AM_CONDITIONAL([HAVE_ASCTIME_R], true)],
|
|
||||||
[AM_CONDITIONAL([HAVE_ASCTIME_R], false)])
|
|
||||||
AC_CHECK_FUNCS([basename],
|
AC_CHECK_FUNCS([basename],
|
||||||
[AM_CONDITIONAL([HAVE_BASENAME], true)],
|
[AM_CONDITIONAL([HAVE_BASENAME], true)],
|
||||||
[AM_CONDITIONAL([HAVE_BASENAME], false)])
|
[AM_CONDITIONAL([HAVE_BASENAME], false)])
|
||||||
|
@ -855,9 +900,6 @@ AC_CHECK_FUNCS([getaddrinfo],
|
||||||
AC_CHECK_FUNCS([gettimeofday],
|
AC_CHECK_FUNCS([gettimeofday],
|
||||||
[AM_CONDITIONAL([HAVE_GETTIMEOFDAY], true)],
|
[AM_CONDITIONAL([HAVE_GETTIMEOFDAY], true)],
|
||||||
[AM_CONDITIONAL([HAVE_GETTIMEOFDAY], false)])
|
[AM_CONDITIONAL([HAVE_GETTIMEOFDAY], false)])
|
||||||
AC_CHECK_FUNCS([localtime_r],
|
|
||||||
[AM_CONDITIONAL([HAVE_LOCALTIME_R], true)],
|
|
||||||
[AM_CONDITIONAL([HAVE_LOCALTIME_R], false)])
|
|
||||||
AC_CHECK_FUNCS([strptime],
|
AC_CHECK_FUNCS([strptime],
|
||||||
[AM_CONDITIONAL([HAVE_STRPTIME], true)],
|
[AM_CONDITIONAL([HAVE_STRPTIME], true)],
|
||||||
[AM_CONDITIONAL([HAVE_STRPTIME], false)])
|
[AM_CONDITIONAL([HAVE_STRPTIME], false)])
|
||||||
|
@ -867,14 +909,6 @@ AC_CHECK_FUNCS([timegm],
|
||||||
AC_CHECK_FUNCS([daemon], [have_daemon=yes])
|
AC_CHECK_FUNCS([daemon], [have_daemon=yes])
|
||||||
AM_CONDITIONAL([HAVE_DAEMON], [test "x$have_daemon" = "xyes"])
|
AM_CONDITIONAL([HAVE_DAEMON], [test "x$have_daemon" = "xyes"])
|
||||||
|
|
||||||
AC_CHECK_FUNCS([clock_gettime], [have_clock_gettime=yes])
|
|
||||||
|
|
||||||
if test "x$have_clock_gettime" != "xyes"; then
|
|
||||||
AC_CHECK_FUNCS([mach_absolute_time], [have_mach_absolute_time=yes])
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL([HAVE_MACH_ABSOLUTE_TIME],
|
|
||||||
[test "x$have_mach_absolute_time" = "xyes"])
|
|
||||||
|
|
||||||
AC_CHECK_FUNCS([poll], [have_poll=yes])
|
AC_CHECK_FUNCS([poll], [have_poll=yes])
|
||||||
AM_CONDITIONAL([HAVE_POLL], [test "x$have_poll" = "xyes"])
|
AM_CONDITIONAL([HAVE_POLL], [test "x$have_poll" = "xyes"])
|
||||||
|
|
||||||
|
@ -885,11 +919,9 @@ case "$host" in
|
||||||
AM_CONDITIONAL([HAVE_GETADDRINFO], true)
|
AM_CONDITIONAL([HAVE_GETADDRINFO], true)
|
||||||
dnl defined in ws2tcpip.h, but missing in C:\mingw\lib\libws2_32.a
|
dnl defined in ws2tcpip.h, but missing in C:\mingw\lib\libws2_32.a
|
||||||
AM_CONDITIONAL([HAVE_GAI_STRERROR], false)
|
AM_CONDITIONAL([HAVE_GAI_STRERROR], false)
|
||||||
AM_CONDITIONAL([HAVE_TIMEGETTIME], [test "x$have_clock_gettime" != "xyes"])
|
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
AM_CONDITIONAL([MINGW_BUILD], false)
|
AM_CONDITIONAL([MINGW_BUILD], false)
|
||||||
AM_CONDITIONAL([HAVE_TIMEGETTIME], false)
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
@ -1060,6 +1092,7 @@ echo "LibXML2: $have_libxml2"
|
||||||
echo "LibExpat: $have_libexpat"
|
echo "LibExpat: $have_libexpat"
|
||||||
echo "LibCares: $have_libcares"
|
echo "LibCares: $have_libcares"
|
||||||
echo "Zlib: $have_zlib"
|
echo "Zlib: $have_zlib"
|
||||||
|
echo "Libssh2: $have_libssh2"
|
||||||
echo "Epoll: $have_epoll"
|
echo "Epoll: $have_epoll"
|
||||||
echo "Bittorrent: $enable_bittorrent"
|
echo "Bittorrent: $enable_bittorrent"
|
||||||
echo "Metalink: $enable_metalink"
|
echo "Metalink: $enable_metalink"
|
||||||
|
|
|
@ -70,7 +70,7 @@ _aria2c()
|
||||||
esac
|
esac
|
||||||
case $cur in
|
case $cur in
|
||||||
-*)
|
-*)
|
||||||
COMPREPLY=( $( compgen -W '--rpc-save-upload-metadata --rpc-save-upload-metadata=false --on-download-start --metalink-language --rpc-secret --torrent-file --enable-peer-exchange --enable-peer-exchange=false --http-proxy-passwd --bt-tracker-timeout --ftp-type --seed-time --bt-tracker-connect-timeout --bt-max-open-files --no-netrc --no-netrc=false --force-sequential --force-sequential=false --metalink-base-uri --private-key --ftp-passwd --allow-overwrite --allow-overwrite=false --rpc-allow-origin-all --rpc-allow-origin-all=false --bt-detach-seed-only --bt-detach-seed-only=false --summary-interval --lowest-speed-limit --bt-tracker-interval --proxy-method --metalink-preferred-protocol --enable-http-keep-alive --enable-http-keep-alive=false --metalink-version --bt-lpd-interface --force-save --force-save=false --rpc-secure --rpc-secure=false --listen-port --rpc-private-key --server-stat-of --server-stat-timeout --https-proxy-user --piece-length --dry-run --dry-run=false --truncate-console-readout --truncate-console-readout=false --async-dns-server --bt-max-peers --max-overall-upload-limit --rpc-user --dht-entry-point6 --dir --split --on-download-pause --auto-file-renaming --auto-file-renaming=false --http-proxy --save-session-interval --daemon --daemon=false --https-proxy --min-tls-version --save-cookies --out --rlimit-nofile --max-file-not-found --on-download-stop --certificate --bt-min-crypto-level --remove-control-file --remove-control-file=false --enable-dht --enable-dht=false --file-allocation --follow-metalink --on-bt-download-complete --ftp-proxy --show-files --show-files=false --timeout --bt-hash-check-seed --bt-hash-check-seed=false --ftp-pasv --ftp-pasv=false --check-certificate --check-certificate=false --always-resume --always-resume=false --load-cookies --bt-remove-unselected-file --bt-remove-unselected-file=false --bt-stop-timeout --version --max-concurrent-downloads --quiet --quiet=false --max-download-result --max-resume-failure-tries --header --rpc-listen-all --rpc-listen-all=false --all-proxy-user --server-stat-if --dht-file-path6 --save-session --bt-external-ip --max-tries --conditional-get --conditional-get=false --ftp-reuse-connection --ftp-reuse-connection=false --gid --dscp --max-download-limit --bt-prioritize-piece --check-integrity --check-integrity=false --log-level --remote-time --remote-time=false --uri-selector --rpc-listen-port --index-out --bt-tracker --referer --console-log-level --connect-timeout --stream-piece-selector --dht-message-timeout --select-file --download-result --disable-ipv6 --disable-ipv6=false --rpc-max-request-size --rpc-passwd --stop-with-process --https-proxy-passwd --continue --continue=false --no-file-allocation-limit --ftp-proxy-user --enable-color --enable-color=false --metalink-location --allow-piece-length-change --allow-piece-length-change=false --max-connection-per-server --no-conf --no-conf=false --rpc-certificate --metalink-os --enable-http-pipelining --enable-http-pipelining=false --http-passwd --user-agent --enable-dht6 --enable-dht6=false --dht-file-path --http-auth-challenge --http-auth-challenge=false --peer-id-prefix --enable-mmap --enable-mmap=false --use-head --use-head=false --bt-require-crypto --bt-require-crypto=false --show-console-readout --show-console-readout=false --conf-path --log --no-proxy --dht-entry-point --dht-listen-port --http-user --retry-wait --on-download-complete --help --help=#basic --help=#advanced --help=#http --help=#https --help=#ftp --help=#metalink --help=#bittorrent --help=#cookie --help=#hook --help=#file --help=#rpc --help=#checksum --help=#experimental --help=#deprecated --help=#help --help=#all --max-overall-download-limit --event-poll --http-accept-gzip --http-accept-gzip=false --metalink-file --all-proxy --disk-cache --hash-check-only --hash-check-only=false --dht-listen-addr6 --human-readable --human-readable=false --ftp-user --all-proxy-passwd --bt-exclude-tracker --pause-metadata --pause-metadata=false --http-proxy-user --deferred-input --deferred-input=false --metalink-enable-unique-protocol --metalink-enable-unique-protocol=false --stop --max-upload-limit --realtime-chunk-checksum --realtime-chunk-checksum=false --http-no-cache --http-no-cache=false --ca-certificate --bt-force-encryption --bt-force-encryption=false --bt-save-metadata --bt-save-metadata=false --seed-ratio --follow-torrent --pause --pause=false --checksum --auto-save-interval --async-dns --async-dns=false --bt-enable-lpd --bt-enable-lpd=false --parameterized-uri --parameterized-uri=false --ftp-proxy-passwd --enable-rpc --enable-rpc=false --min-split-size --bt-seed-unverified --bt-seed-unverified=false --input-file --interface --enable-async-dns6 --enable-async-dns6=false --reuse-uri --reuse-uri=false --bt-request-peer-speed-limit --on-download-error --bt-metadata-only --bt-metadata-only=false ' -- "$cur" ) )
|
COMPREPLY=( $( compgen -W '--rpc-save-upload-metadata --rpc-save-upload-metadata=false --on-download-start --metalink-language --rpc-secret --torrent-file --enable-peer-exchange --enable-peer-exchange=false --http-proxy-passwd --bt-tracker-timeout --ftp-type --seed-time --bt-tracker-connect-timeout --bt-max-open-files --no-netrc --no-netrc=false --force-sequential --force-sequential=false --metalink-base-uri --private-key --ftp-passwd --allow-overwrite --allow-overwrite=false --rpc-allow-origin-all --rpc-allow-origin-all=false --bt-detach-seed-only --bt-detach-seed-only=false --summary-interval --lowest-speed-limit --bt-tracker-interval --proxy-method --metalink-preferred-protocol --enable-http-keep-alive --enable-http-keep-alive=false --metalink-version --bt-lpd-interface --force-save --force-save=false --rpc-secure --rpc-secure=false --listen-port --rpc-private-key --server-stat-of --server-stat-timeout --https-proxy-user --piece-length --dry-run --dry-run=false --truncate-console-readout --truncate-console-readout=false --async-dns-server --bt-max-peers --max-overall-upload-limit --rpc-user --dht-entry-point6 --dir --split --on-download-pause --auto-file-renaming --auto-file-renaming=false --http-proxy --save-session-interval --daemon --daemon=false --https-proxy --min-tls-version --save-cookies --out --rlimit-nofile --max-file-not-found --on-download-stop --certificate --bt-min-crypto-level --remove-control-file --remove-control-file=false --enable-dht --enable-dht=false --file-allocation --follow-metalink --on-bt-download-complete --ftp-proxy --show-files --show-files=false --timeout --bt-hash-check-seed --bt-hash-check-seed=false --ftp-pasv --ftp-pasv=false --check-certificate --check-certificate=false --always-resume --always-resume=false --load-cookies --bt-remove-unselected-file --bt-remove-unselected-file=false --bt-stop-timeout --version --max-concurrent-downloads --quiet --quiet=false --max-download-result --max-resume-failure-tries --header --rpc-listen-all --rpc-listen-all=false --all-proxy-user --server-stat-if --dht-file-path6 --save-session --bt-external-ip --max-tries --conditional-get --conditional-get=false --ftp-reuse-connection --ftp-reuse-connection=false --gid --dscp --max-download-limit --bt-prioritize-piece --check-integrity --check-integrity=false --log-level --remote-time --remote-time=false --uri-selector --rpc-listen-port --index-out --bt-tracker --referer --ssh-host-key-md --console-log-level --connect-timeout --stream-piece-selector --dht-message-timeout --select-file --download-result --disable-ipv6 --disable-ipv6=false --rpc-max-request-size --rpc-passwd --stop-with-process --https-proxy-passwd --continue --continue=false --no-file-allocation-limit --netrc-path --ftp-proxy-user --enable-color --enable-color=false --metalink-location --allow-piece-length-change --allow-piece-length-change=false --max-connection-per-server --no-conf --no-conf=false --rpc-certificate --metalink-os --enable-http-pipelining --enable-http-pipelining=false --http-passwd --user-agent --enable-dht6 --enable-dht6=false --dht-file-path --http-auth-challenge --http-auth-challenge=false --peer-id-prefix --enable-mmap --enable-mmap=false --use-head --use-head=false --bt-require-crypto --bt-require-crypto=false --show-console-readout --show-console-readout=false --conf-path --log --no-proxy --dht-entry-point --dht-listen-port --http-user --retry-wait --on-download-complete --help --help=#basic --help=#advanced --help=#http --help=#https --help=#ftp --help=#metalink --help=#bittorrent --help=#cookie --help=#hook --help=#file --help=#rpc --help=#checksum --help=#experimental --help=#deprecated --help=#help --help=#all --max-overall-download-limit --event-poll --http-accept-gzip --http-accept-gzip=false --metalink-file --all-proxy --disk-cache --hash-check-only --hash-check-only=false --dht-listen-addr6 --human-readable --human-readable=false --ftp-user --all-proxy-passwd --bt-exclude-tracker --pause-metadata --pause-metadata=false --http-proxy-user --deferred-input --deferred-input=false --metalink-enable-unique-protocol --metalink-enable-unique-protocol=false --stop --max-upload-limit --multiple-interface --realtime-chunk-checksum --realtime-chunk-checksum=false --http-no-cache --http-no-cache=false --ca-certificate --bt-force-encryption --bt-force-encryption=false --bt-save-metadata --bt-save-metadata=false --seed-ratio --follow-torrent --pause --pause=false --checksum --auto-save-interval --async-dns --async-dns=false --bt-enable-lpd --bt-enable-lpd=false --parameterized-uri --parameterized-uri=false --ftp-proxy-passwd --enable-rpc --enable-rpc=false --min-split-size --bt-seed-unverified --bt-seed-unverified=false --input-file --interface --enable-async-dns6 --enable-async-dns6=false --reuse-uri --reuse-uri=false --bt-request-peer-speed-limit --on-download-error --bt-metadata-only --bt-metadata-only=false ' -- "$cur" ) )
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
_filedir '@(torrent|meta4|metalink|text|txt|list|lst)'
|
_filedir '@(torrent|meta4|metalink|text|txt|list|lst)'
|
||||||
|
|
|
@ -9,17 +9,22 @@ DESCRIPTION
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
aria2 is a utility for downloading files. The supported protocols are
|
aria2 is a utility for downloading files. The supported protocols are
|
||||||
HTTP(S), FTP, BitTorrent, and Metalink. aria2 can download a file from
|
HTTP(S), FTP, SFTP, BitTorrent, and Metalink. aria2 can download a
|
||||||
multiple sources/protocols and tries to utilize your maximum download
|
file from multiple sources/protocols and tries to utilize your maximum
|
||||||
bandwidth. It supports downloading a file from HTTP(S)/FTP and
|
download bandwidth. It supports downloading a file from HTTP(S)/FTP
|
||||||
BitTorrent at the same time, while the data downloaded from
|
/SFTP and BitTorrent at the same time, while the data downloaded from
|
||||||
HTTP(S)/FTP is uploaded to the BitTorrent swarm. Using Metalink
|
HTTP(S)/FTP/SFTP is uploaded to the BitTorrent swarm. Using Metalink
|
||||||
chunk checksums, aria2 automatically validates chunks of data while
|
chunk checksums, aria2 automatically validates chunks of data while
|
||||||
downloading a file.
|
downloading a file.
|
||||||
|
|
||||||
OPTIONS
|
OPTIONS
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Most FTP related options are applicable to SFTP as well.
|
||||||
|
Some options are not effective against SFTP (e.g., :option:`--ftp-pasv`)
|
||||||
|
|
||||||
Basic Options
|
Basic Options
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
.. option:: -d, --dir=<DIR>
|
.. option:: -d, --dir=<DIR>
|
||||||
|
@ -84,8 +89,9 @@ Basic Options
|
||||||
``#checksum``, ``#experimental``, ``#deprecated``, ``#help``, ``#all``
|
``#checksum``, ``#experimental``, ``#deprecated``, ``#help``, ``#all``
|
||||||
Default: ``#basic``
|
Default: ``#basic``
|
||||||
|
|
||||||
HTTP/FTP Options
|
HTTP/FTP/SFTP Options
|
||||||
~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. option:: --all-proxy=<PROXY>
|
.. option:: --all-proxy=<PROXY>
|
||||||
|
|
||||||
Use a proxy server for all protocols. To override a previously
|
Use a proxy server for all protocols. To override a previously
|
||||||
|
@ -184,6 +190,17 @@ HTTP/FTP Options
|
||||||
1 source. You can append ``K`` or ``M`` (1K = 1024, 1M = 1024K).
|
1 source. You can append ``K`` or ``M`` (1K = 1024, 1M = 1024K).
|
||||||
Possible Values: ``1M`` -``1024M`` Default: ``20M``
|
Possible Values: ``1M`` -``1024M`` Default: ``20M``
|
||||||
|
|
||||||
|
|
||||||
|
.. option:: --netrc-path=<FILE>
|
||||||
|
|
||||||
|
Specify the path to the netrc file.
|
||||||
|
Default: ``$(HOME)/.netrc``
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Permission of the .netrc file must be 600. Otherwise, the file
|
||||||
|
will be ignored.
|
||||||
|
|
||||||
.. option:: -n, --no-netrc[=true|false]
|
.. option:: -n, --no-netrc[=true|false]
|
||||||
|
|
||||||
Disables netrc support. netrc support is enabled by default.
|
Disables netrc support. netrc support is enabled by default.
|
||||||
|
@ -520,8 +537,8 @@ HTTP Specific Options
|
||||||
Set user agent for HTTP(S) downloads.
|
Set user agent for HTTP(S) downloads.
|
||||||
Default: ``aria2/$VERSION``, $VERSION is replaced by package version.
|
Default: ``aria2/$VERSION``, $VERSION is replaced by package version.
|
||||||
|
|
||||||
FTP Specific Options
|
FTP/SFTP Specific Options
|
||||||
~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
.. option:: --ftp-user=<USER>
|
.. option:: --ftp-user=<USER>
|
||||||
|
|
||||||
Set FTP user. This affects all URIs.
|
Set FTP user. This affects all URIs.
|
||||||
|
@ -542,6 +559,10 @@ FTP Specific Options
|
||||||
If ``false`` is given, the active mode will be used.
|
If ``false`` is given, the active mode will be used.
|
||||||
Default: ``true``
|
Default: ``true``
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
This option is ignored for SFTP transfer.
|
||||||
|
|
||||||
.. option:: --ftp-proxy=<PROXY>
|
.. option:: --ftp-proxy=<PROXY>
|
||||||
|
|
||||||
Use a proxy server for FTP. To override a previously defined proxy,
|
Use a proxy server for FTP. To override a previously defined proxy,
|
||||||
|
@ -562,11 +583,24 @@ FTP Specific Options
|
||||||
Set FTP transfer type. TYPE is either ``binary`` or ``ascii``.
|
Set FTP transfer type. TYPE is either ``binary`` or ``ascii``.
|
||||||
Default: ``binary``
|
Default: ``binary``
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
This option is ignored for SFTP transfer.
|
||||||
|
|
||||||
.. option:: --ftp-reuse-connection[=true|false]
|
.. option:: --ftp-reuse-connection[=true|false]
|
||||||
|
|
||||||
Reuse connection in FTP.
|
Reuse connection in FTP.
|
||||||
Default: ``true``
|
Default: ``true``
|
||||||
|
|
||||||
|
.. option:: --ssh-host-key-md=<TYPE>=<DIGEST>
|
||||||
|
|
||||||
|
Set checksum for SSH host public key. TYPE is hash type. The
|
||||||
|
supported hash type is ``sha-1`` or ``md5``. DIGEST is hex
|
||||||
|
digest. For example:
|
||||||
|
``sha-1=b030503d4de4539dc7885e6f0f5e256704edf4c3``. This option can
|
||||||
|
be used to validate server's public key when SFTP is used. If this
|
||||||
|
option is not set, which is default, no validation takes place.
|
||||||
|
|
||||||
BitTorrent/Metalink Options
|
BitTorrent/Metalink Options
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
.. option:: --select-file=<INDEX>...
|
.. option:: --select-file=<INDEX>...
|
||||||
|
@ -767,12 +801,14 @@ BitTorrent Specific Options
|
||||||
.. option:: --dht-file-path=<PATH>
|
.. option:: --dht-file-path=<PATH>
|
||||||
|
|
||||||
Change the IPv4 DHT routing table file to PATH.
|
Change the IPv4 DHT routing table file to PATH.
|
||||||
Default: ``$HOME/.aria2/dht.dat``
|
Default: ``$HOME/.aria2/dht.dat`` if present, otherwise
|
||||||
|
``$XDG_CACHE_HOME/aria2/dht.dat``.
|
||||||
|
|
||||||
.. option:: --dht-file-path6=<PATH>
|
.. option:: --dht-file-path6=<PATH>
|
||||||
|
|
||||||
Change the IPv6 DHT routing table file to PATH.
|
Change the IPv6 DHT routing table file to PATH.
|
||||||
Default: ``$HOME/.aria2/dht6.dat``
|
Default: ``$HOME/.aria2/dht6.dat`` if present, otherwise
|
||||||
|
``$XDG_CACHE_HOME/aria2/dht6.dat``.
|
||||||
|
|
||||||
.. option:: --dht-listen-addr6=<ADDR>
|
.. option:: --dht-listen-addr6=<ADDR>
|
||||||
|
|
||||||
|
@ -1147,7 +1183,8 @@ Advanced Options
|
||||||
.. option:: --conf-path=<PATH>
|
.. option:: --conf-path=<PATH>
|
||||||
|
|
||||||
Change the configuration file path to PATH.
|
Change the configuration file path to PATH.
|
||||||
Default: ``$HOME/.aria2/aria2.conf``
|
Default: ``$HOME/.aria2/aria2.conf`` if present, otherwise
|
||||||
|
``$XDG_CONFIG_HOME/aria2/aria2.conf``.
|
||||||
|
|
||||||
.. option:: --console-log-level=<LEVEL>
|
.. option:: --console-log-level=<LEVEL>
|
||||||
|
|
||||||
|
@ -1336,6 +1373,14 @@ Advanced Options
|
||||||
Possible Values: ``SSLv3``, ``TLSv1``, ``TLSv1.1``, ``TLSv1.2``
|
Possible Values: ``SSLv3``, ``TLSv1``, ``TLSv1.1``, ``TLSv1.2``
|
||||||
Default: ``TLSv1``
|
Default: ``TLSv1``
|
||||||
|
|
||||||
|
.. option:: --multiple-interface=<INTERFACES>
|
||||||
|
|
||||||
|
Comma separated list of interfaces to bind sockets to. Requests will
|
||||||
|
be splited among the interfaces to achieve link aggregation. You can
|
||||||
|
specify interface name, IP address and hostname. If
|
||||||
|
:option:`--interface` is used, this option will be ignored.
|
||||||
|
Possible Values: interface, IP address, hostname
|
||||||
|
|
||||||
.. option:: --log-level=<LEVEL>
|
.. option:: --log-level=<LEVEL>
|
||||||
|
|
||||||
Set log level to output.
|
Set log level to output.
|
||||||
|
@ -1579,12 +1624,12 @@ treated as a separate download. Both Metalink4 and Metalink version
|
||||||
3.0 are supported.
|
3.0 are supported.
|
||||||
|
|
||||||
You can specify both torrent file with -T option and URIs. By doing
|
You can specify both torrent file with -T option and URIs. By doing
|
||||||
this, you can download a file from both torrent swarm and HTTP(S)/FTP
|
this, you can download a file from both torrent swarm and
|
||||||
server at the same time, while the data from HTTP(S)/FTP are uploaded
|
HTTP(S)/FTP/SFTP server at the same time, while the data from
|
||||||
to the torrent swarm. For single file torrents, URI can be a complete
|
HTTP(S)/FTP/SFTP are uploaded to the torrent swarm. For single file
|
||||||
URI pointing to the resource or if URI ends with /, name in torrent
|
torrents, URI can be a complete URI pointing to the resource or if URI
|
||||||
file in torrent is added. For multi-file torrents, name and path are
|
ends with /, name in torrent file in torrent is added. For multi-file
|
||||||
added to form a URI for each file.
|
torrents, name and path are added to form a URI for each file.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
|
@ -1615,15 +1660,14 @@ occurred. Currently following options are available:
|
||||||
|
|
||||||
aria2 passes 3 arguments to specified command when it is executed.
|
aria2 passes 3 arguments to specified command when it is executed.
|
||||||
These arguments are: GID, the number of files and file path. For
|
These arguments are: GID, the number of files and file path. For
|
||||||
HTTP, FTP downloads, usually the number of files is 1. BitTorrent
|
HTTP, FTP, and SFTP downloads, usually the number of files is 1.
|
||||||
download can contain multiple files.
|
BitTorrent download can contain multiple files. If number of files is
|
||||||
If number of files is more than one, file path is first one. In
|
more than one, file path is first one. In other words, this is the
|
||||||
other words, this is the value of path key of first struct whose
|
value of path key of first struct whose selected key is true in the
|
||||||
selected key is true in the response of :func:`aria2.getFiles`
|
response of :func:`aria2.getFiles` RPC method. If you want to get all
|
||||||
RPC method.
|
file paths, consider to use JSON-RPC/XML-RPC. Please note that file
|
||||||
If you want to get all file paths, consider to use JSON-RPC/XML-RPC. Please
|
path may change during download in HTTP because of redirection or
|
||||||
note that file path may change during download in HTTP because of
|
Content-Disposition header.
|
||||||
redirection or Content-Disposition header.
|
|
||||||
|
|
||||||
Let's see an example of how arguments are passed to command:
|
Let's see an example of how arguments are passed to command:
|
||||||
|
|
||||||
|
@ -1746,6 +1790,12 @@ based on the last error encountered.
|
||||||
30
|
30
|
||||||
If aria2 could not parse JSON-RPC request.
|
If aria2 could not parse JSON-RPC request.
|
||||||
|
|
||||||
|
31
|
||||||
|
Reserved. Not used.
|
||||||
|
|
||||||
|
32
|
||||||
|
If checksum validation failed.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
An error occurred in a finished download will not be reported
|
An error occurred in a finished download will not be reported
|
||||||
|
@ -1792,10 +1842,12 @@ FILES
|
||||||
aria2.conf
|
aria2.conf
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
|
|
||||||
By default, aria2 parses ``$HOME/.aria2/aria2.conf`` as a
|
By default, aria2 checks whether the legacy path
|
||||||
configuration file. You can specify the path to configuration file
|
``$HOME/.aria2/aria2.conf`` is present, otherwise it parses
|
||||||
using :option:`--conf-path` option. If you don't want to use the
|
``$XDG_CONFIG_HOME/aria2/aria2.conf`` as its configuration file. You
|
||||||
configuration file, use :option:`--no-conf` option.
|
can specify the path to configuration file using :option:`--conf-path`
|
||||||
|
option. If you don't want to use the configuration file, use
|
||||||
|
:option:`--no-conf` option.
|
||||||
|
|
||||||
The configuration file is a text file and has 1 option per each
|
The configuration file is a text file and has 1 option per each
|
||||||
line. In each line, you can specify name-value pair in the format:
|
line. In each line, you can specify name-value pair in the format:
|
||||||
|
@ -1820,16 +1872,18 @@ lines beginning ``#`` are treated as comments::
|
||||||
dht.dat
|
dht.dat
|
||||||
~~~~~~~~
|
~~~~~~~~
|
||||||
|
|
||||||
By default, the routing table of IPv4 DHT is saved to the path
|
Unless the legacy file paths ``$HOME/.aria2/dht.dat`` and
|
||||||
``$HOME/.aria2/dht.dat`` and the routing table of IPv6 DHT is saved to
|
``$HOME/.aria2/dht6.dat`` are pointing to existing files, the routing
|
||||||
the path ``$HOME/.aria2/dht6.dat``.
|
table of IPv4 DHT is saved to the path
|
||||||
|
``$XDG_CACHE_HOME/aria2/dht.dat`` and the routing table of IPv6 DHT is
|
||||||
|
saved to the path ``$XDG_CACHE_HOME/aria2/dht6.dat``.
|
||||||
|
|
||||||
Netrc
|
Netrc
|
||||||
~~~~~
|
~~~~~
|
||||||
|
|
||||||
Netrc support is enabled by default for HTTP(S)/FTP. To disable netrc
|
Netrc support is enabled by default for HTTP(S)/FTP/SFTP. To disable
|
||||||
support, specify :option:`--no-netrc <-n>` option. Your .netrc file should have correct
|
netrc support, specify :option:`--no-netrc <-n>` option. Your .netrc
|
||||||
permissions(600).
|
file should have correct permissions(600).
|
||||||
|
|
||||||
If machine name starts ``.``, aria2 performs domain-match instead of
|
If machine name starts ``.``, aria2 performs domain-match instead of
|
||||||
exact match. This is an extension of aria2. For example of domain
|
exact match. This is an extension of aria2. For example of domain
|
||||||
|
@ -1992,6 +2046,7 @@ of URIs. These optional lines must start with white space(s).
|
||||||
* :option:`seed-time <--seed-time>`
|
* :option:`seed-time <--seed-time>`
|
||||||
* :option:`select-file <--select-file>`
|
* :option:`select-file <--select-file>`
|
||||||
* :option:`split <-s>`
|
* :option:`split <-s>`
|
||||||
|
* :option:`ssh-host-key-md <--ssh-host-key-md>`
|
||||||
* :option:`stream-piece-selector <--stream-piece-selector>`
|
* :option:`stream-piece-selector <--stream-piece-selector>`
|
||||||
* :option:`timeout <-t>`
|
* :option:`timeout <-t>`
|
||||||
* :option:`uri-selector <--uri-selector>`
|
* :option:`uri-selector <--uri-selector>`
|
||||||
|
@ -2156,19 +2211,19 @@ For information on the *secret* parameter, see :ref:`rpc_auth`.
|
||||||
|
|
||||||
.. function:: aria2.addUri([secret], uris[, options[, position]])
|
.. function:: aria2.addUri([secret], uris[, options[, position]])
|
||||||
|
|
||||||
This method adds a new download. *uris* is an array of HTTP/FTP/BitTorrent
|
This method adds a new download. *uris* is an array of
|
||||||
URIs (strings) pointing to the same resource. If you mix URIs pointing to
|
HTTP/FTP/SFTP/BitTorrent URIs (strings) pointing to the same
|
||||||
different resources, then the download may fail or be corrupted without aria2
|
resource. If you mix URIs pointing to different resources, then the
|
||||||
complaining.
|
download may fail or be corrupted without aria2 complaining. When
|
||||||
When adding BitTorrent Magnet URIs, *uris* must have only one element and it
|
adding BitTorrent Magnet URIs, *uris* must have only one element and
|
||||||
should be BitTorrent Magnet URI.
|
it should be BitTorrent Magnet URI. *options* is a struct and its
|
||||||
*options* is a struct and its members are pairs of option name and value.
|
members are pairs of option name and value. See :ref:`rpc_options`
|
||||||
See :ref:`rpc_options` below for more details.
|
below for more details. If *position* is given, it must be an
|
||||||
If *position* is given, it must be an integer starting from 0. The new
|
integer starting from 0. The new download will be inserted at
|
||||||
download will be inserted at *position* in the waiting queue. If
|
*position* in the waiting queue. If *position* is omitted or
|
||||||
*position* is omitted or *position* is larger than the current size of the
|
*position* is larger than the current size of the queue, the new
|
||||||
queue, the new download is appended to the end of the queue.
|
download is appended to the end of the queue. This method returns
|
||||||
This method returns the GID of the newly registered download.
|
the GID of the newly registered download.
|
||||||
|
|
||||||
**JSON-RPC Example**
|
**JSON-RPC Example**
|
||||||
|
|
||||||
|
@ -2775,9 +2830,9 @@ For information on the *secret* parameter, see :ref:`rpc_auth`.
|
||||||
|
|
||||||
.. function:: aria2.getServers([secret], gid)
|
.. function:: aria2.getServers([secret], gid)
|
||||||
|
|
||||||
This method returns currently connected HTTP(S)/FTP servers of the download
|
This method returns currently connected HTTP(S)/FTP/SFTP servers of
|
||||||
denoted by *gid* (string). The response is an array of structs and contains
|
the download denoted by *gid* (string). The response is an array of
|
||||||
the following keys. Values are strings.
|
structs and contains the following keys. Values are strings.
|
||||||
|
|
||||||
``index``
|
``index``
|
||||||
Index of the file, starting at 1, in the same order as files appear in the
|
Index of the file, starting at 1, in the same order as files appear in the
|
||||||
|
@ -4107,7 +4162,7 @@ The Metalink Download Description Format: :rfc:`5854`
|
||||||
|
|
||||||
COPYRIGHT
|
COPYRIGHT
|
||||||
---------
|
---------
|
||||||
Copyright (C) 2006, 2014 Tatsuhiro Tsujikawa
|
Copyright (C) 2006, 2015 Tatsuhiro Tsujikawa
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
# files in the program, then also delete it here.
|
# files in the program, then also delete it here.
|
||||||
#
|
#
|
||||||
# Generates API reference from C++ source code.
|
# Generates API reference from C++ source code.
|
||||||
|
from __future__ import print_function
|
||||||
import re, sys, argparse
|
import re, sys, argparse
|
||||||
|
|
||||||
class FunctionDoc:
|
class FunctionDoc:
|
||||||
|
@ -41,10 +42,10 @@ class FunctionDoc:
|
||||||
self.domain = domain
|
self.domain = domain
|
||||||
|
|
||||||
def write(self, out):
|
def write(self, out):
|
||||||
print '''.. {}:: {}'''.format(self.domain, self.name)
|
print('''.. {}:: {}'''.format(self.domain, self.name))
|
||||||
print ''
|
print()
|
||||||
for line in self.content:
|
for line in self.content:
|
||||||
print ' {}'.format(line)
|
print(' {}'.format(line))
|
||||||
|
|
||||||
class TypedefDoc:
|
class TypedefDoc:
|
||||||
def __init__(self, name, content):
|
def __init__(self, name, content):
|
||||||
|
@ -52,10 +53,10 @@ class TypedefDoc:
|
||||||
self.content = content
|
self.content = content
|
||||||
|
|
||||||
def write(self, out):
|
def write(self, out):
|
||||||
print '''.. type:: {}'''.format(self.name)
|
print('''.. type:: {}'''.format(self.name))
|
||||||
print ''
|
print()
|
||||||
for line in self.content:
|
for line in self.content:
|
||||||
print ' {}'.format(line)
|
print(' {}'.format(line))
|
||||||
|
|
||||||
class StructDoc:
|
class StructDoc:
|
||||||
def __init__(self, name, content, domain, members, member_domain):
|
def __init__(self, name, content, domain, members, member_domain):
|
||||||
|
@ -67,19 +68,40 @@ class StructDoc:
|
||||||
|
|
||||||
def write(self, out):
|
def write(self, out):
|
||||||
if self.name:
|
if self.name:
|
||||||
print '''.. {}:: {}'''.format(self.domain, self.name)
|
print('''.. {}:: {}'''.format(self.domain, self.name))
|
||||||
print ''
|
print()
|
||||||
for line in self.content:
|
for line in self.content:
|
||||||
print ' {}'.format(line)
|
print(' {}'.format(line))
|
||||||
print ''
|
print()
|
||||||
for name, content in self.members:
|
for name, content in self.members:
|
||||||
print ''' .. {}:: {}'''.format(\
|
name = name.strip()
|
||||||
'function' if name.endswith(')') else self.member_domain,
|
# For function (e.g., int foo())
|
||||||
name)
|
m = re.match(r'(.+)\s+([^ ]+\(.*)', name)
|
||||||
print ''
|
if not m:
|
||||||
|
# For variable (e.g., bool a)
|
||||||
|
m = re.match(r'(.+)\s+([^ ]+)', name)
|
||||||
|
if m:
|
||||||
|
print(''' .. {}:: {} {}::{}'''.format(
|
||||||
|
'function' if name.endswith(')') else self.member_domain,
|
||||||
|
m.group(1),
|
||||||
|
self.name,
|
||||||
|
m.group(2)))
|
||||||
|
else:
|
||||||
|
if name.endswith(')'):
|
||||||
|
# For function, without return type, like
|
||||||
|
# constructor
|
||||||
|
print(''' .. {}:: {}::{}'''.format(
|
||||||
|
'function' if name.endswith(')') else self.member_domain,
|
||||||
|
self.name, name))
|
||||||
|
else:
|
||||||
|
# enum
|
||||||
|
print(''' .. {}:: {}'''.format(
|
||||||
|
'function' if name.endswith(')') else self.member_domain,
|
||||||
|
name))
|
||||||
|
print()
|
||||||
for line in content:
|
for line in content:
|
||||||
print ''' {}'''.format(line)
|
print(''' {}'''.format(line))
|
||||||
print ''
|
print()
|
||||||
|
|
||||||
class MacroDoc:
|
class MacroDoc:
|
||||||
def __init__(self, name, content):
|
def __init__(self, name, content):
|
||||||
|
@ -87,10 +109,10 @@ class MacroDoc:
|
||||||
self.content = content
|
self.content = content
|
||||||
|
|
||||||
def write(self, out):
|
def write(self, out):
|
||||||
print '''.. macro:: {}'''.format(self.name)
|
print('''.. macro:: {}'''.format(self.name))
|
||||||
print ''
|
print()
|
||||||
for line in self.content:
|
for line in self.content:
|
||||||
print ' {}'.format(line)
|
print(' {}'.format(line))
|
||||||
|
|
||||||
def make_api_ref(infiles):
|
def make_api_ref(infiles):
|
||||||
macros = []
|
macros = []
|
||||||
|
@ -124,12 +146,12 @@ def make_api_ref(infiles):
|
||||||
for title, docs in alldocs:
|
for title, docs in alldocs:
|
||||||
if not docs:
|
if not docs:
|
||||||
continue
|
continue
|
||||||
print title
|
print(title)
|
||||||
print '-'*len(title)
|
print('-'*len(title))
|
||||||
for doc in docs:
|
for doc in docs:
|
||||||
doc.write(sys.stdout)
|
doc.write(sys.stdout)
|
||||||
print ''
|
print()
|
||||||
print ''
|
print()
|
||||||
|
|
||||||
def process_macro(infile):
|
def process_macro(infile):
|
||||||
content = read_content(infile)
|
content = read_content(infile)
|
||||||
|
@ -263,6 +285,6 @@ if __name__ == '__main__':
|
||||||
help='source file')
|
help='source file')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
if args.header:
|
if args.header:
|
||||||
print args.header.read()
|
print(args.header.read())
|
||||||
for infile in args.files:
|
for infile in args.files:
|
||||||
make_api_ref(args.files)
|
make_api_ref(args.files)
|
||||||
|
|
|
@ -96,8 +96,10 @@ times.
|
||||||
DHT routing table file format
|
DHT routing table file format
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
aria2 saves IPv4 DHT routing table in ``${HOME}/.aria2/dht.dat`` and
|
aria2 saves IPv4 DHT routing table in
|
||||||
IPv6 DHT routing table in ``${HOME}/.aria2/dht6.dat`` by default.
|
``${XDG_CACHE_HOME}/aria2/dht.dat`` and IPv6 DHT routing table in
|
||||||
|
``${XDG_CACHE_HOME}/aria2/dht6.dat`` by default unless
|
||||||
|
``${HOME}/.aria2/dht.dat`` and ``${HOME}/.aria2/dht.dat`` are present.
|
||||||
|
|
||||||
``dht.dat`` and ``dht6.dat`` files use same binary encoding and have
|
``dht.dat`` and ``dht6.dat`` files use same binary encoding and have
|
||||||
following fields. All multi byte integers are in network byte
|
following fields. All multi byte integers are in network byte
|
||||||
|
|
|
@ -16,6 +16,12 @@ SINOPSE
|
||||||
DESCRIÇÃO
|
DESCRIÇÃO
|
||||||
---------
|
---------
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
|
||||||
|
This translation has been outdated quite sometime now, and lacks
|
||||||
|
many recent changes. Please consult English version manual for
|
||||||
|
updated information.
|
||||||
|
|
||||||
Observação: Para executar o aria2 em um terminal ou no prompt da
|
Observação: Para executar o aria2 em um terminal ou no prompt da
|
||||||
linha de comando do windows, utilize o comando aria2c.
|
linha de comando do windows, utilize o comando aria2c.
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,12 @@
|
||||||
Manual Aria2
|
Manual Aria2
|
||||||
============
|
============
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
|
||||||
|
This translation has been outdated quite sometime now, and lacks
|
||||||
|
many recent changes. Please consult English version manual for
|
||||||
|
updated information.
|
||||||
|
|
||||||
aria2 é um utilitário para download de arquivos, que utiliza protocolos HTTP,
|
aria2 é um utilitário para download de arquivos, que utiliza protocolos HTTP,
|
||||||
HTTPS, FTP, BitTorrent e Metalink. Pode efetuar download de um ou vários
|
HTTPS, FTP, BitTorrent e Metalink. Pode efetuar download de um ou vários
|
||||||
arquivos, a partir de uma ou múltiplas fontes e protocolos, com ou sem
|
arquivos, a partir de uma ou múltiplas fontes e protocolos, com ou sem
|
||||||
|
|
|
@ -126,6 +126,7 @@ text:
|
||||||
|
|
||||||
man:
|
man:
|
||||||
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
||||||
|
sed -i -e '1i .\\" -*- mode: troff; coding: utf-8 -*-' $(BUILDDIR)/man/aria2c.1
|
||||||
@echo
|
@echo
|
||||||
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
||||||
|
|
||||||
|
|
|
@ -9,17 +9,22 @@ aria2c(1)
|
||||||
--------
|
--------
|
||||||
|
|
||||||
aria2 - это утилита для загрузки файлов. Поддерживаемые протоколы: HTTP(S),
|
aria2 - это утилита для загрузки файлов. Поддерживаемые протоколы: HTTP(S),
|
||||||
FTP, BitTorrent и Metalink. aria2 может загрузить файл с разных
|
FTP, SFTP, BitTorrent и Metalink. aria2 может загрузить файл с разных
|
||||||
источников/протоколов и пытается максимально использовать пропускную
|
источников/протоколов и пытается максимально использовать пропускную
|
||||||
способность канала. Есть поддержка загрузки файла по протоколам HTTP(S)/FTP
|
способность канала. Есть поддержка загрузки файла по протоколам
|
||||||
и BitTorrent одновременно, пока данные загружаются по HTTP(S)/FTP, они тут
|
HTTP(S)/FTP/SFTP и BitTorrent одновременно, пока данные загружаются по
|
||||||
же могут выгружаться в BitTorrent-рой. Используя контрольные суммы блока
|
HTTP(S)/FTP, они тут же могут выгружаться в BitTorrent-рой. Используя
|
||||||
данных для Metalink, aria2 автоматически проверяет части данных во время
|
контрольные суммы блока данных для Metalink, aria2 автоматически проверяет
|
||||||
загрузки файла.
|
части данных во время загрузки файла.
|
||||||
|
|
||||||
ПАРАМЕТРЫ
|
ПАРАМЕТРЫ
|
||||||
---------
|
---------
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Большинство связанных с FTP параметров применимы также к SFTP.
|
||||||
|
Некоторые параметры не являются эффективными по отношению к SFTP (например, :option:`--ftp-pasv`)
|
||||||
|
|
||||||
Основные параметры
|
Основные параметры
|
||||||
~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~
|
||||||
.. option:: -d, --dir=<DIR>
|
.. option:: -d, --dir=<DIR>
|
||||||
|
@ -89,8 +94,9 @@ FTP, BitTorrent и Metalink. aria2 может загрузить файл с р
|
||||||
``#deprecated``, ``#help``, ``#all``.
|
``#deprecated``, ``#help``, ``#all``.
|
||||||
По умолчанию: ``#basic``
|
По умолчанию: ``#basic``
|
||||||
|
|
||||||
Параметры HTTP/FTP
|
Параметры HTTP/FTP/SFTP
|
||||||
~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. option:: --all-proxy=<PROXY>
|
.. option:: --all-proxy=<PROXY>
|
||||||
|
|
||||||
Использовать указанный прокси-сервер для всех протоколов. Для отмены
|
Использовать указанный прокси-сервер для всех протоколов. Для отмены
|
||||||
|
@ -197,6 +203,17 @@ FTP, BitTorrent и Metalink. aria2 может загрузить файл с р
|
||||||
``1M`` -``1024M``.
|
``1M`` -``1024M``.
|
||||||
По умолчанию: ``20M``
|
По умолчанию: ``20M``
|
||||||
|
|
||||||
|
|
||||||
|
.. option:: --netrc-path=<FILE>
|
||||||
|
|
||||||
|
Указать путь к файлу .netrc.
|
||||||
|
По умолчанию: ``$(HOME)/.netrc``
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Права доступа к файлу .netrc должны быть равны 600. Иначе, файл
|
||||||
|
будет проигнорирован.
|
||||||
|
|
||||||
.. option:: -n, --no-netrc[=true|false]
|
.. option:: -n, --no-netrc[=true|false]
|
||||||
|
|
||||||
Отключить поддержку netrc. Поддержка netrc по умолчанию
|
Отключить поддержку netrc. Поддержка netrc по умолчанию
|
||||||
|
@ -544,8 +561,8 @@ FTP, BitTorrent и Metalink. aria2 может загрузить файл с р
|
||||||
Задать клиентское приложение для HTTP(S)-загрузок.
|
Задать клиентское приложение для HTTP(S)-загрузок.
|
||||||
По умолчанию: ``aria2/$VERSION``, $VERSION заменяется на версию пакета.
|
По умолчанию: ``aria2/$VERSION``, $VERSION заменяется на версию пакета.
|
||||||
|
|
||||||
Специфические параметры FTP
|
Специфические параметры FTP/SFTP
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
.. option:: --ftp-user=<USER>
|
.. option:: --ftp-user=<USER>
|
||||||
|
|
||||||
Задать пользователя для FTP.
|
Задать пользователя для FTP.
|
||||||
|
@ -566,6 +583,10 @@ FTP, BitTorrent и Metalink. aria2 может загрузить файл с р
|
||||||
то будет использован активный режим.
|
то будет использован активный режим.
|
||||||
По умолчанию: ``true``
|
По умолчанию: ``true``
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Этот параметр игнорируется для SFTP-передачи.
|
||||||
|
|
||||||
.. option:: --ftp-proxy=<PROXY>
|
.. option:: --ftp-proxy=<PROXY>
|
||||||
|
|
||||||
Использовать указанный прокси-сервер для FTP. Для отмены
|
Использовать указанный прокси-сервер для FTP. Для отмены
|
||||||
|
@ -587,11 +608,25 @@ FTP, BitTorrent и Metalink. aria2 может загрузить файл с р
|
||||||
двух: ``binary`` или ``ascii``.
|
двух: ``binary`` или ``ascii``.
|
||||||
По умолчанию: ``binary``
|
По умолчанию: ``binary``
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Этот параметр игнорируется для SFTP-передачи.
|
||||||
|
|
||||||
.. option:: --ftp-reuse-connection[=true|false]
|
.. option:: --ftp-reuse-connection[=true|false]
|
||||||
|
|
||||||
Повторно использовать FTP соединение.
|
Повторно использовать FTP соединение.
|
||||||
По умолчанию: ``true``
|
По умолчанию: ``true``
|
||||||
|
|
||||||
|
.. option:: --ssh-host-key-md=<TYPE>=<DIGEST>
|
||||||
|
|
||||||
|
Задать контрольную сумму для публичного SSH-ключа хоста. TYPE - тип хэша.
|
||||||
|
Поддерживаемые типы хэшей - ``sha-1`` или ``md5``.
|
||||||
|
DIGEST - шестнадцатеричное значение хэша.
|
||||||
|
Например: ``sha-1=b030503d4de4539dc7885e6f0f5e256704edf4c3``.
|
||||||
|
Этот параметр может быть использован для проверки публичного ключа сервера
|
||||||
|
при использовании SFTP. Если параметр не задан (по умолчанию), то никакой
|
||||||
|
проверки не происходит.
|
||||||
|
|
||||||
Параметры BitTorrent/Metalink
|
Параметры BitTorrent/Metalink
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
.. option:: --select-file=<INDEX>...
|
.. option:: --select-file=<INDEX>...
|
||||||
|
@ -812,13 +847,15 @@ FTP, BitTorrent и Metalink. aria2 может загрузить файл с р
|
||||||
|
|
||||||
.. option:: --dht-file-path=<PATH>
|
.. option:: --dht-file-path=<PATH>
|
||||||
|
|
||||||
Заменять файл таблицы маршрутизации IPv4 DHT на PATH.
|
Сменить путь к файлу таблицы маршрутизации IPv4 DHT на PATH.
|
||||||
По умолчанию: ``$HOME/.aria2/dht.dat``
|
По умолчанию: ``$HOME/.aria2/dht.dat`` если существует,
|
||||||
|
иначе ``$XDG_CACHE_HOME/aria2/dht.dat``.
|
||||||
|
|
||||||
.. option:: --dht-file-path6=<PATH>
|
.. option:: --dht-file-path6=<PATH>
|
||||||
|
|
||||||
Заменять файл таблицы маршрутизации IPv6 DHT на PATH.
|
Сменить путь к файлу таблицы маршрутизации IPv6 DHT на PATH.
|
||||||
По умолчанию: ``$HOME/.aria2/dht.dat``
|
По умолчанию: ``$HOME/.aria2/dht6.dat`` если существует,
|
||||||
|
иначе ``$XDG_CACHE_HOME/aria2/dht6.dat``.
|
||||||
|
|
||||||
.. option:: --dht-listen-addr6=<ADDR>
|
.. option:: --dht-listen-addr6=<ADDR>
|
||||||
|
|
||||||
|
@ -1220,7 +1257,8 @@ FTP, BitTorrent и Metalink. aria2 может загрузить файл с р
|
||||||
.. option:: --conf-path=<PATH>
|
.. option:: --conf-path=<PATH>
|
||||||
|
|
||||||
Сменить путь к файлу конфигурации на PATH.
|
Сменить путь к файлу конфигурации на PATH.
|
||||||
По умолчанию: ``$HOME/.aria2/aria2.conf``
|
По умолчанию: ``$HOME/.aria2/aria2.conf`` если существует,
|
||||||
|
иначе ``$XDG_CACHE_HOME/aria2/aria2.conf``.
|
||||||
|
|
||||||
.. option:: --console-log-level=<LEVEL>
|
.. option:: --console-log-level=<LEVEL>
|
||||||
|
|
||||||
|
@ -1420,6 +1458,15 @@ FTP, BitTorrent и Metalink. aria2 может загрузить файл с р
|
||||||
Возможные значения: ``SSLv3``, ``TLSv1``, ``TLSv1.1``, ``TLSv1.2``
|
Возможные значения: ``SSLv3``, ``TLSv1``, ``TLSv1.1``, ``TLSv1.2``
|
||||||
По умолчанию: ``TLSv1``
|
По умолчанию: ``TLSv1``
|
||||||
|
|
||||||
|
.. option:: --multiple-interface=<INTERFACES>
|
||||||
|
|
||||||
|
Разделенный запятыми список интерфейсов для привязки сокетов.
|
||||||
|
Запросы будут разделяться между интерфейсами для достижения объединения
|
||||||
|
каналов. Вы можете указать имя интерфейса (например, eth0),
|
||||||
|
IP-адрес (например, 192.168.0.12) и имя хоста (например, myhost). Если
|
||||||
|
используется :option:`--interface`, то этот параметр будет проигнорирован.
|
||||||
|
Возможные значения: интерфейс, IP-адрес, имя хоста.
|
||||||
|
|
||||||
.. option:: --log-level=<LEVEL>
|
.. option:: --log-level=<LEVEL>
|
||||||
|
|
||||||
Задать уровень вывода журнала событий. LEVEL может
|
Задать уровень вывода журнала событий. LEVEL может
|
||||||
|
@ -1677,13 +1724,14 @@ Metalink-документов, которые хранятся на локаль
|
||||||
что они всегда будут обрабатываться как отдельная загрузка. Поддерживаются
|
что они всегда будут обрабатываться как отдельная загрузка. Поддерживаются
|
||||||
оба формата: Metalink4 и Metalink версии 3.0.
|
оба формата: Metalink4 и Metalink версии 3.0.
|
||||||
|
|
||||||
Вы можете указать вместе, torrent-файл с параметром -T и URI. Сделав это, вы
|
Вы можете указать вместе, torrent-файл с параметром :option:`--torrent-file
|
||||||
можете загружать файл, используя torrent-рой и HTTP(S)/FTP-сервер
|
<-T>` и URI. Сделав это, вы можете загружать файл, используя torrent-рой и
|
||||||
одновременно, пока данные из HTTP(S)/FTP выгружаются в torrent-рой. Для
|
HTTP(S)/FTP/SFTP-сервер одновременно, пока данные из HTTP(S)/FTP/SFTP
|
||||||
однофайловых торрентов, URI может быть завершенным, который указывает на
|
выгружаются в torrent-рой. Для однофайловых торрентов, URI может быть
|
||||||
ресурс, или же если заканчиваться символом /, тогда name (имя) в
|
завершенным, который указывает на ресурс, или же если заканчиваться символом
|
||||||
torrent-файле будет добавлено. Для многофайловых торрентов, name (имя) и
|
/, тогда name (имя) в torrent-файле будет добавлено. Для многофайловых
|
||||||
path (путь) в torrent-файле будут добавлены из URI для каждого файла.
|
торрентов, name (имя) и path (путь) в torrent-файле будут добавлены из URI
|
||||||
|
для каждого файла.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
|
@ -1715,15 +1763,16 @@ aria2 предоставляет параметры, в которых указ
|
||||||
:option:`--on-download-stop`.
|
:option:`--on-download-stop`.
|
||||||
|
|
||||||
aria2 передает 3 аргумента указанной команды, которая выполняется. Это
|
aria2 передает 3 аргумента указанной команды, которая выполняется. Это
|
||||||
аргументы: GID, количество файлов и путь к файлу. Для HTTP-, FTP-загрузок,
|
аргументы: GID, количество файлов и путь к файлу. Для HTTP-, FTP- и
|
||||||
обычно количество файлов - 1. BitTorrent загрузка может содержать множество
|
SFTP-загрузок, обычно количество файлов - 1. BitTorrent загрузка может
|
||||||
файлов. Если число файлов больше чем один, то путь к файлу будет для
|
содержать множество файлов. Если число файлов больше чем один, то путь к
|
||||||
первого. Другими словами, это значение параметра path в первой структуре,
|
файлу будет для первого. Другими словами, это значение параметра path в
|
||||||
определенный параметр которой имеет значение true (истина), в ответе
|
первой структуре, определенный параметр которой имеет значение true
|
||||||
RPC-метода :func:`aria2.getFiles`. Если вы хотите получить все пути к
|
(истина), в ответе RPC-метода :func:`aria2.getFiles`. Если вы хотите
|
||||||
файлам, то рассмотрите использование JSON-RPC/XML-RPC. Обратите внимание,
|
получить все пути к файлам, то рассмотрите использование
|
||||||
что путь к файлу может меняться в процессе загрузки по HTTP из-за
|
JSON-RPC/XML-RPC. Обратите внимание, что путь к файлу может меняться в
|
||||||
перенаправления или заголовка Content-Disposition.
|
процессе загрузки по HTTP из-за перенаправления или заголовка
|
||||||
|
Content-Disposition.
|
||||||
|
|
||||||
Посмотрите пример, как аргументы передаются команде:
|
Посмотрите пример, как аргументы передаются команде:
|
||||||
|
|
||||||
|
@ -1848,6 +1897,12 @@ RPC-метода :func:`aria2.getFiles`. Если вы хотите получи
|
||||||
30
|
30
|
||||||
Если aria2 не смогла проанализировать JSON-RPC-запрос.
|
Если aria2 не смогла проанализировать JSON-RPC-запрос.
|
||||||
|
|
||||||
|
31
|
||||||
|
Зарезервировано. Не используется.
|
||||||
|
|
||||||
|
32
|
||||||
|
Если проверка контрольной суммы не удалась.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
Ошибка, произошедшая в завершенной загрузке, не будет передана как код
|
Ошибка, произошедшая в завершенной загрузке, не будет передана как код
|
||||||
|
@ -1895,9 +1950,10 @@ aria2 распознает следующие переменные окруже
|
||||||
aria2.conf
|
aria2.conf
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
|
|
||||||
По умолчанию, aria2 анализирует ``$HOME/.aria2/aria2.conf`` как
|
По умолчанию, aria2 проверяет наличие ``$HOME/.aria2/aria2.conf`` по
|
||||||
конфигурационный файл. Вы можете указать путь к конфигурационному файлу в
|
устаревшему пути, иначе анализируется ``$XDG_CONFIG_HOME/aria2/aria2.conf``
|
||||||
параметре :option:`--conf-path`. Если вы не хотите использовать
|
как конфигурационный файл. Вы можете указать путь к конфигурационному файлу
|
||||||
|
в параметре :option:`--conf-path`. Если вы не хотите использовать
|
||||||
конфигурационный файл, используйте параметр :option:`--no-conf`.
|
конфигурационный файл, используйте параметр :option:`--no-conf`.
|
||||||
|
|
||||||
Конфигурационный файл - это текстовый файл, содержащий один параметр в
|
Конфигурационный файл - это текстовый файл, содержащий один параметр в
|
||||||
|
@ -1924,14 +1980,16 @@ aria2.conf
|
||||||
dht.dat
|
dht.dat
|
||||||
~~~~~~~
|
~~~~~~~
|
||||||
|
|
||||||
By default, the routing table of IPv4 DHT is saved to the path
|
Если устаревшие пути к файлам ``$HOME/.aria2/dht.dat`` и
|
||||||
``$HOME/.aria2/dht.dat`` and the routing table of IPv6 DHT is saved to the
|
``$HOME/.aria2/dht6.dat`` указывают на несуществующие файлы, то таблица
|
||||||
path ``$HOME/.aria2/dht6.dat``.
|
маршрутизации IPv4 DHT сохраняется в ``$XDG_CACHE_HOME/aria2/dht.dat``, а
|
||||||
|
таблица маршрутизации IPv6 DHT сохраняется в
|
||||||
|
``$XDG_CACHE_HOME/aria2/dht6.dat``.
|
||||||
|
|
||||||
Netrc
|
Netrc
|
||||||
~~~~~
|
~~~~~
|
||||||
|
|
||||||
Поддержка Netrc включена по умолчанию для HTTP(S)/FTP. Для отключения
|
Поддержка Netrc включена по умолчанию для HTTP(S)/FTP/SFTP. Для отключения
|
||||||
поддержки netrc, укажите параметр :option:`--no-netrc <-n>`. Ваш файл .netrc
|
поддержки netrc, укажите параметр :option:`--no-netrc <-n>`. Ваш файл .netrc
|
||||||
должен иметь соответствующие права (600).
|
должен иметь соответствующие права (600).
|
||||||
|
|
||||||
|
@ -2098,6 +2156,7 @@ URI. Эти дополнительные строки должны начина
|
||||||
* :option:`seed-time <--seed-time>`
|
* :option:`seed-time <--seed-time>`
|
||||||
* :option:`select-file <--select-file>`
|
* :option:`select-file <--select-file>`
|
||||||
* :option:`split <-s>`
|
* :option:`split <-s>`
|
||||||
|
* :option:`ssh-host-key-md <--ssh-host-key-md>`
|
||||||
* :option:`stream-piece-selector <--stream-piece-selector>`
|
* :option:`stream-piece-selector <--stream-piece-selector>`
|
||||||
* :option:`timeout <-t>`
|
* :option:`timeout <-t>`
|
||||||
* :option:`uri-selector <--uri-selector>`
|
* :option:`uri-selector <--uri-selector>`
|
||||||
|
@ -2263,7 +2322,7 @@ RPC-метод `system.multicall` обрабатывается особым об
|
||||||
.. function:: aria2.addUri([secret], uris[, options[, position]])
|
.. function:: aria2.addUri([secret], uris[, options[, position]])
|
||||||
|
|
||||||
Этот метод добавляет новую загрузку. Параметр *uris* - это массив
|
Этот метод добавляет новую загрузку. Параметр *uris* - это массив
|
||||||
HTTP(S)/FTP/BitTorrent Magnet URI (строки), указывающие на один и тот же
|
HTTP(S)/FTP/SFTP/BitTorrent Magnet URI (строки), указывающие на один и тот же
|
||||||
ресурс. Если вы смешивайте URI, указывающие на разные ресурсы, то загрузка
|
ресурс. Если вы смешивайте URI, указывающие на разные ресурсы, то загрузка
|
||||||
может неудачно завершиться или быть повреждена без жалоб со стороны aria2.
|
может неудачно завершиться или быть повреждена без жалоб со стороны aria2.
|
||||||
При добавлении BitTorrent Magnet URI, *uris* должен содержать только один
|
При добавлении BitTorrent Magnet URI, *uris* должен содержать только один
|
||||||
|
@ -2878,7 +2937,7 @@ RPC-метод `system.multicall` обрабатывается особым об
|
||||||
|
|
||||||
.. function:: aria2.getServers([secret], gid)
|
.. function:: aria2.getServers([secret], gid)
|
||||||
|
|
||||||
Этот метод возвращает текущие подключенные HTTP(S)/FTP-серверы загрузки,
|
Этот метод возвращает текущие подключенные HTTP(S)/FTP/SFTP-серверы загрузки,
|
||||||
которая обозначена *gid* (строка). Ответ - это массив структур, которые содержат
|
которая обозначена *gid* (строка). Ответ - это массив структур, которые содержат
|
||||||
следующие ключи. Значения являются строками.
|
следующие ключи. Значения являются строками.
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ From https://github.com/ryan-roemer/sphinx-bootstrap-theme.
|
||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
|
|
||||||
VERSION = (0, 1, 5)
|
VERSION = (0, 1, 8)
|
||||||
|
|
||||||
__version__ = ".".join(str(v) for v in VERSION)
|
__version__ = ".".join(str(v) for v in VERSION)
|
||||||
__version_full__ = __version__
|
__version_full__ = __version__
|
||||||
|
|
|
@ -1,15 +1,23 @@
|
||||||
<ul class="wy-breadcrumbs">
|
<div role="navigation" aria-label="breadcrumbs navigation">
|
||||||
<li><a href="{{ pathto(master_doc) }}">Docs</a> »</li>
|
<ul class="wy-breadcrumbs">
|
||||||
<li><a href="">{{ title }}</a></li>
|
<li><a href="{{ pathto(master_doc) }}">Docs</a> »</li>
|
||||||
<li class="wy-breadcrumbs-aside">
|
{% for doc in parents %}
|
||||||
{% if display_github %}
|
<li><a href="{{ doc.link|e }}">{{ doc.title }}</a> »</li>
|
||||||
<a href="https://github.com/{{ github_user }}/{{ github_repo }}/blob/{{ github_version }}{{ conf_py_path }}{{ pagename }}.rst" class="icon icon-github"> Edit on GitHub</a>
|
{% endfor %}
|
||||||
{% elif display_bitbucket %}
|
<li>{{ title }}</li>
|
||||||
<a href="https://bitbucket.org/{{ bitbucket_user }}/{{ bitbucket_repo }}/src/{{ bitbucket_version}}{{ conf_py_path }}{{ pagename }}.rst'" class="icon icon-bitbucket"> Edit on Bitbucket</a>
|
<li class="wy-breadcrumbs-aside">
|
||||||
{% elif show_source and has_source and sourcename %}
|
{% if pagename != "search" %}
|
||||||
<a href="{{ pathto('_sources/' + sourcename, true)|e }}" rel="nofollow"> View page source</a>
|
{% if display_github %}
|
||||||
{% endif %}
|
<a href="https://{{ github_host|default("github.com") }}/{{ github_user }}/{{ github_repo }}/blob/{{ github_version }}{{ conf_py_path }}{{ pagename }}{{ source_suffix }}" class="fa fa-github"> Edit on GitHub</a>
|
||||||
</li>
|
{% elif display_bitbucket %}
|
||||||
</ul>
|
<a href="https://bitbucket.org/{{ bitbucket_user }}/{{ bitbucket_repo }}/src/{{ bitbucket_version}}{{ conf_py_path }}{{ pagename }}{{ source_suffix }}" class="fa fa-bitbucket"> Edit on Bitbucket</a>
|
||||||
<hr/>
|
{% elif show_source and source_url_prefix %}
|
||||||
|
<a href="{{ source_url_prefix }}{{ pagename }}{{ source_suffix }}">View page source</a>
|
||||||
|
{% elif show_source and has_source and sourcename %}
|
||||||
|
<a href="{{ pathto('_sources/' + sourcename, true)|e }}" rel="nofollow"> View page source</a>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<hr/>
|
||||||
|
</div>
|
||||||
|
|
|
@ -1,30 +1,36 @@
|
||||||
<footer>
|
<footer>
|
||||||
{% if next or prev %}
|
{% if next or prev %}
|
||||||
<div class="rst-footer-buttons">
|
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
|
||||||
{% if next %}
|
{% if next %}
|
||||||
<a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}"/>Next <span class="icon icon-circle-arrow-right"></span></a>
|
<a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}" accesskey="n">Next <span class="fa fa-arrow-circle-right"></span></a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if prev %}
|
{% if prev %}
|
||||||
<a href="{{ prev.link|e }}" class="btn btn-neutral" title="{{ prev.title|striptags|e }}"><span class="icon icon-circle-arrow-left"></span> Previous</a>
|
<a href="{{ prev.link|e }}" class="btn btn-neutral" title="{{ prev.title|striptags|e }}" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<hr/>
|
<hr/>
|
||||||
|
|
||||||
<p>
|
<div role="contentinfo">
|
||||||
{%- if show_copyright %}
|
<p>
|
||||||
{%- if hasdoc('copyright') %}
|
{%- if show_copyright %}
|
||||||
{% trans path=pathto('copyright'), copyright=copyright|e %}© <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
|
{%- if hasdoc('copyright') %}
|
||||||
{%- else %}
|
{% trans path=pathto('copyright'), copyright=copyright|e %}© <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
|
||||||
{% trans copyright=copyright|e %}© Copyright {{ copyright }}.{% endtrans %}
|
{%- else %}
|
||||||
|
{% trans copyright=copyright|e %}© Copyright {{ copyright }}.{% endtrans %}
|
||||||
|
{%- endif %}
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
|
||||||
|
{%- if last_updated %}
|
||||||
|
{% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
|
||||||
|
{%- endif %}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{%- if show_sphinx %}
|
||||||
|
{% trans %}Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>{% endtrans %}.
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
|
||||||
{%- if last_updated %}
|
|
||||||
{% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
|
|
||||||
{%- endif %}
|
|
||||||
</p>
|
|
||||||
|
|
||||||
{% trans %}<a href="https://www.github.com/snide/sphinx_rtd_theme">Sphinx theme</a> provided by <a href="http://readthedocs.org">Read the Docs</a>{% endtrans %}
|
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
|
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
|
{{ metatags }}
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
{% block htmltitle %}
|
{% block htmltitle %}
|
||||||
<title>{{ title|striptags|e }}{{ titlesuffix }}</title>
|
<title>{{ title|striptags|e }}{{ titlesuffix }}</title>
|
||||||
|
@ -23,40 +24,28 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{# CSS #}
|
{# CSS #}
|
||||||
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
|
|
||||||
|
|
||||||
{# JS #}
|
{# OPENSEARCH #}
|
||||||
{% if not embedded %}
|
{% if not embedded %}
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
var DOCUMENTATION_OPTIONS = {
|
|
||||||
URL_ROOT:'{{ url_root }}',
|
|
||||||
VERSION:'{{ release|e }}',
|
|
||||||
COLLAPSE_INDEX:false,
|
|
||||||
FILE_SUFFIX:'{{ '' if no_search_suffix else file_suffix }}',
|
|
||||||
HAS_SOURCE: {{ has_source|lower }}
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
{%- for scriptfile in script_files %}
|
|
||||||
<script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
|
|
||||||
{%- endfor %}
|
|
||||||
|
|
||||||
{% if use_opensearch %}
|
{% if use_opensearch %}
|
||||||
<link rel="search" type="application/opensearchdescription+xml" title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}" href="{{ pathto('_static/opensearch.xml', 1) }}"/>
|
<link rel="search" type="application/opensearchdescription+xml" title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}" href="{{ pathto('_static/opensearch.xml', 1) }}"/>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{# RTD hosts these file themselves, so just load on non RTD builds #}
|
{# RTD hosts this file, so just load on non RTD builds #}
|
||||||
{% if not READTHEDOCS %}
|
{% if not READTHEDOCS %}
|
||||||
<link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
|
<link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
|
||||||
<script type="text/javascript" src="_static/js/theme.js"></script>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% for cssfile in css_files %}
|
{% for cssfile in css_files %}
|
||||||
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
|
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
|
{% for cssfile in extra_css_files %}
|
||||||
|
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
{%- block linktags %}
|
{%- block linktags %}
|
||||||
{%- if hasdoc('about') %}
|
{%- if hasdoc('about') %}
|
||||||
<link rel="author" title="{{ _('About these documents') }}"
|
<link rel="author" title="{{ _('About these documents') }}"
|
||||||
|
@ -85,29 +74,47 @@
|
||||||
{%- endblock %}
|
{%- endblock %}
|
||||||
{%- block extrahead %} {% endblock %}
|
{%- block extrahead %} {% endblock %}
|
||||||
|
|
||||||
<script src="//cdnjs.cloudflare.com/ajax/libs/modernizr/2.6.2/modernizr.min.js"></script>
|
{# Keep modernizr in head - http://modernizr.com/docs/#installing #}
|
||||||
|
<script src="_static/js/modernizr.min.js"></script>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="wy-body-for-nav">
|
<body class="wy-body-for-nav" role="document">
|
||||||
|
|
||||||
<div class="wy-grid-for-nav">
|
<div class="wy-grid-for-nav">
|
||||||
|
|
||||||
{# SIDE NAV, TOGGLES ON MOBILE #}
|
{# SIDE NAV, TOGGLES ON MOBILE #}
|
||||||
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
|
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
|
||||||
<div class="wy-side-nav-search">
|
<div class="wy-side-nav-search">
|
||||||
<a href="{{ pathto(master_doc) }}" class="icon icon-home"> {{ project }}</a>
|
{% block sidebartitle %}
|
||||||
|
|
||||||
|
{% if logo and theme_logo_only %}
|
||||||
|
<a href="{{ pathto(master_doc) }}">
|
||||||
|
{% else %}
|
||||||
|
<a href="{{ pathto(master_doc) }}" class="icon icon-home"> {{ project }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if logo %}
|
||||||
|
{# Not strictly valid HTML, but it's the only way to display/scale it properly, without weird scripting or heaps of work #}
|
||||||
|
<img src="{{ pathto('_static/' + logo, 1) }}" class="logo" />
|
||||||
|
{% endif %}
|
||||||
|
</a>
|
||||||
|
|
||||||
{% include "searchbox.html" %}
|
{% include "searchbox.html" %}
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="wy-menu wy-menu-vertical" data-spy="affix">
|
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
|
||||||
{% set toctree = toctree(maxdepth=2, collapse=False, includehidden=True) %}
|
{% block menu %}
|
||||||
{% if toctree %}
|
{% set toctree = toctree(maxdepth=4, collapse=False, includehidden=True) %}
|
||||||
{{ toctree }}
|
{% if toctree %}
|
||||||
{% else %}
|
{{ toctree }}
|
||||||
<!-- Local TOC -->
|
{% else %}
|
||||||
<div class="local-toc">{{ toc }}</div>
|
<!-- Local TOC -->
|
||||||
{% endif %}
|
<div class="local-toc">{{ toc }}</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</nav>
|
</nav>
|
||||||
|
@ -115,8 +122,8 @@
|
||||||
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
|
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
|
||||||
|
|
||||||
{# MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #}
|
{# MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #}
|
||||||
<nav class="wy-nav-top">
|
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
|
||||||
<i data-toggle="wy-nav-top" class="icon icon-reorder"></i>
|
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
|
||||||
<a href="{{ pathto(master_doc) }}">{{ project }}</a>
|
<a href="{{ pathto(master_doc) }}">{{ project }}</a>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
|
@ -125,7 +132,9 @@
|
||||||
<div class="wy-nav-content">
|
<div class="wy-nav-content">
|
||||||
<div class="rst-content">
|
<div class="rst-content">
|
||||||
{% include "breadcrumbs.html" %}
|
{% include "breadcrumbs.html" %}
|
||||||
{% block body %}{% endblock %}
|
<div role="main" class="document">
|
||||||
|
{% block body %}{% endblock %}
|
||||||
|
</div>
|
||||||
{% include "footer.html" %}
|
{% include "footer.html" %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -134,5 +143,39 @@
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
{% include "versions.html" %}
|
{% include "versions.html" %}
|
||||||
|
|
||||||
|
{% if not embedded %}
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
var DOCUMENTATION_OPTIONS = {
|
||||||
|
URL_ROOT:'{{ url_root }}',
|
||||||
|
VERSION:'{{ release|e }}',
|
||||||
|
COLLAPSE_INDEX:false,
|
||||||
|
FILE_SUFFIX:'{{ '' if no_search_suffix else file_suffix }}',
|
||||||
|
HAS_SOURCE: {{ has_source|lower }}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
{%- for scriptfile in script_files %}
|
||||||
|
<script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
|
||||||
|
{%- endfor %}
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{# RTD hosts this file, so just load on non RTD builds #}
|
||||||
|
{% if not READTHEDOCS %}
|
||||||
|
<script type="text/javascript" src="{{ pathto('_static/js/theme.js', 1) }}"></script>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{# STICKY NAVIGATION #}
|
||||||
|
{% if theme_sticky_navigation %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery(function () {
|
||||||
|
SphinxRtdTheme.StickyNav.enable();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{%- block footer %} {% endblock %}
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
{%- extends "layout.html" %}
|
{%- extends "layout.html" %}
|
||||||
{% set title = _('Search') %}
|
{% set title = _('Search') %}
|
||||||
{% set script_files = script_files + ['_static/searchtools.js'] %}
|
{% set script_files = script_files + ['_static/searchtools.js'] %}
|
||||||
{% block extrahead %}
|
{% block footer %}
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); });
|
jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); });
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
<form id ="rtd-search-form" class="wy-form" action="{{ pathto('search') }}" method="get">
|
{%- if builder != 'singlehtml' %}
|
||||||
<input type="text" name="q" placeholder="Search docs" />
|
<div role="search">
|
||||||
<input type="hidden" name="check_keywords" value="yes" />
|
<form id="rtd-search-form" class="wy-form" action="{{ pathto('search') }}" method="get">
|
||||||
<input type="hidden" name="area" value="default" />
|
<input type="text" name="q" placeholder="Search docs" />
|
||||||
</form>
|
<input type="hidden" name="check_keywords" value="yes" />
|
||||||
|
<input type="hidden" name="area" value="default" />
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
{%- endif %}
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
.font-smooth,.icon:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:fontawesome-webfont;font-weight:normal;font-style:normal;src:url("../font/fontawesome_webfont.eot");src:url("../font/fontawesome_webfont.eot?#iefix") format("embedded-opentype"),url("../font/fontawesome_webfont.woff") format("woff"),url("../font/fontawesome_webfont.ttf") format("truetype"),url("../font/fontawesome_webfont.svg#fontawesome-webfont") format("svg")}.icon:before{display:inline-block;font-family:fontawesome-webfont;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .icon{display:inline-block;text-decoration:inherit}li .icon{display:inline-block}li .icon-large:before,li .icon-large:before{width:1.875em}ul.icons{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.icons li .icon{width:0.8em}ul.icons li .icon-large:before,ul.icons li .icon-large:before{vertical-align:baseline}.icon-book:before{content:"\f02d"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}}
|
.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../font/fontawesome_webfont.eot");src:url("../font/fontawesome_webfont.eot?#iefix") format("embedded-opentype"),url("../font/fontawesome_webfont.woff") format("woff"),url("../font/fontawesome_webfont.ttf") format("truetype"),url("../font/fontawesome_webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:0.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}}
|
||||||
|
/*# sourceMappingURL=badge_only.css.map */
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"version": 3,
|
||||||
|
"mappings": "CAyDA,SAAY,EACV,qBAAsB,EAAE,UAAW,EAqDrC,QAAS,EARP,IAAK,EAAE,AAAC,EACR,+BAAS,EAEP,MAAO,EAAE,IAAK,EACd,MAAO,EAAE,CAAE,EACb,cAAO,EACL,IAAK,EAAE,GAAI,EC1Gb,SAkBC,EAjBC,UAAW,ECFJ,UAAW,EDGlB,UAAW,EAHqC,KAAM,EAItD,SAAU,EAJsD,KAAM,EAapE,EAAG,EAAE,qCAAwB,EAC7B,EAAG,EAAE,0PAAyE,ECZpF,SAAU,EACR,MAAO,EAAE,WAAY,EACrB,UAAW,EAAE,UAAW,EACxB,SAAU,EAAE,KAAM,EAClB,UAAW,EAAE,KAAM,EACnB,UAAW,EAAE,AAAC,EACd,cAAe,EAAE,MAAO,EAG1B,IAAK,EACH,MAAO,EAAE,WAAY,EACrB,cAAe,EAAE,MAAO,EAIxB,KAAG,EACD,MAAO,EAAE,WAAY,EACvB,sCAAiB,EAGf,IAAK,EAAE,MAAY,EAEvB,KAAM,EACJ,cAAe,EAAE,GAAI,EACrB,UAAW,EAAE,EAAG,EAChB,UAAW,EAAE,KAAM,EAEjB,YAAG,EACD,IAAK,EAAE,IAAI,EACb,oDAAiB,EAGf,aAAc,EAAE,OAAQ,EAG9B,cAAe,EACb,MAAO,EAAE,EAAO,EAElB,gBAAiB,EACf,MAAO,EAAE,EAAO,EAElB,oBAAqB,EACnB,MAAO,EAAE,EAAO,EAElB,sBAAuB,EACrB,MAAO,EAAE,EAAO,EAElB,kBAAmB,EACjB,MAAO,EAAE,EAAO,EAElB,oBAAqB,EACnB,MAAO,EAAE,EAAO,EAElB,oBAAqB,EACnB,MAAO,EAAE,EAAO,EAElB,sBAAuB,EACrB,MAAO,EAAE,EAAO,EAElB,qBAAsB,EACpB,MAAO,EAAE,EAAO,EAElB,uBAAwB,EACtB,MAAO,EAAE,EAAO,ECnElB,YAAa,EACX,OAAQ,EAAE,IAAK,EACf,KAAM,EAAE,AAAC,EACT,GAAI,EAAE,AAAC,EACP,IAAK,EC6E+B,IAAK,ED5EzC,IAAK,ECE+B,MAAyB,EDD7D,SAAU,EAAE,MAAkC,EAC9C,SAAU,EAAE,iBAAiC,EAC7C,UAAW,EEAyB,sDAAM,EFC1C,MAAO,EC+E6B,EAAG,ED9EvC,cAAC,EACC,IAAK,ECqE6B,MAAW,EDpE7C,cAAe,EAAE,GAAI,EACvB,6BAAgB,EACd,MAAO,EAAE,GAAI,EACf,iCAAoB,EAClB,MAAO,EAAE,GAAqB,EAC9B,eAAgB,EAAE,MAAkC,EACpD,MAAO,EAAE,IAAK,EACd,SAAU,EAAE,IAAK,EACjB,QAAS,EAAE,EAAG,EACd,KAAM,EAAE,MAAO,EACf,IAAK,ECiD6B,MAAM,EJgC1C,IAAK,EAAE,AAAC,EACR,iFAAS,EAEP,MAAO,EAAE,IAAK,EACd,MAAO,EAAE,CAAE,EACb,uCAAO,EACL,IAAK,EAAE,GAAI,EGrFX,qCAAG,EACD,IAAK,EClB2B,MAAyB,EDmB3D,0CAAQ,EACN,IAAK,EAAE,GAAI,EACb,4CAAU,EACR,IAAK,EAAE,GAAI,EACb,iDAAiB,EACf,eAAgB,ECQgB,MAAI,EDPpC,IAAK,EC0B2B,GAAM,EDzBxC,wDAAwB,EACtB,eAAgB,ECXgB,MAAO,EDYvC,IAAK,ECzB2B,GAAI,ED0BxC,yCAA8B,EAC5B,MAAO,EAAE,IAAK,EAChB,gCAAmB,EACjB,QAAS,EAAE,EAAG,EACd,MAAO,EAAE,GAAqB,EAC9B,IAAK,ECE6B,GAAwB,EDD1D,MAAO,EAAE,GAAI,EACb,mCAAE,EACA,MAAO,EAAE,IAAK,EACd,KAAM,EAAE,EAAG,EACX,KAAM,EAAE,AAAC,EACT,KAAM,EAAE,KAAM,EACd,MAAO,EAAE,AAAC,EACV,SAAU,EAAE,gBAA6C,EAC3D,mCAAE,EACA,MAAO,EAAE,WAAY,EACrB,KAAM,EAAE,AAAC,EACT,qCAAC,EACC,MAAO,EAAE,WAAY,EACrB,MAAO,EAAE,EAAqB,EAC9B,IAAK,ECjDyB,MAAyB,EDkD7D,sBAAW,EACT,IAAK,EAAE,GAAI,EACX,KAAM,EAAE,GAAI,EACZ,IAAK,EAAE,GAAI,EACX,GAAI,EAAE,GAAI,EACV,KAAM,EAAE,GAAI,EACZ,QAAS,ECkByB,IAAK,EDjBvC,iCAAU,EACR,IAAK,EAAE,GAAI,EACb,+BAAQ,EACN,IAAK,EAAE,GAAI,EACb,oDAA+B,EAC7B,SAAU,EAAE,IAAK,EACjB,6DAAQ,EACN,IAAK,EAAE,GAAI,EACb,+DAAU,EACR,IAAK,EAAE,GAAI,EACf,2CAAoB,EAClB,IAAK,EAAE,GAAI,EACX,KAAM,EAAE,GAAI,EACZ,UAAW,EAAE,GAAI,EACjB,MAAO,EAAE,IAAuB,EAChC,MAAO,EAAE,IAAK,EACd,SAAU,EAAE,KAAM,EGhDpB,mCAAsB,EHmDxB,YAAa,EACX,IAAK,EAAE,EAAG,EACV,MAAO,EAAE,GAAI,EACb,kBAAO,EACL,MAAO,EAAE,IAAK,EAClB,EAAG,EACD,IAAK,EAAE,GAAI,EACX,KAAM,EAAE,GAAI",
|
||||||
|
"sources": ["../../../bower_components/wyrm/sass/wyrm_core/_mixin.sass","../../../bower_components/bourbon/dist/css3/_font-face.scss","../../../sass/_theme_badge_fa.sass","../../../sass/_theme_badge.sass","../../../bower_components/wyrm/sass/wyrm_core/_wy_variables.sass","../../../sass/_theme_variables.sass","../../../bower_components/neat/app/assets/stylesheets/grid/_media.scss"],
|
||||||
|
"names": [],
|
||||||
|
"file": "badge_only.css"
|
||||||
|
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -280,8 +280,8 @@
|
||||||
<glyph unicode="" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
|
<glyph unicode="" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
|
||||||
<glyph unicode="" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
|
<glyph unicode="" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
|
||||||
<glyph unicode="" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
|
<glyph unicode="" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
|
||||||
<glyph unicode="" horiz-adv-x="1152" d="M896 608v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h224q14 0 23 -9t9 -23zM1024 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 -28 t-28 -68v-704q0 -40 28 -68t68 -28h704q40 0 68 28t28 68zM1152 928v-704q0 -92 -65.5 -158t-158.5 -66h-704q-93 0 -158.5 66t-65.5 158v704q0 93 65.5 158.5t158.5 65.5h704q93 0 158.5 -65.5t65.5 -158.5z" />
|
<glyph unicode="" horiz-adv-x="1792" />
|
||||||
<glyph unicode="" horiz-adv-x="1152" d="M928 1152q93 0 158.5 -65.5t65.5 -158.5v-704q0 -92 -65.5 -158t-158.5 -66h-704q-93 0 -158.5 66t-65.5 158v704q0 93 65.5 158.5t158.5 65.5h704zM1024 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 -28t-28 -68v-704q0 -40 28 -68t68 -28h704q40 0 68 28t28 68z M864 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576z" />
|
<glyph unicode="" horiz-adv-x="1792" />
|
||||||
<glyph unicode="" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
|
<glyph unicode="" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
|
||||||
<glyph unicode="" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
|
<glyph unicode="" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
|
||||||
<glyph unicode="" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
|
<glyph unicode="" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
|
||||||
|
@ -310,7 +310,7 @@
|
||||||
<glyph unicode="" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
|
<glyph unicode="" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
|
||||||
<glyph unicode="" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
|
<glyph unicode="" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
|
||||||
<glyph unicode="" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
|
<glyph unicode="" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
|
||||||
<glyph unicode="" horiz-adv-x="1792" d="M1708 881l-188 -881h-304l181 849q4 21 1 43q-4 20 -16 35q-10 14 -28 24q-18 9 -40 9h-197l-205 -960h-303l204 960h-304l-205 -960h-304l272 1280h1139q157 0 245 -118q86 -116 52 -281z" />
|
<glyph unicode="" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
|
||||||
<glyph unicode="" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
|
<glyph unicode="" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
|
||||||
<glyph unicode="" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
|
<glyph unicode="" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
|
||||||
<glyph unicode="" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
|
<glyph unicode="" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
|
||||||
|
@ -342,7 +342,7 @@
|
||||||
<glyph unicode="" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
|
<glyph unicode="" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
|
||||||
<glyph unicode="" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
|
<glyph unicode="" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
|
||||||
<glyph unicode="" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
|
<glyph unicode="" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
|
||||||
<glyph unicode="" horiz-adv-x="1664" d="M1664 352v-32q0 -132 -94 -226t-226 -94h-128q-132 0 -226 94t-94 226v480h-224q-2 -102 -14.5 -190.5t-30.5 -156t-48.5 -126.5t-57 -99.5t-67.5 -77.5t-69.5 -58.5t-74 -44t-69 -32t-65.5 -25.5q-4 -2 -32 -13q-8 -2 -12 -2q-22 0 -30 20l-71 178q-5 13 0 25t17 17 q7 3 20 7.5t18 6.5q31 12 46.5 18.5t44.5 20t45.5 26t42 32.5t40.5 42.5t34.5 53.5t30.5 68.5t22.5 83.5t17 103t6.5 123h-256q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h1216q14 0 23 -9t9 -23v-160q0 -14 -9 -23t-23 -9h-224v-512q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v64q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1280 1376v-160q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h960q14 0 23 -9t9 -23z" />
|
<glyph unicode="" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
|
||||||
<glyph unicode="" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
|
<glyph unicode="" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
|
||||||
<glyph unicode="" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
|
<glyph unicode="" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
|
||||||
<glyph unicode="" horiz-adv-x="1280" d="M1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
|
<glyph unicode="" horiz-adv-x="1280" d="M1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
|
||||||
|
@ -390,10 +390,25 @@
|
||||||
<glyph unicode="" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
|
<glyph unicode="" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
|
||||||
<glyph unicode="" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
|
<glyph unicode="" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
|
||||||
<glyph unicode="" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
|
<glyph unicode="" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
|
||||||
<glyph unicode="" horiz-adv-x="1920" d="M805 163q-122 -67 -261 -67q-141 0 -261 67q98 61 167 149t94 191q25 -103 94 -191t167 -149zM453 1176v-344q0 -179 -89.5 -326t-234.5 -217q-129 152 -129 351q0 200 129.5 352t323.5 184zM958 991q-128 -152 -128 -351q0 -201 128 -351q-145 70 -234.5 218t-89.5 328 v341q196 -33 324 -185zM1638 163q-122 -67 -261 -67q-141 0 -261 67q98 61 167 149t94 191q25 -103 94 -191t167 -149zM1286 1176v-344q0 -179 -91 -326t-237 -217v0q133 154 133 351q0 195 -133 351q129 151 328 185zM1920 640q0 -201 -129 -351q-145 70 -234.5 218 t-89.5 328v341q194 -32 323.5 -184t129.5 -352z" />
|
<glyph unicode="" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
|
||||||
<glyph unicode="" horiz-adv-x="1792" />
|
<glyph unicode="" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
|
||||||
<glyph unicode="" horiz-adv-x="1792" />
|
<glyph unicode="" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " />
|
||||||
<glyph unicode="" horiz-adv-x="1792" />
|
<glyph unicode="" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
|
||||||
|
<glyph unicode="" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
|
||||||
|
<glyph unicode="" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
|
||||||
|
<glyph unicode="" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
|
||||||
|
<glyph unicode="" d="M1254 899q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69 t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237 q104 139 172.5 292.5t82.5 226.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1792" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1792" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1792" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1792" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1792" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1792" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1792" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1792" />
|
||||||
<glyph unicode="" horiz-adv-x="1792" />
|
<glyph unicode="" horiz-adv-x="1792" />
|
||||||
</font>
|
</font>
|
||||||
</defs></svg>
|
</defs></svg>
|
Before Width: | Height: | Size: 193 KiB After Width: | Height: | Size: 197 KiB |
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
|
@ -1,16 +1,113 @@
|
||||||
$( document ).ready(function() {
|
function toggleCurrent (elem) {
|
||||||
// Shift nav in mobile when clicking the menu.
|
var parent_li = elem.closest('li');
|
||||||
$("[data-toggle='wy-nav-top']").click(function() {
|
parent_li.siblings('li.current').removeClass('current');
|
||||||
$("[data-toggle='wy-nav-shift']").toggleClass("shift");
|
parent_li.siblings().find('li.current').removeClass('current');
|
||||||
$("[data-toggle='rst-versions']").toggleClass("shift");
|
parent_li.find('> ul li.current').removeClass('current');
|
||||||
});
|
parent_li.toggleClass('current');
|
||||||
// Close menu when you click a link.
|
}
|
||||||
$(".wy-menu-vertical .current ul li a").click(function() {
|
|
||||||
$("[data-toggle='wy-nav-shift']").removeClass("shift");
|
$(document).ready(function() {
|
||||||
$("[data-toggle='rst-versions']").toggleClass("shift");
|
// Shift nav in mobile when clicking the menu.
|
||||||
});
|
$(document).on('click', "[data-toggle='wy-nav-top']", function() {
|
||||||
$("[data-toggle='rst-current-version']").click(function() {
|
$("[data-toggle='wy-nav-shift']").toggleClass("shift");
|
||||||
$("[data-toggle='rst-versions']").toggleClass("shift-up");
|
$("[data-toggle='rst-versions']").toggleClass("shift");
|
||||||
});
|
});
|
||||||
$("table.docutils:not(.field-list").wrap("<div class='wy-table-responsive'></div>");
|
// Nav menu link click operations
|
||||||
|
$(document).on('click', ".wy-menu-vertical .current ul li a", function() {
|
||||||
|
var target = $(this);
|
||||||
|
// Close menu when you click a link.
|
||||||
|
$("[data-toggle='wy-nav-shift']").removeClass("shift");
|
||||||
|
$("[data-toggle='rst-versions']").toggleClass("shift");
|
||||||
|
// Handle dynamic display of l3 and l4 nav lists
|
||||||
|
toggleCurrent(target);
|
||||||
|
if (typeof(window.SphinxRtdTheme) != 'undefined') {
|
||||||
|
window.SphinxRtdTheme.StickyNav.hashChange();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$(document).on('click', "[data-toggle='rst-current-version']", function() {
|
||||||
|
$("[data-toggle='rst-versions']").toggleClass("shift-up");
|
||||||
|
});
|
||||||
|
// Make tables responsive
|
||||||
|
$("table.docutils:not(.field-list)").wrap("<div class='wy-table-responsive'></div>");
|
||||||
|
|
||||||
|
// Add expand links to all parents of nested ul
|
||||||
|
$('.wy-menu-vertical ul').siblings('a').each(function () {
|
||||||
|
var link = $(this);
|
||||||
|
expand = $('<span class="toctree-expand"></span>');
|
||||||
|
expand.on('click', function (ev) {
|
||||||
|
toggleCurrent(link);
|
||||||
|
ev.stopPropagation();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
link.prepend(expand);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Sphinx theme state
|
||||||
|
window.SphinxRtdTheme = (function (jquery) {
|
||||||
|
var stickyNav = (function () {
|
||||||
|
var navBar,
|
||||||
|
win,
|
||||||
|
winScroll = false,
|
||||||
|
linkScroll = false,
|
||||||
|
winPosition = 0,
|
||||||
|
enable = function () {
|
||||||
|
init();
|
||||||
|
reset();
|
||||||
|
win.on('hashchange', reset);
|
||||||
|
|
||||||
|
// Set scrolling
|
||||||
|
win.on('scroll', function () {
|
||||||
|
if (!linkScroll) {
|
||||||
|
winScroll = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
setInterval(function () {
|
||||||
|
if (winScroll) {
|
||||||
|
winScroll = false;
|
||||||
|
var newWinPosition = win.scrollTop(),
|
||||||
|
navPosition = navBar.scrollTop(),
|
||||||
|
newNavPosition = navPosition + (newWinPosition - winPosition);
|
||||||
|
navBar.scrollTop(newNavPosition);
|
||||||
|
winPosition = newWinPosition;
|
||||||
|
}
|
||||||
|
}, 25);
|
||||||
|
},
|
||||||
|
init = function () {
|
||||||
|
navBar = jquery('nav.wy-nav-side:first');
|
||||||
|
win = jquery(window);
|
||||||
|
},
|
||||||
|
reset = function () {
|
||||||
|
// Get anchor from URL and open up nested nav
|
||||||
|
var anchor = encodeURI(window.location.hash);
|
||||||
|
if (anchor) {
|
||||||
|
try {
|
||||||
|
var link = $('.wy-menu-vertical')
|
||||||
|
.find('[href="' + anchor + '"]');
|
||||||
|
$('.wy-menu-vertical li.toctree-l1 li.current')
|
||||||
|
.removeClass('current');
|
||||||
|
link.closest('li.toctree-l2').addClass('current');
|
||||||
|
link.closest('li.toctree-l3').addClass('current');
|
||||||
|
link.closest('li.toctree-l4').addClass('current');
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
console.log("Error expanding nav for anchor", err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
hashChange = function () {
|
||||||
|
linkScroll = true;
|
||||||
|
win.one('hashchange', function () {
|
||||||
|
linkScroll = false;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
jquery(init);
|
||||||
|
return {
|
||||||
|
enable: enable,
|
||||||
|
hashChange: hashChange
|
||||||
|
};
|
||||||
|
}());
|
||||||
|
return {
|
||||||
|
StickyNav: stickyNav
|
||||||
|
};
|
||||||
|
}($));
|
||||||
|
|
|
@ -5,3 +5,5 @@ stylesheet = css/theme.css
|
||||||
[options]
|
[options]
|
||||||
typekit_id = hiw1hhg
|
typekit_id = hiw1hhg
|
||||||
analytics_id =
|
analytics_id =
|
||||||
|
sticky_navigation = False
|
||||||
|
logo_only =
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
{% if READTHEDOCS %}
|
{% if READTHEDOCS %}
|
||||||
{# Add rst-badge after rst-versions for small badge style. #}
|
{# Add rst-badge after rst-versions for small badge style. #}
|
||||||
<div class="rst-versions" data-toggle="rst-versions">
|
<div class="rst-versions" data-toggle="rst-versions" role="note" aria-label="versions">
|
||||||
<span class="rst-current-version" data-toggle="rst-current-version">
|
<span class="rst-current-version" data-toggle="rst-current-version">
|
||||||
<span class="icon icon-book"> Read the Docs</span>
|
<span class="fa fa-book"> Read the Docs</span>
|
||||||
v: {{ current_version }}
|
v: {{ current_version }}
|
||||||
<span class="icon icon-caret-down"></span>
|
<span class="fa fa-caret-down"></span>
|
||||||
</span>
|
</span>
|
||||||
<div class="rst-other-versions">
|
<div class="rst-other-versions">
|
||||||
<dl>
|
<dl>
|
||||||
|
|
|
@ -123,9 +123,9 @@ cares_confflags = "--enable-optimize=$(OPTFLAGS)"
|
||||||
cares_cflags=$(LTO_FLAGS)
|
cares_cflags=$(LTO_FLAGS)
|
||||||
cares_ldflags=$(CFLAGS) $(LTO_FLAGS)
|
cares_ldflags=$(CFLAGS) $(LTO_FLAGS)
|
||||||
|
|
||||||
sqlite_version = autoconf-3080500
|
sqlite_version = autoconf-3081002
|
||||||
sqlite_hash = 7f667e10ccebc26ab2086b8a30cb0a600ca0acae
|
sqlite_hash = c2f2c17d3dc4c4e179d35cc04e4420636d48a152
|
||||||
sqlite_url = http://sqlite.org/2014/sqlite-$(sqlite_version).tar.gz
|
sqlite_url = http://sqlite.org/2015/sqlite-$(sqlite_version).tar.gz
|
||||||
sqlite_cflags=$(LTO_FLAGS)
|
sqlite_cflags=$(LTO_FLAGS)
|
||||||
sqlite_ldflags=$(CFLAGS) $(LTO_FLAGS)
|
sqlite_ldflags=$(CFLAGS) $(LTO_FLAGS)
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,23 @@ HOST=i686-w64-mingw32
|
||||||
HOST=x86_64-w64-mingw32
|
HOST=x86_64-w64-mingw32
|
||||||
The configure command-line is the same as i686 version.
|
The configure command-line is the same as i686 version.
|
||||||
|
|
||||||
|
libssh2
|
||||||
|
-------
|
||||||
|
|
||||||
|
HOST=i686-w64-mingw32
|
||||||
|
./configure \
|
||||||
|
--disable-shared \
|
||||||
|
--enable-static \
|
||||||
|
--prefix=/usr/local/$HOST \
|
||||||
|
--host=$HOST \
|
||||||
|
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||||
|
--without-openssl \
|
||||||
|
--with-wincng \
|
||||||
|
LIBS="-lws2_32"
|
||||||
|
|
||||||
|
HOST=x86_64-w64-mingw32
|
||||||
|
The configure command-line is the same as i686 version.
|
||||||
|
|
||||||
Zlib
|
Zlib
|
||||||
----
|
----
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
# * expat
|
# * expat
|
||||||
# * sqlite3
|
# * sqlite3
|
||||||
# * zlib
|
# * zlib
|
||||||
|
# * libssh2
|
||||||
# * cppunit
|
# * cppunit
|
||||||
|
|
||||||
test -z "$HOST" && HOST=i686-w64-mingw32
|
test -z "$HOST" && HOST=i686-w64-mingw32
|
||||||
|
@ -70,6 +71,7 @@ test -z "$PREFIX" && PREFIX=/usr/local/$HOST
|
||||||
--with-libexpat \
|
--with-libexpat \
|
||||||
--with-libz \
|
--with-libz \
|
||||||
--with-libgmp \
|
--with-libgmp \
|
||||||
|
--with-libssh2 \
|
||||||
--without-libgcrypt \
|
--without-libgcrypt \
|
||||||
--without-libnettle \
|
--without-libnettle \
|
||||||
--with-cppunit-prefix=$PREFIX \
|
--with-cppunit-prefix=$PREFIX \
|
||||||
|
|
|
@ -237,7 +237,7 @@ bool AbstractCommand::execute()
|
||||||
if (req_ && fileEntry_->getLength() > 0 &&
|
if (req_ && fileEntry_->getLength() > 0 &&
|
||||||
e_->getRequestGroupMan()->getMaxOverallDownloadSpeedLimit() == 0 &&
|
e_->getRequestGroupMan()->getMaxOverallDownloadSpeedLimit() == 0 &&
|
||||||
requestGroup_->getMaxDownloadSpeedLimit() == 0 &&
|
requestGroup_->getMaxDownloadSpeedLimit() == 0 &&
|
||||||
serverStatTimer_.difference(global::wallclock()) >= 10) {
|
serverStatTimer_.difference(global::wallclock()) >= 10_s) {
|
||||||
serverStatTimer_ = global::wallclock();
|
serverStatTimer_ = global::wallclock();
|
||||||
std::vector<std::pair<size_t, std::string>> usedHosts;
|
std::vector<std::pair<size_t, std::string>> usedHosts;
|
||||||
if (getOption()->getAsBool(PREF_SELECT_LEAST_USED_HOST)) {
|
if (getOption()->getAsBool(PREF_SELECT_LEAST_USED_HOST)) {
|
||||||
|
@ -284,7 +284,7 @@ bool AbstractCommand::execute()
|
||||||
A2_LOG_DEBUG("All segments are ignored.");
|
A2_LOG_DEBUG("All segments are ignored.");
|
||||||
// This will execute other idle Commands and let them
|
// This will execute other idle Commands and let them
|
||||||
// finish quickly.
|
// finish quickly.
|
||||||
e_->setRefreshInterval(0);
|
e_->setRefreshInterval(std::chrono::milliseconds(0));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -386,7 +386,8 @@ bool AbstractCommand::execute()
|
||||||
}
|
}
|
||||||
|
|
||||||
Timer wakeTime(global::wallclock());
|
Timer wakeTime(global::wallclock());
|
||||||
wakeTime.advance(getOption()->getAsInt(PREF_RETRY_WAIT));
|
wakeTime.advance(
|
||||||
|
std::chrono::seconds(getOption()->getAsInt(PREF_RETRY_WAIT)));
|
||||||
req_->setWakeTime(wakeTime);
|
req_->setWakeTime(wakeTime);
|
||||||
return prepareForRetry(0);
|
return prepareForRetry(0);
|
||||||
}
|
}
|
||||||
|
@ -401,7 +402,7 @@ bool AbstractCommand::execute()
|
||||||
A2_LOG_ERROR_EX(EX_EXCEPTION_CAUGHT, err);
|
A2_LOG_ERROR_EX(EX_EXCEPTION_CAUGHT, err);
|
||||||
}
|
}
|
||||||
requestGroup_->setHaltRequested(true);
|
requestGroup_->setHaltRequested(true);
|
||||||
getDownloadEngine()->setRefreshInterval(0);
|
getDownloadEngine()->setRefreshInterval(std::chrono::milliseconds(0));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -457,7 +458,7 @@ bool AbstractCommand::prepareForRetry(time_t wait)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// We don't use wait so that Command can be executed by
|
// We don't use wait so that Command can be executed by
|
||||||
// DownloadEngine::setRefreshInterval(0).
|
// DownloadEngine::setRefreshInterval(std::chrono::milliseconds(0)).
|
||||||
command->setStatus(Command::STATUS_INACTIVE);
|
command->setStatus(Command::STATUS_INACTIVE);
|
||||||
}
|
}
|
||||||
e_->addCommand(std::move(command));
|
e_->addCommand(std::move(command));
|
||||||
|
@ -515,14 +516,12 @@ void AbstractCommand::onAbort()
|
||||||
getPieceStorage()->markPiecesDone(0);
|
getPieceStorage()->markPiecesDone(0);
|
||||||
std::vector<std::string> uris;
|
std::vector<std::string> uris;
|
||||||
uris.reserve(res.size());
|
uris.reserve(res.size());
|
||||||
std::transform(res.begin(),
|
std::transform(std::begin(res), std::end(res), std::back_inserter(uris),
|
||||||
res.end(),
|
|
||||||
std::back_inserter(uris),
|
|
||||||
std::mem_fn(&URIResult::getURI));
|
std::mem_fn(&URIResult::getURI));
|
||||||
A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - %lu URIs found.",
|
A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - %lu URIs found.",
|
||||||
getCuid(),
|
getCuid(),
|
||||||
static_cast<unsigned long int>(uris.size())));
|
static_cast<unsigned long int>(uris.size())));
|
||||||
fileEntry_->addUris(uris.begin(), uris.end());
|
fileEntry_->addUris(std::begin(uris), std::end(uris));
|
||||||
getSegmentMan()->recognizeSegmentFor(fileEntry_);
|
getSegmentMan()->recognizeSegmentFor(fileEntry_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -677,7 +676,7 @@ std::string getProxyUri(const std::string& protocol, const Option* option)
|
||||||
option);
|
option);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (protocol == "ftp") {
|
if (protocol == "ftp" || protocol == "sftp") {
|
||||||
return getProxyOptionFor
|
return getProxyOptionFor
|
||||||
(PREF_FTP_PROXY, PREF_FTP_PROXY_USER, PREF_FTP_PROXY_PASSWD, option);
|
(PREF_FTP_PROXY, PREF_FTP_PROXY_USER, PREF_FTP_PROXY_PASSWD, option);
|
||||||
}
|
}
|
||||||
|
@ -700,8 +699,8 @@ namespace {
|
||||||
bool inNoProxy(const std::shared_ptr<Request>& req, const std::string& noProxy)
|
bool inNoProxy(const std::shared_ptr<Request>& req, const std::string& noProxy)
|
||||||
{
|
{
|
||||||
std::vector<Scip> entries;
|
std::vector<Scip> entries;
|
||||||
util::splitIter
|
util::splitIter(std::begin(noProxy), std::end(noProxy),
|
||||||
(noProxy.begin(), noProxy.end(), std::back_inserter(entries), ',', true);
|
std::back_inserter(entries), ',', true);
|
||||||
if (entries.empty()) {
|
if (entries.empty()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -773,10 +772,8 @@ std::string AbstractCommand::resolveHostname(std::vector<std::string>& addrs,
|
||||||
e_->findAllCachedIPAddresses(std::back_inserter(addrs), hostname, port);
|
e_->findAllCachedIPAddresses(std::back_inserter(addrs), hostname, port);
|
||||||
if (!addrs.empty()) {
|
if (!addrs.empty()) {
|
||||||
auto ipaddr = addrs.front();
|
auto ipaddr = addrs.front();
|
||||||
A2_LOG_INFO(fmt(MSG_DNS_CACHE_HIT,
|
A2_LOG_INFO(fmt(MSG_DNS_CACHE_HIT, getCuid(), hostname.c_str(),
|
||||||
getCuid(),
|
strjoin(std::begin(addrs), std::end(addrs), ", ").c_str()));
|
||||||
hostname.c_str(),
|
|
||||||
strjoin(addrs.begin(), addrs.end(), ", ").c_str()));
|
|
||||||
return ipaddr;
|
return ipaddr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -823,10 +820,8 @@ std::string AbstractCommand::resolveHostname(std::vector<std::string>& addrs,
|
||||||
}
|
}
|
||||||
res.resolve(addrs, hostname);
|
res.resolve(addrs, hostname);
|
||||||
}
|
}
|
||||||
A2_LOG_INFO(fmt(MSG_NAME_RESOLUTION_COMPLETE,
|
A2_LOG_INFO(fmt(MSG_NAME_RESOLUTION_COMPLETE, getCuid(), hostname.c_str(),
|
||||||
getCuid(),
|
strjoin(std::begin(addrs), std::end(addrs), ", ").c_str()));
|
||||||
hostname.c_str(),
|
|
||||||
strjoin(addrs.begin(), addrs.end(), ", ").c_str()));
|
|
||||||
for (const auto& addr : addrs) {
|
for (const auto& addr : addrs) {
|
||||||
e_->cacheIPAddress(hostname, addr, port);
|
e_->cacheIPAddress(hostname, addr, port);
|
||||||
}
|
}
|
||||||
|
@ -883,7 +878,8 @@ bool AbstractCommand::checkIfConnectionEstablished
|
||||||
const std::string&
|
const std::string&
|
||||||
AbstractCommand::resolveProxyMethod(const std::string& protocol) const
|
AbstractCommand::resolveProxyMethod(const std::string& protocol) const
|
||||||
{
|
{
|
||||||
if (getOption()->get(PREF_PROXY_METHOD) == V_TUNNEL || protocol == "https") {
|
if (getOption()->get(PREF_PROXY_METHOD) == V_TUNNEL || protocol == "https" ||
|
||||||
|
protocol == "sftp") {
|
||||||
return V_TUNNEL;
|
return V_TUNNEL;
|
||||||
}
|
}
|
||||||
return V_GET;
|
return V_GET;
|
||||||
|
|
|
@ -83,7 +83,7 @@ private:
|
||||||
|
|
||||||
Timer checkPoint_;
|
Timer checkPoint_;
|
||||||
Timer serverStatTimer_;
|
Timer serverStatTimer_;
|
||||||
time_t timeout_;
|
std::chrono::seconds timeout_;
|
||||||
|
|
||||||
bool checkSocketIsReadable_;
|
bool checkSocketIsReadable_;
|
||||||
bool checkSocketIsWritable_;
|
bool checkSocketIsWritable_;
|
||||||
|
@ -185,14 +185,14 @@ public:
|
||||||
// check.
|
// check.
|
||||||
void swapSocket(std::shared_ptr<SocketCore>& socket);
|
void swapSocket(std::shared_ptr<SocketCore>& socket);
|
||||||
|
|
||||||
time_t getTimeout() const
|
std::chrono::seconds getTimeout() const
|
||||||
{
|
{
|
||||||
return timeout_;
|
return timeout_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setTimeout(time_t timeout)
|
void setTimeout(std::chrono::seconds timeout)
|
||||||
{
|
{
|
||||||
timeout_ = timeout;
|
timeout_ = std::move(timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
void prepareForNextAction(std::unique_ptr<CheckIntegrityEntry> checkEntry);
|
void prepareForNextAction(std::unique_ptr<CheckIntegrityEntry> checkEntry);
|
||||||
|
|
|
@ -119,7 +119,7 @@ bool AbstractHttpServerResponseCommand::execute()
|
||||||
afterSend(httpServer_, e_);
|
afterSend(httpServer_, e_);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
if(timeoutTimer_.difference(global::wallclock()) >= 30) {
|
if (timeoutTimer_.difference(global::wallclock()) >= 30_s) {
|
||||||
A2_LOG_INFO(fmt("CUID#%" PRId64
|
A2_LOG_INFO(fmt("CUID#%" PRId64
|
||||||
" - HttpServer: Timeout while trasmitting response.",
|
" - HttpServer: Timeout while trasmitting response.",
|
||||||
getCuid()));
|
getCuid()));
|
||||||
|
|
|
@ -64,7 +64,7 @@ AbstractProxyRequestCommand::AbstractProxyRequestCommand
|
||||||
(std::make_shared<HttpConnection>
|
(std::make_shared<HttpConnection>
|
||||||
(cuid, s, std::make_shared<SocketRecvBuffer>(s)))
|
(cuid, s, std::make_shared<SocketRecvBuffer>(s)))
|
||||||
{
|
{
|
||||||
setTimeout(getOption()->getAsInt(PREF_CONNECT_TIMEOUT));
|
setTimeout(std::chrono::seconds(getOption()->getAsInt(PREF_CONNECT_TIMEOUT)));
|
||||||
disableReadCheckSocket();
|
disableReadCheckSocket();
|
||||||
setWriteCheckSocket(getSocket());
|
setWriteCheckSocket(getSocket());
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,7 +101,7 @@ void AbstractSingleDiskAdaptor::writeCache(const WrDiskCacheEntry* entry)
|
||||||
// activity especially on Windows 7 NTFS. In this code, we assume
|
// activity especially on Windows 7 NTFS. In this code, we assume
|
||||||
// that maximum length of DataCell data is 16KiB to simplify the
|
// that maximum length of DataCell data is 16KiB to simplify the
|
||||||
// code.
|
// code.
|
||||||
unsigned char buf[16*1024];
|
unsigned char buf[16_k];
|
||||||
int64_t start = 0;
|
int64_t start = 0;
|
||||||
size_t buflen = 0;
|
size_t buflen = 0;
|
||||||
size_t buffoffset = 0;
|
size_t buffoffset = 0;
|
||||||
|
|
|
@ -60,10 +60,10 @@ ActivePeerConnectionCommand::ActivePeerConnectionCommand
|
||||||
(cuid_t cuid,
|
(cuid_t cuid,
|
||||||
RequestGroup* requestGroup,
|
RequestGroup* requestGroup,
|
||||||
DownloadEngine* e,
|
DownloadEngine* e,
|
||||||
time_t interval)
|
std::chrono::seconds interval)
|
||||||
: Command(cuid),
|
: Command(cuid),
|
||||||
requestGroup_(requestGroup),
|
requestGroup_(requestGroup),
|
||||||
interval_(interval),
|
interval_(std::move(interval)),
|
||||||
e_(e),
|
e_(e),
|
||||||
numNewConnection_(5)
|
numNewConnection_(5)
|
||||||
{
|
{
|
||||||
|
|
|
@ -59,7 +59,7 @@ private:
|
||||||
std::shared_ptr<PeerStorage> peerStorage_;
|
std::shared_ptr<PeerStorage> peerStorage_;
|
||||||
std::shared_ptr<BtAnnounce> btAnnounce_;
|
std::shared_ptr<BtAnnounce> btAnnounce_;
|
||||||
|
|
||||||
time_t interval_; // UNIT: sec
|
std::chrono::seconds interval_;
|
||||||
DownloadEngine* e_;
|
DownloadEngine* e_;
|
||||||
Timer checkPoint_;
|
Timer checkPoint_;
|
||||||
int numNewConnection_; // the number of the connection to establish.
|
int numNewConnection_; // the number of the connection to establish.
|
||||||
|
@ -67,7 +67,7 @@ public:
|
||||||
ActivePeerConnectionCommand(cuid_t cuid,
|
ActivePeerConnectionCommand(cuid_t cuid,
|
||||||
RequestGroup* requestGroup,
|
RequestGroup* requestGroup,
|
||||||
DownloadEngine* e,
|
DownloadEngine* e,
|
||||||
time_t interval);
|
std::chrono::seconds interval);
|
||||||
|
|
||||||
virtual ~ActivePeerConnectionCommand();
|
virtual ~ActivePeerConnectionCommand();
|
||||||
|
|
||||||
|
|
|
@ -61,8 +61,8 @@ void AdaptiveFileAllocationIterator::allocateChunk()
|
||||||
try {
|
try {
|
||||||
A2_LOG_DEBUG("Testing file system supports fallocate.");
|
A2_LOG_DEBUG("Testing file system supports fallocate.");
|
||||||
if(offset_ < totalLength_) {
|
if(offset_ < totalLength_) {
|
||||||
int64_t len = std::min(totalLength_-offset_,
|
int64_t len =
|
||||||
static_cast<int64_t>(4096));
|
std::min(totalLength_ - offset_, static_cast<int64_t>(4_k));
|
||||||
stream_->allocate(offset_, len, false);
|
stream_->allocate(offset_, len, false);
|
||||||
offset_ += len;
|
offset_ += len;
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,12 +90,16 @@ std::string AdaptiveURISelector::select
|
||||||
|
|
||||||
std::string selected = selectOne(uris);
|
std::string selected = selectOne(uris);
|
||||||
|
|
||||||
if(selected != A2STR::NIL)
|
if(selected != A2STR::NIL) {
|
||||||
uris.erase(std::find(uris.begin(), uris.end(), selected));
|
uris.erase(std::find(std::begin(uris), std::end(uris), selected));
|
||||||
|
}
|
||||||
return selected;
|
return selected;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
constexpr auto MAX_TIMEOUT = 60_s;
|
||||||
|
} // namespace
|
||||||
|
|
||||||
void AdaptiveURISelector::mayRetryWithIncreasedTimeout(FileEntry* fileEntry)
|
void AdaptiveURISelector::mayRetryWithIncreasedTimeout(FileEntry* fileEntry)
|
||||||
{
|
{
|
||||||
if (requestGroup_->getTimeout()*2 >= MAX_TIMEOUT) return;
|
if (requestGroup_->getTimeout()*2 >= MAX_TIMEOUT) return;
|
||||||
|
@ -105,16 +109,16 @@ void AdaptiveURISelector::mayRetryWithIncreasedTimeout(FileEntry* fileEntry)
|
||||||
// looking for retries
|
// looking for retries
|
||||||
std::deque<URIResult> timeouts;
|
std::deque<URIResult> timeouts;
|
||||||
fileEntry->extractURIResult(timeouts, error_code::TIME_OUT);
|
fileEntry->extractURIResult(timeouts, error_code::TIME_OUT);
|
||||||
std::transform(timeouts.begin(), timeouts.end(), std::back_inserter(uris),
|
std::transform(std::begin(timeouts), std::end(timeouts),
|
||||||
std::mem_fn(&URIResult::getURI));
|
std::back_inserter(uris), std::mem_fn(&URIResult::getURI));
|
||||||
|
|
||||||
if(A2_LOG_DEBUG_ENABLED) {
|
if(A2_LOG_DEBUG_ENABLED) {
|
||||||
for(std::deque<std::string>::const_iterator i = uris.begin(),
|
for (const auto& uri : uris) {
|
||||||
eoi = uris.end(); i != eoi; ++i) {
|
A2_LOG_DEBUG(
|
||||||
A2_LOG_DEBUG(fmt("AdaptiveURISelector: will retry server with increased"
|
fmt("AdaptiveURISelector: will retry server with increased"
|
||||||
" timeout (%ld s): %s",
|
" timeout (%ld s): %s",
|
||||||
static_cast<long int>(requestGroup_->getTimeout()),
|
static_cast<long int>(requestGroup_->getTimeout().count()),
|
||||||
(*i).c_str()));
|
uri.c_str()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -222,7 +226,7 @@ void AdaptiveURISelector::adjustLowestSpeedLimit
|
||||||
int lowest =
|
int lowest =
|
||||||
requestGroup_->getOption()->getAsInt(PREF_LOWEST_SPEED_LIMIT);
|
requestGroup_->getOption()->getAsInt(PREF_LOWEST_SPEED_LIMIT);
|
||||||
if (lowest > 0) {
|
if (lowest > 0) {
|
||||||
int low_lowest = 4 * 1024;
|
int low_lowest = 4_k;
|
||||||
int max = getMaxDownloadSpeed(uris);
|
int max = getMaxDownloadSpeed(uris);
|
||||||
if (max > 0 && lowest > max / 4) {
|
if (max > 0 && lowest > max / 4) {
|
||||||
A2_LOG_NOTICE(fmt(_("Lowering lowest-speed-limit since known max speed is"
|
A2_LOG_NOTICE(fmt(_("Lowering lowest-speed-limit since known max speed is"
|
||||||
|
@ -300,7 +304,7 @@ std::string AdaptiveURISelector::selectRandomUri
|
||||||
(const std::deque<std::string>& uris) const
|
(const std::deque<std::string>& uris) const
|
||||||
{
|
{
|
||||||
int pos = SimpleRandomizer::getInstance()->getRandomNumber(uris.size());
|
int pos = SimpleRandomizer::getInstance()->getRandomNumber(uris.size());
|
||||||
auto i = uris.begin();
|
auto i = std::begin(uris);
|
||||||
i = i+pos;
|
i = i+pos;
|
||||||
return *i;
|
return *i;
|
||||||
}
|
}
|
||||||
|
@ -331,7 +335,7 @@ std::string AdaptiveURISelector::getFirstToTestUri
|
||||||
power = (int)pow(2.0, (float)counter);
|
power = (int)pow(2.0, (float)counter);
|
||||||
/* We test the mirror another time if it has not been
|
/* We test the mirror another time if it has not been
|
||||||
* tested since 2^counter days */
|
* tested since 2^counter days */
|
||||||
if(ss->getLastUpdated().difference() > power*24*60*60) {
|
if(ss->getLastUpdated().difference() > std::chrono::hours(power * 24)) {
|
||||||
return u;
|
return u;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include "URISelector.h"
|
#include "URISelector.h"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
@ -53,8 +54,6 @@ private:
|
||||||
int nbServerToEvaluate_;
|
int nbServerToEvaluate_;
|
||||||
int nbConnections_;
|
int nbConnections_;
|
||||||
|
|
||||||
static const time_t MAX_TIMEOUT = 60;
|
|
||||||
|
|
||||||
void mayRetryWithIncreasedTimeout(FileEntry* fileEntry);
|
void mayRetryWithIncreasedTimeout(FileEntry* fileEntry);
|
||||||
|
|
||||||
std::string selectOne(const std::deque<std::string>& uris);
|
std::string selectOne(const std::deque<std::string>& uris);
|
||||||
|
|
|
@ -222,8 +222,8 @@ void AnnounceList::moveToCompletedAllowedTier() {
|
||||||
void AnnounceList::shuffle() {
|
void AnnounceList::shuffle() {
|
||||||
for (const auto& tier: tiers_) {
|
for (const auto& tier: tiers_) {
|
||||||
auto& urls = tier->urls;
|
auto& urls = tier->urls;
|
||||||
std::random_shuffle(std::begin(urls), std::end(urls),
|
std::shuffle(std::begin(urls), std::end(urls),
|
||||||
*SimpleRandomizer::getInstance());
|
*SimpleRandomizer::getInstance());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -111,7 +111,8 @@ static inline bool isWhitespace(char c)
|
||||||
|
|
||||||
static inline std::string stripWhitespace(std::string str)
|
static inline std::string stripWhitespace(std::string str)
|
||||||
{
|
{
|
||||||
str.erase(std::remove_if(str.begin(), str.end(), isWhitespace), str.end());
|
str.erase(std::remove_if(std::begin(str), std::end(str), isWhitespace),
|
||||||
|
std::end(str));
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,9 +186,9 @@ bool checkIdentity(const SecIdentityRef id,
|
||||||
// future-proof. Also "usually" doesn't cut it; there is already software
|
// future-proof. Also "usually" doesn't cut it; there is already software
|
||||||
// using SHA-2 class algos, and SHA-3 is standardized and potential users
|
// using SHA-2 class algos, and SHA-3 is standardized and potential users
|
||||||
// cannot be far.
|
// cannot be far.
|
||||||
return std::find_if(supported.begin(),
|
return std::find_if(std::begin(supported), std::end(supported),
|
||||||
supported.end(),
|
hash_finder(data.get(), fingerPrint)) !=
|
||||||
hash_finder(data.get(), fingerPrint)) != supported.end();
|
std::end(supported);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // defined(__MAC_10_6)
|
#endif // defined(__MAC_10_6)
|
||||||
|
@ -243,11 +244,12 @@ bool AppleTLSContext::tryAsFingerprint(const std::string& fingerprint)
|
||||||
{
|
{
|
||||||
auto fp = stripWhitespace(fingerprint);
|
auto fp = stripWhitespace(fingerprint);
|
||||||
// Verify this is a valid hex representation and normalize.
|
// Verify this is a valid hex representation and normalize.
|
||||||
fp = util::toHex(util::fromHex(fp.begin(), fp.end()));
|
fp = util::toHex(util::fromHex(std::begin(fp), std::end(fp)));
|
||||||
|
|
||||||
// Verify this can represent a hash
|
// Verify this can represent a hash
|
||||||
auto ht = MessageDigest::getSupportedHashTypes();
|
auto ht = MessageDigest::getSupportedHashTypes();
|
||||||
if (std::find_if(ht.begin(), ht.end(), hash_validator(fp)) == ht.end()) {
|
if (std::find_if(std::begin(ht), std::end(ht), hash_validator(fp)) ==
|
||||||
|
std::end(ht)) {
|
||||||
A2_LOG_INFO(fmt("%s is not a fingerprint, invalid hash representation",
|
A2_LOG_INFO(fmt("%s is not a fingerprint, invalid hash representation",
|
||||||
fingerprint.c_str()));
|
fingerprint.c_str()));
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -330,7 +330,8 @@ static SSLCipherSuiteList constructEnabledSuites(SSLContextRef ctx)
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
rv.erase(std::remove_if(rv.begin(), rv.end(), isBlockedSuite), rv.end());
|
rv.erase(std::remove_if(std::begin(rv), std::end(rv), isBlockedSuite),
|
||||||
|
std::end(rv));
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -143,10 +143,8 @@ void AsyncNameResolver::reset()
|
||||||
ares_addr_node* parseAsyncDNSServers(const std::string& serversOpt)
|
ares_addr_node* parseAsyncDNSServers(const std::string& serversOpt)
|
||||||
{
|
{
|
||||||
std::vector<std::string> servers;
|
std::vector<std::string> servers;
|
||||||
util::split(serversOpt.begin(), serversOpt.end(),
|
util::split(std::begin(serversOpt), std::end(serversOpt),
|
||||||
std::back_inserter(servers),
|
std::back_inserter(servers), ',', true /* doStrip */);
|
||||||
',',
|
|
||||||
true /* doStrip */);
|
|
||||||
ares_addr_node root;
|
ares_addr_node root;
|
||||||
root.next = nullptr;
|
root.next = nullptr;
|
||||||
ares_addr_node* tail = &root;
|
ares_addr_node* tail = &root;
|
||||||
|
|
|
@ -87,7 +87,8 @@ AuthConfigFactory::createAuthConfig
|
||||||
createHttpAuthResolver(op)->resolveAuthConfig(request->getHost());
|
createHttpAuthResolver(op)->resolveAuthConfig(request->getHost());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if(request->getProtocol() == "ftp") {
|
} else if(request->getProtocol() == "ftp" ||
|
||||||
|
request->getProtocol() == "sftp") {
|
||||||
if(!request->getUsername().empty()) {
|
if(!request->getUsername().empty()) {
|
||||||
if(request->hasPassword()) {
|
if(request->hasPassword()) {
|
||||||
return AuthConfig::create(request->getUsername(),
|
return AuthConfig::create(request->getUsername(),
|
||||||
|
|
|
@ -38,9 +38,9 @@
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
AutoSaveCommand::AutoSaveCommand
|
AutoSaveCommand::AutoSaveCommand(cuid_t cuid, DownloadEngine* e,
|
||||||
(cuid_t cuid, DownloadEngine* e, time_t interval)
|
std::chrono::seconds interval)
|
||||||
: TimeBasedCommand(cuid, e, interval, true)
|
: TimeBasedCommand(cuid, e, std::move(interval), true)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
AutoSaveCommand::~AutoSaveCommand() {}
|
AutoSaveCommand::~AutoSaveCommand() {}
|
||||||
|
|
|
@ -42,7 +42,8 @@ namespace aria2 {
|
||||||
class AutoSaveCommand : public TimeBasedCommand
|
class AutoSaveCommand : public TimeBasedCommand
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
AutoSaveCommand(cuid_t cuid, DownloadEngine* e, time_t interval);
|
AutoSaveCommand(cuid_t cuid, DownloadEngine* e,
|
||||||
|
std::chrono::seconds interval);
|
||||||
|
|
||||||
virtual ~AutoSaveCommand();
|
virtual ~AutoSaveCommand();
|
||||||
|
|
||||||
|
|
|
@ -114,7 +114,8 @@ bool BackupIPv4ConnectCommand::execute()
|
||||||
// TODO Although we check 300ms initial timeout as described in
|
// TODO Although we check 300ms initial timeout as described in
|
||||||
// RFC 6555, the interval will be much longer and around 1 second
|
// RFC 6555, the interval will be much longer and around 1 second
|
||||||
// due to the refresh interval mechanism in DownloadEngine.
|
// due to the refresh interval mechanism in DownloadEngine.
|
||||||
if(startTime_.differenceInMillis(global::wallclock()) >= 300) {
|
if(startTime_.difference(global::wallclock()) >=
|
||||||
|
std::chrono::milliseconds(300)) {
|
||||||
socket_ = std::make_shared<SocketCore>();
|
socket_ = std::make_shared<SocketCore>();
|
||||||
try {
|
try {
|
||||||
socket_->establishConnection(ipaddr_, port_);
|
socket_->establishConnection(ipaddr_, port_);
|
||||||
|
|
|
@ -81,7 +81,7 @@ private:
|
||||||
DownloadEngine* e_;
|
DownloadEngine* e_;
|
||||||
Timer startTime_;
|
Timer startTime_;
|
||||||
Timer timeoutCheck_;
|
Timer timeoutCheck_;
|
||||||
time_t timeout_;
|
std::chrono::seconds timeout_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -54,4 +54,6 @@ const std::string BtAnnounce::PEERS("peers");
|
||||||
|
|
||||||
const std::string BtAnnounce::PEERS6("peers6");
|
const std::string BtAnnounce::PEERS6("peers6");
|
||||||
|
|
||||||
|
constexpr std::chrono::minutes BtAnnounce::DEFAULT_ANNOUNCE_INTERVAL;
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include "a2time.h"
|
#include "a2time.h"
|
||||||
|
#include "a2functional.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
@ -116,7 +117,7 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void shuffleAnnounce() = 0;
|
virtual void shuffleAnnounce() = 0;
|
||||||
|
|
||||||
virtual void overrideMinInterval(time_t interval) = 0;
|
virtual void overrideMinInterval(std::chrono::seconds interval) = 0;
|
||||||
|
|
||||||
virtual void setTcpPort(uint16_t port) = 0;
|
virtual void setTcpPort(uint16_t port) = 0;
|
||||||
|
|
||||||
|
@ -138,7 +139,7 @@ public:
|
||||||
|
|
||||||
static const std::string PEERS6;
|
static const std::string PEERS6;
|
||||||
|
|
||||||
static const time_t DEFAULT_ANNOUNCE_INTERVAL = 120;
|
constexpr static auto DEFAULT_ANNOUNCE_INTERVAL = 2_min;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -40,6 +40,9 @@
|
||||||
#include "DiskAdaptor.h"
|
#include "DiskAdaptor.h"
|
||||||
#include "prefs.h"
|
#include "prefs.h"
|
||||||
#include "Option.h"
|
#include "Option.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "SingletonHolder.h"
|
||||||
|
#include "Notifier.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
@ -72,12 +75,17 @@ void BtCheckIntegrityEntry::onDownloadIncomplete
|
||||||
void BtCheckIntegrityEntry::onDownloadFinished
|
void BtCheckIntegrityEntry::onDownloadFinished
|
||||||
(std::vector<std::unique_ptr<Command>>& commands, DownloadEngine* e)
|
(std::vector<std::unique_ptr<Command>>& commands, DownloadEngine* e)
|
||||||
{
|
{
|
||||||
|
auto group = getRequestGroup();
|
||||||
|
const auto& option = group->getOption();
|
||||||
|
util::executeHookByOptName(group, option.get(), PREF_ON_BT_DOWNLOAD_COMPLETE);
|
||||||
|
SingletonHolder<Notifier>::instance()->notifyDownloadEvent
|
||||||
|
(EVENT_ON_BT_DOWNLOAD_COMPLETE, group);
|
||||||
// TODO Currently,when all the checksums
|
// TODO Currently,when all the checksums
|
||||||
// are valid, then aria2 goes to seeding mode. Sometimes it is better
|
// are valid, then aria2 goes to seeding mode. Sometimes it is better
|
||||||
// to exit rather than doing seeding. So, it would be good to toggle this
|
// to exit rather than doing seeding. So, it would be good to toggle this
|
||||||
// behavior.
|
// behavior.
|
||||||
if(!getRequestGroup()->getOption()->getAsBool(PREF_HASH_CHECK_ONLY) &&
|
if(!option->getAsBool(PREF_HASH_CHECK_ONLY) &&
|
||||||
getRequestGroup()->getOption()->getAsBool(PREF_BT_HASH_CHECK_SEED)) {
|
option->getAsBool(PREF_BT_HASH_CHECK_SEED)) {
|
||||||
proceedFileAllocation(commands,
|
proceedFileAllocation(commands,
|
||||||
make_unique<BtFileAllocationEntry>
|
make_unique<BtFileAllocationEntry>
|
||||||
(getRequestGroup()),
|
(getRequestGroup()),
|
||||||
|
|
|
@ -36,33 +36,33 @@
|
||||||
#define D_BT_CONSTANTS_H
|
#define D_BT_CONSTANTS_H
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include <vector>
|
#include "a2functional.h"
|
||||||
|
|
||||||
#define INFO_HASH_LENGTH 20
|
namespace aria2 {
|
||||||
|
|
||||||
#define PIECE_HASH_LENGTH 20
|
constexpr size_t INFO_HASH_LENGTH = 20;
|
||||||
|
|
||||||
#define PEER_ID_LENGTH 20
|
constexpr size_t PIECE_HASH_LENGTH = 20;
|
||||||
|
|
||||||
#define INFO_HASH_LENGTH 20
|
constexpr size_t PEER_ID_LENGTH = 20;
|
||||||
|
|
||||||
#define MAX_BLOCK_LENGTH (16*1024)
|
constexpr size_t MAX_BLOCK_LENGTH = 16_k;
|
||||||
|
|
||||||
#define DEFAULT_MAX_OUTSTANDING_REQUEST 6
|
constexpr size_t DEFAULT_MAX_OUTSTANDING_REQUEST = 6;
|
||||||
|
|
||||||
#define OUTSTANDING_REQUEST_STEP 6
|
|
||||||
|
|
||||||
// Upper Bound of the number of outstanding request
|
// Upper Bound of the number of outstanding request
|
||||||
#define UB_MAX_OUTSTANDING_REQUEST 256
|
constexpr size_t UB_MAX_OUTSTANDING_REQUEST = 256;
|
||||||
|
|
||||||
#define METADATA_PIECE_SIZE (16*1024)
|
constexpr size_t METADATA_PIECE_SIZE = 16_k;
|
||||||
|
|
||||||
#define LPD_MULTICAST_ADDR "239.192.152.143"
|
constexpr const char LPD_MULTICAST_ADDR[] = "239.192.152.143";
|
||||||
|
|
||||||
#define LPD_MULTICAST_PORT 6771
|
constexpr uint16_t LPD_MULTICAST_PORT = 6771;
|
||||||
|
|
||||||
#define COMPACT_LEN_IPV4 6
|
constexpr size_t COMPACT_LEN_IPV4 = 6;
|
||||||
|
|
||||||
#define COMPACT_LEN_IPV6 18
|
constexpr size_t COMPACT_LEN_IPV6 = 18;
|
||||||
|
|
||||||
|
} // namespace aria2
|
||||||
|
|
||||||
#endif // D_BT_CONSTANTS_H
|
#endif // D_BT_CONSTANTS_H
|
||||||
|
|
|
@ -68,8 +68,8 @@ void copyValues(const std::shared_ptr<FileEntry>& d,
|
||||||
{
|
{
|
||||||
d->setRequested(true);
|
d->setRequested(true);
|
||||||
d->setPath(s->getPath());
|
d->setPath(s->getPath());
|
||||||
d->addUris(s->getRemainingUris().begin(),
|
d->addUris(std::begin(s->getRemainingUris()),
|
||||||
s->getRemainingUris().end());
|
std::end(s->getRemainingUris()));
|
||||||
d->setMaxConnectionPerServer(s->getMaxConnectionPerServer());
|
d->setMaxConnectionPerServer(s->getMaxConnectionPerServer());
|
||||||
d->setUniqueProtocol(s->isUniqueProtocol());
|
d->setUniqueProtocol(s->isUniqueProtocol());
|
||||||
}
|
}
|
||||||
|
@ -120,8 +120,8 @@ bool BtDependency::resolve()
|
||||||
context->getFileEntries();
|
context->getFileEntries();
|
||||||
for (auto &fe : fileEntries) {
|
for (auto &fe : fileEntries) {
|
||||||
auto &uri = fe->getRemainingUris();
|
auto &uri = fe->getRemainingUris();
|
||||||
std::random_shuffle(std::begin(uri), std::end(uri),
|
std::shuffle(std::begin(uri), std::end(uri),
|
||||||
*SimpleRandomizer::getInstance());
|
*SimpleRandomizer::getInstance());
|
||||||
}
|
}
|
||||||
const std::vector<std::shared_ptr<FileEntry> >& dependantFileEntries =
|
const std::vector<std::shared_ptr<FileEntry> >& dependantFileEntries =
|
||||||
dependant_->getDownloadContext()->getFileEntries();
|
dependant_->getDownloadContext()->getFileEntries();
|
||||||
|
@ -138,14 +138,14 @@ bool BtDependency::resolve()
|
||||||
e->setRequested(false);
|
e->setRequested(false);
|
||||||
destFiles.push_back(e);
|
destFiles.push_back(e);
|
||||||
}
|
}
|
||||||
std::sort(destFiles.begin(), destFiles.end(), EntryCmp());
|
std::sort(std::begin(destFiles), std::end(destFiles), EntryCmp());
|
||||||
// Copy file path in dependant_'s FileEntries to newly created
|
// Copy file path in dependant_'s FileEntries to newly created
|
||||||
// context's FileEntries to endorse the path structure of
|
// context's FileEntries to endorse the path structure of
|
||||||
// dependant_. URIs and singleHostMultiConnection are also copied.
|
// dependant_. URIs and singleHostMultiConnection are also copied.
|
||||||
for(const auto& e: dependantFileEntries){
|
for(const auto& e: dependantFileEntries){
|
||||||
const auto d = std::lower_bound(destFiles.begin(), destFiles.end(), e,
|
const auto d = std::lower_bound(std::begin(destFiles),
|
||||||
EntryCmp());
|
std::end(destFiles), e, EntryCmp());
|
||||||
if(d == destFiles.end() ||
|
if(d == std::end(destFiles) ||
|
||||||
(*d)->getOriginalName() != e->getOriginalName()) {
|
(*d)->getOriginalName() != e->getOriginalName()) {
|
||||||
throw DL_ABORT_EX
|
throw DL_ABORT_EX
|
||||||
(fmt("No entry %s in torrent file", e->getOriginalName().c_str()));
|
(fmt("No entry %s in torrent file", e->getOriginalName().c_str()));
|
||||||
|
|
|
@ -70,7 +70,7 @@ void BtFileAllocationEntry::prepareForNextAction
|
||||||
const std::vector<std::shared_ptr<FileEntry> >& fileEntries =
|
const std::vector<std::shared_ptr<FileEntry> >& fileEntries =
|
||||||
getRequestGroup()->getDownloadContext()->getFileEntries();
|
getRequestGroup()->getDownloadContext()->getFileEntries();
|
||||||
if(isUriSuppliedForRequsetFileEntry
|
if(isUriSuppliedForRequsetFileEntry
|
||||||
(fileEntries.begin(), fileEntries.end())) {
|
(std::begin(fileEntries), std::end(fileEntries))) {
|
||||||
getRequestGroup()->createNextCommandWithAdj(commands, e, 0);
|
getRequestGroup()->createNextCommandWithAdj(commands, e, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -47,17 +47,20 @@ namespace aria2 {
|
||||||
|
|
||||||
BtLeecherStateChoke::BtLeecherStateChoke()
|
BtLeecherStateChoke::BtLeecherStateChoke()
|
||||||
: round_(0),
|
: round_(0),
|
||||||
lastRound_(0)
|
lastRound_(Timer::zero())
|
||||||
{}
|
{}
|
||||||
|
|
||||||
BtLeecherStateChoke::~BtLeecherStateChoke() {}
|
BtLeecherStateChoke::~BtLeecherStateChoke() {}
|
||||||
|
|
||||||
BtLeecherStateChoke::PeerEntry::PeerEntry(const std::shared_ptr<Peer>& peer):
|
BtLeecherStateChoke::PeerEntry::PeerEntry(const std::shared_ptr<Peer>& peer)
|
||||||
peer_(peer), downloadSpeed_(peer->calculateDownloadSpeed()),
|
: peer_(peer),
|
||||||
// peer must be interested to us and sent block in the last 30 seconds
|
downloadSpeed_(peer->calculateDownloadSpeed()),
|
||||||
regularUnchoker_
|
// peer must be interested to us and sent block in the last 30 seconds
|
||||||
(peer->peerInterested() &&
|
regularUnchoker_(
|
||||||
peer->getLastDownloadUpdate().difference(global::wallclock()) < 30) {}
|
peer->peerInterested() &&
|
||||||
|
peer->getLastDownloadUpdate().difference(global::wallclock()) < 30_s)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
BtLeecherStateChoke::PeerEntry::PeerEntry(const PeerEntry& c)
|
BtLeecherStateChoke::PeerEntry::PeerEntry(const PeerEntry& c)
|
||||||
: peer_(c.peer_),
|
: peer_(c.peer_),
|
||||||
|
@ -143,32 +146,32 @@ bool BtLeecherStateChoke::PeerFilter::operator()
|
||||||
void BtLeecherStateChoke::plannedOptimisticUnchoke
|
void BtLeecherStateChoke::plannedOptimisticUnchoke
|
||||||
(std::vector<PeerEntry>& peerEntries)
|
(std::vector<PeerEntry>& peerEntries)
|
||||||
{
|
{
|
||||||
std::for_each(peerEntries.begin(), peerEntries.end(),
|
std::for_each(std::begin(peerEntries), std::end(peerEntries),
|
||||||
std::mem_fn(&PeerEntry::disableOptUnchoking));
|
std::mem_fn(&PeerEntry::disableOptUnchoking));
|
||||||
|
|
||||||
auto i = std::partition(peerEntries.begin(), peerEntries.end(),
|
auto i = std::partition(std::begin(peerEntries), std::end(peerEntries),
|
||||||
PeerFilter(true, true));
|
PeerFilter(true, true));
|
||||||
if(i != peerEntries.begin()) {
|
if(i != std::begin(peerEntries)) {
|
||||||
std::random_shuffle(peerEntries.begin(), i,
|
std::shuffle(std::begin(peerEntries), i, *SimpleRandomizer::getInstance());
|
||||||
*SimpleRandomizer::getInstance());
|
(*std::begin(peerEntries)).enableOptUnchoking();
|
||||||
(*peerEntries.begin()).enableOptUnchoking();
|
A2_LOG_INFO(
|
||||||
A2_LOG_INFO(fmt("POU: %s",
|
fmt("POU: %s",
|
||||||
(*peerEntries.begin()).getPeer()->getIPAddress().c_str()));
|
(*std::begin(peerEntries)).getPeer()->getIPAddress().c_str()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BtLeecherStateChoke::regularUnchoke(std::vector<PeerEntry>& peerEntries)
|
void BtLeecherStateChoke::regularUnchoke(std::vector<PeerEntry>& peerEntries)
|
||||||
{
|
{
|
||||||
auto rest = std::partition(peerEntries.begin(), peerEntries.end(),
|
auto rest = std::partition(std::begin(peerEntries), std::end(peerEntries),
|
||||||
std::mem_fn(&PeerEntry::isRegularUnchoker));
|
std::mem_fn(&PeerEntry::isRegularUnchoker));
|
||||||
|
|
||||||
std::sort(peerEntries.begin(), rest);
|
std::sort(std::begin(peerEntries), rest);
|
||||||
|
|
||||||
// the number of regular unchokers
|
// the number of regular unchokers
|
||||||
int count = 3;
|
int count = 3;
|
||||||
|
|
||||||
bool fastOptUnchoker = false;
|
bool fastOptUnchoker = false;
|
||||||
auto peerIter = peerEntries.begin();
|
auto peerIter = std::begin(peerEntries);
|
||||||
for(;peerIter != rest && count; ++peerIter, --count) {
|
for(;peerIter != rest && count; ++peerIter, --count) {
|
||||||
peerIter->disableChokingRequired();
|
peerIter->disableChokingRequired();
|
||||||
A2_LOG_INFO(fmt("RU: %s, dlspd=%d",
|
A2_LOG_INFO(fmt("RU: %s, dlspd=%d",
|
||||||
|
@ -180,8 +183,8 @@ void BtLeecherStateChoke::regularUnchoke(std::vector<PeerEntry>& peerEntries)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(fastOptUnchoker) {
|
if(fastOptUnchoker) {
|
||||||
std::random_shuffle(peerIter, peerEntries.end(),
|
std::shuffle(peerIter, std::end(peerEntries),
|
||||||
*SimpleRandomizer::getInstance());
|
*SimpleRandomizer::getInstance());
|
||||||
for (auto& p : peerEntries) {
|
for (auto& p : peerEntries) {
|
||||||
if(p.getPeer()->peerInterested()) {
|
if(p.getPeer()->peerInterested()) {
|
||||||
p.enableOptUnchoking();
|
p.enableOptUnchoking();
|
||||||
|
|
|
@ -213,7 +213,7 @@ void BtPieceMessage::send()
|
||||||
|
|
||||||
void BtPieceMessage::pushPieceData(int64_t offset, int32_t length) const
|
void BtPieceMessage::pushPieceData(int64_t offset, int32_t length) const
|
||||||
{
|
{
|
||||||
assert(length <= 16*1024);
|
assert(length <= static_cast<int32_t>(16_k));
|
||||||
auto buf = make_unique<unsigned char[]>(length+MESSAGE_HEADER_LENGTH);
|
auto buf = make_unique<unsigned char[]>(length+MESSAGE_HEADER_LENGTH);
|
||||||
createMessageHeader(buf.get());
|
createMessageHeader(buf.get());
|
||||||
ssize_t r;
|
ssize_t r;
|
||||||
|
|
|
@ -102,12 +102,12 @@ void BtPostDownloadHandler::getNextRequestGroups
|
||||||
std::vector<std::string>(),
|
std::vector<std::string>(),
|
||||||
"",
|
"",
|
||||||
torrent.get());
|
torrent.get());
|
||||||
requestGroup->followedBy(newRgs.begin(), newRgs.end());
|
requestGroup->followedBy(std::begin(newRgs), std::end(newRgs));
|
||||||
auto mi =
|
auto mi =
|
||||||
createMetadataInfoFromFirstFileEntry(requestGroup->getGroupId(),
|
createMetadataInfoFromFirstFileEntry(requestGroup->getGroupId(),
|
||||||
requestGroup->getDownloadContext());
|
requestGroup->getDownloadContext());
|
||||||
if(mi) {
|
if(mi) {
|
||||||
setMetadataInfo(newRgs.begin(), newRgs.end(), mi);
|
setMetadataInfo(std::begin(newRgs), std::end(newRgs), mi);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto rgman = requestGroup->getRequestGroupMan();
|
auto rgman = requestGroup->getRequestGroupMan();
|
||||||
|
@ -119,7 +119,7 @@ void BtPostDownloadHandler::getNextRequestGroups
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
groups.insert(groups.end(), newRgs.begin(), newRgs.end());
|
groups.insert(std::end(groups), std::begin(newRgs), std::end(newRgs));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -47,11 +47,15 @@ namespace aria2 {
|
||||||
|
|
||||||
BtSeederStateChoke::BtSeederStateChoke()
|
BtSeederStateChoke::BtSeederStateChoke()
|
||||||
: round_(0),
|
: round_(0),
|
||||||
lastRound_(0)
|
lastRound_(Timer::zero())
|
||||||
{}
|
{}
|
||||||
|
|
||||||
BtSeederStateChoke::~BtSeederStateChoke() {}
|
BtSeederStateChoke::~BtSeederStateChoke() {}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
constexpr auto TIME_FRAME = 20_s;
|
||||||
|
} // namespace
|
||||||
|
|
||||||
BtSeederStateChoke::PeerEntry::PeerEntry
|
BtSeederStateChoke::PeerEntry::PeerEntry
|
||||||
(const std::shared_ptr<Peer>& peer):
|
(const std::shared_ptr<Peer>& peer):
|
||||||
peer_(peer),
|
peer_(peer),
|
||||||
|
@ -122,11 +126,10 @@ void BtSeederStateChoke::unchoke
|
||||||
{
|
{
|
||||||
int count = (round_ == 2) ? 4 : 3;
|
int count = (round_ == 2) ? 4 : 3;
|
||||||
|
|
||||||
std::sort(peers.begin(), peers.end());
|
std::sort(std::begin(peers), std::end(peers));
|
||||||
|
|
||||||
auto r = peers.begin();
|
auto r = std::begin(peers);
|
||||||
for(auto eoi = peers.end();
|
for(; r != std::end(peers) && count; ++r, --count) {
|
||||||
r != eoi && count; ++r, --count) {
|
|
||||||
(*r).getPeer()->chokingRequired(false);
|
(*r).getPeer()->chokingRequired(false);
|
||||||
A2_LOG_INFO(fmt("RU: %s, ulspd=%d",
|
A2_LOG_INFO(fmt("RU: %s, ulspd=%d",
|
||||||
(*r).getPeer()->getIPAddress().c_str(),
|
(*r).getPeer()->getIPAddress().c_str(),
|
||||||
|
@ -134,11 +137,10 @@ void BtSeederStateChoke::unchoke
|
||||||
}
|
}
|
||||||
|
|
||||||
if(round_ < 2) {
|
if(round_ < 2) {
|
||||||
std::for_each(peers.begin(), peers.end(),
|
std::for_each(std::begin(peers), std::end(peers),
|
||||||
std::mem_fn(&PeerEntry::disableOptUnchoking));
|
std::mem_fn(&PeerEntry::disableOptUnchoking));
|
||||||
if(r != peers.end()) {
|
if(r != std::end(peers)) {
|
||||||
std::random_shuffle(r, peers.end(),
|
std::shuffle(r, std::end(peers), *SimpleRandomizer::getInstance());
|
||||||
*SimpleRandomizer::getInstance());
|
|
||||||
(*r).getPeer()->optUnchoking(true);
|
(*r).getPeer()->optUnchoking(true);
|
||||||
A2_LOG_INFO(fmt("POU: %s", (*r).getPeer()->getIPAddress().c_str()));
|
A2_LOG_INFO(fmt("POU: %s", (*r).getPeer()->getIPAddress().c_str()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,6 @@ private:
|
||||||
bool recentUnchoking_;
|
bool recentUnchoking_;
|
||||||
int uploadSpeed_;
|
int uploadSpeed_;
|
||||||
|
|
||||||
const static time_t TIME_FRAME = 20;
|
|
||||||
public:
|
public:
|
||||||
PeerEntry(const std::shared_ptr<Peer>& peer);
|
PeerEntry(const std::shared_ptr<Peer>& peer);
|
||||||
PeerEntry(const PeerEntry& c);
|
PeerEntry(const PeerEntry& c);
|
||||||
|
|
|
@ -125,8 +125,8 @@ void BtSetup::setup(std::vector<std::unique_ptr<Command>>& commands,
|
||||||
commands.push_back(std::move(c));
|
commands.push_back(std::move(c));
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
auto c = make_unique<ActivePeerConnectionCommand>
|
auto c = make_unique<ActivePeerConnectionCommand>(
|
||||||
(e->newCUID(), requestGroup, e, metadataGetMode?2:10);
|
e->newCUID(), requestGroup, e, metadataGetMode ? 2_s : 10_s);
|
||||||
c->setBtRuntime(btRuntime);
|
c->setBtRuntime(btRuntime);
|
||||||
c->setPieceStorage(pieceStorage);
|
c->setPieceStorage(pieceStorage);
|
||||||
c->setPeerStorage(peerStorage);
|
c->setPeerStorage(peerStorage);
|
||||||
|
@ -158,8 +158,8 @@ void BtSetup::setup(std::vector<std::unique_ptr<Command>>& commands,
|
||||||
if(!metadataGetMode) {
|
if(!metadataGetMode) {
|
||||||
auto unionCri = make_unique<UnionSeedCriteria>();
|
auto unionCri = make_unique<UnionSeedCriteria>();
|
||||||
if(option->defined(PREF_SEED_TIME)) {
|
if(option->defined(PREF_SEED_TIME)) {
|
||||||
unionCri->addSeedCriteria(make_unique<TimeSeedCriteria>
|
unionCri->addSeedCriteria(make_unique<TimeSeedCriteria>(
|
||||||
(option->getAsInt(PREF_SEED_TIME)*60));
|
std::chrono::seconds(option->getAsInt(PREF_SEED_TIME) * 60)));
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
double ratio = option->getAsDouble(PREF_SEED_RATIO);
|
double ratio = option->getAsDouble(PREF_SEED_RATIO);
|
||||||
|
@ -271,10 +271,10 @@ void BtSetup::setup(std::vector<std::unique_ptr<Command>>& commands,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
time_t btStopTimeout = option->getAsInt(PREF_BT_STOP_TIMEOUT);
|
auto btStopTimeout = option->getAsInt(PREF_BT_STOP_TIMEOUT);
|
||||||
if(btStopTimeout > 0) {
|
if(btStopTimeout > 0) {
|
||||||
auto stopDownloadCommand = make_unique<BtStopDownloadCommand>
|
auto stopDownloadCommand = make_unique<BtStopDownloadCommand>
|
||||||
(e->newCUID(), requestGroup, e, btStopTimeout);
|
(e->newCUID(), requestGroup, e, std::chrono::seconds(btStopTimeout));
|
||||||
stopDownloadCommand->setBtRuntime(btRuntime);
|
stopDownloadCommand->setBtRuntime(btRuntime);
|
||||||
stopDownloadCommand->setPieceStorage(pieceStorage);
|
stopDownloadCommand->setPieceStorage(pieceStorage);
|
||||||
commands.push_back(std::move(stopDownloadCommand));
|
commands.push_back(std::move(stopDownloadCommand));
|
||||||
|
|
|
@ -50,10 +50,10 @@ BtStopDownloadCommand::BtStopDownloadCommand
|
||||||
(cuid_t cuid,
|
(cuid_t cuid,
|
||||||
RequestGroup* requestGroup,
|
RequestGroup* requestGroup,
|
||||||
DownloadEngine* e,
|
DownloadEngine* e,
|
||||||
time_t timeout)
|
std::chrono::seconds timeout)
|
||||||
: TimeBasedCommand(cuid, e, 1),
|
: TimeBasedCommand(cuid, e, 1_s),
|
||||||
requestGroup_(requestGroup),
|
requestGroup_(requestGroup),
|
||||||
timeout_(timeout)
|
timeout_(std::move(timeout))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void BtStopDownloadCommand::preProcess()
|
void BtStopDownloadCommand::preProcess()
|
||||||
|
@ -66,7 +66,7 @@ void BtStopDownloadCommand::preProcess()
|
||||||
" --bt-stop-timeout option."),
|
" --bt-stop-timeout option."),
|
||||||
GroupId::toHex(requestGroup_->getGID()).c_str()));
|
GroupId::toHex(requestGroup_->getGID()).c_str()));
|
||||||
requestGroup_->setForceHaltRequested(true);
|
requestGroup_->setForceHaltRequested(true);
|
||||||
getDownloadEngine()->setRefreshInterval(0);
|
getDownloadEngine()->setRefreshInterval(std::chrono::milliseconds(0));
|
||||||
enableExit();
|
enableExit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ class BtStopDownloadCommand:public TimeBasedCommand {
|
||||||
private:
|
private:
|
||||||
RequestGroup* requestGroup_;
|
RequestGroup* requestGroup_;
|
||||||
|
|
||||||
time_t timeout_;
|
std::chrono::seconds timeout_;
|
||||||
|
|
||||||
Timer checkPoint_;
|
Timer checkPoint_;
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ public:
|
||||||
(cuid_t cuid,
|
(cuid_t cuid,
|
||||||
RequestGroup* requestGroup,
|
RequestGroup* requestGroup,
|
||||||
DownloadEngine* e,
|
DownloadEngine* e,
|
||||||
time_t timeout);
|
std::chrono::seconds timeout);
|
||||||
|
|
||||||
virtual void preProcess() CXX11_OVERRIDE;
|
virtual void preProcess() CXX11_OVERRIDE;
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,8 @@
|
||||||
#include "DiskWriter.h"
|
#include "DiskWriter.h"
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
#include "a2functional.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
class ByteArrayDiskWriter : public DiskWriter {
|
class ByteArrayDiskWriter : public DiskWriter {
|
||||||
|
@ -46,7 +48,7 @@ private:
|
||||||
size_t maxLength_;
|
size_t maxLength_;
|
||||||
void clear();
|
void clear();
|
||||||
public:
|
public:
|
||||||
ByteArrayDiskWriter(size_t maxLength = 5*1024*1024);
|
ByteArrayDiskWriter(size_t maxLength = 5_m);
|
||||||
virtual ~ByteArrayDiskWriter();
|
virtual ~ByteArrayDiskWriter();
|
||||||
|
|
||||||
virtual void initAndOpenFile(int64_t totalLength = 0) CXX11_OVERRIDE;
|
virtual void initAndOpenFile(int64_t totalLength = 0) CXX11_OVERRIDE;
|
||||||
|
|
|
@ -82,7 +82,11 @@ ChecksumCheckIntegrityEntry::onDownloadIncomplete
|
||||||
make_unique<StreamFileAllocationEntry>
|
make_unique<StreamFileAllocationEntry>
|
||||||
(getRequestGroup(), popNextCommand()),
|
(getRequestGroup(), popNextCommand()),
|
||||||
e);
|
e);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we don't redownload, set error code to indicate checksum error
|
||||||
|
getRequestGroup()->setLastErrorCode(error_code::CHECKSUM_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
|
@ -57,7 +57,7 @@ ConnectCommand::ConnectCommand(cuid_t cuid,
|
||||||
: AbstractCommand(cuid, req, fileEntry, requestGroup, e, s),
|
: AbstractCommand(cuid, req, fileEntry, requestGroup, e, s),
|
||||||
proxyRequest_(proxyRequest)
|
proxyRequest_(proxyRequest)
|
||||||
{
|
{
|
||||||
setTimeout(getOption()->getAsInt(PREF_CONNECT_TIMEOUT));
|
setTimeout(std::chrono::seconds(getOption()->getAsInt(PREF_CONNECT_TIMEOUT)));
|
||||||
disableReadCheckSocket();
|
disableReadCheckSocket();
|
||||||
setWriteCheckSocket(getSocket());
|
setWriteCheckSocket(getSocket());
|
||||||
}
|
}
|
||||||
|
|
|
@ -265,10 +265,10 @@ void printProgressSummary(const RequestGroupList& groups, size_t cols,
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
ConsoleStatCalc::ConsoleStatCalc(time_t summaryInterval,
|
ConsoleStatCalc::ConsoleStatCalc(std::chrono::seconds summaryInterval,
|
||||||
bool colorOutput,
|
bool colorOutput,
|
||||||
bool humanReadable):
|
bool humanReadable):
|
||||||
summaryInterval_(summaryInterval),
|
summaryInterval_(std::move(summaryInterval)),
|
||||||
readoutVisibility_(true),
|
readoutVisibility_(true),
|
||||||
truncate_(true),
|
truncate_(true),
|
||||||
#ifdef __MINGW32__
|
#ifdef __MINGW32__
|
||||||
|
@ -288,7 +288,8 @@ ConsoleStatCalc::ConsoleStatCalc(time_t summaryInterval,
|
||||||
void
|
void
|
||||||
ConsoleStatCalc::calculateStat(const DownloadEngine* e)
|
ConsoleStatCalc::calculateStat(const DownloadEngine* e)
|
||||||
{
|
{
|
||||||
if(cp_.differenceInMillis(global::wallclock())+A2_DELTA_MILLIS < 1000) {
|
if(cp_.difference(global::wallclock()) + A2_DELTA_MILLIS <
|
||||||
|
std::chrono::milliseconds(1000)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cp_ = global::wallclock();
|
cp_ = global::wallclock();
|
||||||
|
@ -317,9 +318,9 @@ ConsoleStatCalc::calculateStat(const DownloadEngine* e)
|
||||||
}
|
}
|
||||||
ColorizedStream o;
|
ColorizedStream o;
|
||||||
if(e->getRequestGroupMan()->countRequestGroup() > 0) {
|
if(e->getRequestGroupMan()->countRequestGroup() > 0) {
|
||||||
if((summaryInterval_ > 0) &&
|
if((summaryInterval_ > 0_s) &&
|
||||||
lastSummaryNotified_.differenceInMillis(global::wallclock())+
|
lastSummaryNotified_.difference(global::wallclock())+
|
||||||
A2_DELTA_MILLIS >= summaryInterval_*1000) {
|
A2_DELTA_MILLIS >= summaryInterval_) {
|
||||||
lastSummaryNotified_ = global::wallclock();
|
lastSummaryNotified_ = global::wallclock();
|
||||||
printProgressSummary(e->getRequestGroupMan()->getRequestGroups(), cols, e,
|
printProgressSummary(e->getRequestGroupMan()->getRequestGroups(), cols, e,
|
||||||
sizeFormatter);
|
sizeFormatter);
|
||||||
|
|
|
@ -61,7 +61,7 @@ private:
|
||||||
|
|
||||||
Timer lastSummaryNotified_;
|
Timer lastSummaryNotified_;
|
||||||
|
|
||||||
time_t summaryInterval_;
|
std::chrono::seconds summaryInterval_;
|
||||||
|
|
||||||
std::unique_ptr<SizeFormatter> sizeFormatter_;
|
std::unique_ptr<SizeFormatter> sizeFormatter_;
|
||||||
bool readoutVisibility_;
|
bool readoutVisibility_;
|
||||||
|
@ -69,7 +69,7 @@ private:
|
||||||
bool isTTY_;
|
bool isTTY_;
|
||||||
bool colorOutput_;
|
bool colorOutput_;
|
||||||
public:
|
public:
|
||||||
ConsoleStatCalc(time_t summaryInterval, bool colorOutput = true,
|
ConsoleStatCalc(std::chrono::seconds summaryInterval, bool colorOutput = true,
|
||||||
bool humanReadable = true);
|
bool humanReadable = true);
|
||||||
|
|
||||||
virtual ~ConsoleStatCalc() {}
|
virtual ~ConsoleStatCalc() {}
|
||||||
|
|
|
@ -229,6 +229,11 @@ Context::Context(bool standalone,
|
||||||
std::string iface = op->get(PREF_INTERFACE);
|
std::string iface = op->get(PREF_INTERFACE);
|
||||||
SocketCore::bindAddress(iface);
|
SocketCore::bindAddress(iface);
|
||||||
}
|
}
|
||||||
|
// Bind multiple interfaces
|
||||||
|
if(!op->get(PREF_MULTIPLE_INTERFACE).empty() && op->get(PREF_INTERFACE).empty()) {
|
||||||
|
std::string ifaces = op->get(PREF_MULTIPLE_INTERFACE);
|
||||||
|
SocketCore::bindAllAddress(ifaces);
|
||||||
|
}
|
||||||
std::vector<std::shared_ptr<RequestGroup> > requestGroups;
|
std::vector<std::shared_ptr<RequestGroup> > requestGroups;
|
||||||
std::shared_ptr<UriListParser> uriListParser;
|
std::shared_ptr<UriListParser> uriListParser;
|
||||||
#ifdef ENABLE_BITTORRENT
|
#ifdef ENABLE_BITTORRENT
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
#include "SocketRecvBuffer.h"
|
#include "SocketRecvBuffer.h"
|
||||||
#include "LogFactory.h"
|
#include "LogFactory.h"
|
||||||
#include "wallclock.h"
|
#include "wallclock.h"
|
||||||
|
#include "DownloadFailureException.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
@ -94,6 +95,13 @@ bool CreateRequestCommand::executeInternal()
|
||||||
if(getSegmentMan()) {
|
if(getSegmentMan()) {
|
||||||
getSegmentMan()->ignoreSegmentFor(getFileEntry());
|
getSegmentMan()->ignoreSegmentFor(getFileEntry());
|
||||||
}
|
}
|
||||||
|
if(getOption()->getAsBool(PREF_DRY_RUN)) {
|
||||||
|
// For dry run mode, just throwing DlAbortEx makes infinite
|
||||||
|
// loop, since we don't have SegmentMan, and we cannot tell all
|
||||||
|
// hopes were abandoned.
|
||||||
|
throw DOWNLOAD_FAILURE_EXCEPTION2("No URI available.",
|
||||||
|
getRequestGroup()->getLastErrorCode());
|
||||||
|
}
|
||||||
// In this case, the error might be already set in RequestGroup,
|
// In this case, the error might be already set in RequestGroup,
|
||||||
// so use it here.
|
// so use it here.
|
||||||
throw DL_ABORT_EX2("No URI available.",
|
throw DL_ABORT_EX2("No URI available.",
|
||||||
|
|
|
@ -57,8 +57,8 @@
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
DHTAutoSaveCommand::DHTAutoSaveCommand
|
DHTAutoSaveCommand::DHTAutoSaveCommand
|
||||||
(cuid_t cuid, DownloadEngine* e, int family, time_t interval)
|
(cuid_t cuid, DownloadEngine* e, int family, std::chrono::seconds interval)
|
||||||
: TimeBasedCommand{cuid, e, interval},
|
: TimeBasedCommand{cuid, e, std::move(interval)},
|
||||||
family_{family},
|
family_{family},
|
||||||
routingTable_{nullptr}
|
routingTable_{nullptr}
|
||||||
{}
|
{}
|
||||||
|
|
|
@ -56,7 +56,7 @@ private:
|
||||||
void save();
|
void save();
|
||||||
public:
|
public:
|
||||||
DHTAutoSaveCommand
|
DHTAutoSaveCommand
|
||||||
(cuid_t cuid, DownloadEngine* e, int family, time_t interval);
|
(cuid_t cuid, DownloadEngine* e, int family, std::chrono::seconds interval);
|
||||||
|
|
||||||
virtual ~DHTAutoSaveCommand();
|
virtual ~DHTAutoSaveCommand();
|
||||||
|
|
||||||
|
|
|
@ -43,8 +43,8 @@
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
DHTBucketRefreshCommand::DHTBucketRefreshCommand
|
DHTBucketRefreshCommand::DHTBucketRefreshCommand
|
||||||
(cuid_t cuid, DownloadEngine* e, time_t interval)
|
(cuid_t cuid, DownloadEngine* e, std::chrono::seconds interval)
|
||||||
: TimeBasedCommand{cuid, e, interval},
|
: TimeBasedCommand{cuid, e, std::move(interval)},
|
||||||
routingTable_{nullptr},
|
routingTable_{nullptr},
|
||||||
taskQueue_{nullptr},
|
taskQueue_{nullptr},
|
||||||
taskFactory_{nullptr}
|
taskFactory_{nullptr}
|
||||||
|
|
|
@ -53,7 +53,8 @@ private:
|
||||||
|
|
||||||
DHTTaskFactory* taskFactory_;
|
DHTTaskFactory* taskFactory_;
|
||||||
public:
|
public:
|
||||||
DHTBucketRefreshCommand(cuid_t cuid, DownloadEngine* e, time_t interval);
|
DHTBucketRefreshCommand(cuid_t cuid, DownloadEngine* e,
|
||||||
|
std::chrono::seconds interval);
|
||||||
|
|
||||||
virtual ~DHTBucketRefreshCommand();
|
virtual ~DHTBucketRefreshCommand();
|
||||||
|
|
||||||
|
|
|
@ -61,8 +61,7 @@ bool DHTConnectionImpl::bind
|
||||||
while(sgl.hasNext()) {
|
while(sgl.hasNext()) {
|
||||||
ports.push_back(sgl.next());
|
ports.push_back(sgl.next());
|
||||||
}
|
}
|
||||||
std::random_shuffle(ports.begin(), ports.end(),
|
std::shuffle(ports.begin(), ports.end(), *SimpleRandomizer::getInstance());
|
||||||
*SimpleRandomizer::getInstance());
|
|
||||||
for (const auto& p : ports) {
|
for (const auto& p : ports) {
|
||||||
port = p;
|
port = p;
|
||||||
if(bind(port, addr)) {
|
if(bind(port, addr)) {
|
||||||
|
|
|
@ -35,31 +35,37 @@
|
||||||
#ifndef D_DHT_CONSTANTS_H
|
#ifndef D_DHT_CONSTANTS_H
|
||||||
#define D_DHT_CONSTANTS_H
|
#define D_DHT_CONSTANTS_H
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "TimerA2.h"
|
||||||
|
#include "a2functional.h"
|
||||||
|
|
||||||
|
namespace aria2 {
|
||||||
|
|
||||||
// Increment this if major improvements or bug fixes are made in DHT
|
// Increment this if major improvements or bug fixes are made in DHT
|
||||||
// code. This is 2 bytes unsigned integer.
|
// code. This is 2 bytes unsigned integer.
|
||||||
#define DHT_VERSION 3U
|
constexpr uint16_t DHT_VERSION = 3U;
|
||||||
|
|
||||||
#define DHT_ID_LENGTH 20
|
constexpr size_t DHT_ID_LENGTH = 20;
|
||||||
|
|
||||||
#define DHT_TRANSACTION_ID_LENGTH 2
|
constexpr size_t DHT_TRANSACTION_ID_LENGTH = 2;
|
||||||
|
|
||||||
#define DHT_TOKEN_LENGTH 4
|
|
||||||
|
|
||||||
// See --dht-message-timeout option.
|
// See --dht-message-timeout option.
|
||||||
#define DHT_MESSAGE_TIMEOUT 10
|
constexpr auto DHT_MESSAGE_TIMEOUT = 10_s;
|
||||||
|
|
||||||
#define DHT_NODE_CONTACT_INTERVAL (15*60)
|
constexpr auto DHT_NODE_CONTACT_INTERVAL = 15_min;
|
||||||
|
|
||||||
#define DHT_BUCKET_REFRESH_INTERVAL (15*60)
|
constexpr auto DHT_BUCKET_REFRESH_INTERVAL = 15_min;
|
||||||
|
|
||||||
#define DHT_BUCKET_REFRESH_CHECK_INTERVAL (5*60)
|
constexpr auto DHT_BUCKET_REFRESH_CHECK_INTERVAL = 5_min;
|
||||||
|
|
||||||
#define DHT_PEER_ANNOUNCE_PURGE_INTERVAL (30*60)
|
constexpr auto DHT_PEER_ANNOUNCE_PURGE_INTERVAL = 30_min;
|
||||||
|
|
||||||
#define DHT_PEER_ANNOUNCE_INTERVAL (15*60)
|
constexpr auto DHT_PEER_ANNOUNCE_INTERVAL = 15_min;
|
||||||
|
|
||||||
#define DHT_PEER_ANNOUNCE_CHECK_INTERVAL (5*60)
|
constexpr auto DHT_PEER_ANNOUNCE_CHECK_INTERVAL = 5_min;
|
||||||
|
|
||||||
#define DHT_TOKEN_UPDATE_INTERVAL (10*60)
|
constexpr auto DHT_TOKEN_UPDATE_INTERVAL = 10_min;
|
||||||
|
|
||||||
|
} // namespace aria2
|
||||||
|
|
||||||
#endif // D_DHT_CONSTANTS_H
|
#endif // D_DHT_CONSTANTS_H
|
||||||
|
|
|
@ -55,13 +55,13 @@ namespace aria2 {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
const time_t GET_PEER_INTERVAL = (15*60);
|
constexpr auto GET_PEER_INTERVAL = 15_min;
|
||||||
// Interval when the size of peer list is low.
|
// Interval when the size of peer list is low.
|
||||||
const time_t GET_PEER_INTERVAL_LOW = (5*60);
|
constexpr auto GET_PEER_INTERVAL_LOW = 5_min;
|
||||||
// Interval when the peer list is empty.
|
// Interval when the peer list is empty.
|
||||||
const time_t GET_PEER_INTERVAL_ZERO = 60;
|
constexpr auto GET_PEER_INTERVAL_ZERO = 1_min;
|
||||||
// Interval for retry.
|
// Interval for retry.
|
||||||
const time_t GET_PEER_INTERVAL_RETRY = 5;
|
constexpr auto GET_PEER_INTERVAL_RETRY = 5_s;
|
||||||
// Maximum retries. Try more than 5 to drop bad node.
|
// Maximum retries. Try more than 5 to drop bad node.
|
||||||
const int MAX_RETRIES = 10;
|
const int MAX_RETRIES = 10;
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ DHTGetPeersCommand::DHTGetPeersCommand
|
||||||
taskQueue_{nullptr},
|
taskQueue_{nullptr},
|
||||||
taskFactory_{nullptr},
|
taskFactory_{nullptr},
|
||||||
numRetry_{0},
|
numRetry_{0},
|
||||||
lastGetPeerTime_{0}
|
lastGetPeerTime_{Timer::zero()}
|
||||||
{
|
{
|
||||||
requestGroup_->increaseNumCommand();
|
requestGroup_->increaseNumCommand();
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,7 @@ bool DHTGetPeersCommand::execute()
|
||||||
if(btRuntime_->isHalt()) {
|
if(btRuntime_->isHalt()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
time_t elapsed = lastGetPeerTime_.difference(global::wallclock());
|
auto elapsed = lastGetPeerTime_.difference(global::wallclock());
|
||||||
if(!task_ &&
|
if(!task_ &&
|
||||||
(elapsed >= GET_PEER_INTERVAL ||
|
(elapsed >= GET_PEER_INTERVAL ||
|
||||||
(((btRuntime_->lessThanMinPeers() &&
|
(((btRuntime_->lessThanMinPeers() &&
|
||||||
|
|
|
@ -33,6 +33,9 @@
|
||||||
*/
|
*/
|
||||||
/* copyright --> */
|
/* copyright --> */
|
||||||
#include "DHTInteractionCommand.h"
|
#include "DHTInteractionCommand.h"
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
|
||||||
#include "DownloadEngine.h"
|
#include "DownloadEngine.h"
|
||||||
#include "RecoverableException.h"
|
#include "RecoverableException.h"
|
||||||
#include "DHTMessageDispatcher.h"
|
#include "DHTMessageDispatcher.h"
|
||||||
|
@ -100,10 +103,10 @@ bool DHTInteractionCommand::execute()
|
||||||
|
|
||||||
std::string remoteAddr;
|
std::string remoteAddr;
|
||||||
uint16_t remotePort;
|
uint16_t remotePort;
|
||||||
unsigned char data[64*1024];
|
std::array<unsigned char, 64_k> data;
|
||||||
try {
|
try {
|
||||||
while(1) {
|
while(1) {
|
||||||
ssize_t length = connection_->receiveMessage(data, sizeof(data),
|
ssize_t length = connection_->receiveMessage(data.data(), data.size(),
|
||||||
remoteAddr, remotePort);
|
remoteAddr, remotePort);
|
||||||
if(length <= 0) {
|
if(length <= 0) {
|
||||||
break;
|
break;
|
||||||
|
@ -111,11 +114,11 @@ bool DHTInteractionCommand::execute()
|
||||||
if(data[0] == 'd') {
|
if(data[0] == 'd') {
|
||||||
// udp tracker response does not start with 'd', so assume
|
// udp tracker response does not start with 'd', so assume
|
||||||
// this message belongs to DHT. nothrow.
|
// this message belongs to DHT. nothrow.
|
||||||
receiver_->receiveMessage(remoteAddr, remotePort, data, length);
|
receiver_->receiveMessage(remoteAddr, remotePort, data.data(), length);
|
||||||
} else {
|
} else {
|
||||||
// this may be udp tracker response. nothrow.
|
// this may be udp tracker response. nothrow.
|
||||||
udpTrackerClient_->receiveReply(data, length, remoteAddr, remotePort,
|
udpTrackerClient_->receiveReply(data.data(), length, remoteAddr,
|
||||||
global::wallclock());
|
remotePort, global::wallclock());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch(RecoverableException& e) {
|
} catch(RecoverableException& e) {
|
||||||
|
@ -126,7 +129,7 @@ bool DHTInteractionCommand::execute()
|
||||||
dispatcher_->sendMessages();
|
dispatcher_->sendMessages();
|
||||||
while(!udpTrackerClient_->getPendingRequests().empty()) {
|
while(!udpTrackerClient_->getPendingRequests().empty()) {
|
||||||
// no throw
|
// no throw
|
||||||
ssize_t length = udpTrackerClient_->createRequest(data, sizeof(data),
|
ssize_t length = udpTrackerClient_->createRequest(data.data(), data.size(),
|
||||||
remoteAddr, remotePort,
|
remoteAddr, remotePort,
|
||||||
global::wallclock());
|
global::wallclock());
|
||||||
if(length == -1) {
|
if(length == -1) {
|
||||||
|
@ -134,7 +137,7 @@ bool DHTInteractionCommand::execute()
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
// throw
|
// throw
|
||||||
connection_->sendMessage(data, length, remoteAddr, remotePort);
|
connection_->sendMessage(data.data(), length, remoteAddr, remotePort);
|
||||||
udpTrackerClient_->requestSent(global::wallclock());
|
udpTrackerClient_->requestSent(global::wallclock());
|
||||||
} catch(RecoverableException& e) {
|
} catch(RecoverableException& e) {
|
||||||
A2_LOG_INFO_EX("Exception thrown while sending UDP tracker request.", e);
|
A2_LOG_INFO_EX("Exception thrown while sending UDP tracker request.", e);
|
||||||
|
|
|
@ -52,7 +52,7 @@ public:
|
||||||
|
|
||||||
virtual void
|
virtual void
|
||||||
addMessageToQueue(std::unique_ptr<DHTMessage> message,
|
addMessageToQueue(std::unique_ptr<DHTMessage> message,
|
||||||
time_t timeout,
|
std::chrono::seconds timeout,
|
||||||
std::unique_ptr<DHTMessageCallback> callback =
|
std::unique_ptr<DHTMessageCallback> callback =
|
||||||
std::unique_ptr<DHTMessageCallback>{}) = 0;
|
std::unique_ptr<DHTMessageCallback>{}) = 0;
|
||||||
|
|
||||||
|
|
|
@ -56,11 +56,11 @@ DHTMessageDispatcherImpl::DHTMessageDispatcherImpl
|
||||||
void
|
void
|
||||||
DHTMessageDispatcherImpl::addMessageToQueue
|
DHTMessageDispatcherImpl::addMessageToQueue
|
||||||
(std::unique_ptr<DHTMessage> message,
|
(std::unique_ptr<DHTMessage> message,
|
||||||
time_t timeout,
|
std::chrono::seconds timeout,
|
||||||
std::unique_ptr<DHTMessageCallback> callback)
|
std::unique_ptr<DHTMessageCallback> callback)
|
||||||
{
|
{
|
||||||
messageQueue_.push_back(make_unique<DHTMessageEntry>
|
messageQueue_.push_back(make_unique<DHTMessageEntry>(
|
||||||
(std::move(message), timeout, std::move(callback)));
|
std::move(message), std::move(timeout), std::move(callback)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -92,7 +92,7 @@ bool DHTMessageDispatcherImpl::sendMessage(DHTMessageEntry* entry)
|
||||||
// DHTTask(such as DHTAbstractNodeLookupTask) don't finish
|
// DHTTask(such as DHTAbstractNodeLookupTask) don't finish
|
||||||
// forever.
|
// forever.
|
||||||
if(!entry->message->isReply()) {
|
if(!entry->message->isReply()) {
|
||||||
tracker_->addMessage(entry->message.get(), 0,
|
tracker_->addMessage(entry->message.get(), 0_s,
|
||||||
std::move(entry->callback));
|
std::move(entry->callback));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue