27 #ifndef FICHIER_LIBCURL_HPP
28 #define FICHIER_LIBCURL_HPP
31 #include "../my_config.h"
37 #include <curl/curl.h>
43 #ifdef LIBTHREADAR_AVAILABLE
44 #include <libthreadar/libthreadar.hpp>
58 #if defined ( LIBCURL_AVAILABLE ) && defined ( LIBTHREADAR_AVAILABLE )
62 class fichier_libcurl :
public fichier_global,
protected libthreadar::thread
67 fichier_libcurl(
const std::shared_ptr<user_interaction> & dialog,
68 const std::string & chemin,
70 mycurl_shared_handle && handle,
73 bool force_permission,
80 fichier_libcurl(
const fichier_libcurl & ref) =
delete;
83 fichier_libcurl(fichier_libcurl && ref) =
delete;
87 fichier_libcurl & operator = (
const fichier_libcurl & ref) =
delete;
90 fichier_libcurl & operator = (fichier_libcurl && ref) =
delete;
93 ~fichier_libcurl() noexcept { detruit(); };
96 virtual void change_permission(U_I perm)
override;
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")); };
103 virtual infinint get_size()
const override;
106 virtual void fadvise(advise adv)
const override {};
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 infinint get_position()
const override {
return current_offset; };
117 virtual void inherited_read_ahead(
const infinint & amount)
override;
118 virtual void inherited_sync_write()
override;
119 virtual void inherited_flush_read()
override;
120 virtual void inherited_terminate()
override;
123 virtual U_I fichier_global_inherited_write(
const char *a, U_I size)
override;
124 virtual bool fichier_global_inherited_read(
char *a, U_I size, U_I & read, std::string & message)
override;
127 virtual void inherited_run()
override;
130 static const U_I tampon_size = CURL_MAX_WRITE_SIZE;
155 mycurl_shared_handle ehandle;
157 infinint current_offset;
161 char meta_tampon[tampon_size];
164 infinint network_block;
165 infinint subthread_net_offset;
166 infinint subthread_cur_offset;
167 libthreadar::fast_tampon<char> interthread;
168 libthreadar::barrier synchronize;
171 void set_range(
const infinint & begin,
const infinint & range_size);
173 void switch_to_metadata(
bool mode);
177 void relaunch_thread(
const infinint & block_size);
178 void initialize_subthread();
179 void finalize_subthread();
180 void set_subthread(U_I & needed_bytes);
182 static size_t write_data_callback(
char *buffer,
size_t size,
size_t nmemb,
void *userp);
183 static size_t read_data_callback(
char *bufptr,
size_t size,
size_t nitems,
void *userp);
184 static size_t write_meta_callback(
char *buffer,
size_t size,
size_t nmemb,
void *userp);
185 static size_t read_meta_callback(
char *bufptr,
size_t size,
size_t nitems,
void *userp);
195 extern void fichier_libcurl_check_wait_or_throw(
const std::shared_ptr<user_interaction> & dialog,
198 const std::string & err_context);