node-sword-interface 1.0.88 → 1.0.90

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/API.md CHANGED
@@ -79,6 +79,8 @@ This is the main class of node-sword-interface and it provides a set of static f
79
79
  * [.isModuleAvailableInRepo(moduleCode)](#NodeSwordInterface+isModuleAvailableInRepo) ⇒ <code>Boolean</code>
80
80
  * [.getSwordTranslation(originalString, localeCode)](#NodeSwordInterface+getSwordTranslation)
81
81
  * [.getBookAbbreviation(moduleName, bookCode, localeCode)](#NodeSwordInterface+getBookAbbreviation)
82
+ * [.unTarGZ(filePath, destPath)](#NodeSwordInterface+unTarGZ) ⇒ <code>Boolean</code>
83
+ * [.unZip(filePath, destPath)](#NodeSwordInterface+unZip) ⇒ <code>Boolean</code>
82
84
  * [.getSwordVersion()](#NodeSwordInterface+getSwordVersion) ⇒ <code>String</code>
83
85
  * [.getSwordPath()](#NodeSwordInterface+getSwordPath) ⇒ <code>String</code>
84
86
 
@@ -643,6 +645,32 @@ Uses the Sword LocaleMgr to translate a book abbreviation.
643
645
  | bookCode | <code>String</code> |
644
646
  | localeCode | <code>String</code> |
645
647
 
648
+ <a name="NodeSwordInterface+unTarGZ"></a>
649
+
650
+ ### nodeSwordInterface.unTarGZ(filePath, destPath) ⇒ <code>Boolean</code>
651
+ Extracts a tar.gz file to a destination path.
652
+
653
+ **Kind**: instance method of [<code>NodeSwordInterface</code>](#NodeSwordInterface)
654
+ **Returns**: <code>Boolean</code> - True if successful, false otherwise.
655
+
656
+ | Param | Type | Description |
657
+ | --- | --- | --- |
658
+ | filePath | <code>String</code> | The path to the tar.gz file. |
659
+ | destPath | <code>String</code> | The destination path where the file should be extracted. |
660
+
661
+ <a name="NodeSwordInterface+unZip"></a>
662
+
663
+ ### nodeSwordInterface.unZip(filePath, destPath) ⇒ <code>Boolean</code>
664
+ Extracts a zip file to a destination path.
665
+
666
+ **Kind**: instance method of [<code>NodeSwordInterface</code>](#NodeSwordInterface)
667
+ **Returns**: <code>Boolean</code> - True if successful, false otherwise.
668
+
669
+ | Param | Type | Description |
670
+ | --- | --- | --- |
671
+ | filePath | <code>String</code> | The path to the zip file. |
672
+ | destPath | <code>String</code> | The destination path where the file should be extracted. |
673
+
646
674
  <a name="NodeSwordInterface+getSwordVersion"></a>
647
675
 
648
676
  ### nodeSwordInterface.getSwordVersion() ⇒ <code>String</code>
package/binding.gyp CHANGED
@@ -88,6 +88,8 @@
88
88
  "src/sword_backend/module_installer.cpp",
89
89
  "src/sword_backend/sword_status_reporter.cpp",
90
90
  "src/sword_backend/text_processor.cpp",
91
+ "src/sword_backend/unzip/unzip.c",
92
+ "src/sword_backend/unzip/ioapi.c",
91
93
  "src/napi_module/install_module_worker.cpp",
92
94
  "src/napi_module/module_search_worker.cpp",
93
95
  "src/napi_module/napi_sword_helper.cpp",
package/index.js CHANGED
@@ -754,6 +754,26 @@ class NodeSwordInterface {
754
754
  return this.nativeInterface.getBookAbbreviation(moduleName, bookCode, localeCode);
755
755
  }
756
756
 
757
+ /**
758
+ * Extracts a tar.gz file to a destination path.
759
+ * @param {String} filePath - The path to the tar.gz file.
760
+ * @param {String} destPath - The destination path where the file should be extracted.
761
+ * @return {Boolean} True if successful, false otherwise.
762
+ */
763
+ unTarGZ(filePath, destPath) {
764
+ return this.nativeInterface.unTarGZ(filePath, destPath);
765
+ }
766
+
767
+ /**
768
+ * Extracts a zip file to a destination path.
769
+ * @param {String} filePath - The path to the zip file.
770
+ * @param {String} destPath - The destination path where the file should be extracted.
771
+ * @return {Boolean} True if successful, false otherwise.
772
+ */
773
+ unZip(filePath, destPath) {
774
+ return this.nativeInterface.unZip(filePath, destPath);
775
+ }
776
+
757
777
  /**
758
778
  * Returns the version of the SWORD library
759
779
  * @return {String} SWORD library version.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-sword-interface",
3
- "version": "1.0.88",
3
+ "version": "1.0.90",
4
4
  "description": "Javascript (N-API) interface to SWORD library",
5
5
  "keywords": [
6
6
  "C++",
@@ -117,7 +117,9 @@ Napi::Object NodeSwordInterface::Init(Napi::Env env, Napi::Object exports)
117
117
  InstanceMethod("getSwordTranslation", &NodeSwordInterface::getSwordTranslation),
118
118
  InstanceMethod("getBookAbbreviation", &NodeSwordInterface::getBookAbbreviation),
119
119
  InstanceMethod("getSwordVersion", &NodeSwordInterface::getSwordVersion),
120
- InstanceMethod("getSwordPath", &NodeSwordInterface::getSwordPath)
120
+ InstanceMethod("getSwordPath", &NodeSwordInterface::getSwordPath),
121
+ InstanceMethod("unTarGZ", &NodeSwordInterface::unTarGZ),
122
+ InstanceMethod("unZip", &NodeSwordInterface::unZip)
121
123
  });
122
124
 
123
125
  constructor = Napi::Persistent(func);
@@ -1024,3 +1026,35 @@ Napi::Value NodeSwordInterface::getSwordPath(const Napi::CallbackInfo& info)
1024
1026
  unlockApi();
1025
1027
  return swordPath;
1026
1028
  }
1029
+
1030
+ Napi::Value NodeSwordInterface::unTarGZ(const Napi::CallbackInfo& info)
1031
+ {
1032
+ Napi::Env env = info.Env();
1033
+ INIT_SCOPE_AND_VALIDATE(ParamType::string, ParamType::string);
1034
+ lockApi();
1035
+
1036
+ string filePath = info[0].As<Napi::String>().Utf8Value();
1037
+ string destPath = info[1].As<Napi::String>().Utf8Value();
1038
+
1039
+ FileSystemHelper fsHelper;
1040
+ bool ret = fsHelper.unTarGZ(filePath, destPath);
1041
+
1042
+ unlockApi();
1043
+ return Napi::Boolean::New(env, ret);
1044
+ }
1045
+
1046
+ Napi::Value NodeSwordInterface::unZip(const Napi::CallbackInfo& info)
1047
+ {
1048
+ Napi::Env env = info.Env();
1049
+ INIT_SCOPE_AND_VALIDATE(ParamType::string, ParamType::string);
1050
+ lockApi();
1051
+
1052
+ string filePath = info[0].As<Napi::String>().Utf8Value();
1053
+ string destPath = info[1].As<Napi::String>().Utf8Value();
1054
+
1055
+ FileSystemHelper fsHelper;
1056
+ bool ret = fsHelper.unZip(filePath, destPath);
1057
+
1058
+ unlockApi();
1059
+ return Napi::Boolean::New(env, ret);
1060
+ }
@@ -102,6 +102,8 @@ private:
102
102
  Napi::Value getBookAbbreviation(const Napi::CallbackInfo& info);
103
103
  Napi::Value getSwordVersion(const Napi::CallbackInfo& info);
104
104
  Napi::Value getSwordPath(const Napi::CallbackInfo& info);
105
+ Napi::Value unTarGZ(const Napi::CallbackInfo& info);
106
+ Napi::Value unZip(const Napi::CallbackInfo& info);
105
107
 
106
108
  int validateParams(const Napi::CallbackInfo& info, std::vector<ParamType> paramSpec);
107
109
  ModuleType getModuleTypeFromString(std::string moduleTypeString);
@@ -42,6 +42,11 @@
42
42
  #include <sstream>
43
43
  #include <vector>
44
44
 
45
+ #include <zipcomprs.h>
46
+ #include "unzip/unzip.h"
47
+ #include <filemgr.h>
48
+ #include <fcntl.h>
49
+
45
50
  #include "file_system_helper.hpp"
46
51
 
47
52
  using namespace std;
@@ -402,4 +407,71 @@ void FileSystemHelper::removeDir(std::string dirName)
402
407
  remove(path);
403
408
  }
404
409
  #endif
405
- #endif
410
+ #endif
411
+
412
+ bool FileSystemHelper::unTarGZ(std::string filePath, std::string destPath)
413
+ {
414
+ sword::FileDesc* fd = sword::FileMgr::getSystemFileMgr()->open(filePath.c_str(), sword::FileMgr::RDONLY);
415
+ if (!fd) {
416
+ return false;
417
+ }
418
+
419
+ char ret = sword::ZipCompress::unTarGZ(fd->getFd(), destPath.c_str());
420
+ sword::FileMgr::getSystemFileMgr()->close(fd);
421
+
422
+ return (ret == 0);
423
+ }
424
+
425
+ bool FileSystemHelper::unZip(std::string filePath, std::string destPath)
426
+ {
427
+ unzFile uf = unzOpen(filePath.c_str());
428
+ if (uf == NULL) {
429
+ return false;
430
+ }
431
+
432
+ int err = unzGoToFirstFile(uf);
433
+ while (err == UNZ_OK) {
434
+ char filename[256];
435
+ unz_file_info file_info;
436
+ err = unzGetCurrentFileInfo(uf, &file_info, filename, sizeof(filename), NULL, 0, NULL, 0);
437
+
438
+ if (err != UNZ_OK) break;
439
+
440
+ string fullPath = destPath;
441
+ if (fullPath.back() != '/' && fullPath.back() != '\\') {
442
+ fullPath += '/';
443
+ }
444
+ fullPath += filename;
445
+
446
+ // Check if directory
447
+ size_t filenameLen = strlen(filename);
448
+ if (filename[filenameLen - 1] == '/') {
449
+ // Create directory
450
+ string dummy = fullPath + "dummy";
451
+ sword::FileMgr::createParent(dummy.c_str());
452
+ } else {
453
+ // It's a file
454
+ sword::FileMgr::createParent(fullPath.c_str());
455
+
456
+ err = unzOpenCurrentFile(uf);
457
+ if (err == UNZ_OK) {
458
+ sword::FileDesc* fd = sword::FileMgr::getSystemFileMgr()->open(fullPath.c_str(), sword::FileMgr::WRONLY | sword::FileMgr::CREAT | sword::FileMgr::TRUNC);
459
+ if (fd) {
460
+ char buf[4096];
461
+ int readBytes;
462
+ while ((readBytes = unzReadCurrentFile(uf, buf, sizeof(buf))) > 0) {
463
+ sword::FileMgr::write(fd->getFd(), buf, readBytes);
464
+ }
465
+ sword::FileMgr::getSystemFileMgr()->close(fd);
466
+ }
467
+ unzCloseCurrentFile(uf);
468
+ }
469
+ }
470
+
471
+ err = unzGoToNextFile(uf);
472
+ }
473
+
474
+ unzClose(uf);
475
+
476
+ return true;
477
+ }
@@ -48,6 +48,8 @@ public:
48
48
  std::string getUserSwordDir();
49
49
  std::string getSystemSwordDir();
50
50
  std::vector<std::string> getFilesInDir(std::string dirName);
51
+ bool unTarGZ(std::string filePath, std::string destPath);
52
+ bool unZip(std::string filePath, std::string destPath);
51
53
  std::string getPathSeparator();
52
54
 
53
55
  bool fileExists(std::string fileName);
@@ -0,0 +1,257 @@
1
+ /* ioapi.h -- IO base function header for compress/uncompress .zip
2
+ part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
3
+
4
+ Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
5
+
6
+ Modifications for Zip64 support
7
+ Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
8
+
9
+ For more info read MiniZip_info.txt
10
+
11
+ */
12
+
13
+ #if defined(_WIN32) && (!(defined(_CRT_SECURE_NO_WARNINGS)))
14
+ #define _CRT_SECURE_NO_WARNINGS
15
+ #endif
16
+
17
+ #if defined(__APPLE__) || defined(IOAPI_NO_64)
18
+ // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
19
+ #define FOPEN_FUNC(filename, mode) fopen(filename, mode)
20
+ #define FTELLO_FUNC(stream) ftello(stream)
21
+ #define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin)
22
+ #else
23
+ #define FOPEN_FUNC(filename, mode) fopen64(filename, mode)
24
+ #define FTELLO_FUNC(stream) ftello64(stream)
25
+ #define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin)
26
+ #endif
27
+
28
+
29
+ #include "ioapi.h"
30
+
31
+ voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)
32
+ {
33
+ if (pfilefunc->zfile_func64.zopen64_file != NULL)
34
+ return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode);
35
+ else
36
+ {
37
+ return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode);
38
+ }
39
+ }
40
+
41
+ long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)
42
+ {
43
+ if (pfilefunc->zfile_func64.zseek64_file != NULL)
44
+ return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin);
45
+ else
46
+ {
47
+ uLong offsetTruncated = (uLong)offset;
48
+ if (offsetTruncated != offset)
49
+ return -1;
50
+ else
51
+ return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin);
52
+ }
53
+ }
54
+
55
+ ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)
56
+ {
57
+ if (pfilefunc->zfile_func64.zseek64_file != NULL)
58
+ return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream);
59
+ else
60
+ {
61
+ uLong tell_uLong = (uLong)(*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream);
62
+ if ((tell_uLong) == MAXU32)
63
+ return (ZPOS64_T)-1;
64
+ else
65
+ return tell_uLong;
66
+ }
67
+ }
68
+
69
+ void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32)
70
+ {
71
+ p_filefunc64_32->zfile_func64.zopen64_file = NULL;
72
+ p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file;
73
+ p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
74
+ p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file;
75
+ p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file;
76
+ p_filefunc64_32->zfile_func64.ztell64_file = NULL;
77
+ p_filefunc64_32->zfile_func64.zseek64_file = NULL;
78
+ p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file;
79
+ p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
80
+ p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque;
81
+ p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file;
82
+ p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file;
83
+ }
84
+
85
+
86
+
87
+ static voidpf ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode));
88
+ static uLong ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size));
89
+ static uLong ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size));
90
+ static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream));
91
+ static long ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
92
+ static int ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream));
93
+ static int ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream));
94
+
95
+ static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode)
96
+ {
97
+ (void)opaque;
98
+ FILE* file = NULL;
99
+ const char* mode_fopen = NULL;
100
+ if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
101
+ mode_fopen = "rb";
102
+ else
103
+ if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
104
+ mode_fopen = "r+b";
105
+ else
106
+ if (mode & ZLIB_FILEFUNC_MODE_CREATE)
107
+ mode_fopen = "wb";
108
+
109
+ if ((filename!=NULL) && (mode_fopen != NULL))
110
+ file = fopen(filename, mode_fopen);
111
+ return file;
112
+ }
113
+
114
+ static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode)
115
+ {
116
+ (void)opaque;
117
+ FILE* file = NULL;
118
+ const char* mode_fopen = NULL;
119
+ if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
120
+ mode_fopen = "rb";
121
+ else
122
+ if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
123
+ mode_fopen = "r+b";
124
+ else
125
+ if (mode & ZLIB_FILEFUNC_MODE_CREATE)
126
+ mode_fopen = "wb";
127
+
128
+ if ((filename!=NULL) && (mode_fopen != NULL))
129
+ file = FOPEN_FUNC((const char*)filename, mode_fopen);
130
+ return file;
131
+ }
132
+
133
+
134
+ static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size)
135
+ {
136
+ (void)opaque;
137
+ uLong ret;
138
+ ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
139
+ return ret;
140
+ }
141
+
142
+ static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size)
143
+ {
144
+ (void)opaque;
145
+ uLong ret;
146
+ ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
147
+ return ret;
148
+ }
149
+
150
+ static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream)
151
+ {
152
+ (void)opaque;
153
+ long ret;
154
+ ret = ftell((FILE *)stream);
155
+ return ret;
156
+ }
157
+
158
+
159
+ static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream)
160
+ {
161
+ (void)opaque;
162
+ ZPOS64_T ret;
163
+ ret = (ZPOS64_T)FTELLO_FUNC((FILE *)stream);
164
+ return ret;
165
+ }
166
+
167
+ static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin)
168
+ {
169
+ (void)opaque;
170
+ int fseek_origin=0;
171
+ long ret;
172
+ switch (origin)
173
+ {
174
+ case ZLIB_FILEFUNC_SEEK_CUR :
175
+ fseek_origin = SEEK_CUR;
176
+ break;
177
+ case ZLIB_FILEFUNC_SEEK_END :
178
+ fseek_origin = SEEK_END;
179
+ break;
180
+ case ZLIB_FILEFUNC_SEEK_SET :
181
+ fseek_origin = SEEK_SET;
182
+ break;
183
+ default: return -1;
184
+ }
185
+ ret = 0;
186
+ if (fseek((FILE *)stream, (long)offset, fseek_origin) != 0)
187
+ ret = -1;
188
+ return ret;
189
+ }
190
+
191
+ static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)
192
+ {
193
+ (void)opaque;
194
+ int fseek_origin=0;
195
+ long ret;
196
+ switch (origin)
197
+ {
198
+ case ZLIB_FILEFUNC_SEEK_CUR :
199
+ fseek_origin = SEEK_CUR;
200
+ break;
201
+ case ZLIB_FILEFUNC_SEEK_END :
202
+ fseek_origin = SEEK_END;
203
+ break;
204
+ case ZLIB_FILEFUNC_SEEK_SET :
205
+ fseek_origin = SEEK_SET;
206
+ break;
207
+ default: return -1;
208
+ }
209
+ ret = 0;
210
+
211
+ if(FSEEKO_FUNC((FILE *)stream, (long)offset, fseek_origin) != 0)
212
+ ret = -1;
213
+
214
+ return ret;
215
+ }
216
+
217
+
218
+ static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream)
219
+ {
220
+ (void)opaque;
221
+ int ret;
222
+ ret = fclose((FILE *)stream);
223
+ return ret;
224
+ }
225
+
226
+ static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream)
227
+ {
228
+ (void)opaque;
229
+ int ret;
230
+ ret = ferror((FILE *)stream);
231
+ return ret;
232
+ }
233
+
234
+ void fill_fopen_filefunc (pzlib_filefunc_def)
235
+ zlib_filefunc_def* pzlib_filefunc_def;
236
+ {
237
+ pzlib_filefunc_def->zopen_file = fopen_file_func;
238
+ pzlib_filefunc_def->zread_file = fread_file_func;
239
+ pzlib_filefunc_def->zwrite_file = fwrite_file_func;
240
+ pzlib_filefunc_def->ztell_file = ftell_file_func;
241
+ pzlib_filefunc_def->zseek_file = fseek_file_func;
242
+ pzlib_filefunc_def->zclose_file = fclose_file_func;
243
+ pzlib_filefunc_def->zerror_file = ferror_file_func;
244
+ pzlib_filefunc_def->opaque = NULL;
245
+ }
246
+
247
+ void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def)
248
+ {
249
+ pzlib_filefunc_def->zopen64_file = fopen64_file_func;
250
+ pzlib_filefunc_def->zread_file = fread_file_func;
251
+ pzlib_filefunc_def->zwrite_file = fwrite_file_func;
252
+ pzlib_filefunc_def->ztell64_file = ftell64_file_func;
253
+ pzlib_filefunc_def->zseek64_file = fseek64_file_func;
254
+ pzlib_filefunc_def->zclose_file = fclose_file_func;
255
+ pzlib_filefunc_def->zerror_file = ferror_file_func;
256
+ pzlib_filefunc_def->opaque = NULL;
257
+ }