mirror of
				https://gitcode.com/gh_mirrors/re/react-native-pushy.git
				synced 2025-10-31 21:33:12 +08:00 
			
		
		
		
	extend new patchType: *.apk.hpatch & *.ppk.hpatch
This commit is contained in:
		| @@ -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; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 sisong
					sisong