summaryrefslogtreecommitdiff
path: root/src/download_helper.h
blob: 151503e5d3abddcae3147da6b7a039df240ebe53 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/* <!-- copyright */
/*
 * aria2 - The high speed download utility
 *
 * Copyright (C) 2006 Tatsuhiro Tsujikawa
 *
 * 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
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 *
 * In addition, as a special exception, the copyright holders give
 * permission to link the code of portions of this program with the
 * OpenSSL library under certain conditions as described in each
 * individual source file, and distribute linked combinations
 * including the two.
 * You must obey the GNU General Public License in all respects
 * for all of the code used other than OpenSSL.  If you modify
 * file(s) with this exception, you may extend this exception to your
 * version of the file(s), but you are not obligated to do so.  If you
 * do not wish to do so, delete this exception statement from your
 * version.  If you delete this exception statement from all source
 * files in the program, then also delete it here.
 */
/* copyright --> */
#ifndef D_DOWNLOAD_HELPER_H
#define D_DOWNLOAD_HELPER_H

#include "common.h"

#include <string>
#include <vector>
#include <set>
#include <memory>

namespace aria2 {

class RequestGroup;
class Option;
class MetadataInfo;
class DownloadContext;
class UriListParser;
class ValueBase;
class GroupId;

#ifdef ENABLE_BITTORRENT
// Create RequestGroup object using torrent file specified by
// metaInfoUri, which is treated as local file path. If non-empty
// torrentData is specified, then it is used as a content of torrent
// file instead. If adjustAnnounceUri is true, announce URIs are
// adjusted using bittorrent::adjustAnnounceUri().  In this function,
// force-sequential is ignored.
void createRequestGroupForBitTorrent(
    std::vector<std::shared_ptr<RequestGroup>>& result,
    const std::shared_ptr<Option>& option, const std::vector<std::string>& uris,
    const std::string& metaInfoUri, const std::string& torrentData = "",
    bool adjustAnnounceUri = true);

// Create RequestGroup object using already decoded torrent metainfo
// structure.  If adjustAnnounceUri is true, announce URIs are
// adjusted using bittorrent::adjustAnnounceUri().  In this function,
// force-sequential is ignored.
void createRequestGroupForBitTorrent(
    std::vector<std::shared_ptr<RequestGroup>>& result,
    const std::shared_ptr<Option>& option, const std::vector<std::string>& uris,
    const std::string& metaInfoUri, const ValueBase* torrent,
    bool adjustAnnounceUri = true);

#endif // ENABLE_BITTORRENT

#ifdef ENABLE_METALINK
// Create RequestGroup objects using Metalink file specified by
// metalink-file option. If non-empty metalinkData is specified, it is
// used as a content of metalink file instead.
void createRequestGroupForMetalink(
    std::vector<std::shared_ptr<RequestGroup>>& result,
    const std::shared_ptr<Option>& option,
    const std::string& metalinkData = "");
#endif // ENABLE_METALINK

// Reads one entry from uriListParser and creates RequestGroups from
// it and store them in result. If the bad entry is found, this
// function just skips it and reads next entry. If at least one
// RequestGroup is created successfully, this function returns true
// and created RequestGroups are stored in result. If no RequestGroup
// is created and uriListParser reads all input, this function returns
// false. The option is used as a option template.
bool createRequestGroupFromUriListParser(
    std::vector<std::shared_ptr<RequestGroup>>& result, const Option* option,
    UriListParser* uriListParser);

// Creates UriListParser using given filename.  If filename is "-",
// then UriListParser is configured to read from standard input.
// Otherwise, this function first checks file denoted by filename
// exists.  If it does not exist, this function throws exception.
// This function returns std::shared_ptr<UriListParser> object if it
// succeeds.
std::shared_ptr<UriListParser> openUriListParser(const std::string& filename);

// Create RequestGroup objects from reading file specified by input-file option.
// If the value of input-file option is "-", stdin is used as a input source.
// Each line is treated as if it is provided in command-line argument.
// The additional out and dir options can be specified after each line of URIs.
// This optional line must start with white space(s).
void createRequestGroupForUriList(
    std::vector<std::shared_ptr<RequestGroup>>& result,
    const std::shared_ptr<Option>& option);

// Create RequestGroup object using provided uris.  If ignoreLocalPath
// is true, a path to torrent file and metalink file are ignored.  If
// throwOnError is true, exception will be thrown when Metalink
// Document or .torrent file cannot be parsed or unrecognized URI is
// given. If throwOnError is false, these errors are just logged as
// error.
void createRequestGroupForUri(
    std::vector<std::shared_ptr<RequestGroup>>& result,
    const std::shared_ptr<Option>& option, const std::vector<std::string>& uris,
    bool ignoreForceSequential = false, bool ignoreLocalPath = false,
    bool throwOnError = false);

template <typename InputIterator>
void setMetadataInfo(InputIterator first, InputIterator last,
                     const std::shared_ptr<MetadataInfo>& mi)
{
  for (; first != last; ++first) {
    (*first)->setMetadataInfo(mi);
  }
}

std::shared_ptr<MetadataInfo> createMetadataInfoFromFirstFileEntry(
    const std::shared_ptr<GroupId>& gid,
    const std::shared_ptr<DownloadContext>& dctx);

// Removes option value which is only effective at the first
// construction time.
void removeOneshotOption(const std::shared_ptr<Option>& option);

} // namespace aria2

#endif // D_DOWNLOAD_HELPER_H