@appzung/react-native-code-push 5.7.1

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.
Files changed (191) hide show
  1. package/AlertAdapter.js +24 -0
  2. package/CONTRIBUTING.md +136 -0
  3. package/CodePush.js +666 -0
  4. package/CodePush.podspec +27 -0
  5. package/LICENSE.md +13 -0
  6. package/README.md +386 -0
  7. package/RestartManager.js +59 -0
  8. package/android/app/build.gradle +31 -0
  9. package/android/app/proguard-rules.pro +25 -0
  10. package/android/app/src/main/AndroidManifest.xml +10 -0
  11. package/android/app/src/main/java/com/microsoft/codepush/react/CodePush.java +395 -0
  12. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushBuilder.java +37 -0
  13. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushConstants.java +34 -0
  14. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushDialog.java +102 -0
  15. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInstallMode.java +16 -0
  16. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInvalidPublicKeyException.java +12 -0
  17. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInvalidUpdateException.java +7 -0
  18. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushMalformedDataException.java +12 -0
  19. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushNativeModule.java +641 -0
  20. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushNotInitializedException.java +12 -0
  21. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushTelemetryManager.java +175 -0
  22. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUnknownException.java +12 -0
  23. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateManager.java +369 -0
  24. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateState.java +15 -0
  25. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateUtils.java +267 -0
  26. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUtils.java +236 -0
  27. package/android/app/src/main/java/com/microsoft/codepush/react/DownloadProgress.java +30 -0
  28. package/android/app/src/main/java/com/microsoft/codepush/react/DownloadProgressCallback.java +5 -0
  29. package/android/app/src/main/java/com/microsoft/codepush/react/FileUtils.java +190 -0
  30. package/android/app/src/main/java/com/microsoft/codepush/react/ReactInstanceHolder.java +17 -0
  31. package/android/app/src/main/java/com/microsoft/codepush/react/SettingsManager.java +173 -0
  32. package/android/build.gradle +20 -0
  33. package/android/codepush.gradle +113 -0
  34. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  35. package/android/gradle/wrapper/gradle-wrapper.properties +5 -0
  36. package/android/gradle.properties +20 -0
  37. package/android/gradlew +164 -0
  38. package/android/gradlew.bat +90 -0
  39. package/android/settings.gradle +1 -0
  40. package/docs/api-android.md +65 -0
  41. package/docs/api-ios.md +31 -0
  42. package/docs/api-js.md +592 -0
  43. package/docs/multi-deployment-testing-android.md +107 -0
  44. package/docs/multi-deployment-testing-ios.md +53 -0
  45. package/docs/setup-android.md +406 -0
  46. package/docs/setup-ios.md +229 -0
  47. package/docs/setup-windows.md +65 -0
  48. package/gulpfile.js +302 -0
  49. package/ios/CodePush/Base64/Base64/MF_Base64Additions.h +34 -0
  50. package/ios/CodePush/Base64/Base64/MF_Base64Additions.m +252 -0
  51. package/ios/CodePush/Base64/README.md +47 -0
  52. package/ios/CodePush/CodePush.h +235 -0
  53. package/ios/CodePush/CodePush.m +1041 -0
  54. package/ios/CodePush/CodePushConfig.m +116 -0
  55. package/ios/CodePush/CodePushDownloadHandler.m +130 -0
  56. package/ios/CodePush/CodePushErrorUtils.m +20 -0
  57. package/ios/CodePush/CodePushPackage.m +598 -0
  58. package/ios/CodePush/CodePushTelemetryManager.m +175 -0
  59. package/ios/CodePush/CodePushUpdateUtils.m +376 -0
  60. package/ios/CodePush/CodePushUtils.m +9 -0
  61. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithm.h +69 -0
  62. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmFactory.h +16 -0
  63. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmFactory.m +51 -0
  64. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmNone.h +15 -0
  65. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmNone.m +55 -0
  66. package/ios/CodePush/JWT/Core/Algorithms/ESFamily/JWTAlgorithmESBase.h +24 -0
  67. package/ios/CodePush/JWT/Core/Algorithms/ESFamily/JWTAlgorithmESBase.m +41 -0
  68. package/ios/CodePush/JWT/Core/Algorithms/HSFamily/JWTAlgorithmHSBase.h +28 -0
  69. package/ios/CodePush/JWT/Core/Algorithms/HSFamily/JWTAlgorithmHSBase.m +205 -0
  70. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolder.h +103 -0
  71. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolder.m +322 -0
  72. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolderChain.h +37 -0
  73. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolderChain.m +145 -0
  74. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTAlgorithmRSBase.h +35 -0
  75. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTAlgorithmRSBase.m +551 -0
  76. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTRSAlgorithm.h +23 -0
  77. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.h +43 -0
  78. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.m +230 -0
  79. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor.h +31 -0
  80. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor.m +113 -0
  81. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.h +38 -0
  82. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.m +500 -0
  83. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaim.h +18 -0
  84. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaim.m +214 -0
  85. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSet.h +23 -0
  86. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSet.m +29 -0
  87. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetSerializer.h +19 -0
  88. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetSerializer.m +68 -0
  89. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetVerifier.h +18 -0
  90. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetVerifier.m +72 -0
  91. package/ios/CodePush/JWT/Core/Coding/JWTCoding+ResultTypes.h +67 -0
  92. package/ios/CodePush/JWT/Core/Coding/JWTCoding+ResultTypes.m +111 -0
  93. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionOne.h +119 -0
  94. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionOne.m +307 -0
  95. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionThree.h +94 -0
  96. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionThree.m +619 -0
  97. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionTwo.h +164 -0
  98. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionTwo.m +514 -0
  99. package/ios/CodePush/JWT/Core/Coding/JWTCoding.h +24 -0
  100. package/ios/CodePush/JWT/Core/Coding/JWTCoding.m +11 -0
  101. package/ios/CodePush/JWT/Core/FrameworkSupplement/JWT.h +52 -0
  102. package/ios/CodePush/JWT/Core/FrameworkSupplement/Map.modulemap +5 -0
  103. package/ios/CodePush/JWT/Core/Supplement/JWTBase64Coder.h +28 -0
  104. package/ios/CodePush/JWT/Core/Supplement/JWTBase64Coder.m +70 -0
  105. package/ios/CodePush/JWT/Core/Supplement/JWTDeprecations.h +22 -0
  106. package/ios/CodePush/JWT/Core/Supplement/JWTErrorDescription.h +34 -0
  107. package/ios/CodePush/JWT/Core/Supplement/JWTErrorDescription.m +73 -0
  108. package/ios/CodePush/JWT/LICENSE +19 -0
  109. package/ios/CodePush/JWT/README.md +489 -0
  110. package/ios/CodePush/RCTConvert+CodePushInstallMode.m +20 -0
  111. package/ios/CodePush/RCTConvert+CodePushUpdateState.m +20 -0
  112. package/ios/CodePush/SSZipArchive/Common.h +81 -0
  113. package/ios/CodePush/SSZipArchive/README.md +1 -0
  114. package/ios/CodePush/SSZipArchive/SSZipArchive.h +76 -0
  115. package/ios/CodePush/SSZipArchive/SSZipArchive.m +691 -0
  116. package/ios/CodePush/SSZipArchive/aes/aes.h +198 -0
  117. package/ios/CodePush/SSZipArchive/aes/aes_via_ace.h +541 -0
  118. package/ios/CodePush/SSZipArchive/aes/aescrypt.c +294 -0
  119. package/ios/CodePush/SSZipArchive/aes/aeskey.c +548 -0
  120. package/ios/CodePush/SSZipArchive/aes/aesopt.h +739 -0
  121. package/ios/CodePush/SSZipArchive/aes/aestab.c +391 -0
  122. package/ios/CodePush/SSZipArchive/aes/aestab.h +173 -0
  123. package/ios/CodePush/SSZipArchive/aes/brg_endian.h +126 -0
  124. package/ios/CodePush/SSZipArchive/aes/brg_types.h +219 -0
  125. package/ios/CodePush/SSZipArchive/aes/entropy.c +54 -0
  126. package/ios/CodePush/SSZipArchive/aes/entropy.h +16 -0
  127. package/ios/CodePush/SSZipArchive/aes/fileenc.c +144 -0
  128. package/ios/CodePush/SSZipArchive/aes/fileenc.h +121 -0
  129. package/ios/CodePush/SSZipArchive/aes/hmac.c +145 -0
  130. package/ios/CodePush/SSZipArchive/aes/hmac.h +103 -0
  131. package/ios/CodePush/SSZipArchive/aes/prng.c +155 -0
  132. package/ios/CodePush/SSZipArchive/aes/prng.h +82 -0
  133. package/ios/CodePush/SSZipArchive/aes/pwd2key.c +103 -0
  134. package/ios/CodePush/SSZipArchive/aes/pwd2key.h +57 -0
  135. package/ios/CodePush/SSZipArchive/aes/sha1.c +258 -0
  136. package/ios/CodePush/SSZipArchive/aes/sha1.h +73 -0
  137. package/ios/CodePush/SSZipArchive/minizip/crypt.h +130 -0
  138. package/ios/CodePush/SSZipArchive/minizip/ioapi.c +369 -0
  139. package/ios/CodePush/SSZipArchive/minizip/ioapi.h +175 -0
  140. package/ios/CodePush/SSZipArchive/minizip/mztools.c +284 -0
  141. package/ios/CodePush/SSZipArchive/minizip/mztools.h +31 -0
  142. package/ios/CodePush/SSZipArchive/minizip/unzip.c +1839 -0
  143. package/ios/CodePush/SSZipArchive/minizip/unzip.h +248 -0
  144. package/ios/CodePush/SSZipArchive/minizip/zip.c +1910 -0
  145. package/ios/CodePush/SSZipArchive/minizip/zip.h +202 -0
  146. package/ios/CodePush.xcodeproj/project.pbxproj +937 -0
  147. package/ios/CodePush.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  148. package/ios/CodePush.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  149. package/logging.js +6 -0
  150. package/package-mixins.js +69 -0
  151. package/package.json +47 -0
  152. package/request-fetch-adapter.js +52 -0
  153. package/scripts/generateBundledResourcesHash.js +125 -0
  154. package/scripts/getFilesInFolder.js +19 -0
  155. package/scripts/postlink/android/postlink.js +87 -0
  156. package/scripts/postlink/ios/postlink.js +116 -0
  157. package/scripts/postlink/run.js +11 -0
  158. package/scripts/postunlink/android/postunlink.js +74 -0
  159. package/scripts/postunlink/ios/postunlink.js +87 -0
  160. package/scripts/postunlink/run.js +11 -0
  161. package/scripts/recordFilesBeforeBundleCommand.js +41 -0
  162. package/scripts/tools/linkToolsAndroid.js +57 -0
  163. package/scripts/tools/linkToolsIos.js +130 -0
  164. package/typings/react-native-code-push.d.ts +446 -0
  165. package/windows/CodePush/CodePush.csproj +128 -0
  166. package/windows/CodePush/CodePushUtils.cs +47 -0
  167. package/windows/CodePush/FileUtils.cs +40 -0
  168. package/windows/CodePush/Properties/AssemblyInfo.cs +29 -0
  169. package/windows/CodePush/Properties/CodePush.rd.xml +33 -0
  170. package/windows/CodePush/UpdateManager.cs +305 -0
  171. package/windows/CodePush/UpdateUtils.cs +46 -0
  172. package/windows/CodePush.Net46/Adapters/Http/HttpProgress.cs +28 -0
  173. package/windows/CodePush.Net46/Adapters/Storage/ApplicationDataContainer.cs +106 -0
  174. package/windows/CodePush.Net46/CodePush.Net46.csproj +103 -0
  175. package/windows/CodePush.Net46/CodePushUtils.cs +158 -0
  176. package/windows/CodePush.Net46/FileUtils.cs +55 -0
  177. package/windows/CodePush.Net46/Properties/AssemblyInfo.cs +36 -0
  178. package/windows/CodePush.Net46/UpdateManager.cs +330 -0
  179. package/windows/CodePush.Net46/UpdateUtils.cs +70 -0
  180. package/windows/CodePush.Net46/packages.config +5 -0
  181. package/windows/CodePush.Shared/CodePush.Shared.projitems +22 -0
  182. package/windows/CodePush.Shared/CodePush.Shared.shproj +13 -0
  183. package/windows/CodePush.Shared/CodePushConstants.cs +35 -0
  184. package/windows/CodePush.Shared/CodePushNativeModule.cs +329 -0
  185. package/windows/CodePush.Shared/CodePushReactPackage.cs +235 -0
  186. package/windows/CodePush.Shared/CodePushUtils.cs +70 -0
  187. package/windows/CodePush.Shared/InstallMode.cs +9 -0
  188. package/windows/CodePush.Shared/MinimumBackgroundListener.cs +44 -0
  189. package/windows/CodePush.Shared/SettingsManager.cs +148 -0
  190. package/windows/CodePush.Shared/TelemetryManager.cs +250 -0
  191. package/windows/CodePush.Shared/UpdateState.cs +9 -0
