@appzung/react-native-code-push 9.0.2 → 10.0.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.
Files changed (473) hide show
  1. package/CodePush.podspec +1 -0
  2. package/LICENSE.md +1 -1
  3. package/README.md +169 -329
  4. package/android/app/.gradle/config.properties +2 -0
  5. package/android/app/build.gradle +63 -19
  6. package/android/app/local.properties +8 -0
  7. package/android/app/src/main/AndroidManifest.xml +2 -3
  8. package/android/app/src/main/AndroidManifestNew.xml +3 -0
  9. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/CodePush.java +35 -97
  10. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/CodePushConstants.java +1 -1
  11. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/CodePushInstallMode.java +2 -2
  12. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/CodePushInvalidPublicKeyException.java +2 -2
  13. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/CodePushInvalidUpdateException.java +1 -1
  14. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/CodePushMalformedDataException.java +2 -2
  15. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/CodePushNativeModule.java +37 -8
  16. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/CodePushNotInitializedException.java +2 -2
  17. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/CodePushTelemetryManager.java +14 -14
  18. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/CodePushUnknownException.java +2 -2
  19. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/CodePushUpdateManager.java +3 -3
  20. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/CodePushUpdateState.java +2 -2
  21. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/CodePushUpdateUtils.java +1 -1
  22. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/CodePushUtils.java +1 -1
  23. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/DownloadProgress.java +1 -1
  24. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/DownloadProgressCallback.java +1 -1
  25. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/FileUtils.java +1 -1
  26. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/ReactInstanceHolder.java +1 -1
  27. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/SettingsManager.java +1 -1
  28. package/android/app/src/main/java/com/{microsoft → appzung}/codepush/react/TLSSocketFactory.java +1 -1
  29. package/android/build.gradle +1 -11
  30. package/android/codepush.gradle +3 -3
  31. package/android/gradle/wrapper/gradle-wrapper.properties +1 -1
  32. package/android/gradle.properties +4 -20
  33. package/docs/advanced-usage.md +56 -0
  34. package/docs/api-android.md +16 -77
  35. package/docs/api-ios.md +9 -21
  36. package/docs/api-js.md +184 -219
  37. package/docs/code-signing.md +62 -0
  38. package/docs/migrating-to-v10.md +31 -0
  39. package/docs/setup-android.md +54 -463
  40. package/docs/setup-ios.md +37 -208
  41. package/docs/setup-windows.md +8 -74
  42. package/ios/CodePush/CodePush.h +4 -4
  43. package/ios/CodePush/CodePush.m +21 -65
  44. package/ios/CodePush/CodePushConfig.m +14 -11
  45. package/ios/CodePush/CodePushPackage.m +60 -60
  46. package/ios/CodePush/CodePushTelemetryManager.m +13 -13
  47. package/ios/CodePush.xcodeproj/project.pbxproj +1 -562
  48. package/lib/commonjs/CodePush.js +90 -0
  49. package/lib/commonjs/CodePush.js.map +1 -0
  50. package/lib/commonjs/allowRestart.js +12 -0
  51. package/lib/commonjs/allowRestart.js.map +1 -0
  52. package/lib/commonjs/checkForUpdates.js +105 -0
  53. package/lib/commonjs/checkForUpdates.js.map +1 -0
  54. package/lib/commonjs/clearUpdates.js +15 -0
  55. package/lib/commonjs/clearUpdates.js.map +1 -0
  56. package/lib/commonjs/disallowRestart.js +12 -0
  57. package/lib/commonjs/disallowRestart.js.map +1 -0
  58. package/lib/commonjs/enums/CheckFrequency.enum.js +25 -0
  59. package/lib/commonjs/enums/CheckFrequency.enum.js.map +1 -0
  60. package/lib/commonjs/enums/DeploymentStatus.enum.js +21 -0
  61. package/lib/commonjs/enums/DeploymentStatus.enum.js.map +1 -0
  62. package/lib/commonjs/enums/InstallMode.enum.js +35 -0
  63. package/lib/commonjs/enums/InstallMode.enum.js.map +1 -0
  64. package/lib/commonjs/enums/SyncStatus.enum.js +53 -0
  65. package/lib/commonjs/enums/SyncStatus.enum.js.map +1 -0
  66. package/lib/commonjs/enums/UpdateState.enum.js +29 -0
  67. package/lib/commonjs/enums/UpdateState.enum.js.map +1 -0
  68. package/lib/commonjs/getUpdateMetadata.js +25 -0
  69. package/lib/commonjs/getUpdateMetadata.js.map +1 -0
  70. package/lib/commonjs/index.js +195 -0
  71. package/lib/commonjs/index.js.map +1 -0
  72. package/lib/commonjs/internals/AcquisitionSdk.js +9 -0
  73. package/lib/commonjs/internals/AcquisitionSdk.js.map +1 -0
  74. package/lib/commonjs/internals/LocalPackageImplementation.js +29 -0
  75. package/lib/commonjs/internals/LocalPackageImplementation.js.map +1 -0
  76. package/lib/commonjs/internals/NativeRNAppZungCodePushModule.js +8 -0
  77. package/lib/commonjs/internals/NativeRNAppZungCodePushModule.js.map +1 -0
  78. package/lib/commonjs/internals/RNAppZungCodePushModuleSpec.js +6 -0
  79. package/lib/commonjs/internals/RNAppZungCodePushModuleSpec.js.map +1 -0
  80. package/lib/commonjs/internals/RemotePackageImplementation.js +49 -0
  81. package/lib/commonjs/internals/RemotePackageImplementation.js.map +1 -0
  82. package/lib/commonjs/internals/getConfiguration.js +15 -0
  83. package/lib/commonjs/internals/getConfiguration.js.map +1 -0
  84. package/lib/commonjs/internals/getCurrentPackage.js +12 -0
  85. package/lib/commonjs/internals/getCurrentPackage.js.map +1 -0
  86. package/lib/commonjs/internals/getPromisifiedSdk.js +49 -0
  87. package/lib/commonjs/internals/getPromisifiedSdk.js.map +1 -0
  88. package/lib/commonjs/internals/shouldUpdateBeIgnored.js +62 -0
  89. package/lib/commonjs/internals/shouldUpdateBeIgnored.js.map +1 -0
  90. package/lib/commonjs/internals/types.js +6 -0
  91. package/lib/commonjs/internals/types.js.map +1 -0
  92. package/lib/commonjs/internals/utils/log.js +11 -0
  93. package/lib/commonjs/internals/utils/log.js.map +1 -0
  94. package/lib/commonjs/internals/utils/request-fetch-adapter.js +50 -0
  95. package/lib/commonjs/internals/utils/request-fetch-adapter.js.map +1 -0
  96. package/lib/commonjs/internals/version.js +9 -0
  97. package/lib/commonjs/internals/version.js.map +1 -0
  98. package/lib/commonjs/notifyAppReady.js +83 -0
  99. package/lib/commonjs/notifyAppReady.js.map +1 -0
  100. package/lib/commonjs/reactNative.d.js +2 -0
  101. package/lib/commonjs/reactNative.d.js.map +1 -0
  102. package/lib/commonjs/restartApp.js +16 -0
  103. package/lib/commonjs/restartApp.js.map +1 -0
  104. package/lib/commonjs/sync.js +219 -0
  105. package/lib/commonjs/sync.js.map +1 -0
  106. package/lib/commonjs/types.js +6 -0
  107. package/lib/commonjs/types.js.map +1 -0
  108. package/lib/module/CodePush.js +84 -0
  109. package/lib/module/CodePush.js.map +1 -0
  110. package/lib/module/allowRestart.js +9 -0
  111. package/lib/module/allowRestart.js.map +1 -0
  112. package/lib/module/checkForUpdates.js +101 -0
  113. package/lib/module/checkForUpdates.js.map +1 -0
  114. package/lib/module/clearUpdates.js +12 -0
  115. package/lib/module/clearUpdates.js.map +1 -0
  116. package/lib/module/disallowRestart.js +9 -0
  117. package/lib/module/disallowRestart.js.map +1 -0
  118. package/lib/module/enums/CheckFrequency.enum.js +21 -0
  119. package/lib/module/enums/CheckFrequency.enum.js.map +1 -0
  120. package/lib/module/enums/DeploymentStatus.enum.js +17 -0
  121. package/lib/module/enums/DeploymentStatus.enum.js.map +1 -0
  122. package/lib/module/enums/InstallMode.enum.js +32 -0
  123. package/lib/module/enums/InstallMode.enum.js.map +1 -0
  124. package/lib/module/enums/SyncStatus.enum.js +49 -0
  125. package/lib/module/enums/SyncStatus.enum.js.map +1 -0
  126. package/lib/module/enums/UpdateState.enum.js +26 -0
  127. package/lib/module/enums/UpdateState.enum.js.map +1 -0
  128. package/lib/module/getUpdateMetadata.js +21 -0
  129. package/lib/module/getUpdateMetadata.js.map +1 -0
  130. package/lib/module/index.js +19 -0
  131. package/lib/module/index.js.map +1 -0
  132. package/lib/module/internals/AcquisitionSdk.js +5 -0
  133. package/lib/module/internals/AcquisitionSdk.js.map +1 -0
  134. package/lib/module/internals/LocalPackageImplementation.js +24 -0
  135. package/lib/module/internals/LocalPackageImplementation.js.map +1 -0
  136. package/lib/module/internals/NativeRNAppZungCodePushModule.js +4 -0
  137. package/lib/module/internals/NativeRNAppZungCodePushModule.js.map +1 -0
  138. package/lib/module/internals/RNAppZungCodePushModuleSpec.js +4 -0
  139. package/lib/module/internals/RNAppZungCodePushModuleSpec.js.map +1 -0
  140. package/lib/module/internals/RemotePackageImplementation.js +44 -0
  141. package/lib/module/internals/RemotePackageImplementation.js.map +1 -0
  142. package/lib/module/internals/getConfiguration.js +11 -0
  143. package/lib/module/internals/getConfiguration.js.map +1 -0
  144. package/lib/module/internals/getCurrentPackage.js +8 -0
  145. package/lib/module/internals/getCurrentPackage.js.map +1 -0
  146. package/lib/module/internals/getPromisifiedSdk.js +45 -0
  147. package/lib/module/internals/getPromisifiedSdk.js.map +1 -0
  148. package/lib/module/internals/shouldUpdateBeIgnored.js +58 -0
  149. package/lib/module/internals/shouldUpdateBeIgnored.js.map +1 -0
  150. package/lib/module/internals/types.js +4 -0
  151. package/lib/module/internals/types.js.map +1 -0
  152. package/lib/module/internals/utils/log.js +7 -0
  153. package/lib/module/internals/utils/log.js.map +1 -0
  154. package/lib/module/internals/utils/request-fetch-adapter.js +46 -0
  155. package/lib/module/internals/utils/request-fetch-adapter.js.map +1 -0
  156. package/lib/module/internals/version.js +5 -0
  157. package/lib/module/internals/version.js.map +1 -0
  158. package/lib/module/notifyAppReady.js +79 -0
  159. package/lib/module/notifyAppReady.js.map +1 -0
  160. package/lib/module/reactNative.d.js +2 -0
  161. package/lib/module/reactNative.d.js.map +1 -0
  162. package/lib/module/restartApp.js +13 -0
  163. package/lib/module/restartApp.js.map +1 -0
  164. package/lib/module/sync.js +215 -0
  165. package/lib/module/sync.js.map +1 -0
  166. package/lib/module/types.js +4 -0
  167. package/lib/module/types.js.map +1 -0
  168. package/lib/typescript/commonjs/package.json +1 -0
  169. package/lib/typescript/commonjs/src/CodePush.d.ts +24 -0
  170. package/lib/typescript/commonjs/src/CodePush.d.ts.map +1 -0
  171. package/lib/typescript/commonjs/src/allowRestart.d.ts +5 -0
  172. package/lib/typescript/commonjs/src/allowRestart.d.ts.map +1 -0
  173. package/lib/typescript/commonjs/src/checkForUpdates.d.ts +9 -0
  174. package/lib/typescript/commonjs/src/checkForUpdates.d.ts.map +1 -0
  175. package/lib/typescript/commonjs/src/clearUpdates.d.ts +8 -0
  176. package/lib/typescript/commonjs/src/clearUpdates.d.ts.map +1 -0
  177. package/lib/typescript/commonjs/src/disallowRestart.d.ts +5 -0
  178. package/lib/typescript/commonjs/src/disallowRestart.d.ts.map +1 -0
  179. package/lib/typescript/commonjs/src/enums/CheckFrequency.enum.d.ts +18 -0
  180. package/lib/typescript/commonjs/src/enums/CheckFrequency.enum.d.ts.map +1 -0
  181. package/lib/typescript/commonjs/src/enums/DeploymentStatus.enum.d.ts +14 -0
  182. package/lib/typescript/commonjs/src/enums/DeploymentStatus.enum.d.ts.map +1 -0
  183. package/lib/typescript/commonjs/src/enums/InstallMode.enum.d.ts +27 -0
  184. package/lib/typescript/commonjs/src/enums/InstallMode.enum.d.ts.map +1 -0
  185. package/lib/typescript/commonjs/src/enums/SyncStatus.enum.d.ts +46 -0
  186. package/lib/typescript/commonjs/src/enums/SyncStatus.enum.d.ts.map +1 -0
  187. package/lib/typescript/commonjs/src/enums/UpdateState.enum.d.ts +21 -0
  188. package/lib/typescript/commonjs/src/enums/UpdateState.enum.d.ts.map +1 -0
  189. package/lib/typescript/commonjs/src/getUpdateMetadata.d.ts +9 -0
  190. package/lib/typescript/commonjs/src/getUpdateMetadata.d.ts.map +1 -0
  191. package/lib/typescript/commonjs/src/index.d.ts +17 -0
  192. package/lib/typescript/commonjs/src/index.d.ts.map +1 -0
  193. package/lib/typescript/commonjs/src/internals/AcquisitionSdk.d.ts +3 -0
  194. package/lib/typescript/commonjs/src/internals/AcquisitionSdk.d.ts.map +1 -0
  195. package/lib/typescript/commonjs/src/internals/LocalPackageImplementation.d.ts +17 -0
  196. package/lib/typescript/commonjs/src/internals/LocalPackageImplementation.d.ts.map +1 -0
  197. package/lib/typescript/commonjs/src/internals/NativeRNAppZungCodePushModule.d.ts +3 -0
  198. package/lib/typescript/commonjs/src/internals/NativeRNAppZungCodePushModule.d.ts.map +1 -0
  199. package/lib/typescript/commonjs/src/internals/RNAppZungCodePushModuleSpec.d.ts +36 -0
  200. package/lib/typescript/commonjs/src/internals/RNAppZungCodePushModuleSpec.d.ts.map +1 -0
  201. package/lib/typescript/commonjs/src/internals/RemotePackageImplementation.d.ts +18 -0
  202. package/lib/typescript/commonjs/src/internals/RemotePackageImplementation.d.ts.map +1 -0
  203. package/lib/typescript/commonjs/src/internals/getConfiguration.d.ts +3 -0
  204. package/lib/typescript/commonjs/src/internals/getConfiguration.d.ts.map +1 -0
  205. package/lib/typescript/commonjs/src/internals/getCurrentPackage.d.ts +2 -0
  206. package/lib/typescript/commonjs/src/internals/getCurrentPackage.d.ts.map +1 -0
  207. package/lib/typescript/commonjs/src/internals/getPromisifiedSdk.d.ts +13 -0
  208. package/lib/typescript/commonjs/src/internals/getPromisifiedSdk.d.ts.map +1 -0
  209. package/lib/typescript/commonjs/src/internals/shouldUpdateBeIgnored.d.ts +3 -0
  210. package/lib/typescript/commonjs/src/internals/shouldUpdateBeIgnored.d.ts.map +1 -0
  211. package/lib/typescript/commonjs/src/internals/types.d.ts +16 -0
  212. package/lib/typescript/commonjs/src/internals/types.d.ts.map +1 -0
  213. package/lib/typescript/commonjs/src/internals/utils/log.d.ts +2 -0
  214. package/lib/typescript/commonjs/src/internals/utils/log.d.ts.map +1 -0
  215. package/lib/typescript/commonjs/src/internals/utils/request-fetch-adapter.d.ts +3 -0
  216. package/lib/typescript/commonjs/src/internals/utils/request-fetch-adapter.d.ts.map +1 -0
  217. package/lib/typescript/commonjs/src/internals/version.d.ts +2 -0
  218. package/lib/typescript/commonjs/src/internals/version.d.ts.map +1 -0
  219. package/lib/typescript/commonjs/src/notifyAppReady.d.ts +6 -0
  220. package/lib/typescript/commonjs/src/notifyAppReady.d.ts.map +1 -0
  221. package/lib/typescript/commonjs/src/restartApp.d.ts +7 -0
  222. package/lib/typescript/commonjs/src/restartApp.d.ts.map +1 -0
  223. package/lib/typescript/commonjs/src/sync.d.ts +17 -0
  224. package/lib/typescript/commonjs/src/sync.d.ts.map +1 -0
  225. package/lib/typescript/commonjs/src/types.d.ts +196 -0
  226. package/lib/typescript/commonjs/src/types.d.ts.map +1 -0
  227. package/lib/typescript/module/package.json +1 -0
  228. package/lib/typescript/module/src/CodePush.d.ts +24 -0
  229. package/lib/typescript/module/src/CodePush.d.ts.map +1 -0
  230. package/lib/typescript/module/src/allowRestart.d.ts +5 -0
  231. package/lib/typescript/module/src/allowRestart.d.ts.map +1 -0
  232. package/lib/typescript/module/src/checkForUpdates.d.ts +9 -0
  233. package/lib/typescript/module/src/checkForUpdates.d.ts.map +1 -0
  234. package/lib/typescript/module/src/clearUpdates.d.ts +8 -0
  235. package/lib/typescript/module/src/clearUpdates.d.ts.map +1 -0
  236. package/lib/typescript/module/src/disallowRestart.d.ts +5 -0
  237. package/lib/typescript/module/src/disallowRestart.d.ts.map +1 -0
  238. package/lib/typescript/module/src/enums/CheckFrequency.enum.d.ts +18 -0
  239. package/lib/typescript/module/src/enums/CheckFrequency.enum.d.ts.map +1 -0
  240. package/lib/typescript/module/src/enums/DeploymentStatus.enum.d.ts +14 -0
  241. package/lib/typescript/module/src/enums/DeploymentStatus.enum.d.ts.map +1 -0
  242. package/lib/typescript/module/src/enums/InstallMode.enum.d.ts +27 -0
  243. package/lib/typescript/module/src/enums/InstallMode.enum.d.ts.map +1 -0
  244. package/lib/typescript/module/src/enums/SyncStatus.enum.d.ts +46 -0
  245. package/lib/typescript/module/src/enums/SyncStatus.enum.d.ts.map +1 -0
  246. package/lib/typescript/module/src/enums/UpdateState.enum.d.ts +21 -0
  247. package/lib/typescript/module/src/enums/UpdateState.enum.d.ts.map +1 -0
  248. package/lib/typescript/module/src/getUpdateMetadata.d.ts +9 -0
  249. package/lib/typescript/module/src/getUpdateMetadata.d.ts.map +1 -0
  250. package/lib/typescript/module/src/index.d.ts +17 -0
  251. package/lib/typescript/module/src/index.d.ts.map +1 -0
  252. package/lib/typescript/module/src/internals/AcquisitionSdk.d.ts +3 -0
  253. package/lib/typescript/module/src/internals/AcquisitionSdk.d.ts.map +1 -0
  254. package/lib/typescript/module/src/internals/LocalPackageImplementation.d.ts +17 -0
  255. package/lib/typescript/module/src/internals/LocalPackageImplementation.d.ts.map +1 -0
  256. package/lib/typescript/module/src/internals/NativeRNAppZungCodePushModule.d.ts +3 -0
  257. package/lib/typescript/module/src/internals/NativeRNAppZungCodePushModule.d.ts.map +1 -0
  258. package/lib/typescript/module/src/internals/RNAppZungCodePushModuleSpec.d.ts +36 -0
  259. package/lib/typescript/module/src/internals/RNAppZungCodePushModuleSpec.d.ts.map +1 -0
  260. package/lib/typescript/module/src/internals/RemotePackageImplementation.d.ts +18 -0
  261. package/lib/typescript/module/src/internals/RemotePackageImplementation.d.ts.map +1 -0
  262. package/lib/typescript/module/src/internals/getConfiguration.d.ts +3 -0
  263. package/lib/typescript/module/src/internals/getConfiguration.d.ts.map +1 -0
  264. package/lib/typescript/module/src/internals/getCurrentPackage.d.ts +2 -0
  265. package/lib/typescript/module/src/internals/getCurrentPackage.d.ts.map +1 -0
  266. package/lib/typescript/module/src/internals/getPromisifiedSdk.d.ts +13 -0
  267. package/lib/typescript/module/src/internals/getPromisifiedSdk.d.ts.map +1 -0
  268. package/lib/typescript/module/src/internals/shouldUpdateBeIgnored.d.ts +3 -0
  269. package/lib/typescript/module/src/internals/shouldUpdateBeIgnored.d.ts.map +1 -0
  270. package/lib/typescript/module/src/internals/types.d.ts +16 -0
  271. package/lib/typescript/module/src/internals/types.d.ts.map +1 -0
  272. package/lib/typescript/module/src/internals/utils/log.d.ts +2 -0
  273. package/lib/typescript/module/src/internals/utils/log.d.ts.map +1 -0
  274. package/lib/typescript/module/src/internals/utils/request-fetch-adapter.d.ts +3 -0
  275. package/lib/typescript/module/src/internals/utils/request-fetch-adapter.d.ts.map +1 -0
  276. package/lib/typescript/module/src/internals/version.d.ts +2 -0
  277. package/lib/typescript/module/src/internals/version.d.ts.map +1 -0
  278. package/lib/typescript/module/src/notifyAppReady.d.ts +6 -0
  279. package/lib/typescript/module/src/notifyAppReady.d.ts.map +1 -0
  280. package/lib/typescript/module/src/restartApp.d.ts +7 -0
  281. package/lib/typescript/module/src/restartApp.d.ts.map +1 -0
  282. package/lib/typescript/module/src/sync.d.ts +17 -0
  283. package/lib/typescript/module/src/sync.d.ts.map +1 -0
  284. package/lib/typescript/module/src/types.d.ts +196 -0
  285. package/lib/typescript/module/src/types.d.ts.map +1 -0
  286. package/package.json +79 -29
  287. package/react-native.config.js +8 -8
  288. package/scripts/generateBundledResourcesHash.js +1 -1
  289. package/scripts/getFilesInFolder.js +1 -1
  290. package/scripts/recordFilesBeforeBundleCommand.js +1 -1
  291. package/src/CodePush.tsx +108 -0
  292. package/src/allowRestart.ts +6 -0
  293. package/src/checkForUpdates.ts +109 -0
  294. package/src/clearUpdates.ts +9 -0
  295. package/src/disallowRestart.ts +6 -0
  296. package/src/enums/CheckFrequency.enum.ts +19 -0
  297. package/src/enums/DeploymentStatus.enum.ts +14 -0
  298. package/src/enums/InstallMode.enum.ts +31 -0
  299. package/src/enums/SyncStatus.enum.ts +53 -0
  300. package/src/enums/UpdateState.enum.ts +24 -0
  301. package/src/getUpdateMetadata.ts +23 -0
  302. package/src/index.ts +18 -0
  303. package/src/internals/AcquisitionSdk.ts +3 -0
  304. package/src/internals/LocalPackageImplementation.ts +45 -0
  305. package/src/internals/NativeRNAppZungCodePushModule.ts +3 -0
  306. package/src/internals/RNAppZungCodePushModuleSpec.ts +54 -0
  307. package/src/internals/RemotePackageImplementation.ts +69 -0
  308. package/src/internals/getConfiguration.ts +12 -0
  309. package/src/internals/getCurrentPackage.ts +6 -0
  310. package/src/internals/getPromisifiedSdk.ts +72 -0
  311. package/src/internals/shouldUpdateBeIgnored.ts +76 -0
  312. package/src/internals/types.ts +18 -0
  313. package/{logging.js → src/internals/utils/log.ts} +1 -3
  314. package/src/internals/utils/request-fetch-adapter.ts +58 -0
  315. package/src/internals/version.ts +2 -0
  316. package/src/notifyAppReady.ts +94 -0
  317. package/src/reactNative.d.ts +34 -0
  318. package/src/restartApp.ts +10 -0
  319. package/src/sync.ts +272 -0
  320. package/src/types.ts +237 -0
  321. package/tsconfig.build.json +4 -0
  322. package/tsconfig.json +29 -12
  323. package/windows/CodePush/CodePushConfig.cpp +3 -3
  324. package/windows/CodePush/CodePushConfig.h +3 -3
  325. package/windows/CodePush/CodePushNativeModule.cpp +27 -27
  326. package/windows/CodePush/CodePushNativeModule.h +4 -4
  327. package/windows/CodePush/CodePushTelemetryManager.cpp +12 -12
  328. package/windows/CodePush/CodePushTelemetryManager.h +1 -1
  329. package/.azurepipelines/build-rn-code-push-1es.yml +0 -104
  330. package/.azurepipelines/test-rn-code-push.yml +0 -94
  331. package/.config/CredScanSuppressions.json +0 -14
  332. package/AlertAdapter.js +0 -24
  333. package/CONTRIBUTING.md +0 -134
  334. package/CodePush.js +0 -671
  335. package/SECURITY.md +0 -41
  336. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushBuilder.java +0 -37
  337. package/android/app/src/main/java/com/microsoft/codepush/react/CodePushDialog.java +0 -102
  338. package/docs/multi-deployment-testing-android.md +0 -148
  339. package/docs/multi-deployment-testing-ios.md +0 -59
  340. package/ios/CodePush/Base64/Base64/MF_Base64Additions.h +0 -34
  341. package/ios/CodePush/Base64/Base64/MF_Base64Additions.m +0 -252
  342. package/ios/CodePush/Base64/README.md +0 -47
  343. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithm.h +0 -69
  344. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmFactory.h +0 -16
  345. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmFactory.m +0 -51
  346. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmNone.h +0 -15
  347. package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmNone.m +0 -55
  348. package/ios/CodePush/JWT/Core/Algorithms/ESFamily/JWTAlgorithmESBase.h +0 -24
  349. package/ios/CodePush/JWT/Core/Algorithms/ESFamily/JWTAlgorithmESBase.m +0 -41
  350. package/ios/CodePush/JWT/Core/Algorithms/HSFamily/JWTAlgorithmHSBase.h +0 -28
  351. package/ios/CodePush/JWT/Core/Algorithms/HSFamily/JWTAlgorithmHSBase.m +0 -205
  352. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolder.h +0 -103
  353. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolder.m +0 -322
  354. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolderChain.h +0 -37
  355. package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolderChain.m +0 -145
  356. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTAlgorithmRSBase.h +0 -35
  357. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTAlgorithmRSBase.m +0 -551
  358. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTRSAlgorithm.h +0 -23
  359. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.h +0 -43
  360. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.m +0 -230
  361. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor.h +0 -31
  362. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor.m +0 -113
  363. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.h +0 -38
  364. package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.m +0 -500
  365. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaim.h +0 -18
  366. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaim.m +0 -214
  367. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSet.h +0 -23
  368. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSet.m +0 -29
  369. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetSerializer.h +0 -19
  370. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetSerializer.m +0 -68
  371. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetVerifier.h +0 -18
  372. package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetVerifier.m +0 -72
  373. package/ios/CodePush/JWT/Core/Coding/JWTCoding+ResultTypes.h +0 -67
  374. package/ios/CodePush/JWT/Core/Coding/JWTCoding+ResultTypes.m +0 -111
  375. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionOne.h +0 -119
  376. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionOne.m +0 -307
  377. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionThree.h +0 -94
  378. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionThree.m +0 -619
  379. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionTwo.h +0 -164
  380. package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionTwo.m +0 -514
  381. package/ios/CodePush/JWT/Core/Coding/JWTCoding.h +0 -24
  382. package/ios/CodePush/JWT/Core/Coding/JWTCoding.m +0 -11
  383. package/ios/CodePush/JWT/Core/FrameworkSupplement/JWT.h +0 -52
  384. package/ios/CodePush/JWT/Core/FrameworkSupplement/Map.modulemap +0 -5
  385. package/ios/CodePush/JWT/Core/Supplement/JWTBase64Coder.h +0 -28
  386. package/ios/CodePush/JWT/Core/Supplement/JWTBase64Coder.m +0 -70
  387. package/ios/CodePush/JWT/Core/Supplement/JWTDeprecations.h +0 -22
  388. package/ios/CodePush/JWT/Core/Supplement/JWTErrorDescription.h +0 -34
  389. package/ios/CodePush/JWT/Core/Supplement/JWTErrorDescription.m +0 -73
  390. package/ios/CodePush/JWT/LICENSE +0 -19
  391. package/ios/CodePush/JWT/README.md +0 -489
  392. package/ios/CodePush/SSZipArchive/Info.plist +0 -26
  393. package/ios/CodePush/SSZipArchive/README.md +0 -1
  394. package/ios/CodePush/SSZipArchive/SSZipArchive.h +0 -178
  395. package/ios/CodePush/SSZipArchive/SSZipArchive.m +0 -1496
  396. package/ios/CodePush/SSZipArchive/SSZipCommon.h +0 -71
  397. package/ios/CodePush/SSZipArchive/Supporting Files/PrivacyInfo.xcprivacy +0 -23
  398. package/ios/CodePush/SSZipArchive/include/ZipArchive.h +0 -25
  399. package/ios/CodePush/SSZipArchive/minizip/LICENSE +0 -17
  400. package/ios/CodePush/SSZipArchive/minizip/mz.h +0 -273
  401. package/ios/CodePush/SSZipArchive/minizip/mz_compat.c +0 -1306
  402. package/ios/CodePush/SSZipArchive/minizip/mz_compat.h +0 -346
  403. package/ios/CodePush/SSZipArchive/minizip/mz_crypt.c +0 -187
  404. package/ios/CodePush/SSZipArchive/minizip/mz_crypt.h +0 -65
  405. package/ios/CodePush/SSZipArchive/minizip/mz_crypt_apple.c +0 -526
  406. package/ios/CodePush/SSZipArchive/minizip/mz_os.c +0 -348
  407. package/ios/CodePush/SSZipArchive/minizip/mz_os.h +0 -176
  408. package/ios/CodePush/SSZipArchive/minizip/mz_os_posix.c +0 -350
  409. package/ios/CodePush/SSZipArchive/minizip/mz_strm.c +0 -556
  410. package/ios/CodePush/SSZipArchive/minizip/mz_strm.h +0 -132
  411. package/ios/CodePush/SSZipArchive/minizip/mz_strm_buf.c +0 -383
  412. package/ios/CodePush/SSZipArchive/minizip/mz_strm_buf.h +0 -42
  413. package/ios/CodePush/SSZipArchive/minizip/mz_strm_mem.c +0 -269
  414. package/ios/CodePush/SSZipArchive/minizip/mz_strm_mem.h +0 -48
  415. package/ios/CodePush/SSZipArchive/minizip/mz_strm_os.h +0 -40
  416. package/ios/CodePush/SSZipArchive/minizip/mz_strm_os_posix.c +0 -203
  417. package/ios/CodePush/SSZipArchive/minizip/mz_strm_pkcrypt.c +0 -334
  418. package/ios/CodePush/SSZipArchive/minizip/mz_strm_pkcrypt.h +0 -46
  419. package/ios/CodePush/SSZipArchive/minizip/mz_strm_split.c +0 -429
  420. package/ios/CodePush/SSZipArchive/minizip/mz_strm_split.h +0 -43
  421. package/ios/CodePush/SSZipArchive/minizip/mz_strm_wzaes.c +0 -360
  422. package/ios/CodePush/SSZipArchive/minizip/mz_strm_wzaes.h +0 -46
  423. package/ios/CodePush/SSZipArchive/minizip/mz_strm_zlib.c +0 -389
  424. package/ios/CodePush/SSZipArchive/minizip/mz_strm_zlib.h +0 -43
  425. package/ios/CodePush/SSZipArchive/minizip/mz_zip.c +0 -2782
  426. package/ios/CodePush/SSZipArchive/minizip/mz_zip.h +0 -262
  427. package/ios/CodePush/SSZipArchive/minizip/mz_zip_rw.c +0 -1942
  428. package/ios/CodePush/SSZipArchive/minizip/mz_zip_rw.h +0 -285
  429. package/package-mixins.js +0 -68
  430. package/request-fetch-adapter.js +0 -52
  431. package/scripts/postlink/android/postlink.js +0 -87
  432. package/scripts/postlink/ios/postlink.js +0 -116
  433. package/scripts/postlink/run.js +0 -11
  434. package/scripts/postunlink/android/postunlink.js +0 -74
  435. package/scripts/postunlink/ios/postunlink.js +0 -87
  436. package/scripts/postunlink/run.js +0 -11
  437. package/scripts/tools/linkToolsAndroid.js +0 -57
  438. package/scripts/tools/linkToolsIos.js +0 -130
  439. package/tslint.json +0 -32
  440. package/typings/react-native-code-push.d.ts +0 -455
  441. package/windows-legacy/CodePush/CodePush.csproj +0 -128
  442. package/windows-legacy/CodePush/CodePushUtils.cs +0 -47
  443. package/windows-legacy/CodePush/FileUtils.cs +0 -40
  444. package/windows-legacy/CodePush/Properties/AssemblyInfo.cs +0 -29
  445. package/windows-legacy/CodePush/Properties/CodePush.rd.xml +0 -33
  446. package/windows-legacy/CodePush/UpdateManager.cs +0 -305
  447. package/windows-legacy/CodePush/UpdateUtils.cs +0 -46
  448. package/windows-legacy/CodePush.Net46/Adapters/Http/HttpProgress.cs +0 -28
  449. package/windows-legacy/CodePush.Net46/Adapters/Storage/ApplicationDataContainer.cs +0 -106
  450. package/windows-legacy/CodePush.Net46/CodePush.Net46.csproj +0 -103
  451. package/windows-legacy/CodePush.Net46/CodePushUtils.cs +0 -158
  452. package/windows-legacy/CodePush.Net46/FileUtils.cs +0 -55
  453. package/windows-legacy/CodePush.Net46/Properties/AssemblyInfo.cs +0 -36
  454. package/windows-legacy/CodePush.Net46/UpdateManager.cs +0 -330
  455. package/windows-legacy/CodePush.Net46/UpdateUtils.cs +0 -70
  456. package/windows-legacy/CodePush.Net46/packages.config +0 -5
  457. package/windows-legacy/CodePush.Net46.Test/ApplicationDataContainerTest.cs +0 -105
  458. package/windows-legacy/CodePush.Net46.Test/CodePush.Net46.Test.csproj +0 -137
  459. package/windows-legacy/CodePush.Net46.Test/Properties/AssemblyInfo.cs +0 -36
  460. package/windows-legacy/CodePush.Net46.Test/TelemetryManagerTest.cs +0 -117
  461. package/windows-legacy/CodePush.Net46.Test/app.config +0 -11
  462. package/windows-legacy/CodePush.Net46.Test/packages.config +0 -4
  463. package/windows-legacy/CodePush.Shared/CodePush.Shared.projitems +0 -22
  464. package/windows-legacy/CodePush.Shared/CodePush.Shared.shproj +0 -13
  465. package/windows-legacy/CodePush.Shared/CodePushConstants.cs +0 -35
  466. package/windows-legacy/CodePush.Shared/CodePushNativeModule.cs +0 -329
  467. package/windows-legacy/CodePush.Shared/CodePushReactPackage.cs +0 -235
  468. package/windows-legacy/CodePush.Shared/CodePushUtils.cs +0 -70
  469. package/windows-legacy/CodePush.Shared/InstallMode.cs +0 -9
  470. package/windows-legacy/CodePush.Shared/MinimumBackgroundListener.cs +0 -44
  471. package/windows-legacy/CodePush.Shared/SettingsManager.cs +0 -148
  472. package/windows-legacy/CodePush.Shared/TelemetryManager.cs +0 -250
  473. package/windows-legacy/CodePush.Shared/UpdateState.cs +0 -9
