Disk ARchive 2.8.0
Full featured and portable backup and archiving tool
Loading...
Searching...
No Matches
fichier_libcurl.hpp
Go to the documentation of this file.
1/*********************************************************************/
2// dar - disk archive - a backup/restoration program
3// Copyright (C) 2002-2025 Denis Corbin
4//
5// This program is free software; you can redistribute it and/or
6// modify it under the terms of the GNU General Public License
7// as published by the Free Software Foundation; either version 2
8// of the License, or (at your option) any later version.
9//
10// This program is distributed in the hope that it will be useful,
11// but WITHOUT ANY WARRANTY; without even the implied warranty of
12// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13// GNU General Public License for more details.
14//
15// You should have received a copy of the GNU General Public License
16// along with this program; if not, write to the Free Software
17// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18//
19// to contact the author, see the AUTHOR file
20/*********************************************************************/
21
26
27#ifndef FICHIER_LIBCURL_HPP
28#define FICHIER_LIBCURL_HPP
29
30
31#include "../my_config.h"
32
33extern "C"
34{
35#if LIBCURL_AVAILABLE
36#if HAVE_CURL_CURL_H
37#include <curl/curl.h>
38#endif
39#endif
40} // end extern "C"
41
42#include <string>
43#ifdef LIBTHREADAR_AVAILABLE
44#include <libthreadar/libthreadar.hpp>
45#endif
46#include "integers.hpp"
47#include "user_interaction.hpp"
48#include "fichier_global.hpp"
51
52namespace libdar
53{
54
57
58#if defined ( LIBCURL_AVAILABLE ) && defined ( LIBTHREADAR_AVAILABLE )
59
61
62 class fichier_libcurl : public fichier_global, protected libthreadar::thread
63 {
64 public:
65
67 fichier_libcurl(const std::shared_ptr<user_interaction> & dialog,
68 const std::string & chemin,
69 remote_entrepot_type proto,
70 const std::shared_ptr<mycurl_easyhandle_node> & handle,
71 gf_mode m,
72 U_I waiting,
73 bool force_permission,
74 U_I permission,
75 bool erase);
76
78
80 fichier_libcurl(const fichier_libcurl & ref) = delete;
81
83 fichier_libcurl(fichier_libcurl && ref) = delete;
84
87 fichier_libcurl & operator = (const fichier_libcurl & ref) = delete;
88
90 fichier_libcurl & operator = (fichier_libcurl && ref) = delete;
91
93 ~fichier_libcurl() noexcept;
94
96 virtual void change_permission(U_I perm) override;
97
99 virtual void change_ownership(const std::string & user, const std::string & group) override
100 { throw Efeature(gettext("user/group ownership not supported for this repository")); }; // not supported
101
103 virtual infinint get_size() const override;
104
106 virtual void fadvise(advise adv) const override {}; // not supported and ignored
107
108 // inherited from generic_file
109 virtual bool skippable(skippability direction, const infinint & amount) override;
110 virtual bool skip(const infinint & pos) override;
111 virtual bool skip_to_eof() override;
112 virtual bool skip_relative(S_I x) override;
113 virtual bool truncatable(const infinint & pos) const override { return pos == get_position(); };
114 virtual infinint get_position() const override { return current_offset; };
115
116 protected:
117 // inherited from generic_file grand-parent class
118 virtual void inherited_read_ahead(const infinint & amount) override;
119 virtual void inherited_truncate(const infinint & pos) override;
120 virtual void inherited_sync_write() override;
121 virtual void inherited_flush_read() override;
122 virtual void inherited_terminate() override;
123
124 // inherited from fichier_global parent class
125 virtual U_I fichier_global_inherited_write(const char *a, U_I size) override;
126 virtual bool fichier_global_inherited_read(char *a, U_I size, U_I & read, std::string & message) override;
127
128 // inherited from thread
129 virtual void inherited_run() override;
130
131 private:
132 static const U_I tampon_size = CURL_MAX_WRITE_SIZE;
133
135 //
136 // implementation internals
137 //
139 // the object has two modes:
140 // - meta data mode (skip, get_position() and other non read/write operations)
141 // - data mode (read or write operations)
142 //
143 // in metadata mode each method is a simple code execution (no subthread, no callback)
144 //
145 // in data mode, a subthread is used to interact with libcurl. It sends or receives
146 // data through the interthread pipe. A callback is occasionally run by libcurl in this
147 // subthread.
148 // in read mode, the subthread is run only if the interthread is empty. the subthread may
149 // survive the inherited_read call and may suspend on writing data to interthread being full
150 // - "subthread_net_offset" is updated by the callback and read by the subthread when
151 // libcurl has returned it keeps trace of the amount of data sent to interthread.
152 // - "network_block" is set by the main thread to define the amount of data to be fetched. It
153 // it used to setup libcurl and is read by the subthread for control/validation purposes
154
155 bool end_data_mode;
156 bool sub_is_dying;
157 bool sync_write_asked;
158 bool weof;
159 std::shared_ptr<mycurl_easyhandle_node> ehandle;
160 bool metadatamode;
161 infinint current_offset;
162 bool has_maxpos;
163 infinint maxpos;
164 bool append_write;
165 U_I meta_inbuf;
166 U_I wait_delay;
167 infinint network_block;
168 infinint subthread_net_offset;
169 infinint subthread_cur_offset;
170 libthreadar::fast_tampon<char> interthread;
171 libthreadar::barrier synchronize;
172 remote_entrepot_type x_proto;
173
174 void set_range(const infinint & begin, const infinint & range_size);
175 void unset_range();
176 void switch_to_metadata(bool mode);
177 void run_thread();
178 void stop_thread();
179 void relaunch_thread(const infinint & block_size);
180 void initialize_subthread();
181 void finalize_subthread();
182 void set_subthread(U_I & needed_bytes);
183 bool still_data_to_write();
184
185 static size_t write_data_callback(char *buffer, size_t size, size_t nmemb, void *userp);
186 static size_t read_data_callback(char *bufptr, size_t size, size_t nitems, void *userp);
187 static size_t write_meta_callback(char *buffer, size_t size, size_t nmemb, void *userp);
188 static size_t read_meta_callback(char *bufptr, size_t size, size_t nitems, void *userp);
189 };
190
191
192#endif
194
195} // end of namespace
196
197#endif
class fichier_global definition. This class is a pure virtual class class fichier_global is an abstra...
remote_entrepot_type
type of entrepot to create
are defined here basic integer types that tend to be portable
include macro defined by the configure script and some specific additional ones
used to optimize session creation done by libcurl
libdar namespace encapsulate all libdar symbols
Definition archive.hpp:47
Libdar API to create entrepot objects.
defines the interaction interface between libdar and users.