extend new patchType: *.apk.hpatch & *.ppk.hpatch
This commit is contained in:
parent
48e0849804
commit
c4d2523a92
@ -301,7 +301,7 @@ class DownloadTask extends AsyncTask<DownloadTaskParams, long[], Void> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void doPatchFromApk(DownloadTaskParams param) throws IOException, JSONException {
|
private void doPatchFromApk(DownloadTaskParams param,int apkPatchType) throws IOException, JSONException {
|
||||||
downloadFile(param);
|
downloadFile(param);
|
||||||
|
|
||||||
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(param.targetFile)));
|
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(param.targetFile)));
|
||||||
@ -349,8 +349,12 @@ class DownloadTask extends AsyncTask<DownloadTaskParams, long[], Void> {
|
|||||||
}
|
}
|
||||||
if (fn.equals("index.bundlejs.patch")) {
|
if (fn.equals("index.bundlejs.patch")) {
|
||||||
foundBundlePatch = true;
|
foundBundlePatch = true;
|
||||||
// do bsdiff patch
|
|
||||||
byte[] patched = bsdiffPatch(readOriginBundle(), readBytes(zis));
|
byte[] patched;
|
||||||
|
if (DownloadTaskParams.isHPatchType(apkPatchType)) // hpatch
|
||||||
|
patched = hdiffPatch(readOriginBundle(), readBytes(zis));
|
||||||
|
else // do bsdiff patch
|
||||||
|
patched = bsdiffPatch(readOriginBundle(), readBytes(zis));
|
||||||
|
|
||||||
FileOutputStream fout = new FileOutputStream(new File(param.unzipDirectory, "index.bundlejs"));
|
FileOutputStream fout = new FileOutputStream(new File(param.unzipDirectory, "index.bundlejs"));
|
||||||
fout.write(patched);
|
fout.write(patched);
|
||||||
@ -387,7 +391,7 @@ class DownloadTask extends AsyncTask<DownloadTaskParams, long[], Void> {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void doPatchFromPpk(DownloadTaskParams param) throws IOException, JSONException {
|
private void doPatchFromPpk(DownloadTaskParams param,int ppkPatchType) throws IOException, JSONException {
|
||||||
downloadFile(param);
|
downloadFile(param);
|
||||||
|
|
||||||
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(param.targetFile)));
|
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(param.targetFile)));
|
||||||
@ -427,8 +431,11 @@ class DownloadTask extends AsyncTask<DownloadTaskParams, long[], Void> {
|
|||||||
}
|
}
|
||||||
if (fn.equals("index.bundlejs.patch")) {
|
if (fn.equals("index.bundlejs.patch")) {
|
||||||
foundBundlePatch = true;
|
foundBundlePatch = true;
|
||||||
// do bsdiff patch
|
byte[] patched;
|
||||||
byte[] patched = bsdiffPatch(readFile(new File(param.originDirectory, "index.bundlejs")), readBytes(zis));
|
if (DownloadTaskParams.isHPatchType(ppkPatchType)) // hpatch
|
||||||
|
patched = hdiffPatch(readFile(new File(param.originDirectory, "index.bundlejs")), readBytes(zis));
|
||||||
|
else // do bsdiff patch
|
||||||
|
patched = bsdiffPatch(readFile(new File(param.originDirectory, "index.bundlejs")), readBytes(zis));
|
||||||
|
|
||||||
FileOutputStream fout = new FileOutputStream(new File(param.unzipDirectory, "index.bundlejs"));
|
FileOutputStream fout = new FileOutputStream(new File(param.unzipDirectory, "index.bundlejs"));
|
||||||
fout.write(patched);
|
fout.write(patched);
|
||||||
@ -490,10 +497,12 @@ class DownloadTask extends AsyncTask<DownloadTaskParams, long[], Void> {
|
|||||||
doFullPatch(params[0]);
|
doFullPatch(params[0]);
|
||||||
break;
|
break;
|
||||||
case DownloadTaskParams.TASK_TYPE_PATCH_FROM_APK:
|
case DownloadTaskParams.TASK_TYPE_PATCH_FROM_APK:
|
||||||
doPatchFromApk(params[0]);
|
case DownloadTaskParams.TASK_TYPE_HPATCH_FROM_APK:
|
||||||
|
doPatchFromApk(params[0],type);
|
||||||
break;
|
break;
|
||||||
case DownloadTaskParams.TASK_TYPE_PATCH_FROM_PPK:
|
case DownloadTaskParams.TASK_TYPE_PATCH_FROM_PPK:
|
||||||
doPatchFromPpk(params[0]);
|
case DownloadTaskParams.TASK_TYPE_HPATCH_FROM_PPK:
|
||||||
|
doPatchFromPpk(params[0],type);
|
||||||
break;
|
break;
|
||||||
case DownloadTaskParams.TASK_TYPE_CLEANUP:
|
case DownloadTaskParams.TASK_TYPE_CLEANUP:
|
||||||
doCleanUp(params[0]);
|
doCleanUp(params[0]);
|
||||||
@ -515,6 +524,8 @@ class DownloadTask extends AsyncTask<DownloadTaskParams, long[], Void> {
|
|||||||
case DownloadTaskParams.TASK_TYPE_PATCH_FULL:
|
case DownloadTaskParams.TASK_TYPE_PATCH_FULL:
|
||||||
case DownloadTaskParams.TASK_TYPE_PATCH_FROM_APK:
|
case DownloadTaskParams.TASK_TYPE_PATCH_FROM_APK:
|
||||||
case DownloadTaskParams.TASK_TYPE_PATCH_FROM_PPK:
|
case DownloadTaskParams.TASK_TYPE_PATCH_FROM_PPK:
|
||||||
|
case DownloadTaskParams.TASK_TYPE_HPATCH_FROM_APK:
|
||||||
|
case DownloadTaskParams.TASK_TYPE_HPATCH_FROM_PPK:
|
||||||
try {
|
try {
|
||||||
removeDirectory(params[0].unzipDirectory);
|
removeDirectory(params[0].unzipDirectory);
|
||||||
} catch (IOException ioException) {
|
} catch (IOException ioException) {
|
||||||
|
@ -8,12 +8,19 @@ import java.io.File;
|
|||||||
* Created by tdzl2003 on 3/31/16.
|
* Created by tdzl2003 on 3/31/16.
|
||||||
*/
|
*/
|
||||||
class DownloadTaskParams {
|
class DownloadTaskParams {
|
||||||
static final int TASK_TYPE_PATCH_FULL = 1;
|
static final int TASK_TYPE_CLEANUP = 0; //Keep hash & originHash
|
||||||
|
|
||||||
|
static final int TASK_TYPE_PATCH_FULL = 1;
|
||||||
static final int TASK_TYPE_PATCH_FROM_APK = 2;
|
static final int TASK_TYPE_PATCH_FROM_APK = 2;
|
||||||
static final int TASK_TYPE_PATCH_FROM_PPK = 3;
|
static final int TASK_TYPE_PATCH_FROM_PPK = 3;
|
||||||
static final int TASK_TYPE_PLAIN_DOWNLOAD = 4;
|
static final int TASK_TYPE_PLAIN_DOWNLOAD = 4;
|
||||||
|
|
||||||
static final int TASK_TYPE_CLEANUP = 0; //Keep hash & originHash
|
static final int TASK_TYPE_HPATCH_FROM_APK = 5;
|
||||||
|
static final int TASK_TYPE_HPATCH_FROM_PPK = 6;
|
||||||
|
|
||||||
|
static boolean isHPatchType(int patchType){
|
||||||
|
return (patchType==TASK_TYPE_HPATCH_FROM_APK)||(patchType==TASK_TYPE_HPATCH_FROM_PPK);
|
||||||
|
}
|
||||||
|
|
||||||
int type;
|
int type;
|
||||||
String url;
|
String url;
|
||||||
|
@ -90,13 +90,30 @@ public class UpdateContext {
|
|||||||
void onDownloadFailed(Throwable error);
|
void onDownloadFailed(Throwable error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String zipExtension(int patchType){
|
||||||
|
switch (patchType) {
|
||||||
|
case TASK_TYPE_PATCH_FULL:
|
||||||
|
return ".ppk";
|
||||||
|
case TASK_TYPE_PATCH_FROM_APK:
|
||||||
|
return ".apk.patch";
|
||||||
|
case TASK_TYPE_PATCH_FROM_PPK:
|
||||||
|
return ".ppk.patch";
|
||||||
|
case TASK_TYPE_HPATCH_FROM_APK:
|
||||||
|
return ".apk.hpatch";
|
||||||
|
case TASK_TYPE_HPATCH_FROM_PPK:
|
||||||
|
return ".ppk.hpatch";
|
||||||
|
default:
|
||||||
|
return "";//unknown type
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void downloadFullUpdate(String url, String hash, DownloadFileListener listener) {
|
public void downloadFullUpdate(String url, String hash, DownloadFileListener listener) {
|
||||||
DownloadTaskParams params = new DownloadTaskParams();
|
DownloadTaskParams params = new DownloadTaskParams();
|
||||||
params.type = DownloadTaskParams.TASK_TYPE_PATCH_FULL;
|
params.type = DownloadTaskParams.TASK_TYPE_PATCH_FULL;
|
||||||
params.url = url;
|
params.url = url;
|
||||||
params.hash = hash;
|
params.hash = hash;
|
||||||
params.listener = listener;
|
params.listener = listener;
|
||||||
params.targetFile = new File(rootDir, hash + ".ppk");
|
params.targetFile = new File(rootDir, hash + zipExtension(params.type));
|
||||||
params.unzipDirectory = new File(rootDir, hash);
|
params.unzipDirectory = new File(rootDir, hash);
|
||||||
new DownloadTask(context).executeOnExecutor(this.executor, params);
|
new DownloadTask(context).executeOnExecutor(this.executor, params);
|
||||||
}
|
}
|
||||||
@ -112,25 +129,25 @@ public class UpdateContext {
|
|||||||
new DownloadTask(context).executeOnExecutor(this.executor, params);
|
new DownloadTask(context).executeOnExecutor(this.executor, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void downloadPatchFromApk(String url, String hash, DownloadFileListener listener) {
|
public void downloadPatchFromApk(String url, String hash,int apkPatchType,DownloadFileListener listener) {
|
||||||
DownloadTaskParams params = new DownloadTaskParams();
|
DownloadTaskParams params = new DownloadTaskParams();
|
||||||
params.type = DownloadTaskParams.TASK_TYPE_PATCH_FROM_APK;
|
params.type = apkPatchType;
|
||||||
params.url = url;
|
params.url = url;
|
||||||
params.hash = hash;
|
params.hash = hash;
|
||||||
params.listener = listener;
|
params.listener = listener;
|
||||||
params.targetFile = new File(rootDir, hash + ".apk.patch");
|
params.targetFile = new File(rootDir, hash + zipExtension(params.type));
|
||||||
params.unzipDirectory = new File(rootDir, hash);
|
params.unzipDirectory = new File(rootDir, hash);
|
||||||
new DownloadTask(context).executeOnExecutor(this.executor, params);
|
new DownloadTask(context).executeOnExecutor(this.executor, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void downloadPatchFromPpk(String url, String hash, String originHash, DownloadFileListener listener) {
|
public void downloadPatchFromPpk(String url,String hash,String originHash,int ppkPatchType,DownloadFileListener listener) {
|
||||||
DownloadTaskParams params = new DownloadTaskParams();
|
DownloadTaskParams params = new DownloadTaskParams();
|
||||||
params.type = DownloadTaskParams.TASK_TYPE_PATCH_FROM_PPK;
|
params.type = ppkPatchType;
|
||||||
params.url = url;
|
params.url = url;
|
||||||
params.hash = hash;
|
params.hash = hash;
|
||||||
params.originHash = originHash;
|
params.originHash = originHash;
|
||||||
params.listener = listener;
|
params.listener = listener;
|
||||||
params.targetFile = new File(rootDir, originHash + "-" + hash + ".ppk.patch");
|
params.targetFile = new File(rootDir, originHash + "-" + hash + zipExtension(params.type));
|
||||||
params.unzipDirectory = new File(rootDir, hash);
|
params.unzipDirectory = new File(rootDir, hash);
|
||||||
params.originDirectory = new File(rootDir, originHash);
|
params.originDirectory = new File(rootDir, originHash);
|
||||||
new DownloadTask(context).executeOnExecutor(this.executor, params);
|
new DownloadTask(context).executeOnExecutor(this.executor, params);
|
||||||
|
@ -135,15 +135,36 @@ public class UpdateModule extends ReactContextBaseJavaModule {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void _downloadPatchFromPackage(ReadableMap options, final Promise promise,int apkPatchType) {
|
||||||
@ReactMethod
|
|
||||||
public void downloadPatchFromPackage(ReadableMap options, final Promise promise) {
|
|
||||||
String url = options.getString("updateUrl");
|
String url = options.getString("updateUrl");
|
||||||
String hash = options.getString("hash");
|
String hash = options.getString("hash");
|
||||||
if (hash == null) {
|
if (hash == null) {
|
||||||
hash = options.getString("hashName");
|
hash = options.getString("hashName");
|
||||||
}
|
}
|
||||||
updateContext.downloadPatchFromApk(url, hash, new UpdateContext.DownloadFileListener() {
|
updateContext.downloadPatchFromApk(url,hash,apkPatchType,new UpdateContext.DownloadFileListener() {
|
||||||
|
@Override
|
||||||
|
public void onDownloadCompleted(DownloadTaskParams params) {
|
||||||
|
promise.resolve(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDownloadFailed(Throwable error) {
|
||||||
|
promise.reject(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void _downloadPatchFromPpk(ReadableMap options, final Promise promise,int ppkPatchType) {
|
||||||
|
String url = options.getString("updateUrl");
|
||||||
|
String hash = options.getString("hash");
|
||||||
|
if (hash == null) {
|
||||||
|
hash = options.getString("hashName");
|
||||||
|
}
|
||||||
|
String originHash = options.getString("originHash");
|
||||||
|
if (originHash == null) {
|
||||||
|
originHash = options.getString(("originHashName"));
|
||||||
|
}
|
||||||
|
updateContext.downloadPatchFromPpk(url,hash,originHash,ppkPatchType,new UpdateContext.DownloadFileListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onDownloadCompleted(DownloadTaskParams params) {
|
public void onDownloadCompleted(DownloadTaskParams params) {
|
||||||
promise.resolve(null);
|
promise.resolve(null);
|
||||||
@ -157,27 +178,23 @@ public class UpdateModule extends ReactContextBaseJavaModule {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ReactMethod
|
@ReactMethod
|
||||||
public void downloadPatchFromPpk(ReadableMap options, final Promise promise) {
|
public void downloadPatchFromPackage(ReadableMap options, final Promise promise) {
|
||||||
String url = options.getString("updateUrl");
|
_downloadPatchFromPackage(options,promise,DownloadTaskParams.TASK_TYPE_PATCH_FROM_APK);
|
||||||
String hash = options.getString("hash");
|
}
|
||||||
if (hash == null) {
|
|
||||||
hash = options.getString("hashName");
|
@ReactMethod
|
||||||
}
|
public void downloadHPatchFromPackage(ReadableMap options, final Promise promise) {
|
||||||
String originHash = options.getString("originHash");
|
_downloadPatchFromPackage(options,promise,DownloadTaskParams.TASK_TYPE_HPATCH_FROM_APK);
|
||||||
if (originHash == null) {
|
}
|
||||||
originHash = options.getString(("originHashName"));
|
|
||||||
}
|
|
||||||
updateContext.downloadPatchFromPpk(url, hash, originHash, new UpdateContext.DownloadFileListener() {
|
|
||||||
@Override
|
|
||||||
public void onDownloadCompleted(DownloadTaskParams params) {
|
|
||||||
promise.resolve(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@ReactMethod
|
||||||
public void onDownloadFailed(Throwable error) {
|
public void downloadPatchFromPpk(ReadableMap options, final Promise promise) {
|
||||||
promise.reject(error);
|
_downloadPatchFromPpk(options,promise,DownloadTaskParams.TASK_TYPE_PATCH_FROM_PPK);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
@ReactMethod
|
||||||
|
public void downloadHPatchFromPpk(ReadableMap options, final Promise promise) {
|
||||||
|
_downloadPatchFromPpk(options,promise,DownloadTaskParams.TASK_TYPE_HPATCH_FROM_PPK);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ReactMethod
|
@ReactMethod
|
||||||
|
@ -13,4 +13,9 @@
|
|||||||
+ (BOOL)bsdiffPatch:(NSString *)path
|
+ (BOOL)bsdiffPatch:(NSString *)path
|
||||||
origin:(NSString *)origin
|
origin:(NSString *)origin
|
||||||
toDestination:(NSString *)destination;
|
toDestination:(NSString *)destination;
|
||||||
|
|
||||||
|
+ (BOOL)hdiffPatch:(NSString *)path
|
||||||
|
origin:(NSString *)origin
|
||||||
|
toDestination:(NSString *)destination;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
#import "BSDiff.h"
|
#import "BSDiff.h"
|
||||||
#include "bspatch.h"
|
#include "bspatch.h"
|
||||||
|
#include "../../../android/jni/hpatch.h"
|
||||||
|
|
||||||
@implementation BSDiff
|
@implementation BSDiff
|
||||||
|
|
||||||
@ -34,4 +34,26 @@
|
|||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+ (BOOL)hdiffPatch:(NSString *)patch
|
||||||
|
origin:(NSString *)origin
|
||||||
|
toDestination:(NSString *)destination
|
||||||
|
{
|
||||||
|
if (![[NSFileManager defaultManager] fileExistsAtPath:patch]) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
if (![[NSFileManager defaultManager] fileExistsAtPath:origin]) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ([[NSFileManager defaultManager] fileExistsAtPath:destination]) {
|
||||||
|
[[NSFileManager defaultManager] removeItemAtPath:destination error:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
int err = hpatch_by_file([origin UTF8String], [destination UTF8String], [patch UTF8String]);
|
||||||
|
if (err) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@ -39,6 +39,7 @@ static NSString * const BUNDLE_PATCH_NAME = @"index.bundlejs.patch";
|
|||||||
// error def
|
// error def
|
||||||
static NSString * const ERROR_OPTIONS = @"options error";
|
static NSString * const ERROR_OPTIONS = @"options error";
|
||||||
static NSString * const ERROR_BSDIFF = @"bsdiff error";
|
static NSString * const ERROR_BSDIFF = @"bsdiff error";
|
||||||
|
static NSString * const ERROR_HDIFFPATCH = @"hdiffpatch error";
|
||||||
static NSString * const ERROR_FILE_OPERATION = @"file operation error";
|
static NSString * const ERROR_FILE_OPERATION = @"file operation error";
|
||||||
|
|
||||||
// event def
|
// event def
|
||||||
@ -53,6 +54,9 @@ typedef NS_ENUM(NSInteger, PushyType) {
|
|||||||
PushyTypeFullDownload = 1,
|
PushyTypeFullDownload = 1,
|
||||||
PushyTypePatchFromPackage = 2,
|
PushyTypePatchFromPackage = 2,
|
||||||
PushyTypePatchFromPpk = 3,
|
PushyTypePatchFromPpk = 3,
|
||||||
|
//TASK_TYPE_PLAIN_DOWNLOAD=4?
|
||||||
|
PushyTypeHPatchFromPackage = 5,
|
||||||
|
PushyTypeHPatchFromPpk = 6,
|
||||||
};
|
};
|
||||||
|
|
||||||
static BOOL ignoreRollback = false;
|
static BOOL ignoreRollback = false;
|
||||||
@ -253,6 +257,34 @@ RCT_EXPORT_METHOD(downloadPatchFromPpk:(NSDictionary *)options
|
|||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RCT_EXPORT_METHOD(downloadHPatchFromPackage:(NSDictionary *)options
|
||||||
|
resolver:(RCTPromiseResolveBlock)resolve
|
||||||
|
rejecter:(RCTPromiseRejectBlock)reject)
|
||||||
|
{
|
||||||
|
[self doPushy:PushyTypeHPatchFromPackage options:options callback:^(NSError *error) {
|
||||||
|
if (error) {
|
||||||
|
reject([NSString stringWithFormat: @"%lu", (long)error.code], error.localizedDescription, error);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
resolve(nil);
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
RCT_EXPORT_METHOD(downloadHPatchFromPpk:(NSDictionary *)options
|
||||||
|
resolver:(RCTPromiseResolveBlock)resolve
|
||||||
|
rejecter:(RCTPromiseRejectBlock)reject)
|
||||||
|
{
|
||||||
|
[self doPushy:PushyTypeHPatchFromPpk options:options callback:^(NSError *error) {
|
||||||
|
if (error) {
|
||||||
|
reject([NSString stringWithFormat: @"%lu", (long)error.code], error.localizedDescription, error);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
resolve(nil);
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
RCT_EXPORT_METHOD(setNeedUpdate:(NSDictionary *)options)
|
RCT_EXPORT_METHOD(setNeedUpdate:(NSDictionary *)options)
|
||||||
{
|
{
|
||||||
NSString *hash = options[@"hash"];
|
NSString *hash = options[@"hash"];
|
||||||
@ -349,7 +381,7 @@ RCT_EXPORT_METHOD(markSuccess)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
NSString *originHash = [RCTConvert NSString:options[@"originHash"]];
|
NSString *originHash = [RCTConvert NSString:options[@"originHash"]];
|
||||||
if (type == PushyTypePatchFromPpk && originHash <= 0) {
|
if (((type == PushyTypePatchFromPpk)||(type == PushyTypeHPatchFromPpk)) && originHash <= 0) {
|
||||||
callback([self errorWithMessage:ERROR_OPTIONS]);
|
callback([self errorWithMessage:ERROR_OPTIONS]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -398,19 +430,27 @@ RCT_EXPORT_METHOD(markSuccess)
|
|||||||
else {
|
else {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case PushyTypePatchFromPackage:
|
case PushyTypePatchFromPackage:
|
||||||
|
case PushyTypeHPatchFromPackage:
|
||||||
{
|
{
|
||||||
NSString *sourceOrigin = [[NSBundle mainBundle] resourcePath];
|
NSString *sourceOrigin = [[NSBundle mainBundle] resourcePath];
|
||||||
NSString *bundleOrigin = [[RCTPushy binaryBundleURL] path];
|
NSString *bundleOrigin = [[RCTPushy binaryBundleURL] path];
|
||||||
[self patch:hash fromBundle:bundleOrigin source:sourceOrigin callback:callback];
|
if (type==PushyTypeHPatchFromPackage)
|
||||||
|
[self hpatch:hash fromBundle:bundleOrigin source:sourceOrigin callback:callback];
|
||||||
|
else
|
||||||
|
[self patch:hash fromBundle:bundleOrigin source:sourceOrigin callback:callback];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PushyTypePatchFromPpk:
|
case PushyTypePatchFromPpk:
|
||||||
|
case PushyTypeHPatchFromPpk:
|
||||||
{
|
{
|
||||||
NSString *lastVersionDir = [dir stringByAppendingPathComponent:originHash];
|
NSString *lastVersionDir = [dir stringByAppendingPathComponent:originHash];
|
||||||
|
|
||||||
NSString *sourceOrigin = lastVersionDir;
|
NSString *sourceOrigin = lastVersionDir;
|
||||||
NSString *bundleOrigin = [lastVersionDir stringByAppendingPathComponent:BUNDLE_FILE_NAME];
|
NSString *bundleOrigin = [lastVersionDir stringByAppendingPathComponent:BUNDLE_FILE_NAME];
|
||||||
[self patch:hash fromBundle:bundleOrigin source:sourceOrigin callback:callback];
|
if (type==PushyTypeHPatchFromPpk)
|
||||||
|
[self hpatch:hash fromBundle:bundleOrigin source:sourceOrigin callback:callback];
|
||||||
|
else
|
||||||
|
[self patch:hash fromBundle:bundleOrigin source:sourceOrigin callback:callback];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -424,14 +464,15 @@ RCT_EXPORT_METHOD(markSuccess)
|
|||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)patch:(NSString *)hash fromBundle:(NSString *)bundleOrigin source:(NSString *)sourceOrigin callback:(void (^)(NSError *error))callback
|
- (void)_dopatch:(NSString *)hash fromBundle:(NSString *)bundleOrigin source:(NSString *)sourceOrigin
|
||||||
|
callback:(void (^)(NSError *error))callback isHPatch:(BOOL)isHPatch
|
||||||
{
|
{
|
||||||
NSString *unzipDir = [[RCTPushy downloadDir] stringByAppendingPathComponent:hash];
|
NSString *unzipDir = [[RCTPushy downloadDir] stringByAppendingPathComponent:hash];
|
||||||
NSString *sourcePatch = [unzipDir stringByAppendingPathComponent:SOURCE_PATCH_NAME];
|
NSString *sourcePatch = [unzipDir stringByAppendingPathComponent:SOURCE_PATCH_NAME];
|
||||||
NSString *bundlePatch = [unzipDir stringByAppendingPathComponent:BUNDLE_PATCH_NAME];
|
NSString *bundlePatch = [unzipDir stringByAppendingPathComponent:BUNDLE_PATCH_NAME];
|
||||||
|
|
||||||
NSString *destination = [unzipDir stringByAppendingPathComponent:BUNDLE_FILE_NAME];
|
NSString *destination = [unzipDir stringByAppendingPathComponent:BUNDLE_FILE_NAME];
|
||||||
[_fileManager bsdiffFileAtPath:bundlePatch fromOrigin:bundleOrigin toDestination:destination completionHandler:^(BOOL success) {
|
void (^)(BOOL success) completionHandler=^(BOOL success) {
|
||||||
if (success) {
|
if (success) {
|
||||||
NSData *data = [NSData dataWithContentsOfFile:sourcePatch];
|
NSData *data = [NSData dataWithContentsOfFile:sourcePatch];
|
||||||
NSError *error = nil;
|
NSError *error = nil;
|
||||||
@ -454,9 +495,25 @@ RCT_EXPORT_METHOD(markSuccess)
|
|||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
callback([self errorWithMessage:ERROR_BSDIFF]);
|
if (isHPatch)
|
||||||
|
callback([self errorWithMessage:ERROR_HDIFFPATCH]);
|
||||||
|
else
|
||||||
|
callback([self errorWithMessage:ERROR_BSDIFF]);
|
||||||
}
|
}
|
||||||
}];
|
}
|
||||||
|
if (isHPatch)
|
||||||
|
[_fileManager hdiffFileAtPath:bundlePatch fromOrigin:bundleOrigin toDestination:destination completionHandler:completionHandler];
|
||||||
|
else
|
||||||
|
[_fileManager bsdiffFileAtPath:bundlePatch fromOrigin:bundleOrigin toDestination:destination completionHandler:completionHandler];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)patch:(NSString *)hash fromBundle:(NSString *)bundleOrigin source:(NSString *)sourceOrigin callback:(void (^)(NSError *error))callback
|
||||||
|
{
|
||||||
|
[self _dopatch:hash fromBundle:bundleOrigin source:sourceOrigin callback:callback isHPatch:false];
|
||||||
|
}
|
||||||
|
- (void)hpatch:(NSString *)hash fromBundle:(NSString *)bundleOrigin source:(NSString *)sourceOrigin callback:(void (^)(NSError *error))callback
|
||||||
|
{
|
||||||
|
[self _dopatch:hash fromBundle:bundleOrigin source:sourceOrigin callback:callback isHPatch:true];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)clearInvalidFiles
|
- (void)clearInvalidFiles
|
||||||
@ -488,6 +545,10 @@ RCT_EXPORT_METHOD(markSuccess)
|
|||||||
return @".ipa.patch";
|
return @".ipa.patch";
|
||||||
case PushyTypePatchFromPpk:
|
case PushyTypePatchFromPpk:
|
||||||
return @".ppk.patch";
|
return @".ppk.patch";
|
||||||
|
case PushyTypeHPatchFromPackage:
|
||||||
|
return @".ipa.hpatch";
|
||||||
|
case PushyTypeHPatchFromPpk:
|
||||||
|
return @".ppk.hpatch";
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,11 @@
|
|||||||
toDestination:(NSString *)destination
|
toDestination:(NSString *)destination
|
||||||
completionHandler:(void (^)(BOOL success))completionHandler;
|
completionHandler:(void (^)(BOOL success))completionHandler;
|
||||||
|
|
||||||
|
- (void)hdiffFileAtPath:(NSString *)path
|
||||||
|
fromOrigin:(NSString *)origin
|
||||||
|
toDestination:(NSString *)destination
|
||||||
|
completionHandler:(void (^)(BOOL success))completionHandler;
|
||||||
|
|
||||||
- (void)copyFiles:(NSDictionary *)filesDic
|
- (void)copyFiles:(NSDictionary *)filesDic
|
||||||
fromDir:(NSString *)fromDir
|
fromDir:(NSString *)fromDir
|
||||||
toDir:(NSString *)toDir
|
toDir:(NSString *)toDir
|
||||||
|
@ -88,6 +88,19 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)hdiffFileAtPath:(NSString *)path
|
||||||
|
fromOrigin:(NSString *)origin
|
||||||
|
toDestination:(NSString *)destination
|
||||||
|
completionHandler:(void (^)(BOOL success))completionHandler
|
||||||
|
{
|
||||||
|
dispatch_async(_opQueue, ^{
|
||||||
|
BOOL success = [BSDiff hdiffPatch:path origin:origin toDestination:destination];
|
||||||
|
if (completionHandler) {
|
||||||
|
completionHandler(success);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
- (void)copyFiles:(NSDictionary *)filesDic
|
- (void)copyFiles:(NSDictionary *)filesDic
|
||||||
fromDir:(NSString *)fromDir
|
fromDir:(NSString *)fromDir
|
||||||
toDir:(NSString *)toDir
|
toDir:(NSString *)toDir
|
||||||
|
2
lib/index.d.ts
vendored
2
lib/index.d.ts
vendored
@ -25,6 +25,8 @@ export interface UpdateAvailableResult {
|
|||||||
metaInfo: string;
|
metaInfo: string;
|
||||||
pdiffUrl: string;
|
pdiffUrl: string;
|
||||||
diffUrl?: string;
|
diffUrl?: string;
|
||||||
|
phdiffUrl?: string;
|
||||||
|
hdiffUrl?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type CheckResult =
|
export type CheckResult =
|
||||||
|
13
lib/index.js
13
lib/index.js
@ -167,6 +167,19 @@ export async function downloadUpdate(options, eventListeners) {
|
|||||||
updateUrl: options.pdiffUrl,
|
updateUrl: options.pdiffUrl,
|
||||||
hash: options.hash,
|
hash: options.hash,
|
||||||
});
|
});
|
||||||
|
}else if (options.hdiffUrl) {
|
||||||
|
logger('downloading hdiff');
|
||||||
|
await Pushy.downloadHPatchFromPpk({
|
||||||
|
updateUrl: options.hdiffUrl,
|
||||||
|
hash: options.hash,
|
||||||
|
originHash: currentVersion,
|
||||||
|
});
|
||||||
|
} else if (options.phdiffUrl) {
|
||||||
|
logger('downloading phdiff');
|
||||||
|
await Pushy.downloadHPatchFromPackage({
|
||||||
|
updateUrl: options.phdiffUrl,
|
||||||
|
hash: options.hash,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
progressHandler && progressHandler.remove();
|
progressHandler && progressHandler.remove();
|
||||||
return options.hash;
|
return options.hash;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user