diff --git a/binding.gyp b/binding.gyp index 3035a6be..b9a49947 100644 --- a/binding.gyp +++ b/binding.gyp @@ -36,7 +36,8 @@ "native-src/virtual_drive/get_registered_sync_roots/get_registered_sync_roots_wrapper.cpp", "native-src/virtual_drive/hydrate_file.cpp", "native-src/virtual_drive/register_sync_root/register_sync_root.cpp", - "native-src/virtual_drive/register_sync_root/register_sync_root_wrapper.cpp" + "native-src/virtual_drive/register_sync_root/register_sync_root_wrapper.cpp", + "native-src/virtual_drive/unregister_sync_root_wrapper.cpp" ], "include_dirs": [ "include", diff --git a/dist/addon.node b/dist/addon.node index bc10ba59..5ec80a83 100644 Binary files a/dist/addon.node and b/dist/addon.node differ diff --git a/include/sync_root_interface/SyncRoot.h b/include/sync_root_interface/SyncRoot.h index b29f30fc..a4ab9837 100644 --- a/include/sync_root_interface/SyncRoot.h +++ b/include/sync_root_interface/SyncRoot.h @@ -18,8 +18,6 @@ class SyncRoot public: static HRESULT ConnectSyncRoot(const wchar_t *syncRootPath, InputSyncCallbacks syncCallbacks, napi_env env, CF_CONNECTION_KEY *connectionKey); static HRESULT DisconnectSyncRoot(const wchar_t *syncRootPath); - static HRESULT UnregisterSyncRoot(const GUID &providerId); - static HRESULT UnregisterSyncRoot(const wchar_t *providerIdStr); static std::string GetFileIdentity(const wchar_t *path); static void HydrateFile(const wchar_t *filePath); static void DehydrateFile(const wchar_t *filePath); diff --git a/include/virtual_drive/get_registered_sync_roots/get_registered_sync_roots.h b/include/virtual_drive/get_registered_sync_roots/get_registered_sync_roots.h index 7fb1dd8b..27a56984 100644 --- a/include/virtual_drive/get_registered_sync_roots/get_registered_sync_roots.h +++ b/include/virtual_drive/get_registered_sync_roots/get_registered_sync_roots.h @@ -9,7 +9,6 @@ struct SyncRoots std::wstring path; std::wstring displayName; std::wstring version; - std::wstring context; }; std::vector get_registered_sync_roots(); diff --git a/include/virtual_drive/napi_safe_wrap.h b/include/virtual_drive/napi_safe_wrap.h index 054c840c..7201e4f3 100644 --- a/include/virtual_drive/napi_safe_wrap.h +++ b/include/virtual_drive/napi_safe_wrap.h @@ -7,16 +7,21 @@ template napi_value napi_safe_wrap(napi_env env, napi_callback_info info, Fn&& fn, const char* function_name) { + std::ostringstream oss; + try { return fn(env, info); + } 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) { - std::string error_msg = std::string("[") + function_name + "] " + e.what(); - napi_throw_error(env, nullptr, error_msg.c_str()); + oss << "[" << function_name << "] " << e.what(); } catch (...) { - std::string error_msg = std::string("[") + function_name + "] Unknown native error"; - napi_throw_error(env, nullptr, error_msg.c_str()); + oss << "[" << function_name << "] Unknown native error"; } - + + napi_throw_error(env, nullptr, oss.str().c_str()); return nullptr; } diff --git a/include/virtual_drive/unregister_sync_root_wrapper.h b/include/virtual_drive/unregister_sync_root_wrapper.h new file mode 100644 index 00000000..312b10d7 --- /dev/null +++ b/include/virtual_drive/unregister_sync_root_wrapper.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +napi_value unregister_sync_root_wrapper(napi_env env, napi_callback_info args); diff --git a/native-src/sync_root_interface/SyncRoot.cpp b/native-src/sync_root_interface/SyncRoot.cpp index 07860da0..a87c5045 100644 --- a/native-src/sync_root_interface/SyncRoot.cpp +++ b/native-src/sync_root_interface/SyncRoot.cpp @@ -104,40 +104,6 @@ void SyncRoot::DehydrateFile(const wchar_t *filePath) } } -HRESULT SyncRoot::UnregisterSyncRoot(const GUID &providerId) -{ - try - { - // Convert GUID to string for syncRootID - wchar_t syncRootID[39]; - StringFromGUID2(providerId, syncRootID, 39); - - Logger::getInstance().log("Unregistering sync root.", LogLevel::INFO); - winrt::StorageProviderSyncRootManager::Unregister(syncRootID); - return S_OK; - } - catch (...) - { - wprintf(L"Could not unregister the sync root, hr %08x\n", static_cast(winrt::to_hresult())); - return E_FAIL; - } -} - -HRESULT SyncRoot::UnregisterSyncRoot(const wchar_t *providerIdStr) -{ - try - { - Logger::getInstance().log("Unregistering sync root (string).", LogLevel::INFO); - winrt::StorageProviderSyncRootManager::Unregister(providerIdStr); - return S_OK; - } - catch (...) - { - wprintf(L"Could not unregister the sync root (string), hr %08x\n", static_cast(winrt::to_hresult())); - return E_FAIL; - } -} - HRESULT SyncRoot::ConnectSyncRoot(const wchar_t *syncRootPath, InputSyncCallbacks syncCallbacks, napi_env env, CF_CONNECTION_KEY *connectionKey) { Utilities::AddFolderToSearchIndexer(syncRootPath); diff --git a/native-src/virtual_drive/Wrappers.cpp b/native-src/virtual_drive/Wrappers.cpp index 1ff75bfa..812c9bc8 100644 --- a/native-src/virtual_drive/Wrappers.cpp +++ b/native-src/virtual_drive/Wrappers.cpp @@ -16,64 +16,15 @@ #include "hydrate_file.h" #include "convert_to_placeholder.h" #include "get_registered_sync_roots_wrapper.h" +#include "unregister_sync_root_wrapper.h" #include "NAPI_SAFE_WRAP.h" -napi_value CreatePlaceholderFile(napi_env env, napi_callback_info args) -{ +napi_value CreatePlaceholderFile(napi_env env, napi_callback_info args) { return NAPI_SAFE_WRAP(env, args, create_file_placeholder_impl); } -/** - * v2.5.7 Carlos Gonzalez - * Added backward compatibility for the default virtual drive identifier "syncRootID". - * If the provided ID is "syncRootID", it will be unregistered without throwing an error, - * maintaining support for previous versions that used it instead of a GUID. - */ - -napi_value UnregisterSyncRootWrapper(napi_env env, napi_callback_info args) -{ - size_t argc = 1; - napi_value argv[1]; - - napi_get_cb_info(env, args, &argc, argv, nullptr, nullptr); - - if (argc < 1) - { - napi_throw_error(env, nullptr, "The provider ID is required for UnregisterSyncRoot"); - return nullptr; - } - - GUID providerId; - LPCWSTR providerIdStr; - size_t providerIdStrLength; - napi_get_value_string_utf16(env, argv[0], nullptr, 0, &providerIdStrLength); - providerIdStr = new WCHAR[providerIdStrLength + 1]; - napi_get_value_string_utf16(env, argv[0], reinterpret_cast(const_cast(providerIdStr)), providerIdStrLength + 1, nullptr); - - - HRESULT result; - HRESULT guidResult = CLSIDFromString(providerIdStr, &providerId); - - if (SUCCEEDED(guidResult)) - { - result = SyncRoot::UnregisterSyncRoot(providerId); - } - else if (wcscmp(providerIdStr, L"syncRootID") == 0) - { - result = SyncRoot::UnregisterSyncRoot(providerIdStr); - } - else - { - napi_throw_error(env, nullptr, "Invalid provider ID: must be a GUID or 'syncRootID'"); - delete[] providerIdStr; - return nullptr; - } - - delete[] providerIdStr; - - napi_value napiResult; - napi_create_int32(env, static_cast(result), &napiResult); - return napiResult; +napi_value UnregisterSyncRootWrapper(napi_env env, napi_callback_info args) { + return NAPI_SAFE_WRAP(env, args, unregister_sync_root_wrapper); } napi_value RegisterSyncRootWrapper(napi_env env, napi_callback_info info) { diff --git a/native-src/virtual_drive/get_registered_sync_roots/get_registered_sync_roots.cpp b/native-src/virtual_drive/get_registered_sync_roots/get_registered_sync_roots.cpp index a2a89880..447cb1a1 100644 --- a/native-src/virtual_drive/get_registered_sync_roots/get_registered_sync_roots.cpp +++ b/native-src/virtual_drive/get_registered_sync_roots/get_registered_sync_roots.cpp @@ -15,12 +15,6 @@ std::vector get_registered_sync_roots() { sr.path = info.Path().Path(); sr.displayName = info.DisplayNameResource(); sr.version = info.Version(); - - auto contextBuffer = info.Context(); - if (contextBuffer) { - sr.context = winrt::CryptographicBuffer::ConvertBinaryToString(winrt::BinaryStringEncoding::Utf8, contextBuffer).c_str(); - } - syncRootList.push_back(sr); } diff --git a/native-src/virtual_drive/get_registered_sync_roots/get_registered_sync_roots_wrapper.cpp b/native-src/virtual_drive/get_registered_sync_roots/get_registered_sync_roots_wrapper.cpp index cb56b20d..d44f75a4 100644 --- a/native-src/virtual_drive/get_registered_sync_roots/get_registered_sync_roots_wrapper.cpp +++ b/native-src/virtual_drive/get_registered_sync_roots/get_registered_sync_roots_wrapper.cpp @@ -30,7 +30,6 @@ napi_value get_registered_sync_roots_wrapper(napi_env env, napi_callback_info ar add_string_property(env, jsObj, "path", roots[i].path); add_string_property(env, jsObj, "displayName", roots[i].displayName); add_string_property(env, jsObj, "version", roots[i].version); - add_string_property(env, jsObj, "context", roots[i].context); napi_set_element(env, jsArray, i, jsObj); } diff --git a/native-src/virtual_drive/register_sync_root/register_sync_root.cpp b/native-src/virtual_drive/register_sync_root/register_sync_root.cpp index 7740b3cb..be1eabe0 100644 --- a/native-src/virtual_drive/register_sync_root/register_sync_root.cpp +++ b/native-src/virtual_drive/register_sync_root/register_sync_root.cpp @@ -30,12 +30,5 @@ void register_sync_root(const wchar_t *syncRootPath, const wchar_t *providerName winrt::Uri uri(L"https://drive.internxt.com/app/trash"); info.RecycleBinUri(uri); - std::wstring syncRootIdentity(syncRootPath); - syncRootIdentity.append(L"#inxt#"); - syncRootIdentity.append(providerName); - - winrt::IBuffer contextBuffer = winrt::CryptographicBuffer::ConvertStringToBinary(syncRootIdentity, winrt::BinaryStringEncoding::Utf8); - info.Context(contextBuffer); - winrt::StorageProviderSyncRootManager::Register(info); } diff --git a/native-src/virtual_drive/register_sync_root/register_sync_root_wrapper.cpp b/native-src/virtual_drive/register_sync_root/register_sync_root_wrapper.cpp index 14976cd6..a697ec78 100644 --- a/native-src/virtual_drive/register_sync_root/register_sync_root_wrapper.cpp +++ b/native-src/virtual_drive/register_sync_root/register_sync_root_wrapper.cpp @@ -1,8 +1,7 @@ #include #include "register_sync_root.h" -napi_value register_sync_root_wrapper(napi_env env, napi_callback_info args) -{ +napi_value register_sync_root_wrapper(napi_env env, napi_callback_info args) { size_t argc = 5; napi_value argv[5]; napi_get_cb_info(env, args, &argc, argv, nullptr, nullptr); diff --git a/native-src/virtual_drive/unregister_sync_root_wrapper.cpp b/native-src/virtual_drive/unregister_sync_root_wrapper.cpp new file mode 100644 index 00000000..b2ad4688 --- /dev/null +++ b/native-src/virtual_drive/unregister_sync_root_wrapper.cpp @@ -0,0 +1,19 @@ +#include +#include +#include +#include "stdafx.h" + +napi_value unregister_sync_root_wrapper(napi_env env, napi_callback_info args) { + size_t argc = 1; + napi_value argv[1]; + napi_get_cb_info(env, args, &argc, argv, nullptr, nullptr); + + size_t providerIdLength; + napi_get_value_string_utf16(env, argv[0], nullptr, 0, &providerIdLength); + std::wstring providerId(providerIdLength, L'\0'); + napi_get_value_string_utf16(env, argv[0], reinterpret_cast(&providerId[0]), providerIdLength + 1, nullptr); + + winrt::StorageProviderSyncRootManager::Unregister(providerId); + + return nullptr; +}