updated build system
	
		
			
	
		
	
	
		
	
		
			Some checks reported errors
		
		
	
	
		
			
				
	
				BlockStorage/repertory/pipeline/head Something is wrong with the build of this commit
				
			
		
		
	
	
				
					
				
			
		
			Some checks reported errors
		
		
	
	BlockStorage/repertory/pipeline/head Something is wrong with the build of this commit
				
			This commit is contained in:
		| @@ -125,662 +125,10 @@ smb_get_parent_path(std::string_view smb_path) -> std::string; | |||||||
| // INFO: has test | // INFO: has test | ||||||
| [[nodiscard]] auto smb_parent_is_same(std::string_view smb_path1, | [[nodiscard]] auto smb_parent_is_same(std::string_view smb_path1, | ||||||
|                                       std::string_view smb_path2) -> bool; |                                       std::string_view smb_path2) -> bool; | ||||||
| #endif // defined(PROJECT_ENABLE_LIBDSM) |  | ||||||
|  |  | ||||||
| class file final : public i_file { |  | ||||||
| public: |  | ||||||
|   // [[nodiscard]] static auto |  | ||||||
|   // attach_file(native_handle handle, |  | ||||||
|   //             bool read_only = false) -> fs_file_t; |  | ||||||
|  |  | ||||||
|   // INFO: has test |  | ||||||
|   [[nodiscard]] static auto open_file(std::string_view path, |  | ||||||
|                                       bool read_only = false) -> fs_file_t; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto open_file(std::wstring_view path, |  | ||||||
|                                       bool read_only = false) -> fs_file_t { |  | ||||||
|     return open_file(utils::string::to_utf8(path), read_only); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   // INFO: has test |  | ||||||
|   [[nodiscard]] static auto |  | ||||||
|   open_or_create_file(std::string_view path, |  | ||||||
|                       bool read_only = false) -> fs_file_t; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto |  | ||||||
|   open_or_create_file(std::wstring_view path, |  | ||||||
|                       bool read_only = false) -> fs_file_t { |  | ||||||
|     return open_or_create_file(utils::string::to_utf8(path), read_only); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|   file() noexcept = default; |  | ||||||
|  |  | ||||||
|   file(std::string_view path) |  | ||||||
|       : file_(nullptr), path_(utils::path::absolute(path)) {} |  | ||||||
|  |  | ||||||
|   file(std::wstring_view path) |  | ||||||
|       : file_(nullptr), |  | ||||||
|         path_(utils::path::absolute(utils::string::to_utf8(path))) {} |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|   file(file_t file_ptr, std::string_view path, bool read_only) |  | ||||||
|       : file_(std::move(file_ptr)), path_(path), read_only_(read_only) {} |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|   file(const file &) = delete; |  | ||||||
|  |  | ||||||
|   file(file &&move_file) noexcept |  | ||||||
|       : file_(std::move(move_file.file_)), |  | ||||||
|         path_(std::move(move_file.path_)), |  | ||||||
|         read_only_(move_file.read_only_) {} |  | ||||||
|  |  | ||||||
|   ~file() override { close(); } |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|   file_t file_; |  | ||||||
|   std::string path_; |  | ||||||
|   bool read_only_{false}; |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|   std::atomic_uint32_t read_buffer_size{65536U}; |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|   void open(); |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|   void close() override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto copy_to(std::string_view new_path, |  | ||||||
|                              bool overwrite) const -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto exists() const -> bool override; |  | ||||||
|  |  | ||||||
|   void flush() const override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_handle() const -> native_handle override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_path() const -> std::string override { return path_; } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_read_buffer_size() const -> std::uint32_t override { |  | ||||||
|     return read_buffer_size; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto is_read_only() const -> bool override { |  | ||||||
|     return read_only_; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto is_symlink() const -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto move_to(std::string_view new_path) -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto read(unsigned char *data, std::size_t to_read, |  | ||||||
|                           std::uint64_t offset, |  | ||||||
|                           std::size_t *total_read = nullptr) -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto remove() -> bool override; |  | ||||||
|  |  | ||||||
|   auto set_read_buffer_size(std::uint32_t size) -> std::uint32_t override { |  | ||||||
|     read_buffer_size = size; |  | ||||||
|     return read_buffer_size; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| #if defined(PROJECT_ENABLE_LIBSODIUM) |  | ||||||
|   [[nodiscard]] auto sha256() -> std::optional<std::string>; |  | ||||||
|  |  | ||||||
| #endif // defined(PROJECT_ENABLE_LIBSODIUM) |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto size() const -> std::optional<std::uint64_t> override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto truncate(std::size_t size) -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   write(const unsigned char *data, std::size_t to_write, std::size_t offset, |  | ||||||
|         std::size_t *total_written = nullptr) -> bool override; |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|   auto operator=(const file &) noexcept -> file & = delete; |  | ||||||
|  |  | ||||||
|   auto operator=(file &&move_file) noexcept -> file & { |  | ||||||
|     if (&move_file != this) { |  | ||||||
|       file_ = std::move(move_file.file_); |  | ||||||
|       path_ = std::move(move_file.path_); |  | ||||||
|       read_only_ = move_file.read_only_; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return *this; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] operator bool() const override { return file_ != nullptr; } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| #if defined(PROJECT_ENABLE_LIBSODIUM) && defined(PROJECT_ENABLE_BOOST) |  | ||||||
| class enc_file final : public i_file { |  | ||||||
| public: |  | ||||||
|   [[nodiscard]] static auto attach_file(fs_file_t file) -> fs_file_t; |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|   enc_file() noexcept = default; |  | ||||||
|  |  | ||||||
| protected: |  | ||||||
|   enc_file(fs_file_t file); |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|   enc_file(const enc_file &) = delete; |  | ||||||
|  |  | ||||||
|   enc_file(enc_file &&move_file) noexcept : file_(std::move(move_file.file_)) {} |  | ||||||
|  |  | ||||||
|   ~enc_file() override { close(); } |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|   fs_file_t file_; |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|   void close() override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto copy_to(std::string_view new_path, |  | ||||||
|                              bool overwrite) const -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto exists() const -> bool override { return file_->exists(); } |  | ||||||
|  |  | ||||||
|   void flush() const override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_handle() const -> native_handle override { |  | ||||||
|     return file_->get_handle(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_path() const -> std::string override { |  | ||||||
|     return file_->get_path(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_read_buffer_size() const -> std::uint32_t override { |  | ||||||
|     return file_->get_read_buffer_size(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   get_time(time_type type) const -> std::optional<std::uint64_t> override { |  | ||||||
|     return file_->get_time(type); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto is_read_only() const -> bool override { |  | ||||||
|     return file_->is_read_only(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto is_symlink() const -> bool override { |  | ||||||
|     return file_->is_symlink(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto move_to(std::string_view new_path) -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto read(unsigned char *data, std::size_t to_read, |  | ||||||
|                           std::uint64_t offset, |  | ||||||
|                           std::size_t *total_read = nullptr) -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto remove() -> bool override; |  | ||||||
|  |  | ||||||
|   auto set_read_buffer_size(std::uint32_t size) -> std::uint32_t override { |  | ||||||
|     return file_->set_read_buffer_size(size); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto size() const -> std::optional<std::uint64_t> override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto truncate(std::size_t size) -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   write(const unsigned char *data, std::size_t to_write, std::size_t offset, |  | ||||||
|         std::size_t *total_written = nullptr) -> bool override; |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|   [[nodiscard]] operator bool() const override { |  | ||||||
|     return static_cast<bool>(*file_); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   auto operator=(const file &) noexcept -> enc_file & = delete; |  | ||||||
|  |  | ||||||
|   auto operator=(enc_file &&move_file) noexcept -> enc_file & { |  | ||||||
|     if (&move_file != this) { |  | ||||||
|       file_ = std::move(move_file.file_); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return *this; |  | ||||||
|   } |  | ||||||
| }; |  | ||||||
| #endif // defined(PROJECT_ENABLE_LIBSODIUM) && defined(PROJECT_ENABLE_BOOST) |  | ||||||
|  |  | ||||||
| class thread_file final : public i_file { |  | ||||||
| public: |  | ||||||
|   // [[nodiscard]] static auto |  | ||||||
|   // attach_file(native_handle handle, |  | ||||||
|   //             bool read_only = false) -> fs_file_t; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto attach_file(fs_file_t file) -> fs_file_t; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto open_file(std::string_view path, |  | ||||||
|                                       bool read_only = false) -> fs_file_t; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto open_file(std::wstring_view path, |  | ||||||
|                                       bool read_only = false) -> fs_file_t { |  | ||||||
|     return open_file(utils::string::to_utf8(path), read_only); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto |  | ||||||
|   open_or_create_file(std::string_view path, |  | ||||||
|                       bool read_only = false) -> fs_file_t; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto |  | ||||||
|   open_or_create_file(std::wstring_view path, |  | ||||||
|                       bool read_only = false) -> fs_file_t { |  | ||||||
|     return open_or_create_file(utils::string::to_utf8(path), read_only); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|   thread_file() noexcept = default; |  | ||||||
|  |  | ||||||
|   thread_file(std::string_view path) : file_(new file(path)) {} |  | ||||||
|  |  | ||||||
|   thread_file(std::wstring_view path) |  | ||||||
|       : file_(new file(utils::string::to_utf8(path))) {} |  | ||||||
|  |  | ||||||
| protected: |  | ||||||
|   thread_file(fs_file_t file); |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|   thread_file(const thread_file &) = delete; |  | ||||||
|  |  | ||||||
|   thread_file(thread_file &&move_file) noexcept |  | ||||||
|       : file_(std::move(move_file.file_)) {} |  | ||||||
|  |  | ||||||
|   ~thread_file() override { close(); } |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|   fs_file_t file_; |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|   void close() override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto copy_to(std::string_view new_path, |  | ||||||
|                              bool overwrite) const -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto exists() const -> bool override { return file_->exists(); } |  | ||||||
|  |  | ||||||
|   void flush() const override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_handle() const -> native_handle override { |  | ||||||
|     return file_->get_handle(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_path() const -> std::string override { |  | ||||||
|     return file_->get_path(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_read_buffer_size() const -> std::uint32_t override { |  | ||||||
|     return file_->get_read_buffer_size(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   get_time(time_type type) const -> std::optional<std::uint64_t> override { |  | ||||||
|     return file_->get_time(type); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto is_read_only() const -> bool override { |  | ||||||
|     return file_->is_read_only(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto is_symlink() const -> bool override { |  | ||||||
|     return file_->is_symlink(); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto move_to(std::string_view new_path) -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto read(unsigned char *data, std::size_t to_read, |  | ||||||
|                           std::uint64_t offset, |  | ||||||
|                           std::size_t *total_read = nullptr) -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto remove() -> bool override; |  | ||||||
|  |  | ||||||
|   auto set_read_buffer_size(std::uint32_t size) -> std::uint32_t override { |  | ||||||
|     return file_->set_read_buffer_size(size); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto size() const -> std::optional<std::uint64_t> override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto truncate(std::size_t size) -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   write(const unsigned char *data, std::size_t to_write, std::size_t offset, |  | ||||||
|         std::size_t *total_written = nullptr) -> bool override; |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|   [[nodiscard]] operator bool() const override { |  | ||||||
|     return static_cast<bool>(*file_); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   auto operator=(const file &) noexcept -> thread_file & = delete; |  | ||||||
|  |  | ||||||
|   auto operator=(thread_file &&move_file) noexcept -> thread_file & { |  | ||||||
|     if (&move_file != this) { |  | ||||||
|       file_ = std::move(move_file.file_); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return *this; |  | ||||||
|   } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| class directory final : public i_directory { |  | ||||||
| public: |  | ||||||
|   using directory_t = std::unique_ptr<directory>; |  | ||||||
|  |  | ||||||
|   directory() noexcept = default; |  | ||||||
|  |  | ||||||
|   directory(std::string_view path, stop_type *stop_requested = nullptr) |  | ||||||
|       : path_(utils::path::absolute(path)), stop_requested_(stop_requested) {} |  | ||||||
|  |  | ||||||
|   directory(std::wstring_view path, stop_type *stop_requested = nullptr) |  | ||||||
|       : path_(utils::path::absolute(utils::string::to_utf8(path))), |  | ||||||
|         stop_requested_(stop_requested) {} |  | ||||||
|  |  | ||||||
|   directory(const directory &) noexcept = delete; |  | ||||||
|  |  | ||||||
|   directory(directory &&move_dir) noexcept = default; |  | ||||||
|  |  | ||||||
|   ~directory() override = default; |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|   std::string path_; |  | ||||||
|   stop_type *stop_requested_{nullptr}; |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|   [[nodiscard]] auto copy_to(std::string_view new_path, |  | ||||||
|                              bool overwrite) const -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   count(bool recursive = false) const -> std::uint64_t override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   create_directory(std::string_view path = "") const -> fs_directory_t override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto create_file(std::string_view file_name, |  | ||||||
|                                  bool read_only) const -> fs_file_t override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto exists() const -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   get_directory(std::string_view path) const -> fs_directory_t override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   get_directories() const -> std::vector<fs_directory_t> override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   get_file(std::string_view path) const -> fs_file_t override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_files() const -> std::vector<fs_file_t> override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_items() const -> std::vector<fs_item_t> override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_path() const -> std::string override { return path_; } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto is_stop_requested() const -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto is_symlink() const -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto move_to(std::string_view new_path) -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto remove() -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto remove_recursively() -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   size(bool recursive = false) const -> std::uint64_t override; |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|   auto operator=(const directory &) noexcept -> directory & = delete; |  | ||||||
|  |  | ||||||
|   auto operator=(directory &&move_dir) noexcept -> directory & = default; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] operator bool() const override { return exists(); } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| #if defined(PROJECT_ENABLE_LIBDSM) |  | ||||||
| #define SMB_MOD_RW2                                                            \ | #define SMB_MOD_RW2                                                            \ | ||||||
|   (SMB_MOD_READ | SMB_MOD_WRITE | SMB_MOD_READ_EXT | SMB_MOD_WRITE_EXT |       \ |   (SMB_MOD_READ | SMB_MOD_WRITE | SMB_MOD_READ_EXT | SMB_MOD_WRITE_EXT |       \ | ||||||
|    SMB_MOD_READ_ATTR | SMB_MOD_WRITE_ATTR | SMB_MOD_READ_CTL) |    SMB_MOD_READ_ATTR | SMB_MOD_WRITE_ATTR | SMB_MOD_READ_CTL) | ||||||
|  |  | ||||||
| class smb_file final : public i_file { |  | ||||||
| public: |  | ||||||
|   smb_file() = default; |  | ||||||
|  |  | ||||||
|   smb_file(std::optional<smb_fd> fd, std::string path, smb_session_t session, |  | ||||||
|            std::string_view share_name, smb_tid tid) |  | ||||||
|       : fd_(std::move(fd)), |  | ||||||
|         path_(std::move(path)), |  | ||||||
|         session_(std::move(session)), |  | ||||||
|         share_name_(share_name), |  | ||||||
|         tid_(tid) {} |  | ||||||
|  |  | ||||||
|   smb_file(const smb_file &) = delete; |  | ||||||
|  |  | ||||||
|   smb_file(smb_file &&f) noexcept |  | ||||||
|       : fd_(std::move(f.fd_)), |  | ||||||
|         path_(std::move(f.path_)), |  | ||||||
|         read_buffer_size(f.get_read_buffer_size()), |  | ||||||
|         read_only_(f.read_only_), |  | ||||||
|         session_(std::move(f.session_)), |  | ||||||
|         share_name_(std::move(f.share_name_)), |  | ||||||
|         tid_(f.tid_) {} |  | ||||||
|  |  | ||||||
|   ~smb_file() override { close(); } |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|   std::optional<smb_fd> fd_; |  | ||||||
|   std::string path_; |  | ||||||
|   std::atomic_uint32_t read_buffer_size{65536U}; |  | ||||||
|   bool read_only_; |  | ||||||
|   smb_session_t session_; |  | ||||||
|   std::string share_name_; |  | ||||||
|   smb_tid tid_; |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|   void close() override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto copy_to(std::string_view new_path, |  | ||||||
|                              bool overwrite) const -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto exists() const -> bool override; |  | ||||||
|  |  | ||||||
|   void flush() const override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_handle() const -> native_handle override { |  | ||||||
|     return INVALID_HANDLE_VALUE; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_path() const -> std::string override { return path_; } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_read_buffer_size() const -> std::uint32_t override { |  | ||||||
|     return read_buffer_size; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto |  | ||||||
|   get_time(smb_session *session, smb_tid tid, std::string path, |  | ||||||
|            time_type type) -> std::optional<std::uint64_t>; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   get_time(time_type type) const -> std::optional<std::uint64_t> override { |  | ||||||
|     return get_time(session_.get(), tid_, path_, type); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_unc_path() const -> std::string { |  | ||||||
|     return smb_get_unc_path(path_); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_uri_path() const -> std::string { |  | ||||||
|     return smb_get_uri_path(path_); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   get_uri_path(std::string_view user, |  | ||||||
|                std::string_view password) const -> std::string { |  | ||||||
|     return smb_get_uri_path(path_, user, password); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto is_read_only() const -> bool override { |  | ||||||
|     return read_only_; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto is_symlink() const -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto move_to(std::string_view new_path) -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto open(bool read_only) -> bool; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto read(unsigned char *data, std::size_t to_read, |  | ||||||
|                           std::uint64_t offset, |  | ||||||
|                           std::size_t *total_read = nullptr) -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto remove() -> bool override; |  | ||||||
|  |  | ||||||
|   auto set_read_buffer_size(std::uint32_t size) -> std::uint32_t override { |  | ||||||
|     read_buffer_size = size; |  | ||||||
|     return read_buffer_size; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto size() const -> std::optional<std::uint64_t> override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto truncate(std::size_t size) -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   write(const unsigned char *data, std::size_t to_write, std::size_t offset, |  | ||||||
|         std::size_t *total_written = nullptr) -> bool override; |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|   auto operator=(const smb_file &) noexcept -> smb_file & = delete; |  | ||||||
|  |  | ||||||
|   auto operator=(smb_file &&move_file) noexcept -> smb_file & { |  | ||||||
|     if (this != &move_file) { |  | ||||||
|       fd_ = std::move(move_file.fd_); |  | ||||||
|       path_ = std::move(move_file.path_); |  | ||||||
|       read_buffer_size = move_file.get_read_buffer_size(); |  | ||||||
|       read_only_ = move_file.read_only_; |  | ||||||
|       session_ = std::move(move_file.session_); |  | ||||||
|       share_name_ = std::move(move_file.share_name_); |  | ||||||
|       tid_ = move_file.tid_; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return *this; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] operator bool() const override { return fd_.has_value(); } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| class smb_directory final : public i_directory { |  | ||||||
| public: |  | ||||||
|   using smb_directory_t = std::unique_ptr<smb_directory>; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto |  | ||||||
|   open(std::string_view host, std::string_view user, std::string_view password, |  | ||||||
|        std::string_view path, |  | ||||||
|        stop_type *stop_requested = nullptr) -> smb_directory_t; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] static auto |  | ||||||
|   open(std::wstring_view host, std::wstring_view user, |  | ||||||
|        std::wstring_view password, std::wstring_view path, |  | ||||||
|        stop_type *stop_requested = nullptr) -> smb_directory_t; |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|   smb_directory() noexcept = default; |  | ||||||
|  |  | ||||||
|   smb_directory(const smb_directory &) noexcept = delete; |  | ||||||
|  |  | ||||||
|   smb_directory(smb_directory &&) noexcept = default; |  | ||||||
|  |  | ||||||
|   ~smb_directory() override = default; |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|   smb_directory(std::string path, smb_session_t session, |  | ||||||
|                 std::string_view share_name, smb_tid tid, |  | ||||||
|                 stop_type *stop_requested) |  | ||||||
|       : path_(std::move(path)), |  | ||||||
|         session_(std::move(session)), |  | ||||||
|         share_name_(share_name), |  | ||||||
|         tid_(tid), |  | ||||||
|         stop_requested_(stop_requested) {} |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|   std::string path_{}; |  | ||||||
|   smb_session_t session_{}; |  | ||||||
|   std::string share_name_{}; |  | ||||||
|   smb_tid tid_{}; |  | ||||||
|   stop_type *stop_requested_{nullptr}; |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   count(bool recursive = false) const -> std::uint64_t override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto copy_to(std::string_view new_path, |  | ||||||
|                              bool overwrite) const -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   create_directory(std::string_view path = "") const -> fs_directory_t override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto create_file(std::string_view file_name, |  | ||||||
|                                  bool read_only) const -> fs_file_t override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto exists() const -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   get_directory(std::string_view path) const -> fs_directory_t override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   get_directories() const -> std::vector<fs_directory_t> override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   get_file(std::string_view path) const -> fs_file_t override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_files() const -> std::vector<fs_file_t> override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_items() const -> std::vector<fs_item_t> override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_path() const -> std::string override { return path_; } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   get_time(time_type type) const -> std::optional<std::uint64_t> override { |  | ||||||
|     return smb_file::get_time(session_.get(), tid_, path_, type); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_unc_path() const -> std::string { |  | ||||||
|     return smb_get_unc_path(path_); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto get_uri_path() const -> std::string { |  | ||||||
|     return smb_get_uri_path(path_); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   get_uri_path(std::string_view user, |  | ||||||
|                std::string_view password) const -> std::string { |  | ||||||
|     return smb_get_uri_path(path_, user, password); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto is_stop_requested() const -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto is_symlink() const -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto move_to(std::string_view new_path) -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto remove() -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto remove_recursively() -> bool override; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] auto |  | ||||||
|   size(bool recursive = false) const -> std::uint64_t override; |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|   auto operator=(const smb_directory &) noexcept -> smb_directory & = delete; |  | ||||||
|  |  | ||||||
|   auto |  | ||||||
|   operator=(smb_directory &&move_dir) noexcept -> smb_directory & = default; |  | ||||||
|  |  | ||||||
|   [[nodiscard]] operator bool() const override { return session_ != nullptr; } |  | ||||||
| }; |  | ||||||
| #endif // defined(PROJECT_ENABLE_LIBDSM) | #endif // defined(PROJECT_ENABLE_LIBDSM) | ||||||
|  |  | ||||||
| #if defined(PROJECT_ENABLE_JSON) | #if defined(PROJECT_ENABLE_JSON) | ||||||
| @@ -822,47 +170,13 @@ read_json_file(std::string_view path, nlohmann::json &data, | |||||||
|                                    const nlohmann::json &data) -> bool; |                                    const nlohmann::json &data) -> bool; | ||||||
| #endif // defined(PROJECT_ENABLE_LIBSODIUM) && defined(PROJECT_ENABLE_BOOST) | #endif // defined(PROJECT_ENABLE_LIBSODIUM) && defined(PROJECT_ENABLE_BOOST) | ||||||
| #endif // defined(PROJECT_ENABLE_JSON) | #endif // defined(PROJECT_ENABLE_JSON) | ||||||
|  |  | ||||||
| // INFO: has test |  | ||||||
| template <typename string_t> |  | ||||||
| [[nodiscard]] inline auto directory_exists_in_path_t( |  | ||||||
|     std::basic_string_view<typename string_t::value_type> path, |  | ||||||
|     std::basic_string_view<typename string_t::value_type> sub_directory) |  | ||||||
|     -> bool { |  | ||||||
|   return directory(utils::path::combine(path, {sub_directory})).exists(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // INFO: has test |  | ||||||
| template <typename string_t> |  | ||||||
| [[nodiscard]] inline auto file_exists_in_path_t( |  | ||||||
|     std::basic_string_view<typename string_t::value_type> path, |  | ||||||
|     std::basic_string_view<typename string_t::value_type> file_name) -> bool { |  | ||||||
|   return file(utils::path::combine(path, {file_name})).exists(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // INFO: has test |  | ||||||
| inline auto directory_exists_in_path(std::string_view path, |  | ||||||
|                                      std::string_view sub_directory) -> bool { |  | ||||||
|   return directory_exists_in_path_t<std::string>(path, sub_directory); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // INFO: has test |  | ||||||
| inline auto directory_exists_in_path(std::wstring_view path, |  | ||||||
|                                      std::wstring_view sub_directory) -> bool { |  | ||||||
|   return directory_exists_in_path_t<std::wstring>(path, sub_directory); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // INFO: has test |  | ||||||
| inline auto file_exists_in_path(std::string_view path, |  | ||||||
|                                 std::string_view file_name) -> bool { |  | ||||||
|   return file_exists_in_path_t<std::string>(path, file_name); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // INFO: has test |  | ||||||
| inline auto file_exists_in_path(std::wstring_view path, |  | ||||||
|                                 std::wstring_view file_name) -> bool { |  | ||||||
|   return file_exists_in_path_t<std::wstring>(path, file_name); |  | ||||||
| } |  | ||||||
| } // namespace repertory::utils::file | } // namespace repertory::utils::file | ||||||
|  |  | ||||||
| #endif // REPERTORY_INCLUDE_UTILS_FILE_HPP_ | #endif // REPERTORY_INCLUDE_UTILS_FILE_HPP_ | ||||||
|  |  | ||||||
|  | #include "utils/file_directory.hpp" | ||||||
|  | #include "utils/file_enc_file.hpp" | ||||||
|  | #include "utils/file_file.hpp" | ||||||
|  | #include "utils/file_smb_directory.hpp" | ||||||
|  | #include "utils/file_smb_file.hpp" | ||||||
|  | #include "utils/file_thread_file.hpp" | ||||||
|   | |||||||
							
								
								
									
										124
									
								
								support/include/utils/file_directory.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								support/include/utils/file_directory.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | |||||||
|  | /* | ||||||
|  |   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||||
|  |  | ||||||
|  |   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |   of this software and associated documentation files (the "Software"), to deal | ||||||
|  |   in the Software without restriction, including without limitation the rights | ||||||
|  |   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |   copies of the Software, and to permit persons to whom the Software is | ||||||
|  |   furnished to do so, subject to the following conditions: | ||||||
|  |  | ||||||
|  |   The above copyright notice and this permission notice shall be included in all | ||||||
|  |   copies or substantial portions of the Software. | ||||||
|  |  | ||||||
|  |   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  |   SOFTWARE. | ||||||
|  | */ | ||||||
|  | #ifndef REPERTORY_INCLUDE_UTILS_FILE_DIRECTORY_HPP_ | ||||||
|  | #define REPERTORY_INCLUDE_UTILS_FILE_DIRECTORY_HPP_ | ||||||
|  |  | ||||||
|  | #include "utils/file.hpp" | ||||||
|  |  | ||||||
|  | namespace repertory::utils::file { | ||||||
|  | class directory final : public i_directory { | ||||||
|  | public: | ||||||
|  |   using directory_t = std::unique_ptr<directory>; | ||||||
|  |  | ||||||
|  |   directory() noexcept = default; | ||||||
|  |  | ||||||
|  |   directory(std::string_view path, stop_type *stop_requested = nullptr) | ||||||
|  |       : path_(utils::path::absolute(path)), stop_requested_(stop_requested) {} | ||||||
|  |  | ||||||
|  |   directory(std::wstring_view path, stop_type *stop_requested = nullptr) | ||||||
|  |       : path_(utils::path::absolute(utils::string::to_utf8(path))), | ||||||
|  |         stop_requested_(stop_requested) {} | ||||||
|  |  | ||||||
|  |   directory(const directory &) noexcept = delete; | ||||||
|  |  | ||||||
|  |   directory(directory &&move_dir) noexcept = default; | ||||||
|  |  | ||||||
|  |   ~directory() override = default; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |   std::string path_; | ||||||
|  |   stop_type *stop_requested_{nullptr}; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   [[nodiscard]] auto copy_to(std::string_view new_path, | ||||||
|  |                              bool overwrite) const -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   count(bool recursive = false) const -> std::uint64_t override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   create_directory(std::string_view path = "") const -> fs_directory_t override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto create_file(std::string_view file_name, | ||||||
|  |                                  bool read_only) const -> fs_file_t override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto exists() const -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   get_directory(std::string_view path) const -> fs_directory_t override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   get_directories() const -> std::vector<fs_directory_t> override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   get_file(std::string_view path) const -> fs_file_t override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_files() const -> std::vector<fs_file_t> override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_items() const -> std::vector<fs_item_t> override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_path() const -> std::string override { return path_; } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto is_stop_requested() const -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto is_symlink() const -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto move_to(std::string_view new_path) -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto remove() -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto remove_recursively() -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   size(bool recursive = false) const -> std::uint64_t override; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   auto operator=(const directory &) noexcept -> directory & = delete; | ||||||
|  |  | ||||||
|  |   auto operator=(directory &&move_dir) noexcept -> directory & = default; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] operator bool() const override { return exists(); } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | // INFO: has test | ||||||
|  | template <typename string_t> | ||||||
|  | [[nodiscard]] inline auto directory_exists_in_path_t( | ||||||
|  |     std::basic_string_view<typename string_t::value_type> path, | ||||||
|  |     std::basic_string_view<typename string_t::value_type> sub_directory) | ||||||
|  |     -> bool { | ||||||
|  |   return directory(utils::path::combine(path, {sub_directory})).exists(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // INFO: has test | ||||||
|  | inline auto directory_exists_in_path(std::string_view path, | ||||||
|  |                                      std::string_view sub_directory) -> bool { | ||||||
|  |   return directory_exists_in_path_t<std::string>(path, sub_directory); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // INFO: has test | ||||||
|  | inline auto directory_exists_in_path(std::wstring_view path, | ||||||
|  |                                      std::wstring_view sub_directory) -> bool { | ||||||
|  |   return directory_exists_in_path_t<std::wstring>(path, sub_directory); | ||||||
|  | } | ||||||
|  | } // namespace repertory::utils::file | ||||||
|  |  | ||||||
|  | #endif // REPERTORY_INCLUDE_UTILS_FILE_DIRECTORY_HPP_ | ||||||
							
								
								
									
										122
									
								
								support/include/utils/file_enc_file.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								support/include/utils/file_enc_file.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,122 @@ | |||||||
|  | /* | ||||||
|  |   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||||
|  |  | ||||||
|  |   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |   of this software and associated documentation files (the "Software"), to deal | ||||||
|  |   in the Software without restriction, including without limitation the rights | ||||||
|  |   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |   copies of the Software, and to permit persons to whom the Software is | ||||||
|  |   furnished to do so, subject to the following conditions: | ||||||
|  |  | ||||||
|  |   The above copyright notice and this permission notice shall be included in all | ||||||
|  |   copies or substantial portions of the Software. | ||||||
|  |  | ||||||
|  |   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  |   SOFTWARE. | ||||||
|  | */ | ||||||
|  | #ifndef REPERTORY_INCLUDE_UTILS_FILE_ENC_FILE_HPP_ | ||||||
|  | #define REPERTORY_INCLUDE_UTILS_FILE_ENC_FILE_HPP_ | ||||||
|  | #if defined(PROJECT_ENABLE_LIBSODIUM) && defined(PROJECT_ENABLE_BOOST) | ||||||
|  |  | ||||||
|  | #include "utils/file.hpp" | ||||||
|  |  | ||||||
|  | namespace repertory::utils::file { | ||||||
|  | class enc_file final : public i_file { | ||||||
|  | public: | ||||||
|  |   [[nodiscard]] static auto attach_file(fs_file_t file) -> fs_file_t; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   enc_file() noexcept = default; | ||||||
|  |  | ||||||
|  | protected: | ||||||
|  |   enc_file(fs_file_t file); | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   enc_file(const enc_file &) = delete; | ||||||
|  |  | ||||||
|  |   enc_file(enc_file &&move_file) noexcept : file_(std::move(move_file.file_)) {} | ||||||
|  |  | ||||||
|  |   ~enc_file() override { close(); } | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |   fs_file_t file_; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   void close() override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto copy_to(std::string_view new_path, | ||||||
|  |                              bool overwrite) const -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto exists() const -> bool override { return file_->exists(); } | ||||||
|  |  | ||||||
|  |   void flush() const override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_handle() const -> native_handle override { | ||||||
|  |     return file_->get_handle(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_path() const -> std::string override { | ||||||
|  |     return file_->get_path(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_read_buffer_size() const -> std::uint32_t override { | ||||||
|  |     return file_->get_read_buffer_size(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   get_time(time_type type) const -> std::optional<std::uint64_t> override { | ||||||
|  |     return file_->get_time(type); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto is_read_only() const -> bool override { | ||||||
|  |     return file_->is_read_only(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto is_symlink() const -> bool override { | ||||||
|  |     return file_->is_symlink(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto move_to(std::string_view new_path) -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto read(unsigned char *data, std::size_t to_read, | ||||||
|  |                           std::uint64_t offset, | ||||||
|  |                           std::size_t *total_read = nullptr) -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto remove() -> bool override; | ||||||
|  |  | ||||||
|  |   auto set_read_buffer_size(std::uint32_t size) -> std::uint32_t override { | ||||||
|  |     return file_->set_read_buffer_size(size); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto size() const -> std::optional<std::uint64_t> override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto truncate(std::size_t size) -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   write(const unsigned char *data, std::size_t to_write, std::size_t offset, | ||||||
|  |         std::size_t *total_written = nullptr) -> bool override; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   [[nodiscard]] operator bool() const override { | ||||||
|  |     return static_cast<bool>(*file_); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   auto operator=(const file &) noexcept -> enc_file & = delete; | ||||||
|  |  | ||||||
|  |   auto operator=(enc_file &&move_file) noexcept -> enc_file & { | ||||||
|  |     if (&move_file != this) { | ||||||
|  |       file_ = std::move(move_file.file_); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return *this; | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | } // namespace repertory::utils::file | ||||||
|  |  | ||||||
|  | #endif // defined(PROJECT_ENABLE_LIBSODIUM) && defined(PROJECT_ENABLE_BOOST) | ||||||
|  | #endif // REPERTORY_INCLUDE_UTILS_FILE_ENC_FILE_HPP_ | ||||||
							
								
								
									
										176
									
								
								support/include/utils/file_file.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								support/include/utils/file_file.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | |||||||
|  | /* | ||||||
|  |   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||||
|  |  | ||||||
|  |   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |   of this software and associated documentation files (the "Software"), to deal | ||||||
|  |   in the Software without restriction, including without limitation the rights | ||||||
|  |   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |   copies of the Software, and to permit persons to whom the Software is | ||||||
|  |   furnished to do so, subject to the following conditions: | ||||||
|  |  | ||||||
|  |   The above copyright notice and this permission notice shall be included in all | ||||||
|  |   copies or substantial portions of the Software. | ||||||
|  |  | ||||||
|  |   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  |   SOFTWARE. | ||||||
|  | */ | ||||||
|  | #ifndef REPERTORY_INCLUDE_UTILS_FILE_FILE_HPP_ | ||||||
|  | #define REPERTORY_INCLUDE_UTILS_FILE_FILE_HPP_ | ||||||
|  |  | ||||||
|  | #include "utils/file.hpp" | ||||||
|  |  | ||||||
|  | namespace repertory::utils::file { | ||||||
|  | class file final : public i_file { | ||||||
|  | public: | ||||||
|  |   // [[nodiscard]] static auto | ||||||
|  |   // attach_file(native_handle handle, | ||||||
|  |   //             bool read_only = false) -> fs_file_t; | ||||||
|  |  | ||||||
|  |   // INFO: has test | ||||||
|  |   [[nodiscard]] static auto open_file(std::string_view path, | ||||||
|  |                                       bool read_only = false) -> fs_file_t; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] static auto open_file(std::wstring_view path, | ||||||
|  |                                       bool read_only = false) -> fs_file_t { | ||||||
|  |     return open_file(utils::string::to_utf8(path), read_only); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // INFO: has test | ||||||
|  |   [[nodiscard]] static auto | ||||||
|  |   open_or_create_file(std::string_view path, | ||||||
|  |                       bool read_only = false) -> fs_file_t; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] static auto | ||||||
|  |   open_or_create_file(std::wstring_view path, | ||||||
|  |                       bool read_only = false) -> fs_file_t { | ||||||
|  |     return open_or_create_file(utils::string::to_utf8(path), read_only); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   file() noexcept = default; | ||||||
|  |  | ||||||
|  |   file(std::string_view path) | ||||||
|  |       : file_(nullptr), path_(utils::path::absolute(path)) {} | ||||||
|  |  | ||||||
|  |   file(std::wstring_view path) | ||||||
|  |       : file_(nullptr), | ||||||
|  |         path_(utils::path::absolute(utils::string::to_utf8(path))) {} | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |   file(file_t file_ptr, std::string_view path, bool read_only) | ||||||
|  |       : file_(std::move(file_ptr)), path_(path), read_only_(read_only) {} | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   file(const file &) = delete; | ||||||
|  |  | ||||||
|  |   file(file &&move_file) noexcept | ||||||
|  |       : file_(std::move(move_file.file_)), | ||||||
|  |         path_(std::move(move_file.path_)), | ||||||
|  |         read_only_(move_file.read_only_) {} | ||||||
|  |  | ||||||
|  |   ~file() override { close(); } | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |   file_t file_; | ||||||
|  |   std::string path_; | ||||||
|  |   bool read_only_{false}; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |   std::atomic_uint32_t read_buffer_size{65536U}; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |   void open(); | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   void close() override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto copy_to(std::string_view new_path, | ||||||
|  |                              bool overwrite) const -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto exists() const -> bool override; | ||||||
|  |  | ||||||
|  |   void flush() const override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_handle() const -> native_handle override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_path() const -> std::string override { return path_; } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_read_buffer_size() const -> std::uint32_t override { | ||||||
|  |     return read_buffer_size; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto is_read_only() const -> bool override { | ||||||
|  |     return read_only_; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto is_symlink() const -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto move_to(std::string_view new_path) -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto read(unsigned char *data, std::size_t to_read, | ||||||
|  |                           std::uint64_t offset, | ||||||
|  |                           std::size_t *total_read = nullptr) -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto remove() -> bool override; | ||||||
|  |  | ||||||
|  |   auto set_read_buffer_size(std::uint32_t size) -> std::uint32_t override { | ||||||
|  |     read_buffer_size = size; | ||||||
|  |     return read_buffer_size; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | #if defined(PROJECT_ENABLE_LIBSODIUM) | ||||||
|  |   [[nodiscard]] auto sha256() -> std::optional<std::string>; | ||||||
|  |  | ||||||
|  | #endif // defined(PROJECT_ENABLE_LIBSODIUM) | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto size() const -> std::optional<std::uint64_t> override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto truncate(std::size_t size) -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   write(const unsigned char *data, std::size_t to_write, std::size_t offset, | ||||||
|  |         std::size_t *total_written = nullptr) -> bool override; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   auto operator=(const file &) noexcept -> file & = delete; | ||||||
|  |  | ||||||
|  |   auto operator=(file &&move_file) noexcept -> file & { | ||||||
|  |     if (&move_file != this) { | ||||||
|  |       file_ = std::move(move_file.file_); | ||||||
|  |       path_ = std::move(move_file.path_); | ||||||
|  |       read_only_ = move_file.read_only_; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return *this; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] operator bool() const override { return file_ != nullptr; } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | // INFO: has test | ||||||
|  | template <typename string_t> | ||||||
|  | [[nodiscard]] inline auto file_exists_in_path_t( | ||||||
|  |     std::basic_string_view<typename string_t::value_type> path, | ||||||
|  |     std::basic_string_view<typename string_t::value_type> file_name) -> bool { | ||||||
|  |   return file(utils::path::combine(path, {file_name})).exists(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // INFO: has test | ||||||
|  | inline auto file_exists_in_path(std::string_view path, | ||||||
|  |                                 std::string_view file_name) -> bool { | ||||||
|  |   return file_exists_in_path_t<std::string>(path, file_name); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // INFO: has test | ||||||
|  | inline auto file_exists_in_path(std::wstring_view path, | ||||||
|  |                                 std::wstring_view file_name) -> bool { | ||||||
|  |   return file_exists_in_path_t<std::wstring>(path, file_name); | ||||||
|  | } | ||||||
|  | } // namespace repertory::utils::file | ||||||
|  |  | ||||||
|  | #endif // REPERTORY_INCLUDE_UTILS_FILE_FILE_HPP_ | ||||||
							
								
								
									
										140
									
								
								support/include/utils/file_smb_directory.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								support/include/utils/file_smb_directory.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,140 @@ | |||||||
|  | /* | ||||||
|  |   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||||
|  |  | ||||||
|  |   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |   of this software and associated documentation files (the "Software"), to deal | ||||||
|  |   in the Software without restriction, including without limitation the rights | ||||||
|  |   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |   copies of the Software, and to permit persons to whom the Software is | ||||||
|  |   furnished to do so, subject to the following conditions: | ||||||
|  |  | ||||||
|  |   The above copyright notice and this permission notice shall be included in all | ||||||
|  |   copies or substantial portions of the Software. | ||||||
|  |  | ||||||
|  |   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  |   SOFTWARE. | ||||||
|  | */ | ||||||
|  | #ifndef REPERTORY_INCLUDE_UTILS_FILE_SMB_DIRECTORY_HPP_ | ||||||
|  | #define REPERTORY_INCLUDE_UTILS_FILE_SMB_DIRECTORY_HPP_ | ||||||
|  | #if defined(PROJECT_ENABLE_LIBDSM) | ||||||
|  |  | ||||||
|  | #include "utils/file.hpp" | ||||||
|  |  | ||||||
|  | namespace repertory::utils::file { | ||||||
|  | class smb_directory final : public i_directory { | ||||||
|  | public: | ||||||
|  |   using smb_directory_t = std::unique_ptr<smb_directory>; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] static auto | ||||||
|  |   open(std::string_view host, std::string_view user, std::string_view password, | ||||||
|  |        std::string_view path, | ||||||
|  |        stop_type *stop_requested = nullptr) -> smb_directory_t; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] static auto | ||||||
|  |   open(std::wstring_view host, std::wstring_view user, | ||||||
|  |        std::wstring_view password, std::wstring_view path, | ||||||
|  |        stop_type *stop_requested = nullptr) -> smb_directory_t; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   smb_directory() noexcept = default; | ||||||
|  |  | ||||||
|  |   smb_directory(const smb_directory &) noexcept = delete; | ||||||
|  |  | ||||||
|  |   smb_directory(smb_directory &&) noexcept = default; | ||||||
|  |  | ||||||
|  |   ~smb_directory() override = default; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |   smb_directory(std::string path, smb_session_t session, | ||||||
|  |                 std::string_view share_name, smb_tid tid, | ||||||
|  |                 stop_type *stop_requested) | ||||||
|  |       : path_(std::move(path)), | ||||||
|  |         session_(std::move(session)), | ||||||
|  |         share_name_(share_name), | ||||||
|  |         tid_(tid), | ||||||
|  |         stop_requested_(stop_requested) {} | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |   std::string path_{}; | ||||||
|  |   smb_session_t session_{}; | ||||||
|  |   std::string share_name_{}; | ||||||
|  |   smb_tid tid_{}; | ||||||
|  |   stop_type *stop_requested_{nullptr}; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   count(bool recursive = false) const -> std::uint64_t override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto copy_to(std::string_view new_path, | ||||||
|  |                              bool overwrite) const -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   create_directory(std::string_view path = "") const -> fs_directory_t override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto create_file(std::string_view file_name, | ||||||
|  |                                  bool read_only) const -> fs_file_t override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto exists() const -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   get_directory(std::string_view path) const -> fs_directory_t override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   get_directories() const -> std::vector<fs_directory_t> override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   get_file(std::string_view path) const -> fs_file_t override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_files() const -> std::vector<fs_file_t> override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_items() const -> std::vector<fs_item_t> override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_path() const -> std::string override { return path_; } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   get_time(time_type type) const -> std::optional<std::uint64_t> override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_unc_path() const -> std::string { | ||||||
|  |     return smb_get_unc_path(path_); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_uri_path() const -> std::string { | ||||||
|  |     return smb_get_uri_path(path_); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   get_uri_path(std::string_view user, | ||||||
|  |                std::string_view password) const -> std::string { | ||||||
|  |     return smb_get_uri_path(path_, user, password); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto is_stop_requested() const -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto is_symlink() const -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto move_to(std::string_view new_path) -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto remove() -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto remove_recursively() -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   size(bool recursive = false) const -> std::uint64_t override; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   auto operator=(const smb_directory &) noexcept -> smb_directory & = delete; | ||||||
|  |  | ||||||
|  |   auto | ||||||
|  |   operator=(smb_directory &&move_dir) noexcept -> smb_directory & = default; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] operator bool() const override { return session_ != nullptr; } | ||||||
|  | }; | ||||||
|  | } // namespace repertory::utils::file | ||||||
|  |  | ||||||
|  | #endif // defined(PROJECT_ENABLE_LIBDSM) | ||||||
|  | #endif // REPERTORY_INCLUDE_UTILS_FILE_SMB_DIRECTORY_HPP_ | ||||||
							
								
								
									
										157
									
								
								support/include/utils/file_smb_file.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								support/include/utils/file_smb_file.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,157 @@ | |||||||
|  | /* | ||||||
|  |   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||||
|  |  | ||||||
|  |   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |   of this software and associated documentation files (the "Software"), to deal | ||||||
|  |   in the Software without restriction, including without limitation the rights | ||||||
|  |   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |   copies of the Software, and to permit persons to whom the Software is | ||||||
|  |   furnished to do so, subject to the following conditions: | ||||||
|  |  | ||||||
|  |   The above copyright notice and this permission notice shall be included in all | ||||||
|  |   copies or substantial portions of the Software. | ||||||
|  |  | ||||||
|  |   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  |   SOFTWARE. | ||||||
|  | */ | ||||||
|  | #ifndef REPERTORY_INCLUDE_UTILS_FILE_SMB_FILE_HPP_ | ||||||
|  | #define REPERTORY_INCLUDE_UTILS_FILE_SMB_FILE_HPP_ | ||||||
|  | #if defined(PROJECT_ENABLE_LIBDSM) | ||||||
|  |  | ||||||
|  | #include "utils/file.hpp" | ||||||
|  |  | ||||||
|  | namespace repertory::utils::file { | ||||||
|  | class smb_file final : public i_file { | ||||||
|  | public: | ||||||
|  |   smb_file() = default; | ||||||
|  |  | ||||||
|  |   smb_file(std::optional<smb_fd> fd, std::string path, smb_session_t session, | ||||||
|  |            std::string_view share_name, smb_tid tid) | ||||||
|  |       : fd_(std::move(fd)), | ||||||
|  |         path_(std::move(path)), | ||||||
|  |         session_(std::move(session)), | ||||||
|  |         share_name_(share_name), | ||||||
|  |         tid_(tid) {} | ||||||
|  |  | ||||||
|  |   smb_file(const smb_file &) = delete; | ||||||
|  |  | ||||||
|  |   smb_file(smb_file &&f) noexcept | ||||||
|  |       : fd_(std::move(f.fd_)), | ||||||
|  |         path_(std::move(f.path_)), | ||||||
|  |         read_buffer_size(f.get_read_buffer_size()), | ||||||
|  |         read_only_(f.read_only_), | ||||||
|  |         session_(std::move(f.session_)), | ||||||
|  |         share_name_(std::move(f.share_name_)), | ||||||
|  |         tid_(f.tid_) {} | ||||||
|  |  | ||||||
|  |   ~smb_file() override { close(); } | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |   std::optional<smb_fd> fd_; | ||||||
|  |   std::string path_; | ||||||
|  |   std::atomic_uint32_t read_buffer_size{65536U}; | ||||||
|  |   bool read_only_; | ||||||
|  |   smb_session_t session_; | ||||||
|  |   std::string share_name_; | ||||||
|  |   smb_tid tid_; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   void close() override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto copy_to(std::string_view new_path, | ||||||
|  |                              bool overwrite) const -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto exists() const -> bool override; | ||||||
|  |  | ||||||
|  |   void flush() const override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_handle() const -> native_handle override { | ||||||
|  |     return INVALID_HANDLE_VALUE; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_path() const -> std::string override { return path_; } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_read_buffer_size() const -> std::uint32_t override { | ||||||
|  |     return read_buffer_size; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] static auto | ||||||
|  |   get_time(smb_session *session, smb_tid tid, std::string path, | ||||||
|  |            time_type type) -> std::optional<std::uint64_t>; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   get_time(time_type type) const -> std::optional<std::uint64_t> override { | ||||||
|  |     return get_time(session_.get(), tid_, path_, type); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_unc_path() const -> std::string { | ||||||
|  |     return smb_get_unc_path(path_); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_uri_path() const -> std::string { | ||||||
|  |     return smb_get_uri_path(path_); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   get_uri_path(std::string_view user, | ||||||
|  |                std::string_view password) const -> std::string { | ||||||
|  |     return smb_get_uri_path(path_, user, password); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto is_read_only() const -> bool override { | ||||||
|  |     return read_only_; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto is_symlink() const -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto move_to(std::string_view new_path) -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto open(bool read_only) -> bool; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto read(unsigned char *data, std::size_t to_read, | ||||||
|  |                           std::uint64_t offset, | ||||||
|  |                           std::size_t *total_read = nullptr) -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto remove() -> bool override; | ||||||
|  |  | ||||||
|  |   auto set_read_buffer_size(std::uint32_t size) -> std::uint32_t override { | ||||||
|  |     read_buffer_size = size; | ||||||
|  |     return read_buffer_size; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto size() const -> std::optional<std::uint64_t> override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto truncate(std::size_t size) -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   write(const unsigned char *data, std::size_t to_write, std::size_t offset, | ||||||
|  |         std::size_t *total_written = nullptr) -> bool override; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   auto operator=(const smb_file &) noexcept -> smb_file & = delete; | ||||||
|  |  | ||||||
|  |   auto operator=(smb_file &&move_file) noexcept -> smb_file & { | ||||||
|  |     if (this != &move_file) { | ||||||
|  |       fd_ = std::move(move_file.fd_); | ||||||
|  |       path_ = std::move(move_file.path_); | ||||||
|  |       read_buffer_size = move_file.get_read_buffer_size(); | ||||||
|  |       read_only_ = move_file.read_only_; | ||||||
|  |       session_ = std::move(move_file.session_); | ||||||
|  |       share_name_ = std::move(move_file.share_name_); | ||||||
|  |       tid_ = move_file.tid_; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return *this; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] operator bool() const override { return fd_.has_value(); } | ||||||
|  | }; | ||||||
|  | } // namespace repertory::utils::file | ||||||
|  |  | ||||||
|  | #endif // defined(PROJECT_ENABLE_LIBDSM) | ||||||
|  | #endif // REPERTORY_INCLUDE_UTILS_FILE_SMB_FILE_HPP_ | ||||||
							
								
								
									
										147
									
								
								support/include/utils/file_thread_file.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								support/include/utils/file_thread_file.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,147 @@ | |||||||
|  | /* | ||||||
|  |   Copyright <2018-2024> <scott.e.graves@protonmail.com> | ||||||
|  |  | ||||||
|  |   Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |   of this software and associated documentation files (the "Software"), to deal | ||||||
|  |   in the Software without restriction, including without limitation the rights | ||||||
|  |   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |   copies of the Software, and to permit persons to whom the Software is | ||||||
|  |   furnished to do so, subject to the following conditions: | ||||||
|  |  | ||||||
|  |   The above copyright notice and this permission notice shall be included in all | ||||||
|  |   copies or substantial portions of the Software. | ||||||
|  |  | ||||||
|  |   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  |   SOFTWARE. | ||||||
|  | */ | ||||||
|  | #ifndef REPERTORY_INCLUDE_UTILS_FILE_THREAD_FILE_HPP_ | ||||||
|  | #define REPERTORY_INCLUDE_UTILS_FILE_THREAD_FILE_HPP_ | ||||||
|  |  | ||||||
|  | #include "utils/file.hpp" | ||||||
|  |  | ||||||
|  | namespace repertory::utils::file { | ||||||
|  | class thread_file final : public i_file { | ||||||
|  | public: | ||||||
|  |   // [[nodiscard]] static auto | ||||||
|  |   // attach_file(native_handle handle, | ||||||
|  |   //             bool read_only = false) -> fs_file_t; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] static auto attach_file(fs_file_t file) -> fs_file_t; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] static auto open_file(std::string_view path, | ||||||
|  |                                       bool read_only = false) -> fs_file_t; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] static auto open_file(std::wstring_view path, | ||||||
|  |                                       bool read_only = false) -> fs_file_t { | ||||||
|  |     return open_file(utils::string::to_utf8(path), read_only); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] static auto | ||||||
|  |   open_or_create_file(std::string_view path, | ||||||
|  |                       bool read_only = false) -> fs_file_t; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] static auto | ||||||
|  |   open_or_create_file(std::wstring_view path, | ||||||
|  |                       bool read_only = false) -> fs_file_t { | ||||||
|  |     return open_or_create_file(utils::string::to_utf8(path), read_only); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   thread_file() noexcept = default; | ||||||
|  |  | ||||||
|  |   thread_file(std::string_view path); | ||||||
|  |  | ||||||
|  |   thread_file(std::wstring_view path); | ||||||
|  |  | ||||||
|  | protected: | ||||||
|  |   thread_file(fs_file_t file); | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   thread_file(const thread_file &) = delete; | ||||||
|  |  | ||||||
|  |   thread_file(thread_file &&move_file) noexcept | ||||||
|  |       : file_(std::move(move_file.file_)) {} | ||||||
|  |  | ||||||
|  |   ~thread_file() override { close(); } | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |   fs_file_t file_; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   void close() override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto copy_to(std::string_view new_path, | ||||||
|  |                              bool overwrite) const -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto exists() const -> bool override { return file_->exists(); } | ||||||
|  |  | ||||||
|  |   void flush() const override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_handle() const -> native_handle override { | ||||||
|  |     return file_->get_handle(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_path() const -> std::string override { | ||||||
|  |     return file_->get_path(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto get_read_buffer_size() const -> std::uint32_t override { | ||||||
|  |     return file_->get_read_buffer_size(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   get_time(time_type type) const -> std::optional<std::uint64_t> override { | ||||||
|  |     return file_->get_time(type); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto is_read_only() const -> bool override { | ||||||
|  |     return file_->is_read_only(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto is_symlink() const -> bool override { | ||||||
|  |     return file_->is_symlink(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto move_to(std::string_view new_path) -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto read(unsigned char *data, std::size_t to_read, | ||||||
|  |                           std::uint64_t offset, | ||||||
|  |                           std::size_t *total_read = nullptr) -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto remove() -> bool override; | ||||||
|  |  | ||||||
|  |   auto set_read_buffer_size(std::uint32_t size) -> std::uint32_t override { | ||||||
|  |     return file_->set_read_buffer_size(size); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto size() const -> std::optional<std::uint64_t> override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto truncate(std::size_t size) -> bool override; | ||||||
|  |  | ||||||
|  |   [[nodiscard]] auto | ||||||
|  |   write(const unsigned char *data, std::size_t to_write, std::size_t offset, | ||||||
|  |         std::size_t *total_written = nullptr) -> bool override; | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   [[nodiscard]] operator bool() const override { | ||||||
|  |     return static_cast<bool>(*file_); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   auto operator=(const thread_file &) noexcept -> thread_file & = delete; | ||||||
|  |  | ||||||
|  |   auto operator=(thread_file &&move_file) noexcept -> thread_file & { | ||||||
|  |     if (&move_file != this) { | ||||||
|  |       file_ = std::move(move_file.file_); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return *this; | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | } // namespace repertory::utils::file | ||||||
|  |  | ||||||
|  | #endif // REPERTORY_INCLUDE_UTILS_FILE_THREAD_FILE_HPP_ | ||||||
| @@ -19,7 +19,7 @@ | |||||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|   SOFTWARE. |   SOFTWARE. | ||||||
| */ | */ | ||||||
| #include "utils/file.hpp" | #include "utils/file_directory.hpp" | ||||||
|  |  | ||||||
| #include "utils/common.hpp" | #include "utils/common.hpp" | ||||||
| #include "utils/error.hpp" | #include "utils/error.hpp" | ||||||
|   | |||||||
| @@ -19,10 +19,10 @@ | |||||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|   SOFTWARE. |   SOFTWARE. | ||||||
| */ | */ | ||||||
| #include "utils/file.hpp" |  | ||||||
|  |  | ||||||
| #if defined(PROJECT_ENABLE_LIBSODIUM) && defined(PROJECT_ENABLE_BOOST) | #if defined(PROJECT_ENABLE_LIBSODIUM) && defined(PROJECT_ENABLE_BOOST) | ||||||
|  |  | ||||||
|  | #include "utils/file_enc_file.hpp" | ||||||
|  |  | ||||||
| namespace repertory::utils::file { | namespace repertory::utils::file { | ||||||
| auto enc_file::attach_file(fs_file_t file) -> fs_file_t {} | auto enc_file::attach_file(fs_file_t file) -> fs_file_t {} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -19,7 +19,7 @@ | |||||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|   SOFTWARE. |   SOFTWARE. | ||||||
| */ | */ | ||||||
| #include "utils/file.hpp" | #include "utils/file_file.hpp" | ||||||
|  |  | ||||||
| #include "utils/collection.hpp" | #include "utils/collection.hpp" | ||||||
| #include "utils/common.hpp" | #include "utils/common.hpp" | ||||||
|   | |||||||
| @@ -19,12 +19,13 @@ | |||||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|   SOFTWARE. |   SOFTWARE. | ||||||
| */ | */ | ||||||
| #include "utils/file.hpp" | #if defined(PROJECT_ENABLE_LIBDSM) | ||||||
|  |  | ||||||
|  | #include "utils/file_smb_directory.hpp" | ||||||
|  |  | ||||||
| #include "utils/common.hpp" | #include "utils/common.hpp" | ||||||
| #include "utils/error.hpp" | #include "utils/error.hpp" | ||||||
|  |  | ||||||
| #if defined(PROJECT_ENABLE_LIBDSM) |  | ||||||
| namespace repertory::utils::file { | namespace repertory::utils::file { | ||||||
| auto smb_directory::open(std::string_view host, std::string_view user, | auto smb_directory::open(std::string_view host, std::string_view user, | ||||||
|                          std::string_view password, std::string_view path, |                          std::string_view password, std::string_view path, | ||||||
| @@ -537,6 +538,11 @@ auto smb_directory::get_items() const -> std::vector<fs_item_t> { | |||||||
|   return {}; |   return {}; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | auto smb_directory::get_time(time_type type) const | ||||||
|  |     -> std::optional<std::uint64_t> { | ||||||
|  |   return smb_file::get_time(session_.get(), tid_, path_, type); | ||||||
|  | } | ||||||
|  |  | ||||||
| auto smb_directory::is_stop_requested() const -> bool { | auto smb_directory::is_stop_requested() const -> bool { | ||||||
|   return (stop_requested_ != nullptr) && *stop_requested_; |   return (stop_requested_ != nullptr) && *stop_requested_; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -19,14 +19,14 @@ | |||||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|   SOFTWARE. |   SOFTWARE. | ||||||
| */ | */ | ||||||
| #include "utils/file.hpp" | #if defined(PROJECT_ENABLE_LIBDSM) | ||||||
|  |  | ||||||
|  | #include "utils/file_smb_file.hpp" | ||||||
|  |  | ||||||
| #include "utils/common.hpp" | #include "utils/common.hpp" | ||||||
| #include "utils/error.hpp" | #include "utils/error.hpp" | ||||||
| #include "utils/string.hpp" | #include "utils/string.hpp" | ||||||
|  |  | ||||||
| #if defined(PROJECT_ENABLE_LIBDSM) |  | ||||||
|  |  | ||||||
| namespace repertory::utils::file { | namespace repertory::utils::file { | ||||||
| void smb_file::close() { | void smb_file::close() { | ||||||
|   if (fd_.has_value()) { |   if (fd_.has_value()) { | ||||||
|   | |||||||
| @@ -19,12 +19,18 @@ | |||||||
|   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|   SOFTWARE. |   SOFTWARE. | ||||||
| */ | */ | ||||||
| #include "utils/file.hpp" | #include "utils/file_thread_file.hpp" | ||||||
|  |  | ||||||
| namespace repertory::utils::file { | namespace repertory::utils::file { | ||||||
| // auto thread_file::attach_file(native_handle handle, | // auto thread_file::attach_file(native_handle handle, | ||||||
| //                               bool read_only) -> fs_file_t {} | //                               bool read_only) -> fs_file_t {} | ||||||
|  |  | ||||||
|  | thread_file::thread_file(std::string_view path) | ||||||
|  |     : file_(new repertory::utils::file::file(path)) {} | ||||||
|  |  | ||||||
|  | thread_file::thread_file(std::wstring_view path) | ||||||
|  |     : file_(new repertory::utils::file::file(utils::string::to_utf8(path))) {} | ||||||
|  |  | ||||||
| auto thread_file::attach_file(fs_file_t file) -> fs_file_t {} | auto thread_file::attach_file(fs_file_t file) -> fs_file_t {} | ||||||
|  |  | ||||||
| auto thread_file::open_file(std::string_view path, | auto thread_file::open_file(std::string_view path, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user