netrocks: add deinit connection command; add $SINGULAR env variable to allow shared...
[far2l.git] / NetRocks / src / Protocol / WebDAV / ProtocolWebDAV.h
blob1f0a35c9083461ed292f7bf381e0eb065e372d7b
1 #pragma once
2 #include <memory>
3 #include <string>
4 #include <map>
5 #include <set>
6 #include <neon/ne_session.h>
7 #include <neon/ne_request.h>
8 #include "../Protocol.h"
9 #include "../ProtocolInitDeinitCmd.h"
11 struct DavConnection
13 ne_session *sess = nullptr;
15 DavConnection() = default;
17 ~DavConnection()
19 if (sess != nullptr) {
20 ne_session_destroy(sess);
24 private:
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);
41 public:
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);