@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/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 = exports.CascFile = exports.CascStorage = void 0;
17
+ exports.File = exports.Storage = void 0;
18
18
  const bindings_1 = require("./bindings");
19
- Object.defineProperty(exports, "Storage", { enumerable: true, get: function () { return bindings_1.Storage; } });
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.Storage();
21
+ this.storage = new bindings_1.CascStorageBinding();
24
22
  }
25
23
  open(path, options) {
26
- this.storage.open(path, options?.flags || 0);
24
+ this.storage.CascOpenStorage(path, options?.flags || 0);
27
25
  }
28
26
  openOnline(path, options) {
29
- this.storage.openOnline(path, options?.flags || 0);
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.close();
33
+ return this.storage.CascCloseStorage();
33
34
  }
34
35
  openFile(filename, options) {
35
- const file = this.storage.openFile(filename, options?.flags || 0);
36
- return new CascFile(file);
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.getFileInfo(filename);
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.getStorageInfo(infoClass);
46
+ return this.storage.CascGetStorageInfo(infoClass);
46
47
  }
47
48
  findFirstFile(mask, listFile) {
48
- return this.storage.findFirstFile(mask, listFile);
49
+ return this.storage.CascFindFirstFile(mask, listFile);
49
50
  }
50
51
  findNextFile() {
51
- return this.storage.findNextFile();
52
+ return this.storage.CascFindNextFile();
52
53
  }
53
54
  findClose() {
54
- return this.storage.findClose();
55
+ return this.storage.CascFindClose();
55
56
  }
56
57
  addEncryptionKey(keyName, key) {
57
- return this.storage.addEncryptionKey(keyName, key);
58
+ return this.storage.CascAddEncryptionKey(keyName, key);
58
59
  }
59
60
  addStringEncryptionKey(keyName, keyStr) {
60
- return this.storage.addStringEncryptionKey(keyName, keyStr);
61
+ return this.storage.CascAddStringEncryptionKey(keyName, keyStr);
61
62
  }
62
63
  importKeysFromString(keyList) {
63
- return this.storage.importKeysFromString(keyList);
64
+ return this.storage.CascImportKeysFromString(keyList);
64
65
  }
65
66
  importKeysFromFile(filePath) {
66
- return this.storage.importKeysFromFile(filePath);
67
+ return this.storage.CascImportKeysFromFile(filePath);
67
68
  }
68
69
  findEncryptionKey(keyName) {
69
- return this.storage.findEncryptionKey(keyName);
70
+ return this.storage.CascFindEncryptionKey(keyName);
70
71
  }
71
72
  getNotFoundEncryptionKey() {
72
- return this.storage.getNotFoundEncryptionKey();
73
+ return this.storage.CascGetNotFoundEncryptionKey();
73
74
  }
74
75
  }
75
- exports.CascStorage = CascStorage;
76
- class CascFile {
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.read(bytesToRead || 4096);
82
+ return this.file.CascReadFile(bytesToRead || 4096);
82
83
  }
83
84
  readAll() {
84
- return this.file.readAll();
85
+ return this.file.readFileAll();
85
86
  }
86
87
  getSize() {
87
- return this.file.getSize();
88
+ return this.file.CascGetFileSize();
88
89
  }
89
90
  getSize64() {
90
- return this.file.getSize64();
91
+ return this.file.CascGetFileSize64();
91
92
  }
92
93
  getPosition() {
93
- return this.file.getPosition();
94
+ return this.file.CascGetFilePointer();
94
95
  }
95
96
  getPosition64() {
96
- return this.file.getPosition64();
97
+ return this.file.CascGetFilePointer64();
97
98
  }
98
99
  setPosition(position) {
99
- return this.file.setPosition(position);
100
+ return this.file.CascSetFilePointer(position);
100
101
  }
101
102
  setPosition64(position, moveMethod) {
102
- return this.file.setPosition64(position, moveMethod);
103
+ return this.file.CascSetFilePointer64(position, moveMethod);
103
104
  }
104
105
  getFileInfo(infoClass) {
105
- return this.file.getFileInfo(infoClass);
106
+ return this.file.CascGetFileInfo(infoClass);
106
107
  }
107
108
  setFileFlags(flags) {
108
- return this.file.setFileFlags(flags);
109
+ return this.file.CascSetFileFlags(flags);
109
110
  }
110
111
  close() {
111
- return this.file.close();
112
+ return this.file.CascCloseFile();
112
113
  }
113
114
  }
114
- exports.CascFile = CascFile;
115
+ exports.File = File;
115
116
  __exportStar(require("./bindings"), exports);
116
117
  exports.default = {
117
- CascStorage,
118
- CascFile
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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jamiephan/casclib",
3
- "version": "0.0.0-dev.0",
3
+ "version": "0.0.0-dev.2",
4
4
  "description": "Node.js native bindings for CascLib - A library to read CASC storage from Blizzard games",
5
5
  "repository": {
6
6
  "type": "git",
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("openLocalFile", Napi::Function::New(env, OpenLocalFile));
74
- exports.Set("getError", Napi::Function::New(env, GetError));
75
- exports.Set("setError", Napi::Function::New(env, SetError));
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("read", &CascFile::Read),
11
- InstanceMethod("readAll", &CascFile::ReadAll),
12
- InstanceMethod("getSize", &CascFile::GetSize),
13
- InstanceMethod("getSize64", &CascFile::GetSize64),
14
- InstanceMethod("getPosition", &CascFile::GetPosition),
15
- InstanceMethod("getPosition64", &CascFile::GetPosition64),
16
- InstanceMethod("setPosition", &CascFile::SetPosition),
17
- InstanceMethod("setPosition64", &CascFile::SetPosition64),
18
- InstanceMethod("getFileInfo", &CascFile::GetFileInfo),
19
- InstanceMethod("setFileFlags", &CascFile::SetFileFlags),
20
- InstanceMethod("close", &CascFile::Close)
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("open", &CascStorage::Open),
12
- InstanceMethod("openOnline", &CascStorage::OpenOnline),
13
- InstanceMethod("close", &CascStorage::Close),
14
- InstanceMethod("openFile", &CascStorage::OpenFile),
15
- InstanceMethod("getFileInfo", &CascStorage::GetFileInfo),
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("getStorageInfo", &CascStorage::GetStorageInfo),
18
- InstanceMethod("findFirstFile", &CascStorage::FindFirstFile),
19
- InstanceMethod("findNextFile", &CascStorage::FindNextFile),
20
- InstanceMethod("findClose", &CascStorage::FindClose),
21
- InstanceMethod("addEncryptionKey", &CascStorage::AddEncryptionKey),
22
- InstanceMethod("addStringEncryptionKey", &CascStorage::AddStringEncryptionKey),
23
- InstanceMethod("importKeysFromString", &CascStorage::ImportKeysFromString),
24
- InstanceMethod("importKeysFromFile", &CascStorage::ImportKeysFromFile),
25
- InstanceMethod("findEncryptionKey", &CascStorage::FindEncryptionKey),
26
- InstanceMethod("getNotFoundEncryptionKey", &CascStorage::GetNotFoundEncryptionKey)
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);