Skip to content

Commit f6880a0

Browse files
Commit
1 parent 9558773 commit f6880a0

4 files changed

Lines changed: 37 additions & 85 deletions

File tree

dist/addon.node

-2.5 KB
Binary file not shown.

include/sync_root_interface/TransferContext.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ struct TransferContext
1717
LARGE_INTEGER requiredLength;
1818
LARGE_INTEGER requiredOffset;
1919
CF_CALLBACK_INFO callbackInfo;
20-
std::wstring fullClientPath;
20+
std::wstring path;
2121

2222
size_t lastReadOffset = 0;
2323
size_t lastSize = 0;
Lines changed: 28 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,50 @@
11
#include "stdafx.h"
22
#include <Callbacks.h>
3-
#include <Logger.h>
43
#include <cfapi.h>
54
#include <condition_variable>
65
#include <iostream>
76
#include <mutex>
87
#include <filesystem>
8+
#include <TransferContext.h>
99

1010
napi_threadsafe_function g_cancel_fetch_data_threadsafe_callback = nullptr;
1111

12-
struct CallbackContext {
13-
std::mutex mtx;
14-
std::condition_variable cv;
15-
bool ready = false;
16-
};
17-
18-
struct CancelFetchDataArgs {
19-
std::wstring fileIdentityArg;
20-
CallbackContext* context;
21-
22-
CancelFetchDataArgs(const std::wstring& fileId, CallbackContext* ctx)
23-
: fileIdentityArg(fileId), context(ctx) {}
24-
};
25-
2612
void notify_cancel_fetch_data_call(napi_env env, napi_value js_callback, void *context, void *data)
2713
{
28-
CancelFetchDataArgs *args = static_cast<CancelFetchDataArgs *>(data);
29-
std::u16string u16_fileIdentity(args->fileIdentityArg.begin(), args->fileIdentityArg.end());
14+
std::wstring *path = static_cast<std::wstring *>(data);
3015

31-
napi_value js_string;
32-
napi_create_string_utf16(env, u16_fileIdentity.c_str(), u16_fileIdentity.size(), &js_string);
16+
napi_value js_path;
17+
napi_create_string_utf16(env, (char16_t *)path->c_str(), path->length(), &js_path);
3318

34-
napi_value args_to_js_callback_cancel_fetch[1] = {js_string};
19+
napi_value args_to_js_callback[1] = {js_path};
3520

3621
napi_value undefined;
3722
napi_get_undefined(env, &undefined);
38-
napi_value result;
23+
napi_call_function(env, undefined, js_callback, 1, args_to_js_callback, nullptr);
3924

40-
Logger::getInstance().log("Executed to call JS function in cancelFetchCallback.", LogLevel::ERROR);
41-
napi_status status = napi_call_function(env, undefined, js_callback, 1, args_to_js_callback_cancel_fetch, &result);
42-
if (status != napi_ok)
43-
{
44-
fprintf(stderr, "Failed to call JS function.\n");
45-
Logger::getInstance().log("Failed to call JS function in cancelFetchCallback.", LogLevel::ERROR);
46-
}
25+
delete path;
26+
}
27+
28+
void CALLBACK cancel_fetch_data_callback_wrapper(_In_ CONST CF_CALLBACK_INFO *callbackInfo, _In_ CONST CF_CALLBACK_PARAMETERS *callbackParameters)
29+
{
30+
wprintf(L"ConnectionKey: %lld, TransferKey: %lld\n", callbackInfo->ConnectionKey, callbackInfo->TransferKey.QuadPart);
31+
32+
auto ctx = GetTransferContext(callbackInfo->TransferKey);
33+
34+
if (!ctx)
35+
return;
36+
37+
std::wstring *path = new std::wstring(ctx->path);
38+
wprintf(L"Cancel fetch data path: %s\n", path->c_str());
4739

4840
{
49-
std::lock_guard<std::mutex> lock(args->context->mtx);
50-
args->context->ready = true;
41+
std::lock_guard<std::mutex> lock(ctx->mtx);
42+
ctx->ready = true;
5143
}
5244

53-
args->context->cv.notify_one();
54-
delete args;
45+
ctx->cv.notify_one();
46+
47+
napi_call_threadsafe_function(g_cancel_fetch_data_threadsafe_callback, path, napi_tsfn_blocking);
5548
}
5649

