@bravemobile/react-native-code-push 12.4.1 → 13.1.0-beta.0
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/CodePush.podspec +47 -2
- package/README.md +118 -3
- package/THIRD-PARTY-NOTICES +96 -0
- package/android/app/build.gradle +26 -0
- package/android/app/proguard-rules.pro +5 -0
- package/android/app/src/main/cpp/CMakeLists.txt +38 -0
- package/android/app/src/main/cpp/binarypatch_jni.c +181 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/BinaryPatchAttempt.java +92 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/BinaryPatchResult.java +64 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePush.java +46 -11
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushBinaryPatch.java +293 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushConstants.java +25 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushNativeModule.java +79 -88
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateManager.java +159 -4
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateUtils.java +13 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/HDiffPatchNative.java +52 -0
- package/android/app/src/test/java/com/microsoft/codepush/react/CodePushBinaryPatchTest.java +393 -0
- package/android/app/src/test/java/com/microsoft/codepush/react/CodePushUpdateManagerBinaryPatchTest.java +207 -0
- package/android/app/src/test/java/com/microsoft/codepush/react/CodePushUpdateManagerDownloadTest.java +449 -0
- package/android/codepush-export.gradle +115 -0
- package/cli/commands/bundleCommand/bundleCodePush.ts +39 -7
- package/cli/commands/bundleCommand/index.ts +9 -1
- package/cli/commands/releaseCommand/addToReleaseHistory.ts +7 -0
- package/cli/commands/releaseCommand/index.test.ts +118 -0
- package/cli/commands/releaseCommand/index.ts +20 -2
- package/cli/commands/releaseCommand/release.test.ts +582 -0
- package/cli/commands/releaseCommand/release.ts +232 -15
- package/cli/dist/commands/bundleCommand/bundleCodePush.js +26 -7
- package/cli/dist/commands/bundleCommand/index.js +5 -1
- package/cli/dist/commands/releaseCommand/addToReleaseHistory.js +6 -1
- package/cli/dist/commands/releaseCommand/index.js +8 -1
- package/cli/dist/commands/releaseCommand/index.test.js +96 -0
- package/cli/dist/commands/releaseCommand/release.js +165 -17
- package/cli/dist/commands/releaseCommand/release.test.js +367 -0
- package/cli/dist/functions/makeBinaryPatchBundle.js +248 -0
- package/cli/dist/functions/makeBinaryPatchBundle.test.js +321 -0
- package/cli/dist/functions/makeCodePushBundle.js +4 -2
- package/cli/dist/functions/runHermesEmitBinaryCommand.js +98 -27
- package/cli/dist/functions/runHermesEmitBinaryCommand.test.js +100 -0
- package/cli/dist/jest.globalSetup.js +38 -0
- package/cli/dist/utils/binaryPatch.js +86 -0
- package/cli/dist/utils/binaryPatch.test.js +190 -0
- package/cli/functions/makeBinaryPatchBundle.test.ts +410 -0
- package/cli/functions/makeBinaryPatchBundle.ts +367 -0
- package/cli/functions/makeCodePushBundle.ts +4 -2
- package/cli/functions/runHermesEmitBinaryCommand.test.ts +124 -0
- package/cli/functions/runHermesEmitBinaryCommand.ts +112 -26
- package/cli/jest.globalSetup.ts +43 -0
- package/cli/utils/binaryPatch.test.ts +234 -0
- package/cli/utils/binaryPatch.ts +103 -0
- package/cpp/binarypatch/binarypatch_zstd_decompressor.c +187 -0
- package/cpp/binarypatch/binarypatch_zstd_decompressor.h +47 -0
- package/cpp/binarypatch/vendor/HDiffPatch/libHDiffPatch/HPatch/checksum_plugin.h +52 -0
- package/cpp/binarypatch/vendor/HDiffPatch/libHDiffPatch/HPatch/hpatch_mt/hpatch_mt.h +147 -0
- package/cpp/binarypatch/vendor/HDiffPatch/libHDiffPatch/HPatch/patch.c +3315 -0
- package/cpp/binarypatch/vendor/HDiffPatch/libHDiffPatch/HPatch/patch.h +268 -0
- package/cpp/binarypatch/vendor/HDiffPatch/libHDiffPatch/HPatch/patch_private.h +297 -0
- package/cpp/binarypatch/vendor/HDiffPatch/libHDiffPatch/HPatch/patch_types.h +434 -0
- package/cpp/binarypatch/vendor/zstd/common/allocations.h +55 -0
- package/cpp/binarypatch/vendor/zstd/common/bits.h +205 -0
- package/cpp/binarypatch/vendor/zstd/common/bitstream.h +454 -0
- package/cpp/binarypatch/vendor/zstd/common/compiler.h +464 -0
- package/cpp/binarypatch/vendor/zstd/common/cpu.h +249 -0
- package/cpp/binarypatch/vendor/zstd/common/debug.c +30 -0
- package/cpp/binarypatch/vendor/zstd/common/debug.h +107 -0
- package/cpp/binarypatch/vendor/zstd/common/entropy_common.c +340 -0
- package/cpp/binarypatch/vendor/zstd/common/error_private.c +64 -0
- package/cpp/binarypatch/vendor/zstd/common/error_private.h +158 -0
- package/cpp/binarypatch/vendor/zstd/common/fse.h +625 -0
- package/cpp/binarypatch/vendor/zstd/common/fse_decompress.c +315 -0
- package/cpp/binarypatch/vendor/zstd/common/huf.h +277 -0
- package/cpp/binarypatch/vendor/zstd/common/mem.h +422 -0
- package/cpp/binarypatch/vendor/zstd/common/pool.c +371 -0
- package/cpp/binarypatch/vendor/zstd/common/pool.h +81 -0
- package/cpp/binarypatch/vendor/zstd/common/portability_macros.h +171 -0
- package/cpp/binarypatch/vendor/zstd/common/threading.c +182 -0
- package/cpp/binarypatch/vendor/zstd/common/threading.h +142 -0
- package/cpp/binarypatch/vendor/zstd/common/xxhash.c +18 -0
- package/cpp/binarypatch/vendor/zstd/common/xxhash.h +7094 -0
- package/cpp/binarypatch/vendor/zstd/common/zstd_common.c +48 -0
- package/cpp/binarypatch/vendor/zstd/common/zstd_deps.h +123 -0
- package/cpp/binarypatch/vendor/zstd/common/zstd_internal.h +324 -0
- package/cpp/binarypatch/vendor/zstd/common/zstd_trace.h +156 -0
- package/cpp/binarypatch/vendor/zstd/decompress/huf_decompress.c +1944 -0
- package/cpp/binarypatch/vendor/zstd/decompress/zstd_ddict.c +244 -0
- package/cpp/binarypatch/vendor/zstd/decompress/zstd_ddict.h +44 -0
- package/cpp/binarypatch/vendor/zstd/decompress/zstd_decompress.c +2410 -0
- package/cpp/binarypatch/vendor/zstd/decompress/zstd_decompress_block.c +2209 -0
- package/cpp/binarypatch/vendor/zstd/decompress/zstd_decompress_block.h +73 -0
- package/cpp/binarypatch/vendor/zstd/decompress/zstd_decompress_internal.h +240 -0
- package/cpp/binarypatch/vendor/zstd/zstd.h +3206 -0
- package/cpp/binarypatch/vendor/zstd/zstd_errors.h +107 -0
- package/ios/CodePush/CodePush.h +58 -9
- package/ios/CodePush/{CodePush.m → CodePush.mm} +77 -63
- package/ios/CodePush/CodePushBinaryPatch.h +80 -0
- package/ios/CodePush/CodePushBinaryPatch.m +473 -0
- package/ios/CodePush/CodePushPackage.m +183 -2
- package/ios/CodePush/CodePushUpdateUtils.m +49 -1
- package/ios/CodePush.xcodeproj/project.pbxproj +6 -6
- package/package.json +28 -4
- package/react-native.config.js +3 -1
- package/scripts/binary-patch/build-hdiffpatch.sh +86 -0
- package/scripts/export-embedded-bundle.sh +76 -0
- package/src/CodePush.js +190 -96
- package/src/CodePush.test.js +382 -0
- package/src/native/NativeCodePush.ts +162 -0
- package/src/package-mixins.js +24 -11
- package/src/specs/NativeCodePush.ts +43 -0
- package/typings/react-native-code-push.d.ts +77 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushDialog.java +0 -102
- package/src/AlertAdapter.js +0 -24
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
#include "binarypatch_zstd_decompressor.h"
|
|
2
|
+
|
|
3
|
+
#include <stdlib.h>
|
|
4
|
+
#include <string.h>
|
|
5
|
+
|
|
6
|
+
#include "zstd.h"
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* Largest window a decompression session will accept, pinned to the window that the
|
|
10
|
+
* `-c-zstd-21-24` generation options use: no patch this project produces declares a
|
|
11
|
+
* window above 2^24. Keeping the bound at the generation limit means a corrupted
|
|
12
|
+
* frame header that asks for a wider window is rejected before anything is
|
|
13
|
+
* allocated, instead of being answered with an allocation that large - and applying
|
|
14
|
+
* a patch keeps several decompression sessions open at once, so the bound applies
|
|
15
|
+
* several times over. Changing the generation options is a patch format version
|
|
16
|
+
* change, and this bound moves with them.
|
|
17
|
+
*/
|
|
18
|
+
#define BINARYPATCH_ZSTD_WINDOW_LOG_MAX 24
|
|
19
|
+
|
|
20
|
+
/*
|
|
21
|
+
* One decompression session. The input and output buffers are allocated in the
|
|
22
|
+
* same block as the struct (`buffers` is their start) to keep the number of
|
|
23
|
+
* allocations per patch session down.
|
|
24
|
+
*/
|
|
25
|
+
typedef struct {
|
|
26
|
+
const hpatch_TStreamInput* codeStream;
|
|
27
|
+
hpatch_StreamPos_t codeReadPos;
|
|
28
|
+
hpatch_StreamPos_t codeEnd;
|
|
29
|
+
|
|
30
|
+
ZSTD_DStream* dstream;
|
|
31
|
+
ZSTD_inBuffer in;
|
|
32
|
+
size_t inCapacity;
|
|
33
|
+
ZSTD_outBuffer out;
|
|
34
|
+
size_t outReadPos; /* bytes of `out` already handed to the caller */
|
|
35
|
+
|
|
36
|
+
hpatch_dec_error_t decError;
|
|
37
|
+
unsigned char buffers[1]; /* [inCapacity bytes][out.size bytes] */
|
|
38
|
+
} binarypatch_zstd_session;
|
|
39
|
+
|
|
40
|
+
static hpatch_BOOL _zstd_fail(binarypatch_zstd_session* self) {
|
|
41
|
+
if (self->decError == hpatch_dec_ok) {
|
|
42
|
+
self->decError = hpatch_dec_error;
|
|
43
|
+
}
|
|
44
|
+
return hpatch_FALSE;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
static hpatch_BOOL _zstd_is_can_open(const char* compressType) {
|
|
48
|
+
return (0 == strcmp(compressType, BINARYPATCH_ZSTD_COMPRESS_TYPE)) ? hpatch_TRUE : hpatch_FALSE;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
static hpatch_decompressHandle _zstd_open(struct hpatch_TDecompress* decompressPlugin,
|
|
52
|
+
hpatch_StreamPos_t dataSize,
|
|
53
|
+
const struct hpatch_TStreamInput* codeStream,
|
|
54
|
+
hpatch_StreamPos_t code_begin,
|
|
55
|
+
hpatch_StreamPos_t code_end) {
|
|
56
|
+
const size_t inCapacity = ZSTD_DStreamInSize();
|
|
57
|
+
const size_t outCapacity = ZSTD_DStreamOutSize();
|
|
58
|
+
binarypatch_zstd_session* self;
|
|
59
|
+
|
|
60
|
+
/* The uncompressed size is tracked by the caller's patch stream, not here. */
|
|
61
|
+
(void)dataSize;
|
|
62
|
+
|
|
63
|
+
self = (binarypatch_zstd_session*)malloc(sizeof(binarypatch_zstd_session) + inCapacity + outCapacity);
|
|
64
|
+
if (!self) {
|
|
65
|
+
_hpatch_update_decError(decompressPlugin, hpatch_dec_mem_error);
|
|
66
|
+
return 0;
|
|
67
|
+
}
|
|
68
|
+
memset(self, 0, sizeof(binarypatch_zstd_session));
|
|
69
|
+
self->codeStream = codeStream;
|
|
70
|
+
self->codeReadPos = code_begin;
|
|
71
|
+
self->codeEnd = code_end;
|
|
72
|
+
self->in.src = self->buffers;
|
|
73
|
+
self->in.size = 0;
|
|
74
|
+
self->in.pos = 0; /* pos == size: the input buffer starts empty and is refilled on demand */
|
|
75
|
+
self->inCapacity = inCapacity;
|
|
76
|
+
self->out.dst = self->buffers + inCapacity;
|
|
77
|
+
self->out.size = outCapacity;
|
|
78
|
+
self->out.pos = 0;
|
|
79
|
+
self->outReadPos = 0;
|
|
80
|
+
|
|
81
|
+
self->dstream = ZSTD_createDStream();
|
|
82
|
+
if (!self->dstream) {
|
|
83
|
+
free(self);
|
|
84
|
+
_hpatch_update_decError(decompressPlugin, hpatch_dec_open_error);
|
|
85
|
+
return 0;
|
|
86
|
+
}
|
|
87
|
+
/*
|
|
88
|
+
* The window bound is applied here rather than left at zstd's default, and a
|
|
89
|
+
* session that cannot take it is refused: without the bound a corrupted frame
|
|
90
|
+
* header could ask for a much larger window than any patch legitimately needs.
|
|
91
|
+
*/
|
|
92
|
+
if (ZSTD_isError(ZSTD_initDStream(self->dstream)) ||
|
|
93
|
+
ZSTD_isError(ZSTD_DCtx_setParameter(self->dstream, ZSTD_d_windowLogMax,
|
|
94
|
+
BINARYPATCH_ZSTD_WINDOW_LOG_MAX))) {
|
|
95
|
+
ZSTD_freeDStream(self->dstream);
|
|
96
|
+
free(self);
|
|
97
|
+
_hpatch_update_decError(decompressPlugin, hpatch_dec_open_error);
|
|
98
|
+
return 0;
|
|
99
|
+
}
|
|
100
|
+
return self;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
static hpatch_BOOL _zstd_close(struct hpatch_TDecompress* decompressPlugin,
|
|
104
|
+
hpatch_decompressHandle decompressHandle) {
|
|
105
|
+
binarypatch_zstd_session* self = (binarypatch_zstd_session*)decompressHandle;
|
|
106
|
+
hpatch_BOOL result = hpatch_TRUE;
|
|
107
|
+
if (!self) {
|
|
108
|
+
return hpatch_TRUE;
|
|
109
|
+
}
|
|
110
|
+
/* Report the session's failure through the plugin so the caller can read it. */
|
|
111
|
+
if (self->decError != hpatch_dec_ok) {
|
|
112
|
+
_hpatch_update_decError(decompressPlugin, self->decError);
|
|
113
|
+
}
|
|
114
|
+
if (0 != ZSTD_freeDStream(self->dstream)) {
|
|
115
|
+
result = hpatch_FALSE;
|
|
116
|
+
_hpatch_update_decError(decompressPlugin, hpatch_dec_close_error);
|
|
117
|
+
}
|
|
118
|
+
free(self);
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/*
|
|
123
|
+
* Must fill the whole `[out_part_data, out_part_data_end)` range; anything less is
|
|
124
|
+
* an error by the `hpatch_TDecompress` contract.
|
|
125
|
+
*/
|
|
126
|
+
static hpatch_BOOL _zstd_decompress_part(hpatch_decompressHandle decompressHandle,
|
|
127
|
+
unsigned char* out_part_data,
|
|
128
|
+
unsigned char* out_part_data_end) {
|
|
129
|
+
binarypatch_zstd_session* self = (binarypatch_zstd_session*)decompressHandle;
|
|
130
|
+
|
|
131
|
+
while (out_part_data < out_part_data_end) {
|
|
132
|
+
size_t ready = self->out.pos - self->outReadPos;
|
|
133
|
+
size_t ret;
|
|
134
|
+
|
|
135
|
+
if (ready > 0) {
|
|
136
|
+
const size_t wanted = (size_t)(out_part_data_end - out_part_data);
|
|
137
|
+
if (ready > wanted) {
|
|
138
|
+
ready = wanted;
|
|
139
|
+
}
|
|
140
|
+
memcpy(out_part_data, (const unsigned char*)self->out.dst + self->outReadPos, ready);
|
|
141
|
+
out_part_data += ready;
|
|
142
|
+
self->outReadPos += ready;
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (self->in.pos == self->in.size) {
|
|
147
|
+
const hpatch_StreamPos_t remaining = self->codeEnd - self->codeReadPos;
|
|
148
|
+
unsigned char* inBuf = (unsigned char*)self->in.src;
|
|
149
|
+
size_t toRead = self->inCapacity;
|
|
150
|
+
if (remaining < (hpatch_StreamPos_t)toRead) {
|
|
151
|
+
toRead = (size_t)remaining;
|
|
152
|
+
}
|
|
153
|
+
self->in.pos = 0;
|
|
154
|
+
self->in.size = toRead;
|
|
155
|
+
if (toRead > 0) {
|
|
156
|
+
if (!self->codeStream->read(self->codeStream, self->codeReadPos, inBuf, inBuf + toRead)) {
|
|
157
|
+
return _zstd_fail(self);
|
|
158
|
+
}
|
|
159
|
+
self->codeReadPos += toRead;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
self->out.pos = 0;
|
|
164
|
+
self->outReadPos = 0;
|
|
165
|
+
ret = ZSTD_decompressStream(self->dstream, &self->out, &self->in);
|
|
166
|
+
if (ZSTD_isError(ret)) {
|
|
167
|
+
return _zstd_fail(self);
|
|
168
|
+
}
|
|
169
|
+
/*
|
|
170
|
+
* No progress with no input left means the compressed stream ended before
|
|
171
|
+
* the patch asked for its last byte - a truncated or corrupt patch.
|
|
172
|
+
*/
|
|
173
|
+
if (self->out.pos == 0) {
|
|
174
|
+
return _zstd_fail(self);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return hpatch_TRUE;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
void binarypatch_zstd_decompressor_init(hpatch_TDecompress* out_decompressor) {
|
|
181
|
+
memset(out_decompressor, 0, sizeof(hpatch_TDecompress));
|
|
182
|
+
out_decompressor->is_can_open = _zstd_is_can_open;
|
|
183
|
+
out_decompressor->open = _zstd_open;
|
|
184
|
+
out_decompressor->close = _zstd_close;
|
|
185
|
+
out_decompressor->decompress_part = _zstd_decompress_part;
|
|
186
|
+
/* reset_code stays NULL: it is only needed for vcdiff style patches. */
|
|
187
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* zstd decompressor for HDiffPatch.
|
|
3
|
+
*
|
|
4
|
+
* HDiffPatch's patch functions take the decompressor as a plugin, so every codec
|
|
5
|
+
* the appliers must understand has to be supplied through `hpatch_TDecompress`.
|
|
6
|
+
* CodePush patches are always produced with `hdiffz -f -m-6 -c-zstd-21-24`, so
|
|
7
|
+
* zstd is the only codec implemented here; upstream ships a demo header covering
|
|
8
|
+
* a dozen codecs, but pulling that in would drag along headers for codecs the
|
|
9
|
+
* appliers never see.
|
|
10
|
+
*
|
|
11
|
+
* `hpatch_TDecompress` carries a mutable `decError` field, so each patch session
|
|
12
|
+
* must own its instance. Callers therefore declare the struct themselves and
|
|
13
|
+
* initialize it through `binarypatch_zstd_decompressor_init()`.
|
|
14
|
+
*
|
|
15
|
+
* This file and the vendored sources next to it sit outside the platform
|
|
16
|
+
* directories because both platforms compile them: iOS through the podspec at the
|
|
17
|
+
* repository root, Android through externalNativeBuild. One shared copy is what
|
|
18
|
+
* keeps the two appliers from drifting apart.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
#ifndef BINARYPATCH_ZSTD_DECOMPRESSOR_H
|
|
22
|
+
#define BINARYPATCH_ZSTD_DECOMPRESSOR_H
|
|
23
|
+
|
|
24
|
+
#include "libHDiffPatch/HPatch/patch_types.h"
|
|
25
|
+
|
|
26
|
+
#ifdef __cplusplus
|
|
27
|
+
extern "C" {
|
|
28
|
+
#endif
|
|
29
|
+
|
|
30
|
+
/*
|
|
31
|
+
* The `compressType` string that `hdiffz -c-zstd-...` writes into the patch
|
|
32
|
+
* header, and the only value this decompressor accepts.
|
|
33
|
+
*/
|
|
34
|
+
#define BINARYPATCH_ZSTD_COMPRESS_TYPE "zstd"
|
|
35
|
+
|
|
36
|
+
/*
|
|
37
|
+
* Fills `out_decompressor` with the zstd plugin implementation. The struct is
|
|
38
|
+
* fully overwritten, so it needs no prior initialization, and it holds no state
|
|
39
|
+
* that must be released.
|
|
40
|
+
*/
|
|
41
|
+
void binarypatch_zstd_decompressor_init(hpatch_TDecompress* out_decompressor);
|
|
42
|
+
|
|
43
|
+
#ifdef __cplusplus
|
|
44
|
+
}
|
|
45
|
+
#endif
|
|
46
|
+
|
|
47
|
+
#endif /* BINARYPATCH_ZSTD_DECOMPRESSOR_H */
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
//checksum_plugin.h
|
|
2
|
+
// checksum plugin type
|
|
3
|
+
/*
|
|
4
|
+
The MIT License (MIT)
|
|
5
|
+
Copyright (c) 2018-2019 HouSisong
|
|
6
|
+
|
|
7
|
+
Permission is hereby granted, free of charge, to any person
|
|
8
|
+
obtaining a copy of this software and associated documentation
|
|
9
|
+
files (the "Software"), to deal in the Software without
|
|
10
|
+
restriction, including without limitation the rights to use,
|
|
11
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
12
|
+
copies of the Software, and to permit persons to whom the
|
|
13
|
+
Software is furnished to do so, subject to the following
|
|
14
|
+
conditions:
|
|
15
|
+
|
|
16
|
+
The above copyright notice and this permission notice shall be
|
|
17
|
+
included in all copies of the Software.
|
|
18
|
+
|
|
19
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
20
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
21
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
22
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
23
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
24
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
25
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
26
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
|
27
|
+
*/
|
|
28
|
+
#ifndef HPatch_checksum_plugin_h
|
|
29
|
+
#define HPatch_checksum_plugin_h
|
|
30
|
+
#include "patch_types.h"
|
|
31
|
+
#ifdef __cplusplus
|
|
32
|
+
extern "C" {
|
|
33
|
+
#endif
|
|
34
|
+
|
|
35
|
+
typedef void* hpatch_checksumHandle;
|
|
36
|
+
typedef struct hpatch_TChecksum{
|
|
37
|
+
//return type tag; strlen(result)<=hpatch_kMaxPluginTypeLength; (Note:result lifetime)
|
|
38
|
+
const char* (*checksumType)(void); //ascii cstring,cannot contain '&'
|
|
39
|
+
hpatch_size_t (*checksumByteSize)(void); //0<result<=hpatch_kStreamCacheSize
|
|
40
|
+
hpatch_checksumHandle (*open)(struct hpatch_TChecksum* plugin);
|
|
41
|
+
void (*close)(struct hpatch_TChecksum* plugin,hpatch_checksumHandle handle);
|
|
42
|
+
void (*begin)(hpatch_checksumHandle handle); //must support reset
|
|
43
|
+
void (*append)(hpatch_checksumHandle handle,
|
|
44
|
+
const unsigned char* part_data,const unsigned char* part_data_end);
|
|
45
|
+
void (*end)(hpatch_checksumHandle handle,
|
|
46
|
+
unsigned char* checksum,unsigned char* checksum_end);
|
|
47
|
+
} hpatch_TChecksum;
|
|
48
|
+
|
|
49
|
+
#ifdef __cplusplus
|
|
50
|
+
}
|
|
51
|
+
#endif
|
|
52
|
+
#endif
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// hpatch_mt.h
|
|
2
|
+
// hpatch
|
|
3
|
+
/*
|
|
4
|
+
The MIT License (MIT)
|
|
5
|
+
Copyright (c) 2025 HouSisong
|
|
6
|
+
|
|
7
|
+
Permission is hereby granted, free of charge, to any person
|
|
8
|
+
obtaining a copy of this software and associated documentation
|
|
9
|
+
files (the "Software"), to deal in the Software without
|
|
10
|
+
restriction, including without limitation the rights to use,
|
|
11
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
12
|
+
copies of the Software, and to permit persons to whom the
|
|
13
|
+
Software is furnished to do so, subject to the following
|
|
14
|
+
conditions:
|
|
15
|
+
|
|
16
|
+
The above copyright notice and this permission notice shall be
|
|
17
|
+
included in all copies of the Software.
|
|
18
|
+
|
|
19
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
20
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
21
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
22
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
23
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
24
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
25
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
26
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
|
27
|
+
*/
|
|
28
|
+
#ifndef hpatch_mt_h
|
|
29
|
+
#define hpatch_mt_h
|
|
30
|
+
#include "../patch_types.h"
|
|
31
|
+
#ifdef __cplusplus
|
|
32
|
+
extern "C" {
|
|
33
|
+
#endif
|
|
34
|
+
|
|
35
|
+
typedef struct{
|
|
36
|
+
hpatch_byte writeNew_isMT; //0 or 1; if 1, start a thread for write to newData
|
|
37
|
+
hpatch_byte readOld_isMT; //0 or 1; if 1, start a thread for read from oldData
|
|
38
|
+
hpatch_byte readDiff_isMT; //0 or 1; if 1, start a thread for read from diffData
|
|
39
|
+
hpatch_byte decompressDiff_isMT; //0 or 1; if 1, start a thread for decompress diffData
|
|
40
|
+
//patch func run in main thread
|
|
41
|
+
} hpatchMTSets_t;
|
|
42
|
+
|
|
43
|
+
static const hpatchMTSets_t hpatchMTSets_no ={0,0,0,0};
|
|
44
|
+
static const hpatchMTSets_t hpatchMTSets_full={1,1,1,1};
|
|
45
|
+
static hpatch_force_inline
|
|
46
|
+
size_t _hpatchMTSets_threadNum(const hpatchMTSets_t mtsets){
|
|
47
|
+
return mtsets.writeNew_isMT+mtsets.readOld_isMT+mtsets.readDiff_isMT+mtsets.decompressDiff_isMT+1; }
|
|
48
|
+
|
|
49
|
+
static hpatch_force_inline
|
|
50
|
+
hpatchMTSets_t hpatch_getMTSets(hpatch_StreamPos_t newSize,hpatch_StreamPos_t oldSize,hpatch_StreamPos_t diffSize,
|
|
51
|
+
const hpatch_TDecompress* decompressPlugin,size_t kCacheCount,size_t stepMemSize,
|
|
52
|
+
size_t temp_cacheSumSize,size_t maxThreadNum,hpatchMTSets_t mtsets){
|
|
53
|
+
#if (_IS_USED_MULTITHREAD)
|
|
54
|
+
hpatchMTSets_t _hpatch_getMTSets(hpatch_StreamPos_t newSize,hpatch_StreamPos_t oldSize,hpatch_StreamPos_t diffSize,
|
|
55
|
+
const hpatch_TDecompress* decompressPlugin,size_t kCacheCount,
|
|
56
|
+
hpatch_size_t windowOldBufSize,size_t stepMemSize,
|
|
57
|
+
size_t temp_cacheSumSize,size_t maxThreadNum,hpatchMTSets_t mtsets,hpatch_BOOL isWindow);
|
|
58
|
+
if (maxThreadNum<=1) return hpatchMTSets_no;
|
|
59
|
+
return _hpatch_getMTSets(newSize,oldSize,diffSize,decompressPlugin,kCacheCount,0,stepMemSize,
|
|
60
|
+
temp_cacheSumSize,maxThreadNum,mtsets,hpatch_FALSE);
|
|
61
|
+
#else
|
|
62
|
+
return hpatchMTSets_no;
|
|
63
|
+
#endif
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
#define _kCacheSgCount 3 //patch for singleCompressedDiff need cache count
|
|
68
|
+
hpatch_BOOL _patch_single_stream_mt(sspatch_listener_t* listener,
|
|
69
|
+
const hpatch_TStreamOutput* __out_newData,
|
|
70
|
+
const hpatch_TStreamInput* oldData,
|
|
71
|
+
const hpatch_TStreamInput* singleCompressedDiff,
|
|
72
|
+
hpatch_StreamPos_t diffInfo_pos,
|
|
73
|
+
sspatch_coversListener_t* coversListener,
|
|
74
|
+
size_t maxThreadNum,hpatchMTSets_t hpatchMTSets);
|
|
75
|
+
hpatch_BOOL _patch_single_compressed_diff_mt(const hpatch_TStreamOutput* out_newData,
|
|
76
|
+
const hpatch_TStreamInput* oldData,
|
|
77
|
+
const hpatch_TStreamInput* singleCompressedDiff,
|
|
78
|
+
hpatch_StreamPos_t diffData_pos,
|
|
79
|
+
hpatch_StreamPos_t uncompressedSize,
|
|
80
|
+
hpatch_StreamPos_t compressedSize,
|
|
81
|
+
hpatch_TDecompress* decompressPlugin,
|
|
82
|
+
hpatch_StreamPos_t coverCount,hpatch_size_t stepMemSize,
|
|
83
|
+
unsigned char* temp_cache,unsigned char* temp_cache_end,
|
|
84
|
+
sspatch_coversListener_t* coversListener,
|
|
85
|
+
size_t maxThreadNum,hpatchMTSets_t mtsets);
|
|
86
|
+
|
|
87
|
+
#if (_IS_USED_MULTITHREAD)
|
|
88
|
+
|
|
89
|
+
struct hpatch_mt_manager_t;
|
|
90
|
+
|
|
91
|
+
struct hpatch_mt_manager_t* hpatch_mt_manager_open(const hpatch_TStreamOutput** pout_newData,
|
|
92
|
+
const hpatch_TStreamInput** poldData,
|
|
93
|
+
const hpatch_TStreamInput** psingleCompressedDiff,
|
|
94
|
+
hpatch_StreamPos_t* pdiffData_pos,
|
|
95
|
+
hpatch_StreamPos_t* pdiffData_posEnd,
|
|
96
|
+
hpatch_StreamPos_t uncompressedSize,
|
|
97
|
+
hpatch_TDecompress** pdecompressPlugin,
|
|
98
|
+
size_t stepMemSize,
|
|
99
|
+
unsigned char** ptemp_cache,unsigned char** ptemp_cache_end,
|
|
100
|
+
sspatch_coversListener_t** pcoversListener,
|
|
101
|
+
hpatch_BOOL isOnStepCoversInThread,
|
|
102
|
+
size_t kCacheCount,
|
|
103
|
+
hpatchMTSets_t mtsets);
|
|
104
|
+
|
|
105
|
+
hpatch_BOOL hpatch_mt_manager_close(struct hpatch_mt_manager_t* self,hpatch_BOOL isOnError);
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
struct hpatch_mt_manager_win_t;
|
|
110
|
+
struct hcache_window_old_mt_t;
|
|
111
|
+
|
|
112
|
+
static hpatch_force_inline
|
|
113
|
+
hpatchMTSets_t hpatch_getMTSets_win(hpatch_StreamPos_t newSize,hpatch_StreamPos_t oldSize,hpatch_StreamPos_t diffSize,
|
|
114
|
+
const hpatch_TDecompress* decompressPlugin,size_t kCacheCount,
|
|
115
|
+
hpatch_size_t windowOldBufSize, hpatch_size_t stepMemSize,
|
|
116
|
+
size_t temp_cacheSumSize,size_t maxThreadNum,hpatchMTSets_t mtsets){
|
|
117
|
+
#if (_IS_USED_MULTITHREAD)
|
|
118
|
+
if (maxThreadNum<=1) return hpatchMTSets_no;
|
|
119
|
+
hpatchMTSets_t _hpatch_getMTSets(hpatch_StreamPos_t newSize,hpatch_StreamPos_t oldSize,hpatch_StreamPos_t diffSize,
|
|
120
|
+
const hpatch_TDecompress* decompressPlugin,size_t kCacheCount,
|
|
121
|
+
hpatch_size_t windowOldBufSize,size_t stepMemSize,
|
|
122
|
+
size_t temp_cacheSumSize,size_t maxThreadNum,hpatchMTSets_t mtsets,hpatch_BOOL isWindow);
|
|
123
|
+
return _hpatch_getMTSets(newSize,oldSize,diffSize,decompressPlugin,kCacheCount,windowOldBufSize,stepMemSize,
|
|
124
|
+
temp_cacheSumSize,maxThreadNum,mtsets,hpatch_TRUE);
|
|
125
|
+
#else
|
|
126
|
+
return hpatchMTSets_no;
|
|
127
|
+
#endif
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
struct hpatch_mt_manager_win_t* hpatch_mt_manager_win_open(const hpatch_TStreamOutput** pout_newData,
|
|
131
|
+
const hpatch_TStreamInput** poldData,const hpatch_TStreamInput** pwindowDiffStream,
|
|
132
|
+
hpatch_StreamPos_t* pdiffData_pos, hpatch_StreamPos_t* pdiffData_posEnd,
|
|
133
|
+
hpatch_StreamPos_t uncompressedSize, hpatch_TDecompress** pdecompressPlugin,
|
|
134
|
+
hpatch_StreamPos_t windowCount,hpatch_size_t windowOldBufSize, hpatch_size_t stepMemSize,
|
|
135
|
+
unsigned char** ptemp_cache, unsigned char** ptemp_cache_end,
|
|
136
|
+
size_t kCacheCount, hpatchMTSets_t mtsets);
|
|
137
|
+
|
|
138
|
+
struct hcache_window_old_mt_t* hpatch_mt_manager_win_oldCache(struct hpatch_mt_manager_win_t* self);
|
|
139
|
+
|
|
140
|
+
hpatch_BOOL hpatch_mt_manager_win_close(struct hpatch_mt_manager_win_t* self,hpatch_BOOL isOnError);
|
|
141
|
+
|
|
142
|
+
#endif // _IS_USED_MULTITHREAD
|
|
143
|
+
|
|
144
|
+
#ifdef __cplusplus
|
|
145
|
+
}
|
|
146
|
+
#endif
|
|
147
|
+
#endif //hpatch_mt_h
|