@jamiephan/casclib 0.0.0-dev.0 → 0.0.0-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +585 -37
- package/build/Release/casclib.node +0 -0
- package/dist/bindings.d.ts +128 -40
- package/dist/bindings.d.ts.map +1 -1
- package/dist/bindings.js +86 -23
- package/dist/bindings.js.map +1 -1
- package/dist/index.d.ts +12 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +38 -37
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/@jamiephan+casclib.node +0 -0
- package/prebuilds/linux-x64/@jamiephan+casclib.node +0 -0
- package/prebuilds/win32-x64/@jamiephan+casclib.node +0 -0
- package/src/addon.cpp +126 -3
- package/src/file.cpp +11 -11
- package/src/storage.cpp +116 -15
- package/src/storage.h +1 -0
package/dist/index.js
CHANGED
|
@@ -14,107 +14,108 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.File = exports.Storage =
|
|
17
|
+
exports.File = exports.Storage = void 0;
|
|
18
18
|
const bindings_1 = require("./bindings");
|
|
19
|
-
|
|
20
|
-
Object.defineProperty(exports, "File", { enumerable: true, get: function () { return bindings_1.File; } });
|
|
21
|
-
class CascStorage {
|
|
19
|
+
class Storage {
|
|
22
20
|
constructor() {
|
|
23
|
-
this.storage = new bindings_1.
|
|
21
|
+
this.storage = new bindings_1.CascStorageBinding();
|
|
24
22
|
}
|
|
25
23
|
open(path, options) {
|
|
26
|
-
this.storage.
|
|
24
|
+
this.storage.CascOpenStorage(path, options?.flags || 0);
|
|
27
25
|
}
|
|
28
26
|
openOnline(path, options) {
|
|
29
|
-
this.storage.
|
|
27
|
+
this.storage.CascOpenOnlineStorage(path, options?.flags || 0);
|
|
28
|
+
}
|
|
29
|
+
openEx(params, options) {
|
|
30
|
+
this.storage.CascOpenStorageEx(params, options);
|
|
30
31
|
}
|
|
31
32
|
close() {
|
|
32
|
-
return this.storage.
|
|
33
|
+
return this.storage.CascCloseStorage();
|
|
33
34
|
}
|
|
34
35
|
openFile(filename, options) {
|
|
35
|
-
const file = this.storage.
|
|
36
|
-
return new
|
|
36
|
+
const file = this.storage.CascOpenFile(filename, options?.flags || 0);
|
|
37
|
+
return new File(file);
|
|
37
38
|
}
|
|
38
39
|
getFileInfo(filename) {
|
|
39
|
-
return this.storage.
|
|
40
|
+
return this.storage.CascGetFileInfo(filename);
|
|
40
41
|
}
|
|
41
42
|
fileExists(filename) {
|
|
42
43
|
return this.storage.fileExists(filename);
|
|
43
44
|
}
|
|
44
45
|
getStorageInfo(infoClass) {
|
|
45
|
-
return this.storage.
|
|
46
|
+
return this.storage.CascGetStorageInfo(infoClass);
|
|
46
47
|
}
|
|
47
48
|
findFirstFile(mask, listFile) {
|
|
48
|
-
return this.storage.
|
|
49
|
+
return this.storage.CascFindFirstFile(mask, listFile);
|
|
49
50
|
}
|
|
50
51
|
findNextFile() {
|
|
51
|
-
return this.storage.
|
|
52
|
+
return this.storage.CascFindNextFile();
|
|
52
53
|
}
|
|
53
54
|
findClose() {
|
|
54
|
-
return this.storage.
|
|
55
|
+
return this.storage.CascFindClose();
|
|
55
56
|
}
|
|
56
57
|
addEncryptionKey(keyName, key) {
|
|
57
|
-
return this.storage.
|
|
58
|
+
return this.storage.CascAddEncryptionKey(keyName, key);
|
|
58
59
|
}
|
|
59
60
|
addStringEncryptionKey(keyName, keyStr) {
|
|
60
|
-
return this.storage.
|
|
61
|
+
return this.storage.CascAddStringEncryptionKey(keyName, keyStr);
|
|
61
62
|
}
|
|
62
63
|
importKeysFromString(keyList) {
|
|
63
|
-
return this.storage.
|
|
64
|
+
return this.storage.CascImportKeysFromString(keyList);
|
|
64
65
|
}
|
|
65
66
|
importKeysFromFile(filePath) {
|
|
66
|
-
return this.storage.
|
|
67
|
+
return this.storage.CascImportKeysFromFile(filePath);
|
|
67
68
|
}
|
|
68
69
|
findEncryptionKey(keyName) {
|
|
69
|
-
return this.storage.
|
|
70
|
+
return this.storage.CascFindEncryptionKey(keyName);
|
|
70
71
|
}
|
|
71
72
|
getNotFoundEncryptionKey() {
|
|
72
|
-
return this.storage.
|
|
73
|
+
return this.storage.CascGetNotFoundEncryptionKey();
|
|
73
74
|
}
|
|
74
75
|
}
|
|
75
|
-
exports.
|
|
76
|
-
class
|
|
76
|
+
exports.Storage = Storage;
|
|
77
|
+
class File {
|
|
77
78
|
constructor(file) {
|
|
78
79
|
this.file = file;
|
|
79
80
|
}
|
|
80
81
|
read(bytesToRead) {
|
|
81
|
-
return this.file.
|
|
82
|
+
return this.file.CascReadFile(bytesToRead || 4096);
|
|
82
83
|
}
|
|
83
84
|
readAll() {
|
|
84
|
-
return this.file.
|
|
85
|
+
return this.file.readFileAll();
|
|
85
86
|
}
|
|
86
87
|
getSize() {
|
|
87
|
-
return this.file.
|
|
88
|
+
return this.file.CascGetFileSize();
|
|
88
89
|
}
|
|
89
90
|
getSize64() {
|
|
90
|
-
return this.file.
|
|
91
|
+
return this.file.CascGetFileSize64();
|
|
91
92
|
}
|
|
92
93
|
getPosition() {
|
|
93
|
-
return this.file.
|
|
94
|
+
return this.file.CascGetFilePointer();
|
|
94
95
|
}
|
|
95
96
|
getPosition64() {
|
|
96
|
-
return this.file.
|
|
97
|
+
return this.file.CascGetFilePointer64();
|
|
97
98
|
}
|
|
98
99
|
setPosition(position) {
|
|
99
|
-
return this.file.
|
|
100
|
+
return this.file.CascSetFilePointer(position);
|
|
100
101
|
}
|
|
101
102
|
setPosition64(position, moveMethod) {
|
|
102
|
-
return this.file.
|
|
103
|
+
return this.file.CascSetFilePointer64(position, moveMethod);
|
|
103
104
|
}
|
|
104
105
|
getFileInfo(infoClass) {
|
|
105
|
-
return this.file.
|
|
106
|
+
return this.file.CascGetFileInfo(infoClass);
|
|
106
107
|
}
|
|
107
108
|
setFileFlags(flags) {
|
|
108
|
-
return this.file.
|
|
109
|
+
return this.file.CascSetFileFlags(flags);
|
|
109
110
|
}
|
|
110
111
|
close() {
|
|
111
|
-
return this.file.
|
|
112
|
+
return this.file.CascCloseFile();
|
|
112
113
|
}
|
|
113
114
|
}
|
|
114
|
-
exports.
|
|
115
|
+
exports.File = File;
|
|
115
116
|
__exportStar(require("./bindings"), exports);
|
|
116
117
|
exports.default = {
|
|
117
|
-
|
|
118
|
-
|
|
118
|
+
Storage,
|
|
119
|
+
File
|
|
119
120
|
};
|
|
120
121
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/src/addon.cpp
CHANGED
|
@@ -62,6 +62,52 @@ Napi::Value SetError(const Napi::CallbackInfo& info) {
|
|
|
62
62
|
return env.Undefined();
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
// Wrapper for CascCdnGetDefault
|
|
66
|
+
Napi::Value CdnGetDefault(const Napi::CallbackInfo& info) {
|
|
67
|
+
Napi::Env env = info.Env();
|
|
68
|
+
LPCTSTR cdnUrl = CascCdnGetDefault();
|
|
69
|
+
|
|
70
|
+
if (cdnUrl == nullptr) {
|
|
71
|
+
return env.Null();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return Napi::String::New(env, cdnUrl);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Wrapper for CascCdnDownload
|
|
78
|
+
Napi::Value CdnDownload(const Napi::CallbackInfo& info) {
|
|
79
|
+
Napi::Env env = info.Env();
|
|
80
|
+
|
|
81
|
+
if (info.Length() < 3) {
|
|
82
|
+
Napi::TypeError::New(env, "Expected cdnHostUrl, product, and fileName as arguments")
|
|
83
|
+
.ThrowAsJavaScriptException();
|
|
84
|
+
return env.Null();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (!info[0].IsString() || !info[1].IsString() || !info[2].IsString()) {
|
|
88
|
+
Napi::TypeError::New(env, "All arguments must be strings")
|
|
89
|
+
.ThrowAsJavaScriptException();
|
|
90
|
+
return env.Null();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
std::string cdnHostUrl = info[0].As<Napi::String>().Utf8Value();
|
|
94
|
+
std::string product = info[1].As<Napi::String>().Utf8Value();
|
|
95
|
+
std::string fileName = info[2].As<Napi::String>().Utf8Value();
|
|
96
|
+
DWORD dwSize = 0;
|
|
97
|
+
|
|
98
|
+
LPBYTE data = CascCdnDownload(cdnHostUrl.c_str(), product.c_str(), fileName.c_str(), &dwSize);
|
|
99
|
+
|
|
100
|
+
if (data == nullptr || dwSize == 0) {
|
|
101
|
+
return env.Null();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Copy the data to a Node.js Buffer and free the original
|
|
105
|
+
Napi::Buffer<uint8_t> buffer = Napi::Buffer<uint8_t>::Copy(env, data, dwSize);
|
|
106
|
+
CascCdnFree(data);
|
|
107
|
+
|
|
108
|
+
return buffer;
|
|
109
|
+
}
|
|
110
|
+
|
|
65
111
|
Napi::Object InitAll(Napi::Env env, Napi::Object exports) {
|
|
66
112
|
// Initialize Storage class
|
|
67
113
|
CascStorage::Init(env, exports);
|
|
@@ -70,29 +116,71 @@ Napi::Object InitAll(Napi::Env env, Napi::Object exports) {
|
|
|
70
116
|
CascFile::Init(env, exports);
|
|
71
117
|
|
|
72
118
|
// Export utility functions
|
|
73
|
-
exports.Set("
|
|
74
|
-
exports.Set("
|
|
75
|
-
exports.Set("
|
|
119
|
+
exports.Set("CascOpenLocalFile", Napi::Function::New(env, OpenLocalFile));
|
|
120
|
+
exports.Set("GetCascError", Napi::Function::New(env, GetError));
|
|
121
|
+
exports.Set("SetCascError", Napi::Function::New(env, SetError));
|
|
122
|
+
|
|
123
|
+
// Export CDN functions
|
|
124
|
+
exports.Set("CascCdnGetDefault", Napi::Function::New(env, CdnGetDefault));
|
|
125
|
+
exports.Set("CascCdnDownload", Napi::Function::New(env, CdnDownload));
|
|
126
|
+
|
|
127
|
+
// Export version constants
|
|
128
|
+
exports.Set("CASCLIB_VERSION", Napi::Number::New(env, CASCLIB_VERSION));
|
|
129
|
+
|
|
130
|
+
// Export file positioning constants
|
|
131
|
+
#ifdef _WIN32
|
|
132
|
+
exports.Set("FILE_BEGIN", Napi::Number::New(env, FILE_BEGIN));
|
|
133
|
+
exports.Set("FILE_CURRENT", Napi::Number::New(env, FILE_CURRENT));
|
|
134
|
+
exports.Set("FILE_END", Napi::Number::New(env, FILE_END));
|
|
135
|
+
#else
|
|
136
|
+
exports.Set("FILE_BEGIN", Napi::Number::New(env, SEEK_SET));
|
|
137
|
+
exports.Set("FILE_CURRENT", Napi::Number::New(env, SEEK_CUR));
|
|
138
|
+
exports.Set("FILE_END", Napi::Number::New(env, SEEK_END));
|
|
139
|
+
#endif
|
|
140
|
+
|
|
141
|
+
// Export other useful constants
|
|
142
|
+
exports.Set("CASC_FILEID_FORMAT", Napi::String::New(env, CASC_FILEID_FORMAT));
|
|
143
|
+
exports.Set("CASC_PARAM_SEPARATOR", Napi::String::New(env, std::string(1, CASC_PARAM_SEPARATOR)));
|
|
144
|
+
|
|
145
|
+
// Export progress message constants
|
|
146
|
+
exports.Set("CascProgressLoadingFile", Napi::Number::New(env, CascProgressLoadingFile));
|
|
147
|
+
exports.Set("CascProgressLoadingManifest", Napi::Number::New(env, CascProgressLoadingManifest));
|
|
148
|
+
exports.Set("CascProgressDownloadingFile", Napi::Number::New(env, CascProgressDownloadingFile));
|
|
149
|
+
exports.Set("CascProgressLoadingIndexes", Napi::Number::New(env, CascProgressLoadingIndexes));
|
|
150
|
+
exports.Set("CascProgressDownloadingArchiveIndexes", Napi::Number::New(env, CascProgressDownloadingArchiveIndexes));
|
|
76
151
|
|
|
77
152
|
// Export constants - Open flags
|
|
78
153
|
exports.Set("CASC_OPEN_BY_NAME", Napi::Number::New(env, CASC_OPEN_BY_NAME));
|
|
79
154
|
exports.Set("CASC_OPEN_BY_CKEY", Napi::Number::New(env, CASC_OPEN_BY_CKEY));
|
|
80
155
|
exports.Set("CASC_OPEN_BY_EKEY", Napi::Number::New(env, CASC_OPEN_BY_EKEY));
|
|
81
156
|
exports.Set("CASC_OPEN_BY_FILEID", Napi::Number::New(env, CASC_OPEN_BY_FILEID));
|
|
157
|
+
exports.Set("CASC_OPEN_TYPE_MASK", Napi::Number::New(env, CASC_OPEN_TYPE_MASK));
|
|
158
|
+
exports.Set("CASC_OPEN_FLAGS_MASK", Napi::Number::New(env, CASC_OPEN_FLAGS_MASK));
|
|
82
159
|
exports.Set("CASC_STRICT_DATA_CHECK", Napi::Number::New(env, CASC_STRICT_DATA_CHECK));
|
|
83
160
|
exports.Set("CASC_OVERCOME_ENCRYPTED", Napi::Number::New(env, CASC_OVERCOME_ENCRYPTED));
|
|
161
|
+
exports.Set("CASC_OPEN_CKEY_ONCE", Napi::Number::New(env, CASC_OPEN_CKEY_ONCE));
|
|
84
162
|
|
|
85
163
|
// Export constants - Locale flags
|
|
86
164
|
exports.Set("CASC_LOCALE_ALL", Napi::Number::New(env, CASC_LOCALE_ALL));
|
|
165
|
+
exports.Set("CASC_LOCALE_ALL_WOW", Napi::Number::New(env, CASC_LOCALE_ALL_WOW));
|
|
87
166
|
exports.Set("CASC_LOCALE_NONE", Napi::Number::New(env, CASC_LOCALE_NONE));
|
|
167
|
+
exports.Set("CASC_LOCALE_UNKNOWN1", Napi::Number::New(env, CASC_LOCALE_UNKNOWN1));
|
|
88
168
|
exports.Set("CASC_LOCALE_ENUS", Napi::Number::New(env, CASC_LOCALE_ENUS));
|
|
89
169
|
exports.Set("CASC_LOCALE_KOKR", Napi::Number::New(env, CASC_LOCALE_KOKR));
|
|
170
|
+
exports.Set("CASC_LOCALE_RESERVED", Napi::Number::New(env, CASC_LOCALE_RESERVED));
|
|
90
171
|
exports.Set("CASC_LOCALE_FRFR", Napi::Number::New(env, CASC_LOCALE_FRFR));
|
|
91
172
|
exports.Set("CASC_LOCALE_DEDE", Napi::Number::New(env, CASC_LOCALE_DEDE));
|
|
92
173
|
exports.Set("CASC_LOCALE_ZHCN", Napi::Number::New(env, CASC_LOCALE_ZHCN));
|
|
93
174
|
exports.Set("CASC_LOCALE_ESES", Napi::Number::New(env, CASC_LOCALE_ESES));
|
|
94
175
|
exports.Set("CASC_LOCALE_ZHTW", Napi::Number::New(env, CASC_LOCALE_ZHTW));
|
|
95
176
|
exports.Set("CASC_LOCALE_ENGB", Napi::Number::New(env, CASC_LOCALE_ENGB));
|
|
177
|
+
exports.Set("CASC_LOCALE_ENCN", Napi::Number::New(env, CASC_LOCALE_ENCN));
|
|
178
|
+
exports.Set("CASC_LOCALE_ENTW", Napi::Number::New(env, CASC_LOCALE_ENTW));
|
|
179
|
+
exports.Set("CASC_LOCALE_ESMX", Napi::Number::New(env, CASC_LOCALE_ESMX));
|
|
180
|
+
exports.Set("CASC_LOCALE_RURU", Napi::Number::New(env, CASC_LOCALE_RURU));
|
|
181
|
+
exports.Set("CASC_LOCALE_PTBR", Napi::Number::New(env, CASC_LOCALE_PTBR));
|
|
182
|
+
exports.Set("CASC_LOCALE_ITIT", Napi::Number::New(env, CASC_LOCALE_ITIT));
|
|
183
|
+
exports.Set("CASC_LOCALE_PTPT", Napi::Number::New(env, CASC_LOCALE_PTPT));
|
|
96
184
|
|
|
97
185
|
// Export constants - Content flags
|
|
98
186
|
exports.Set("CASC_CFLAG_INSTALL", Napi::Number::New(env, CASC_CFLAG_INSTALL));
|
|
@@ -100,27 +188,62 @@ Napi::Object InitAll(Napi::Env env, Napi::Object exports) {
|
|
|
100
188
|
exports.Set("CASC_CFLAG_LOAD_ON_MAC", Napi::Number::New(env, CASC_CFLAG_LOAD_ON_MAC));
|
|
101
189
|
exports.Set("CASC_CFLAG_X86_32", Napi::Number::New(env, CASC_CFLAG_X86_32));
|
|
102
190
|
exports.Set("CASC_CFLAG_X86_64", Napi::Number::New(env, CASC_CFLAG_X86_64));
|
|
191
|
+
exports.Set("CASC_CFLAG_LOW_VIOLENCE", Napi::Number::New(env, CASC_CFLAG_LOW_VIOLENCE));
|
|
192
|
+
exports.Set("CASC_CFLAG_DONT_LOAD", Napi::Number::New(env, CASC_CFLAG_DONT_LOAD));
|
|
193
|
+
exports.Set("CASC_CFLAG_UPDATE_PLUGIN", Napi::Number::New(env, CASC_CFLAG_UPDATE_PLUGIN));
|
|
194
|
+
exports.Set("CASC_CFLAG_ARM64", Napi::Number::New(env, CASC_CFLAG_ARM64));
|
|
103
195
|
exports.Set("CASC_CFLAG_ENCRYPTED", Napi::Number::New(env, CASC_CFLAG_ENCRYPTED));
|
|
196
|
+
exports.Set("CASC_CFLAG_NO_NAME_HASH", Napi::Number::New(env, CASC_CFLAG_NO_NAME_HASH));
|
|
197
|
+
exports.Set("CASC_CFLAG_UNCMN_RESOLUTION", Napi::Number::New(env, CASC_CFLAG_UNCMN_RESOLUTION));
|
|
198
|
+
exports.Set("CASC_CFLAG_BUNDLE", Napi::Number::New(env, CASC_CFLAG_BUNDLE));
|
|
199
|
+
exports.Set("CASC_CFLAG_NO_COMPRESSION", Napi::Number::New(env, CASC_CFLAG_NO_COMPRESSION));
|
|
200
|
+
|
|
201
|
+
// Export constants - Hash sizes
|
|
202
|
+
exports.Set("MD5_HASH_SIZE", Napi::Number::New(env, MD5_HASH_SIZE));
|
|
203
|
+
exports.Set("MD5_STRING_SIZE", Napi::Number::New(env, MD5_STRING_SIZE));
|
|
204
|
+
exports.Set("SHA1_HASH_SIZE", Napi::Number::New(env, SHA1_HASH_SIZE));
|
|
205
|
+
exports.Set("SHA1_STRING_SIZE", Napi::Number::New(env, SHA1_STRING_SIZE));
|
|
206
|
+
|
|
207
|
+
// Export constants - Invalid values
|
|
208
|
+
exports.Set("CASC_INVALID_INDEX", Napi::Number::New(env, CASC_INVALID_INDEX));
|
|
209
|
+
exports.Set("CASC_INVALID_SIZE", Napi::Number::New(env, CASC_INVALID_SIZE));
|
|
210
|
+
exports.Set("CASC_INVALID_POS", Napi::Number::New(env, CASC_INVALID_POS));
|
|
211
|
+
exports.Set("CASC_INVALID_ID", Napi::Number::New(env, CASC_INVALID_ID));
|
|
212
|
+
exports.Set("CASC_INVALID_OFFS64", Napi::Number::New(env, (double)CASC_INVALID_OFFS64));
|
|
213
|
+
exports.Set("CASC_INVALID_SIZE64", Napi::Number::New(env, (double)CASC_INVALID_SIZE64));
|
|
214
|
+
// Note: CASC_INVALID_SIZE_T is (size_t)(-1), which may not be accurately representable in JS
|
|
104
215
|
|
|
105
216
|
// Export constants - Storage info classes
|
|
106
217
|
exports.Set("CascStorageLocalFileCount", Napi::Number::New(env, CascStorageLocalFileCount));
|
|
107
218
|
exports.Set("CascStorageTotalFileCount", Napi::Number::New(env, CascStorageTotalFileCount));
|
|
108
219
|
exports.Set("CascStorageFeatures", Napi::Number::New(env, CascStorageFeatures));
|
|
220
|
+
exports.Set("CascStorageInstalledLocales", Napi::Number::New(env, CascStorageInstalledLocales));
|
|
109
221
|
exports.Set("CascStorageProduct", Napi::Number::New(env, CascStorageProduct));
|
|
222
|
+
exports.Set("CascStorageTags", Napi::Number::New(env, CascStorageTags));
|
|
223
|
+
exports.Set("CascStoragePathProduct", Napi::Number::New(env, CascStoragePathProduct));
|
|
110
224
|
|
|
111
225
|
// Export constants - File info classes
|
|
112
226
|
exports.Set("CascFileContentKey", Napi::Number::New(env, CascFileContentKey));
|
|
113
227
|
exports.Set("CascFileEncodedKey", Napi::Number::New(env, CascFileEncodedKey));
|
|
114
228
|
exports.Set("CascFileFullInfo", Napi::Number::New(env, CascFileFullInfo));
|
|
229
|
+
exports.Set("CascFileSpanInfo", Napi::Number::New(env, CascFileSpanInfo));
|
|
115
230
|
|
|
116
231
|
// Export constants - Feature flags
|
|
117
232
|
exports.Set("CASC_FEATURE_FILE_NAMES", Napi::Number::New(env, CASC_FEATURE_FILE_NAMES));
|
|
118
233
|
exports.Set("CASC_FEATURE_ROOT_CKEY", Napi::Number::New(env, CASC_FEATURE_ROOT_CKEY));
|
|
119
234
|
exports.Set("CASC_FEATURE_TAGS", Napi::Number::New(env, CASC_FEATURE_TAGS));
|
|
235
|
+
exports.Set("CASC_FEATURE_FNAME_HASHES", Napi::Number::New(env, CASC_FEATURE_FNAME_HASHES));
|
|
236
|
+
exports.Set("CASC_FEATURE_FNAME_HASHES_OPTIONAL", Napi::Number::New(env, CASC_FEATURE_FNAME_HASHES_OPTIONAL));
|
|
120
237
|
exports.Set("CASC_FEATURE_FILE_DATA_IDS", Napi::Number::New(env, CASC_FEATURE_FILE_DATA_IDS));
|
|
121
238
|
exports.Set("CASC_FEATURE_LOCALE_FLAGS", Napi::Number::New(env, CASC_FEATURE_LOCALE_FLAGS));
|
|
122
239
|
exports.Set("CASC_FEATURE_CONTENT_FLAGS", Napi::Number::New(env, CASC_FEATURE_CONTENT_FLAGS));
|
|
240
|
+
exports.Set("CASC_FEATURE_DATA_ARCHIVES", Napi::Number::New(env, CASC_FEATURE_DATA_ARCHIVES));
|
|
241
|
+
exports.Set("CASC_FEATURE_DATA_FILES", Napi::Number::New(env, CASC_FEATURE_DATA_FILES));
|
|
123
242
|
exports.Set("CASC_FEATURE_ONLINE", Napi::Number::New(env, CASC_FEATURE_ONLINE));
|
|
243
|
+
exports.Set("CASC_FEATURE_FORCE_DOWNLOAD", Napi::Number::New(env, CASC_FEATURE_FORCE_DOWNLOAD));
|
|
244
|
+
|
|
245
|
+
// Export constants - Key length
|
|
246
|
+
exports.Set("CASC_KEY_LENGTH", Napi::Number::New(env, CASC_KEY_LENGTH));
|
|
124
247
|
|
|
125
248
|
return exports;
|
|
126
249
|
}
|
package/src/file.cpp
CHANGED
|
@@ -7,17 +7,17 @@ Napi::Object CascFile::Init(Napi::Env env, Napi::Object exports) {
|
|
|
7
7
|
Napi::HandleScope scope(env);
|
|
8
8
|
|
|
9
9
|
Napi::Function func = DefineClass(env, "File", {
|
|
10
|
-
InstanceMethod("
|
|
11
|
-
InstanceMethod("
|
|
12
|
-
InstanceMethod("
|
|
13
|
-
InstanceMethod("
|
|
14
|
-
InstanceMethod("
|
|
15
|
-
InstanceMethod("
|
|
16
|
-
InstanceMethod("
|
|
17
|
-
InstanceMethod("
|
|
18
|
-
InstanceMethod("
|
|
19
|
-
InstanceMethod("
|
|
20
|
-
InstanceMethod("
|
|
10
|
+
InstanceMethod("CascReadFile", &CascFile::Read),
|
|
11
|
+
InstanceMethod("readFileAll", &CascFile::ReadAll),
|
|
12
|
+
InstanceMethod("CascGetFileSize", &CascFile::GetSize),
|
|
13
|
+
InstanceMethod("CascGetFileSize64", &CascFile::GetSize64),
|
|
14
|
+
InstanceMethod("CascGetFilePointer", &CascFile::GetPosition),
|
|
15
|
+
InstanceMethod("CascGetFilePointer64", &CascFile::GetPosition64),
|
|
16
|
+
InstanceMethod("CascSetFilePointer", &CascFile::SetPosition),
|
|
17
|
+
InstanceMethod("CascSetFilePointer64", &CascFile::SetPosition64),
|
|
18
|
+
InstanceMethod("CascGetFileInfo", &CascFile::GetFileInfo),
|
|
19
|
+
InstanceMethod("CascSetFileFlags", &CascFile::SetFileFlags),
|
|
20
|
+
InstanceMethod("CascCloseFile", &CascFile::Close)
|
|
21
21
|
});
|
|
22
22
|
|
|
23
23
|
constructor = Napi::Persistent(func);
|
package/src/storage.cpp
CHANGED
|
@@ -8,22 +8,23 @@ Napi::Object CascStorage::Init(Napi::Env env, Napi::Object exports) {
|
|
|
8
8
|
Napi::HandleScope scope(env);
|
|
9
9
|
|
|
10
10
|
Napi::Function func = DefineClass(env, "Storage", {
|
|
11
|
-
InstanceMethod("
|
|
12
|
-
InstanceMethod("
|
|
13
|
-
InstanceMethod("
|
|
14
|
-
InstanceMethod("
|
|
15
|
-
InstanceMethod("
|
|
11
|
+
InstanceMethod("CascOpenStorage", &CascStorage::Open),
|
|
12
|
+
InstanceMethod("CascOpenOnlineStorage", &CascStorage::OpenOnline),
|
|
13
|
+
InstanceMethod("CascOpenStorageEx", &CascStorage::OpenEx),
|
|
14
|
+
InstanceMethod("CascCloseStorage", &CascStorage::Close),
|
|
15
|
+
InstanceMethod("CascOpenFile", &CascStorage::OpenFile),
|
|
16
|
+
InstanceMethod("CascGetFileInfo", &CascStorage::GetFileInfo),
|
|
16
17
|
InstanceMethod("fileExists", &CascStorage::FileExists),
|
|
17
|
-
InstanceMethod("
|
|
18
|
-
InstanceMethod("
|
|
19
|
-
InstanceMethod("
|
|
20
|
-
InstanceMethod("
|
|
21
|
-
InstanceMethod("
|
|
22
|
-
InstanceMethod("
|
|
23
|
-
InstanceMethod("
|
|
24
|
-
InstanceMethod("
|
|
25
|
-
InstanceMethod("
|
|
26
|
-
InstanceMethod("
|
|
18
|
+
InstanceMethod("CascGetStorageInfo", &CascStorage::GetStorageInfo),
|
|
19
|
+
InstanceMethod("CascFindFirstFile", &CascStorage::FindFirstFile),
|
|
20
|
+
InstanceMethod("CascFindNextFile", &CascStorage::FindNextFile),
|
|
21
|
+
InstanceMethod("CascFindClose", &CascStorage::FindClose),
|
|
22
|
+
InstanceMethod("CascAddEncryptionKey", &CascStorage::AddEncryptionKey),
|
|
23
|
+
InstanceMethod("CascAddStringEncryptionKey", &CascStorage::AddStringEncryptionKey),
|
|
24
|
+
InstanceMethod("CascImportKeysFromString", &CascStorage::ImportKeysFromString),
|
|
25
|
+
InstanceMethod("CascImportKeysFromFile", &CascStorage::ImportKeysFromFile),
|
|
26
|
+
InstanceMethod("CascFindEncryptionKey", &CascStorage::FindEncryptionKey),
|
|
27
|
+
InstanceMethod("CascGetNotFoundEncryptionKey", &CascStorage::GetNotFoundEncryptionKey)
|
|
27
28
|
});
|
|
28
29
|
|
|
29
30
|
constructor = Napi::Persistent(func);
|
|
@@ -243,6 +244,94 @@ Napi::Value CascStorage::OpenOnline(const Napi::CallbackInfo& info) {
|
|
|
243
244
|
return Napi::Boolean::New(env, true);
|
|
244
245
|
}
|
|
245
246
|
|
|
247
|
+
Napi::Value CascStorage::OpenEx(const Napi::CallbackInfo& info) {
|
|
248
|
+
Napi::Env env = info.Env();
|
|
249
|
+
|
|
250
|
+
if (info.Length() < 1) {
|
|
251
|
+
Napi::TypeError::New(env, "Expected at least params string as first argument")
|
|
252
|
+
.ThrowAsJavaScriptException();
|
|
253
|
+
return env.Null();
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (!info[0].IsString()) {
|
|
257
|
+
Napi::TypeError::New(env, "First argument must be a string")
|
|
258
|
+
.ThrowAsJavaScriptException();
|
|
259
|
+
return env.Null();
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if (isOpen) {
|
|
263
|
+
Napi::Error::New(env, "Storage is already open")
|
|
264
|
+
.ThrowAsJavaScriptException();
|
|
265
|
+
return env.Null();
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
std::string params = info[0].As<Napi::String>().Utf8Value();
|
|
269
|
+
|
|
270
|
+
// Initialize CASC_OPEN_STORAGE_ARGS structure
|
|
271
|
+
CASC_OPEN_STORAGE_ARGS args = {0};
|
|
272
|
+
args.Size = sizeof(CASC_OPEN_STORAGE_ARGS);
|
|
273
|
+
args.dwLocaleMask = CASC_LOCALE_ALL;
|
|
274
|
+
args.dwFlags = 0;
|
|
275
|
+
|
|
276
|
+
bool bOnlineStorage = false;
|
|
277
|
+
|
|
278
|
+
// If second argument is an options object
|
|
279
|
+
if (info.Length() > 1 && info[1].IsObject()) {
|
|
280
|
+
Napi::Object options = info[1].As<Napi::Object>();
|
|
281
|
+
|
|
282
|
+
// Extract optional parameters
|
|
283
|
+
if (options.Has("localPath") && options.Get("localPath").IsString()) {
|
|
284
|
+
// LocalPath is stored temporarily - we'll use params for szLocalPath instead
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
if (options.Has("codeName") && options.Get("codeName").IsString()) {
|
|
288
|
+
static std::string codeName;
|
|
289
|
+
codeName = options.Get("codeName").As<Napi::String>().Utf8Value();
|
|
290
|
+
args.szCodeName = codeName.c_str();
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
if (options.Has("region") && options.Get("region").IsString()) {
|
|
294
|
+
static std::string region;
|
|
295
|
+
region = options.Get("region").As<Napi::String>().Utf8Value();
|
|
296
|
+
args.szRegion = region.c_str();
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
if (options.Has("localeMask") && options.Get("localeMask").IsNumber()) {
|
|
300
|
+
args.dwLocaleMask = options.Get("localeMask").As<Napi::Number>().Uint32Value();
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
if (options.Has("flags") && options.Get("flags").IsNumber()) {
|
|
304
|
+
args.dwFlags = options.Get("flags").As<Napi::Number>().Uint32Value();
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
if (options.Has("buildKey") && options.Get("buildKey").IsString()) {
|
|
308
|
+
static std::string buildKey;
|
|
309
|
+
buildKey = options.Get("buildKey").As<Napi::String>().Utf8Value();
|
|
310
|
+
args.szBuildKey = buildKey.c_str();
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if (options.Has("cdnHostUrl") && options.Get("cdnHostUrl").IsString()) {
|
|
314
|
+
static std::string cdnHostUrl;
|
|
315
|
+
cdnHostUrl = options.Get("cdnHostUrl").As<Napi::String>().Utf8Value();
|
|
316
|
+
args.szCdnHostUrl = cdnHostUrl.c_str();
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
if (options.Has("online") && options.Get("online").IsBoolean()) {
|
|
320
|
+
bOnlineStorage = options.Get("online").As<Napi::Boolean>().Value();
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// Call CascOpenStorageEx
|
|
325
|
+
if (!CascOpenStorageEx(params.c_str(), &args, bOnlineStorage, &hStorage)) {
|
|
326
|
+
std::string error = "Failed to open CASC storage with extended parameters: " + params;
|
|
327
|
+
Napi::Error::New(env, error).ThrowAsJavaScriptException();
|
|
328
|
+
return env.Null();
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
isOpen = true;
|
|
332
|
+
return Napi::Boolean::New(env, true);
|
|
333
|
+
}
|
|
334
|
+
|
|
246
335
|
Napi::Value CascStorage::GetStorageInfo(const Napi::CallbackInfo& info) {
|
|
247
336
|
Napi::Env env = info.Env();
|
|
248
337
|
|
|
@@ -332,11 +421,17 @@ Napi::Value CascStorage::FindFirstFile(const Napi::CallbackInfo& info) {
|
|
|
332
421
|
|
|
333
422
|
Napi::Object result = Napi::Object::New(env);
|
|
334
423
|
result.Set("fileName", Napi::String::New(env, findData.szFileName));
|
|
424
|
+
result.Set("ckey", Napi::Buffer<BYTE>::Copy(env, findData.CKey, MD5_HASH_SIZE));
|
|
425
|
+
result.Set("ekey", Napi::Buffer<BYTE>::Copy(env, findData.EKey, MD5_HASH_SIZE));
|
|
426
|
+
result.Set("tagBitMask", Napi::Number::New(env, (double)findData.TagBitMask));
|
|
335
427
|
result.Set("fileSize", Napi::Number::New(env, (double)findData.FileSize));
|
|
428
|
+
result.Set("plainName", findData.szPlainName ? Napi::String::New(env, findData.szPlainName) : env.Null());
|
|
336
429
|
result.Set("fileDataId", Napi::Number::New(env, findData.dwFileDataId));
|
|
337
430
|
result.Set("localeFlags", Napi::Number::New(env, findData.dwLocaleFlags));
|
|
338
431
|
result.Set("contentFlags", Napi::Number::New(env, findData.dwContentFlags));
|
|
432
|
+
result.Set("spanCount", Napi::Number::New(env, findData.dwSpanCount));
|
|
339
433
|
result.Set("available", Napi::Boolean::New(env, findData.bFileAvailable));
|
|
434
|
+
result.Set("nameType", Napi::Number::New(env, findData.NameType));
|
|
340
435
|
|
|
341
436
|
return result;
|
|
342
437
|
}
|
|
@@ -357,11 +452,17 @@ Napi::Value CascStorage::FindNextFile(const Napi::CallbackInfo& info) {
|
|
|
357
452
|
|
|
358
453
|
Napi::Object result = Napi::Object::New(env);
|
|
359
454
|
result.Set("fileName", Napi::String::New(env, findData.szFileName));
|
|
455
|
+
result.Set("ckey", Napi::Buffer<BYTE>::Copy(env, findData.CKey, MD5_HASH_SIZE));
|
|
456
|
+
result.Set("ekey", Napi::Buffer<BYTE>::Copy(env, findData.EKey, MD5_HASH_SIZE));
|
|
457
|
+
result.Set("tagBitMask", Napi::Number::New(env, (double)findData.TagBitMask));
|
|
360
458
|
result.Set("fileSize", Napi::Number::New(env, (double)findData.FileSize));
|
|
459
|
+
result.Set("plainName", findData.szPlainName ? Napi::String::New(env, findData.szPlainName) : env.Null());
|
|
361
460
|
result.Set("fileDataId", Napi::Number::New(env, findData.dwFileDataId));
|
|
362
461
|
result.Set("localeFlags", Napi::Number::New(env, findData.dwLocaleFlags));
|
|
363
462
|
result.Set("contentFlags", Napi::Number::New(env, findData.dwContentFlags));
|
|
463
|
+
result.Set("spanCount", Napi::Number::New(env, findData.dwSpanCount));
|
|
364
464
|
result.Set("available", Napi::Boolean::New(env, findData.bFileAvailable));
|
|
465
|
+
result.Set("nameType", Napi::Number::New(env, findData.NameType));
|
|
365
466
|
|
|
366
467
|
return result;
|
|
367
468
|
}
|
package/src/storage.h
CHANGED
|
@@ -16,6 +16,7 @@ private:
|
|
|
16
16
|
// Methods
|
|
17
17
|
Napi::Value Open(const Napi::CallbackInfo& info);
|
|
18
18
|
Napi::Value OpenOnline(const Napi::CallbackInfo& info);
|
|
19
|
+
Napi::Value OpenEx(const Napi::CallbackInfo& info);
|
|
19
20
|
Napi::Value Close(const Napi::CallbackInfo& info);
|
|
20
21
|
Napi::Value OpenFile(const Napi::CallbackInfo& info);
|
|
21
22
|
Napi::Value GetFileInfo(const Napi::CallbackInfo& info);
|