5750
void register_threadsafe_cancel_fetch_data_callback(const std::string &resource_name, napi_env env, InputSyncCallbacks input)
@@ -61,11 +54,11 @@ void register_threadsafe_cancel_fetch_data_callback(const std::string &resource_
6154
napi_value resource_name_value;
6255
napi_create_string_utf16(env, converted_resource_name.c_str(), NAPI_AUTO_LENGTH, &resource_name_value);
6356

64-
napi_threadsafe_function tsfn_cancel_fetch_data;
6557
napi_value cancel_fetch_data_value;
6658
napi_get_reference_value(env, input.cancel_fetch_data_callback_ref, &cancel_fetch_data_value);
6759

68-
napi_status status = napi_create_threadsafe_function(
60+
napi_threadsafe_function tsfn_cancel_fetch_data;
61+
napi_create_threadsafe_function(
6962
env,
7063
cancel_fetch_data_value,
7164
NULL,
@@ -78,46 +71,5 @@ void register_threadsafe_cancel_fetch_data_callback(const std::string &resource_
7871
notify_cancel_fetch_data_call,
7972
&tsfn_cancel_fetch_data);
8073

81-
if (status != napi_ok)
82-
{
83-
napi_throw_error(env, nullptr, "Failed to create cancel fetch data threadsafe function");
84-
return;
85-
}
86-
8774
g_cancel_fetch_data_threadsafe_callback = tsfn_cancel_fetch_data;
88-
}
89-
90-
void CALLBACK cancel_fetch_data_callback_wrapper(
91-
_In_ CONST CF_CALLBACK_INFO *callbackInfo,
92-
_In_ CONST CF_CALLBACK_PARAMETERS *callbackParameters)
93-
{
94-
printf("cancel_fetch_data_callback_wrapper called\n");
95-
96-
LPCVOID fileIdentity = callbackInfo->FileIdentity;
97-
DWORD fileIdentityLength = callbackInfo->FileIdentityLength;
98-
99-
const wchar_t *wchar_ptr = static_cast<const wchar_t *>(fileIdentity);
100-
std::wstring fileIdentityStr(wchar_ptr, fileIdentityLength / sizeof(wchar_t));
101-
102-
if (g_cancel_fetch_data_threadsafe_callback == nullptr)
103-
{
104-
wprintf(L"Callback fetch_data_callback_wrapper called but g_fetch_data_threadsafe_callback is null\n");
105-
return;
106-
}
107-
108-
CallbackContext context;
109-
CancelFetchDataArgs *args = new CancelFetchDataArgs(fileIdentityStr, &context);
110-
111-
napi_call_threadsafe_function(g_cancel_fetch_data_threadsafe_callback, args, napi_tsfn_blocking);
112-
113-
{
114-
std::unique_lock<std::mutex> lock(context.mtx);
115-
auto timeout = std::chrono::seconds(30);
116-
117-
if (context.cv.wait_for(lock, timeout, [&context] { return context.ready; })) {
118-
wprintf(L"Cancel fetch completed\n");
119-
} else {
120-
wprintf(L"Cancel fetch timed out\n");
121-
}
122-
}
123-
}
75+
}

native-src/sync_root_interface/callbacks/FetchData/FetchData.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ static size_t file_incremental_reading(napi_env env,
107107
} else {
108108
UINT64 totalSize = static_cast<UINT64>(ctx.fileSize.QuadPart);
109109
progress = static_cast<float>(ctx.lastReadOffset) / static_cast<float>(totalSize);
110-
Utilities::ApplyTransferStateToFile(ctx.fullClientPath.c_str(),
110+
Utilities::ApplyTransferStateToFile(ctx.path.c_str(),
111111
ctx.callbackInfo,
112112
totalSize,
113113
ctx.lastReadOffset);
@@ -206,15 +206,15 @@ static napi_value response_callback_fn_fetch_data(napi_env env, napi_callback_in
206206
ctxPtr->loadFinished = true;
207207

208208
Utilities::ApplyTransferStateToFile(
209-
ctxPtr->fullClientPath.c_str(),
209+
ctxPtr->path.c_str(),
210210
ctxPtr->callbackInfo,
211211
ctxPtr->fileSize.QuadPart,
212212
ctxPtr->fileSize.QuadPart
213213
);
214214

215215
::Sleep(CHUNKDELAYMS);
216216

217-
auto fileHandle = Placeholders::OpenFileHandle(ctxPtr->fullClientPath.c_str(), FILE_WRITE_ATTRIBUTES, true);
217+
auto fileHandle = Placeholders::OpenFileHandle(ctxPtr->path.c_str(), FILE_WRITE_ATTRIBUTES, true);
218218
CfSetPinState(fileHandle.get(), CF_PIN_STATE_PINNED, CF_SET_PIN_FLAG_NONE, nullptr);
219219
}
220220

@@ -240,7 +240,7 @@ static void notify_fetch_data_call(napi_env env, napi_value js_callback, void *c
240240
Logger::getInstance().log("notify_fetch_data_call called context isolated", LogLevel::DEBUG);
241241
napi_status status;
242242
TransferContext *ctx = static_cast<TransferContext *>(data);
243-
Logger::getInstance().log("notify_fetch_data_call: ctx->fullClientPath = " + Logger::fromWStringToString(ctx->fullClientPath), LogLevel::DEBUG);
243+
Logger::getInstance().log("notify_fetch_data_call: ctx->path = " + Logger::fromWStringToString(ctx->path), LogLevel::DEBUG);
244244

245245
std::wstring fileIdentityWstr;
246246
{
@@ -353,12 +353,12 @@ void CALLBACK fetch_data_callback_wrapper(
353353
ctx->requiredOffset = callbackParameters->FetchData.RequiredFileOffset;
354354
ctx->callbackInfo = *callbackInfo;
355355

356-
std::wstring fullClientPath(callbackInfo->VolumeDosName); // e.g., "C:"
357-
fullClientPath.append(callbackInfo->NormalizedPath); // e.g., "\Users\file.txt"
358-
ctx->fullClientPath = fullClientPath; // Result: "C:\Users\file.txt"
356+
std::wstring path(callbackInfo->VolumeDosName); // e.g., "C:"
357+
path.append(callbackInfo->NormalizedPath); // e.g., "\Users\file.txt"
358+
ctx->path = path; // Result: "C:\Users\file.txt"
359359

360360
Logger::getInstance().log("Full download path: "
361-
+ Logger::fromWStringToString(fullClientPath),
361+
+ Logger::fromWStringToString(path),
362362
LogLevel::INFO);
363363

364364
if (g_fetch_data_threadsafe_callback == nullptr) {

0 commit comments

Comments
 (0)