6 #include <neon/ne_session.h>
7 #include <neon/ne_request.h>
8 #include "../Protocol.h"
9 #include "../ProtocolInitDeinitCmd.h"
13 ne_session
*sess
= nullptr;
15 DavConnection() = default;
19 if (sess
!= nullptr) {
20 ne_session_destroy(sess
);
25 DavConnection(const DavConnection
&) = delete;
28 class ProtocolWebDAV
: public IProtocol
30 std::unique_ptr
<ProtocolInitDeinitCmd
> _init_deinit_cmd
;
31 std::shared_ptr
<DavConnection
> _conn
;
32 std::string _useragent
;
33 std::string _username
, _password
;
34 std::string _proxy_username
, _proxy_password
;
35 std::string _known_server_identity
, _current_server_identity
;
37 static int sAuthCreds(void *userdata
, const char *realm
, int attempt
, char *username
, char *password
);
38 static int sProxyAuthCreds(void *userdata
, const char *realm
, int attempt
, char *username
, char *password
);
39 static int sVerifySsl(void *userdata
, int failures
, const ne_ssl_certificate
*cert
);
40 static void sCreateRequestHook(ne_request
*req
, void *userdata
, const char *method
, const char *requri
);
43 ProtocolWebDAV(const char *scheme
, const std::string
&host
, unsigned int port
,
44 const std::string
&username
, const std::string
&password
, const std::string
&protocol_options
);
45 virtual ~ProtocolWebDAV();
47 virtual mode_t
GetMode(const std::string
&path
, bool follow_symlink
= true);
48 virtual unsigned long long GetSize(const std::string
&path
, bool follow_symlink
= true);
49 virtual void GetInformation(FileInformation
&file_info
, const std::string
&path
, bool follow_symlink
= true);
51 virtual void FileDelete(const std::string
&path
);
52 virtual void DirectoryDelete(const std::string
&path
);
54 virtual void DirectoryCreate(const std::string
&path
, mode_t mode
);
55 virtual void Rename(const std::string
&path_old
, const std::string
&path_new
);
57 virtual void SetTimes(const std::string
&path
, const timespec
&access_time
, const timespec
&modification_time
);
58 virtual void SetMode(const std::string
&path
, mode_t mode
);
60 virtual void SymlinkCreate(const std::string
&link_path
, const std::string
&link_target
);
61 virtual void SymlinkQuery(const std::string
&link_path
, std::string
&link_target
);
63 virtual std::shared_ptr
<IDirectoryEnumer
> DirectoryEnum(const std::string
&path
);
64 virtual std::shared_ptr
<IFileReader
> FileGet(const std::string
&path
, unsigned long long resume_pos
= 0);
65 virtual std::shared_ptr
<IFileWriter
> FilePut(const std::string
&path
, mode_t mode
, unsigned long long size_hint
, unsigned long long resume_pos
= 0);