1
0
Code Issues Pull Requests Packages Projects Releases Wiki Activity GitHub Gitee
react-native-pushy/ios/RCTHotUpdate/RCTHotUpdateManager.m

127 lines
3.7 KiB
Mathematica
Raw Normal View History

2016-04-02 14:24:33 +08:00
//
// RCTHotUpdateManager.m
// RCTHotUpdate
//
// Created by lvbingru on 16/4/1.
// Copyright © 2016 erica. All rights reserved.
//
#import "RCTHotUpdateManager.h"
#import "ZipArchive.h"
#import "BSDiff.h"
@implementation RCTHotUpdateManager {
dispatch_queue_t _opQueue;
}
- (instancetype)init
{
self = [super init];
if (self) {
_opQueue = dispatch_queue_create("cn.reactnative.hotupdate", DISPATCH_QUEUE_SERIAL);
}
return self;
}
- (BOOL)createDir:(NSString *)dir
{
__block BOOL success = false;
dispatch_sync(_opQueue, ^{
BOOL isDir;
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:dir isDirectory:&isDir]) {
if (isDir) {
success = true;
return;
}
}
NSError *error;
[fileManager createDirectoryAtPath:dir
withIntermediateDirectories:YES
attributes:nil
error:&error];
if (!error) {
success = true;
return;
}
});
return success;
}
- (void)unzipFileAtPath:(NSString *)path
toDestination:(NSString *)destination
progressHandler:(void (^)(NSString *entry, long entryNumber, long total))progressHandler
completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler
{
dispatch_async(_opQueue, ^{
[SSZipArchive unzipFileAtPath:path toDestination:destination progressHandler:^(NSString *entry, unz_file_info zipInfo, long entryNumber, long total) {
progressHandler(entry, entryNumber, total);
} completionHandler:^(NSString *path, BOOL succeeded, NSError *error) {
// zip
[[NSFileManager defaultManager] removeItemAtPath:path error:nil];
if (completionHandler) {
completionHandler(path, succeeded, error);
}
}];
});
}
- (void)bsdiffFileAtPath:(NSString *)path
fromOrigin:(NSString *)origin
toDestination:(NSString *)destination
completionHandler:(void (^)(BOOL success))completionHandler
{
dispatch_async(_opQueue, ^{
BOOL success = [BSDiff bsdiffPatch:path origin:origin toDestination:destination];
if (completionHandler) {
completionHandler(success);
}
});
}
- (void)copyFiles:(NSDictionary *)filesDic
fromDir:(NSString *)fromDir
toDir:(NSString *)toDir
completionHandler:(void (^)(NSError *error))completionHandler
{
dispatch_async(_opQueue, ^{
for (NSString *to in filesDic.allKeys) {
NSString *from = filesDic[to];
if (from.length <=0) {
from = to;
}
NSString *fromPath = [fromDir stringByAppendingPathComponent:from];
NSString *toPath = [toDir stringByAppendingPathComponent:to];
NSError *error = nil;
[[NSFileManager defaultManager] moveItemAtPath:fromPath toPath:toPath error:&error];
if (error) {
if (completionHandler) {
completionHandler(error);
}
return;
}
}
if (completionHandler) {
completionHandler(nil);
}
});
}
- (void)removeFile:(NSString *)filePath
completionHandler:(void (^)(NSError *error))completionHandler
{
dispatch_async(_opQueue, ^{
NSError *error = nil;
[[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];
if (completionHandler) {
completionHandler(error);
}
});
}
@end