Skip to content

Commit 2de9c92

Browse files
Simplify main (#202)
1 parent b81af70 commit 2de9c92

8 files changed

Lines changed: 44 additions & 339 deletions

File tree

dist/addon.node

-2 KB
Binary file not shown.

include/placeholders_interface/Placeholders.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ class Placeholders
77
{
88
public:
99
static void MaintainIdentity(std::wstring &fullPath, PCWSTR fileIdentity, bool isDirectory);
10-
static void ForceShellRefresh(const std::wstring &path);
11-
static void UpdateSyncStatus(const std::wstring &filePath, bool syncState, bool isDirectory);
12-
static HRESULT UpdatePinState(const std::wstring &path, const PinState state);
10+
static void UpdateSyncStatus(const std::wstring &filePath, bool isDirectory);
1311
static std::string GetFileIdentity(const std::wstring &filePath);
1412
static void UpdateFileIdentity(const std::wstring &filePath, const std::wstring &fileIdentity, bool isDirectory);
1513
static FileState GetPlaceholderInfo(const std::wstring &directoryPath);

native-src/main.cpp

Lines changed: 18 additions & 233 deletions
Original file line numberDiff line numberDiff line change
@@ -3,244 +3,29 @@
33

44
napi_value init(napi_env env, napi_value exports)
55
{
6-
napi_property_descriptor desc = {
7-
"createFilePlaceholder",
8-
nullptr,
9-
CreateFilePlaceholderWrapper,
10-
nullptr,
11-
nullptr,
12-
nullptr,
13-
napi_default,
14-
nullptr};
6+
napi_property_descriptor properties[] = {
7+
{"createFilePlaceholder", nullptr, CreateFilePlaceholderWrapper, nullptr, nullptr, nullptr, napi_default, nullptr},
8+
{"unregisterSyncRoot", nullptr, UnregisterSyncRootWrapper, nullptr, nullptr, nullptr, napi_default, nullptr},
9+
{"registerSyncRoot", nullptr, RegisterSyncRootWrapper, nullptr, nullptr, nullptr, napi_default, nullptr},
10+
{"getRegisteredSyncRoots", nullptr, GetRegisteredSyncRootsWrapper, nullptr, nullptr, nullptr, napi_default, nullptr},
11+
{"connectSyncRoot", nullptr, ConnectSyncRootWrapper, nullptr, nullptr, nullptr, napi_default, nullptr},
12+
{"createFolderPlaceholder", nullptr, CreateFolderPlaceholderWrapper, nullptr, nullptr, nullptr, napi_default, nullptr},
13+
{"disconnectSyncRoot", nullptr, DisconnectSyncRootWrapper, nullptr, nullptr, nullptr, napi_default, nullptr},
14+
{"getFileIdentity", nullptr, GetFileIdentityWrapper, nullptr, nullptr, nullptr, napi_default, nullptr},
15+
{"addLoggerPath", nullptr, addLoggerPathWrapper, nullptr, nullptr, nullptr, napi_default, nullptr},
16+
{"updateSyncStatus", nullptr, UpdateSyncStatusWrapper, nullptr, nullptr, nullptr, napi_default, nullptr},
17+
{"getPlaceholderState", nullptr, GetPlaceholderStateWrapper, nullptr, nullptr, nullptr, napi_default, nullptr},
18+
{"convertToPlaceholder", nullptr, ConvertToPlaceholderWrapper, nullptr, nullptr, nullptr, napi_default, nullptr},
19+
{"hydrateFile", nullptr, HydrateFileWrapper, nullptr, nullptr, nullptr, napi_default, nullptr},
20+
{"dehydrateFile", nullptr, DehydrateFileWrapper, nullptr, nullptr, nullptr, napi_default, nullptr}};
1521

16-
napi_status defineStatus = napi_define_properties(env, exports, 1, &desc);
17-
if (defineStatus != napi_ok)
22+
if (napi_define_properties(env, exports, 14, properties) != napi_ok)
1823
{
19-
napi_throw_error(env, nullptr, "Failed to define function");
20-
return nullptr;
21-
}
22-
23-
napi_property_descriptor unregisterDesc = {
24-
"unregisterSyncRoot",
25-
nullptr,
26-
UnregisterSyncRootWrapper,
27-
nullptr,
28-
nullptr,
29-
nullptr,
30-
napi_default,
31-
nullptr};
32-
33-
napi_status defineUnregisterStatus = napi_define_properties(env, exports, 1, &unregisterDesc);
34-
if (defineUnregisterStatus != napi_ok)
35-
{
36-
napi_throw_error(env, nullptr, "Failed to define UnregisterSyncRoot function");
37-
return nullptr;
38-
}
39-
40-
napi_property_descriptor registerSyncRootDesc = {
41-
"registerSyncRoot",
42-
nullptr,
43-
RegisterSyncRootWrapper,
44-
nullptr,
45-
nullptr,
46-
nullptr,
47-
napi_default,
48-
nullptr};
49-
50-
napi_status defineRegisterSyncRootStatus = napi_define_properties(env, exports, 1, &registerSyncRootDesc);
51-
if (defineRegisterSyncRootStatus != napi_ok)
52-
{
53-
napi_throw_error(env, nullptr, "Failed to define RegisterSyncRoot function");
54-
return nullptr;
55-
}
56-
57-
napi_property_descriptor getRegisteredSyncRootsRootDesc = {
58-
"getRegisteredSyncRoots",
59-
nullptr,
60-
GetRegisteredSyncRootsWrapper,
61-
nullptr,
62-
nullptr,
63-
nullptr,
64-
napi_default,
65-
nullptr};
66-
67-
napi_status defineGetRegisteredSyncRootsRootDescStatus = napi_define_properties(env, exports, 1, &getRegisteredSyncRootsRootDesc);
68-
if (defineGetRegisteredSyncRootsRootDescStatus != napi_ok)
69-
{
70-
napi_throw_error(env, nullptr, "Failed to define getRegisteredSyncRoots function");
71-
return nullptr;
72-
}
73-
74-
napi_property_descriptor connectSyncRootDesc = {
75-
"connectSyncRoot",
76-
nullptr,
77-
ConnectSyncRootWrapper,
78-
nullptr,
79-
nullptr,
80-
nullptr,
81-
napi_default,
82-
nullptr};
83-
84-
napi_status defineConnectSyncRootStatus = napi_define_properties(env, exports, 1, &connectSyncRootDesc);
85-
if (defineConnectSyncRootStatus != napi_ok)
86-
{
87-
napi_throw_error(env, nullptr, "Failed to define ConnectSyncRoot function");
88-
return nullptr;
89-
}
90-
91-
napi_property_descriptor createFolderPlaceholderDesc = {
92-
"createFolderPlaceholder",
93-
nullptr,
94-
CreateFolderPlaceholderWrapper,
95-
nullptr,
96-
nullptr,
97-
nullptr,
98-
napi_default,
99-
nullptr};
100-
101-
napi_status defineCreateFolderPlaceholderStatus = napi_define_properties(env, exports, 1, &createFolderPlaceholderDesc);
102-
if (defineCreateFolderPlaceholderStatus != napi_ok)
103-
{
104-
napi_throw_error(env, nullptr, "Failed to define createFolderPlaceholder function");
105-
return nullptr;
106-
}
107-
108-
napi_property_descriptor disconnectDesc = {
109-
"disconnectSyncRoot",
110-
nullptr,
111-
DisconnectSyncRootWrapper,
112-
nullptr,
113-
nullptr,
114-
nullptr,
115-
napi_default,
116-
nullptr};
117-
118-
napi_status defineDisconnectStatus = napi_define_properties(env, exports, 1, &disconnectDesc);
119-
if (defineDisconnectStatus != napi_ok)
120-
{
121-
napi_throw_error(env, nullptr, "Failed to define DisconnectSyncRoot function");
122-
return nullptr;
123-
}
124-
125-
napi_property_descriptor getFileIdentityDesc = {
126-
"getFileIdentity",
127-
nullptr,
128-
GetFileIdentityWrapper,
129-
nullptr,
130-
nullptr,
131-
nullptr,
132-
napi_default,
133-
nullptr};
134-
135-
napi_status defineGetFileIdentityStatus = napi_define_properties(env, exports, 1, &getFileIdentityDesc);
136-
if (defineGetFileIdentityStatus != napi_ok)
137-
{
138-
napi_throw_error(env, nullptr, "Failed to define getFileIdentity function");
139-
return nullptr;
140-
}
141-
142-
napi_property_descriptor addLoggerPathDesc = {
143-
"addLoggerPath",
144-
nullptr,
145-
addLoggerPathWrapper,
146-
nullptr,
147-
nullptr,
148-
nullptr,
149-
napi_default,
150-
nullptr};
151-
152-
napi_status defineAddLoggerPathStatus = napi_define_properties(env, exports, 1, &addLoggerPathDesc);
153-
if (defineAddLoggerPathStatus != napi_ok)
154-
{
155-
napi_throw_error(env, nullptr, "Failed to define addLoggerPath function");
156-
return nullptr;
157-
}
158-
159-
napi_property_descriptor updateSyncStatusDesc = {
160-
"updateSyncStatus",
161-
nullptr,
162-
UpdateSyncStatusWrapper,
163-
nullptr,
164-
nullptr,
165-
nullptr,
166-
napi_default,
167-
nullptr};
168-
169-
napi_status updateSyncStatusStatus = napi_define_properties(env, exports, 1, &updateSyncStatusDesc);
170-
if (updateSyncStatusStatus != napi_ok)
171-
{
172-
napi_throw_error(env, nullptr, "Failed to define updateSyncStatus function");
173-
return nullptr;
174-
}
175-
176-
napi_property_descriptor getPlaceholderStateDesc = {
177-
"getPlaceholderState",
178-
nullptr,
179-
GetPlaceholderStateWrapper,
180-
nullptr,
181-
nullptr,
182-
nullptr,
183-
napi_default,
184-
nullptr};
185-
186-
napi_status defineGetPlaceholderStateStatus = napi_define_properties(env, exports, 1, &getPlaceholderStateDesc);
187-
if (defineGetPlaceholderStateStatus != napi_ok)
188-
{
189-
napi_throw_error(env, nullptr, "Failed to define getPlaceholderState function");
190-
return nullptr;
191-
}
192-
193-
napi_property_descriptor convertToPlaceholderDesc = {
194-
"convertToPlaceholder",
195-
nullptr,
196-
ConvertToPlaceholderWrapper,
197-
nullptr,
198-
nullptr,
199-
nullptr,
200-
napi_default,
201-
nullptr};
202-
203-
napi_status convertToPlaceholderStatus = napi_define_properties(env, exports, 1, &convertToPlaceholderDesc);
204-
if (convertToPlaceholderStatus != napi_ok)
205-
{
206-
napi_throw_error(env, nullptr, "Failed to define convertToPlaceholder function");
207-
return nullptr;
208-
}
209-
210-
napi_property_descriptor hydrateFileDesc = {
211-
"hydrateFile",
212-
nullptr,
213-
HydrateFileWrapper,
214-
nullptr,
215-
nullptr,
216-
nullptr,
217-
napi_default,
218-
nullptr};
219-
220-
napi_status defineHydrateFileStatus = napi_define_properties(env, exports, 1, &hydrateFileDesc);
221-
if (defineHydrateFileStatus != napi_ok)
222-
{
223-
napi_throw_error(env, nullptr, "Failed to define hydrateFile function");
224-
return nullptr;
225-
}
226-
227-
napi_property_descriptor dehydrateFileDesc = {
228-
"dehydrateFile",
229-
nullptr,
230-
DehydrateFileWrapper,
231-
nullptr,
232-
nullptr,
233-
nullptr,
234-
napi_default,
235-
nullptr};
236-
237-
napi_status defineDehydrateFileStatus = napi_define_properties(env, exports, 1, &dehydrateFileDesc);
238-
if (defineDehydrateFileStatus != napi_ok)
239-
{
240-
napi_throw_error(env, nullptr, "Failed to define dehydrateFile function");
24+
napi_throw_error(env, nullptr, "Failed to define properties");
24125
return nullptr;
24226
}
24327

24428
return exports;
24529
}
30+
24631
NAPI_MODULE(NODE_GYP_MODULE_NAME, init)

native-src/placeholders_interface/Planceholders.cpp

Lines changed: 17 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -62,76 +62,33 @@ void Placeholders::MaintainIdentity(std::wstring &fullPath, PCWSTR itemIdentity,
6262
}
6363
}
6464

65-
/**
66-
* @brief Mark a file or directory as synchronized
67-
* @param filePath path to the file or directory
68-
* @param isDirectory true if the path is a directory, false if it is a file
69-
* @return void
70-
*/
71-
void Placeholders::UpdateSyncStatus(const std::wstring &filePath,
72-
bool inputSyncState,
73-
bool isDirectory /* = false */)
65+
void Placeholders::UpdateSyncStatus(const std::wstring &path, bool isDirectory)
7466
{
75-
wprintf(L"[UpdateSyncStatus] Path: %ls\n", filePath.c_str());
76-
7767
DWORD flags = FILE_FLAG_OPEN_REPARSE_POINT;
7868
if (isDirectory)
7969
flags |= FILE_FLAG_BACKUP_SEMANTICS;
8070

81-
HANDLE h = CreateFileW(filePath.c_str(),
82-
FILE_WRITE_ATTRIBUTES,
83-
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
84-
nullptr,
85-
OPEN_EXISTING,
86-
flags,
87-
nullptr);
88-
89-
if (h == INVALID_HANDLE_VALUE)
90-
{
91-
wprintf(L"[UpdateSyncStatus] CreateFileW falló: %lu\n", GetLastError());
92-
CloseHandle(h);
93-
return;
94-
}
95-
96-
CF_IN_SYNC_STATE sync = inputSyncState ? CF_IN_SYNC_STATE_IN_SYNC
97-
: CF_IN_SYNC_STATE_NOT_IN_SYNC;
98-
99-
HRESULT hr = CfSetInSyncState(h, sync, CF_SET_IN_SYNC_FLAG_NONE, nullptr);
100-
101-
if (FAILED(hr))
102-
{
103-
switch (HRESULT_CODE(hr))
104-
{
105-
case ERROR_RETRY:
106-
Sleep(50);
107-
hr = CfSetInSyncState(h, sync, CF_SET_IN_SYNC_FLAG_NONE, nullptr);
108-
wprintf(L"[UpdateSyncStatus] Retry CfSetInSyncState\n");
109-
break;
110-
111-
case ERROR_CLOUD_FILE_PROVIDER_NOT_RUNNING: // 0x1A94
112-
SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, filePath.c_str(), nullptr);
113-
wprintf(L"[UpdateSyncStatus] Retry CfSetInSyncState\n");
114-
break;
115-
116-
case ERROR_CLOUD_FILE_NOT_IN_SYNC:
117-
convert_to_placeholder(filePath, L"temp_identity");
118-
hr = CfSetInSyncState(h, sync, CF_SET_IN_SYNC_FLAG_NONE, nullptr);
119-
wprintf(L"[UpdateSyncStatus] Retry CfSetInSyncState\n");
120-
break;
71+
winrt::file_handle fileHandle{CreateFileW(
72+
path.c_str(),
73+
FILE_WRITE_ATTRIBUTES,
74+
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
75+
nullptr,
76+
OPEN_EXISTING,
77+
flags,
78+
nullptr)};
12179

122-
default:
123-
wprintf(L"[UpdateSyncStatus] CfSetInSyncState 0x%08X\n", hr);
124-
break;
125-
}
126-
}
127-
else
80+
if (!fileHandle)
12881
{
129-
wprintf(L"[UpdateSyncStatus] Estado actualizado\n");
82+
throw std::runtime_error("Failed to open item: " + std::to_string(GetLastError()));
13083
}
13184

132-
CloseHandle(h);
85+
winrt::check_hresult(CfSetInSyncState(
86+
fileHandle.get(),
87+
CF_IN_SYNC_STATE_IN_SYNC,
88+
CF_SET_IN_SYNC_FLAG_NONE,
89+
nullptr));
13390

134-
SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, filePath.c_str(), nullptr);
91+
SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, path.c_str(), nullptr);
13592
}
13693

13794
void Placeholders::UpdateFileIdentity(const std::wstring &filePath, const std::wstring &fileIdentity, bool isDirectory)
@@ -248,25 +205,3 @@ FileState Placeholders::GetPlaceholderInfo(const std::wstring &directoryPath)
248205

249206
return fileState;
250207
}
251-
252-
void Placeholders::ForceShellRefresh(const std::wstring &path)
253-
{
254-
SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_PATH, path.c_str(), nullptr);
255-
SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH, path.c_str(), nullptr);
256-
}
257-
258-
HRESULT Placeholders::UpdatePinState(const std::wstring &path, const PinState state)
259-
{
260-
261-
const auto cfState = pinStateToCfPinState(state);
262-
HRESULT result = CfSetPinState(handleForPath(path).get(), cfState, CF_SET_PIN_FLAG_NONE, nullptr);
263-
264-
// ForceShellRefresh(path);
265-
266-
if (result != S_OK)
267-
{
268-
Logger::getInstance().log("[UpdatePinState] Error updating pin state.", LogLevel::WARN);
269-
}
270-
271-
return result;
272-
}

0 commit comments

Comments
 (0)