@@ -0,0 +1,116 @@
1
+ #import "CodePush.h"
2
+ #import <UIKit/UIKit.h>
3
+
4
+ @implementation CodePushConfig {
5
+ NSMutableDictionary *_configDictionary;
6
+ }
7
+
8
+ static CodePushConfig *_currentConfig;
9
+
10
+ static NSString * const AppVersionConfigKey = @"appVersion";
11
+ static NSString * const BuildVersionConfigKey = @"buildVersion";
12
+ static NSString * const ClientUniqueIDConfigKey = @"clientUniqueId";
13
+ static NSString * const DeploymentKeyConfigKey = @"deploymentKey";
14
+ static NSString * const ServerURLConfigKey = @"serverUrl";
15
+ static NSString * const PublicKeyKey = @"publicKey";
16
+
17
+ + (instancetype)current
18
+ {
19
+ return _currentConfig;
20
+ }
21
+
22
+ + (void)initialize
23
+ {
24
+ if (self == [CodePushConfig class]) {
25
+ _currentConfig = [[CodePushConfig alloc] init];
26
+ }
27
+ }
28
+
29
+ - (instancetype)init
30
+ {
31
+ self = [super init];
32
+ NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
33
+
34
+ NSString *appVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
35
+ NSString *buildVersion = [infoDictionary objectForKey:(NSString *)kCFBundleVersionKey];
36
+ NSString *deploymentKey = [infoDictionary objectForKey:@"CodePushDeploymentKey"];
37
+ NSString *serverURL = [infoDictionary objectForKey:@"CodePushServerURL"];
38
+ NSString *publicKey = [infoDictionary objectForKey:@"CodePushPublicKey"];
39
+
40
+ NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
41
+ NSString *clientUniqueId = [userDefaults stringForKey:ClientUniqueIDConfigKey];
42
+ if (clientUniqueId == nil) {
43
+ clientUniqueId = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
44
+ [userDefaults setObject:clientUniqueId forKey:ClientUniqueIDConfigKey];
45
+ [userDefaults synchronize];
46
+ }
47
+
48
+ if (!serverURL) {
49
+ serverURL = @"https://codepush.appzung.com/";
50
+ }
51
+
52
+ _configDictionary = [NSMutableDictionary dictionary];
53
+
54
+ if (appVersion) [_configDictionary setObject:appVersion forKey:AppVersionConfigKey];
55
+ if (buildVersion) [_configDictionary setObject:buildVersion forKey:BuildVersionConfigKey];
56
+ if (serverURL) [_configDictionary setObject:serverURL forKey:ServerURLConfigKey];
57
+ if (clientUniqueId) [_configDictionary setObject:clientUniqueId forKey:ClientUniqueIDConfigKey];
58
+ if (deploymentKey) [_configDictionary setObject:deploymentKey forKey:DeploymentKeyConfigKey];
59
+ if (publicKey) [_configDictionary setObject:publicKey forKey:PublicKeyKey];
60
+
61
+ return self;
62
+ }
63
+
64
+ - (NSString *)appVersion
65
+ {
66
+ return [_configDictionary objectForKey:AppVersionConfigKey];
67
+ }
68
+
69
+ - (NSString *)buildVersion
70
+ {
71
+ return [_configDictionary objectForKey:BuildVersionConfigKey];
72
+ }
73
+
74
+ - (NSDictionary *)configuration
75
+ {
76
+ return _configDictionary;
77
+ }
78
+
79
+ - (NSString *)deploymentKey
80
+ {
81
+ return [_configDictionary objectForKey:DeploymentKeyConfigKey];
82
+ }
83
+
84
+ - (NSString *)serverURL
85
+ {
86
+ return [_configDictionary objectForKey:ServerURLConfigKey];
87
+ }
88
+
89
+ - (NSString *)clientUniqueId
90
+ {
91
+ return [_configDictionary objectForKey:ClientUniqueIDConfigKey];
92
+ }
93
+
94
+ - (NSString *)publicKey
95
+ {
96
+ return [_configDictionary objectForKey:PublicKeyKey];
97
+ }
98
+
99
+ - (void)setAppVersion:(NSString *)appVersion
100
+ {
101
+ [_configDictionary setValue:appVersion forKey:AppVersionConfigKey];
102
+ }
103
+
104
+ - (void)setDeploymentKey:(NSString *)deploymentKey
105
+ {
106
+ [_configDictionary setValue:deploymentKey forKey:DeploymentKeyConfigKey];
107
+ }
108
+
109
+ - (void)setServerURL:(NSString *)serverURL
110
+ {
111
+ [_configDictionary setValue:serverURL forKey:ServerURLConfigKey];
112
+ }
113
+
114
+ //no setter for PublicKey, because it's need to be hard coded within Info.plist for safety
115
+
116
+ @end
@@ -0,0 +1,130 @@
1
+ #import "CodePush.h"
2
+
3
+ @implementation CodePushDownloadHandler {
4
+ // Header chars used to determine if the file is a zip.
5
+ char _header[4];
6
+ }
7
+
8
+ - (id)init:(NSString *)downloadFilePath
9
+ operationQueue:(dispatch_queue_t)operationQueue
10
+ progressCallback:(void (^)(long long, long long))progressCallback
11
+ doneCallback:(void (^)(BOOL))doneCallback
12
+ failCallback:(void (^)(NSError *err))failCallback {
13
+ self.outputFileStream = [NSOutputStream outputStreamToFileAtPath:downloadFilePath
14
+ append:NO];
15
+ self.receivedContentLength = 0;
16
+ self.operationQueue = operationQueue;
17
+ self.progressCallback = progressCallback;
18
+ self.doneCallback = doneCallback;
19
+ self.failCallback = failCallback;
20
+ return self;
21
+ }
22
+
23
+ - (void)download:(NSString *)url {
24
+ self.downloadUrl = url;
25
+ NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]
26
+ cachePolicy:NSURLRequestUseProtocolCachePolicy
27
+ timeoutInterval:60.0];
28
+ NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request
29
+ delegate:self
30
+ startImmediately:NO];
31
+ if ([NSOperationQueue instancesRespondToSelector:@selector(setUnderlyingQueue:)]) {
32
+ NSOperationQueue *delegateQueue = [NSOperationQueue new];
33
+ delegateQueue.underlyingQueue = self.operationQueue;
34
+ [connection setDelegateQueue:delegateQueue];
35
+ } else {
36
+ [connection scheduleInRunLoop:[NSRunLoop mainRunLoop]
37
+ forMode:NSDefaultRunLoopMode];
38
+ }
39
+
40
+ [connection start];
41
+ }
42
+
43
+ #pragma mark NSURLConnection Delegate Methods
44
+
45
+ - (NSCachedURLResponse *)connection:(NSURLConnection *)connection
46
+ willCacheResponse:(NSCachedURLResponse*)cachedResponse {
47
+ // Return nil to indicate not necessary to store a cached response for this connection
48
+ return nil;
49
+ }
50
+
51
+ - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
52
+ if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
53
+ NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
54
+ if (statusCode >= 400) {
55
+ [self.outputFileStream close];
56
+ [connection cancel];
57
+ NSError *err = [CodePushErrorUtils errorWithMessage:[NSString stringWithFormat: @"Received %ld response from %@", (long)statusCode, self.downloadUrl]];
58
+ self.failCallback(err);
59
+ return;
60
+ }
61
+ }
62
+
63
+ self.expectedContentLength = response.expectedContentLength;
64
+ [self.outputFileStream open];
65
+ }
66
+
67
+ - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
68
+ if (self.receivedContentLength < 4) {
69
+ for (int i = 0; i < [data length]; i++) {
70
+ int headerOffset = (int)self.receivedContentLength + i;
71
+ if (headerOffset >= 4) {
72
+ break;
73
+ }
74
+
75
+ const char *bytes = [data bytes];
76
+ _header[headerOffset] = bytes[i];
77
+ }
78
+ }
79
+
80
+ self.receivedContentLength = self.receivedContentLength + [data length];
81
+
82
+ NSInteger bytesLeft = [data length];
83
+
84
+ do {
85
+ NSInteger bytesWritten = [self.outputFileStream write:[data bytes]
86
+ maxLength:bytesLeft];
87
+ if (bytesWritten == -1) {
88
+ break;
89
+ }
90
+
91
+ bytesLeft -= bytesWritten;
92
+ } while (bytesLeft > 0);
93
+
94
+ self.progressCallback(self.expectedContentLength, self.receivedContentLength);
95
+
96
+ // bytesLeft should not be negative.
97
+ assert(bytesLeft >= 0);
98
+
99
+ if (bytesLeft) {
100
+ [self.outputFileStream close];
101
+ [connection cancel];
102
+ self.failCallback([self.outputFileStream streamError]);
103
+ }
104
+ }
105
+
106
+ - (void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error
107
+ {
108
+ [self.outputFileStream close];
109
+ self.failCallback(error);
110
+ }
111
+
112
+ - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
113
+ [self.outputFileStream close];
114
+ if (self.receivedContentLength < 1) {
115
+ NSError *err = [CodePushErrorUtils errorWithMessage:[NSString stringWithFormat:@"Received empty response from %@", self.downloadUrl]];
116
+ self.failCallback(err);
117
+ return;
118
+ }
119
+
120
+ // expectedContentLength might be -1 when NSURLConnection don't know the length(e.g. response encode with gzip)
121
+ if (self.expectedContentLength > 0) {
122
+ // We should have received all of the bytes if this is called.
123
+ assert(self.receivedContentLength == self.expectedContentLength);
124
+ }
125
+
126
+ BOOL isZip = _header[0] == 'P' && _header[1] == 'K' && _header[2] == 3 && _header[3] == 4;
127
+ self.doneCallback(isZip);
128
+ }
129
+
130
+ @end
@@ -0,0 +1,20 @@
1
+ #import "CodePush.h"
2
+
3
+ @implementation CodePushErrorUtils
4
+
5
+ static NSString *const CodePushErrorDomain = @"CodePushError";
6
+ static const int CodePushErrorCode = -1;
7
+
8
+ + (NSError *)errorWithMessage:(NSString *)errorMessage
9
+ {
10
+ return [NSError errorWithDomain:CodePushErrorDomain
11
+ code:CodePushErrorCode
12
+ userInfo:@{ NSLocalizedDescriptionKey: NSLocalizedString(errorMessage, nil) }];
13
+ }
14
+
15
+ + (BOOL)isCodePushError:(NSError *)err
16
+ {
17
+ return err != nil && [CodePushErrorDomain isEqualToString:err.domain];
18
+ }
19
+
20
+ @end