libmspack 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.travis.yml +5 -0
- data/.yardopts +1 -0
- data/Gemfile +4 -0
- data/README.md +75 -0
- data/Rakefile +22 -0
- data/UNLICENSE +24 -0
- data/ext/Rakefile +16 -0
- data/ext/i386-windows/libmspack.dll +0 -0
- data/ext/libmspack/AUTHORS +12 -0
- data/ext/libmspack/COPYING.LIB +504 -0
- data/ext/libmspack/ChangeLog +491 -0
- data/ext/libmspack/Makefile.am +100 -0
- data/ext/libmspack/NEWS +0 -0
- data/ext/libmspack/README +130 -0
- data/ext/libmspack/TODO +8 -0
- data/ext/libmspack/cleanup.sh +9 -0
- data/ext/libmspack/configure.ac +50 -0
- data/ext/libmspack/debian/changelog +6 -0
- data/ext/libmspack/debian/control +14 -0
- data/ext/libmspack/debian/rules +101 -0
- data/ext/libmspack/doc/Doxyfile.in +22 -0
- data/ext/libmspack/doc/Makefile.in +14 -0
- data/ext/libmspack/doc/szdd_kwaj_format.html +331 -0
- data/ext/libmspack/libmspack.pc.in +10 -0
- data/ext/libmspack/mspack/cab.h +127 -0
- data/ext/libmspack/mspack/cabc.c +24 -0
- data/ext/libmspack/mspack/cabd.c +1444 -0
- data/ext/libmspack/mspack/chm.h +122 -0
- data/ext/libmspack/mspack/chmc.c +24 -0
- data/ext/libmspack/mspack/chmd.c +1392 -0
- data/ext/libmspack/mspack/crc32.c +95 -0
- data/ext/libmspack/mspack/crc32.h +17 -0
- data/ext/libmspack/mspack/des.h +15 -0
- data/ext/libmspack/mspack/hlp.h +33 -0
- data/ext/libmspack/mspack/hlpc.c +24 -0
- data/ext/libmspack/mspack/hlpd.c +24 -0
- data/ext/libmspack/mspack/kwaj.h +118 -0
- data/ext/libmspack/mspack/kwajc.c +24 -0
- data/ext/libmspack/mspack/kwajd.c +561 -0
- data/ext/libmspack/mspack/lit.h +35 -0
- data/ext/libmspack/mspack/litc.c +24 -0
- data/ext/libmspack/mspack/litd.c +24 -0
- data/ext/libmspack/mspack/lzss.h +66 -0
- data/ext/libmspack/mspack/lzssd.c +93 -0
- data/ext/libmspack/mspack/lzx.h +221 -0
- data/ext/libmspack/mspack/lzxc.c +18 -0
- data/ext/libmspack/mspack/lzxd.c +895 -0
- data/ext/libmspack/mspack/mspack.def +28 -0
- data/ext/libmspack/mspack/mspack.h +2353 -0
- data/ext/libmspack/mspack/mszip.h +126 -0
- data/ext/libmspack/mspack/mszipc.c +18 -0
- data/ext/libmspack/mspack/mszipd.c +514 -0
- data/ext/libmspack/mspack/oab.h +60 -0
- data/ext/libmspack/mspack/oabc.c +24 -0
- data/ext/libmspack/mspack/oabd.c +408 -0
- data/ext/libmspack/mspack/qtm.h +128 -0
- data/ext/libmspack/mspack/qtmc.c +18 -0
- data/ext/libmspack/mspack/qtmd.c +489 -0
- data/ext/libmspack/mspack/readbits.h +207 -0
- data/ext/libmspack/mspack/readhuff.h +173 -0
- data/ext/libmspack/mspack/sha.h +15 -0
- data/ext/libmspack/mspack/system.c +239 -0
- data/ext/libmspack/mspack/system.h +124 -0
- data/ext/libmspack/mspack/szdd.h +39 -0
- data/ext/libmspack/mspack/szddc.c +24 -0
- data/ext/libmspack/mspack/szddd.c +247 -0
- data/ext/libmspack/rebuild.sh +8 -0
- data/ext/libmspack/test/cabd_c10 +19 -0
- data/ext/libmspack/test/cabd_compare +34 -0
- data/ext/libmspack/test/cabd_md5.c +161 -0
- data/ext/libmspack/test/cabd_memory.c +179 -0
- data/ext/libmspack/test/cabd_test.c +386 -0
- data/ext/libmspack/test/cabrip.c +81 -0
- data/ext/libmspack/test/chmd_compare +38 -0
- data/ext/libmspack/test/chmd_find.c +95 -0
- data/ext/libmspack/test/chmd_md5.c +67 -0
- data/ext/libmspack/test/chmd_order.c +144 -0
- data/ext/libmspack/test/chminfo.c +284 -0
- data/ext/libmspack/test/chmx.c +216 -0
- data/ext/libmspack/test/error.h +22 -0
- data/ext/libmspack/test/expand.c +79 -0
- data/ext/libmspack/test/md5.c +457 -0
- data/ext/libmspack/test/md5.h +165 -0
- data/ext/libmspack/test/md5_fh.h +123 -0
- data/ext/libmspack/test/msdecompile_md5 +24 -0
- data/ext/libmspack/test/msexpand_md5 +39 -0
- data/ext/libmspack/test/multifh.c +435 -0
- data/ext/libmspack/test/oabx.c +41 -0
- data/ext/libmspack/test/test_files/cabd/1.pl +84 -0
- data/ext/libmspack/test/test_files/cabd/2.pl +75 -0
- data/ext/libmspack/test/test_files/cabd/bad_folderindex.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/bad_nofiles.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/bad_nofolders.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/bad_signature.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/multi_basic_pt1.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/multi_basic_pt2.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/multi_basic_pt3.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/multi_basic_pt4.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/multi_basic_pt5.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/normal_255c_filename.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/normal_2files_1folder.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_nodata.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_nofiles.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_nofolder.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_shortextheader.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_shortfile1.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_shortfile2.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_shortfolder.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_shortheader.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_nofname.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_noninfo.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_nonname.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_nopinfo.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_nopname.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_shortfname.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_shortninfo.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_shortnname.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_shortpinfo.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_shortpname.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/reserve_---.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/reserve_--D.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/reserve_-F-.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/reserve_-FD.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/reserve_H--.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/reserve_H-D.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/reserve_HF-.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/reserve_HFD.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/search_basic.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/search_tricky1.cab +0 -0
- data/ext/libmspack/winbuild.sh +26 -0
- data/ext/x86_64-windows/libmspack.dll +0 -0
- data/lib/libmspack/constants.rb +9 -0
- data/lib/libmspack/exceptions.rb +12 -0
- data/lib/libmspack/mscab.rb +722 -0
- data/lib/libmspack/mschm.rb +301 -0
- data/lib/libmspack/mshlp.rb +15 -0
- data/lib/libmspack/mskwaj.rb +124 -0
- data/lib/libmspack/mslit.rb +18 -0
- data/lib/libmspack/msoab.rb +36 -0
- data/lib/libmspack/mspack.rb +208 -0
- data/lib/libmspack/msszdd.rb +81 -0
- data/lib/libmspack/system.rb +84 -0
- data/lib/libmspack/version.rb +4 -0
- data/lib/libmspack.rb +121 -0
- data/libmspack.gemspec +33 -0
- data/spec/libmspack_spec.rb +26 -0
- data/spec/spec_helper.rb +5 -0
- metadata +309 -0
@@ -0,0 +1,301 @@
|
|
1
|
+
module LibMsPack
|
2
|
+
module MsChm
|
3
|
+
module Constants
|
4
|
+
|
5
|
+
MSCHMC_ENDLIST = 0
|
6
|
+
MSCHMC_UNCOMP = 1
|
7
|
+
MSCHMC_MSCOMP = 2
|
8
|
+
|
9
|
+
MSCHMC_PARAM_TIMESTAMP = 0
|
10
|
+
MSCHMC_PARAM_LANGUAGE = 1
|
11
|
+
MSCHMC_PARAM_LZXWINDOW = 2
|
12
|
+
MSCHMC_PARAM_DENSITY = 3
|
13
|
+
MSCHMC_PARAM_INDEX = 4
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
class MsChmcFile < FFI::Struct
|
18
|
+
layout({
|
19
|
+
:section => :int,
|
20
|
+
:filename => :string,
|
21
|
+
:chm_filename => :string,
|
22
|
+
:length => :off_t
|
23
|
+
})
|
24
|
+
|
25
|
+
def section
|
26
|
+
self[:section]
|
27
|
+
end
|
28
|
+
|
29
|
+
def filename
|
30
|
+
self[:filename]
|
31
|
+
end
|
32
|
+
|
33
|
+
def chm_filename
|
34
|
+
self[:chm_filename]
|
35
|
+
end
|
36
|
+
|
37
|
+
def length
|
38
|
+
self[:length]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class MsChmdHeader < FFI::Struct
|
43
|
+
end
|
44
|
+
|
45
|
+
class MsChmdSection < FFI::Struct
|
46
|
+
layout({
|
47
|
+
:chm => MsChmdHeader.ptr,
|
48
|
+
:id => :uint
|
49
|
+
})
|
50
|
+
|
51
|
+
def chm
|
52
|
+
return nil if self[:chm].pointer.address.zero?
|
53
|
+
self[:chm]
|
54
|
+
end
|
55
|
+
|
56
|
+
def id
|
57
|
+
self[:id]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class MsChmdFile < FFI::Struct
|
62
|
+
layout({
|
63
|
+
:next => MsChmdFile.ptr,
|
64
|
+
:section => MsChmdSection.ptr,
|
65
|
+
:offset => :off_t,
|
66
|
+
:length => :off_t,
|
67
|
+
:filename => :string
|
68
|
+
})
|
69
|
+
|
70
|
+
def next
|
71
|
+
return nil if self[:next].pointer.address.zero?
|
72
|
+
self[:next]
|
73
|
+
end
|
74
|
+
|
75
|
+
def section
|
76
|
+
return nil if self[:section].pointer.address.zero?
|
77
|
+
self[:section]
|
78
|
+
end
|
79
|
+
|
80
|
+
def offset
|
81
|
+
self[:offset]
|
82
|
+
end
|
83
|
+
|
84
|
+
def length
|
85
|
+
self[:length]
|
86
|
+
end
|
87
|
+
|
88
|
+
def filename
|
89
|
+
self[:filename]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class MsChmdSecUncompressed < FFI::Struct
|
94
|
+
layout({
|
95
|
+
:base => MsChmdSection,
|
96
|
+
:offset => :off_t
|
97
|
+
})
|
98
|
+
|
99
|
+
def base
|
100
|
+
self[:base]
|
101
|
+
end
|
102
|
+
|
103
|
+
def offset
|
104
|
+
self[:offset]
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
class MsChmdSecMscompressed < FFI::Struct
|
109
|
+
layout({
|
110
|
+
:base => MsChmdSection,
|
111
|
+
:content => MsChmdFile.ptr,
|
112
|
+
:control => MsChmdFile.ptr,
|
113
|
+
:rtable => MsChmdFile.ptr,
|
114
|
+
:spaninfo => MsChmdFile.ptr
|
115
|
+
})
|
116
|
+
|
117
|
+
def base
|
118
|
+
self[:base]
|
119
|
+
end
|
120
|
+
|
121
|
+
def content
|
122
|
+
return nil if self[:content].pointer.address.zero?
|
123
|
+
self[:content]
|
124
|
+
end
|
125
|
+
|
126
|
+
def control
|
127
|
+
return nil if self[:control].pointer.address.zero?
|
128
|
+
self[:control]
|
129
|
+
end
|
130
|
+
|
131
|
+
def rtable
|
132
|
+
return nil if self[:rtable].pointer.address.zero?
|
133
|
+
self[:rtable]
|
134
|
+
end
|
135
|
+
|
136
|
+
def spaninfo
|
137
|
+
return nil if self[:spaninfo].pointer.address.zero?
|
138
|
+
self[:spaninfo]
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
class MsChmdHeader < FFI::Struct
|
143
|
+
layout({
|
144
|
+
:version => :uint,
|
145
|
+
:timestamp => :uint,
|
146
|
+
:language => :uint,
|
147
|
+
:filename => :string,
|
148
|
+
:length => :off_t,
|
149
|
+
:files => MsChmdFile.ptr,
|
150
|
+
:sysfiles => MsChmdFile.ptr,
|
151
|
+
:sec0 => MsChmdSecUncompressed,
|
152
|
+
:sec1 => MsChmdSecMscompressed,
|
153
|
+
:dir_offset => :off_t,
|
154
|
+
:num_chunks => :uint,
|
155
|
+
:chunk_size => :uint,
|
156
|
+
:density => :uint,
|
157
|
+
:depth => :uint,
|
158
|
+
:index_root => :uint,
|
159
|
+
:first_pmgl => :uint,
|
160
|
+
:last_pmgl => :uint,
|
161
|
+
:chunk_cache => :pointer
|
162
|
+
})
|
163
|
+
|
164
|
+
def version
|
165
|
+
self[:version]
|
166
|
+
end
|
167
|
+
|
168
|
+
def timestamp
|
169
|
+
self[:timestamp]
|
170
|
+
end
|
171
|
+
|
172
|
+
def language
|
173
|
+
self[:language]
|
174
|
+
end
|
175
|
+
|
176
|
+
def filename
|
177
|
+
self[:filename]
|
178
|
+
end
|
179
|
+
|
180
|
+
def length
|
181
|
+
self[:length]
|
182
|
+
end
|
183
|
+
|
184
|
+
def files
|
185
|
+
return nil if self[:files].pointer.address.zero?
|
186
|
+
self[:files]
|
187
|
+
end
|
188
|
+
|
189
|
+
def sysfiles
|
190
|
+
return nil if self[:sysfiles].pointer.address.zero?
|
191
|
+
self[:sysfiles]
|
192
|
+
end
|
193
|
+
|
194
|
+
def sec0
|
195
|
+
self[:sec0]
|
196
|
+
end
|
197
|
+
|
198
|
+
def sec1
|
199
|
+
self[:sec1]
|
200
|
+
end
|
201
|
+
|
202
|
+
def dir_offset
|
203
|
+
self[:dir_offset]
|
204
|
+
end
|
205
|
+
|
206
|
+
def num_chunks
|
207
|
+
self[:num_chunks]
|
208
|
+
end
|
209
|
+
|
210
|
+
def chunk_size
|
211
|
+
self[:chunk_size]
|
212
|
+
end
|
213
|
+
|
214
|
+
def density
|
215
|
+
self[:density]
|
216
|
+
end
|
217
|
+
|
218
|
+
def depth
|
219
|
+
self[:depth]
|
220
|
+
end
|
221
|
+
|
222
|
+
def index_root
|
223
|
+
self[:index_root]
|
224
|
+
end
|
225
|
+
|
226
|
+
def first_pmgl
|
227
|
+
self[:first_pmgl]
|
228
|
+
end
|
229
|
+
|
230
|
+
def last_pmgl
|
231
|
+
self[:last_pmgl]
|
232
|
+
end
|
233
|
+
|
234
|
+
def chunk_cache
|
235
|
+
return nil if self[:chunk_cache].pointer.address.zero?
|
236
|
+
self[:chunk_cache]
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
class MsChmCompressor < FFI::Struct
|
241
|
+
layout({
|
242
|
+
:generate => callback([ MsChmCompressor.ptr, MsChmcFile.ptr, :string ], :int),
|
243
|
+
:use_temporary_file => callback([ MsChmCompressor.ptr, :int, :string ], :int),
|
244
|
+
:set_param => callback([ MsChmCompressor.ptr, :int, :uint ], :int),
|
245
|
+
:last_error => callback([ MsChmCompressor.ptr ], :int)
|
246
|
+
})
|
247
|
+
|
248
|
+
def generate(compressor, fileList, outputFile)
|
249
|
+
self[:generate].call(compressor, fileList, outputFile)
|
250
|
+
end
|
251
|
+
|
252
|
+
def use_temporary_file(compressor, useTempFile, tempFile)
|
253
|
+
self[:use_temporary_file].call(compressor, useTempFile, tempFile)
|
254
|
+
end
|
255
|
+
|
256
|
+
def set_param(compressor, param, value)
|
257
|
+
self[:set_param].call(compressor, param, value)
|
258
|
+
end
|
259
|
+
|
260
|
+
def last_error(compressor)
|
261
|
+
self[:last_error].call(compressor)
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
class MsChmDecompressor < FFI::Struct
|
266
|
+
layout({
|
267
|
+
:open => callback([ MsChmDecompressor.ptr, :string ], MsChmdHeader.ptr),
|
268
|
+
:close => callback([ MsChmDecompressor.ptr, MsChmdHeader.ptr ], :void),
|
269
|
+
:extract => callback([ MsChmDecompressor.ptr, MsChmdFile.ptr, :string ], :int),
|
270
|
+
:last_error => callback([ MsChmDecompressor.ptr ], :int),
|
271
|
+
:fast_open => callback([ MsChmDecompressor.ptr, :string ], MsChmdHeader.ptr),
|
272
|
+
:fast_find => callback([ MsChmDecompressor.ptr, MsChmdHeader.ptr, :string, MsChmdFile.ptr, :int ], :int)
|
273
|
+
})
|
274
|
+
|
275
|
+
def open(decompressor, filename)
|
276
|
+
self[:open].call(decompressor, filename)
|
277
|
+
end
|
278
|
+
|
279
|
+
def close(decompressor, chm)
|
280
|
+
self[:close].call(decompressor, chm)
|
281
|
+
end
|
282
|
+
|
283
|
+
def extract(decompressor, file, filename)
|
284
|
+
self[:extract].call(decompressor, file, filename)
|
285
|
+
end
|
286
|
+
|
287
|
+
def last_error(decompressor)
|
288
|
+
self[:last_error].call(decompressor)
|
289
|
+
end
|
290
|
+
|
291
|
+
def fast_open(decompressor, filename)
|
292
|
+
self[:fast_open].call(decompressor, filename)
|
293
|
+
end
|
294
|
+
|
295
|
+
def fast_find(decompressor, chm, filename, file, size)
|
296
|
+
self[:fast_find].call(decompressor, chm, filename, file, size)
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
end
|
301
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
module LibMsPack
|
2
|
+
module MsKwaj
|
3
|
+
module Constants
|
4
|
+
|
5
|
+
MSKWAJC_PARAM_COMP_TYPE = 0
|
6
|
+
MSKWAJC_PARAM_INCLUDE_LENGTH = 1
|
7
|
+
|
8
|
+
MSKWAJ_COMP_NONE = 0
|
9
|
+
MSKWAJ_COMP_XOR = 1
|
10
|
+
MSKWAJ_COMP_SZDD = 2
|
11
|
+
MSKWAJ_COMP_LZH = 3
|
12
|
+
MSKWAJ_COMP_MSZIP = 4
|
13
|
+
|
14
|
+
MSKWAJ_HDR_HASLENGTH = 0x01
|
15
|
+
MSKWAJ_HDR_HASUNKNOWN1 = 0x02
|
16
|
+
MSKWAJ_HDR_HASUNKNOWN2 = 0x04
|
17
|
+
MSKWAJ_HDR_HASFILENAME = 0x08
|
18
|
+
MSKWAJ_HDR_HASFILEEXT = 0x10
|
19
|
+
MSKWAJ_HDR_HASEXTRATEXT = 0x20
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
class MsKwajdHeader < FFI::Struct
|
24
|
+
layout({
|
25
|
+
:comp_type => :ushort,
|
26
|
+
:data_offset => :off_t,
|
27
|
+
:headers => :int,
|
28
|
+
:length => :off_t,
|
29
|
+
:filename => :string,
|
30
|
+
:extra => :pointer,
|
31
|
+
:extra_length => :ushort
|
32
|
+
})
|
33
|
+
|
34
|
+
def comp_type
|
35
|
+
self[:comp_type]
|
36
|
+
end
|
37
|
+
|
38
|
+
def data_offset
|
39
|
+
self[:data_offset]
|
40
|
+
end
|
41
|
+
|
42
|
+
def headers
|
43
|
+
self[:headers]
|
44
|
+
end
|
45
|
+
|
46
|
+
def length
|
47
|
+
self[:length]
|
48
|
+
end
|
49
|
+
|
50
|
+
def filename
|
51
|
+
self[:filename]
|
52
|
+
end
|
53
|
+
|
54
|
+
def extra
|
55
|
+
self[:extra]
|
56
|
+
end
|
57
|
+
|
58
|
+
def extra_length
|
59
|
+
self[:extra_length]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class MsKwajCompressor < FFI::Struct
|
64
|
+
layout({
|
65
|
+
:compress => callback([ :pointer, :string, :string, :off_t ], :int),
|
66
|
+
:set_param => callback([ :pointer, :int, :uint ], :int),
|
67
|
+
:set_filename => callback([ :pointer, :string ], :int),
|
68
|
+
:set_extra_data => callback([ :pointer, :pointer, :uint ], :int),
|
69
|
+
:last_error => callback([ :pointer ], :int)
|
70
|
+
})
|
71
|
+
|
72
|
+
def compress
|
73
|
+
self[:compress]
|
74
|
+
end
|
75
|
+
|
76
|
+
def set_param
|
77
|
+
self[:set_param]
|
78
|
+
end
|
79
|
+
|
80
|
+
def set_filename
|
81
|
+
self[:set_filename]
|
82
|
+
end
|
83
|
+
|
84
|
+
def set_extra_data
|
85
|
+
self[:set_extra_data]
|
86
|
+
end
|
87
|
+
|
88
|
+
def last_error
|
89
|
+
self[:last_error]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class MsKwajDecompressor < FFI::Struct
|
94
|
+
layout({
|
95
|
+
:open => callback([ :pointer, :string ], :pointer),
|
96
|
+
:close => callback([ :pointer, :pointer ], :void),
|
97
|
+
:extract => callback([ :pointer, :pointer, :string ], :int),
|
98
|
+
:decompress => callback([ :pointer, :string, :string ], :int),
|
99
|
+
:last_error => callback([ :pointer ], :int)
|
100
|
+
})
|
101
|
+
|
102
|
+
def open
|
103
|
+
self[:open]
|
104
|
+
end
|
105
|
+
|
106
|
+
def close
|
107
|
+
self[:close]
|
108
|
+
end
|
109
|
+
|
110
|
+
def extract
|
111
|
+
self[:extract]
|
112
|
+
end
|
113
|
+
|
114
|
+
def decompress
|
115
|
+
self[:decompress]
|
116
|
+
end
|
117
|
+
|
118
|
+
def last_error
|
119
|
+
self[:last_error]
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module LibMsPack
|
2
|
+
module MsOab
|
3
|
+
class MsoabCompressor < FFI::Struct
|
4
|
+
layout({
|
5
|
+
:compress => callback([ :pointer, :string, :string ], :int),
|
6
|
+
:compress_incremental => callback([ :pointer, :string, :string, :string ], :int)
|
7
|
+
})
|
8
|
+
|
9
|
+
def compress
|
10
|
+
self[:compress]
|
11
|
+
end
|
12
|
+
|
13
|
+
def compress_incremental
|
14
|
+
self[:compress_incremental]
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
class MsoabDecompressor < FFI::Struct
|
20
|
+
layout({
|
21
|
+
:decompress => callback([ :pointer, :string, :string ], :int),
|
22
|
+
:decompress_incremental => callback([ :pointer, :string, :string, :string ], :int)
|
23
|
+
})
|
24
|
+
|
25
|
+
def decompress
|
26
|
+
self[:decompress]
|
27
|
+
end
|
28
|
+
|
29
|
+
def decompress_incremental
|
30
|
+
self[:decompress_incremental]
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,208 @@
|
|
1
|
+
module LibMsPack
|
2
|
+
module MsPack
|
3
|
+
module Constants
|
4
|
+
# Pass to #Version to get the overall library version.
|
5
|
+
MSPACK_VER_LIBRARY = 0
|
6
|
+
# Pass to #Version to get the MsPackSystem version.
|
7
|
+
MSPACK_VER_SYSTEM = 1
|
8
|
+
# Pass to #Version to get the MsCabDecompressor version.
|
9
|
+
MSPACK_VER_MSCABD = 2
|
10
|
+
# Pass to #Version to get the MsCabCompressor version.
|
11
|
+
MSPACK_VER_MSCABC = 3
|
12
|
+
# Pass to #Version to get the MsChmDecompressor version.
|
13
|
+
MSPACK_VER_MSCHMD = 4
|
14
|
+
# Pass to #Version to get the MsChmCompressor version.
|
15
|
+
MSPACK_VER_MSCHMC = 5
|
16
|
+
# Pass to #Version to get the MsLitDecompressor version.
|
17
|
+
MSPACK_VER_MSLITD = 6
|
18
|
+
# Pass to #Version to get the MsLitCompressor version.
|
19
|
+
MSPACK_VER_MSLITC = 7
|
20
|
+
# Pass to #Version to get the MsHlpDecompressor version.
|
21
|
+
MSPACK_VER_MSHLPD = 8
|
22
|
+
# Pass to #Version to get the MsHlpCompressor version.
|
23
|
+
MSPACK_VER_MSHLPC = 9
|
24
|
+
# Pass to #Version to get the MsSzddDecompressor version.
|
25
|
+
MSPACK_VER_MSSZDDD = 10
|
26
|
+
# Pass to #Version to get the MsSzddCompressor version.
|
27
|
+
MSPACK_VER_MSSZDDC = 11
|
28
|
+
# Pass to #Version to get the MsKwajDecompressor version.
|
29
|
+
MSPACK_VER_MSKWAJD = 12
|
30
|
+
# Pass to #Version to get the MsKwajCompressor version.
|
31
|
+
MSPACK_VER_MSKWAJC = 13
|
32
|
+
# Pass to #Version to get the MsOabDecompressor version.
|
33
|
+
MSPACK_VER_MSOABD = 14
|
34
|
+
# Pass to #Version to get the MsOabCompressor version.
|
35
|
+
MSPACK_VER_MSOABC = 15
|
36
|
+
|
37
|
+
# MsPackSystem#open mode: open existing file for reading
|
38
|
+
MSPACK_SYS_OPEN_READ = 0
|
39
|
+
# MsPackSystem#open mode: open new file for writing
|
40
|
+
MSPACK_SYS_OPEN_WRITE = 1
|
41
|
+
# MsPackSystem#open mode: open existing file for writing
|
42
|
+
MSPACK_SYS_OPEN_UPDATE = 2
|
43
|
+
# MsPackSystem#open mode: open existing file for writing
|
44
|
+
MSPACK_SYS_OPEN_APPEND = 3
|
45
|
+
|
46
|
+
# MsPackSystem#seek mode: seek relative to start of file
|
47
|
+
MSPACK_SYS_SEEK_START = 0
|
48
|
+
# MsPackSystem#seek mode: seek relative to current offset
|
49
|
+
MSPACK_SYS_SEEK_CUR = 1
|
50
|
+
# MsPackSystem#seek mode: seek relative to end of file
|
51
|
+
MSPACK_SYS_SEEK_END = 2
|
52
|
+
|
53
|
+
# Error code: no error.
|
54
|
+
MSPACK_ERR_OK = 0
|
55
|
+
# Error code: bad arguments to method.
|
56
|
+
MSPACK_ERR_ARGS = 1
|
57
|
+
# Error code: error opening file.
|
58
|
+
MSPACK_ERR_OPEN = 2
|
59
|
+
# Error code: error reading file.
|
60
|
+
MSPACK_ERR_READ = 3
|
61
|
+
# Error code: error writing file.
|
62
|
+
MSPACK_ERR_WRITE = 4
|
63
|
+
# Error code: seek error.
|
64
|
+
MSPACK_ERR_SEEK = 5
|
65
|
+
# Error code: out of memory.
|
66
|
+
MSPACK_ERR_NOMEMORY = 6
|
67
|
+
# Error code: bad "magic id" in file.
|
68
|
+
MSPACK_ERR_SIGNATURE = 7
|
69
|
+
# Error code: bad or corrupt file format.
|
70
|
+
MSPACK_ERR_DATAFORMAT = 8
|
71
|
+
# Error code: bad checksum or CRC.
|
72
|
+
MSPACK_ERR_CHECKSUM = 9
|
73
|
+
# Error code: error during compression.
|
74
|
+
MSPACK_ERR_CRUNCH = 10
|
75
|
+
# Error code: error during decompression.
|
76
|
+
MSPACK_ERR_DECRUNCH = 11
|
77
|
+
end
|
78
|
+
|
79
|
+
# A structure which represents an open file handle.
|
80
|
+
#
|
81
|
+
# The contents of this structure are determined by the implementation of the MsPackSystem#open method.
|
82
|
+
class MsPackFile < FFI::Struct
|
83
|
+
layout({
|
84
|
+
:file => :int,
|
85
|
+
:name => :string
|
86
|
+
})
|
87
|
+
|
88
|
+
def file=(file)
|
89
|
+
self[:file] = file
|
90
|
+
end
|
91
|
+
|
92
|
+
def file
|
93
|
+
self[:file]
|
94
|
+
end
|
95
|
+
|
96
|
+
def name
|
97
|
+
self[:name]
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# A structure which abstracts file I/O and memory management.
|
102
|
+
#
|
103
|
+
# The library always uses the MsPackSystem structure for interaction with the file system and to allocate, free and copy all memory. It also uses it to send literal messages to the library user.
|
104
|
+
#
|
105
|
+
# When the library is compiled normally, passing nil to a compressor or decompressor constructor will result in a default MsPackSystem being used, where all methods are implemented with the standard C library. However, all constructors support being given a custom created MsPackSystem structure, with the library user's own methods. This allows for more abstract interaction, such as reading and writing files directly to memory, or from a network socket or pipe.
|
106
|
+
#
|
107
|
+
# Implementors of an MsPackSystem structure should read all documentation entries for every structure member, and write methods which conform to those standards.
|
108
|
+
class MsPackSystem < FFI::Struct
|
109
|
+
|
110
|
+
layout({
|
111
|
+
:open => callback([ MsPackSystem.ptr, :string, :int ], MsPackFile.ptr),
|
112
|
+
:close => callback([ MsPackFile.ptr ], :void),
|
113
|
+
:read => callback([ MsPackFile.ptr, :buffer_inout, :int ], :int),
|
114
|
+
:write => callback([ MsPackFile.ptr, :buffer_inout, :int ], :int),
|
115
|
+
:seek => callback([ MsPackFile.ptr, :off_t, :int ], :int),
|
116
|
+
:tell => callback([ MsPackFile.ptr ], :off_t),
|
117
|
+
:message => callback([ MsPackFile.ptr, :string, :varargs ], :void),
|
118
|
+
:alloc => callback([ MsPackFile.ptr, :size_t ], :pointer),
|
119
|
+
:free => callback([ :pointer ], :void),
|
120
|
+
:copy => callback([:buffer_in, :buffer_out, :size_t ], :void),
|
121
|
+
:null_ptr => :pointer
|
122
|
+
})
|
123
|
+
|
124
|
+
def open=(cb)
|
125
|
+
self[:open] = cb
|
126
|
+
end
|
127
|
+
|
128
|
+
def open
|
129
|
+
self[:open]
|
130
|
+
end
|
131
|
+
|
132
|
+
def close=(cb)
|
133
|
+
self[:close] = cb
|
134
|
+
end
|
135
|
+
|
136
|
+
def close
|
137
|
+
self[:close]
|
138
|
+
end
|
139
|
+
|
140
|
+
def read=(cb)
|
141
|
+
self[:read] = cb
|
142
|
+
end
|
143
|
+
|
144
|
+
def read
|
145
|
+
self[:read]
|
146
|
+
end
|
147
|
+
|
148
|
+
def write=(cb)
|
149
|
+
self[:write] = cb
|
150
|
+
end
|
151
|
+
|
152
|
+
def write
|
153
|
+
self[:write]
|
154
|
+
end
|
155
|
+
|
156
|
+
def seek=(cb)
|
157
|
+
self[:seek] = cb
|
158
|
+
end
|
159
|
+
|
160
|
+
def seek
|
161
|
+
self[:seek]
|
162
|
+
end
|
163
|
+
|
164
|
+
def tell=(cb)
|
165
|
+
self[:tell] = cb
|
166
|
+
end
|
167
|
+
|
168
|
+
def tell
|
169
|
+
self[:tell]
|
170
|
+
end
|
171
|
+
|
172
|
+
def message=(cb)
|
173
|
+
self[:message] = cb
|
174
|
+
end
|
175
|
+
|
176
|
+
def message
|
177
|
+
self[:message]
|
178
|
+
end
|
179
|
+
|
180
|
+
def alloc=(cb)
|
181
|
+
self[:alloc] = cb
|
182
|
+
end
|
183
|
+
|
184
|
+
def alloc
|
185
|
+
self[:alloc]
|
186
|
+
end
|
187
|
+
|
188
|
+
def free=(cb)
|
189
|
+
self[:free] = cb
|
190
|
+
end
|
191
|
+
|
192
|
+
def free
|
193
|
+
self[:free]
|
194
|
+
end
|
195
|
+
|
196
|
+
def copy=(cb)
|
197
|
+
self[:copy] = cb
|
198
|
+
end
|
199
|
+
|
200
|
+
def copy
|
201
|
+
self[:copy]
|
202
|
+
end
|
203
|
+
|
204
|
+
end
|
205
|
+
|
206
|
+
RubyPackSystem = MsPackSystem.new
|
207
|
+
end
|
208
|
+
end
|