diff --git a/dist/addon.node b/dist/addon.node index 4fe99071..9ce5ed95 100644 Binary files a/dist/addon.node and b/dist/addon.node differ diff --git a/include/placeholders_interface/Placeholders.h b/include/placeholders_interface/Placeholders.h index e61ba72c..b9ce5ac8 100644 --- a/include/placeholders_interface/Placeholders.h +++ b/include/placeholders_interface/Placeholders.h @@ -7,9 +7,7 @@ class Placeholders { public: static void MaintainIdentity(std::wstring &fullPath, PCWSTR fileIdentity, bool isDirectory); - static void ForceShellRefresh(const std::wstring &path); - static void UpdateSyncStatus(const std::wstring &filePath, bool syncState, bool isDirectory); - static HRESULT UpdatePinState(const std::wstring &path, const PinState state); + static void UpdateSyncStatus(const std::wstring &filePath, bool isDirectory); static std::string GetFileIdentity(const std::wstring &filePath); static void UpdateFileIdentity(const std::wstring &filePath, const std::wstring &fileIdentity, bool isDirectory); static FileState GetPlaceholderInfo(const std::wstring &directoryPath); diff --git a/native-src/main.cpp b/native-src/main.cpp index e7d6f488..f7ed265a 100644 --- a/native-src/main.cpp +++ b/native-src/main.cpp @@ -3,244 +3,29 @@ napi_value init(napi_env env, napi_value exports) { - napi_property_descriptor desc = { - "createFilePlaceholder", - nullptr, - CreateFilePlaceholderWrapper, - nullptr, - nullptr, - nullptr, - napi_default, - nullptr}; + napi_property_descriptor properties[] = { + {"createFilePlaceholder", nullptr, CreateFilePlaceholderWrapper, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"unregisterSyncRoot", nullptr, UnregisterSyncRootWrapper, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"registerSyncRoot", nullptr, RegisterSyncRootWrapper, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"getRegisteredSyncRoots", nullptr, GetRegisteredSyncRootsWrapper, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"connectSyncRoot", nullptr, ConnectSyncRootWrapper, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"createFolderPlaceholder", nullptr, CreateFolderPlaceholderWrapper, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"disconnectSyncRoot", nullptr, DisconnectSyncRootWrapper, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"getFileIdentity", nullptr, GetFileIdentityWrapper, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"addLoggerPath", nullptr, addLoggerPathWrapper, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"updateSyncStatus", nullptr, UpdateSyncStatusWrapper, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"getPlaceholderState", nullptr, GetPlaceholderStateWrapper, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"convertToPlaceholder", nullptr, ConvertToPlaceholderWrapper, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"hydrateFile", nullptr, HydrateFileWrapper, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"dehydrateFile", nullptr, DehydrateFileWrapper, nullptr, nullptr, nullptr, napi_default, nullptr}}; - napi_status defineStatus = napi_define_properties(env, exports, 1, &desc); - if (defineStatus != napi_ok) + if (napi_define_properties(env, exports, 14, properties) != napi_ok) { - napi_throw_error(env, nullptr, "Failed to define function"); - return nullptr; - } - - napi_property_descriptor unregisterDesc = { - "unregisterSyncRoot", - nullptr, - UnregisterSyncRootWrapper, - nullptr, - nullptr, - nullptr, - napi_default, - nullptr}; - - napi_status defineUnregisterStatus = napi_define_properties(env, exports, 1, &unregisterDesc); - if (defineUnregisterStatus != napi_ok) - { - napi_throw_error(env, nullptr, "Failed to define UnregisterSyncRoot function"); - return nullptr; - } - - napi_property_descriptor registerSyncRootDesc = { - "registerSyncRoot", - nullptr, - RegisterSyncRootWrapper, - nullptr, - nullptr, - nullptr, - napi_default, - nullptr}; - - napi_status defineRegisterSyncRootStatus = napi_define_properties(env, exports, 1, ®isterSyncRootDesc); - if (defineRegisterSyncRootStatus != napi_ok) - { - napi_throw_error(env, nullptr, "Failed to define RegisterSyncRoot function"); - return nullptr; - } - - napi_property_descriptor getRegisteredSyncRootsRootDesc = { - "getRegisteredSyncRoots", - nullptr, - GetRegisteredSyncRootsWrapper, - nullptr, - nullptr, - nullptr, - napi_default, - nullptr}; - - napi_status defineGetRegisteredSyncRootsRootDescStatus = napi_define_properties(env, exports, 1, &getRegisteredSyncRootsRootDesc); - if (defineGetRegisteredSyncRootsRootDescStatus != napi_ok) - { - napi_throw_error(env, nullptr, "Failed to define getRegisteredSyncRoots function"); - return nullptr; - } - - napi_property_descriptor connectSyncRootDesc = { - "connectSyncRoot", - nullptr, - ConnectSyncRootWrapper, - nullptr, - nullptr, - nullptr, - napi_default, - nullptr}; - - napi_status defineConnectSyncRootStatus = napi_define_properties(env, exports, 1, &connectSyncRootDesc); - if (defineConnectSyncRootStatus != napi_ok) - { - napi_throw_error(env, nullptr, "Failed to define ConnectSyncRoot function"); - return nullptr; - } - - napi_property_descriptor createFolderPlaceholderDesc = { - "createFolderPlaceholder", - nullptr, - CreateFolderPlaceholderWrapper, - nullptr, - nullptr, - nullptr, - napi_default, - nullptr}; - - napi_status defineCreateFolderPlaceholderStatus = napi_define_properties(env, exports, 1, &createFolderPlaceholderDesc); - if (defineCreateFolderPlaceholderStatus != napi_ok) - { - napi_throw_error(env, nullptr, "Failed to define createFolderPlaceholder function"); - return nullptr; - } - - napi_property_descriptor disconnectDesc = { - "disconnectSyncRoot", - nullptr, - DisconnectSyncRootWrapper, - nullptr, - nullptr, - nullptr, - napi_default, - nullptr}; - - napi_status defineDisconnectStatus = napi_define_properties(env, exports, 1, &disconnectDesc); - if (defineDisconnectStatus != napi_ok) - { - napi_throw_error(env, nullptr, "Failed to define DisconnectSyncRoot function"); - return nullptr; - } - - napi_property_descriptor getFileIdentityDesc = { - "getFileIdentity", - nullptr, - GetFileIdentityWrapper, - nullptr, - nullptr, - nullptr, - napi_default, - nullptr}; - - napi_status defineGetFileIdentityStatus = napi_define_properties(env, exports, 1, &getFileIdentityDesc); - if (defineGetFileIdentityStatus != napi_ok) - { - napi_throw_error(env, nullptr, "Failed to define getFileIdentity function"); - return nullptr; - } - - napi_property_descriptor addLoggerPathDesc = { - "addLoggerPath", - nullptr, - addLoggerPathWrapper, - nullptr, - nullptr, - nullptr, - napi_default, - nullptr}; - - napi_status defineAddLoggerPathStatus = napi_define_properties(env, exports, 1, &addLoggerPathDesc); - if (defineAddLoggerPathStatus != napi_ok) - { - napi_throw_error(env, nullptr, "Failed to define addLoggerPath function"); - return nullptr; - } - - napi_property_descriptor updateSyncStatusDesc = { - "updateSyncStatus", - nullptr, - UpdateSyncStatusWrapper, - nullptr, - nullptr, - nullptr, - napi_default, - nullptr}; - - napi_status updateSyncStatusStatus = napi_define_properties(env, exports, 1, &updateSyncStatusDesc); - if (updateSyncStatusStatus != napi_ok) - { - napi_throw_error(env, nullptr, "Failed to define updateSyncStatus function"); - return nullptr; - } - - napi_property_descriptor getPlaceholderStateDesc = { - "getPlaceholderState", - nullptr, - GetPlaceholderStateWrapper, - nullptr, - nullptr, - nullptr, - napi_default, - nullptr}; - - napi_status defineGetPlaceholderStateStatus = napi_define_properties(env, exports, 1, &getPlaceholderStateDesc); - if (defineGetPlaceholderStateStatus != napi_ok) - { - napi_throw_error(env, nullptr, "Failed to define getPlaceholderState function"); - return nullptr; - } - - napi_property_descriptor convertToPlaceholderDesc = { - "convertToPlaceholder", - nullptr, - ConvertToPlaceholderWrapper, - nullptr, - nullptr, - nullptr, - napi_default, - nullptr}; - - napi_status convertToPlaceholderStatus = napi_define_properties(env, exports, 1, &convertToPlaceholderDesc); - if (convertToPlaceholderStatus != napi_ok) - { - napi_throw_error(env, nullptr, "Failed to define convertToPlaceholder function"); - return nullptr; - } - - napi_property_descriptor hydrateFileDesc = { - "hydrateFile", - nullptr, - HydrateFileWrapper, - nullptr, - nullptr, - nullptr, - napi_default, - nullptr}; - - napi_status defineHydrateFileStatus = napi_define_properties(env, exports, 1, &hydrateFileDesc); - if (defineHydrateFileStatus != napi_ok) - { - napi_throw_error(env, nullptr, "Failed to define hydrateFile function"); - return nullptr; - } - - napi_property_descriptor dehydrateFileDesc = { - "dehydrateFile", - nullptr, - DehydrateFileWrapper, - nullptr, - nullptr, - nullptr, - napi_default, - nullptr}; - - napi_status defineDehydrateFileStatus = napi_define_properties(env, exports, 1, &dehydrateFileDesc); - if (defineDehydrateFileStatus != napi_ok) - { - napi_throw_error(env, nullptr, "Failed to define dehydrateFile function"); + napi_throw_error(env, nullptr, "Failed to define properties"); return nullptr; } return exports; } + NAPI_MODULE(NODE_GYP_MODULE_NAME, init) \ No newline at end of file diff --git a/native-src/placeholders_interface/Planceholders.cpp b/native-src/placeholders_interface/Planceholders.cpp index e12946e4..9148b297 100644 --- a/native-src/placeholders_interface/Planceholders.cpp +++ b/native-src/placeholders_interface/Planceholders.cpp @@ -62,76 +62,33 @@ void Placeholders::MaintainIdentity(std::wstring &fullPath, PCWSTR itemIdentity, } } -/** - * @brief Mark a file or directory as synchronized - * @param filePath path to the file or directory - * @param isDirectory true if the path is a directory, false if it is a file - * @return void - */ -void Placeholders::UpdateSyncStatus(const std::wstring &filePath, - bool inputSyncState, - bool isDirectory /* = false */) +void Placeholders::UpdateSyncStatus(const std::wstring &path, bool isDirectory) { - wprintf(L"[UpdateSyncStatus] Path: %ls\n", filePath.c_str()); - DWORD flags = FILE_FLAG_OPEN_REPARSE_POINT; if (isDirectory) flags |= FILE_FLAG_BACKUP_SEMANTICS; - HANDLE h = CreateFileW(filePath.c_str(), - FILE_WRITE_ATTRIBUTES, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - nullptr, - OPEN_EXISTING, - flags, - nullptr); - - if (h == INVALID_HANDLE_VALUE) - { - wprintf(L"[UpdateSyncStatus] CreateFileW falló: %lu\n", GetLastError()); - CloseHandle(h); - return; - } - - CF_IN_SYNC_STATE sync = inputSyncState ? CF_IN_SYNC_STATE_IN_SYNC - : CF_IN_SYNC_STATE_NOT_IN_SYNC; - - HRESULT hr = CfSetInSyncState(h, sync, CF_SET_IN_SYNC_FLAG_NONE, nullptr); - - if (FAILED(hr)) - { - switch (HRESULT_CODE(hr)) - { - case ERROR_RETRY: - Sleep(50); - hr = CfSetInSyncState(h, sync, CF_SET_IN_SYNC_FLAG_NONE, nullptr); - wprintf(L"[UpdateSyncStatus] Retry CfSetInSyncState\n"); - break; - - case ERROR_CLOUD_FILE_PROVIDER_NOT_RUNNING: // 0x1A94 - SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, filePath.c_str(), nullptr); - wprintf(L"[UpdateSyncStatus] Retry CfSetInSyncState\n"); - break; - - case ERROR_CLOUD_FILE_NOT_IN_SYNC: - convert_to_placeholder(filePath, L"temp_identity"); - hr = CfSetInSyncState(h, sync, CF_SET_IN_SYNC_FLAG_NONE, nullptr); - wprintf(L"[UpdateSyncStatus] Retry CfSetInSyncState\n"); - break; + winrt::file_handle fileHandle{CreateFileW( + path.c_str(), + FILE_WRITE_ATTRIBUTES, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + nullptr, + OPEN_EXISTING, + flags, + nullptr)}; - default: - wprintf(L"[UpdateSyncStatus] CfSetInSyncState 0x%08X\n", hr); - break; - } - } - else + if (!fileHandle) { - wprintf(L"[UpdateSyncStatus] Estado actualizado\n"); + throw std::runtime_error("Failed to open item: " + std::to_string(GetLastError())); } - CloseHandle(h); + winrt::check_hresult(CfSetInSyncState( + fileHandle.get(), + CF_IN_SYNC_STATE_IN_SYNC, + CF_SET_IN_SYNC_FLAG_NONE, + nullptr)); - SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, filePath.c_str(), nullptr); + SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, path.c_str(), nullptr); } void Placeholders::UpdateFileIdentity(const std::wstring &filePath, const std::wstring &fileIdentity, bool isDirectory) @@ -248,25 +205,3 @@ FileState Placeholders::GetPlaceholderInfo(const std::wstring &directoryPath) return fileState; } - -void Placeholders::ForceShellRefresh(const std::wstring &path) -{ - SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_PATH, path.c_str(), nullptr); - SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, path.c_str(), nullptr); -} - -HRESULT Placeholders::UpdatePinState(const std::wstring &path, const PinState state) -{ - - const auto cfState = pinStateToCfPinState(state); - HRESULT result = CfSetPinState(handleForPath(path).get(), cfState, CF_SET_PIN_FLAG_NONE, nullptr); - - // ForceShellRefresh(path); - - if (result != S_OK) - { - Logger::getInstance().log("[UpdatePinState] Error updating pin state.", LogLevel::WARN); - } - - return result; -} diff --git a/native-src/sync_root_interface/callbacks/FetchData/FetchData.cpp b/native-src/sync_root_interface/callbacks/FetchData/FetchData.cpp index 34291fe9..3366060f 100644 --- a/native-src/sync_root_interface/callbacks/FetchData/FetchData.cpp +++ b/native-src/sync_root_interface/callbacks/FetchData/FetchData.cpp @@ -15,7 +15,6 @@ #include #include #include -#include #include #include @@ -213,7 +212,8 @@ static napi_value response_callback_fn_fetch_data(napi_env env, napi_callback_in ); ::Sleep(CHUNKDELAYMS); - Placeholders::UpdatePinState(ctxPtr->fullClientPath.c_str(), PinState::AlwaysLocal); + + CfSetPinState(handleForPath(ctxPtr->fullClientPath.c_str()).get(), CF_PIN_STATE_PINNED, CF_SET_PIN_FLAG_NONE, nullptr); } { diff --git a/native-src/virtual_drive/create_file_placeholder.cpp b/native-src/virtual_drive/create_file_placeholder.cpp index ffa8642e..f2e913c2 100644 --- a/native-src/virtual_drive/create_file_placeholder.cpp +++ b/native-src/virtual_drive/create_file_placeholder.cpp @@ -2,7 +2,6 @@ #include #include "Placeholders.h" #include "convert_to_placeholder.h" -#include "Utilities.h" #include "napi_extract_args.h" napi_value create_file_placeholder_impl(napi_env env, napi_callback_info info) @@ -36,7 +35,6 @@ napi_value create_file_placeholder_impl(napi_env env, napi_callback_info info) cloudEntry.FsMetadata.BasicInfo.ChangeTime = lastWriteTime; winrt::check_hresult(CfCreatePlaceholders(parentPath.c_str(), &cloudEntry, 1, CF_CREATE_FLAG_NONE, NULL)); - // Placeholders::UpdatePinState(path, PinState::OnlineOnly); 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 5580f204..f4842627 100644 --- a/native-src/virtual_drive/create_folder_placeholder.cpp +++ b/native-src/virtual_drive/create_folder_placeholder.cpp @@ -2,7 +2,6 @@ #include #include "Placeholders.h" #include "convert_to_placeholder.h" -#include "Utilities.h" #include "napi_extract_args.h" napi_value create_folder_placeholder_impl(napi_env env, napi_callback_info info) @@ -34,8 +33,7 @@ napi_value create_folder_placeholder_impl(napi_env env, napi_callback_info info) cloudEntry.FsMetadata.BasicInfo.LastAccessTime = lastAccessTime; winrt::check_hresult(CfCreatePlaceholders(parentPath.c_str(), &cloudEntry, 1, CF_CREATE_FLAG_NONE, NULL)); - // Placeholders::UpdatePinState(path, PinState::OnlineOnly); - // UpdateSyncStatus(path, true, true); + Placeholders::UpdateSyncStatus(path, true); return nullptr; } diff --git a/native-src/virtual_drive/update_sync_status/update_sync_status_wrapper.cpp b/native-src/virtual_drive/update_sync_status/update_sync_status_wrapper.cpp index b3735ae4..93bc35e6 100644 --- a/native-src/virtual_drive/update_sync_status/update_sync_status_wrapper.cpp +++ b/native-src/virtual_drive/update_sync_status/update_sync_status_wrapper.cpp @@ -1,21 +1,12 @@ #include #include "Placeholders.h" +#include "napi_extract_args.h" -napi_value update_sync_status_wrapper(napi_env env, napi_callback_info info) { - size_t argc = 3; - napi_value argv[3]; - napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); +napi_value update_sync_status_wrapper(napi_env env, napi_callback_info info) +{ + auto [path, isDirectory] = napi_extract_args(env, info); - size_t pathLength; - napi_get_value_string_utf16(env, argv[0], nullptr, 0, &pathLength); - std::unique_ptr widePath(new wchar_t[pathLength + 1]); - napi_get_value_string_utf16(env, argv[0], reinterpret_cast(widePath.get()), pathLength + 1, nullptr); - - bool inputSyncState, isDirectory; - napi_get_value_bool(env, argv[1], &inputSyncState); - napi_get_value_bool(env, argv[2], &isDirectory); - - Placeholders::UpdateSyncStatus(widePath.get(), inputSyncState, isDirectory); + Placeholders::UpdateSyncStatus(path, isDirectory); return nullptr; }