@@ -1,1942 +0,0 @@
1
- /* mz_zip_rw.c -- Zip reader/writer
2
- part of the minizip-ng project
3
-
4
- Copyright (C) Nathan Moinvaziri
5
- https://github.com/zlib-ng/minizip-ng
6
-
7
- This program is distributed under the terms of the same license as zlib.
8
- See the accompanying LICENSE file for the full text of the license.
9
- */
10
-
11
- #include "mz.h"
12
- #include "mz_crypt.h"
13
- #include "mz_os.h"
14
- #include "mz_strm.h"
15
- #include "mz_strm_buf.h"
16
- #include "mz_strm_mem.h"
17
- #include "mz_strm_os.h"
18
- #include "mz_strm_split.h"
19
- #include "mz_strm_wzaes.h"
20
- #include "mz_zip.h"
21
-
22
- #include "mz_zip_rw.h"
23
-
24
- /***************************************************************************/
25
-
26
- #define MZ_DEFAULT_PROGRESS_INTERVAL (1000u)
27
-
28
- #define MZ_ZIP_CD_FILENAME ("__cdcd__")
29
-
30
- /***************************************************************************/
31
-
32
- typedef struct mz_zip_reader_s {
33
- void *zip_handle;
34
- void *file_stream;
35
- void *buffered_stream;
36
- void *split_stream;
37
- void *mem_stream;
38
- void *hash;
39
- uint16_t hash_algorithm;
40
- uint16_t hash_digest_size;
41
- mz_zip_file *file_info;
42
- const char *pattern;
43
- uint8_t pattern_ignore_case;
44
- const char *password;
45
- void *overwrite_userdata;
46
- mz_zip_reader_overwrite_cb
47
- overwrite_cb;
48
- void *password_userdata;
49
- mz_zip_reader_password_cb
50
- password_cb;
51
- void *progress_userdata;
52
- mz_zip_reader_progress_cb
53
- progress_cb;
54
- uint32_t progress_cb_interval_ms;
55
- void *entry_userdata;
56
- mz_zip_reader_entry_cb
57
- entry_cb;
58
- uint8_t raw;
59
- uint8_t buffer[UINT16_MAX];
60
- int32_t encoding;
61
- uint8_t sign_required;
62
- uint8_t cd_verified;
63
- uint8_t cd_zipped;
64
- uint8_t entry_verified;
65
- uint8_t recover;
66
- } mz_zip_reader;
67
-
68
- /***************************************************************************/
69
-
70
- int32_t mz_zip_reader_is_open(void *handle) {
71
- mz_zip_reader *reader = (mz_zip_reader *)handle;
72
- if (!reader)
73
- return MZ_PARAM_ERROR;
74
- if (!reader->zip_handle)
75
- return MZ_PARAM_ERROR;
76
- return MZ_OK;
77
- }
78
-
79
- int32_t mz_zip_reader_open(void *handle, void *stream) {
80
- mz_zip_reader *reader = (mz_zip_reader *)handle;
81
- int32_t err = MZ_OK;
82
-
83
- reader->cd_verified = 0;
84
- reader->cd_zipped = 0;
85
-
86
- mz_zip_create(&reader->zip_handle);
87
- mz_zip_set_recover(reader->zip_handle, reader->recover);
88
-
89
- err = mz_zip_open(reader->zip_handle, stream, MZ_OPEN_MODE_READ);
90
-
91
- if (err != MZ_OK) {
92
- mz_zip_reader_close(handle);
93
- return err;
94
- }
95
-
96
- mz_zip_reader_unzip_cd(reader);
97
- return MZ_OK;
98
- }
99
-
100
- int32_t mz_zip_reader_open_file(void *handle, const char *path) {
101
- mz_zip_reader *reader = (mz_zip_reader *)handle;
102
- int32_t err = MZ_OK;
103
-
104
- mz_zip_reader_close(handle);
105
-
106
- mz_stream_os_create(&reader->file_stream);
107
- mz_stream_buffered_create(&reader->buffered_stream);
108
- mz_stream_split_create(&reader->split_stream);
109
-
110
- mz_stream_set_base(reader->buffered_stream, reader->file_stream);
111
- mz_stream_set_base(reader->split_stream, reader->buffered_stream);
112
-
113
- err = mz_stream_open(reader->split_stream, path, MZ_OPEN_MODE_READ);
114
- if (err == MZ_OK)
115
- err = mz_zip_reader_open(handle, reader->split_stream);
116
- return err;
117
- }
118
-
119
- int32_t mz_zip_reader_open_file_in_memory(void *handle, const char *path) {
120
- mz_zip_reader *reader = (mz_zip_reader *)handle;
121
- void *file_stream = NULL;
122
- int64_t file_size = 0;
123
- int32_t err = 0;
124
-
125
- mz_zip_reader_close(handle);
126
-
127
- mz_stream_os_create(&file_stream);
128
-
129
- err = mz_stream_os_open(file_stream, path, MZ_OPEN_MODE_READ);
130
-
131
- if (err != MZ_OK) {
132
- mz_stream_os_delete(&file_stream);
133
- mz_zip_reader_close(handle);
134
- return err;
135
- }
136
-
137
- mz_stream_os_seek(file_stream, 0, MZ_SEEK_END);
138
- file_size = mz_stream_os_tell(file_stream);
139
- mz_stream_os_seek(file_stream, 0, MZ_SEEK_SET);
140
-
141
- if ((file_size <= 0) || (file_size > UINT32_MAX)) {
142
- /* Memory size is too large or too small */
143
-
144
- mz_stream_os_close(file_stream);
145
- mz_stream_os_delete(&file_stream);
146
- mz_zip_reader_close(handle);
147
- return MZ_MEM_ERROR;
148
- }
149
-
150
- mz_stream_mem_create(&reader->mem_stream);
151
- mz_stream_mem_set_grow_size(reader->mem_stream, (int32_t)file_size);
152
- mz_stream_mem_open(reader->mem_stream, NULL, MZ_OPEN_MODE_CREATE);
153
-
154
- err = mz_stream_copy(reader->mem_stream, file_stream, (int32_t)file_size);
155
-
156
- mz_stream_os_close(file_stream);
157
- mz_stream_os_delete(&file_stream);
158
-
159
- if (err == MZ_OK)
160
- err = mz_zip_reader_open(handle, reader->mem_stream);
161
- if (err != MZ_OK)
162
- mz_zip_reader_close(handle);
163
-
164
- return err;
165
- }
166
-
167
- int32_t mz_zip_reader_open_buffer(void *handle, uint8_t *buf, int32_t len, uint8_t copy) {
168
- mz_zip_reader *reader = (mz_zip_reader *)handle;
169
- int32_t err = MZ_OK;
170
-
171
- mz_zip_reader_close(handle);
172
-
173
- mz_stream_mem_create(&reader->mem_stream);
174
-
175
- if (copy) {
176
- mz_stream_mem_set_grow_size(reader->mem_stream, len);
177
- mz_stream_mem_open(reader->mem_stream, NULL, MZ_OPEN_MODE_CREATE);
178
- mz_stream_mem_write(reader->mem_stream, buf, len);
179
- mz_stream_mem_seek(reader->mem_stream, 0, MZ_SEEK_SET);
180
- } else {
181
- mz_stream_mem_open(reader->mem_stream, NULL, MZ_OPEN_MODE_READ);
182
- mz_stream_mem_set_buffer(reader->mem_stream, buf, len);
183
- }
184
-
185
- if (err == MZ_OK)
186
- err = mz_zip_reader_open(handle, reader->mem_stream);
187
-
188
- return err;
189
- }
190
-
191
- int32_t mz_zip_reader_close(void *handle) {
192
- mz_zip_reader *reader = (mz_zip_reader *)handle;
193
- int32_t err = MZ_OK;
194
-
195
- if (reader->zip_handle) {
196
- err = mz_zip_close(reader->zip_handle);
197
- mz_zip_delete(&reader->zip_handle);
198
- }
199
-
200
- if (reader->split_stream) {
201
- mz_stream_split_close(reader->split_stream);
202
- mz_stream_split_delete(&reader->split_stream);
203
- }
204
-
205
- if (reader->buffered_stream)
206
- mz_stream_buffered_delete(&reader->buffered_stream);
207
-
208
- if (reader->file_stream)
209
- mz_stream_os_delete(&reader->file_stream);
210
-
211
- if (reader->mem_stream) {
212
- mz_stream_close(reader->mem_stream);
213
- mz_stream_delete(&reader->mem_stream);
214
- }
215
-
216
- return err;
217
- }
218
-
219
- /***************************************************************************/
220
-
221
- int32_t mz_zip_reader_unzip_cd(void *handle) {
222
- mz_zip_reader *reader = (mz_zip_reader *)handle;
223
- mz_zip_file *cd_info = NULL;
224
- void *cd_mem_stream = NULL;
225
- void *new_cd_stream = NULL;
226
- void *file_extra_stream = NULL;
227
- uint64_t number_entry = 0;
228
- int32_t err = MZ_OK;
229
-
230
- err = mz_zip_reader_goto_first_entry(handle);
231
- if (err != MZ_OK)
232
- return err;
233
- err = mz_zip_reader_entry_get_info(handle, &cd_info);
234
- if (err != MZ_OK)
235
- return err;
236
-
237
- if (strcmp(cd_info->filename, MZ_ZIP_CD_FILENAME) != 0)
238
- return mz_zip_reader_goto_first_entry(handle);
239
-
240
- err = mz_zip_reader_entry_open(handle);
241
- if (err != MZ_OK)
242
- return err;
243
-
244
- mz_stream_mem_create(&file_extra_stream);
245
- mz_stream_mem_set_buffer(file_extra_stream, (void *)cd_info->extrafield, cd_info->extrafield_size);
246
-
247
- err = mz_zip_extrafield_find(file_extra_stream, MZ_ZIP_EXTENSION_CDCD, INT32_MAX, NULL);
248
- if (err == MZ_OK)
249
- err = mz_stream_read_uint64(file_extra_stream, &number_entry);
250
-
251
- mz_stream_mem_delete(&file_extra_stream);
252
-
253
- if (err != MZ_OK)
254
- return err;
255
-
256
- mz_zip_get_cd_mem_stream(reader->zip_handle, &cd_mem_stream);
257
- if (mz_stream_mem_is_open(cd_mem_stream) != MZ_OK)
258
- mz_stream_mem_open(cd_mem_stream, NULL, MZ_OPEN_MODE_CREATE);
259
-
260
- err = mz_stream_seek(cd_mem_stream, 0, MZ_SEEK_SET);
261
- if (err == MZ_OK)
262
- err = mz_stream_copy_stream(cd_mem_stream, NULL, handle, mz_zip_reader_entry_read,
263
- (int32_t)cd_info->uncompressed_size);
264
-
265
- if (err == MZ_OK) {
266
- reader->cd_zipped = 1;
267
-
268
- mz_zip_set_cd_stream(reader->zip_handle, 0, cd_mem_stream);
269
- mz_zip_set_number_entry(reader->zip_handle, number_entry);
270
-
271
- err = mz_zip_reader_goto_first_entry(handle);
272
- }
273
-
274
- reader->cd_verified = reader->entry_verified;
275
-
276
- mz_stream_mem_delete(&new_cd_stream);
277
- return err;
278
- }
279
-
280
- /***************************************************************************/
281
-
282
- static int32_t mz_zip_reader_locate_entry_cb(void *handle, void *userdata, mz_zip_file *file_info) {
283
- mz_zip_reader *reader = (mz_zip_reader *)userdata;
284
- int32_t result = 0;
285
- MZ_UNUSED(handle);
286
- result = mz_path_compare_wc(file_info->filename, reader->pattern, reader->pattern_ignore_case);
287
- return result;
288
- }
289
-
290
- int32_t mz_zip_reader_goto_first_entry(void *handle) {
291
- mz_zip_reader *reader = (mz_zip_reader *)handle;
292
- int32_t err = MZ_OK;
293
-
294
- if (mz_zip_reader_is_open(handle) != MZ_OK)
295
- return MZ_PARAM_ERROR;
296
-
297
- if (mz_zip_entry_is_open(reader->zip_handle) == MZ_OK)
298
- mz_zip_reader_entry_close(handle);
299
-
300
- if (!reader->pattern)
301
- err = mz_zip_goto_first_entry(reader->zip_handle);
302
- else
303
- err = mz_zip_locate_first_entry(reader->zip_handle, reader, mz_zip_reader_locate_entry_cb);
304
-
305
- reader->file_info = NULL;
306
- if (err == MZ_OK)
307
- err = mz_zip_entry_get_info(reader->zip_handle, &reader->file_info);
308
-
309
- return err;
310
- }
311
-
312
- int32_t mz_zip_reader_goto_next_entry(void *handle) {
313
- mz_zip_reader *reader = (mz_zip_reader *)handle;
314
- int32_t err = MZ_OK;
315
-
316
- if (mz_zip_reader_is_open(handle) != MZ_OK)
317
- return MZ_PARAM_ERROR;
318
-
319
- if (mz_zip_entry_is_open(reader->zip_handle) == MZ_OK)
320
- mz_zip_reader_entry_close(handle);
321
-
322
- if (!reader->pattern)
323
- err = mz_zip_goto_next_entry(reader->zip_handle);
324
- else
325
- err = mz_zip_locate_next_entry(reader->zip_handle, reader, mz_zip_reader_locate_entry_cb);
326
-
327
- reader->file_info = NULL;
328
- if (err == MZ_OK)
329
- err = mz_zip_entry_get_info(reader->zip_handle, &reader->file_info);
330
-
331
- return err;
332
- }
333
-
334
- int32_t mz_zip_reader_locate_entry(void *handle, const char *filename, uint8_t ignore_case) {
335
- mz_zip_reader *reader = (mz_zip_reader *)handle;
336
- int32_t err = MZ_OK;
337
-
338
- if (mz_zip_entry_is_open(reader->zip_handle) == MZ_OK)
339
- mz_zip_reader_entry_close(handle);
340
-
341
- err = mz_zip_locate_entry(reader->zip_handle, filename, ignore_case);
342
-
343
- reader->file_info = NULL;
344
- if (err == MZ_OK)
345
- err = mz_zip_entry_get_info(reader->zip_handle, &reader->file_info);
346
-
347
- return err;
348
- }
349
-
350
- /***************************************************************************/
351
-
352
- int32_t mz_zip_reader_entry_open(void *handle) {
353
- mz_zip_reader *reader = (mz_zip_reader *)handle;
354
- int32_t err = MZ_OK;
355
- const char *password = NULL;
356
- char password_buf[120];
357
-
358
- reader->entry_verified = 0;
359
-
360
- if (mz_zip_reader_is_open(reader) != MZ_OK)
361
- return MZ_PARAM_ERROR;
362
- if (!reader->file_info)
363
- return MZ_PARAM_ERROR;
364
-
365
- /* If the entry isn't open for reading, open it */
366
- if (mz_zip_entry_is_open(reader->zip_handle) == MZ_OK)
367
- return MZ_OK;
368
-
369
- password = reader->password;
370
-
371
- /* Check if we need a password and ask for it if we need to */
372
- if (!password && reader->password_cb && (reader->file_info->flag & MZ_ZIP_FLAG_ENCRYPTED)) {
373
- reader->password_cb(handle, reader->password_userdata, reader->file_info,
374
- password_buf, sizeof(password_buf));
375
-
376
- password = password_buf;
377
- }
378
-
379
- err = mz_zip_entry_read_open(reader->zip_handle, reader->raw, password);
380
- #ifndef MZ_ZIP_NO_CRYPTO
381
- if (err != MZ_OK)
382
- return err;
383
-
384
- if (mz_zip_reader_entry_get_first_hash(handle, &reader->hash_algorithm, &reader->hash_digest_size) == MZ_OK) {
385
- mz_crypt_sha_create(&reader->hash);
386
- if (reader->hash_algorithm == MZ_HASH_SHA1)
387
- mz_crypt_sha_set_algorithm(reader->hash, MZ_HASH_SHA1);
388
- else if (reader->hash_algorithm == MZ_HASH_SHA256)
389
- mz_crypt_sha_set_algorithm(reader->hash, MZ_HASH_SHA256);
390
- else
391
- err = MZ_SUPPORT_ERROR;
392
-
393
- if (err == MZ_OK)
394
- mz_crypt_sha_begin(reader->hash);
395
- #ifdef MZ_ZIP_SIGNING
396
- if (err == MZ_OK) {
397
- if (mz_zip_reader_entry_has_sign(handle) == MZ_OK) {
398
- err = mz_zip_reader_entry_sign_verify(handle);
399
- if (err == MZ_OK)
400
- reader->entry_verified = 1;
401
- } else if (reader->sign_required && !reader->cd_verified)
402
- err = MZ_SIGN_ERROR;
403
- }
404
- #endif
405
- } else if (reader->sign_required && !reader->cd_verified)
406
- err = MZ_SIGN_ERROR;
407
- #endif
408
-
409
- return err;
410
- }
411
-
412
- int32_t mz_zip_reader_entry_close(void *handle) {
413
- mz_zip_reader *reader = (mz_zip_reader *)handle;
414
- int32_t err = MZ_OK;
415
- int32_t err_close = MZ_OK;
416
- #ifndef MZ_ZIP_NO_CRYPTO
417
- int32_t err_hash = MZ_OK;
418
- uint8_t computed_hash[MZ_HASH_MAX_SIZE];
419
- uint8_t expected_hash[MZ_HASH_MAX_SIZE];
420
-
421
- if (reader->hash) {
422
- mz_crypt_sha_end(reader->hash, computed_hash, sizeof(computed_hash));
423
- mz_crypt_sha_delete(&reader->hash);
424
-
425
- err_hash = mz_zip_reader_entry_get_hash(handle, reader->hash_algorithm, expected_hash,
426
- reader->hash_digest_size);
427
-
428
- if (err_hash == MZ_OK) {
429
- /* Verify expected hash against computed hash */
430
- if (memcmp(computed_hash, expected_hash, reader->hash_digest_size) != 0)
431
- err = MZ_CRC_ERROR;
432
- }
433
- }
434
- #endif
435
-
436
- err_close = mz_zip_entry_close(reader->zip_handle);
437
- if (err == MZ_OK)
438
- err = err_close;
439
- return err;
440
- }
441
-
442
- int32_t mz_zip_reader_entry_read(void *handle, void *buf, int32_t len) {
443
- mz_zip_reader *reader = (mz_zip_reader *)handle;
444
- int32_t read = 0;
445
- read = mz_zip_entry_read(reader->zip_handle, buf, len);
446
- #ifndef MZ_ZIP_NO_CRYPTO
447
- if (read > 0 && reader->hash)
448
- mz_crypt_sha_update(reader->hash, buf, read);
449
- #endif
450
- return read;
451
- }
452
-
453
- int32_t mz_zip_reader_entry_has_sign(void *handle) {
454
- mz_zip_reader *reader = (mz_zip_reader *)handle;
455
-
456
- if (!reader || mz_zip_entry_is_open(reader->zip_handle) != MZ_OK)
457
- return MZ_PARAM_ERROR;
458
-
459
- return mz_zip_extrafield_contains(reader->file_info->extrafield,
460
- reader->file_info->extrafield_size, MZ_ZIP_EXTENSION_SIGN, NULL);
461
- }
462
-
463
- #if !defined(MZ_ZIP_NO_CRYPTO) && defined(MZ_ZIP_SIGNING)
464
- int32_t mz_zip_reader_entry_sign_verify(void *handle) {
465
- mz_zip_reader *reader = (mz_zip_reader *)handle;
466
- void *file_extra_stream = NULL;
467
- int32_t err = MZ_OK;
468
- uint8_t *signature = NULL;
469
- uint16_t signature_size = 0;
470
- uint8_t hash[MZ_HASH_MAX_SIZE];
471
-
472
- if (!reader || mz_zip_entry_is_open(reader->zip_handle) != MZ_OK)
473
- return MZ_PARAM_ERROR;
474
-
475
- mz_stream_mem_create(&file_extra_stream);
476
- mz_stream_mem_set_buffer(file_extra_stream, (void *)reader->file_info->extrafield,
477
- reader->file_info->extrafield_size);
478
-
479
- err = mz_zip_extrafield_find(file_extra_stream, MZ_ZIP_EXTENSION_SIGN, INT32_MAX, &signature_size);
480
- if ((err == MZ_OK) && (signature_size > 0)) {
481
- signature = (uint8_t *)malloc(signature_size);
482
- if (mz_stream_read(file_extra_stream, signature, signature_size) != signature_size)
483
- err = MZ_READ_ERROR;
484
- }
485
-
486
- mz_stream_mem_delete(&file_extra_stream);
487
-
488
- if (err == MZ_OK) {
489
- /* Get most secure hash to verify signature against */
490
- err = mz_zip_reader_entry_get_hash(handle, reader->hash_algorithm, hash, reader->hash_digest_size);
491
- }
492
-
493
- if (err == MZ_OK) {
494
- /* Verify the pkcs signature */
495
- err = mz_crypt_sign_verify(hash, reader->hash_digest_size, signature, signature_size);
496
- }
497
-
498
- if (signature)
499
- free(signature);
500
-
501
- return err;
502
- }
503
- #endif
504
-
505
- int32_t mz_zip_reader_entry_get_hash(void *handle, uint16_t algorithm, uint8_t *digest, int32_t digest_size) {
506
- mz_zip_reader *reader = (mz_zip_reader *)handle;
507
- void *file_extra_stream = NULL;
508
- int32_t err = MZ_OK;
509
- int32_t return_err = MZ_EXIST_ERROR;
510
- uint16_t cur_algorithm = 0;
511
- uint16_t cur_digest_size = 0;
512
-
513
- mz_stream_mem_create(&file_extra_stream);
514
- mz_stream_mem_set_buffer(file_extra_stream, (void *)reader->file_info->extrafield,
515
- reader->file_info->extrafield_size);
516
-
517
- do {
518
- err = mz_zip_extrafield_find(file_extra_stream, MZ_ZIP_EXTENSION_HASH, INT32_MAX, NULL);
519
- if (err != MZ_OK)
520
- break;
521
-
522
- err = mz_stream_read_uint16(file_extra_stream, &cur_algorithm);
523
- if (err == MZ_OK)
524
- err = mz_stream_read_uint16(file_extra_stream, &cur_digest_size);
525
- if ((err == MZ_OK) && (cur_algorithm == algorithm) && (cur_digest_size <= digest_size) &&
526
- (cur_digest_size <= MZ_HASH_MAX_SIZE)) {
527
- /* Read hash digest */
528
- if (mz_stream_read(file_extra_stream, digest, digest_size) == cur_digest_size)
529
- return_err = MZ_OK;
530
- break;
531
- } else {
532
- err = mz_stream_seek(file_extra_stream, cur_digest_size, MZ_SEEK_CUR);
533
- }
534
- } while (err == MZ_OK);
535
-
536
- mz_stream_mem_delete(&file_extra_stream);
537
-
538
- return return_err;
539
- }
540
-
541
- int32_t mz_zip_reader_entry_get_first_hash(void *handle, uint16_t *algorithm, uint16_t *digest_size) {
542
- mz_zip_reader *reader = (mz_zip_reader *)handle;
543
- void *file_extra_stream = NULL;
544
- int32_t err = MZ_OK;
545
- uint16_t cur_algorithm = 0;
546
- uint16_t cur_digest_size = 0;
547
-
548
- if (!reader || !algorithm)
549
- return MZ_PARAM_ERROR;
550
-
551
- mz_stream_mem_create(&file_extra_stream);
552
- mz_stream_mem_set_buffer(file_extra_stream, (void *)reader->file_info->extrafield,
553
- reader->file_info->extrafield_size);
554
-
555
- err = mz_zip_extrafield_find(file_extra_stream, MZ_ZIP_EXTENSION_HASH, INT32_MAX, NULL);
556
- if (err == MZ_OK)
557
- err = mz_stream_read_uint16(file_extra_stream, &cur_algorithm);
558
- if (err == MZ_OK)
559
- err = mz_stream_read_uint16(file_extra_stream, &cur_digest_size);
560
-
561
- if (algorithm)
562
- *algorithm = cur_algorithm;
563
- if (digest_size)
564
- *digest_size = cur_digest_size;
565
-
566
- mz_stream_mem_delete(&file_extra_stream);
567
-
568
- return err;
569
- }
570
-
571
- int32_t mz_zip_reader_entry_get_info(void *handle, mz_zip_file **file_info) {
572
- mz_zip_reader *reader = (mz_zip_reader *)handle;
573
- int32_t err = MZ_OK;
574
- if (!file_info || mz_zip_reader_is_open(handle) != MZ_OK)
575
- return MZ_PARAM_ERROR;
576
- *file_info = reader->file_info;
577
- if (!*file_info)
578
- return MZ_EXIST_ERROR;
579
- return err;
580
- }
581
-
582
- int32_t mz_zip_reader_entry_is_dir(void *handle) {
583
- mz_zip_reader *reader = (mz_zip_reader *)handle;
584
- if (mz_zip_reader_is_open(handle) != MZ_OK)
585
- return MZ_PARAM_ERROR;
586
- return mz_zip_entry_is_dir(reader->zip_handle);
587
- }
588
-
589
- int32_t mz_zip_reader_entry_save_process(void *handle, void *stream, mz_stream_write_cb write_cb) {
590
- mz_zip_reader *reader = (mz_zip_reader *)handle;
591
- int32_t err = MZ_OK;
592
- int32_t read = 0;
593
- int32_t written = 0;
594
-
595
- if (mz_zip_reader_is_open(reader) != MZ_OK)
596
- return MZ_PARAM_ERROR;
597
- if (!reader->file_info || !write_cb)
598
- return MZ_PARAM_ERROR;
599
-
600
- /* If the entry isn't open for reading, open it */
601
- if (mz_zip_entry_is_open(reader->zip_handle) != MZ_OK)
602
- err = mz_zip_reader_entry_open(handle);
603
-
604
- if (err != MZ_OK)
605
- return err;
606
-
607
- /* Unzip entry in zip file */
608
- read = mz_zip_reader_entry_read(handle, reader->buffer, sizeof(reader->buffer));
609
-
610
- if (read == 0) {
611
- /* If we are done close the entry */
612
- err = mz_zip_reader_entry_close(handle);
613
- if (err != MZ_OK)
614
- return err;
615
-
616
- return MZ_END_OF_STREAM;
617
- }
618
-
619
- if (read > 0) {
620
- /* Write the data to the specified stream */
621
- written = write_cb(stream, reader->buffer, read);
622
- if (written != read)
623
- return MZ_WRITE_ERROR;
624
- }
625
-
626
- return read;
627
- }
628
-
629
- int32_t mz_zip_reader_entry_save(void *handle, void *stream, mz_stream_write_cb write_cb) {
630
- mz_zip_reader *reader = (mz_zip_reader *)handle;
631
- uint64_t current_time = 0;
632
- uint64_t update_time = 0;
633
- int64_t current_pos = 0;
634
- int64_t update_pos = 0;
635
- int32_t err = MZ_OK;
636
- int32_t written = 0;
637
-
638
- if (mz_zip_reader_is_open(reader) != MZ_OK)
639
- return MZ_PARAM_ERROR;
640
- if (!reader->file_info)
641
- return MZ_PARAM_ERROR;
642
-
643
- /* Update the progress at the beginning */
644
- if (reader->progress_cb)
645
- reader->progress_cb(handle, reader->progress_userdata, reader->file_info, current_pos);
646
-
647
- /* Write data to stream until done */
648
- while (err == MZ_OK) {
649
- written = mz_zip_reader_entry_save_process(handle, stream, write_cb);
650
- if (written == MZ_END_OF_STREAM)
651
- break;
652
- if (written > 0)
653
- current_pos += written;
654
- if (written < 0)
655
- err = written;
656
-
657
- /* Update progress if enough time have passed */
658
- current_time = mz_os_ms_time();
659
- if ((current_time - update_time) > reader->progress_cb_interval_ms) {
660
- if (reader->progress_cb)
661
- reader->progress_cb(handle, reader->progress_userdata, reader->file_info, current_pos);
662
-
663
- update_pos = current_pos;
664
- update_time = current_time;
665
- }
666
- }
667
-
668
- /* Update the progress at the end */
669
- if (reader->progress_cb && update_pos != current_pos)
670
- reader->progress_cb(handle, reader->progress_userdata, reader->file_info, current_pos);
671
-
672
- return err;
673
- }
674
-
675
- int32_t mz_zip_reader_entry_save_file(void *handle, const char *path) {
676
- mz_zip_reader *reader = (mz_zip_reader *)handle;
677
- void *stream = NULL;
678
- uint32_t target_attrib = 0;
679
- int32_t err_attrib = 0;
680
- int32_t err = MZ_OK;
681
- int32_t err_cb = MZ_OK;
682
- char pathwfs[512];
683
- char directory[512];
684
-
685
- if (mz_zip_reader_is_open(reader) != MZ_OK)
686
- return MZ_PARAM_ERROR;
687
- if (!reader->file_info || !path)
688
- return MZ_PARAM_ERROR;
689
-
690
- /* Convert to forward slashes for unix which doesn't like backslashes */
691
- strncpy(pathwfs, path, sizeof(pathwfs) - 1);
692
- pathwfs[sizeof(pathwfs) - 1] = 0;
693
- mz_path_convert_slashes(pathwfs, MZ_PATH_SLASH_UNIX);
694
-
695
- if (reader->entry_cb)
696
- reader->entry_cb(handle, reader->entry_userdata, reader->file_info, pathwfs);
697
-
698
- strncpy(directory, pathwfs, sizeof(directory) - 1);
699
- directory[sizeof(directory) - 1] = 0;
700
- mz_path_remove_filename(directory);
701
-
702
- /* If it is a directory entry then create a directory instead of writing file */
703
- if ((mz_zip_entry_is_dir(reader->zip_handle) == MZ_OK) &&
704
- (mz_zip_entry_is_symlink(reader->zip_handle) != MZ_OK)) {
705
- err = mz_dir_make(directory);
706
- return err;
707
- }
708
-
709
- /* Check if file exists and ask if we want to overwrite */
710
- if (reader->overwrite_cb && mz_os_file_exists(pathwfs) == MZ_OK) {
711
- err_cb = reader->overwrite_cb(handle, reader->overwrite_userdata, reader->file_info, pathwfs);
712
- if (err_cb != MZ_OK)
713
- return err;
714
- /* We want to overwrite the file so we delete the existing one */
715
- mz_os_unlink(pathwfs);
716
- }
717
-
718
- /* If symbolic link then properly construct destination path and link path */
719
- if ((mz_zip_entry_is_symlink(reader->zip_handle) == MZ_OK) &&
720
- (mz_path_has_slash(pathwfs) == MZ_OK)) {
721
- mz_path_remove_slash(pathwfs);
722
- mz_path_remove_filename(directory);
723
- }
724
-
725
- /* Create the output directory if it doesn't already exist */
726
- if (mz_os_is_dir(directory) != MZ_OK) {
727
- err = mz_dir_make(directory);
728
- if (err != MZ_OK)
729
- return err;
730
- }
731
-
732
- /* If it is a symbolic link then create symbolic link instead of writing file */
733
- if (mz_zip_entry_is_symlink(reader->zip_handle) == MZ_OK) {
734
- if (reader->file_info->linkname && *reader->file_info->linkname != 0) {
735
- /* Create symbolic link from UNIX1 extrafield */
736
- err = mz_os_make_symlink(pathwfs, reader->file_info->linkname);
737
- } else if (reader->file_info->uncompressed_size < UINT16_MAX) {
738
- /* Create symbolic link from zip entry contents */
739
- mz_stream_mem_create(&stream);
740
- err = mz_stream_mem_open(stream, NULL, MZ_OPEN_MODE_CREATE);
741
-
742
- if (err == MZ_OK)
743
- err = mz_zip_reader_entry_save(handle, stream, mz_stream_write);
744
-
745
- if (err == MZ_OK)
746
- err = mz_stream_write_uint8(stream, 0);
747
-
748
- if (err == MZ_OK) {
749
- const char *linkname = NULL;
750
- if (mz_stream_mem_get_buffer(stream, (const void **)&linkname) == MZ_OK)
751
- err = mz_os_make_symlink(pathwfs, linkname);
752
- }
753
-
754
- mz_stream_mem_close(stream);
755
- mz_stream_mem_delete(&stream);
756
- }
757
-
758
- /* Don't check return value because we aren't validating symbolic link target */
759
- return err;
760
- }
761
-
762
- /* Create the file on disk so we can save to it */
763
- mz_stream_os_create(&stream);
764
- err = mz_stream_os_open(stream, pathwfs, MZ_OPEN_MODE_CREATE);
765
-
766
- if (err == MZ_OK)
767
- err = mz_zip_reader_entry_save(handle, stream, mz_stream_write);
768
-
769
- mz_stream_close(stream);
770
- mz_stream_delete(&stream);
771
-
772
- if (err == MZ_OK) {
773
- /* Set the time of the file that has been created */
774
- mz_os_set_file_date(pathwfs, reader->file_info->modified_date,
775
- reader->file_info->accessed_date, reader->file_info->creation_date);
776
- }
777
-
778
- if (err == MZ_OK) {
779
- /* Set file attributes for the correct system */
780
- err_attrib = mz_zip_attrib_convert(MZ_HOST_SYSTEM(reader->file_info->version_madeby),
781
- reader->file_info->external_fa, MZ_VERSION_MADEBY_HOST_SYSTEM, &target_attrib);
782
-
783
- if (err_attrib == MZ_OK)
784
- mz_os_set_file_attribs(pathwfs, target_attrib);
785
- }
786
-
787
- return err;
788
- }
789
-
790
- int32_t mz_zip_reader_entry_save_buffer(void *handle, void *buf, int32_t len) {
791
- mz_zip_reader *reader = (mz_zip_reader *)handle;
792
- void *mem_stream = NULL;
793
- int32_t err = MZ_OK;
794
-
795
- if (mz_zip_reader_is_open(reader) != MZ_OK)
796
- return MZ_PARAM_ERROR;
797
- if (!reader->file_info || reader->file_info->uncompressed_size > INT32_MAX)
798
- return MZ_PARAM_ERROR;
799
- if (len != (int32_t)reader->file_info->uncompressed_size)
800
- return MZ_BUF_ERROR;
801
-
802
- /* Create a memory stream backed by our buffer and save to it */
803
- mz_stream_mem_create(&mem_stream);
804
- mz_stream_mem_set_buffer(mem_stream, buf, len);
805
-
806
- err = mz_stream_mem_open(mem_stream, NULL, MZ_OPEN_MODE_READ);
807
- if (err == MZ_OK)
808
- err = mz_zip_reader_entry_save(handle, mem_stream, mz_stream_mem_write);
809
-
810
- mz_stream_mem_delete(&mem_stream);
811
- return err;
812
- }
813
-
814
- int32_t mz_zip_reader_entry_save_buffer_length(void *handle) {
815
- mz_zip_reader *reader = (mz_zip_reader *)handle;
816
-
817
- if (mz_zip_reader_is_open(reader) != MZ_OK)
818
- return MZ_PARAM_ERROR;
819
- if (!reader->file_info || reader->file_info->uncompressed_size > INT32_MAX)
820
- return MZ_PARAM_ERROR;
821
-
822
- /* Get the maximum size required for the save buffer */
823
- return (int32_t)reader->file_info->uncompressed_size;
824
- }
825
-
826
- /***************************************************************************/
827
-
828
- int32_t mz_zip_reader_save_all(void *handle, const char *destination_dir) {
829
- mz_zip_reader *reader = (mz_zip_reader *)handle;
830
- int32_t err = MZ_OK;
831
- uint8_t *utf8_string = NULL;
832
- char path[512];
833
- char utf8_name[256];
834
- char resolved_name[256];
835
-
836
- err = mz_zip_reader_goto_first_entry(handle);
837
-
838
- if (err == MZ_END_OF_LIST)
839
- return err;
840
-
841
- while (err == MZ_OK) {
842
- /* Construct output path */
843
- path[0] = 0;
844
-
845
- strncpy(utf8_name, reader->file_info->filename, sizeof(utf8_name) - 1);
846
- utf8_name[sizeof(utf8_name) - 1] = 0;
847
-
848
- if ((reader->encoding > 0) && (reader->file_info->flag & MZ_ZIP_FLAG_UTF8) == 0) {
849
- utf8_string = mz_os_utf8_string_create(reader->file_info->filename, reader->encoding);
850
- if (utf8_string) {
851
- strncpy(utf8_name, (char *)utf8_string, sizeof(utf8_name) - 1);
852
- utf8_name[sizeof(utf8_name) - 1] = 0;
853
- mz_os_utf8_string_delete(&utf8_string);
854
- }
855
- }
856
-
857
- err = mz_path_resolve(utf8_name, resolved_name, sizeof(resolved_name));
858
- if (err != MZ_OK)
859
- break;
860
-
861
- if (destination_dir)
862
- mz_path_combine(path, destination_dir, sizeof(path));
863
-
864
- mz_path_combine(path, resolved_name, sizeof(path));
865
-
866
- /* Save file to disk */
867
- err = mz_zip_reader_entry_save_file(handle, path);
868
-
869
- if (err == MZ_OK)
870
- err = mz_zip_reader_goto_next_entry(handle);
871
- }
872
-
873
- if (err == MZ_END_OF_LIST)
874
- return MZ_OK;
875
-
876
- return err;
877
- }
878
-
879
- /***************************************************************************/
880
-
881
- void mz_zip_reader_set_pattern(void *handle, const char *pattern, uint8_t ignore_case) {
882
- mz_zip_reader *reader = (mz_zip_reader *)handle;
883
- reader->pattern = pattern;
884
- reader->pattern_ignore_case = ignore_case;
885
- }
886
-
887
- void mz_zip_reader_set_password(void *handle, const char *password) {
888
- mz_zip_reader *reader = (mz_zip_reader *)handle;
889
- reader->password = password;
890
- }
891
-
892
- void mz_zip_reader_set_raw(void *handle, uint8_t raw) {
893
- mz_zip_reader *reader = (mz_zip_reader *)handle;
894
- reader->raw = raw;
895
- }
896
-
897
- int32_t mz_zip_reader_get_raw(void *handle, uint8_t *raw) {
898
- mz_zip_reader *reader = (mz_zip_reader *)handle;
899
- if (!raw)
900
- return MZ_PARAM_ERROR;
901
- *raw = reader->raw;
902
- return MZ_OK;
903
- }
904
-
905
- int32_t mz_zip_reader_get_zip_cd(void *handle, uint8_t *zip_cd) {
906
- mz_zip_reader *reader = (mz_zip_reader *)handle;
907
- if (!zip_cd)
908
- return MZ_PARAM_ERROR;
909
- *zip_cd = reader->cd_zipped;
910
- return MZ_OK;
911
- }
912
-
913
- int32_t mz_zip_reader_get_comment(void *handle, const char **comment) {
914
- mz_zip_reader *reader = (mz_zip_reader *)handle;
915
- if (mz_zip_reader_is_open(reader) != MZ_OK)
916
- return MZ_PARAM_ERROR;
917
- if (!comment)
918
- return MZ_PARAM_ERROR;
919
- return mz_zip_get_comment(reader->zip_handle, comment);
920
- }
921
-
922
- int32_t mz_zip_reader_set_recover(void *handle, uint8_t recover) {
923
- mz_zip_reader *reader = (mz_zip_reader *)handle;
924
- if (!reader)
925
- return MZ_PARAM_ERROR;
926
- reader->recover = recover;
927
- return MZ_OK;
928
- }
929
-
930
- void mz_zip_reader_set_encoding(void *handle, int32_t encoding) {
931
- mz_zip_reader *reader = (mz_zip_reader *)handle;
932
- reader->encoding = encoding;
933
- }
934
-
935
- void mz_zip_reader_set_sign_required(void *handle, uint8_t sign_required) {
936
- mz_zip_reader *reader = (mz_zip_reader *)handle;
937
- reader->sign_required = sign_required;
938
- }
939
-
940
- void mz_zip_reader_set_overwrite_cb(void *handle, void *userdata, mz_zip_reader_overwrite_cb cb) {
941
- mz_zip_reader *reader = (mz_zip_reader *)handle;
942
- reader->overwrite_cb = cb;
943
- reader->overwrite_userdata = userdata;
944
- }
945
-
946
- void mz_zip_reader_set_password_cb(void *handle, void *userdata, mz_zip_reader_password_cb cb) {
947
- mz_zip_reader *reader = (mz_zip_reader *)handle;
948
- reader->password_cb = cb;
949
- reader->password_userdata = userdata;
950
- }
951
-
952
- void mz_zip_reader_set_progress_cb(void *handle, void *userdata, mz_zip_reader_progress_cb cb) {
953
- mz_zip_reader *reader = (mz_zip_reader *)handle;
954
- reader->progress_cb = cb;
955
- reader->progress_userdata = userdata;
956
- }
957
-
958
- void mz_zip_reader_set_progress_interval(void *handle, uint32_t milliseconds) {
959
- mz_zip_reader *reader = (mz_zip_reader *)handle;
960
- reader->progress_cb_interval_ms = milliseconds;
961
- }
962
-
963
- void mz_zip_reader_set_entry_cb(void *handle, void *userdata, mz_zip_reader_entry_cb cb) {
964
- mz_zip_reader *reader = (mz_zip_reader *)handle;
965
- reader->entry_cb = cb;
966
- reader->entry_userdata = userdata;
967
- }
968
-
969
- int32_t mz_zip_reader_get_zip_handle(void *handle, void **zip_handle) {
970
- mz_zip_reader *reader = (mz_zip_reader *)handle;
971
- if (!zip_handle)
972
- return MZ_PARAM_ERROR;
973
- *zip_handle = reader->zip_handle;
974
- if (!*zip_handle)
975
- return MZ_EXIST_ERROR;
976
- return MZ_OK;
977
- }
978
-
979
- /***************************************************************************/
980
-
981
- void *mz_zip_reader_create(void **handle) {
982
- mz_zip_reader *reader = NULL;
983
-
984
- reader = (mz_zip_reader *)calloc(1, sizeof(mz_zip_reader));
985
- if (reader) {
986
- reader->recover = 1;
987
- reader->progress_cb_interval_ms = MZ_DEFAULT_PROGRESS_INTERVAL;
988
- }
989
- if (handle)
990
- *handle = reader;
991
-
992
- return reader;
993
- }
994
-
995
- void mz_zip_reader_delete(void **handle) {
996
- mz_zip_reader *reader = NULL;
997
- if (!handle)
998
- return;
999
- reader = (mz_zip_reader *)*handle;
1000
- if (reader) {
1001
- mz_zip_reader_close(reader);
1002
- free(reader);
1003
- }
1004
- *handle = NULL;
1005
- }
1006
-
1007
- /***************************************************************************/
1008
-
1009
- typedef struct mz_zip_writer_s {
1010
- void *zip_handle;
1011
- void *file_stream;
1012
- void *buffered_stream;
1013
- void *split_stream;
1014
- void *sha256;
1015
- void *mem_stream;
1016
- void *file_extra_stream;
1017
- mz_zip_file file_info;
1018
- void *overwrite_userdata;
1019
- mz_zip_writer_overwrite_cb
1020
- overwrite_cb;
1021
- void *password_userdata;
1022
- mz_zip_writer_password_cb
1023
- password_cb;
1024
- void *progress_userdata;
1025
- mz_zip_writer_progress_cb
1026
- progress_cb;
1027
- uint32_t progress_cb_interval_ms;
1028
- void *entry_userdata;
1029
- mz_zip_writer_entry_cb
1030
- entry_cb;
1031
- const char *password;
1032
- const char *comment;
1033
- uint8_t *cert_data;
1034
- int32_t cert_data_size;
1035
- const char *cert_pwd;
1036
- uint16_t compress_method;
1037
- int16_t compress_level;
1038
- uint8_t follow_links;
1039
- uint8_t store_links;
1040
- uint8_t zip_cd;
1041
- uint8_t aes;
1042
- uint8_t raw;
1043
- uint8_t buffer[UINT16_MAX];
1044
- } mz_zip_writer;
1045
-
1046
- /***************************************************************************/
1047
-
1048
- int32_t mz_zip_writer_zip_cd(void *handle) {
1049
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1050
- mz_zip_file cd_file;
1051
- uint64_t number_entry = 0;
1052
- int64_t cd_mem_length = 0;
1053
- int32_t err = MZ_OK;
1054
- int32_t extrafield_size = 0;
1055
- void *file_extra_stream = NULL;
1056
- void *cd_mem_stream = NULL;
1057
-
1058
- memset(&cd_file, 0, sizeof(cd_file));
1059
-
1060
- mz_zip_get_number_entry(writer->zip_handle, &number_entry);
1061
- mz_zip_get_cd_mem_stream(writer->zip_handle, &cd_mem_stream);
1062
- mz_stream_seek(cd_mem_stream, 0, MZ_SEEK_END);
1063
- cd_mem_length = (uint32_t)mz_stream_tell(cd_mem_stream);
1064
- mz_stream_seek(cd_mem_stream, 0, MZ_SEEK_SET);
1065
-
1066
- cd_file.filename = MZ_ZIP_CD_FILENAME;
1067
- cd_file.modified_date = time(NULL);
1068
- cd_file.version_madeby = MZ_VERSION_MADEBY;
1069
- cd_file.compression_method = writer->compress_method;
1070
- cd_file.uncompressed_size = (int32_t)cd_mem_length;
1071
- cd_file.flag = MZ_ZIP_FLAG_UTF8;
1072
-
1073
- if (writer->password)
1074
- cd_file.flag |= MZ_ZIP_FLAG_ENCRYPTED;
1075
-
1076
- mz_stream_mem_create(&file_extra_stream);
1077
- mz_stream_mem_open(file_extra_stream, NULL, MZ_OPEN_MODE_CREATE);
1078
-
1079
- mz_zip_extrafield_write(file_extra_stream, MZ_ZIP_EXTENSION_CDCD, 8);
1080
-
1081
- mz_stream_write_uint64(file_extra_stream, number_entry);
1082
-
1083
- mz_stream_mem_get_buffer(file_extra_stream, (const void **)&cd_file.extrafield);
1084
- mz_stream_mem_get_buffer_length(file_extra_stream, &extrafield_size);
1085
- cd_file.extrafield_size = (uint16_t)extrafield_size;
1086
-
1087
- err = mz_zip_writer_entry_open(handle, &cd_file);
1088
- if (err == MZ_OK) {
1089
- mz_stream_copy_stream(handle, mz_zip_writer_entry_write, cd_mem_stream,
1090
- NULL, (int32_t)cd_mem_length);
1091
-
1092
- mz_stream_seek(cd_mem_stream, 0, MZ_SEEK_SET);
1093
- mz_stream_mem_set_buffer_limit(cd_mem_stream, 0);
1094
-
1095
- err = mz_zip_writer_entry_close(writer);
1096
- }
1097
-
1098
- mz_stream_mem_delete(&file_extra_stream);
1099
-
1100
- return err;
1101
- }
1102
-
1103
- /***************************************************************************/
1104
-
1105
- int32_t mz_zip_writer_is_open(void *handle) {
1106
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1107
- if (!writer || !writer->zip_handle)
1108
- return MZ_PARAM_ERROR;
1109
- return MZ_OK;
1110
- }
1111
-
1112
- static int32_t mz_zip_writer_open_int(void *handle, void *stream, int32_t mode) {
1113
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1114
- int32_t err = MZ_OK;
1115
-
1116
- mz_zip_create(&writer->zip_handle);
1117
- err = mz_zip_open(writer->zip_handle, stream, mode);
1118
-
1119
- if (err != MZ_OK) {
1120
- mz_zip_writer_close(handle);
1121
- return err;
1122
- }
1123
-
1124
- return MZ_OK;
1125
- }
1126
-
1127
- int32_t mz_zip_writer_open(void *handle, void *stream, uint8_t append) {
1128
- int32_t mode = MZ_OPEN_MODE_WRITE;
1129
-
1130
- if (append) {
1131
- mode |= MZ_OPEN_MODE_APPEND;
1132
- } else {
1133
- mode |= MZ_OPEN_MODE_CREATE;
1134
- }
1135
-
1136
- return mz_zip_writer_open_int(handle, stream, mode);
1137
- }
1138
-
1139
- int32_t mz_zip_writer_open_file(void *handle, const char *path, int64_t disk_size, uint8_t append) {
1140
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1141
- int32_t mode = MZ_OPEN_MODE_READWRITE;
1142
- int32_t err = MZ_OK;
1143
- int32_t err_cb = 0;
1144
- char directory[320];
1145
-
1146
- mz_zip_writer_close(handle);
1147
-
1148
- if (mz_os_file_exists(path) != MZ_OK) {
1149
- /* If the file doesn't exist, we don't append file */
1150
- mode |= MZ_OPEN_MODE_CREATE;
1151
-
1152
- /* Create destination directory if it doesn't already exist */
1153
- if (strchr(path, '/') || strrchr(path, '\\')) {
1154
- strncpy(directory, path, sizeof(directory) - 1);
1155
- directory[sizeof(directory) - 1] = 0;
1156
- mz_path_remove_filename(directory);
1157
- if (mz_os_file_exists(directory) != MZ_OK)
1158
- mz_dir_make(directory);
1159
- }
1160
- } else if (append) {
1161
- mode |= MZ_OPEN_MODE_APPEND;
1162
- } else {
1163
- if (writer->overwrite_cb)
1164
- err_cb = writer->overwrite_cb(handle, writer->overwrite_userdata, path);
1165
-
1166
- if (err_cb == MZ_INTERNAL_ERROR)
1167
- return err;
1168
-
1169
- if (err_cb == MZ_OK)
1170
- mode |= MZ_OPEN_MODE_CREATE;
1171
- else
1172
- mode |= MZ_OPEN_MODE_APPEND;
1173
- }
1174
-
1175
- mz_stream_os_create(&writer->file_stream);
1176
- mz_stream_buffered_create(&writer->buffered_stream);
1177
- mz_stream_split_create(&writer->split_stream);
1178
-
1179
- mz_stream_set_base(writer->buffered_stream, writer->file_stream);
1180
- mz_stream_set_base(writer->split_stream, writer->buffered_stream);
1181
-
1182
- mz_stream_split_set_prop_int64(writer->split_stream, MZ_STREAM_PROP_DISK_SIZE, disk_size);
1183
-
1184
- err = mz_stream_open(writer->split_stream, path, mode);
1185
- if (err == MZ_OK)
1186
- err = mz_zip_writer_open_int(handle, writer->split_stream, mode);
1187
-
1188
- return err;
1189
- }
1190
-
1191
- int32_t mz_zip_writer_open_file_in_memory(void *handle, const char *path) {
1192
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1193
- void *file_stream = NULL;
1194
- int64_t file_size = 0;
1195
- int32_t err = 0;
1196
-
1197
- mz_zip_writer_close(handle);
1198
-
1199
- mz_stream_os_create(&file_stream);
1200
-
1201
- err = mz_stream_os_open(file_stream, path, MZ_OPEN_MODE_READ);
1202
-
1203
- if (err != MZ_OK) {
1204
- mz_stream_os_delete(&file_stream);
1205
- mz_zip_writer_close(handle);
1206
- return err;
1207
- }
1208
-
1209
- mz_stream_os_seek(file_stream, 0, MZ_SEEK_END);
1210
- file_size = mz_stream_os_tell(file_stream);
1211
- mz_stream_os_seek(file_stream, 0, MZ_SEEK_SET);
1212
-
1213
- if ((file_size <= 0) || (file_size > UINT32_MAX)) {
1214
- /* Memory size is too large or too small */
1215
-
1216
- mz_stream_os_close(file_stream);
1217
- mz_stream_os_delete(&file_stream);
1218
- mz_zip_writer_close(handle);
1219
- return MZ_MEM_ERROR;
1220
- }
1221
-
1222
- mz_stream_mem_create(&writer->mem_stream);
1223
- mz_stream_mem_set_grow_size(writer->mem_stream, (int32_t)file_size);
1224
- mz_stream_mem_open(writer->mem_stream, NULL, MZ_OPEN_MODE_CREATE);
1225
-
1226
- err = mz_stream_copy(writer->mem_stream, file_stream, (int32_t)file_size);
1227
-
1228
- mz_stream_os_close(file_stream);
1229
- mz_stream_os_delete(&file_stream);
1230
-
1231
- if (err == MZ_OK)
1232
- err = mz_zip_writer_open(handle, writer->mem_stream, 1);
1233
- if (err != MZ_OK)
1234
- mz_zip_writer_close(handle);
1235
-
1236
- return err;
1237
- }
1238
-
1239
- int32_t mz_zip_writer_close(void *handle) {
1240
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1241
- int32_t err = MZ_OK;
1242
-
1243
- if (writer->zip_handle) {
1244
- mz_zip_set_version_madeby(writer->zip_handle, MZ_VERSION_MADEBY);
1245
- if (writer->comment)
1246
- mz_zip_set_comment(writer->zip_handle, writer->comment);
1247
- if (writer->zip_cd)
1248
- mz_zip_writer_zip_cd(writer);
1249
-
1250
- err = mz_zip_close(writer->zip_handle);
1251
- mz_zip_delete(&writer->zip_handle);
1252
- }
1253
-
1254
- if (writer->split_stream) {
1255
- mz_stream_split_close(writer->split_stream);
1256
- mz_stream_split_delete(&writer->split_stream);
1257
- }
1258
-
1259
- if (writer->buffered_stream)
1260
- mz_stream_buffered_delete(&writer->buffered_stream);
1261
-
1262
- if (writer->file_stream)
1263
- mz_stream_os_delete(&writer->file_stream);
1264
-
1265
- if (writer->mem_stream) {
1266
- mz_stream_mem_close(writer->mem_stream);
1267
- mz_stream_mem_delete(&writer->mem_stream);
1268
- }
1269
-
1270
- return err;
1271
- }
1272
-
1273
- /***************************************************************************/
1274
-
1275
- int32_t mz_zip_writer_entry_open(void *handle, mz_zip_file *file_info) {
1276
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1277
- int32_t err = MZ_OK;
1278
- const char *password = NULL;
1279
- char password_buf[120];
1280
-
1281
- /* Copy file info to access data upon close */
1282
- memcpy(&writer->file_info, file_info, sizeof(mz_zip_file));
1283
-
1284
- if (writer->entry_cb)
1285
- writer->entry_cb(handle, writer->entry_userdata, &writer->file_info);
1286
-
1287
- password = writer->password;
1288
-
1289
- /* Check if we need a password and ask for it if we need to */
1290
- if (!password && writer->password_cb && (writer->file_info.flag & MZ_ZIP_FLAG_ENCRYPTED)) {
1291
- writer->password_cb(handle, writer->password_userdata, &writer->file_info,
1292
- password_buf, sizeof(password_buf));
1293
- password = password_buf;
1294
- }
1295
-
1296
- #ifndef MZ_ZIP_NO_CRYPTO
1297
- if (mz_zip_attrib_is_dir(writer->file_info.external_fa, writer->file_info.version_madeby) != MZ_OK) {
1298
- /* Start calculating sha256 */
1299
- mz_crypt_sha_create(&writer->sha256);
1300
- mz_crypt_sha_set_algorithm(writer->sha256, MZ_HASH_SHA256);
1301
- mz_crypt_sha_begin(writer->sha256);
1302
- }
1303
- #endif
1304
-
1305
- /* Open entry in zip */
1306
- err = mz_zip_entry_write_open(writer->zip_handle, &writer->file_info, writer->compress_level,
1307
- writer->raw, password);
1308
-
1309
- return err;
1310
- }
1311
-
1312
- #if !defined(MZ_ZIP_NO_CRYPTO) && defined(MZ_ZIP_SIGNING)
1313
- int32_t mz_zip_writer_entry_sign(void *handle, uint8_t *message, int32_t message_size,
1314
- uint8_t *cert_data, int32_t cert_data_size, const char *cert_pwd) {
1315
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1316
- int32_t err = MZ_OK;
1317
- int32_t signature_size = 0;
1318
- uint8_t *signature = NULL;
1319
-
1320
- if (!writer || !cert_data || cert_data_size <= 0)
1321
- return MZ_PARAM_ERROR;
1322
- if (mz_zip_entry_is_open(writer->zip_handle) != MZ_OK)
1323
- return MZ_PARAM_ERROR;
1324
-
1325
- /* Sign message with certificate */
1326
- err = mz_crypt_sign(message, message_size, cert_data, cert_data_size, cert_pwd,
1327
- &signature, &signature_size);
1328
-
1329
- if (err == MZ_OK && signature) {
1330
- /* Write signature zip extra field */
1331
- err = mz_zip_extrafield_write(writer->file_extra_stream, MZ_ZIP_EXTENSION_SIGN,
1332
- (uint16_t)signature_size);
1333
-
1334
- if (err == MZ_OK) {
1335
- if (mz_stream_write(writer->file_extra_stream, signature, signature_size) != signature_size)
1336
- err = MZ_WRITE_ERROR;
1337
- }
1338
-
1339
- free(signature);
1340
- }
1341
-
1342
- return err;
1343
- }
1344
- #endif
1345
-
1346
- int32_t mz_zip_writer_entry_close(void *handle) {
1347
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1348
- int32_t err = MZ_OK;
1349
- #ifndef MZ_ZIP_NO_CRYPTO
1350
- const uint8_t *extrafield = NULL;
1351
- int32_t extrafield_size = 0;
1352
- int16_t field_length_hash = 0;
1353
- uint8_t sha256[MZ_HASH_SHA256_SIZE];
1354
-
1355
- if (writer->sha256) {
1356
- mz_crypt_sha_end(writer->sha256, sha256, sizeof(sha256));
1357
- mz_crypt_sha_delete(&writer->sha256);
1358
-
1359
- /* Copy extrafield so we can append our own fields before close */
1360
- mz_stream_mem_create(&writer->file_extra_stream);
1361
- mz_stream_mem_open(writer->file_extra_stream, NULL, MZ_OPEN_MODE_CREATE);
1362
-
1363
- /* Write sha256 hash to extrafield */
1364
- field_length_hash = 4 + MZ_HASH_SHA256_SIZE;
1365
- err = mz_zip_extrafield_write(writer->file_extra_stream, MZ_ZIP_EXTENSION_HASH, field_length_hash);
1366
- if (err == MZ_OK)
1367
- err = mz_stream_write_uint16(writer->file_extra_stream, MZ_HASH_SHA256);
1368
- if (err == MZ_OK)
1369
- err = mz_stream_write_uint16(writer->file_extra_stream, MZ_HASH_SHA256_SIZE);
1370
- if (err == MZ_OK) {
1371
- if (mz_stream_write(writer->file_extra_stream, sha256, sizeof(sha256)) != MZ_HASH_SHA256_SIZE)
1372
- err = MZ_WRITE_ERROR;
1373
- }
1374
-
1375
- #ifdef MZ_ZIP_SIGNING
1376
- if ((err == MZ_OK) && (writer->cert_data) && (writer->cert_data_size > 0)) {
1377
- /* Sign entry if not zipping cd or if it is cd being zipped */
1378
- if (!writer->zip_cd || strcmp(writer->file_info.filename, MZ_ZIP_CD_FILENAME) == 0) {
1379
- err = mz_zip_writer_entry_sign(handle, sha256, sizeof(sha256),
1380
- writer->cert_data, writer->cert_data_size, writer->cert_pwd);
1381
- }
1382
- }
1383
- #endif
1384
-
1385
- if ((writer->file_info.extrafield) && (writer->file_info.extrafield_size > 0))
1386
- mz_stream_mem_write(writer->file_extra_stream, writer->file_info.extrafield,
1387
- writer->file_info.extrafield_size);
1388
-
1389
- /* Update extra field for central directory after adding extra fields */
1390
- mz_stream_mem_get_buffer(writer->file_extra_stream, (const void **)&extrafield);
1391
- mz_stream_mem_get_buffer_length(writer->file_extra_stream, &extrafield_size);
1392
-
1393
- mz_zip_entry_set_extrafield(writer->zip_handle, extrafield, (uint16_t)extrafield_size);
1394
- }
1395
- #endif
1396
-
1397
- if (err == MZ_OK) {
1398
- if (writer->raw)
1399
- err = mz_zip_entry_close_raw(writer->zip_handle, writer->file_info.uncompressed_size,
1400
- writer->file_info.crc);
1401
- else
1402
- err = mz_zip_entry_close(writer->zip_handle);
1403
- }
1404
-
1405
- if (writer->file_extra_stream)
1406
- mz_stream_mem_delete(&writer->file_extra_stream);
1407
-
1408
- return err;
1409
- }
1410
-
1411
- int32_t mz_zip_writer_entry_write(void *handle, const void *buf, int32_t len) {
1412
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1413
- int32_t written = 0;
1414
- written = mz_zip_entry_write(writer->zip_handle, buf, len);
1415
- #ifndef MZ_ZIP_NO_CRYPTO
1416
- if (written > 0 && writer->sha256)
1417
- mz_crypt_sha_update(writer->sha256, buf, written);
1418
- #endif
1419
- return written;
1420
- }
1421
- /***************************************************************************/
1422
-
1423
- int32_t mz_zip_writer_add_process(void *handle, void *stream, mz_stream_read_cb read_cb) {
1424
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1425
- int32_t read = 0;
1426
- int32_t written = 0;
1427
- int32_t err = MZ_OK;
1428
-
1429
- if (mz_zip_writer_is_open(writer) != MZ_OK)
1430
- return MZ_PARAM_ERROR;
1431
- /* If the entry isn't open for writing, open it */
1432
- if (mz_zip_entry_is_open(writer->zip_handle) != MZ_OK)
1433
- return MZ_PARAM_ERROR;
1434
- if (!read_cb)
1435
- return MZ_PARAM_ERROR;
1436
-
1437
- read = read_cb(stream, writer->buffer, sizeof(writer->buffer));
1438
- if (read == 0)
1439
- return MZ_END_OF_STREAM;
1440
- if (read < 0) {
1441
- err = read;
1442
- return err;
1443
- }
1444
-
1445
- written = mz_zip_writer_entry_write(handle, writer->buffer, read);
1446
- if (written != read)
1447
- return MZ_WRITE_ERROR;
1448
-
1449
- return written;
1450
- }
1451
-
1452
- int32_t mz_zip_writer_add(void *handle, void *stream, mz_stream_read_cb read_cb) {
1453
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1454
- uint64_t current_time = 0;
1455
- uint64_t update_time = 0;
1456
- int64_t current_pos = 0;
1457
- int64_t update_pos = 0;
1458
- int32_t err = MZ_OK;
1459
- int32_t written = 0;
1460
-
1461
- /* Update the progress at the beginning */
1462
- if (writer->progress_cb)
1463
- writer->progress_cb(handle, writer->progress_userdata, &writer->file_info, current_pos);
1464
-
1465
- /* Write data to stream until done */
1466
- while (err == MZ_OK) {
1467
- written = mz_zip_writer_add_process(handle, stream, read_cb);
1468
- if (written == MZ_END_OF_STREAM)
1469
- break;
1470
- if (written > 0)
1471
- current_pos += written;
1472
- if (written < 0)
1473
- err = written;
1474
-
1475
- /* Update progress if enough time have passed */
1476
- current_time = mz_os_ms_time();
1477
- if ((current_time - update_time) > writer->progress_cb_interval_ms) {
1478
- if (writer->progress_cb)
1479
- writer->progress_cb(handle, writer->progress_userdata, &writer->file_info, current_pos);
1480
-
1481
- update_pos = current_pos;
1482
- update_time = current_time;
1483
- }
1484
- }
1485
-
1486
- /* Update the progress at the end */
1487
- if (writer->progress_cb && update_pos != current_pos)
1488
- writer->progress_cb(handle, writer->progress_userdata, &writer->file_info, current_pos);
1489
-
1490
- return err;
1491
- }
1492
-
1493
- int32_t mz_zip_writer_add_info(void *handle, void *stream, mz_stream_read_cb read_cb, mz_zip_file *file_info) {
1494
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1495
- int32_t err = MZ_OK;
1496
-
1497
- if (mz_zip_writer_is_open(handle) != MZ_OK)
1498
- return MZ_PARAM_ERROR;
1499
- if (!file_info)
1500
- return MZ_PARAM_ERROR;
1501
-
1502
- /* Add to zip */
1503
- err = mz_zip_writer_entry_open(handle, file_info);
1504
- if (err != MZ_OK)
1505
- return err;
1506
-
1507
- if (stream) {
1508
- if (mz_zip_attrib_is_dir(writer->file_info.external_fa, writer->file_info.version_madeby) != MZ_OK) {
1509
- err = mz_zip_writer_add(handle, stream, read_cb);
1510
- if (err != MZ_OK)
1511
- return err;
1512
- }
1513
- }
1514
-
1515
- err = mz_zip_writer_entry_close(handle);
1516
-
1517
- return err;
1518
- }
1519
-
1520
- int32_t mz_zip_writer_add_buffer(void *handle, void *buf, int32_t len, mz_zip_file *file_info) {
1521
- void *mem_stream = NULL;
1522
- int32_t err = MZ_OK;
1523
-
1524
- if (mz_zip_writer_is_open(handle) != MZ_OK)
1525
- return MZ_PARAM_ERROR;
1526
- if (!buf)
1527
- return MZ_PARAM_ERROR;
1528
-
1529
- /* Create a memory stream backed by our buffer and add from it */
1530
- mz_stream_mem_create(&mem_stream);
1531
- mz_stream_mem_set_buffer(mem_stream, buf, len);
1532
-
1533
- err = mz_stream_mem_open(mem_stream, NULL, MZ_OPEN_MODE_READ);
1534
- if (err == MZ_OK)
1535
- err = mz_zip_writer_add_info(handle, mem_stream, mz_stream_mem_read, file_info);
1536
-
1537
- mz_stream_mem_delete(&mem_stream);
1538
- return err;
1539
- }
1540
-
1541
- int32_t mz_zip_writer_add_file(void *handle, const char *path, const char *filename_in_zip) {
1542
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1543
- mz_zip_file file_info;
1544
- uint32_t target_attrib = 0;
1545
- uint32_t src_attrib = 0;
1546
- int32_t err = MZ_OK;
1547
- uint8_t src_sys = 0;
1548
- void *stream = NULL;
1549
- char link_path[1024];
1550
- const char *filename = filename_in_zip;
1551
-
1552
- if (mz_zip_writer_is_open(handle) != MZ_OK)
1553
- return MZ_PARAM_ERROR;
1554
- if (!path)
1555
- return MZ_PARAM_ERROR;
1556
-
1557
- if (!filename) {
1558
- err = mz_path_get_filename(path, &filename);
1559
- if (err != MZ_OK)
1560
- return err;
1561
- }
1562
-
1563
- memset(&file_info, 0, sizeof(file_info));
1564
-
1565
- /* The path name saved, should not include a leading slash. */
1566
- /* If it did, windows/xp and dynazip couldn't read the zip file. */
1567
-
1568
- while (filename[0] == '\\' || filename[0] == '/')
1569
- filename += 1;
1570
-
1571
- /* Get information about the file on disk so we can store it in zip */
1572
-
1573
- file_info.version_madeby = MZ_VERSION_MADEBY;
1574
- file_info.compression_method = writer->compress_method;
1575
- file_info.filename = filename;
1576
- file_info.uncompressed_size = mz_os_get_file_size(path);
1577
- file_info.flag = MZ_ZIP_FLAG_UTF8;
1578
-
1579
- if (writer->zip_cd)
1580
- file_info.flag |= MZ_ZIP_FLAG_MASK_LOCAL_INFO;
1581
- if (writer->aes)
1582
- file_info.aes_version = MZ_AES_VERSION;
1583
-
1584
- mz_os_get_file_date(path, &file_info.modified_date, &file_info.accessed_date,
1585
- &file_info.creation_date);
1586
- mz_os_get_file_attribs(path, &src_attrib);
1587
-
1588
- src_sys = MZ_HOST_SYSTEM(file_info.version_madeby);
1589
-
1590
- if ((src_sys != MZ_HOST_SYSTEM_MSDOS) && (src_sys != MZ_HOST_SYSTEM_WINDOWS_NTFS)) {
1591
- /* High bytes are OS specific attributes, low byte is always DOS attributes */
1592
- if (mz_zip_attrib_convert(src_sys, src_attrib, MZ_HOST_SYSTEM_MSDOS, &target_attrib) == MZ_OK)
1593
- file_info.external_fa = target_attrib;
1594
- file_info.external_fa |= (src_attrib << 16);
1595
- } else {
1596
- file_info.external_fa = src_attrib;
1597
- }
1598
-
1599
- if (writer->store_links && mz_os_is_symlink(path) == MZ_OK) {
1600
- err = mz_os_read_symlink(path, link_path, sizeof(link_path));
1601
- if (err == MZ_OK)
1602
- file_info.linkname = link_path;
1603
- } else if (mz_os_is_dir(path) != MZ_OK) {
1604
- mz_stream_os_create(&stream);
1605
- err = mz_stream_os_open(stream, path, MZ_OPEN_MODE_READ);
1606
- }
1607
-
1608
- if (err == MZ_OK)
1609
- err = mz_zip_writer_add_info(handle, stream, mz_stream_read, &file_info);
1610
-
1611
- if (stream) {
1612
- mz_stream_close(stream);
1613
- mz_stream_delete(&stream);
1614
- }
1615
-
1616
- return err;
1617
- }
1618
-
1619
- int32_t mz_zip_writer_add_path(void *handle, const char *path, const char *root_path,
1620
- uint8_t include_path, uint8_t recursive) {
1621
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1622
- DIR *dir = NULL;
1623
- struct dirent *entry = NULL;
1624
- int32_t err = MZ_OK;
1625
- int16_t is_dir = 0;
1626
- const char *filename = NULL;
1627
- const char *filenameinzip = path;
1628
- char *wildcard_ptr = NULL;
1629
- char full_path[1024];
1630
- char path_dir[1024];
1631
-
1632
- if (strrchr(path, '*')) {
1633
- strncpy(path_dir, path, sizeof(path_dir) - 1);
1634
- path_dir[sizeof(path_dir) - 1] = 0;
1635
- mz_path_remove_filename(path_dir);
1636
- wildcard_ptr = path_dir + strlen(path_dir) + 1;
1637
- root_path = path = path_dir;
1638
- } else {
1639
- if (mz_os_is_dir(path) == MZ_OK)
1640
- is_dir = 1;
1641
-
1642
- /* Construct the filename that our file will be stored in the zip as */
1643
- if (!root_path)
1644
- root_path = path;
1645
-
1646
- /* Should the file be stored with any path info at all? */
1647
- if (!include_path) {
1648
- if (!is_dir && root_path == path) {
1649
- if (mz_path_get_filename(filenameinzip, &filename) == MZ_OK)
1650
- filenameinzip = filename;
1651
- } else {
1652
- filenameinzip += strlen(root_path);
1653
- }
1654
- }
1655
-
1656
- if (!writer->store_links && !writer->follow_links) {
1657
- if (mz_os_is_symlink(path) == MZ_OK)
1658
- return err;
1659
- }
1660
-
1661
- if (*filenameinzip != 0)
1662
- err = mz_zip_writer_add_file(handle, path, filenameinzip);
1663
-
1664
- if (!is_dir)
1665
- return err;
1666
-
1667
- if (writer->store_links) {
1668
- if (mz_os_is_symlink(path) == MZ_OK)
1669
- return err;
1670
- }
1671
- }
1672
-
1673
- dir = mz_os_open_dir(path);
1674
-
1675
- if (!dir)
1676
- return MZ_EXIST_ERROR;
1677
-
1678
- while ((entry = mz_os_read_dir(dir))) {
1679
- if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
1680
- continue;
1681
-
1682
- full_path[0] = 0;
1683
- mz_path_combine(full_path, path, sizeof(full_path));
1684
- mz_path_combine(full_path, entry->d_name, sizeof(full_path));
1685
-
1686
- if (!recursive && mz_os_is_dir(full_path) == MZ_OK)
1687
- continue;
1688
-
1689
- if ((wildcard_ptr) && (mz_path_compare_wc(entry->d_name, wildcard_ptr, 1) != MZ_OK))
1690
- continue;
1691
-
1692
- err = mz_zip_writer_add_path(handle, full_path, root_path, include_path, recursive);
1693
- if (err != MZ_OK)
1694
- break;
1695
- }
1696
-
1697
- mz_os_close_dir(dir);
1698
- return err;
1699
- }
1700
-
1701
- int32_t mz_zip_writer_copy_from_reader(void *handle, void *reader) {
1702
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1703
- mz_zip_file *file_info = NULL;
1704
- int64_t compressed_size = 0;
1705
- int64_t uncompressed_size = 0;
1706
- uint32_t crc32 = 0;
1707
- int32_t err = MZ_OK;
1708
- uint8_t original_raw = 0;
1709
- void *reader_zip_handle = NULL;
1710
- void *writer_zip_handle = NULL;
1711
-
1712
- if (mz_zip_reader_is_open(reader) != MZ_OK)
1713
- return MZ_PARAM_ERROR;
1714
- if (mz_zip_writer_is_open(writer) != MZ_OK)
1715
- return MZ_PARAM_ERROR;
1716
-
1717
- err = mz_zip_reader_entry_get_info(reader, &file_info);
1718
-
1719
- if (err != MZ_OK)
1720
- return err;
1721
-
1722
- mz_zip_reader_get_zip_handle(reader, &reader_zip_handle);
1723
- mz_zip_writer_get_zip_handle(writer, &writer_zip_handle);
1724
-
1725
- /* Open entry for raw reading */
1726
- err = mz_zip_entry_read_open(reader_zip_handle, 1, NULL);
1727
-
1728
- if (err == MZ_OK) {
1729
- /* Write entry raw, save original raw value */
1730
- original_raw = writer->raw;
1731
- writer->raw = 1;
1732
-
1733
- err = mz_zip_writer_entry_open(writer, file_info);
1734
-
1735
- if ((err == MZ_OK) &&
1736
- (mz_zip_attrib_is_dir(writer->file_info.external_fa, writer->file_info.version_madeby) != MZ_OK)) {
1737
- err = mz_zip_writer_add(writer, reader_zip_handle, mz_zip_entry_read);
1738
- }
1739
-
1740
- if (err == MZ_OK) {
1741
- err = mz_zip_entry_read_close(reader_zip_handle, &crc32, &compressed_size, &uncompressed_size);
1742
- if (err == MZ_OK)
1743
- err = mz_zip_entry_write_close(writer_zip_handle, crc32, compressed_size, uncompressed_size);
1744
- }
1745
-
1746
- if (mz_zip_entry_is_open(reader_zip_handle) == MZ_OK)
1747
- mz_zip_entry_close(reader_zip_handle);
1748
-
1749
- if (mz_zip_entry_is_open(writer_zip_handle) == MZ_OK)
1750
- mz_zip_entry_close(writer_zip_handle);
1751
-
1752
- writer->raw = original_raw;
1753
- }
1754
-
1755
- return err;
1756
- }
1757
-
1758
- /***************************************************************************/
1759
-
1760
- void mz_zip_writer_set_password(void *handle, const char *password) {
1761
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1762
- writer->password = password;
1763
- }
1764
-
1765
- void mz_zip_writer_set_comment(void *handle, const char *comment) {
1766
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1767
- writer->comment = comment;
1768
- }
1769
-
1770
- void mz_zip_writer_set_raw(void *handle, uint8_t raw) {
1771
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1772
- writer->raw = raw;
1773
- }
1774
-
1775
- int32_t mz_zip_writer_get_raw(void *handle, uint8_t *raw) {
1776
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1777
- if (!raw)
1778
- return MZ_PARAM_ERROR;
1779
- *raw = writer->raw;
1780
- return MZ_OK;
1781
- }
1782
-
1783
- void mz_zip_writer_set_aes(void *handle, uint8_t aes) {
1784
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1785
- writer->aes = aes;
1786
- }
1787
-
1788
- void mz_zip_writer_set_compress_method(void *handle, uint16_t compress_method) {
1789
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1790
- writer->compress_method = compress_method;
1791
- }
1792
-
1793
- void mz_zip_writer_set_compress_level(void *handle, int16_t compress_level) {
1794
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1795
- writer->compress_level = compress_level;
1796
- }
1797
-
1798
- void mz_zip_writer_set_follow_links(void *handle, uint8_t follow_links) {
1799
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1800
- writer->follow_links = follow_links;
1801
- }
1802
-
1803
- void mz_zip_writer_set_store_links(void *handle, uint8_t store_links) {
1804
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1805
- writer->store_links = store_links;
1806
- }
1807
-
1808
- void mz_zip_writer_set_zip_cd(void *handle, uint8_t zip_cd) {
1809
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1810
- writer->zip_cd = zip_cd;
1811
- }
1812
-
1813
- int32_t mz_zip_writer_set_certificate(void *handle, const char *cert_path, const char *cert_pwd) {
1814
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1815
- void *cert_stream = NULL;
1816
- uint8_t *cert_data = NULL;
1817
- int32_t cert_data_size = 0;
1818
- int32_t err = MZ_OK;
1819
-
1820
- if (!cert_path)
1821
- return MZ_PARAM_ERROR;
1822
-
1823
- cert_data_size = (int32_t)mz_os_get_file_size(cert_path);
1824
-
1825
- if (cert_data_size == 0)
1826
- return MZ_PARAM_ERROR;
1827
-
1828
- if (writer->cert_data) {
1829
- free(writer->cert_data);
1830
- writer->cert_data = NULL;
1831
- }
1832
-
1833
- cert_data = (uint8_t *)malloc(cert_data_size);
1834
-
1835
- /* Read pkcs12 certificate from disk */
1836
- mz_stream_os_create(&cert_stream);
1837
- err = mz_stream_os_open(cert_stream, cert_path, MZ_OPEN_MODE_READ);
1838
- if (err == MZ_OK) {
1839
- if (mz_stream_os_read(cert_stream, cert_data, cert_data_size) != cert_data_size)
1840
- err = MZ_READ_ERROR;
1841
- mz_stream_os_close(cert_stream);
1842
- }
1843
- mz_stream_os_delete(&cert_stream);
1844
-
1845
- if (err == MZ_OK) {
1846
- writer->cert_data = cert_data;
1847
- writer->cert_data_size = cert_data_size;
1848
- writer->cert_pwd = cert_pwd;
1849
- } else {
1850
- free(cert_data);
1851
- }
1852
-
1853
- return err;
1854
- }
1855
-
1856
- void mz_zip_writer_set_overwrite_cb(void *handle, void *userdata, mz_zip_writer_overwrite_cb cb) {
1857
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1858
- writer->overwrite_cb = cb;
1859
- writer->overwrite_userdata = userdata;
1860
- }
1861
-
1862
- void mz_zip_writer_set_password_cb(void *handle, void *userdata, mz_zip_writer_password_cb cb) {
1863
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1864
- writer->password_cb = cb;
1865
- writer->password_userdata = userdata;
1866
- }
1867
-
1868
- void mz_zip_writer_set_progress_cb(void *handle, void *userdata, mz_zip_writer_progress_cb cb) {
1869
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1870
- writer->progress_cb = cb;
1871
- writer->progress_userdata = userdata;
1872
- }
1873
-
1874
- void mz_zip_writer_set_progress_interval(void *handle, uint32_t milliseconds) {
1875
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1876
- writer->progress_cb_interval_ms = milliseconds;
1877
- }
1878
-
1879
- void mz_zip_writer_set_entry_cb(void *handle, void *userdata, mz_zip_writer_entry_cb cb) {
1880
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1881
- writer->entry_cb = cb;
1882
- writer->entry_userdata = userdata;
1883
- }
1884
-
1885
- int32_t mz_zip_writer_get_zip_handle(void *handle, void **zip_handle) {
1886
- mz_zip_writer *writer = (mz_zip_writer *)handle;
1887
- if (!zip_handle)
1888
- return MZ_PARAM_ERROR;
1889
- *zip_handle = writer->zip_handle;
1890
- if (!*zip_handle)
1891
- return MZ_EXIST_ERROR;
1892
- return MZ_OK;
1893
- }
1894
-
1895
- /***************************************************************************/
1896
-
1897
- void *mz_zip_writer_create(void **handle) {
1898
- mz_zip_writer *writer = NULL;
1899
-
1900
- writer = (mz_zip_writer *)calloc(1, sizeof(mz_zip_writer));
1901
- if (writer) {
1902
- #if defined(HAVE_WZAES)
1903
- writer->aes = 1;
1904
- #endif
1905
- #if defined(HAVE_ZLIB) || defined(HAVE_LIBCOMP)
1906
- writer->compress_method = MZ_COMPRESS_METHOD_DEFLATE;
1907
- #elif defined(HAVE_BZIP2)
1908
- writer->compress_method = MZ_COMPRESS_METHOD_BZIP2;
1909
- #elif defined(HAVE_LZMA)
1910
- writer->compress_method = MZ_COMPRESS_METHOD_LZMA;
1911
- #else
1912
- writer->compress_method = MZ_COMPRESS_METHOD_STORE;
1913
- #endif
1914
- writer->compress_level = MZ_COMPRESS_LEVEL_BEST;
1915
- writer->progress_cb_interval_ms = MZ_DEFAULT_PROGRESS_INTERVAL;
1916
- }
1917
- if (handle)
1918
- *handle = writer;
1919
-
1920
- return writer;
1921
- }
1922
-
1923
- void mz_zip_writer_delete(void **handle) {
1924
- mz_zip_writer *writer = NULL;
1925
- if (!handle)
1926
- return;
1927
- writer = (mz_zip_writer *)*handle;
1928
- if (writer) {
1929
- mz_zip_writer_close(writer);
1930
-
1931
- if (writer->cert_data)
1932
- free(writer->cert_data);
1933
-
1934
- writer->cert_data = NULL;
1935
- writer->cert_data_size = 0;
1936
-
1937
- free(writer);
1938
- }
1939
- *handle = NULL;
1940
- }
1941
-
1942
- /***************************************************************************/