Compare commits
	
		
			2 Commits
		
	
	
		
			v2.0.5-rc
			...
			v2.0.7-rel
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 5ab7301cbe | |||
| 87d336141c | 
| @@ -17,6 +17,7 @@ bugprone | ||||
| cflags | ||||
| chrono | ||||
| cmake_current_source_dir | ||||
| coinit_apartmentthreaded | ||||
| comdlg32 | ||||
| cppcoreguidelines | ||||
| cppdbg | ||||
| @@ -27,6 +28,7 @@ cppvsdbg | ||||
| create_notraverse | ||||
| crypto_aead_xchacha20poly1305_ietf_npubbytes | ||||
| cstdint | ||||
| curle_couldnt_resolve_host | ||||
| curlopt_aws_sigv4 | ||||
| cxxflags | ||||
| cxxstd | ||||
| @@ -199,6 +201,7 @@ secp256k1 | ||||
| secur32 | ||||
| sfml_project | ||||
| shlwapi | ||||
| sigchld | ||||
| skynet | ||||
| source_subdir | ||||
| spdlog | ||||
|   | ||||
| @@ -1,36 +0,0 @@ | ||||
| { | ||||
|     "configurations": { | ||||
|         "UnixDebug": { | ||||
|             "adapter": "vscode-cpptools", | ||||
|             "configuration": { | ||||
|                 "request": "launch", | ||||
|                 "program": "${workspaceRoot}/build/debug/repertory", | ||||
|                 "args": ["-f", "/home/sgraves/mnt"], | ||||
|                 "cwd": "${workspaceRoot}/build/debug", | ||||
|                 "environment": [], | ||||
|                 "externalConsole": true, | ||||
|                 "MIMode": "gdb", | ||||
|                 "stopAtEntry": true, | ||||
|                 "logging": { | ||||
|                     "engineLogging": false | ||||
|                 } | ||||
|             } | ||||
|         }, | ||||
|         "UnixDebugTest": { | ||||
|             "adapter": "vscode-cpptools", | ||||
|             "configuration": { | ||||
|                 "request": "launch", | ||||
|                 "program": "${workspaceRoot}/build/debug/unittests", | ||||
|                 "args": ["--gtest_filter=file_manager.can_close_after_download_timeout"], | ||||
|                 "cwd": "${workspaceRoot}/build", | ||||
|                 "environment": [], | ||||
|                 "externalConsole": true, | ||||
|                 "MIMode": "gdb", | ||||
|                 "stopAtEntry": true, | ||||
|                 "logging": { | ||||
|                     "engineLogging": false | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										30
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -1,7 +1,36 @@ | ||||
| # Changelog | ||||
|  | ||||
| ## v2.0.7-release | ||||
|  | ||||
| ### Issues | ||||
| * \#55 [bug] UI is unable to launch `repertory.exe` on Windows when absolute path contains spaces | ||||
| * \#57 [bug] Directory entries . and .. are incorrectly being reported as files in Linux remote mounts | ||||
|  | ||||
| ## v2.0.6-release | ||||
|  | ||||
| ### Issues | ||||
| * \#42 [bug] Remote mount directory listing on Windows connected to Linux is failing | ||||
| * \#43 [bug] Directories are not importing properly for Sia | ||||
| * \#44 [bug] Windows-to-Linux remote mount ignores `CREATE_NEW` | ||||
| * \#45 [bug] Windows-to-Linux remote mount is not handling attempts to remove a non-empty directory properly | ||||
| * \#46 [bug] Changes to maximum cache size should be updated live | ||||
| * \#47 [bug] Windows-to-Linux remote mount is allowing directory rename when directory is not empty | ||||
| * \#48 [bug] Windows-to-Linux remote mount overlapped I/O is not detecting EOF for read operations | ||||
| * \#49 [ui] Implement provider test button | ||||
|  | ||||
| ### Changes from v2.0.5-rc | ||||
|  | ||||
| * Added request retry on `libcurl` error code `CURLE_COULDNT_RESOLVE_HOST` | ||||
| * Added `libcurl` DNS caching | ||||
| * Drive letters in UI should always be lowercase | ||||
| * Fixed WinFSP directory rename for non-empty directories | ||||
| * Fixed segfault in UI due to incorrect `SIGCHLD` handling | ||||
| * Migrated to v2 error handling | ||||
| * Upgraded WinFSP to v2.1 (2025) | ||||
|  | ||||
| ## v2.0.5-rc | ||||
|  | ||||
| <!-- markdownlint-disable-next-line --> | ||||
| ### Issues | ||||
|  | ||||
| * \#39 Create management portal in Flutter | ||||
| @@ -69,6 +98,7 @@ | ||||
|  | ||||
| ## v2.0.2-rc | ||||
|  | ||||
| <!-- markdownlint-disable-next-line --> | ||||
| ### BREAKING CHANGES | ||||
|  | ||||
| * Refactored `config.json` - will need to verify configuration settings prior to mounting | ||||
|   | ||||
| @@ -48,7 +48,7 @@ on Windows. | ||||
| * [Sia renterd](https://github.com/SiaFoundation/renterd/releases) v2.0.0+ for Sia support | ||||
| * Linux requires `fusermount3`; otherwise, `repertory` must be manually compiled with `libfuse2` support | ||||
| * Windows requires the following dependencies to be installed: | ||||
|   * [WinFSP 2023](https://github.com/winfsp/winfsp/releases/download/v2.0/winfsp-2.0.23075.msi) | ||||
|   * [WinFSP 2025](https://github.com/winfsp/winfsp/releases/download/v2.1/winfsp-2.1.25156.msi) | ||||
|  | ||||
| ### Supported Operating Systems | ||||
|  | ||||
|   | ||||
| @@ -1,20 +1,20 @@ | ||||
| set(BINUTILS_HASH b53606f443ac8f01d1d5fc9c39497f2af322d99e14cea5c0b4b124d630379365) | ||||
| set(BINUTILS_HASH ce2017e059d63e67ddb9240e9d4ec49c2893605035cd60e92ad53177f4377237) | ||||
| set(BOOST2_HASH 7bd7ddceec1a1dfdcbdb3e609b60d01739c38390a5f956385a12f3122049f0ca) | ||||
| set(BOOST_HASH f55c340aa49763b1925ccf02b2e83f35fdcf634c9d5164a2acb87540173c741d) | ||||
| set(CPP_HTTPLIB_HASH c9b9e0524666e1cd088f0874c57c1ce7c0eaa8552f9f4e15c755d5201fc8c608) | ||||
| set(CURL_HASH 6edc063d1ebaf9cf3b3b46e9fef2f3cd8932694989ecd43d005d6e828426d09f) | ||||
| set(EXPAT_HASH 372b18f6527d162fa9658f1c74d22a37429b82d822f5a1e1fc7e00f6045a06a2) | ||||
| set(GCC_HASH 7d376d445f93126dc545e2c0086d0f647c3094aae081cdb78f42ce2bc25e7293) | ||||
| set(GTEST_HASH 78c676fc63881529bf97bf9d45948d905a66833fbfa5318ea2cd7478cb98f399) | ||||
| set(BOOST_HASH 3621533e820dcab1e8012afd583c0c73cf0f77694952b81352bf38c1488f9cb4) | ||||
| set(CPP_HTTPLIB_HASH 410a1347ed6bcbcc4a19af8ed8ad3873fe9fa97731d52db845c4c78f3f9c31e6) | ||||
| set(CURL_HASH 2937cadde007aa3a52a17c21ac9153ea054700f37926d1d96602bf07e888c847) | ||||
| set(EXPAT_HASH 85372797ff0673a8fc4a6be16466bb5a0ca28c0dcf3c6f7ac1686b4a3ba2aabb) | ||||
| set(GCC_HASH 51b9919ea69c980d7a381db95d4be27edf73b21254eb13d752a08003b4d013b1) | ||||
| set(GTEST_HASH 65fab701d9829d38cb77c14acdc431d2108bfdbf8979e40eb8ae567edf10b27c) | ||||
| set(ICU_HASH a2c443404f00098e9e90acf29dc318e049d2dc78d9ae5f46efb261934a730ce2) | ||||
| set(JSON_HASH 0d8ef5af7f9794e3263480193c491549b2ba6cc74bb018906202ada498a79406) | ||||
| set(JSON_HASH 4b92eb0c06d10683f7447ce9406cb97cd4b453be18d7279320f7b2f025c10187) | ||||
| set(LIBSODIUM_HASH 8e5aeca07a723a27bbecc3beef14b0068d37e7fc0e97f51b3f1c82d2a58005c1) | ||||
| set(MINGW_HASH cc41898aac4b6e8dd5cffd7331b9d9515b912df4420a3a612b5ea2955bbeed2f) | ||||
| set(OPENSSL_HASH 002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3) | ||||
| set(MINGW_HASH 5afe822af5c4edbf67daaf45eec61d538f49eef6b19524de64897c6b95828caf) | ||||
| set(OPENSSL_HASH 529043b15cffa5f36077a4d0af83f3de399807181d607441d734196d889b641f) | ||||
| set(PKG_CONFIG_HASH 6fc69c01688c9458a57eb9a1664c9aba372ccda420a02bf4429fe610e7e7d591) | ||||
| set(PUGIXML_HASH 655ade57fa703fb421c2eb9a0113b5064bddb145d415dd1f88c79353d90d511a) | ||||
| set(ROCKSDB_HASH fdccab16133c9d927a183c2648bcea8d956fb41eb1df2aacaa73eb0b95e43724) | ||||
| set(SPDLOG_HASH 25c843860f039a1600f232c6eb9e01e6627f7d030a2ae5e232bdd3c9205d26cc) | ||||
| set(SQLITE_HASH 6cebd1d8403fc58c30e93939b246f3e6e58d0765a5cd50546f16c00fd805d2c3) | ||||
| set(ROCKSDB_HASH afccfab496556904900afacf7d99887f1d50cb893e5d2288bd502db233adacac) | ||||
| set(SPDLOG_HASH 15a04e69c222eb6c01094b5c7ff8a249b36bb22788d72519646fb85feb267e67) | ||||
| set(SQLITE_HASH 9ad6d16cbc1df7cd55c8b55127c82a9bca5e9f287818de6dc87e04e73599d754) | ||||
| set(STDUUID_HASH b1176597e789531c38481acbbed2a6894ad419aab0979c10410d59eb0ebf40d3) | ||||
| set(ZLIB_HASH 17e88863f3600672ab49182f217281b6fc4d3c762bde361935e436a95214d05c) | ||||
|   | ||||
| @@ -2,9 +2,9 @@ if(PROJECT_ENABLE_WINFSP AND PROJECT_IS_MINGW) | ||||
|   if(PROJECT_BUILD)  | ||||
|     add_definitions(-DPROJECT_ENABLE_WINFSP) | ||||
|  | ||||
|     include_directories(BEFORE SYSTEM ${PROJECT_3RD_PARTY_DIR}/winfsp-2.0/inc) | ||||
|     include_directories(BEFORE SYSTEM ${PROJECT_3RD_PARTY_DIR}/winfsp-2.1/inc) | ||||
|  | ||||
|     link_directories(BEFORE ${PROJECT_3RD_PARTY_DIR}/winfsp-2.0/lib) | ||||
|     link_directories(BEFORE ${PROJECT_3RD_PARTY_DIR}/winfsp-2.1/lib) | ||||
|  | ||||
|     if(PROJECT_IS_ARM64) | ||||
|       link_libraries(winfsp-a64) | ||||
|   | ||||
| @@ -1,28 +1,27 @@ | ||||
| set(BINUTILS_VERSION 2.43) | ||||
| set(BINUTILS_VERSION 2.44) | ||||
| set(BOOST2_MAJOR_VERSION 1) | ||||
| set(BOOST2_MINOR_VERSION 76) | ||||
| set(BOOST2_PATCH_VERSION 0) | ||||
| set(BOOST_MAJOR_VERSION 1) | ||||
| set(BOOST_MINOR_VERSION 87) | ||||
| set(BOOST_MINOR_VERSION 88) | ||||
| set(BOOST_PATCH_VERSION 0) | ||||
| set(CPP_HTTPLIB_VERSION 0.19.0) | ||||
| set(CURL2_VERSION 8_12_1) | ||||
| set(CURL_VERSION 8.12.1) | ||||
| set(EXPAT2_VERSION 2_6_4) | ||||
| set(EXPAT_VERSION 2.6.4) | ||||
| set(GCC_VERSION 14.2.0) | ||||
| set(GTEST_VERSION 1.16.0) | ||||
| set(CPP_HTTPLIB_VERSION 0.23.1) | ||||
| set(CURL2_VERSION 8_15_0) | ||||
| set(CURL_VERSION 8.15.0) | ||||
| set(EXPAT2_VERSION 2_7_1) | ||||
| set(EXPAT_VERSION 2.7.1) | ||||
| set(GCC_VERSION 15.1.0) | ||||
| set(GTEST_VERSION 1.17.0) | ||||
| set(ICU_VERSION 76-1) | ||||
| set(JSON_VERSION 3.11.3) | ||||
| set(JSON_VERSION 3.12.0) | ||||
| set(LIBSODIUM_VERSION 1.0.20) | ||||
| set(MESA_VERSION 23.3.3) | ||||
| set(MINGW_VERSION 12.0.0) | ||||
| set(OPENSSL_VERSION 3.4.1) | ||||
| set(MINGW_VERSION 13.0.0) | ||||
| set(OPENSSL_VERSION 3.5.1) | ||||
| set(PKG_CONFIG_VERSION 0.29.2) | ||||
| set(PUGIXML_VERSION 1.15) | ||||
| set(ROCKSDB_VERSION 9.10.0) | ||||
| set(SPDLOG_VERSION 1.15.1) | ||||
| set(SQLITE2_VERSION 3.49.1) | ||||
| set(SQLITE_VERSION 3490100) | ||||
| set(ROCKSDB_VERSION 10.4.2) | ||||
| set(SPDLOG_VERSION 1.15.3) | ||||
| set(SQLITE2_VERSION 3.50.3) | ||||
| set(SQLITE_VERSION 3500300) | ||||
| set(STDUUID_VERSION 1.2.3) | ||||
| set(ZLIB_VERSION 1.3.1) | ||||
|   | ||||
| @@ -10,9 +10,9 @@ PROJECT_DESC="Mount utility for Sia and S3" | ||||
|  | ||||
| PROJECT_MAJOR_VERSION=2 | ||||
| PROJECT_MINOR_VERSION=0 | ||||
| PROJECT_REVISION_VERSION=5 | ||||
| PROJECT_RELEASE_NUM=0 | ||||
| PROJECT_RELEASE_ITER=rc | ||||
| PROJECT_REVISION_VERSION=7 | ||||
| PROJECT_RELEASE_NUM=1 | ||||
| PROJECT_RELEASE_ITER=release | ||||
|  | ||||
| PROJECT_APP_LIST=(${PROJECT_NAME}) | ||||
|  | ||||
| @@ -21,6 +21,7 @@ PROJECT_PUBLIC_KEY=${DEVELOPER_PUBLIC_KEY} | ||||
|  | ||||
| PROJECT_FLUTTER_BASE_HREF="/ui/" | ||||
|  | ||||
| PROJECT_ENABLE_V2_ERRORS=ON | ||||
| PROJECT_ENABLE_WIN32_LONG_PATH_NAMES=OFF | ||||
|  | ||||
| PROJECT_ENABLE_BACKWARD_CPP=OFF | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| #comment | ||||
| FROM         arm64v8/alpine:3.21.3 | ||||
| FROM         arm64v8/alpine:3.21.4 | ||||
| MAINTAINER   Scott E. Graves <scott.e.graves@protonmail.com> | ||||
| CMD          bash | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| #comment | ||||
| FROM         alpine:3.21.3 | ||||
| FROM         alpine:3.21.4 | ||||
| MAINTAINER   Scott E. Graves <scott.e.graves@protonmail.com> | ||||
| CMD          bash | ||||
|  | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| #comment | ||||
| FROM alpine:3.21.3 | ||||
| FROM alpine:3.21.4 | ||||
|  | ||||
| RUN apk update | ||||
| RUN apk upgrade | ||||
| @@ -351,9 +351,9 @@ RUN cd /3rd_party/mingw64 && sha256sum -c ./expat-${MY_EXPAT_VERSION}.tar.gz.sha | ||||
|  | ||||
| ARG FONTCONFIG_VERSION | ||||
| ENV MY_FONTCONFIG_VERSION=${FONTCONFIG_VERSION} | ||||
| RUN if [ -f "/3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.gz" ]; then \ | ||||
|       cd /3rd_party && sha256sum -c ./fontconfig-${MY_FONTCONFIG_VERSION}.tar.gz.sha256 && cd - \ | ||||
|       && tar xvzf /3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.gz \ | ||||
| RUN if [ -f "/3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.xz" ]; then \ | ||||
|       cd /3rd_party && sha256sum -c ./fontconfig-${MY_FONTCONFIG_VERSION}.tar.xz.sha256 && cd - \ | ||||
|       && tar xvJf /3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.xz \ | ||||
|       && cd fontconfig-${MY_FONTCONFIG_VERSION} \ | ||||
|       && meson setup \ | ||||
|         --cross-file ${MY_TOOLCHAIN_FILE_MESON} \ | ||||
|   | ||||
| @@ -23,6 +23,7 @@ | ||||
| #define REPERTORY_INCLUDE_COMM_CURL_CURL_COMM_HPP_ | ||||
|  | ||||
| #include "app_config.hpp" | ||||
| #include "comm/curl/curl_shared.hpp" | ||||
| #include "comm/curl/multi_request.hpp" | ||||
| #include "comm/i_http_comm.hpp" | ||||
| #include "events/event_system.hpp" | ||||
| @@ -48,14 +49,12 @@ private: | ||||
|  | ||||
|   static const write_callback write_data; | ||||
|   static const write_callback write_headers; | ||||
|   static constexpr std::uint8_t retry_request_count{5U}; | ||||
|  | ||||
| private: | ||||
|   std::optional<host_config> host_config_; | ||||
|   std::optional<s3_config> s3_config_; | ||||
|  | ||||
| private: | ||||
|   bool use_s3_path_style_{false}; | ||||
|  | ||||
| public: | ||||
|   [[nodiscard]] static auto create_curl() -> CURL *; | ||||
|  | ||||
| @@ -67,8 +66,7 @@ public: | ||||
|                                           const host_config &cfg) | ||||
|       -> std::string; | ||||
|  | ||||
|   [[nodiscard]] static auto create_host_config(const s3_config &cfg, | ||||
|                                                bool use_s3_path_style) | ||||
|   [[nodiscard]] static auto create_host_config(const s3_config &cfg) | ||||
|       -> host_config; | ||||
|  | ||||
|   [[nodiscard]] static auto url_encode(CURL *curl, const std::string &data, | ||||
| @@ -139,107 +137,128 @@ public: | ||||
|                long &response_code, stop_type &stop_requested) -> bool { | ||||
|     REPERTORY_USES_FUNCTION_NAME(); | ||||
|  | ||||
|     if (request.decryption_token.has_value() && | ||||
|         not request.decryption_token.value().empty()) { | ||||
|       return make_encrypted_request(cfg, request, response_code, | ||||
|                                     stop_requested); | ||||
|     } | ||||
|  | ||||
|     response_code = 0; | ||||
|  | ||||
|     auto *curl = create_curl(); | ||||
|     if (not request.set_method(curl, stop_requested)) { | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|     if (not cfg.agent_string.empty()) { | ||||
|       curl_easy_setopt(curl, CURLOPT_USERAGENT, cfg.agent_string.c_str()); | ||||
|     } | ||||
|  | ||||
|     if (request.allow_timeout && cfg.timeout_ms) { | ||||
|       curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, cfg.timeout_ms); | ||||
|     } | ||||
|  | ||||
|     std::string range_list{}; | ||||
|     if (request.range.has_value()) { | ||||
|       range_list = std::to_string(request.range.value().begin) + '-' + | ||||
|                    std::to_string(request.range.value().end); | ||||
|       curl_easy_setopt(curl, CURLOPT_RANGE, range_list.c_str()); | ||||
|     } | ||||
|  | ||||
|     if (request.response_headers.has_value()) { | ||||
|       curl_easy_setopt(curl, CURLOPT_HEADERDATA, | ||||
|                        &request.response_headers.value()); | ||||
|       curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_headers); | ||||
|     } | ||||
|  | ||||
|     read_write_info write_info{ | ||||
|         {}, | ||||
|         [&stop_requested]() -> bool { | ||||
|           return stop_requested || app_config::get_stop_requested(); | ||||
|         }, | ||||
|     }; | ||||
|     if (request.response_handler.has_value()) { | ||||
|       curl_easy_setopt(curl, CURLOPT_WRITEDATA, &write_info); | ||||
|       curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); | ||||
|     } | ||||
|  | ||||
|     std::string parameters{}; | ||||
|     for (const auto ¶m : request.query) { | ||||
|       parameters += (parameters.empty() ? '?' : '&') + param.first + '=' + | ||||
|                     url_encode(curl, param.second, false); | ||||
|     } | ||||
|  | ||||
|     if (not cfg.api_password.empty()) { | ||||
|       curl_easy_setopt(curl, CURLOPT_USERNAME, cfg.api_user.c_str()); | ||||
|       curl_easy_setopt(curl, CURLOPT_PASSWORD, cfg.api_password.c_str()); | ||||
|     } else if (not cfg.api_user.empty()) { | ||||
|       curl_easy_setopt(curl, CURLOPT_USERNAME, cfg.api_user.c_str()); | ||||
|     } | ||||
|  | ||||
|     if (request.aws_service.has_value()) { | ||||
|       curl_easy_setopt(curl, CURLOPT_AWS_SIGV4, | ||||
|                        request.aws_service.value().c_str()); | ||||
|     } | ||||
|  | ||||
|     curl_slist *header_list{nullptr}; | ||||
|     if (not request.headers.empty()) { | ||||
|       for (const auto &header : request.headers) { | ||||
|         header_list = curl_slist_append( | ||||
|             header_list, | ||||
|             fmt::format("{}: {}", header.first, header.second).c_str()); | ||||
|       } | ||||
|       curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list); | ||||
|     } | ||||
|  | ||||
|     auto url = construct_url(curl, request.get_path(), cfg) + parameters; | ||||
|     curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); | ||||
|  | ||||
|     multi_request curl_request(curl, stop_requested); | ||||
|  | ||||
|     CURLcode curl_code{}; | ||||
|     curl_request.get_result(curl_code, response_code); | ||||
|     const auto do_request = [&]() -> bool { | ||||
|       if (request.decryption_token.has_value() && | ||||
|           not request.decryption_token.value().empty()) { | ||||
|         return make_encrypted_request(cfg, request, response_code, | ||||
|                                       stop_requested); | ||||
|       } | ||||
|  | ||||
|     if (header_list != nullptr) { | ||||
|       curl_slist_free_all(header_list); | ||||
|       response_code = 0; | ||||
|  | ||||
|       auto *curl = create_curl(); | ||||
|       if (not request.set_method(curl, stop_requested)) { | ||||
|         return false; | ||||
|       } | ||||
|  | ||||
|       if (not cfg.agent_string.empty()) { | ||||
|         curl_easy_setopt(curl, CURLOPT_USERAGENT, cfg.agent_string.c_str()); | ||||
|       } | ||||
|  | ||||
|       if (request.allow_timeout && cfg.timeout_ms) { | ||||
|         curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, cfg.timeout_ms); | ||||
|       } | ||||
|  | ||||
|       std::string range_list{}; | ||||
|       if (request.range.has_value()) { | ||||
|         range_list = std::to_string(request.range.value().begin) + '-' + | ||||
|                      std::to_string(request.range.value().end); | ||||
|         curl_easy_setopt(curl, CURLOPT_RANGE, range_list.c_str()); | ||||
|       } | ||||
|  | ||||
|       if (request.response_headers.has_value()) { | ||||
|         curl_easy_setopt(curl, CURLOPT_HEADERDATA, | ||||
|                          &request.response_headers.value()); | ||||
|         curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_headers); | ||||
|       } | ||||
|  | ||||
|       read_write_info write_info{ | ||||
|           {}, | ||||
|           [&stop_requested]() -> bool { | ||||
|             return stop_requested || app_config::get_stop_requested(); | ||||
|           }, | ||||
|       }; | ||||
|       if (request.response_handler.has_value()) { | ||||
|         curl_easy_setopt(curl, CURLOPT_WRITEDATA, &write_info); | ||||
|         curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); | ||||
|       } | ||||
|  | ||||
|       std::string parameters{}; | ||||
|       for (const auto ¶m : request.query) { | ||||
|         parameters += (parameters.empty() ? '?' : '&') + param.first + '=' + | ||||
|                       url_encode(curl, param.second, false); | ||||
|       } | ||||
|  | ||||
|       if (not cfg.api_password.empty()) { | ||||
|         curl_easy_setopt(curl, CURLOPT_USERNAME, cfg.api_user.c_str()); | ||||
|         curl_easy_setopt(curl, CURLOPT_PASSWORD, cfg.api_password.c_str()); | ||||
|       } else if (not cfg.api_user.empty()) { | ||||
|         curl_easy_setopt(curl, CURLOPT_USERNAME, cfg.api_user.c_str()); | ||||
|       } | ||||
|  | ||||
|       if (request.aws_service.has_value()) { | ||||
|         curl_easy_setopt(curl, CURLOPT_AWS_SIGV4, | ||||
|                          request.aws_service.value().c_str()); | ||||
|       } | ||||
|  | ||||
|       curl_slist *header_list{nullptr}; | ||||
|       if (not request.headers.empty()) { | ||||
|         for (const auto &header : request.headers) { | ||||
|           header_list = curl_slist_append( | ||||
|               header_list, | ||||
|               fmt::format("{}: {}", header.first, header.second).c_str()); | ||||
|         } | ||||
|         curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list); | ||||
|       } | ||||
|  | ||||
|       curl_shared::set_share(curl); | ||||
|  | ||||
|       auto url = construct_url(curl, request.get_path(), cfg) + parameters; | ||||
|       curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); | ||||
|  | ||||
|       multi_request curl_request(curl, stop_requested); | ||||
|  | ||||
|       curl_code = CURLE_OK; | ||||
|       curl_request.get_result(curl_code, response_code); | ||||
|  | ||||
|       if (header_list != nullptr) { | ||||
|         curl_slist_free_all(header_list); | ||||
|       } | ||||
|  | ||||
|       if (curl_code != CURLE_OK) { | ||||
|         event_system::instance().raise<curl_error>(curl_code, function_name, | ||||
|                                                    request.get_type(), url); | ||||
|         return false; | ||||
|       } | ||||
|  | ||||
|       if (request.response_handler.has_value()) { | ||||
|         request.response_handler.value()(write_info.data, response_code); | ||||
|       } | ||||
|  | ||||
|       return true; | ||||
|     }; | ||||
|  | ||||
|     bool ret{false}; | ||||
|     for (std::uint8_t retry = 0U; !ret && retry < retry_request_count; | ||||
|          ++retry) { | ||||
|       ret = do_request(); | ||||
|       if (ret) { | ||||
|         break; | ||||
|       } | ||||
|  | ||||
|       if (curl_code == CURLE_COULDNT_RESOLVE_HOST) { | ||||
|         std::this_thread::sleep_for(1s); | ||||
|         continue; | ||||
|       } | ||||
|  | ||||
|       break; | ||||
|     } | ||||
|  | ||||
|     if (curl_code != CURLE_OK) { | ||||
|       event_system::instance().raise<curl_error>(curl_code, function_name, | ||||
|                                                   url); | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|     if (request.response_handler.has_value()) { | ||||
|       request.response_handler.value()(write_info.data, response_code); | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
|     return ret; | ||||
|   } | ||||
|  | ||||
| public: | ||||
|   void enable_s3_path_style(bool enable) override; | ||||
|  | ||||
|   [[nodiscard]] auto make_request(const curl::requests::http_delete &del, | ||||
|                                   long &response_code, | ||||
|                                   stop_type &stop_requested) const | ||||
|   | ||||
							
								
								
									
										67
									
								
								repertory/librepertory/include/comm/curl/curl_shared.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								repertory/librepertory/include/comm/curl/curl_shared.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <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_COMM_CURL_CURL_SHARED_HPP_ | ||||
| #define REPERTORY_INCLUDE_COMM_CURL_CURL_SHARED_HPP_ | ||||
|  | ||||
| namespace repertory { | ||||
| class curl_shared final { | ||||
| private: | ||||
|   struct curl_sh_deleter final { | ||||
|     void operator()(CURLSH *ptr) { | ||||
|       if (ptr != nullptr) { | ||||
|         curl_share_cleanup(ptr); | ||||
|       } | ||||
|     } | ||||
|   }; | ||||
|  | ||||
|   using curl_sh_t = std::unique_ptr<CURLSH, curl_sh_deleter>; | ||||
|  | ||||
| public: | ||||
|   curl_shared() = delete; | ||||
|   curl_shared(const curl_shared &) = delete; | ||||
|   curl_shared(curl_shared &&) = delete; | ||||
|   ~curl_shared() = delete; | ||||
|  | ||||
|   auto operator=(const curl_shared &) -> curl_shared & = delete; | ||||
|   auto operator=(curl_shared &&) -> curl_shared & = delete; | ||||
|  | ||||
| private: | ||||
|   static curl_sh_t cache_; | ||||
|   static std::recursive_mutex mtx_; | ||||
|  | ||||
| private: | ||||
|   static void lock_callback(CURL * /* curl */, curl_lock_data /* data */, | ||||
|                             curl_lock_access /* access */, void * /* ptr */); | ||||
|  | ||||
|   static void unlock_callback(CURL * /* curl */, curl_lock_data /* data */, | ||||
|                               curl_lock_access /* access */, void * /* ptr */); | ||||
|  | ||||
| public: | ||||
|   static void cleanup(); | ||||
|  | ||||
|   [[nodiscard]] static auto init() -> bool; | ||||
|  | ||||
|   static void set_share(CURL *curl); | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_COMM_CURL_DNS_CACHE_HPP_ | ||||
| @@ -26,11 +26,13 @@ | ||||
|  | ||||
| namespace repertory::curl::requests { | ||||
| struct http_delete final : http_request_base { | ||||
|   ~http_delete() override = default; | ||||
|   [[nodiscard]] auto get_type() const -> std::string override { | ||||
|     return "delete"; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   set_method(CURL *curl, | ||||
|              stop_type & /* stop_requested */) const -> bool override { | ||||
|   [[nodiscard]] auto set_method(CURL *curl, | ||||
|                                 stop_type & /* stop_requested */) const | ||||
|       -> bool override { | ||||
|     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE"); | ||||
|     return true; | ||||
|   } | ||||
|   | ||||
| @@ -33,9 +33,11 @@ struct http_get final : http_request_base { | ||||
|   auto operator=(http_get &&) -> http_get & = default; | ||||
|   ~http_get() override = default; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   set_method(CURL *curl, | ||||
|              stop_type & /*stop_requested*/) const -> bool override { | ||||
|   [[nodiscard]] auto get_type() const -> std::string override { return "get"; } | ||||
|  | ||||
|   [[nodiscard]] auto set_method(CURL *curl, | ||||
|                                 stop_type & /*stop_requested*/) const | ||||
|       -> bool override { | ||||
|     curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); | ||||
|     return true; | ||||
|   } | ||||
|   | ||||
| @@ -26,11 +26,11 @@ | ||||
|  | ||||
| namespace repertory::curl::requests { | ||||
| struct http_head final : http_request_base { | ||||
|   ~http_head() override = default; | ||||
|   [[nodiscard]] auto get_type() const -> std::string override { return "head"; } | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   set_method(CURL *curl, | ||||
|              stop_type & /* stop_requested */) const -> bool override { | ||||
|   [[nodiscard]] auto set_method(CURL *curl, | ||||
|                                 stop_type & /* stop_requested */) const | ||||
|       -> bool override { | ||||
|     curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "HEAD"); | ||||
|     curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); | ||||
|     return true; | ||||
|   | ||||
| @@ -26,16 +26,10 @@ | ||||
|  | ||||
| namespace repertory::curl::requests { | ||||
| struct http_post final : http_request_base { | ||||
|   http_post() = default; | ||||
|   http_post(const http_post &) = default; | ||||
|   http_post(http_post &&) = default; | ||||
|   auto operator=(const http_post &) -> http_post & = default; | ||||
|   auto operator=(http_post &&) -> http_post & = default; | ||||
|  | ||||
|   ~http_post() override = default; | ||||
|  | ||||
|   std::optional<nlohmann::json> json; | ||||
|  | ||||
|   [[nodiscard]] auto get_type() const -> std::string override { return "post"; } | ||||
|  | ||||
|   [[nodiscard]] auto set_method(CURL *curl, | ||||
|                                 stop_type & /*stop_requested*/) const | ||||
|       -> bool override; | ||||
|   | ||||
| @@ -27,18 +27,11 @@ | ||||
|  | ||||
| namespace repertory::curl::requests { | ||||
| struct http_put_file final : http_request_base { | ||||
|   http_put_file() = default; | ||||
|   http_put_file(const http_put_file &) = default; | ||||
|   http_put_file(http_put_file &&) = default; | ||||
|  | ||||
|   auto operator=(const http_put_file &) -> http_put_file & = default; | ||||
|   auto operator=(http_put_file &&) -> http_put_file & = default; | ||||
|  | ||||
|   ~http_put_file() override = default; | ||||
|  | ||||
|   std::shared_ptr<utils::encryption::encrypting_reader> reader; | ||||
|   std::string source_path; | ||||
|  | ||||
|   [[nodiscard]] auto get_type() const -> std::string override { return "put"; } | ||||
|  | ||||
|   [[nodiscard]] auto set_method(CURL *curl, stop_type &stop_requested) const | ||||
|       -> bool override; | ||||
|  | ||||
|   | ||||
| @@ -61,6 +61,8 @@ struct http_request_base { | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_path() const -> std::string { return path; } | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_type() const -> std::string = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto set_method(CURL *curl, | ||||
|                                         stop_type &stop_requested) const | ||||
|       -> bool = 0; | ||||
|   | ||||
| @@ -34,28 +34,29 @@ struct i_http_comm { | ||||
|   INTERFACE_SETUP(i_http_comm); | ||||
|  | ||||
| public: | ||||
|   virtual void enable_s3_path_style(bool enable) = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   make_request(const curl::requests::http_delete &del, long &response_code, | ||||
|                stop_type &stop_requested) const -> bool = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   make_request(const curl::requests::http_get &get, long &response_code, | ||||
|                stop_type &stop_requested) const -> bool = 0; | ||||
|   [[nodiscard]] virtual auto make_request(const curl::requests::http_get &get, | ||||
|                                           long &response_code, | ||||
|                                           stop_type &stop_requested) const | ||||
|       -> bool = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   make_request(const curl::requests::http_head &head, long &response_code, | ||||
|                stop_type &stop_requested) const -> bool = 0; | ||||
|   [[nodiscard]] virtual auto make_request(const curl::requests::http_head &head, | ||||
|                                           long &response_code, | ||||
|                                           stop_type &stop_requested) const | ||||
|       -> bool = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   make_request(const curl::requests::http_post &post, long &response_code, | ||||
|                stop_type &stop_requested) const -> bool = 0; | ||||
|   [[nodiscard]] virtual auto make_request(const curl::requests::http_post &post, | ||||
|                                           long &response_code, | ||||
|                                           stop_type &stop_requested) const | ||||
|       -> bool = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   make_request(const curl::requests::http_put_file &put_file, | ||||
|                long &response_code, | ||||
|                stop_type &stop_requested) const -> bool = 0; | ||||
|                long &response_code, stop_type &stop_requested) const | ||||
|       -> bool = 0; | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
|   | ||||
| @@ -94,7 +94,7 @@ private: | ||||
|   bool shutdown_ = false; | ||||
|  | ||||
| private: | ||||
|   static constexpr const auto min_pool_size = 10U; | ||||
|   static constexpr auto min_pool_size = 10U; | ||||
|  | ||||
| public: | ||||
|   void execute(const std::string &client_id, std::uint64_t thread_id, | ||||
|   | ||||
| @@ -54,12 +54,13 @@ REPERTORY_IGNORE_WARNINGS_DISABLE() | ||||
| using namespace std::chrono_literals; | ||||
| using json = nlohmann::json; | ||||
|  | ||||
| inline constexpr const std::string_view REPERTORY = "repertory"; | ||||
| inline constexpr const std::wstring_view REPERTORY_W = L"repertory"; | ||||
| inline constexpr std::string_view REPERTORY{"repertory"}; | ||||
| inline constexpr std::string_view REPERTORY_DATA_NAME{"repertory2"}; | ||||
| inline constexpr std::wstring_view REPERTORY_W{L"repertory"}; | ||||
|  | ||||
| inline constexpr const std::uint64_t REPERTORY_CONFIG_VERSION = 2ULL; | ||||
| inline constexpr const std::string_view REPERTORY_DATA_NAME = "repertory2"; | ||||
| inline constexpr const std::string_view REPERTORY_MIN_REMOTE_VERSION = "2.0.0"; | ||||
| inline constexpr std::uint64_t REPERTORY_CONFIG_VERSION{2ULL}; | ||||
| inline constexpr std::string_view REPERTORY_MIN_REMOTE_VERSION{"2.0.0"}; | ||||
| inline constexpr std::string_view RENTERD_MIN_VERSION{"2.0.0"}; | ||||
|  | ||||
| #define REPERTORY_INVALID_HANDLE INVALID_HANDLE_VALUE | ||||
|  | ||||
| @@ -221,11 +222,11 @@ using WCHAR = wchar_t; | ||||
|  | ||||
| #define MAX_PATH 260 | ||||
|  | ||||
| #define STATUS_SUCCESS std::uint32_t{0U} | ||||
| #define STATUS_ACCESS_DENIED std::uint32_t{0xC0000022L} | ||||
| #define STATUS_DEVICE_BUSY std::uint32_t{0x80000011L} | ||||
| #define STATUS_DEVICE_INSUFFICIENT_RESOURCES std::uint32_t{0xC0000468L} | ||||
| #define STATUS_DIRECTORY_NOT_EMPTY std::uint32_t{0xC0000101L} | ||||
| #define STATUS_END_OF_FILE std::uint32_t{0xC0000011L} | ||||
| #define STATUS_FILE_IS_A_DIRECTORY std::uint32_t{0xC00000BAL} | ||||
| #define STATUS_FILE_TOO_LARGE std::uint32_t{0xC0000904L} | ||||
| #define STATUS_INSUFFICIENT_RESOURCES std::uint32_t{0xC000009AL} | ||||
| @@ -234,11 +235,13 @@ using WCHAR = wchar_t; | ||||
| #define STATUS_INVALID_HANDLE std::uint32_t{0xC0000006L} | ||||
| #define STATUS_INVALID_IMAGE_FORMAT std::uint32_t{0xC000007BL} | ||||
| #define STATUS_INVALID_PARAMETER std::uint32_t{0xC000000DL} | ||||
| #define STATUS_NO_MEMORY std::uint32_t{0xC0000017L} | ||||
| #define STATUS_NOT_IMPLEMENTED std::uint32_t{0xC0000002L} | ||||
| #define STATUS_NO_MEMORY std::uint32_t{0xC0000017L} | ||||
| #define STATUS_OBJECT_NAME_COLLISION std::uint32_t{0xC0000035L} | ||||
| #define STATUS_OBJECT_NAME_EXISTS std::uint32_t{0x40000000L} | ||||
| #define STATUS_OBJECT_NAME_NOT_FOUND std::uint32_t{0xC0000034L} | ||||
| #define STATUS_OBJECT_PATH_INVALID std::uint32_t{0xC0000039L} | ||||
| #define STATUS_SUCCESS std::uint32_t{0U} | ||||
| #define STATUS_UNEXPECTED_IO_ERROR std::uint32_t{0xC00000E9L} | ||||
|  | ||||
| #define CONVERT_STATUS_NOT_IMPLEMENTED(e)                                      \ | ||||
|   | ||||
| @@ -50,14 +50,14 @@ public: | ||||
|   [[nodiscard]] auto fill_buffer(const remote::file_offset &offset, | ||||
|                                  fuse_fill_dir_t filler_function, void *buffer, | ||||
|                                  populate_stat_callback populate_stat) -> int; | ||||
| #endif | ||||
| #endif // !defined(_WIN32) | ||||
|  | ||||
|   [[nodiscard]] auto get(std::size_t offset, std::string &item) -> int; | ||||
|  | ||||
|   [[nodiscard]] auto get_count() const -> std::size_t { return items_.size(); } | ||||
|  | ||||
|   [[nodiscard]] auto get_directory_item(std::size_t offset, | ||||
|                                         directory_item &di) -> api_error; | ||||
|   [[nodiscard]] auto get_directory_item(std::size_t offset, directory_item &di) | ||||
|       -> api_error; | ||||
|  | ||||
|   [[nodiscard]] auto get_directory_item(const std::string &api_path, | ||||
|                                         directory_item &di) -> api_error; | ||||
| @@ -71,8 +71,8 @@ public: | ||||
|   auto operator=(const directory_iterator &iterator) noexcept | ||||
|       -> directory_iterator &; | ||||
|  | ||||
|   auto | ||||
|   operator=(directory_iterator &&iterator) noexcept -> directory_iterator &; | ||||
|   auto operator=(directory_iterator &&iterator) noexcept | ||||
|       -> directory_iterator &; | ||||
|  | ||||
|   auto operator=(directory_item_list list) noexcept -> directory_iterator &; | ||||
| }; | ||||
|   | ||||
| @@ -61,7 +61,7 @@ private: | ||||
|   static auto instance() -> fuse_base &; | ||||
|  | ||||
| private: | ||||
|   struct fuse_operations fuse_ops_ {}; | ||||
|   struct fuse_operations fuse_ops_{}; | ||||
|  | ||||
| private: | ||||
|   [[nodiscard]] auto | ||||
| @@ -78,9 +78,9 @@ private: | ||||
|   static void execute_void_callback(std::string_view function_name, | ||||
|                                     const std::function<void()> &cb); | ||||
|  | ||||
|   static auto | ||||
|   execute_void_pointer_callback(std::string_view function_name, | ||||
|                                 const std::function<void *()> &cb) -> void *; | ||||
|   static auto execute_void_pointer_callback(std::string_view function_name, | ||||
|                                             const std::function<void *()> &cb) | ||||
|       -> void *; | ||||
|  | ||||
|   void raise_fuse_event(std::string_view function_name, | ||||
|                         std::string_view api_path, int ret, | ||||
| @@ -91,22 +91,22 @@ private: | ||||
|  | ||||
| #if defined(__APPLE__) | ||||
|   [[nodiscard]] static auto chflags_(const char *path, uint32_t flags) -> int; | ||||
| #endif // __APPLE__ | ||||
| #endif // defined(__APPLE__) | ||||
|  | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   [[nodiscard]] static auto chmod_(const char *path, mode_t mode, | ||||
|                                    struct fuse_file_info *fi) -> int; | ||||
| #else | ||||
| #else  // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] static auto chmod_(const char *path, mode_t mode) -> int; | ||||
| #endif | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   [[nodiscard]] static auto chown_(const char *path, uid_t uid, gid_t gid, | ||||
|                                    struct fuse_file_info *fi) -> int; | ||||
| #else | ||||
|   [[nodiscard]] static auto chown_(const char *path, uid_t uid, | ||||
|                                    gid_t gid) -> int; | ||||
| #endif | ||||
| #else  // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] static auto chown_(const char *path, uid_t uid, gid_t gid) | ||||
|       -> int; | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
|   [[nodiscard]] static auto create_(const char *path, mode_t mode, | ||||
|                                     struct fuse_file_info *fi) -> int; | ||||
| @@ -114,19 +114,19 @@ private: | ||||
|   static void destroy_(void *ptr); | ||||
|  | ||||
|   [[nodiscard]] static auto fallocate_(const char *path, int mode, off_t offset, | ||||
|                                        off_t length, | ||||
|                                        struct fuse_file_info *fi) -> int; | ||||
|                                        off_t length, struct fuse_file_info *fi) | ||||
|       -> int; | ||||
|  | ||||
| #if FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] static auto fgetattr_(const char *path, struct stat *st, | ||||
|                                       struct fuse_file_info *fi) -> int; | ||||
| #endif | ||||
| #endif // FUSE_USE_VERSION < 30 | ||||
|  | ||||
| #if defined(__APPLE__) | ||||
|   [[nodiscard]] static auto fsetattr_x_(const char *path, | ||||
|                                         struct setattr_x *attr, | ||||
|                                         struct fuse_file_info *fi) -> int; | ||||
| #endif // __APPLE__ | ||||
| #endif // defined(__APPLE__) | ||||
|  | ||||
|   [[nodiscard]] static auto fsync_(const char *path, int datasync, | ||||
|                                    struct fuse_file_info *fi) -> int; | ||||
| @@ -137,27 +137,27 @@ private: | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   [[nodiscard]] static auto getattr_(const char *path, struct stat *st, | ||||
|                                      struct fuse_file_info *fi) -> int; | ||||
| #else | ||||
| #else  // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] static auto getattr_(const char *path, struct stat *st) -> int; | ||||
| #endif | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
| #if defined(__APPLE__) | ||||
|   [[nodiscard]] static auto getxtimes_(const char *path, | ||||
|                                        struct timespec *bkuptime, | ||||
|                                        struct timespec *crtime) -> int; | ||||
| #endif // __APPLE__ | ||||
| #endif // defined(__APPLE__) | ||||
|  | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   [[nodiscard]] static auto init_(struct fuse_conn_info *conn, | ||||
|                                   struct fuse_config *cfg) -> void *; | ||||
| #else | ||||
| #else  // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] static auto init_(struct fuse_conn_info *conn) -> void *; | ||||
| #endif | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
|   [[nodiscard]] static auto mkdir_(const char *path, mode_t mode) -> int; | ||||
|  | ||||
|   [[nodiscard]] static auto open_(const char *path, | ||||
|                                   struct fuse_file_info *fi) -> int; | ||||
|   [[nodiscard]] static auto open_(const char *path, struct fuse_file_info *fi) | ||||
|       -> int; | ||||
|  | ||||
|   [[nodiscard]] static auto opendir_(const char *path, | ||||
|                                      struct fuse_file_info *fi) -> int; | ||||
| @@ -171,12 +171,12 @@ private: | ||||
|                                      fuse_fill_dir_t fuse_fill_dir, | ||||
|                                      off_t offset, struct fuse_file_info *fi, | ||||
|                                      fuse_readdir_flags flags) -> int; | ||||
| #else | ||||
| #else  // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] static auto readdir_(const char *path, void *buf, | ||||
|                                      fuse_fill_dir_t fuse_fill_dir, | ||||
|                                      off_t offset, | ||||
|                                      struct fuse_file_info *fi) -> int; | ||||
| #endif | ||||
|                                      off_t offset, struct fuse_file_info *fi) | ||||
|       -> int; | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
|   [[nodiscard]] static auto release_(const char *path, | ||||
|                                      struct fuse_file_info *fi) -> int; | ||||
| @@ -187,9 +187,9 @@ private: | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   [[nodiscard]] static auto rename_(const char *from, const char *to, | ||||
|                                     unsigned int flags) -> int; | ||||
| #else | ||||
| #else  // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] static auto rename_(const char *from, const char *to) -> int; | ||||
| #endif | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
|   [[nodiscard]] static auto rmdir_(const char *path) -> int; | ||||
|  | ||||
| @@ -199,35 +199,36 @@ private: | ||||
|                                       char *value, size_t size, | ||||
|                                       uint32_t position) -> int; | ||||
|  | ||||
| #else  // __APPLE__ | ||||
| #else  // !defined(__APPLE__) | ||||
|   [[nodiscard]] static auto getxattr_(const char *path, const char *name, | ||||
|                                       char *value, size_t size) -> int; | ||||
| #endif // __APPLE__ | ||||
| #endif // defined(__APPLE__) | ||||
|  | ||||
|   [[nodiscard]] static auto listxattr_(const char *path, char *buffer, | ||||
|                                        size_t size) -> int; | ||||
|  | ||||
|   [[nodiscard]] static auto removexattr_(const char *path, | ||||
|                                          const char *name) -> int; | ||||
|   [[nodiscard]] static auto removexattr_(const char *path, const char *name) | ||||
|       -> int; | ||||
|  | ||||
| #if defined(__APPLE__) | ||||
|   [[nodiscard]] static auto setxattr_(const char *path, const char *name, | ||||
|                                       const char *value, size_t size, int flags, | ||||
|                                       uint32_t position) -> int; | ||||
|  | ||||
| #else  // __APPLE__ | ||||
| #else  // !defined(__APPLE__) | ||||
|   [[nodiscard]] static auto setxattr_(const char *path, const char *name, | ||||
|                                       const char *value, size_t size, | ||||
|                                       int flags) -> int; | ||||
| #endif // __APPLE__ | ||||
| #endif // HAS_SETXATTR | ||||
|                                       const char *value, size_t size, int flags) | ||||
|       -> int; | ||||
| #endif // defined(__APPLE__) | ||||
| #endif // defined(HAS_SETXATTR) | ||||
|  | ||||
| #if defined(__APPLE__) | ||||
|   [[nodiscard]] static auto setattr_x_(const char *path, | ||||
|                                        struct setattr_x *attr) -> int; | ||||
|   [[nodiscard]] static auto setattr_x_(const char *path, struct setattr_x *attr) | ||||
|       -> int; | ||||
|  | ||||
|   [[nodiscard]] static auto | ||||
|   setbkuptime_(const char *path, const struct timespec *bkuptime) -> int; | ||||
|   [[nodiscard]] static auto setbkuptime_(const char *path, | ||||
|                                          const struct timespec *bkuptime) | ||||
|       -> int; | ||||
|  | ||||
|   [[nodiscard]] static auto setchgtime_(const char *path, | ||||
|                                         const struct timespec *chgtime) -> int; | ||||
| @@ -237,20 +238,20 @@ private: | ||||
|  | ||||
|   [[nodiscard]] static auto setvolname_(const char *volname) -> int; | ||||
|  | ||||
|   [[nodiscard]] static auto statfs_x_(const char *path, | ||||
|                                       struct statfs *stbuf) -> int; | ||||
|   [[nodiscard]] static auto statfs_x_(const char *path, struct statfs *stbuf) | ||||
|       -> int; | ||||
|  | ||||
| #else  // __APPLE__ | ||||
|   [[nodiscard]] static auto statfs_(const char *path, | ||||
|                                     struct statvfs *stbuf) -> int; | ||||
| #endif // __APPLE__ | ||||
| #else  // !defined(__APPLE__) | ||||
|   [[nodiscard]] static auto statfs_(const char *path, struct statvfs *stbuf) | ||||
|       -> int; | ||||
| #endif // defined(__APPLE__) | ||||
|  | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   [[nodiscard]] static auto truncate_(const char *path, off_t size, | ||||
|                                       struct fuse_file_info *fi) -> int; | ||||
| #else | ||||
| #else  // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] static auto truncate_(const char *path, off_t size) -> int; | ||||
| #endif | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
|   [[nodiscard]] static auto unlink_(const char *path) -> int; | ||||
|  | ||||
| @@ -258,18 +259,18 @@ private: | ||||
|   [[nodiscard]] static auto utimens_(const char *path, | ||||
|                                      const struct timespec tv[2], | ||||
|                                      struct fuse_file_info *fi) -> int; | ||||
| #else | ||||
| #else  // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] static auto utimens_(const char *path, | ||||
|                                      const struct timespec tv[2]) -> int; | ||||
| #endif | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
|   [[nodiscard]] static auto write_(const char *path, const char *buffer, | ||||
|                                    size_t write_size, off_t write_offset, | ||||
|                                    struct fuse_file_info *fi) -> int; | ||||
|  | ||||
| protected: | ||||
|   [[nodiscard]] virtual auto access_impl(std::string /*api_path*/, | ||||
|                                          int /*mask*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto access_impl(std::string /*api_path*/, int /*mask*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
|  | ||||
| @@ -278,37 +279,40 @@ protected: | ||||
|                                           uint32_t /*flags*/) -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #endif // __APPLE__ | ||||
| #endif // defined(__APPLE__) | ||||
|  | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   [[nodiscard]] virtual auto | ||||
|   chmod_impl(std::string /*api_path*/, mode_t /*mode*/, | ||||
|              struct fuse_file_info * /*fi*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto chmod_impl(std::string /*api_path*/, | ||||
|                                         mode_t /*mode*/, | ||||
|                                         struct fuse_file_info * /*fi*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #else | ||||
| #else //FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] virtual auto chmod_impl(std::string /*api_path*/, | ||||
|                                         mode_t /*mode*/) -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #endif | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   [[nodiscard]] virtual auto | ||||
|   chown_impl(std::string /*api_path*/, uid_t /*uid*/, gid_t /*gid*/, | ||||
|              struct fuse_file_info * /*fi*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto chown_impl(std::string /*api_path*/, uid_t /*uid*/, | ||||
|                                         gid_t /*gid*/, | ||||
|                                         struct fuse_file_info * /*fi*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #else | ||||
| #else // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] virtual auto chown_impl(std::string /*api_path*/, uid_t /*uid*/, | ||||
|                                         gid_t /*gid*/) -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #endif | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   create_impl(std::string /*api_path*/, mode_t /*mode*/, | ||||
|               struct fuse_file_info * /*fi*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto create_impl(std::string /*api_path*/, | ||||
|                                          mode_t /*mode*/, | ||||
|                                          struct fuse_file_info * /*fi*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
|  | ||||
| @@ -316,81 +320,87 @@ protected: | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   fallocate_impl(std::string /*api_path*/, int /*mode*/, off_t /*offset*/, | ||||
|                  off_t /*length*/, | ||||
|                  struct fuse_file_info * /*fi*/) -> api_error { | ||||
|                  off_t /*length*/, struct fuse_file_info * /*fi*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   fgetattr_impl(std::string /*api_path*/, struct stat * /*st*/, | ||||
|                 struct fuse_file_info * /*fi*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto fgetattr_impl(std::string /*api_path*/, | ||||
|                                            struct stat * /*st*/, | ||||
|                                            struct fuse_file_info * /*fi*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
|  | ||||
| #if defined(__APPLE__) | ||||
|   [[nodiscard]] virtual auto | ||||
|   fsetattr_x_impl(std::string /*api_path*/, struct setattr_x * /*attr*/, | ||||
|                   struct fuse_file_info * /*fi*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto fsetattr_x_impl(std::string /*api_path*/, | ||||
|                                              struct setattr_x * /*attr*/, | ||||
|                                              struct fuse_file_info * /*fi*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #endif // __APPLE__ | ||||
| #endif // defined(__APPLE__) | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   fsync_impl(std::string /*api_path*/, int /*datasync*/, | ||||
|              struct fuse_file_info * /*fi*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto fsync_impl(std::string /*api_path*/, | ||||
|                                         int /*datasync*/, | ||||
|                                         struct fuse_file_info * /*fi*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
|  | ||||
| #if FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] virtual auto | ||||
|   ftruncate_impl(std::string /*api_path*/, off_t /*size*/, | ||||
|                  struct fuse_file_info * /*fi*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto ftruncate_impl(std::string /*api_path*/, | ||||
|                                             off_t /*size*/, | ||||
|                                             struct fuse_file_info * /*fi*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #endif | ||||
| #endif // FUSE_USE_VERSION < 30 | ||||
|  | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   [[nodiscard]] virtual auto | ||||
|   getattr_impl(std::string /*api_path*/, struct stat * /*st*/, | ||||
|                struct fuse_file_info * /*fi*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto getattr_impl(std::string /*api_path*/, | ||||
|                                           struct stat * /*st*/, | ||||
|                                           struct fuse_file_info * /*fi*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #else | ||||
| #else // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] virtual auto getattr_impl(std::string /*api_path*/, | ||||
|                                           struct stat * /*st*/) -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #endif | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
| #if defined(__APPLE__) | ||||
|   [[nodiscard]] virtual auto | ||||
|   getxtimes_impl(std::string /*api_path*/, struct timespec * /*bkuptime*/, | ||||
|                  struct timespec * /*crtime*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto getxtimes_impl(std::string /*api_path*/, | ||||
|                                             struct timespec * /*bkuptime*/, | ||||
|                                             struct timespec * /*crtime*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #endif // __APPLE__ | ||||
| #endif // defined(__APPLE__) | ||||
|  | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   virtual auto init_impl(struct fuse_conn_info *conn, | ||||
|                          struct fuse_config *cfg) -> void *; | ||||
| #else | ||||
|   virtual auto init_impl(struct fuse_conn_info *conn, struct fuse_config *cfg) | ||||
|       -> void *; | ||||
| #else // FUSE_USE_VERSION < 30 | ||||
|   virtual auto init_impl(struct fuse_conn_info *conn) -> void *; | ||||
| #endif | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
|   [[nodiscard]] virtual auto mkdir_impl(std::string /*api_path*/, | ||||
|                                         mode_t /*mode*/) -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   open_impl(std::string /*api_path*/, | ||||
|             struct fuse_file_info * /*fi*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto open_impl(std::string /*api_path*/, | ||||
|                                        struct fuse_file_info * /*fi*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   opendir_impl(std::string /*api_path*/, | ||||
|                struct fuse_file_info * /*fi*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto opendir_impl(std::string /*api_path*/, | ||||
|                                           struct fuse_file_info * /*fi*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
|  | ||||
| @@ -405,28 +415,28 @@ protected: | ||||
|   [[nodiscard]] virtual auto | ||||
|   readdir_impl(std::string /*api_path*/, void * /*buf*/, | ||||
|                fuse_fill_dir_t /*fuse_fill_dir*/, off_t /*offset*/, | ||||
|                struct fuse_file_info * /*fi*/, | ||||
|                fuse_readdir_flags /*flags*/) -> api_error { | ||||
|                struct fuse_file_info * /*fi*/, fuse_readdir_flags /*flags*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #else | ||||
| #else // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] virtual auto | ||||
|   readdir_impl(std::string /*api_path*/, void * /*buf*/, | ||||
|                fuse_fill_dir_t /*fuse_fill_dir*/, off_t /*offset*/, | ||||
|                struct fuse_file_info * /*fi*/) -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #endif | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   release_impl(std::string /*api_path*/, | ||||
|                struct fuse_file_info * /*fi*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto release_impl(std::string /*api_path*/, | ||||
|                                           struct fuse_file_info * /*fi*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   releasedir_impl(std::string /*api_path*/, | ||||
|                   struct fuse_file_info * /*fi*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto releasedir_impl(std::string /*api_path*/, | ||||
|                                              struct fuse_file_info * /*fi*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
|  | ||||
| @@ -436,13 +446,13 @@ protected: | ||||
|                                          unsigned int /*flags*/) -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #else | ||||
|   [[nodiscard]] virtual auto | ||||
|   rename_impl(std::string /*from_api_path*/, | ||||
|               std::string /*to_api_path*/) -> api_error { | ||||
| #else // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] virtual auto rename_impl(std::string /*from_api_path*/, | ||||
|                                          std::string /*to_api_path*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #endif | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
|   [[nodiscard]] virtual auto rmdir_impl(std::string /*api_path*/) -> api_error { | ||||
|     return api_error::not_implemented; | ||||
| @@ -456,14 +466,14 @@ protected: | ||||
|                 int & /*attribute_size*/) -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #else  // __APPLE__ | ||||
| #else  // !defined(__APPLE__) | ||||
|   [[nodiscard]] virtual auto | ||||
|   getxattr_impl(std::string /*api_path*/, const char * /*name*/, | ||||
|                 char * /*value*/, size_t /*size*/, | ||||
|                 int & /*attribute_size*/) -> api_error { | ||||
|                 char * /*value*/, size_t /*size*/, int & /*attribute_size*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #endif // __APPLE__ | ||||
| #endif // defined(__APPLE__) | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   listxattr_impl(std::string /*api_path*/, char * /*buffer*/, size_t /*size*/, | ||||
| @@ -471,9 +481,9 @@ protected: | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   removexattr_impl(std::string /*api_path*/, | ||||
|                    const char * /*name*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto removexattr_impl(std::string /*api_path*/, | ||||
|                                               const char * /*name*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
|  | ||||
| @@ -485,21 +495,20 @@ protected: | ||||
|                                            uint32_t /*position*/) -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #else  // __APPLE__ | ||||
|   [[nodiscard]] virtual auto setxattr_impl(std::string /*api_path*/, | ||||
|                                            const char * /*name*/, | ||||
|                                            const char * /*value*/, | ||||
|                                            size_t /*size*/, | ||||
|                                            int /*flags*/) -> api_error { | ||||
| #else  // !defined (__APPLE__) | ||||
|   [[nodiscard]] virtual auto | ||||
|   setxattr_impl(std::string /*api_path*/, const char * /*name*/, | ||||
|                 const char * /*value*/, size_t /*size*/, int /*flags*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #endif // __APPLE__ | ||||
| #endif // HAS_SETXATTR | ||||
| #endif // defined (__APPLE__) | ||||
| #endif // defined(HAS_SETXATTR) | ||||
|  | ||||
| #if defined(__APPLE__) | ||||
|   [[nodiscard]] virtual auto | ||||
|   setattr_x_impl(std::string /*api_path*/, | ||||
|                  struct setattr_x * /*attr*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto setattr_x_impl(std::string /*api_path*/, | ||||
|                                             struct setattr_x * /*attr*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
|  | ||||
| @@ -510,72 +519,74 @@ protected: | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   setchgtime_impl(std::string /*api_path*/, | ||||
|                   const struct timespec * /*chgtime*/) -> api_error { | ||||
|   setchgtime_impl(std::string /*api_path*/, const struct timespec * /*chgtime*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   setcrtime_impl(std::string /*api_path*/, | ||||
|                  const struct timespec * /*crtime*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto setcrtime_impl(std::string /*api_path*/, | ||||
|                                             const struct timespec * /*crtime*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   setvolname_impl(const char * /*volname*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto setvolname_impl(const char * /*volname*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   statfs_x_impl(std::string /*api_path*/, | ||||
|                 struct statfs * /*stbuf*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto statfs_x_impl(std::string /*api_path*/, | ||||
|                                            struct statfs * /*stbuf*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #else  // __APPLE__ | ||||
|   [[nodiscard]] virtual auto | ||||
|   statfs_impl(std::string /*api_path*/, | ||||
|               struct statvfs * /*stbuf*/) -> api_error { | ||||
| #else  // !defined(__APPLE__) | ||||
|   [[nodiscard]] virtual auto statfs_impl(std::string /*api_path*/, | ||||
|                                          struct statvfs * /*stbuf*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #endif // __APPLE__ | ||||
| #endif // defined(__APPLE__) | ||||
|  | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   [[nodiscard]] virtual auto | ||||
|   truncate_impl(std::string /*api_path*/, off_t /*size*/, | ||||
|                 struct fuse_file_info * /*fi*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto truncate_impl(std::string /*api_path*/, | ||||
|                                            off_t /*size*/, | ||||
|                                            struct fuse_file_info * /*fi*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #else | ||||
| #else // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] virtual auto truncate_impl(std::string /*api_path*/, | ||||
|                                            off_t /*size*/) -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #endif | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   unlink_impl(std::string /*api_path*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto unlink_impl(std::string /*api_path*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
|  | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   [[nodiscard]] virtual auto | ||||
|   utimens_impl(std::string /*api_path*/, const struct timespec /*tv*/[2], | ||||
|                struct fuse_file_info * /*fi*/) -> api_error { | ||||
|   [[nodiscard]] virtual auto utimens_impl(std::string /*api_path*/, | ||||
|                                           const struct timespec /*tv*/[2], | ||||
|                                           struct fuse_file_info * /*fi*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #else | ||||
|   [[nodiscard]] virtual auto | ||||
|   utimens_impl(std::string /*api_path*/, | ||||
|                const struct timespec /*tv*/[2]) -> api_error { | ||||
| #else // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] virtual auto utimens_impl(std::string /*api_path*/, | ||||
|                                           const struct timespec /*tv*/[2]) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
| #endif | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   write_impl(std::string /*api_path*/, const char * /*buffer*/, | ||||
|              size_t /*write_size*/, off_t /*write_offset*/, | ||||
|              struct fuse_file_info * /*fi*/, | ||||
|              std::size_t & /*bytes_written*/) -> api_error { | ||||
|              struct fuse_file_info * /*fi*/, std::size_t & /*bytes_written*/) | ||||
|       -> api_error { | ||||
|     return api_error::not_implemented; | ||||
|   } | ||||
|  | ||||
| @@ -603,5 +614,5 @@ public: | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif // _WIN32 | ||||
| #endif // !defined(_WIN32) | ||||
| #endif // REPERTORY_INCLUDE_DRIVES_FUSE_FUSE_BASE_HPP_ | ||||
|   | ||||
| @@ -73,92 +73,95 @@ private: | ||||
|  | ||||
| protected: | ||||
| #if defined(__APPLE__) | ||||
|   [[nodiscard]] auto chflags_impl(std::string api_path, | ||||
|                                   uint32_t flags) -> api_error override; | ||||
| #endif // __APPLE__ | ||||
|   [[nodiscard]] auto chflags_impl(std::string api_path, uint32_t flags) | ||||
|       -> api_error override; | ||||
| #endif // defined(__APPLE__{} | ||||
|  | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   [[nodiscard]] auto | ||||
|   chmod_impl(std::string api_path, mode_t mode, | ||||
|              struct fuse_file_info *file_info) -> api_error override; | ||||
| #else | ||||
|   [[nodiscard]] auto chmod_impl(std::string api_path, | ||||
|                                 mode_t mode) -> api_error override; | ||||
| #endif | ||||
|   [[nodiscard]] auto chmod_impl(std::string api_path, mode_t mode, | ||||
|                                 struct fuse_file_info *file_info) | ||||
|       -> api_error override; | ||||
| #else  // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] auto chmod_impl(std::string api_path, mode_t mode) | ||||
|       -> api_error override; | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   [[nodiscard]] auto | ||||
|   chown_impl(std::string api_path, uid_t uid, gid_t gid, | ||||
|              struct fuse_file_info *file_info) -> api_error override; | ||||
| #else | ||||
|   [[nodiscard]] auto chown_impl(std::string api_path, uid_t uid, | ||||
|                                 gid_t gid) -> api_error override; | ||||
| #endif | ||||
|   [[nodiscard]] auto chown_impl(std::string api_path, uid_t uid, gid_t gid, | ||||
|                                 struct fuse_file_info *file_info) | ||||
|       -> api_error override; | ||||
| #else  // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] auto chown_impl(std::string api_path, uid_t uid, gid_t gid) | ||||
|       -> api_error override; | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   create_impl(std::string api_path, mode_t mode, | ||||
|               struct fuse_file_info *file_info) -> api_error override; | ||||
|   [[nodiscard]] auto create_impl(std::string api_path, mode_t mode, | ||||
|                                  struct fuse_file_info *file_info) | ||||
|       -> api_error override; | ||||
|  | ||||
|   void destroy_impl(void *ptr) override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   fallocate_impl(std::string api_path, int mode, off_t offset, off_t length, | ||||
|                  struct fuse_file_info *file_info) -> api_error override; | ||||
|   [[nodiscard]] auto fallocate_impl(std::string api_path, int mode, | ||||
|                                     off_t offset, off_t length, | ||||
|                                     struct fuse_file_info *file_info) | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   fgetattr_impl(std::string api_path, struct stat *unix_st, | ||||
|                 struct fuse_file_info *file_info) -> api_error override; | ||||
|   [[nodiscard]] auto fgetattr_impl(std::string api_path, struct stat *unix_st, | ||||
|                                    struct fuse_file_info *file_info) | ||||
|       -> api_error override; | ||||
|  | ||||
| #if defined(__APPLE__) | ||||
|   [[nodiscard]] auto | ||||
|   fsetattr_x_impl(std::string api_path, struct setattr_x *attr, | ||||
|                   struct fuse_file_info *file_info) -> api_error override; | ||||
| #endif // __APPLE__ | ||||
|   [[nodiscard]] auto fsetattr_x_impl(std::string api_path, | ||||
|                                      struct setattr_x *attr, | ||||
|                                      struct fuse_file_info *file_info) | ||||
|       -> api_error override; | ||||
| #endif // defined(__APPLE__) | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   fsync_impl(std::string api_path, int datasync, | ||||
|              struct fuse_file_info *file_info) -> api_error override; | ||||
|   [[nodiscard]] auto fsync_impl(std::string api_path, int datasync, | ||||
|                                 struct fuse_file_info *file_info) | ||||
|       -> api_error override; | ||||
|  | ||||
| #if FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] auto | ||||
|   ftruncate_impl(std::string api_path, off_t size, | ||||
|                  struct fuse_file_info *file_info) -> api_error override; | ||||
| #endif | ||||
|   [[nodiscard]] auto ftruncate_impl(std::string api_path, off_t size, | ||||
|                                     struct fuse_file_info *file_info) | ||||
|       -> api_error override; | ||||
| #endif // FUSE_USE_VERSION < 30 | ||||
|  | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   [[nodiscard]] auto | ||||
|   getattr_impl(std::string api_path, struct stat *unix_st, | ||||
|                struct fuse_file_info *file_info) -> api_error override; | ||||
| #else | ||||
|   [[nodiscard]] auto getattr_impl(std::string api_path, | ||||
|                                   struct stat *unix_st) -> api_error override; | ||||
| #endif | ||||
|   [[nodiscard]] auto getattr_impl(std::string api_path, struct stat *unix_st, | ||||
|                                   struct fuse_file_info *file_info) | ||||
|       -> api_error override; | ||||
| #else  // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] auto getattr_impl(std::string api_path, struct stat *unix_st) | ||||
|       -> api_error override; | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
| #if defined(__APPLE__) | ||||
|   [[nodiscard]] auto | ||||
|   getxtimes_impl(std::string api_path, struct timespec *bkuptime, | ||||
|                  struct timespec *crtime) -> api_error override; | ||||
| #endif // __APPLE__ | ||||
|   [[nodiscard]] auto getxtimes_impl(std::string api_path, | ||||
|                                     struct timespec *bkuptime, | ||||
|                                     struct timespec *crtime) | ||||
|       -> api_error override; | ||||
| #endif // defined(__APPLE__) | ||||
|  | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   auto init_impl(struct fuse_conn_info *conn, | ||||
|                  struct fuse_config *cfg) -> void * override; | ||||
| #else | ||||
|   auto init_impl(struct fuse_conn_info *conn, struct fuse_config *cfg) | ||||
|       -> void * override; | ||||
| #else  // FUSE_USE_VERSION < 30 | ||||
|   auto init_impl(struct fuse_conn_info *conn) -> void * override; | ||||
| #endif | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
|   [[nodiscard]] auto mkdir_impl(std::string api_path, | ||||
|                                 mode_t mode) -> api_error override; | ||||
|   [[nodiscard]] auto mkdir_impl(std::string api_path, mode_t mode) | ||||
|       -> api_error override; | ||||
|  | ||||
|   void notify_fuse_main_exit(int &ret) override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   open_impl(std::string api_path, | ||||
|             struct fuse_file_info *file_info) -> api_error override; | ||||
|   [[nodiscard]] auto open_impl(std::string api_path, | ||||
|                                struct fuse_file_info *file_info) | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   opendir_impl(std::string api_path, | ||||
|                struct fuse_file_info *file_info) -> api_error override; | ||||
|   [[nodiscard]] auto opendir_impl(std::string api_path, | ||||
|                                   struct fuse_file_info *file_info) | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto read_impl(std::string api_path, char *buffer, | ||||
|                                size_t read_size, off_t read_offset, | ||||
| @@ -166,121 +169,124 @@ protected: | ||||
|                                std::size_t &bytes_read) -> api_error override; | ||||
|  | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   [[nodiscard]] auto | ||||
|   readdir_impl(std::string api_path, void *buf, fuse_fill_dir_t fuse_fill_dir, | ||||
|                off_t offset, struct fuse_file_info *file_info, | ||||
|                fuse_readdir_flags flags) -> api_error override; | ||||
| #else | ||||
|   [[nodiscard]] auto | ||||
|   readdir_impl(std::string api_path, void *buf, fuse_fill_dir_t fuse_fill_dir, | ||||
|                off_t offset, | ||||
|                struct fuse_file_info *file_info) -> api_error override; | ||||
| #endif | ||||
|   [[nodiscard]] auto readdir_impl(std::string api_path, void *buf, | ||||
|                                   fuse_fill_dir_t fuse_fill_dir, off_t offset, | ||||
|                                   struct fuse_file_info *file_info, | ||||
|                                   fuse_readdir_flags flags) | ||||
|       -> api_error override; | ||||
| #else  // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] auto readdir_impl(std::string api_path, void *buf, | ||||
|                                   fuse_fill_dir_t fuse_fill_dir, off_t offset, | ||||
|                                   struct fuse_file_info *file_info) | ||||
|       -> api_error override; | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   release_impl(std::string api_path, | ||||
|                struct fuse_file_info *file_info) -> api_error override; | ||||
|   [[nodiscard]] auto release_impl(std::string api_path, | ||||
|                                   struct fuse_file_info *file_info) | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   releasedir_impl(std::string api_path, | ||||
|                   struct fuse_file_info *file_info) -> api_error override; | ||||
|   [[nodiscard]] auto releasedir_impl(std::string api_path, | ||||
|                                      struct fuse_file_info *file_info) | ||||
|       -> api_error override; | ||||
|  | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   [[nodiscard]] auto rename_impl(std::string from_api_path, | ||||
|                                  std::string to_api_path, | ||||
|                                  unsigned int flags) -> api_error override; | ||||
| #else | ||||
|                                  std::string to_api_path, unsigned int flags) | ||||
|       -> api_error override; | ||||
| #else  // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] auto rename_impl(std::string from_api_path, | ||||
|                                  std::string to_api_path) -> api_error override; | ||||
| #endif | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
|   [[nodiscard]] auto rmdir_impl(std::string api_path) -> api_error override; | ||||
|  | ||||
| #if defined(HAS_SETXATTR) | ||||
|   [[nodiscard]] auto getxattr_common(std::string api_path, const char *name, | ||||
|                                      char *value, size_t size, | ||||
|                                      int &attribute_size, | ||||
|                                      uint32_t *position) -> api_error; | ||||
|                                      int &attribute_size, uint32_t *position) | ||||
|       -> api_error; | ||||
|  | ||||
| #if defined(__APPLE__) | ||||
|   [[nodiscard]] auto getxattr_impl(std::string api_path, const char *name, | ||||
|                                    char *value, size_t size, uint32_t position, | ||||
|                                    int &attribute_size) -> api_error override; | ||||
| #else  // __APPLE__ | ||||
| #else  // !defined(__APPLE__) | ||||
|   [[nodiscard]] auto getxattr_impl(std::string api_path, const char *name, | ||||
|                                    char *value, size_t size, | ||||
|                                    int &attribute_size) -> api_error override; | ||||
| #endif // __APPLE__ | ||||
| #endif // defined(__APPLE__) | ||||
|  | ||||
|   [[nodiscard]] auto listxattr_impl(std::string api_path, char *buffer, | ||||
|                                     size_t size, int &required_size, | ||||
|                                     bool &return_size) -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto removexattr_impl(std::string api_path, | ||||
|                                       const char *name) -> api_error override; | ||||
|   [[nodiscard]] auto removexattr_impl(std::string api_path, const char *name) | ||||
|       -> api_error override; | ||||
|  | ||||
| #if defined(__APPLE__) | ||||
|   [[nodiscard]] auto setxattr_impl(std::string api_path, const char *name, | ||||
|                                    const char *value, size_t size, int flags, | ||||
|                                    uint32_t position) -> api_error override; | ||||
| #else  // __APPLE__ | ||||
| #else  // !defined(__APPLE__) | ||||
|   [[nodiscard]] auto setxattr_impl(std::string api_path, const char *name, | ||||
|                                    const char *value, size_t size, | ||||
|                                    int flags) -> api_error override; | ||||
| #endif // __APPLE__ | ||||
| #endif // HAS_SETXATTR | ||||
|                                    const char *value, size_t size, int flags) | ||||
|       -> api_error override; | ||||
| #endif // defined(__APPLE__) | ||||
| #endif // defined(HAS_SETXATTR{} | ||||
|  | ||||
| #if defined(__APPLE__) | ||||
|   [[nodiscard]] auto | ||||
|   setattr_x_impl(std::string api_path, | ||||
|                  struct setattr_x *attr) -> api_error override; | ||||
|   [[nodiscard]] auto setattr_x_impl(std::string api_path, | ||||
|                                     struct setattr_x *attr) | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   setbkuptime_impl(std::string api_path, | ||||
|                    const struct timespec *bkuptime) -> api_error override; | ||||
|   [[nodiscard]] auto setbkuptime_impl(std::string api_path, | ||||
|                                       const struct timespec *bkuptime) | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   setchgtime_impl(std::string api_path, | ||||
|                   const struct timespec *chgtime) -> api_error override; | ||||
|   [[nodiscard]] auto setchgtime_impl(std::string api_path, | ||||
|                                      const struct timespec *chgtime) | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   setcrtime_impl(std::string api_path, | ||||
|                  const struct timespec *crtime) -> api_error override; | ||||
|   [[nodiscard]] auto setcrtime_impl(std::string api_path, | ||||
|                                     const struct timespec *crtime) | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto setvolname_impl(const char *volname) -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto statfs_x_impl(std::string api_path, | ||||
|                                    struct statfs *stbuf) -> api_error override; | ||||
| #else  // __APPLE__ | ||||
|   [[nodiscard]] auto statfs_impl(std::string api_path, | ||||
|                                  struct statvfs *stbuf) -> api_error override; | ||||
| #endif // __APPLE__ | ||||
|   [[nodiscard]] auto statfs_x_impl(std::string api_path, struct statfs *stbuf) | ||||
|       -> api_error override; | ||||
| #else  // !defined(__APPLE__) | ||||
|   [[nodiscard]] auto statfs_impl(std::string api_path, struct statvfs *stbuf) | ||||
|       -> api_error override; | ||||
| #endif // defined(__APPLE__) | ||||
|  | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   [[nodiscard]] auto | ||||
|   truncate_impl(std::string api_path, off_t size, | ||||
|                 struct fuse_file_info *file_info) -> api_error override; | ||||
| #else | ||||
|   [[nodiscard]] auto truncate_impl(std::string api_path, | ||||
|                                    off_t size) -> api_error override; | ||||
| #endif | ||||
|   [[nodiscard]] auto truncate_impl(std::string api_path, off_t size, | ||||
|                                    struct fuse_file_info *file_info) | ||||
|       -> api_error override; | ||||
| #else  // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] auto truncate_impl(std::string api_path, off_t size) | ||||
|       -> api_error override; | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
|   [[nodiscard]] auto unlink_impl(std::string api_path) -> api_error override; | ||||
|  | ||||
| #if FUSE_USE_VERSION >= 30 | ||||
|   [[nodiscard]] auto | ||||
|   utimens_impl(std::string api_path, const struct timespec tv[2], | ||||
|                struct fuse_file_info *file_info) -> api_error override; | ||||
| #else | ||||
|   [[nodiscard]] auto | ||||
|   utimens_impl(std::string api_path, | ||||
|                const struct timespec tv[2]) -> api_error override; | ||||
| #endif | ||||
|   [[nodiscard]] auto utimens_impl(std::string api_path, | ||||
|                                   const struct timespec tv[2], | ||||
|                                   struct fuse_file_info *file_info) | ||||
|       -> api_error override; | ||||
| #else  // FUSE_USE_VERSION < 30 | ||||
|   [[nodiscard]] auto utimens_impl(std::string api_path, | ||||
|                                   const struct timespec tv[2]) | ||||
|       -> api_error override; | ||||
| #endif // FUSE_USE_VERSION >= 30 | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   write_impl(std::string api_path, const char *buffer, size_t write_size, | ||||
|              off_t write_offset, struct fuse_file_info *file_info, | ||||
|              std::size_t &bytes_written) -> api_error override; | ||||
|   [[nodiscard]] auto write_impl(std::string api_path, const char *buffer, | ||||
|                                 size_t write_size, off_t write_offset, | ||||
|                                 struct fuse_file_info *file_info, | ||||
|                                 std::size_t &bytes_written) | ||||
|       -> api_error override; | ||||
|  | ||||
| public: | ||||
|   [[nodiscard]] auto get_directory_item_count(const std::string &api_path) const | ||||
| @@ -289,16 +295,17 @@ public: | ||||
|   [[nodiscard]] auto get_directory_items(const std::string &api_path) const | ||||
|       -> directory_item_list override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   get_file_size(const std::string &api_path) const -> std::uint64_t override; | ||||
|   [[nodiscard]] auto get_file_size(const std::string &api_path) const | ||||
|       -> std::uint64_t override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   get_item_meta(const std::string &api_path, | ||||
|                 api_meta_map &meta) const -> api_error override; | ||||
|   [[nodiscard]] auto get_item_meta(const std::string &api_path, | ||||
|                                    api_meta_map &meta) const | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   get_item_meta(const std::string &api_path, const std::string &name, | ||||
|                 std::string &value) const -> api_error override; | ||||
|   [[nodiscard]] auto get_item_meta(const std::string &api_path, | ||||
|                                    const std::string &name, | ||||
|                                    std::string &value) const | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto get_total_drive_space() const -> std::uint64_t override; | ||||
|  | ||||
| @@ -309,21 +316,24 @@ public: | ||||
|   void get_volume_info(UINT64 &total_size, UINT64 &free_size, | ||||
|                        std::string &volume_label) const override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   is_processing(const std::string &api_path) const -> bool override; | ||||
|   [[nodiscard]] auto is_processing(const std::string &api_path) const | ||||
|       -> bool override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   rename_directory(const std::string &from_api_path, | ||||
|                    const std::string &to_api_path) -> int override; | ||||
|   [[nodiscard]] auto rename_directory(const std::string &from_api_path, | ||||
|                                       const std::string &to_api_path) | ||||
|       -> int override; | ||||
|  | ||||
|   [[nodiscard]] auto rename_file(const std::string &from_api_path, | ||||
|                                  const std::string &to_api_path, | ||||
|                                  bool overwrite) -> int override; | ||||
|                                  const std::string &to_api_path, bool overwrite) | ||||
|       -> int override; | ||||
|  | ||||
|   void set_item_meta(const std::string &api_path, const std::string &key, | ||||
|                      const std::string &value) override; | ||||
|  | ||||
|   void set_item_meta(const std::string &api_path, | ||||
|                      const api_meta_map &meta) override; | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif // _WIN32 | ||||
| #endif // !defined(_WIN32) | ||||
| #endif // REPERTORY_INCLUDE_DRIVES_FUSE_FUSE_DRIVE_HPP_ | ||||
|   | ||||
| @@ -43,16 +43,17 @@ public: | ||||
|   auto operator=(fuse_drive_base &&) -> fuse_drive_base & = delete; | ||||
|  | ||||
| protected: | ||||
|   [[nodiscard]] auto access_impl(std::string api_path, | ||||
|                                  int mask) -> api_error override; | ||||
|   [[nodiscard]] auto access_impl(std::string api_path, int mask) | ||||
|       -> api_error override; | ||||
|  | ||||
| protected: | ||||
|   [[nodiscard]] auto check_access(const std::string &api_path, | ||||
|                                   int mask) const -> api_error; | ||||
|   [[nodiscard]] auto check_access(const std::string &api_path, int mask) const | ||||
|       -> api_error; | ||||
|  | ||||
|   [[nodiscard]] auto check_and_perform( | ||||
|       const std::string &api_path, int parent_mask, | ||||
|       const std::function<api_error(api_meta_map &meta)> &action) -> api_error; | ||||
|   [[nodiscard]] auto | ||||
|   check_and_perform(const std::string &api_path, int parent_mask, | ||||
|                     const std::function<api_error(api_meta_map &meta)> &action) | ||||
|       -> api_error; | ||||
|  | ||||
|   [[nodiscard]] auto get_current_gid() const -> gid_t; | ||||
|  | ||||
| @@ -62,58 +63,60 @@ protected: | ||||
|  | ||||
|   [[nodiscard]] auto get_effective_uid() const -> uid_t; | ||||
|  | ||||
|   [[nodiscard]] static auto | ||||
|   check_open_flags(int flags, int mask, | ||||
|                    const api_error &fail_error) -> api_error; | ||||
|   [[nodiscard]] static auto check_open_flags(int flags, int mask, | ||||
|                                              api_error fail_error) -> api_error; | ||||
|  | ||||
|   [[nodiscard]] auto check_owner(const api_meta_map &meta) const -> api_error; | ||||
|  | ||||
|   [[nodiscard]] static auto | ||||
|   check_readable(int flags, const api_error &fail_error) -> api_error; | ||||
|   [[nodiscard]] static auto check_readable(int flags, api_error fail_error) | ||||
|       -> api_error; | ||||
|  | ||||
|   [[nodiscard]] static auto | ||||
|   check_writeable(int flags, const api_error &fail_error) -> api_error; | ||||
|   [[nodiscard]] static auto check_writeable(int flags, api_error fail_error) | ||||
|       -> api_error; | ||||
|  | ||||
| #if defined(__APPLE__) | ||||
|   [[nodiscard]] static auto | ||||
|   get_flags_from_meta(const api_meta_map &meta) -> __uint32_t; | ||||
| #endif // __APPLE__ | ||||
|   [[nodiscard]] static auto get_flags_from_meta(const api_meta_map &meta) | ||||
|       -> __uint32_t; | ||||
| #endif // defined(__APPLE__) | ||||
|  | ||||
|   [[nodiscard]] static auto | ||||
|   get_gid_from_meta(const api_meta_map &meta) -> gid_t; | ||||
|   [[nodiscard]] static auto get_gid_from_meta(const api_meta_map &meta) | ||||
|       -> gid_t; | ||||
|  | ||||
|   [[nodiscard]] static auto | ||||
|   get_mode_from_meta(const api_meta_map &meta) -> mode_t; | ||||
|   [[nodiscard]] static auto get_mode_from_meta(const api_meta_map &meta) | ||||
|       -> mode_t; | ||||
|  | ||||
|   static void get_timespec_from_meta(const api_meta_map &meta, | ||||
|                                      const std::string &name, | ||||
|                                      struct timespec &ts); | ||||
|  | ||||
|   [[nodiscard]] static auto | ||||
|   get_uid_from_meta(const api_meta_map &meta) -> uid_t; | ||||
|   [[nodiscard]] static auto get_uid_from_meta(const api_meta_map &meta) | ||||
|       -> uid_t; | ||||
|  | ||||
| #if defined(__APPLE__) | ||||
|   [[nodiscard]] auto | ||||
|   parse_xattr_parameters(const char *name, const uint32_t &position, | ||||
|                          std::string &attribute_name, | ||||
|                          const std::string &api_path) -> api_error; | ||||
| #else | ||||
|   [[nodiscard]] auto | ||||
|   parse_xattr_parameters(const char *name, std::string &attribute_name, | ||||
|                          const std::string &api_path) -> api_error; | ||||
| #endif | ||||
|   [[nodiscard]] auto parse_xattr_parameters(const char *name, | ||||
|                                             const uint32_t &position, | ||||
|                                             std::string &attribute_name, | ||||
|                                             const std::string &api_path) | ||||
|       -> api_error; | ||||
| #else  // !defined(__APPLE__) | ||||
|   [[nodiscard]] auto parse_xattr_parameters(const char *name, | ||||
|                                             std::string &attribute_name, | ||||
|                                             const std::string &api_path) | ||||
|       -> api_error; | ||||
| #endif // defined(__APPLE__) | ||||
|  | ||||
| #if defined(__APPLE__) | ||||
|   [[nodiscard]] auto | ||||
|   parse_xattr_parameters(const char *name, const char *value, size_t size, | ||||
|                          const uint32_t &position, std::string &attribute_name, | ||||
|                          const std::string &api_path) -> api_error; | ||||
| #else | ||||
|   [[nodiscard]] auto | ||||
|   parse_xattr_parameters(const char *name, const char *value, size_t size, | ||||
|                          std::string &attribute_name, | ||||
|                          const std::string &api_path) -> api_error; | ||||
| #endif | ||||
| #else  // !defined(__APPLE__) | ||||
|   [[nodiscard]] auto parse_xattr_parameters(const char *name, const char *value, | ||||
|                                             size_t size, | ||||
|                                             std::string &attribute_name, | ||||
|                                             const std::string &api_path) | ||||
|       -> api_error; | ||||
| #endif // defined(__APPLE__) | ||||
|  | ||||
|   static void populate_stat(const std::string &api_path, | ||||
|                             std::uint64_t size_or_count, | ||||
| @@ -125,13 +128,13 @@ protected: | ||||
|                                      struct timespec &ts); | ||||
|  | ||||
| public: | ||||
|   [[nodiscard]] auto | ||||
|   check_owner(const std::string &api_path) const -> api_error override; | ||||
|   [[nodiscard]] auto check_owner(const std::string &api_path) const | ||||
|       -> api_error override; | ||||
|  | ||||
|   [[nodiscard]] auto check_parent_access(const std::string &api_path, | ||||
|                                          int mask) const -> api_error override; | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif // _WIN32 | ||||
| #endif // !defined(_WIN32) | ||||
| #endif // REPERTORY_INCLUDE_DRIVES_FUSE_FUSE_DRIVE_BASE_HPP_ | ||||
|   | ||||
| @@ -30,29 +30,32 @@ class i_fuse_drive { | ||||
|   INTERFACE_SETUP(i_fuse_drive); | ||||
|  | ||||
| public: | ||||
|   [[nodiscard]] virtual auto | ||||
|   check_owner(const std::string &api_path) const -> api_error = 0; | ||||
|   [[nodiscard]] virtual auto check_owner(const std::string &api_path) const | ||||
|       -> api_error = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto check_parent_access(const std::string &api_path, | ||||
|                                                  int mask) const | ||||
|       -> api_error = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   check_parent_access(const std::string &api_path, | ||||
|                       int mask) const -> api_error = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_directory_item_count( | ||||
|       const std::string &api_path) const -> std::uint64_t = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_directory_items( | ||||
|       const std::string &api_path) const -> directory_item_list = 0; | ||||
|   get_directory_item_count(const std::string &api_path) const | ||||
|       -> std::uint64_t = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   get_file_size(const std::string &api_path) const -> std::uint64_t = 0; | ||||
|   get_directory_items(const std::string &api_path) const | ||||
|       -> directory_item_list = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   get_item_meta(const std::string &api_path, | ||||
|                 api_meta_map &meta) const -> api_error = 0; | ||||
|   [[nodiscard]] virtual auto get_file_size(const std::string &api_path) const | ||||
|       -> std::uint64_t = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   get_item_meta(const std::string &api_path, const std::string &name, | ||||
|                 std::string &value) const -> api_error = 0; | ||||
|   [[nodiscard]] virtual auto get_item_meta(const std::string &api_path, | ||||
|                                            api_meta_map &meta) const | ||||
|       -> api_error = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_item_meta(const std::string &api_path, | ||||
|                                            const std::string &name, | ||||
|                                            std::string &value) const | ||||
|       -> api_error = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto get_total_drive_space() const -> std::uint64_t = 0; | ||||
|  | ||||
| @@ -63,12 +66,12 @@ public: | ||||
|   virtual void get_volume_info(UINT64 &total_size, UINT64 &free_size, | ||||
|                                std::string &volume_label) const = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   is_processing(const std::string &api_path) const -> bool = 0; | ||||
|   [[nodiscard]] virtual auto is_processing(const std::string &api_path) const | ||||
|       -> bool = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   rename_directory(const std::string &from_api_path, | ||||
|                    const std::string &to_api_path) -> int = 0; | ||||
|   [[nodiscard]] virtual auto rename_directory(const std::string &from_api_path, | ||||
|                                               const std::string &to_api_path) | ||||
|       -> int = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto rename_file(const std::string &from_api_path, | ||||
|                                          const std::string &to_api_path, | ||||
| @@ -77,8 +80,11 @@ public: | ||||
|   virtual void set_item_meta(const std::string &api_path, | ||||
|                              const std::string &key, | ||||
|                              const std::string &value) = 0; | ||||
|  | ||||
|   virtual void set_item_meta(const std::string &api_path, | ||||
|                              const api_meta_map &meta) = 0; | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| #endif | ||||
| #endif // !defined(_WIN32) | ||||
| #endif // REPERTORY_INCLUDE_DRIVES_FUSE_I_FUSE_DRIVE_HPP_ | ||||
|   | ||||
| @@ -38,10 +38,12 @@ public: | ||||
| private: | ||||
|   const app_config &config_; | ||||
|   packet_client packet_client_; | ||||
|   remote::user_id uid_ = 0; | ||||
|   remote::group_id gid_ = 0; | ||||
|   remote::user_id uid_{0}; | ||||
|   remote::group_id gid_{0}; | ||||
|  | ||||
| public: | ||||
|   [[nodiscard]] auto check() -> packet::error_type; | ||||
|  | ||||
|   [[nodiscard]] auto fuse_access(const char *path, const std::int32_t &mask) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
| @@ -51,9 +53,9 @@ public: | ||||
|   [[nodiscard]] auto fuse_chmod(const char *path, const remote::file_mode &mode) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   fuse_chown(const char *path, const remote::user_id &uid, | ||||
|              const remote::group_id &gid) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_chown(const char *path, const remote::user_id &uid, | ||||
|                                 const remote::group_id &gid) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto fuse_destroy() -> packet::error_type override; | ||||
|  | ||||
| @@ -67,21 +69,23 @@ public: | ||||
|                 const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto fuse_fsetattr_x( | ||||
|       const char *path, const remote::setattr_x &attr, | ||||
|       const remote::file_handle &handle) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_fsetattr_x(const char *path, | ||||
|                                      const remote::setattr_x &attr, | ||||
|                                      const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   fuse_fsync(const char *path, const std::int32_t &datasync, | ||||
|              const remote::file_handle &handle) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_fsync(const char *path, const std::int32_t &datasync, | ||||
|                                 const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto fuse_ftruncate( | ||||
|       const char *path, const remote::file_offset &size, | ||||
|       const remote::file_handle &handle) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_ftruncate(const char *path, | ||||
|                                     const remote::file_offset &size, | ||||
|                                     const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   fuse_getattr(const char *path, remote::stat &st, | ||||
|                bool &directory) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_getattr(const char *path, remote::stat &st, | ||||
|                                   bool &directory) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   /*[[nodiscard]] packet::error_type fuse_getxattr(const char *path, const char | ||||
|   *name, char *value, const remote::file_size &size) override ; | ||||
| @@ -90,9 +94,10 @@ public: | ||||
|   *name, char *value, const remote::file_size &size, std::uint32_t position) | ||||
|   override ;*/ | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   fuse_getxtimes(const char *path, remote::file_time &bkuptime, | ||||
|                  remote::file_time &crtime) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_getxtimes(const char *path, | ||||
|                                     remote::file_time &bkuptime, | ||||
|                                     remote::file_time &crtime) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto fuse_init() -> packet::error_type override; | ||||
|  | ||||
| @@ -107,25 +112,27 @@ public: | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   fuse_create(const char *path, const remote::file_mode &mode, | ||||
|               const remote::open_flags &flags, | ||||
|               remote::file_handle &handle) -> packet::error_type override; | ||||
|               const remote::open_flags &flags, remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   fuse_open(const char *path, const remote::open_flags &flags, | ||||
|             remote::file_handle &handle) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_open(const char *path, | ||||
|                                const remote::open_flags &flags, | ||||
|                                remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   fuse_read(const char *path, char *buffer, const remote::file_size &read_size, | ||||
|             const remote::file_offset &read_offset, | ||||
|             const remote::file_handle &handle) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_read(const char *path, char *buffer, | ||||
|                                const remote::file_size &read_size, | ||||
|                                const remote::file_offset &read_offset, | ||||
|                                const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto fuse_rename(const char *from, | ||||
|                                  const char *to) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_rename(const char *from, const char *to) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   fuse_readdir(const char *path, const remote::file_offset &offset, | ||||
|                const remote::file_handle &handle, | ||||
|                std::string &item_path) -> packet::error_type override; | ||||
|                const remote::file_handle &handle, std::string &item_path) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto fuse_release(const char *path, | ||||
|                                   const remote::file_handle &handle) | ||||
| @@ -139,8 +146,8 @@ public: | ||||
|    * char *name) override | ||||
|    * ;*/ | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   fuse_rmdir(const char *path) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_rmdir(const char *path) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto fuse_setattr_x(const char *path, remote::setattr_x &attr) | ||||
|       -> packet::error_type override; | ||||
| @@ -157,8 +164,8 @@ public: | ||||
|                                     const remote::file_time &crtime) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   fuse_setvolname(const char *volname) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_setvolname(const char *volname) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] /*packet::error_type fuse_setxattr(const char *path, const char | ||||
|   *name, const char *value, const remote::file_size &size, const std::int32_t | ||||
| @@ -169,45 +176,48 @@ public: | ||||
|   std::int32_t &flags, std::uint32_t position) override ;*/ | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   fuse_statfs(const char *path, std::uint64_t frsize, | ||||
|               remote::statfs &st) -> packet::error_type override; | ||||
|   fuse_statfs(const char *path, std::uint64_t frsize, remote::statfs &st) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   fuse_statfs_x(const char *path, std::uint64_t bsize, | ||||
|                 remote::statfs_x &st) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_statfs_x(const char *path, std::uint64_t bsize, | ||||
|                                    remote::statfs_x &st) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   fuse_truncate(const char *path, | ||||
|                 const remote::file_offset &size) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_truncate(const char *path, | ||||
|                                    const remote::file_offset &size) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   fuse_unlink(const char *path) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_unlink(const char *path) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   fuse_utimens(const char *path, const remote::file_time *tv, std::uint64_t op0, | ||||
|                std::uint64_t op1) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_utimens(const char *path, const remote::file_time *tv, | ||||
|                                   std::uint64_t op0, std::uint64_t op1) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   fuse_write(const char *path, const char *buffer, | ||||
|              const remote::file_size &write_size, | ||||
|              const remote::file_offset &write_offset, | ||||
|              const remote::file_handle &handle) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_write(const char *path, const char *buffer, | ||||
|                                 const remote::file_size &write_size, | ||||
|                                 const remote::file_offset &write_offset, | ||||
|                                 const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto fuse_write_base64( | ||||
|       const char *path, const char *buffer, const remote::file_size &write_size, | ||||
|       const remote::file_offset &write_offset, | ||||
|       const remote::file_handle &handle) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_write_base64(const char *path, const char *buffer, | ||||
|                                        const remote::file_size &write_size, | ||||
|                                        const remote::file_offset &write_offset, | ||||
|                                        const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto json_create_directory_snapshot( | ||||
|       const std::string &path, json &json_data) -> packet::error_type override; | ||||
|   [[nodiscard]] auto json_create_directory_snapshot(const std::string &path, | ||||
|                                                     json &json_data) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto json_read_directory_snapshot( | ||||
|       const std::string &path, const remote::file_handle &handle, | ||||
|       std::uint32_t page, json &json_data) -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto json_release_directory_snapshot( | ||||
|       const std::string &path, | ||||
|       const remote::file_handle &handle) -> packet::error_type override; | ||||
|   [[nodiscard]] auto | ||||
|   json_release_directory_snapshot(const std::string &path, | ||||
|                                   const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   void set_fuse_uid_gid(const remote::user_id &uid, | ||||
|                         const remote::group_id &gid) override; | ||||
|   | ||||
| @@ -59,7 +59,8 @@ private: | ||||
|  | ||||
|   static void populate_stat(const struct stat64 &unix_st, remote::stat &r_stat); | ||||
|  | ||||
|   [[nodiscard]] auto update_to_windows_format(json &item) -> json &; | ||||
|   [[nodiscard]] auto update_to_windows_format(const std::string &root_api_path, | ||||
|                                               json &item) -> json &; | ||||
|  | ||||
| public: | ||||
|   // FUSE Layer | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -29,87 +29,92 @@ class i_remote_instance : public virtual i_remote_json { | ||||
|   INTERFACE_SETUP(i_remote_instance); | ||||
|  | ||||
| public: | ||||
|   virtual auto winfsp_can_delete(PVOID file_desc, PWSTR file_name) | ||||
|   [[nodiscard]] virtual auto winfsp_can_delete(PVOID file_desc, PWSTR file_name) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_cleanup(PVOID file_desc, PWSTR file_name, UINT32 flags, | ||||
|                               BOOLEAN &was_deleted) -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_close(PVOID file_desc) -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_create(PWSTR file_name, UINT32 create_options, | ||||
|                              UINT32 granted_access, UINT32 file_attributes, | ||||
|                              UINT64 allocation_size, PVOID *file_desc, | ||||
|                              remote::file_info *file_info, | ||||
|                              std::string &normalized_name, BOOLEAN &exists) | ||||
|   [[nodiscard]] virtual auto winfsp_cleanup(PVOID file_desc, PWSTR file_name, | ||||
|                                             UINT32 flags, BOOLEAN &was_deleted) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_flush(PVOID file_desc, remote::file_info *file_info) | ||||
|   [[nodiscard]] virtual auto winfsp_close(PVOID file_desc) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) | ||||
|   [[nodiscard]] virtual auto | ||||
|   winfsp_create(PWSTR file_name, UINT32 create_options, UINT32 granted_access, | ||||
|                 UINT32 file_attributes, UINT64 allocation_size, | ||||
|                 PVOID *file_desc, remote::file_info *file_info, | ||||
|                 std::string &normalized_name, BOOLEAN &exists) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_get_file_info(PVOID file_desc, | ||||
|                                     remote::file_info *file_info) | ||||
|   [[nodiscard]] virtual auto winfsp_flush(PVOID file_desc, | ||||
|                                           remote::file_info *file_info) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto | ||||
|   [[nodiscard]] virtual auto winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto winfsp_get_file_info(PVOID file_desc, | ||||
|                                                   remote::file_info *file_info) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   winfsp_get_security_by_name(PWSTR file_name, PUINT32 file_attributes, | ||||
|                               std::uint64_t *security_descriptor_size, | ||||
|                               std::wstring &str_descriptor) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_get_volume_info(UINT64 &total_size, UINT64 &free_size, | ||||
|                                       std::string &volume_label) | ||||
|   [[nodiscard]] virtual auto winfsp_get_volume_info(UINT64 &total_size, | ||||
|                                                     UINT64 &free_size, | ||||
|                                                     std::string &volume_label) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_mounted(const std::wstring &location) | ||||
|   [[nodiscard]] virtual auto winfsp_mounted(const std::wstring &location) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_open(PWSTR file_name, UINT32 create_options, | ||||
|                            UINT32 granted_access, PVOID *file_desc, | ||||
|                            remote::file_info *file_info, | ||||
|                            std::string &normalized_name) | ||||
|   [[nodiscard]] virtual auto | ||||
|   winfsp_open(PWSTR file_name, UINT32 create_options, UINT32 granted_access, | ||||
|               PVOID *file_desc, remote::file_info *file_info, | ||||
|               std::string &normalized_name) -> packet::error_type = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto | ||||
|   winfsp_overwrite(PVOID file_desc, UINT32 file_attributes, | ||||
|                    BOOLEAN replace_file_attributes, UINT64 allocation_size, | ||||
|                    remote::file_info *file_info) -> packet::error_type = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto winfsp_read(PVOID file_desc, PVOID buffer, | ||||
|                                          UINT64 offset, UINT32 length, | ||||
|                                          PUINT32 bytes_transferred) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_overwrite(PVOID file_desc, UINT32 file_attributes, | ||||
|                                 BOOLEAN replace_file_attributes, | ||||
|                                 UINT64 allocation_size, | ||||
|                                 remote::file_info *file_info) | ||||
|   [[nodiscard]] virtual auto winfsp_read_directory(PVOID file_desc, | ||||
|                                                    PWSTR pattern, PWSTR marker, | ||||
|                                                    json &itemList) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, | ||||
|                            UINT32 length, PUINT32 bytes_transferred) | ||||
|   [[nodiscard]] virtual auto winfsp_rename(PVOID file_desc, PWSTR file_name, | ||||
|                                            PWSTR new_file_name, | ||||
|                                            BOOLEAN replace_if_exists) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_read_directory(PVOID file_desc, PWSTR pattern, | ||||
|                                      PWSTR marker, json &itemList) | ||||
|   [[nodiscard]] virtual auto | ||||
|   winfsp_set_basic_info(PVOID file_desc, UINT32 file_attributes, | ||||
|                         UINT64 creation_time, UINT64 last_access_time, | ||||
|                         UINT64 last_write_time, UINT64 change_time, | ||||
|                         remote::file_info *file_info) -> packet::error_type = 0; | ||||
|  | ||||
|   [[nodiscard]] virtual auto winfsp_set_file_size(PVOID file_desc, | ||||
|                                                   UINT64 new_size, | ||||
|                                                   BOOLEAN set_allocation_size, | ||||
|                                                   remote::file_info *file_info) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_rename(PVOID file_desc, PWSTR file_name, | ||||
|                              PWSTR new_file_name, BOOLEAN replace_if_exists) | ||||
|   [[nodiscard]] virtual auto winfsp_unmounted(const std::wstring &location) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_set_basic_info(PVOID file_desc, UINT32 file_attributes, | ||||
|                                      UINT64 creation_time, | ||||
|                                      UINT64 last_access_time, | ||||
|                                      UINT64 last_write_time, UINT64 change_time, | ||||
|                                      remote::file_info *file_info) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_set_file_size(PVOID file_desc, UINT64 new_size, | ||||
|                                     BOOLEAN set_allocation_size, | ||||
|                                     remote::file_info *file_info) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_unmounted(const std::wstring &location) | ||||
|       -> packet::error_type = 0; | ||||
|  | ||||
|   virtual auto winfsp_write(PVOID file_desc, PVOID buffer, UINT64 offset, | ||||
|                             UINT32 length, BOOLEAN write_to_end, | ||||
|                             BOOLEAN constrained_io, PUINT32 bytes_transferred, | ||||
|                             remote::file_info *file_info) | ||||
|   [[nodiscard]] virtual auto | ||||
|   winfsp_write(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, | ||||
|                BOOLEAN write_to_end, BOOLEAN constrained_io, | ||||
|                PUINT32 bytes_transferred, remote::file_info *file_info) | ||||
|       -> packet::error_type = 0; | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -44,93 +44,105 @@ private: | ||||
| #if defined(_WIN32) | ||||
| #define to_handle(x) (x) | ||||
| #else  // !defined(_WIN32) | ||||
|   static auto to_handle(PVOID file_desc) -> native_handle; | ||||
|   [[nodiscard]] static auto to_handle(PVOID file_desc) -> native_handle; | ||||
| #endif // defined(_WIN32) | ||||
|  | ||||
| public: | ||||
|   auto json_create_directory_snapshot(const std::string &path, json &json_data) | ||||
|   [[nodiscard]] auto check() -> packet::error_type; | ||||
|  | ||||
|   [[nodiscard]] auto json_create_directory_snapshot(const std::string &path, | ||||
|                                                     json &json_data) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto json_read_directory_snapshot(const std::string &path, | ||||
|                                     const remote::file_handle &handle, | ||||
|                                     std::uint32_t page, json &json_data) | ||||
|   [[nodiscard]] auto json_read_directory_snapshot( | ||||
|       const std::string &path, const remote::file_handle &handle, | ||||
|       std::uint32_t page, json &json_data) -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   json_release_directory_snapshot(const std::string &path, | ||||
|                                   const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto json_release_directory_snapshot(const std::string &path, | ||||
|                                        const remote::file_handle &handle) | ||||
|   [[nodiscard]] auto winfsp_can_delete(PVOID file_desc, PWSTR file_name) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_can_delete(PVOID file_desc, PWSTR file_name) | ||||
|   [[nodiscard]] auto winfsp_cleanup(PVOID file_desc, PWSTR file_name, | ||||
|                                     UINT32 flags, BOOLEAN &was_deleted) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_cleanup(PVOID file_desc, PWSTR file_name, UINT32 flags, | ||||
|                       BOOLEAN &was_deleted) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_close(PVOID file_desc) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_create(PWSTR file_name, UINT32 create_options, | ||||
|                      UINT32 granted_access, UINT32 attributes, | ||||
|                      UINT64 allocation_size, PVOID *file_desc, | ||||
|                      remote::file_info *file_info, std::string &normalized_name, | ||||
|                      BOOLEAN &exists) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_flush(PVOID file_desc, remote::file_info *file_info) | ||||
|   [[nodiscard]] auto winfsp_close(PVOID file_desc) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) | ||||
|   [[nodiscard]] auto | ||||
|   winfsp_create(PWSTR file_name, UINT32 create_options, UINT32 granted_access, | ||||
|                 UINT32 attributes, UINT64 allocation_size, PVOID *file_desc, | ||||
|                 remote::file_info *file_info, std::string &normalized_name, | ||||
|                 BOOLEAN &exists) -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto winfsp_flush(PVOID file_desc, remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_file_info(PVOID file_desc, remote::file_info *file_info) | ||||
|   [[nodiscard]] auto winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_security_by_name(PWSTR file_name, PUINT32 attributes, | ||||
|                                    std::uint64_t *descriptor_size, | ||||
|                                    std::wstring &string_descriptor) | ||||
|   [[nodiscard]] auto winfsp_get_file_info(PVOID file_desc, | ||||
|                                           remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_volume_info(UINT64 &total_size, UINT64 &free_size, | ||||
|                               std::string &volume_label) | ||||
|   [[nodiscard]] auto winfsp_get_security_by_name( | ||||
|       PWSTR file_name, PUINT32 attributes, std::uint64_t *descriptor_size, | ||||
|       std::wstring &string_descriptor) -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto winfsp_get_volume_info(UINT64 &total_size, | ||||
|                                             UINT64 &free_size, | ||||
|                                             std::string &volume_label) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_mounted(const std::wstring &location) | ||||
|   [[nodiscard]] auto winfsp_mounted(const std::wstring &location) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_open(PWSTR file_name, UINT32 create_options, | ||||
|                    UINT32 granted_access, PVOID *file_desc, | ||||
|                    remote::file_info *file_info, std::string &normalized_name) | ||||
|   [[nodiscard]] auto winfsp_open(PWSTR file_name, UINT32 create_options, | ||||
|                                  UINT32 granted_access, PVOID *file_desc, | ||||
|                                  remote::file_info *file_info, | ||||
|                                  std::string &normalized_name) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_overwrite(PVOID file_desc, UINT32 attributes, | ||||
|                         BOOLEAN replace_attributes, UINT64 allocation_size, | ||||
|                         remote::file_info *file_info) | ||||
|   [[nodiscard]] auto winfsp_overwrite(PVOID file_desc, UINT32 attributes, | ||||
|                                       BOOLEAN replace_attributes, | ||||
|                                       UINT64 allocation_size, | ||||
|                                       remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, | ||||
|                    PUINT32 bytes_transferred) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_read_directory(PVOID file_desc, PWSTR pattern, PWSTR marker, | ||||
|                              json &itemList) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_rename(PVOID file_desc, PWSTR file_name, PWSTR new_file_name, | ||||
|                      BOOLEAN replace_if_exists) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_set_basic_info(PVOID file_desc, UINT32 attributes, | ||||
|                              UINT64 creation_time, UINT64 last_access_time, | ||||
|                              UINT64 last_write_time, UINT64 change_time, | ||||
|                              remote::file_info *file_info) | ||||
|   [[nodiscard]] auto winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, | ||||
|                                  UINT32 length, PUINT32 bytes_transferred) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_set_file_size(PVOID file_desc, UINT64 new_size, | ||||
|                             BOOLEAN set_allocation_size, | ||||
|                             remote::file_info *file_info) | ||||
|   [[nodiscard]] auto winfsp_read_directory(PVOID file_desc, PWSTR pattern, | ||||
|                                            PWSTR marker, json &itemList) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_unmounted(const std::wstring &location) | ||||
|   [[nodiscard]] auto winfsp_rename(PVOID file_desc, PWSTR file_name, | ||||
|                                    PWSTR new_file_name, | ||||
|                                    BOOLEAN replace_if_exists) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_write(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, | ||||
|                     BOOLEAN write_to_end, BOOLEAN constrained_io, | ||||
|                     PUINT32 bytes_transferred, remote::file_info *file_info) | ||||
|   [[nodiscard]] auto winfsp_set_basic_info( | ||||
|       PVOID file_desc, UINT32 attributes, UINT64 creation_time, | ||||
|       UINT64 last_access_time, UINT64 last_write_time, UINT64 change_time, | ||||
|       remote::file_info *file_info) -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto winfsp_set_file_size(PVOID file_desc, UINT64 new_size, | ||||
|                                           BOOLEAN set_allocation_size, | ||||
|                                           remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto winfsp_unmounted(const std::wstring &location) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   winfsp_write(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, | ||||
|                BOOLEAN write_to_end, BOOLEAN constrained_io, | ||||
|                PUINT32 bytes_transferred, remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
| }; | ||||
| } // namespace remote_winfsp | ||||
|   | ||||
| @@ -58,41 +58,46 @@ private: | ||||
|  | ||||
| public: | ||||
|   // FUSE Layer | ||||
|   auto fuse_access(const char *path, const std::int32_t &mask) | ||||
|   [[nodiscard]] auto fuse_access(const char *path, const std::int32_t &mask) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_chflags(const char *path, std::uint32_t flags) | ||||
|   [[nodiscard]] auto fuse_chflags(const char *path, std::uint32_t flags) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_chmod(const char *path, const remote::file_mode &mode) | ||||
|   [[nodiscard]] auto fuse_chmod(const char *path, const remote::file_mode &mode) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_chown(const char *path, const remote::user_id &uid, | ||||
|                   const remote::group_id &gid) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_chown(const char *path, const remote::user_id &uid, | ||||
|                                 const remote::group_id &gid) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_destroy() -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_destroy() -> packet::error_type override; | ||||
|  | ||||
|   /*packet::error_type fuse_fallocate(const char *path, const std::int32_t | ||||
|      &mode, const remote::file_offset &offset, const remote::file_offset | ||||
|      &length, const remote::file_handle &handle) override ;*/ | ||||
|  | ||||
|   auto fuse_fgetattr(const char *path, remote::stat &r_stat, bool &directory, | ||||
|                      const remote::file_handle &handle) | ||||
|   [[nodiscard]] auto fuse_fgetattr(const char *path, remote::stat &r_stat, | ||||
|                                    bool &directory, | ||||
|                                    const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_fsetattr_x(const char *path, const remote::setattr_x &attr, | ||||
|                        const remote::file_handle &handle) | ||||
|   [[nodiscard]] auto fuse_fsetattr_x(const char *path, | ||||
|                                      const remote::setattr_x &attr, | ||||
|                                      const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_fsync(const char *path, const std::int32_t &datasync, | ||||
|                   const remote::file_handle &handle) | ||||
|   [[nodiscard]] auto fuse_fsync(const char *path, const std::int32_t &datasync, | ||||
|                                 const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_ftruncate(const char *path, const remote::file_offset &size, | ||||
|                       const remote::file_handle &handle) | ||||
|   [[nodiscard]] auto fuse_ftruncate(const char *path, | ||||
|                                     const remote::file_offset &size, | ||||
|                                     const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_getattr(const char *path, remote::stat &r_stat, bool &directory) | ||||
|   [[nodiscard]] auto fuse_getattr(const char *path, remote::stat &r_stat, | ||||
|                                   bool &directory) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   /*packet::error_type fuse_getxattr(const char *path, const char *name, char | ||||
| @@ -101,77 +106,90 @@ public: | ||||
|   packet::error_type fuse_getxattrOSX(const char *path, const char *name, char | ||||
|   *value, const remote::file_size &size, std::uint32_t position) override ;*/ | ||||
|  | ||||
|   auto fuse_getxtimes(const char *path, remote::file_time &bkuptime, | ||||
|                       remote::file_time &crtime) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_getxtimes(const char *path, | ||||
|                                     remote::file_time &bkuptime, | ||||
|                                     remote::file_time &crtime) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_init() -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_init() -> packet::error_type override; | ||||
|  | ||||
|   /*packet::error_type fuse_listxattr(const char *path, char *buffer, | ||||
|                                          const remote::file_size &size) override | ||||
|      ;*/ | ||||
|  | ||||
|   auto fuse_mkdir(const char *path, const remote::file_mode &mode) | ||||
|   [[nodiscard]] auto fuse_mkdir(const char *path, const remote::file_mode &mode) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_opendir(const char *path, remote::file_handle &handle) | ||||
|   [[nodiscard]] auto fuse_opendir(const char *path, remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_create(const char *path, const remote::file_mode &mode, | ||||
|                    const remote::open_flags &flags, remote::file_handle &handle) | ||||
|   [[nodiscard]] auto | ||||
|   fuse_create(const char *path, const remote::file_mode &mode, | ||||
|               const remote::open_flags &flags, remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_open(const char *path, const remote::open_flags &flags, | ||||
|                  remote::file_handle &handle) -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_read(const char *path, char *buffer, | ||||
|                  const remote::file_size &read_size, | ||||
|                  const remote::file_offset &read_offset, | ||||
|                  const remote::file_handle &handle) | ||||
|   [[nodiscard]] auto fuse_open(const char *path, | ||||
|                                const remote::open_flags &flags, | ||||
|                                remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_rename(const char *from, const char *to) | ||||
|   [[nodiscard]] auto fuse_read(const char *path, char *buffer, | ||||
|                                const remote::file_size &read_size, | ||||
|                                const remote::file_offset &read_offset, | ||||
|                                const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_write(const char *path, const char *buffer, | ||||
|                   const remote::file_size &write_size, | ||||
|                   const remote::file_offset &write_offset, | ||||
|                   const remote::file_handle &handle) | ||||
|   [[nodiscard]] auto fuse_rename(const char *from, const char *to) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_write_base64(const char *path, const char *buffer, | ||||
|                          const remote::file_size &write_size, | ||||
|                          const remote::file_offset &write_offset, | ||||
|                          const remote::file_handle &handle) | ||||
|   [[nodiscard]] auto fuse_write(const char *path, const char *buffer, | ||||
|                                 const remote::file_size &write_size, | ||||
|                                 const remote::file_offset &write_offset, | ||||
|                                 const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_readdir(const char *path, const remote::file_offset &offset, | ||||
|                     const remote::file_handle &handle, std::string &item_path) | ||||
|   [[nodiscard]] auto fuse_write_base64(const char *path, const char *buffer, | ||||
|                                        const remote::file_size &write_size, | ||||
|                                        const remote::file_offset &write_offset, | ||||
|                                        const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_release(const char *path, const remote::file_handle &handle) | ||||
|   [[nodiscard]] auto | ||||
|   fuse_readdir(const char *path, const remote::file_offset &offset, | ||||
|                const remote::file_handle &handle, std::string &item_path) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_releasedir(const char *path, const remote::file_handle &handle) | ||||
|   [[nodiscard]] auto fuse_release(const char *path, | ||||
|                                   const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto fuse_releasedir(const char *path, | ||||
|                                      const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   /*packet::error_type fuse_removexattr(const char *path, const char *name) | ||||
|    * override ;*/ | ||||
|  | ||||
|   auto fuse_rmdir(const char *path) -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_setattr_x(const char *path, remote::setattr_x &attr) | ||||
|   [[nodiscard]] auto fuse_rmdir(const char *path) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_setbkuptime(const char *path, const remote::file_time &bkuptime) | ||||
|   [[nodiscard]] auto fuse_setattr_x(const char *path, remote::setattr_x &attr) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_setchgtime(const char *path, const remote::file_time &chgtime) | ||||
|   [[nodiscard]] auto fuse_setbkuptime(const char *path, | ||||
|                                       const remote::file_time &bkuptime) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_setcrtime(const char *path, const remote::file_time &crtime) | ||||
|   [[nodiscard]] auto fuse_setchgtime(const char *path, | ||||
|                                      const remote::file_time &chgtime) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_setvolname(const char *volname) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_setcrtime(const char *path, | ||||
|                                     const remote::file_time &crtime) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto fuse_setvolname(const char *volname) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   /*packet::error_type fuse_setxattr(const char *path, const char *name, const | ||||
|   char *value, const remote::file_size &size, const std::int32_t &flags) | ||||
| @@ -181,109 +199,123 @@ public: | ||||
|   char *value, const remote::file_size &size, const std::int32_t &flags, | ||||
|                                            std::uint32_t position) override ;*/ | ||||
|  | ||||
|   auto fuse_statfs(const char *path, std::uint64_t frsize, | ||||
|                    remote::statfs &r_stat) -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_statfs_x(const char *path, std::uint64_t bsize, | ||||
|                      remote::statfs_x &r_stat) -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_truncate(const char *path, const remote::file_offset &size) | ||||
|   [[nodiscard]] auto fuse_statfs(const char *path, std::uint64_t frsize, | ||||
|                                  remote::statfs &r_stat) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_unlink(const char *path) -> packet::error_type override; | ||||
|   [[nodiscard]] auto fuse_statfs_x(const char *path, std::uint64_t bsize, | ||||
|                                    remote::statfs_x &r_stat) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto fuse_utimens(const char *path, const remote::file_time *tv, | ||||
|                     std::uint64_t op0, std::uint64_t op1) | ||||
|   [[nodiscard]] auto fuse_truncate(const char *path, | ||||
|                                    const remote::file_offset &size) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto fuse_unlink(const char *path) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto fuse_utimens(const char *path, const remote::file_time *tv, | ||||
|                                   std::uint64_t op0, std::uint64_t op1) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   void set_fuse_uid_gid(const remote::user_id & /* uid */, | ||||
|                         const remote::group_id & /* gid */) override {} | ||||
|  | ||||
|   // JSON Layer | ||||
|   auto json_create_directory_snapshot(const std::string &path, json &json_data) | ||||
|   [[nodiscard]] auto json_create_directory_snapshot(const std::string &path, | ||||
|                                                     json &json_data) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto json_read_directory_snapshot(const std::string &path, | ||||
|                                     const remote::file_handle &handle, | ||||
|                                     std::uint32_t page, json &json_data) | ||||
|       -> packet::error_type override; | ||||
|   [[nodiscard]] auto json_read_directory_snapshot( | ||||
|       const std::string &path, const remote::file_handle &handle, | ||||
|       std::uint32_t page, json &json_data) -> packet::error_type override; | ||||
|  | ||||
|   auto json_release_directory_snapshot(const std::string &path, | ||||
|                                        const remote::file_handle &handle) | ||||
|   [[nodiscard]] auto | ||||
|   json_release_directory_snapshot(const std::string &path, | ||||
|                                   const remote::file_handle &handle) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   // WinFSP Layer | ||||
|   auto winfsp_can_delete(PVOID file_desc, PWSTR file_name) | ||||
|   [[nodiscard]] auto winfsp_can_delete(PVOID file_desc, PWSTR file_name) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_cleanup(PVOID file_desc, PWSTR file_name, UINT32 flags, | ||||
|                       BOOLEAN &was_deleted) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_close(PVOID file_desc) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_create(PWSTR file_name, UINT32 create_options, | ||||
|                      UINT32 granted_access, UINT32 attributes, | ||||
|                      UINT64 allocation_size, PVOID *file_desc, | ||||
|                      remote::file_info *file_info, std::string &normalized_name, | ||||
|                      BOOLEAN &exists) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_flush(PVOID file_desc, remote::file_info *file_info) | ||||
|   [[nodiscard]] auto winfsp_cleanup(PVOID file_desc, PWSTR file_name, | ||||
|                                     UINT32 flags, BOOLEAN &was_deleted) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) | ||||
|   [[nodiscard]] auto winfsp_close(PVOID file_desc) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_file_info(PVOID file_desc, remote::file_info *file_info) | ||||
|   [[nodiscard]] auto | ||||
|   winfsp_create(PWSTR file_name, UINT32 create_options, UINT32 granted_access, | ||||
|                 UINT32 attributes, UINT64 allocation_size, PVOID *file_desc, | ||||
|                 remote::file_info *file_info, std::string &normalized_name, | ||||
|                 BOOLEAN &exists) -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto winfsp_flush(PVOID file_desc, remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_security_by_name(PWSTR file_name, PUINT32 attributes, | ||||
|                                    std::uint64_t *descriptor_size, | ||||
|                                    std::wstring &string_descriptor) | ||||
|   [[nodiscard]] auto winfsp_get_dir_buffer(PVOID file_desc, PVOID *&ptr) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_get_volume_info(UINT64 &total_size, UINT64 &free_size, | ||||
|                               std::string &volume_label) | ||||
|   [[nodiscard]] auto winfsp_get_file_info(PVOID file_desc, | ||||
|                                           remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_mounted(const std::wstring &location) | ||||
|   [[nodiscard]] auto winfsp_get_security_by_name( | ||||
|       PWSTR file_name, PUINT32 attributes, std::uint64_t *descriptor_size, | ||||
|       std::wstring &string_descriptor) -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto winfsp_get_volume_info(UINT64 &total_size, | ||||
|                                             UINT64 &free_size, | ||||
|                                             std::string &volume_label) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_open(PWSTR file_name, UINT32 create_options, | ||||
|                    UINT32 granted_access, PVOID *file_desc, | ||||
|                    remote::file_info *file_info, std::string &normalized_name) | ||||
|   [[nodiscard]] auto winfsp_mounted(const std::wstring &location) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_overwrite(PVOID file_desc, UINT32 attributes, | ||||
|                         BOOLEAN replace_attributes, UINT64 allocation_size, | ||||
|                         remote::file_info *file_info) | ||||
|   [[nodiscard]] auto winfsp_open(PWSTR file_name, UINT32 create_options, | ||||
|                                  UINT32 granted_access, PVOID *file_desc, | ||||
|                                  remote::file_info *file_info, | ||||
|                                  std::string &normalized_name) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, | ||||
|                    PUINT32 bytes_transferred) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_read_directory(PVOID file_desc, PWSTR pattern, PWSTR marker, | ||||
|                              json &item_list) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_rename(PVOID file_desc, PWSTR file_name, PWSTR new_file_name, | ||||
|                      BOOLEAN replace_if_exists) -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_set_basic_info(PVOID file_desc, UINT32 attributes, | ||||
|                              UINT64 creation_time, UINT64 last_access_time, | ||||
|                              UINT64 last_write_time, UINT64 change_time, | ||||
|                              remote::file_info *file_info) | ||||
|   [[nodiscard]] auto winfsp_overwrite(PVOID file_desc, UINT32 attributes, | ||||
|                                       BOOLEAN replace_attributes, | ||||
|                                       UINT64 allocation_size, | ||||
|                                       remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_set_file_size(PVOID file_desc, UINT64 new_size, | ||||
|                             BOOLEAN set_allocation_size, | ||||
|                             remote::file_info *file_info) | ||||
|   [[nodiscard]] auto winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, | ||||
|                                  UINT32 length, PUINT32 bytes_transferred) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_unmounted(const std::wstring &location) | ||||
|   [[nodiscard]] auto winfsp_read_directory(PVOID file_desc, PWSTR pattern, | ||||
|                                            PWSTR marker, json &item_list) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   auto winfsp_write(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, | ||||
|                     BOOLEAN write_to_end, BOOLEAN constrained_io, | ||||
|                     PUINT32 bytes_transferred, remote::file_info *file_info) | ||||
|   [[nodiscard]] auto winfsp_rename(PVOID file_desc, PWSTR file_name, | ||||
|                                    PWSTR new_file_name, | ||||
|                                    BOOLEAN replace_if_exists) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto winfsp_set_basic_info( | ||||
|       PVOID file_desc, UINT32 attributes, UINT64 creation_time, | ||||
|       UINT64 last_access_time, UINT64 last_write_time, UINT64 change_time, | ||||
|       remote::file_info *file_info) -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto winfsp_set_file_size(PVOID file_desc, UINT64 new_size, | ||||
|                                           BOOLEAN set_allocation_size, | ||||
|                                           remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto winfsp_unmounted(const std::wstring &location) | ||||
|       -> packet::error_type override; | ||||
|  | ||||
|   [[nodiscard]] auto | ||||
|   winfsp_write(PVOID file_desc, PVOID buffer, UINT64 offset, UINT32 length, | ||||
|                BOOLEAN write_to_end, BOOLEAN constrained_io, | ||||
|                PUINT32 bytes_transferred, remote::file_info *file_info) | ||||
|       -> packet::error_type override; | ||||
| }; | ||||
| } // namespace remote_winfsp | ||||
|   | ||||
| @@ -35,9 +35,8 @@ public: | ||||
|   ~logging_consumer(); | ||||
|  | ||||
| private: | ||||
|   static constexpr const std::uint8_t MAX_LOG_FILES{5U}; | ||||
|   static constexpr const std::uint64_t MAX_LOG_FILE_SIZE{1024ULL * 1024ULL * | ||||
|                                                          5ULL}; | ||||
|   static constexpr std::uint8_t MAX_LOG_FILES{5U}; | ||||
|   static constexpr std::uint64_t MAX_LOG_FILE_SIZE{1024ULL * 1024ULL * 5ULL}; | ||||
|  | ||||
| private: | ||||
|   static void process_event(const i_event &evt); | ||||
|   | ||||
| @@ -27,7 +27,7 @@ class i_event; | ||||
|  | ||||
| class event_system final { | ||||
| private: | ||||
|   static constexpr const std::uint8_t max_queue_retry{ | ||||
|   static constexpr std::uint8_t max_queue_retry{ | ||||
|       30U, | ||||
|   }; | ||||
|  | ||||
| @@ -35,7 +35,7 @@ private: | ||||
|       std::thread::hardware_concurrency() * 4U, | ||||
|   }; | ||||
|  | ||||
|   static constexpr const std::chrono::seconds queue_wait_secs{ | ||||
|   static constexpr std::chrono::seconds queue_wait_secs{ | ||||
|       5s, | ||||
|   }; | ||||
|  | ||||
|   | ||||
| @@ -28,16 +28,19 @@ | ||||
| namespace repertory { | ||||
| struct curl_error final : public i_event { | ||||
|   curl_error() = default; | ||||
|   curl_error(CURLcode code_, std::string_view function_name_, std::string url_) | ||||
|   curl_error(CURLcode code_, std::string_view function_name_, std::string type_, | ||||
|              std::string url_) | ||||
|       : code(code_), | ||||
|         function_name(std::string{function_name_}), | ||||
|         type(std::move(type_)), | ||||
|         url(std::move(url_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::error}; | ||||
|   static constexpr const std::string_view name{"curl_error"}; | ||||
|   static constexpr event_level level{event_level::error}; | ||||
|   static constexpr std::string_view name{"curl_error"}; | ||||
|  | ||||
|   CURLcode code{}; | ||||
|   std::string function_name; | ||||
|   std::string type; | ||||
|   std::string url; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
| @@ -49,8 +52,8 @@ struct curl_error final : public i_event { | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|url|{}|code|{}", name, function_name, url, | ||||
|                        static_cast<int>(code)); | ||||
|     return fmt::format("{}|func|{}|type|{}|url|{}|code|{}", name, function_name, | ||||
|                        type, url, static_cast<int>(code)); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
| @@ -60,12 +63,14 @@ template <> struct adl_serializer<repertory::curl_error> { | ||||
|   static void to_json(json &data, const repertory::curl_error &value) { | ||||
|     data["code"] = value.code; | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["type"] = value.type; | ||||
|     data["url"] = value.url; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::curl_error &value) { | ||||
|     data.at("code").get_to<CURLcode>(value.code); | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("type").get_to<std::string>(value.type); | ||||
|     data.at("url").get_to<std::string>(value.url); | ||||
|   } | ||||
| }; | ||||
|   | ||||
| @@ -31,8 +31,8 @@ struct debug_log final : public i_event { | ||||
|   debug_log(std::string_view function_name_, std::string msg_) | ||||
|       : function_name(std::string(function_name_)), msg(std::move(msg_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"debug_log"}; | ||||
|   static constexpr event_level level{event_level::debug}; | ||||
|   static constexpr std::string_view name{"debug_log"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string msg; | ||||
|   | ||||
| @@ -34,8 +34,8 @@ struct directory_remove_failed final : public i_event { | ||||
|         error(error_), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::error}; | ||||
|   static constexpr const std::string_view name{"directory_remove_failed"}; | ||||
|   static constexpr event_level level{event_level::error}; | ||||
|   static constexpr std::string_view name{"directory_remove_failed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   api_error error{}; | ||||
|   | ||||
| @@ -32,8 +32,8 @@ struct directory_removed final : public i_event { | ||||
|       : api_path(std::move(api_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"directory_removed"}; | ||||
|   static constexpr event_level level{event_level::debug}; | ||||
|   static constexpr std::string_view name{"directory_removed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|   | ||||
| @@ -35,8 +35,8 @@ struct directory_removed_externally final : public i_event { | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"directory_removed_externally"}; | ||||
|   static constexpr event_level level{event_level::warn}; | ||||
|   static constexpr std::string_view name{"directory_removed_externally"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|   | ||||
| @@ -34,8 +34,8 @@ struct download_begin final : public i_event { | ||||
|         dest_path(std::move(dest_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"download_begin"}; | ||||
|   static constexpr event_level level{event_level::info}; | ||||
|   static constexpr std::string_view name{"download_begin"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string dest_path; | ||||
|   | ||||
| @@ -35,8 +35,8 @@ struct download_end final : public i_event { | ||||
|         error(error_), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"download_end"}; | ||||
|   static constexpr event_level level{event_level::info}; | ||||
|   static constexpr std::string_view name{"download_end"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string dest_path; | ||||
|   | ||||
| @@ -35,8 +35,8 @@ struct download_progress final : public i_event { | ||||
|         function_name(std::string(function_name_)), | ||||
|         progress(progress_) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"download_progress"}; | ||||
|   static constexpr event_level level{event_level::info}; | ||||
|   static constexpr std::string_view name{"download_progress"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string dest_path; | ||||
|   | ||||
| @@ -35,8 +35,8 @@ struct download_restore_failed final : public i_event { | ||||
|         error(std::move(error_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::error}; | ||||
|   static constexpr const std::string_view name{"download_restore_failed"}; | ||||
|   static constexpr event_level level{event_level::error}; | ||||
|   static constexpr std::string_view name{"download_restore_failed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string dest_path; | ||||
|   | ||||
| @@ -34,8 +34,8 @@ struct download_restored final : public i_event { | ||||
|         dest_path(std::move(dest_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"download_restored"}; | ||||
|   static constexpr event_level level{event_level::info}; | ||||
|   static constexpr std::string_view name{"download_restored"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string dest_path; | ||||
|   | ||||
| @@ -36,8 +36,8 @@ struct download_resume_add_failed final : public i_event { | ||||
|         error(std::move(error_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::error}; | ||||
|   static constexpr const std::string_view name{"download_resume_add_failed"}; | ||||
|   static constexpr event_level level{event_level::error}; | ||||
|   static constexpr std::string_view name{"download_resume_add_failed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string dest_path; | ||||
|   | ||||
| @@ -34,8 +34,8 @@ struct download_resume_added final : public i_event { | ||||
|         dest_path(std::move(dest_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"download_resume_added"}; | ||||
|   static constexpr event_level level{event_level::debug}; | ||||
|   static constexpr std::string_view name{"download_resume_added"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string dest_path; | ||||
|   | ||||
| @@ -34,8 +34,8 @@ struct download_resume_removed final : public i_event { | ||||
|         dest_path(std::move(dest_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"download_resume_removed"}; | ||||
|   static constexpr event_level level{event_level::debug}; | ||||
|   static constexpr std::string_view name{"download_resume_removed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string dest_path; | ||||
|   | ||||
| @@ -35,8 +35,8 @@ struct download_type_selected final : public i_event { | ||||
|         function_name(std::string(function_name_)), | ||||
|         type(type_) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"download_type_selected"}; | ||||
|   static constexpr event_level level{event_level::debug}; | ||||
|   static constexpr std::string_view name{"download_type_selected"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string dest_path; | ||||
|   | ||||
| @@ -35,8 +35,8 @@ struct drive_mount_failed final : public i_event { | ||||
|         function_name(std::string(function_name_)), | ||||
|         mount_location(std::move(mount_location_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::error}; | ||||
|   static constexpr const std::string_view name{"drive_mount_failed"}; | ||||
|   static constexpr event_level level{event_level::error}; | ||||
|   static constexpr std::string_view name{"drive_mount_failed"}; | ||||
|  | ||||
|   NTSTATUS error{}; | ||||
|   std::string function_name; | ||||
|   | ||||
| @@ -34,8 +34,8 @@ struct drive_mount_result final : public i_event { | ||||
|         mount_location(std::move(mount_location_)), | ||||
|         result(std::move(result_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"drive_mount_result"}; | ||||
|   static constexpr event_level level{event_level::info}; | ||||
|   static constexpr std::string_view name{"drive_mount_result"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string mount_location; | ||||
|   | ||||
| @@ -32,8 +32,8 @@ struct drive_mounted final : public i_event { | ||||
|       : function_name(std::string(function_name_)), | ||||
|         mount_location(std::move(mount_location_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"drive_mounted"}; | ||||
|   static constexpr event_level level{event_level::info}; | ||||
|   static constexpr std::string_view name{"drive_mounted"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string mount_location; | ||||
|   | ||||
| @@ -31,8 +31,8 @@ struct drive_stop_timed_out final : public i_event { | ||||
|   drive_stop_timed_out(std::string_view function_name_) | ||||
|       : function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"drive_stop_timed_out"}; | ||||
|   static constexpr event_level level{event_level::warn}; | ||||
|   static constexpr std::string_view name{"drive_stop_timed_out"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|  | ||||
|   | ||||
| @@ -33,8 +33,8 @@ struct drive_unmount_pending final : public i_event { | ||||
|       : function_name(std::string(function_name_)), | ||||
|         mount_location(std::move(mount_location_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"drive_unmount_pending"}; | ||||
|   static constexpr event_level level{event_level::info}; | ||||
|   static constexpr std::string_view name{"drive_unmount_pending"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string mount_location; | ||||
|   | ||||
| @@ -32,8 +32,8 @@ struct drive_unmounted final : public i_event { | ||||
|       : function_name(std::string(function_name_)), | ||||
|         mount_location(std::move(mount_location_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"drive_unmounted"}; | ||||
|   static constexpr event_level level{event_level::info}; | ||||
|   static constexpr std::string_view name{"drive_unmounted"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string mount_location; | ||||
|   | ||||
| @@ -31,8 +31,8 @@ struct event_level_changed final : public i_event { | ||||
|   event_level_changed(std::string_view function_name_, event_level new_level_) | ||||
|       : function_name(std::string(function_name_)), new_level(new_level_) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"event_level_changed"}; | ||||
|   static constexpr event_level level{event_level::info}; | ||||
|   static constexpr std::string_view name{"event_level_changed"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   event_level new_level{}; | ||||
|   | ||||
| @@ -32,8 +32,8 @@ struct file_pinned final : public i_event { | ||||
|       : api_path(std::move(api_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"file_pinned"}; | ||||
|   static constexpr event_level level{event_level::info}; | ||||
|   static constexpr std::string_view name{"file_pinned"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|   | ||||
| @@ -34,8 +34,8 @@ struct file_remove_failed final : public i_event { | ||||
|         error(error_), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::error}; | ||||
|   static constexpr const std::string_view name{"file_remove_failed"}; | ||||
|   static constexpr event_level level{event_level::error}; | ||||
|   static constexpr std::string_view name{"file_remove_failed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   api_error error{}; | ||||
|   | ||||
| @@ -32,8 +32,8 @@ struct file_removed final : public i_event { | ||||
|       : api_path(std::move(api_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"file_removed"}; | ||||
|   static constexpr event_level level{event_level::debug}; | ||||
|   static constexpr std::string_view name{"file_removed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|   | ||||
| @@ -35,8 +35,8 @@ struct file_removed_externally final : public i_event { | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"file_removed_externally"}; | ||||
|   static constexpr event_level level{event_level::warn}; | ||||
|   static constexpr std::string_view name{"file_removed_externally"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|   | ||||
| @@ -32,8 +32,8 @@ struct file_unpinned final : public i_event { | ||||
|       : api_path(std::move(api_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"file_unpinned"}; | ||||
|   static constexpr event_level level{event_level::info}; | ||||
|   static constexpr std::string_view name{"file_unpinned"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|   | ||||
| @@ -37,8 +37,8 @@ struct file_upload_completed final : public i_event { | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"file_upload_completed"}; | ||||
|   static constexpr event_level level{event_level::info}; | ||||
|   static constexpr std::string_view name{"file_upload_completed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   bool cancelled{}; | ||||
|   | ||||
| @@ -35,8 +35,8 @@ struct file_upload_failed final : public i_event { | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"file_upload_failed"}; | ||||
|   static constexpr event_level level{event_level::warn}; | ||||
|   static constexpr std::string_view name{"file_upload_failed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string error; | ||||
|   | ||||
| @@ -34,8 +34,8 @@ struct file_upload_not_found final : public i_event { | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"file_upload_not_found"}; | ||||
|   static constexpr event_level level{event_level::warn}; | ||||
|   static constexpr std::string_view name{"file_upload_not_found"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|   | ||||
| @@ -34,8 +34,8 @@ struct file_upload_queued final : public i_event { | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"file_upload_queued"}; | ||||
|   static constexpr event_level level{event_level::info}; | ||||
|   static constexpr std::string_view name{"file_upload_queued"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|   | ||||
| @@ -32,8 +32,8 @@ struct file_upload_removed final : public i_event { | ||||
|       : api_path(std::move(api_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"file_upload_removed"}; | ||||
|   static constexpr event_level level{event_level::debug}; | ||||
|   static constexpr std::string_view name{"file_upload_removed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|   | ||||
| @@ -35,8 +35,8 @@ struct file_upload_retry final : public i_event { | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"file_upload_retry"}; | ||||
|   static constexpr event_level level{event_level::warn}; | ||||
|   static constexpr std::string_view name{"file_upload_retry"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   api_error error{}; | ||||
|   | ||||
| @@ -35,8 +35,8 @@ struct filesystem_item_added final : public i_event { | ||||
|         directory(directory_), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"filesystem_item_added"}; | ||||
|   static constexpr event_level level{event_level::debug}; | ||||
|   static constexpr std::string_view name{"filesystem_item_added"}; | ||||
|  | ||||
|   std::string api_parent; | ||||
|   std::string api_path; | ||||
|   | ||||
| @@ -37,8 +37,8 @@ struct filesystem_item_closed final : public i_event { | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::trace}; | ||||
|   static constexpr const std::string_view name{"filesystem_item_closed"}; | ||||
|   static constexpr event_level level{event_level::trace}; | ||||
|   static constexpr std::string_view name{"filesystem_item_closed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   bool changed{}; | ||||
|   | ||||
| @@ -35,8 +35,8 @@ struct filesystem_item_evicted final : public i_event { | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"filesystem_item_evicted"}; | ||||
|   static constexpr event_level level{event_level::debug}; | ||||
|   static constexpr std::string_view name{"filesystem_item_evicted"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|   | ||||
| @@ -39,8 +39,8 @@ struct filesystem_item_handle_closed final : public i_event { | ||||
|         handle(handle_), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::trace}; | ||||
|   static constexpr const std::string_view name{"filesystem_item_handle_closed"}; | ||||
|   static constexpr event_level level{event_level::trace}; | ||||
|   static constexpr std::string_view name{"filesystem_item_handle_closed"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   bool changed{}; | ||||
|   | ||||
| @@ -37,8 +37,8 @@ struct filesystem_item_handle_opened final : public i_event { | ||||
|         handle(handle_), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::trace}; | ||||
|   static constexpr const std::string_view name{"filesystem_item_handle_opened"}; | ||||
|   static constexpr event_level level{event_level::trace}; | ||||
|   static constexpr std::string_view name{"filesystem_item_handle_opened"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   bool directory{}; | ||||
|   | ||||
| @@ -36,8 +36,8 @@ struct filesystem_item_opened final : public i_event { | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::trace}; | ||||
|   static constexpr const std::string_view name{"filesystem_item_opened"}; | ||||
|   static constexpr event_level level{event_level::trace}; | ||||
|   static constexpr std::string_view name{"filesystem_item_opened"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   bool directory{}; | ||||
|   | ||||
| @@ -32,8 +32,8 @@ struct fuse_args_parsed final : public i_event { | ||||
|   fuse_args_parsed(std::string_view args_, std::string_view function_name_) | ||||
|       : args(std::move(args_)), function_name(std::string{function_name_}) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"fuse_args_parsed"}; | ||||
|   static constexpr event_level level{event_level::info}; | ||||
|   static constexpr std::string_view name{"fuse_args_parsed"}; | ||||
|  | ||||
|   std::string args; | ||||
|   std::string function_name; | ||||
|   | ||||
| @@ -35,8 +35,8 @@ struct fuse_event final : public i_event { | ||||
|         error(error_), | ||||
|         function_name(std::string{function_name_}) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"fuse_event"}; | ||||
|   static constexpr event_level level{event_level::debug}; | ||||
|   static constexpr std::string_view name{"fuse_event"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::int32_t error{}; | ||||
|   | ||||
							
								
								
									
										68
									
								
								repertory/librepertory/include/events/types/info_log.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								repertory/librepertory/include/events/types/info_log.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <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_EVENTS_TYPES_INFO_LOG_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_INFO_LOG_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct info_log final : public i_event { | ||||
|   info_log() = default; | ||||
|   info_log(std::string_view function_name_, std::string msg_) | ||||
|       : function_name(std::string(function_name_)), msg(std::move(msg_)) {} | ||||
|  | ||||
|   static constexpr event_level level{event_level::info}; | ||||
|   static constexpr std::string_view name{"info_log"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string msg; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|msg|{}", name, function_name, msg); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::info_log> { | ||||
|   static void to_json(json &data, const repertory::info_log &value) { | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["msg"] = value.msg; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::info_log &value) { | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("msg").get_to<std::string>(value.msg); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_INFO_LOG_HPP_ | ||||
| @@ -34,8 +34,8 @@ struct invalid_cache_size final : public i_event { | ||||
|         function_name(std::string{function_name_}), | ||||
|         invalid_size(invalid_size_) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"invalid_cache_size"}; | ||||
|   static constexpr event_level level{event_level::warn}; | ||||
|   static constexpr std::string_view name{"invalid_cache_size"}; | ||||
|  | ||||
|   std::uint64_t cache_size{}; | ||||
|   std::string function_name; | ||||
|   | ||||
| @@ -32,8 +32,8 @@ struct item_timeout final : public i_event { | ||||
|       : api_path(std::move(api_path_)), | ||||
|         function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::trace}; | ||||
|   static constexpr const std::string_view name{"item_timeout"}; | ||||
|   static constexpr event_level level{event_level::trace}; | ||||
|   static constexpr std::string_view name{"item_timeout"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|   | ||||
| @@ -35,8 +35,8 @@ struct max_cache_size_reached final : public i_event { | ||||
|         function_name(std::string{function_name_}), | ||||
|         max_cache_size(max_cache_size_) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"max_cache_size_reached"}; | ||||
|   static constexpr event_level level{event_level::warn}; | ||||
|   static constexpr std::string_view name{"max_cache_size_reached"}; | ||||
|  | ||||
|   std::uint64_t cache_size{}; | ||||
|   std::string function_name; | ||||
|   | ||||
| @@ -33,8 +33,8 @@ struct orphaned_file_detected final : public i_event { | ||||
|       : function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"orphaned_file_detected"}; | ||||
|   static constexpr event_level level{event_level::warn}; | ||||
|   static constexpr std::string_view name{"orphaned_file_detected"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string source_path; | ||||
|   | ||||
| @@ -36,8 +36,8 @@ struct orphaned_file_processing_failed final : public i_event { | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::error}; | ||||
|   static constexpr const std::string_view name{ | ||||
|   static constexpr event_level level{event_level::error}; | ||||
|   static constexpr std::string_view name{ | ||||
|       "orphaned_file_processing_failed", | ||||
|   }; | ||||
|  | ||||
|   | ||||
| @@ -33,8 +33,8 @@ struct orphaned_source_file_detected final : public i_event { | ||||
|       : function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"orphaned_source_file_detected"}; | ||||
|   static constexpr event_level level{event_level::warn}; | ||||
|   static constexpr std::string_view name{"orphaned_source_file_detected"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string source_path; | ||||
|   | ||||
| @@ -33,8 +33,8 @@ struct orphaned_source_file_removed final : public i_event { | ||||
|       : function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"orphaned_source_file_removed"}; | ||||
|   static constexpr event_level level{event_level::warn}; | ||||
|   static constexpr std::string_view name{"orphaned_source_file_removed"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string source_path; | ||||
|   | ||||
| @@ -34,8 +34,8 @@ struct packet_client_timeout final : public i_event { | ||||
|         function_name(std::string(function_name_)), | ||||
|         msg(std::move(msg_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"packet_client_timeout"}; | ||||
|   static constexpr event_level level{event_level::warn}; | ||||
|   static constexpr std::string_view name{"packet_client_timeout"}; | ||||
|  | ||||
|   std::string event_name; | ||||
|   std::string function_name; | ||||
|   | ||||
| @@ -32,8 +32,8 @@ struct polling_item_begin final : public i_event { | ||||
|       : function_name(std::string(function_name_)), | ||||
|         item_name(std::move(item_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"polling_item_begin"}; | ||||
|   static constexpr event_level level{event_level::debug}; | ||||
|   static constexpr std::string_view name{"polling_item_begin"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string item_name; | ||||
|   | ||||
| @@ -32,8 +32,8 @@ struct polling_item_end final : public i_event { | ||||
|       : function_name(std::string(function_name_)), | ||||
|         item_name(std::move(item_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"polling_item_end"}; | ||||
|   static constexpr event_level level{event_level::debug}; | ||||
|   static constexpr std::string_view name{"polling_item_end"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string item_name; | ||||
|   | ||||
| @@ -35,8 +35,8 @@ struct provider_invalid_version final : public i_event { | ||||
|         required_version(std::move(required_version_)), | ||||
|         returned_version(std::move(returned_version_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::error}; | ||||
|   static constexpr const std::string_view name{"provider_invalid_version"}; | ||||
|   static constexpr event_level level{event_level::error}; | ||||
|   static constexpr std::string_view name{"provider_invalid_version"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string required_version; | ||||
|   | ||||
| @@ -34,8 +34,8 @@ struct provider_offline final : public i_event { | ||||
|         host_name_or_ip(std::move(host_name_or_ip_)), | ||||
|         port(port_) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::warn}; | ||||
|   static constexpr const std::string_view name{"provider_offline"}; | ||||
|   static constexpr event_level level{event_level::warn}; | ||||
|   static constexpr std::string_view name{"provider_offline"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string host_name_or_ip; | ||||
|   | ||||
| @@ -34,8 +34,8 @@ struct provider_upload_begin final : public i_event { | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"provider_upload_begin"}; | ||||
|   static constexpr event_level level{event_level::info}; | ||||
|   static constexpr std::string_view name{"provider_upload_begin"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   std::string function_name; | ||||
|   | ||||
| @@ -35,8 +35,8 @@ struct provider_upload_end final : public i_event { | ||||
|         function_name(std::string(function_name_)), | ||||
|         source_path(std::move(source_path_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"provider_upload_end"}; | ||||
|   static constexpr event_level level{event_level::info}; | ||||
|   static constexpr std::string_view name{"provider_upload_end"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   api_error error{}; | ||||
|   | ||||
| @@ -35,8 +35,8 @@ struct remote_server_event final : public i_event { | ||||
|         error(error_), | ||||
|         function_name(std::string{function_name_}) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"remote_server_event"}; | ||||
|   static constexpr event_level level{event_level::debug}; | ||||
|   static constexpr std::string_view name{"remote_server_event"}; | ||||
|  | ||||
|   std::string api_path; | ||||
|   packet::error_type error{}; | ||||
|   | ||||
| @@ -31,8 +31,8 @@ struct repertory_exception final : public i_event { | ||||
|   repertory_exception(std::string_view function_name_, std::string msg_) | ||||
|       : function_name(std::string(function_name_)), msg(std::move(msg_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::error}; | ||||
|   static constexpr const std::string_view name{"repertory_exception"}; | ||||
|   static constexpr event_level level{event_level::error}; | ||||
|   static constexpr std::string_view name{"repertory_exception"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string msg; | ||||
|   | ||||
| @@ -33,8 +33,8 @@ struct service_start_begin final : public i_event { | ||||
|       : function_name(std::string(function_name_)), | ||||
|         service_name(std::move(service_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"service_start_begin"}; | ||||
|   static constexpr event_level level{event_level::debug}; | ||||
|   static constexpr std::string_view name{"service_start_begin"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string service_name; | ||||
|   | ||||
| @@ -32,8 +32,8 @@ struct service_start_end final : public i_event { | ||||
|       : function_name(std::string(function_name_)), | ||||
|         service_name(std::move(service_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"service_start_end"}; | ||||
|   static constexpr event_level level{event_level::debug}; | ||||
|   static constexpr std::string_view name{"service_start_end"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string service_name; | ||||
|   | ||||
| @@ -32,8 +32,8 @@ struct service_stop_begin final : public i_event { | ||||
|       : function_name(std::string(function_name_)), | ||||
|         service_name(std::move(service_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"service_stop_begin"}; | ||||
|   static constexpr event_level level{event_level::debug}; | ||||
|   static constexpr std::string_view name{"service_stop_begin"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string service_name; | ||||
|   | ||||
| @@ -32,8 +32,8 @@ struct service_stop_end final : public i_event { | ||||
|       : function_name(std::string(function_name_)), | ||||
|         service_name(std::move(service_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::debug}; | ||||
|   static constexpr const std::string_view name{"service_stop_end"}; | ||||
|   static constexpr event_level level{event_level::debug}; | ||||
|   static constexpr std::string_view name{"service_stop_end"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string service_name; | ||||
|   | ||||
							
								
								
									
										68
									
								
								repertory/librepertory/include/events/types/trace_log.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								repertory/librepertory/include/events/types/trace_log.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <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_EVENTS_TYPES_TRACE_LOG_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_TRACE_LOG_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct trace_log final : public i_event { | ||||
|   trace_log() = default; | ||||
|   trace_log(std::string_view function_name_, std::string msg_) | ||||
|       : function_name(std::string(function_name_)), msg(std::move(msg_)) {} | ||||
|  | ||||
|   static constexpr event_level level{event_level::trace}; | ||||
|   static constexpr std::string_view name{"trace_log"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string msg; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|msg|{}", name, function_name, msg); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::trace_log> { | ||||
|   static void to_json(json &data, const repertory::trace_log &value) { | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["msg"] = value.msg; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::trace_log &value) { | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("msg").get_to<std::string>(value.msg); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_TRACE_LOG_HPP_ | ||||
| @@ -31,8 +31,8 @@ struct unmount_requested final : public i_event { | ||||
|   unmount_requested(std::string_view function_name_) | ||||
|       : function_name(std::string(function_name_)) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"unmount_requested"}; | ||||
|   static constexpr event_level level{event_level::info}; | ||||
|   static constexpr std::string_view name{"unmount_requested"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|  | ||||
|   | ||||
| @@ -35,8 +35,8 @@ struct unmount_result final : public i_event { | ||||
|         mount_location(std::move(mount_location_)), | ||||
|         result(result_) {} | ||||
|  | ||||
|   static constexpr const event_level level{event_level::info}; | ||||
|   static constexpr const std::string_view name{"unmount_result"}; | ||||
|   static constexpr event_level level{event_level::info}; | ||||
|   static constexpr std::string_view name{"unmount_result"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string mount_location; | ||||
|   | ||||
							
								
								
									
										68
									
								
								repertory/librepertory/include/events/types/warn_log.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								repertory/librepertory/include/events/types/warn_log.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | ||||
| /* | ||||
|   Copyright <2018-2025> <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_EVENTS_TYPES_WARN_LOG_HPP_ | ||||
| #define REPERTORY_INCLUDE_EVENTS_TYPES_WARN_LOG_HPP_ | ||||
|  | ||||
| #include "events/i_event.hpp" | ||||
| #include "types/repertory.hpp" | ||||
|  | ||||
| namespace repertory { | ||||
| struct warn_log final : public i_event { | ||||
|   warn_log() = default; | ||||
|   warn_log(std::string_view function_name_, std::string msg_) | ||||
|       : function_name(std::string(function_name_)), msg(std::move(msg_)) {} | ||||
|  | ||||
|   static constexpr event_level level{event_level::warn}; | ||||
|   static constexpr std::string_view name{"warn_log"}; | ||||
|  | ||||
|   std::string function_name; | ||||
|   std::string msg; | ||||
|  | ||||
|   [[nodiscard]] auto get_event_level() const -> event_level override { | ||||
|     return level; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_name() const -> std::string_view override { | ||||
|     return name; | ||||
|   } | ||||
|  | ||||
|   [[nodiscard]] auto get_single_line() const -> std::string override { | ||||
|     return fmt::format("{}|func|{}|msg|{}", name, function_name, msg); | ||||
|   } | ||||
| }; | ||||
| } // namespace repertory | ||||
|  | ||||
| NLOHMANN_JSON_NAMESPACE_BEGIN | ||||
| template <> struct adl_serializer<repertory::warn_log> { | ||||
|   static void to_json(json &data, const repertory::warn_log &value) { | ||||
|     data["function_name"] = value.function_name; | ||||
|     data["msg"] = value.msg; | ||||
|   } | ||||
|  | ||||
|   static void from_json(const json &data, repertory::warn_log &value) { | ||||
|     data.at("function_name").get_to<std::string>(value.function_name); | ||||
|     data.at("msg").get_to<std::string>(value.msg); | ||||
|   } | ||||
| }; | ||||
| NLOHMANN_JSON_NAMESPACE_END | ||||
|  | ||||
| #endif // REPERTORY_INCLUDE_EVENTS_TYPES_WARN_LOG_HPP_ | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user