diff --git a/binding.gyp b/binding.gyp index 8037b860..02e14a5d 100644 --- a/binding.gyp +++ b/binding.gyp @@ -38,7 +38,7 @@ ], "include_dirs": [ "include", - "include/napi_helpers", + "include/helpers", "include/placeholders_interface", "include/sync_root_interface", "include/sync_root_interface/callbacks", diff --git a/dist/addon.node b/dist/addon.node index 0572bdfa..46f31120 100644 Binary files a/dist/addon.node and b/dist/addon.node differ diff --git a/include/helpers/check_hresult.h b/include/helpers/check_hresult.h new file mode 100644 index 00000000..5fe4603e --- /dev/null +++ b/include/helpers/check_hresult.h @@ -0,0 +1,20 @@ +#ifndef WINRT_CHECK_HRESULT_WRAPPER_H +#define WINRT_CHECK_HRESULT_WRAPPER_H + +#include +#include + +inline void check_hresult(const char *key, HRESULT hr) +{ + try + { + winrt::check_hresult(hr); + } + catch (const winrt::hresult_error &e) + { + std::string msg = std::string("[") + key + "] " + winrt::to_string(e.message()); + throw winrt::hresult_error(e.code(), winrt::to_hstring(msg)); + } +} + +#endif diff --git a/include/napi_helpers/napi_extract_args.h b/include/helpers/napi_extract_args.h similarity index 79% rename from include/napi_helpers/napi_extract_args.h rename to include/helpers/napi_extract_args.h index 027a519c..8f95985e 100644 --- a/include/napi_helpers/napi_extract_args.h +++ b/include/helpers/napi_extract_args.h @@ -4,47 +4,52 @@ #include #include -template +template T napi_extract_value(napi_env env, napi_value value); -template<> -inline std::wstring napi_extract_value(napi_env env, napi_value value) { +template <> +inline std::wstring napi_extract_value(napi_env env, napi_value value) +{ size_t length; napi_get_value_string_utf16(env, value, nullptr, 0, &length); std::wstring result(length + 1, L'\0'); size_t actualLength; - napi_get_value_string_utf16(env, value, reinterpret_cast(result.data()), length + 1, &actualLength); + napi_get_value_string_utf16(env, value, reinterpret_cast(result.data()), length + 1, &actualLength); result.resize(actualLength); return result; } -template<> -inline int64_t napi_extract_value(napi_env env, napi_value value) { +template <> +inline int64_t napi_extract_value(napi_env env, napi_value value) +{ int64_t result; napi_get_value_int64(env, value, &result); return result; } -template<> -inline bool napi_extract_value(napi_env env, napi_value value) { +template <> +inline bool napi_extract_value(napi_env env, napi_value value) +{ bool result; napi_get_value_bool(env, value, &result); return result; } -template -inline std::tuple napi_extract_args_impl(napi_env env, napi_value* argv, std::index_sequence) { +template +inline std::tuple napi_extract_args_impl(napi_env env, napi_value *argv, std::index_sequence) +{ return std::make_tuple(napi_extract_value(env, argv[Is])...); } -template -inline std::tuple napi_extract_args(napi_env env, napi_callback_info info) { +template +inline std::tuple napi_extract_args(napi_env env, napi_callback_info info) +{ constexpr size_t N = sizeof...(Types); size_t argc = N; napi_value argv[N]; napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); - + return napi_extract_args_impl(env, argv, std::make_index_sequence{}); } diff --git a/include/napi_helpers/napi_safe_wrap.h b/include/helpers/napi_safe_wrap.h similarity index 79% rename from include/napi_helpers/napi_safe_wrap.h rename to include/helpers/napi_safe_wrap.h index 15df7255..2073b805 100644 --- a/include/napi_helpers/napi_safe_wrap.h +++ b/include/helpers/napi_safe_wrap.h @@ -6,19 +6,27 @@ #include template -napi_value napi_safe_wrap(napi_env env, napi_callback_info info, Fn&& fn, const char* function_name) { +napi_value napi_safe_wrap(napi_env env, napi_callback_info info, Fn &&fn, const char *function_name) +{ std::ostringstream oss; - try { + try + { return fn(env, info); - } catch (const winrt::hresult_error& e) { + } + catch (const winrt::hresult_error &e) + { oss << "[" << function_name << "] WinRT error: " << winrt::to_string(e.message()) << " (HRESULT: 0x" << std::hex << e.code() << ")"; - } catch (const std::exception& e) { + } + catch (const std::exception &e) + { oss << "[" << function_name << "] " << e.what(); - } catch (...) { + } + catch (...) + { oss << "[" << function_name << "] Unknown native error"; } - + napi_throw_error(env, nullptr, oss.str().c_str()); return nullptr; } diff --git a/native-src/placeholders_interface/Planceholders.cpp b/native-src/placeholders_interface/Planceholders.cpp index fd96fdb1..0514a97f 100644 --- a/native-src/placeholders_interface/Planceholders.cpp +++ b/native-src/placeholders_interface/Planceholders.cpp @@ -14,6 +14,7 @@ #include #include #include "convert_to_placeholder.h" +#include #pragma comment(lib, "shlwapi.lib") @@ -50,11 +51,13 @@ void Placeholders::UpdateSyncStatus(const std::wstring &path) { auto fileHandle = Placeholders::OpenFileHandle(path, FILE_WRITE_ATTRIBUTES, true); - winrt::check_hresult(CfSetInSyncState( - fileHandle.get(), - CF_IN_SYNC_STATE_IN_SYNC, - CF_SET_IN_SYNC_FLAG_NONE, - nullptr)); + check_hresult( + "CfSetInSyncState", + CfSetInSyncState( + fileHandle.get(), + CF_IN_SYNC_STATE_IN_SYNC, + CF_SET_IN_SYNC_FLAG_NONE, + nullptr)); SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, path.c_str(), nullptr); } @@ -63,16 +66,18 @@ void Placeholders::UpdateFileIdentity(const std::wstring &path, const std::wstri { auto fileHandle = OpenFileHandle(path, FILE_WRITE_ATTRIBUTES, true); - winrt::check_hresult(CfUpdatePlaceholder( - fileHandle.get(), - nullptr, - placeholderId.c_str(), - static_cast(placeholderId.size() * sizeof(wchar_t)), - nullptr, - 0, - CF_UPDATE_FLAG_NONE, - nullptr, - nullptr)); + check_hresult( + "CfUpdatePlaceholder", + CfUpdatePlaceholder( + fileHandle.get(), + nullptr, + placeholderId.c_str(), + static_cast(placeholderId.size() * sizeof(wchar_t)), + nullptr, + 0, + CF_UPDATE_FLAG_NONE, + nullptr, + nullptr)); } FileState Placeholders::GetPlaceholderInfo(const std::wstring &path) @@ -85,12 +90,14 @@ FileState Placeholders::GetPlaceholderInfo(const std::wstring &path) std::vector buffer(infoSize); auto *info = reinterpret_cast(buffer.data()); - winrt::check_hresult(CfGetPlaceholderInfo( - fileHandle.get(), - CF_PLACEHOLDER_INFO_BASIC, - info, - infoSize, - nullptr)); + check_hresult( + "CfGetPlaceholderInfo", + CfGetPlaceholderInfo( + fileHandle.get(), + CF_PLACEHOLDER_INFO_BASIC, + info, + infoSize, + nullptr)); std::string placeholderId(reinterpret_cast(info->FileIdentity), info->FileIdentityLength); diff --git a/native-src/sync_root_interface/SyncRoot.cpp b/native-src/sync_root_interface/SyncRoot.cpp index 6f02babf..1723801a 100644 --- a/native-src/sync_root_interface/SyncRoot.cpp +++ b/native-src/sync_root_interface/SyncRoot.cpp @@ -4,6 +4,7 @@ #include #include #include +#include std::map connectionMap; @@ -19,14 +20,14 @@ void SyncRoot::ConnectSyncRoot(const wchar_t *syncRootPath, InputSyncCallbacks s CF_CONNECTION_KEY connectionKey; - HRESULT hr = CfConnectSyncRoot( - syncRootPath, - callbackTable, - nullptr, - CF_CONNECT_FLAG_REQUIRE_PROCESS_INFO | CF_CONNECT_FLAG_REQUIRE_FULL_FILE_PATH, - &connectionKey); - - winrt::check_hresult(hr); + check_hresult( + "CfConnectSyncRoot", + CfConnectSyncRoot( + syncRootPath, + callbackTable, + nullptr, + CF_CONNECT_FLAG_REQUIRE_PROCESS_INFO | CF_CONNECT_FLAG_REQUIRE_FULL_FILE_PATH, + &connectionKey)); connectionMap[syncRootPath] = connectionKey; } @@ -36,9 +37,7 @@ void SyncRoot::DisconnectSyncRoot(const wchar_t *syncRootPath) auto it = connectionMap.find(syncRootPath); if (it != connectionMap.end()) { - HRESULT hr = CfDisconnectSyncRoot(it->second); - - winrt::check_hresult(hr); + check_hresult("CfDisconnectSyncRoot", CfDisconnectSyncRoot(it->second)); connectionMap.erase(it); } diff --git a/native-src/sync_root_interface/callbacks/FetchData/FetchData.cpp b/native-src/sync_root_interface/callbacks/FetchData/FetchData.cpp index ae119a32..132a0ca5 100644 --- a/native-src/sync_root_interface/callbacks/FetchData/FetchData.cpp +++ b/native-src/sync_root_interface/callbacks/FetchData/FetchData.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -76,7 +77,7 @@ napi_value response_callback_fn_fetch_data(napi_env env, napi_callback_info info if (FAILED(hr)) { transfer_data(ctx->connectionKey, ctx->transferKey, nullptr, ctx->requiredOffset, ctx->requiredLength, STATUS_UNSUCCESSFUL); - winrt::throw_hresult(hr); + check_hresult("transfer_data", hr); } size_t completed = offset + length; @@ -90,9 +91,12 @@ napi_value response_callback_fn_fetch_data(napi_env env, napi_callback_info info winrt::com_ptr shellItem; winrt::com_ptr propStoreVolatile; - winrt::check_hresult(SHCreateItemFromParsingName(ctx->path.c_str(), nullptr, __uuidof(shellItem), shellItem.put_void())); + check_hresult( + "SHCreateItemFromParsingName", + SHCreateItemFromParsingName(ctx->path.c_str(), nullptr, __uuidof(shellItem), shellItem.put_void())); - winrt::check_hresult( + check_hresult( + "shellItem->GetPropertyStore", shellItem->GetPropertyStore( GETPROPERTYSTOREFLAGS::GPS_READWRITE | GETPROPERTYSTOREFLAGS::GPS_VOLATILEPROPERTIESONLY, __uuidof(propStoreVolatile), diff --git a/native-src/virtual_drive/convert_to_placeholder.cpp b/native-src/virtual_drive/convert_to_placeholder.cpp index cbf4ab54..c12e0dc8 100644 --- a/native-src/virtual_drive/convert_to_placeholder.cpp +++ b/native-src/virtual_drive/convert_to_placeholder.cpp @@ -3,6 +3,7 @@ #include "stdafx.h" #include "napi_extract_args.h" #include "Placeholders.h" +#include void convert_to_placeholder(const std::wstring &path, const std::wstring &placeholderId) { @@ -19,7 +20,7 @@ void convert_to_placeholder(const std::wstring &path, const std::wstring &placeh if (hr != 0x8007017C) // Already a placeholder { - winrt::check_hresult(hr); + check_hresult("CfConvertToPlaceholder", hr); } } diff --git a/native-src/virtual_drive/create_file_placeholder.cpp b/native-src/virtual_drive/create_file_placeholder.cpp index 5850ab3c..81b29584 100644 --- a/native-src/virtual_drive/create_file_placeholder.cpp +++ b/native-src/virtual_drive/create_file_placeholder.cpp @@ -3,6 +3,7 @@ #include "Placeholders.h" #include "convert_to_placeholder.h" #include "napi_extract_args.h" +#include napi_value create_file_placeholder_impl(napi_env env, napi_callback_info info) { @@ -33,7 +34,9 @@ napi_value create_file_placeholder_impl(napi_env env, napi_callback_info info) cloudEntry.FsMetadata.BasicInfo.LastAccessTime = lastAccessTime; cloudEntry.FsMetadata.BasicInfo.ChangeTime = lastWriteTime; - winrt::check_hresult(CfCreatePlaceholders(parentPath.c_str(), &cloudEntry, 1, CF_CREATE_FLAG_NONE, NULL)); + check_hresult( + "CfCreatePlaceholders", + CfCreatePlaceholders(parentPath.c_str(), &cloudEntry, 1, CF_CREATE_FLAG_NONE, NULL)); return nullptr; } \ No newline at end of file diff --git a/native-src/virtual_drive/create_folder_placeholder.cpp b/native-src/virtual_drive/create_folder_placeholder.cpp index b64b3d0e..51c9eeb1 100644 --- a/native-src/virtual_drive/create_folder_placeholder.cpp +++ b/native-src/virtual_drive/create_folder_placeholder.cpp @@ -3,6 +3,7 @@ #include "Placeholders.h" #include "convert_to_placeholder.h" #include "napi_extract_args.h" +#include napi_value create_folder_placeholder_impl(napi_env env, napi_callback_info info) { @@ -31,7 +32,10 @@ napi_value create_folder_placeholder_impl(napi_env env, napi_callback_info info) cloudEntry.FsMetadata.BasicInfo.LastWriteTime = lastWriteTime; cloudEntry.FsMetadata.BasicInfo.LastAccessTime = lastAccessTime; - winrt::check_hresult(CfCreatePlaceholders(parentPath.c_str(), &cloudEntry, 1, CF_CREATE_FLAG_NONE, NULL)); + check_hresult( + "CfCreatePlaceholders", + CfCreatePlaceholders(parentPath.c_str(), &cloudEntry, 1, CF_CREATE_FLAG_NONE, NULL)); + Placeholders::UpdateSyncStatus(path); return nullptr; diff --git a/native-src/virtual_drive/dehydrate_file.cpp b/native-src/virtual_drive/dehydrate_file.cpp index a6d9ef72..c821307e 100644 --- a/native-src/virtual_drive/dehydrate_file.cpp +++ b/native-src/virtual_drive/dehydrate_file.cpp @@ -2,6 +2,7 @@ #include "napi_extract_args.h" #include "stdafx.h" #include "Placeholders.h" +#include napi_value dehydrate_file(napi_env env, napi_callback_info info) { @@ -21,12 +22,14 @@ napi_value dehydrate_file(napi_env env, napi_callback_info info) LARGE_INTEGER length; GetFileSizeEx(fileHandle.get(), &length); - winrt::check_hresult(CfDehydratePlaceholder( - fileHandle.get(), - offset, - length, - CF_DEHYDRATE_FLAG_NONE, - nullptr)); + check_hresult( + "CfDehydratePlaceholder", + CfDehydratePlaceholder( + fileHandle.get(), + offset, + length, + CF_DEHYDRATE_FLAG_NONE, + nullptr)); return nullptr; } diff --git a/native-src/virtual_drive/hydrate_file.cpp b/native-src/virtual_drive/hydrate_file.cpp index 8aabc0c0..e76f2fb3 100644 --- a/native-src/virtual_drive/hydrate_file.cpp +++ b/native-src/virtual_drive/hydrate_file.cpp @@ -3,6 +3,7 @@ #include #include #include +#include struct AsyncWork { @@ -29,12 +30,14 @@ void hydrate_file(const std::wstring &path) LARGE_INTEGER length; GetFileSizeEx(fileHandle.get(), &length); - winrt::check_hresult(CfHydratePlaceholder( - fileHandle.get(), - offset, - length, - CF_HYDRATE_FLAG_NONE, - nullptr)); + check_hresult( + "CfHydratePlaceholder", + CfHydratePlaceholder( + fileHandle.get(), + offset, + length, + CF_HYDRATE_FLAG_NONE, + nullptr)); } void execute_work(napi_env env, void *data) diff --git a/package.json b/package.json index 63b952b6..57c5c304 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@internxt/node-win", - "version": "1.0.27", + "version": "1.0.28", "author": "Internxt ", "description": "Drive desktop node addon", "main": "dist/index.js",