Compare commits
106 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 28be5a67ab | |||
| 7ccc986657 | |||
| cfee6b5b89 | |||
| 676da25532 | |||
| 8d2b39b5ec | |||
| af85bf97a9 | |||
| b07d0c5d51 | |||
| aab8d383b3 | |||
| 4c97093700 | |||
| a1cc7c1654 | |||
| 7a6c677c17 | |||
| d607ba044b | |||
| c39636b71b | |||
| 705a69840f | |||
| a9ece3bef7 | |||
| fc61e0358d | |||
| 9761f045b2 | |||
| 2a1eee19b4 | |||
| 35b181504c | |||
| 8be53bee68 | |||
| cc714460f9 | |||
| 88c2ab7516 | |||
| c9d93d23e3 | |||
| bddefcebfe | |||
| 95d3d3544a | |||
| 4e3625684d | |||
| cc24921107 | |||
| 487093160b | |||
| dbc332ce70 | |||
| cedaa5250c | |||
| 938749897d | |||
| c881c8528f | |||
| 13e3ab93b4 | |||
| 5492b7bcea | |||
| 8b046fc30b | |||
| ef396cbd52 | |||
| 4b4cce2666 | |||
| d8a7fd0e8c | |||
| 0b476953df | |||
| 056fe04808 | |||
| 292d95e41a | |||
| fede9541b4 | |||
| ae50a6d40a | |||
| a75d901a85 | |||
| cb037e1010 | |||
| c119896966 | |||
| bf55cb47b7 | |||
| 801d1198b5 | |||
| 94a6637002 | |||
| b37ab60ba0 | |||
| a90b2a9611 | |||
| 7e44caef39 | |||
| 0c9aaee02b | |||
| bd02992224 | |||
| 9426653711 | |||
| 33c7884202 | |||
| 67403e8a28 | |||
| 74ce9fc2c7 | |||
| 553c4be486 | |||
| 9f93d0c1b7 | |||
| 55437a8b8e | |||
| d68c99b890 | |||
| e1bfb6e8ed | |||
| 874ebd8651 | |||
| a8f065f2a1 | |||
| b89dfcf4fd | |||
| b688b9859a | |||
| 54875c8192 | |||
| df0d5536e8 | |||
| 60f577ab9a | |||
| 60312c173b | |||
| c363747a15 | |||
| e29efca7bf | |||
| 024241a3e0 | |||
| 47c50d0482 | |||
| 2385ac9241 | |||
| b91fe135e2 | |||
| 57b6018ca0 | |||
| 89b32b9328 | |||
| 1b2ec1a9ec | |||
| b4c9bde3fb | |||
| 4fca963b62 | |||
| 281571d99f | |||
| 47afe71fa2 | |||
| de0ffe7478 | |||
| e422866c97 | |||
| 653caaa9b2 | |||
| d3c40f0e95 | |||
| ebc0b248ef | |||
| f89c159b2a | |||
| a5de5b6bef | |||
| bf95dc2fd4 | |||
| c2b33b42d0 | |||
| b91252282e | |||
| 1fefbc022f | |||
| 273fc1b36e | |||
| 164ae9bfd3 | |||
| d30b543f34 | |||
| ce6cbe1193 | |||
| 4cd142a39c | |||
| 45b93c037d | |||
| 362b011990 | |||
| 92f1142056 | |||
| a53f908392 | |||
| 3e2424437f | |||
| 713835cc28 |
+16
-3
@@ -1,7 +1,20 @@
|
|||||||
.DS_Store
|
# Xcode
|
||||||
*.mode1v3
|
#
|
||||||
|
build/
|
||||||
*.pbxuser
|
*.pbxuser
|
||||||
|
!default.pbxuser
|
||||||
|
*.mode1v3
|
||||||
|
!default.mode1v3
|
||||||
|
*.mode2v3
|
||||||
|
!default.mode2v3
|
||||||
*.perspectivev3
|
*.perspectivev3
|
||||||
*.xcworkspace
|
!default.perspectivev3
|
||||||
xcuserdata
|
xcuserdata
|
||||||
|
*.xccheckout
|
||||||
|
*.moved-aside
|
||||||
DerivedData
|
DerivedData
|
||||||
|
*.hmap
|
||||||
|
*.ipa
|
||||||
|
*.xcuserstate
|
||||||
|
*.DS_Store
|
||||||
|
.DS_Store
|
||||||
|
|||||||
@@ -1,53 +0,0 @@
|
|||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"size" : "29x29",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"size" : "40x40",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"size" : "60x60",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "29x29",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "29x29",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "40x40",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "40x40",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "76x76",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "76x76",
|
|
||||||
"scale" : "2x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"orientation" : "portrait",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"minimum-system-version" : "7.0",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"orientation" : "portrait",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"subtype" : "retina4",
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"minimum-system-version" : "7.0",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"orientation" : "portrait",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"minimum-system-version" : "7.0",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"orientation" : "landscape",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"minimum-system-version" : "7.0",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"orientation" : "portrait",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"minimum-system-version" : "7.0",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"orientation" : "landscape",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"minimum-system-version" : "7.0",
|
|
||||||
"scale" : "2x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2010-2013 Sam Soffes, http://soff.es
|
Copyright (c) 2010-2015, Sam Soffes, http://soff.es
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
a copy of this software and associated documentation files (the
|
a copy of this software and associated documentation files (the
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
#ZipArchive
|
||||||
|
|
||||||
|
ZipArchive is a simple utility class for zipping and unzipping files.
|
||||||
|
|
||||||
|
You can do the following:
|
||||||
|
|
||||||
|
- Unzip zip files
|
||||||
|
- Unzip password protected zip files
|
||||||
|
- Create new zip files
|
||||||
|
- Append to existing zip files
|
||||||
|
- Zip files
|
||||||
|
- Zip-up `NSData` instances (with a filename)
|
||||||
|
|
||||||
|
##How to add ZipArchive to your project
|
||||||
|
|
||||||
|
1. Add the `SSZipArchive` and `minizip` folders to your project.
|
||||||
|
2. Add the `libz` library to your target
|
||||||
|
|
||||||
|
ZipArchive requires ARC.
|
||||||
|
|
||||||
|
###Usage
|
||||||
|
|
||||||
|
```objective-c
|
||||||
|
// Unzipping
|
||||||
|
NSString *zipPath = @"path_to_your_zip_file";
|
||||||
|
NSString *destinationPath = @"path_to_the_folder_where_you_want_it_unzipped";
|
||||||
|
[SSZipArchive unzipFileAtPath:zipPath toDestination:destinationPath];
|
||||||
|
|
||||||
|
// Zipping
|
||||||
|
NSString *zippedPath = @"path_where_you_want_the_file_created";
|
||||||
|
NSArray *inputPaths = [NSArray arrayWithObjects:
|
||||||
|
[[NSBundle mainBundle] pathForResource:@"photo1" ofType:@"jpg"],
|
||||||
|
[[NSBundle mainBundle] pathForResource:@"photo2" ofType:@"jpg"]
|
||||||
|
nil];
|
||||||
|
[SSZipArchive createZipFileAtPath:zippedPath withFilesAtPaths:inputPaths];
|
||||||
|
|
||||||
|
// Zipping directory
|
||||||
|
[SSZipArchive createZipFileAtPath:zippedPath withContentsOfDirectory:inputPath];
|
||||||
|
```
|
||||||
|
|
||||||
|
###Licensing
|
||||||
|
ZipArchive is protected under the [MIT license](https://github.com/ZipArchive/ZipArchive/raw/master/LICENSE) and our slightly modified version of [Minizip](http://www.winimage.com/zLibDll/minizip.html) 1.1 is licensed under the [Zlib license](http://www.zlib.net/zlib_license.html).
|
||||||
|
|
||||||
|
## Acknowledgments
|
||||||
|
Big thanks to [Aish](http://code.google.com/p/ziparchive) for creating [ZipArchive](http://code.google.com/p/ziparchive). The project that inspired ZipArchive. Thank you [@randomsequence](https://github.com/randomsequence) for implementing the creation support tech and to [@johnezang](https://github.com/johnezang) for all his amazing help along the way.
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
# SSZipArchive
|
|
||||||
|
|
||||||
SSZipArchive is a simple utility class for zipping and unzipping files. Features:
|
|
||||||
|
|
||||||
* Unzipping zip files
|
|
||||||
* Unzipping password protected zip files
|
|
||||||
* Creating zip files
|
|
||||||
* Appending to zip files
|
|
||||||
* Zipping files
|
|
||||||
* Zipping NSData with a filename
|
|
||||||
|
|
||||||
## Adding to your project
|
|
||||||
|
|
||||||
1. Add the `SSZipArchive` folder to your project.
|
|
||||||
2. Add the `libz` library to your target
|
|
||||||
|
|
||||||
SSZipArchive requires ARC.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
``` objective-c
|
|
||||||
// Unzipping
|
|
||||||
NSString *zipPath = @"path_to_your_zip_file";
|
|
||||||
NSString *destinationPath = @"path_to_the_folder_where_you_want_it_unzipped";
|
|
||||||
[SSZipArchive unzipFileAtPath:zipPath toDestination:destinationPath];
|
|
||||||
|
|
||||||
// Zipping
|
|
||||||
NSString *zippedPath = @"path_where_you_want_the_file_created";
|
|
||||||
NSArray *inputPaths = [NSArray arrayWithObjects:
|
|
||||||
[[NSBundle mainBundle] pathForResource:@"photo1" ofType:@"jpg"],
|
|
||||||
[[NSBundle mainBundle] pathForResource:@"photo2" ofType:@"jpg"]
|
|
||||||
nil];
|
|
||||||
[SSZipArchive createZipFileAtPath:zippedPath withFilesAtPaths:inputPaths];
|
|
||||||
```
|
|
||||||
|
|
||||||
## Tests
|
|
||||||
|
|
||||||
Simply, open the Xcode 5 or higher project in the Tests directory and press Command-U to run the tests.
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
SSZipArchive is licensed under the [MIT license](https://github.com/samsoffes/ssziparchive/raw/master/LICENSE). A slightly modified version of [Minizip](http://www.winimage.com/zLibDll/minizip.html) 1.1 is also included and is licensed under the [Zlib license](http://www.zlib.net/zlib_license.html).
|
|
||||||
|
|
||||||
## Thanks
|
|
||||||
|
|
||||||
Thanks [aish](http://code.google.com/p/ziparchive) for creating [ZipArchive](http://code.google.com/p/ziparchive) which SSZipArchive is based on, Johnnie Walker ([@randomsequence](https://github.com/randomsequence)) for implementing creation support, and John Engelhart ([@johnezang](https://github.com/johnezang)) for all his amazing help along the way.
|
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
Pod::Spec.new do |s|
|
Pod::Spec.new do |s|
|
||||||
s.name = 'SSZipArchive'
|
s.name = 'SSZipArchive'
|
||||||
s.version = '0.3.0'
|
s.version = '0.3.2'
|
||||||
s.summary = 'Utility class for zipping and unzipping files on iOS and Mac.'
|
s.summary = 'Utility class for zipping and unzipping files on iOS and Mac.'
|
||||||
s.description = 'SSZipArchive is a simple utility class for zipping and unzipping files on iOS and Mac.'
|
s.description = 'SSZipArchive is a simple utility class for zipping and unzipping files on iOS and Mac.'
|
||||||
s.homepage = 'https://github.com/soffes/ssziparchive'
|
s.homepage = 'https://github.com/soffes/ssziparchive'
|
||||||
s.license = { :type => 'MIT', :file => 'LICENSE' }
|
s.license = { :type => 'MIT', :file => 'LICENSE.txt' }
|
||||||
s.author = { 'Sam Soffes' => 'sam@soff.es' }
|
s.author = { 'Sam Soffes' => 'sam@soff.es' }
|
||||||
s.source = { :git => 'https://github.com/soffes/ssziparchive.git', :tag => "v#{s.version}" }
|
s.source = { :git => 'https://github.com/soffes/ssziparchive.git', :tag => "v#{s.version}" }
|
||||||
s.ios.deployment_target = '4.0'
|
s.ios.deployment_target = '4.0'
|
||||||
s.osx.deployment_target = '10.6'
|
s.osx.deployment_target = '10.6'
|
||||||
s.source_files = 'SSZipArchive/SSZipArchive.{h,m}', 'SSZipArchive/minizip/*.{h,c}'
|
s.source_files = 'SSZipArchive/*', 'SSZipArchive/minizip/*'
|
||||||
s.header_dir = 'SSZipArchive/minizip'
|
s.library = 'z'
|
||||||
s.library = 'z'
|
s.requires_arc = true
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -7,20 +7,22 @@
|
|||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
|
011F4B96182D71B700DE704F /* RelativeSymbolicLink.zip in Resources */ = {isa = PBXBuildFile; fileRef = 011F4B95182D71B700DE704F /* RelativeSymbolicLink.zip */; };
|
||||||
|
011F4B97182D72B400DE704F /* RelativeSymbolicLink.zip in Resources */ = {isa = PBXBuildFile; fileRef = 011F4B95182D71B700DE704F /* RelativeSymbolicLink.zip */; };
|
||||||
|
210D525417DEFB880060D41A /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = 210D524C17DEFB880060D41A /* ioapi.c */; };
|
||||||
|
210D525517DEFB880060D41A /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = 210D524C17DEFB880060D41A /* ioapi.c */; };
|
||||||
|
210D525617DEFB880060D41A /* mztools.c in Sources */ = {isa = PBXBuildFile; fileRef = 210D524E17DEFB880060D41A /* mztools.c */; };
|
||||||
|
210D525717DEFB880060D41A /* mztools.c in Sources */ = {isa = PBXBuildFile; fileRef = 210D524E17DEFB880060D41A /* mztools.c */; };
|
||||||
|
210D525817DEFB880060D41A /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 210D525017DEFB880060D41A /* unzip.c */; };
|
||||||
|
210D525917DEFB880060D41A /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 210D525017DEFB880060D41A /* unzip.c */; };
|
||||||
|
210D525A17DEFB880060D41A /* zip.c in Sources */ = {isa = PBXBuildFile; fileRef = 210D525217DEFB880060D41A /* zip.c */; };
|
||||||
|
210D525B17DEFB880060D41A /* zip.c in Sources */ = {isa = PBXBuildFile; fileRef = 210D525217DEFB880060D41A /* zip.c */; };
|
||||||
21CC41A917DB7D1300201DDC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21CC41A817DB7D1300201DDC /* Foundation.framework */; };
|
21CC41A917DB7D1300201DDC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21CC41A817DB7D1300201DDC /* Foundation.framework */; };
|
||||||
21CC41AB17DB7D1300201DDC /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21CC41AA17DB7D1300201DDC /* CoreGraphics.framework */; };
|
21CC41AB17DB7D1300201DDC /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21CC41AA17DB7D1300201DDC /* CoreGraphics.framework */; };
|
||||||
21CC41AD17DB7D1300201DDC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21CC41AC17DB7D1300201DDC /* UIKit.framework */; };
|
21CC41AD17DB7D1300201DDC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21CC41AC17DB7D1300201DDC /* UIKit.framework */; };
|
||||||
21CC41C217DB7D1300201DDC /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21CC41C117DB7D1300201DDC /* XCTest.framework */; };
|
21CC41C217DB7D1300201DDC /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21CC41C117DB7D1300201DDC /* XCTest.framework */; };
|
||||||
21CC41C317DB7D1300201DDC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21CC41A817DB7D1300201DDC /* Foundation.framework */; };
|
21CC41C317DB7D1300201DDC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21CC41A817DB7D1300201DDC /* Foundation.framework */; };
|
||||||
21CC41C417DB7D1300201DDC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21CC41AC17DB7D1300201DDC /* UIKit.framework */; };
|
21CC41C417DB7D1300201DDC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21CC41AC17DB7D1300201DDC /* UIKit.framework */; };
|
||||||
21CC41E417DB7D2F00201DDC /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = 21CC41DA17DB7D2F00201DDC /* ioapi.c */; };
|
|
||||||
21CC41E517DB7D2F00201DDC /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = 21CC41DA17DB7D2F00201DDC /* ioapi.c */; };
|
|
||||||
21CC41E617DB7D2F00201DDC /* mztools.c in Sources */ = {isa = PBXBuildFile; fileRef = 21CC41DC17DB7D2F00201DDC /* mztools.c */; };
|
|
||||||
21CC41E717DB7D2F00201DDC /* mztools.c in Sources */ = {isa = PBXBuildFile; fileRef = 21CC41DC17DB7D2F00201DDC /* mztools.c */; };
|
|
||||||
21CC41E817DB7D2F00201DDC /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 21CC41DE17DB7D2F00201DDC /* unzip.c */; };
|
|
||||||
21CC41E917DB7D2F00201DDC /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 21CC41DE17DB7D2F00201DDC /* unzip.c */; };
|
|
||||||
21CC41EA17DB7D2F00201DDC /* zip.c in Sources */ = {isa = PBXBuildFile; fileRef = 21CC41E017DB7D2F00201DDC /* zip.c */; };
|
|
||||||
21CC41EB17DB7D2F00201DDC /* zip.c in Sources */ = {isa = PBXBuildFile; fileRef = 21CC41E017DB7D2F00201DDC /* zip.c */; };
|
|
||||||
21CC41EC17DB7D2F00201DDC /* SSZipArchive.m in Sources */ = {isa = PBXBuildFile; fileRef = 21CC41E317DB7D2F00201DDC /* SSZipArchive.m */; };
|
21CC41EC17DB7D2F00201DDC /* SSZipArchive.m in Sources */ = {isa = PBXBuildFile; fileRef = 21CC41E317DB7D2F00201DDC /* SSZipArchive.m */; };
|
||||||
21CC41ED17DB7D2F00201DDC /* SSZipArchive.m in Sources */ = {isa = PBXBuildFile; fileRef = 21CC41E317DB7D2F00201DDC /* SSZipArchive.m */; };
|
21CC41ED17DB7D2F00201DDC /* SSZipArchive.m in Sources */ = {isa = PBXBuildFile; fileRef = 21CC41E317DB7D2F00201DDC /* SSZipArchive.m */; };
|
||||||
21CC41F817DB7D3500201DDC /* IncorrectHeaders.zip in Resources */ = {isa = PBXBuildFile; fileRef = 21CC41F017DB7D3500201DDC /* IncorrectHeaders.zip */; };
|
21CC41F817DB7D3500201DDC /* IncorrectHeaders.zip in Resources */ = {isa = PBXBuildFile; fileRef = 21CC41F017DB7D3500201DDC /* IncorrectHeaders.zip */; };
|
||||||
@@ -30,11 +32,21 @@
|
|||||||
21CC41FC17DB7D3500201DDC /* TestPasswordArchive.zip in Resources */ = {isa = PBXBuildFile; fileRef = 21CC41F417DB7D3500201DDC /* TestPasswordArchive.zip */; };
|
21CC41FC17DB7D3500201DDC /* TestPasswordArchive.zip in Resources */ = {isa = PBXBuildFile; fileRef = 21CC41F417DB7D3500201DDC /* TestPasswordArchive.zip */; };
|
||||||
21CC41FD17DB7D3500201DDC /* Unicode.zip in Resources */ = {isa = PBXBuildFile; fileRef = 21CC41F517DB7D3500201DDC /* Unicode.zip */; };
|
21CC41FD17DB7D3500201DDC /* Unicode.zip in Resources */ = {isa = PBXBuildFile; fileRef = 21CC41F517DB7D3500201DDC /* Unicode.zip */; };
|
||||||
21CC41FF17DB7D3500201DDC /* SSZipArchiveTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 21CC41F717DB7D3500201DDC /* SSZipArchiveTests.m */; };
|
21CC41FF17DB7D3500201DDC /* SSZipArchiveTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 21CC41F717DB7D3500201DDC /* SSZipArchiveTests.m */; };
|
||||||
21CC420F17DB7D6F00201DDC /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 21CC420817DB7D6300201DDC /* Images.xcassets */; };
|
|
||||||
21CC421017DB7D7400201DDC /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 21CC420517DB7D6300201DDC /* main.m */; };
|
21CC421017DB7D7400201DDC /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 21CC420517DB7D6300201DDC /* main.m */; };
|
||||||
21CC421117DB7D7900201DDC /* SSAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 21CC420317DB7D6300201DDC /* SSAppDelegate.m */; };
|
21CC421117DB7D7900201DDC /* SSAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 21CC420317DB7D6300201DDC /* SSAppDelegate.m */; };
|
||||||
21CC421317DB7E0500201DDC /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 21CC421217DB7E0500201DDC /* libz.dylib */; };
|
21CC421317DB7E0500201DDC /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 21CC421217DB7E0500201DDC /* libz.dylib */; };
|
||||||
21CC421417DB7E0900201DDC /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 21CC421217DB7E0500201DDC /* libz.dylib */; };
|
21CC421417DB7E0900201DDC /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 21CC421217DB7E0500201DDC /* libz.dylib */; };
|
||||||
|
3D18E4BC1B2367A300627171 /* CollectingDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D18E4BB1B2367A300627171 /* CollectingDelegate.m */; };
|
||||||
|
3D18E4C51B236A7500627171 /* 0.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 3D18E4BD1B236A7500627171 /* 0.m4a */; };
|
||||||
|
3D18E4C61B236A7500627171 /* 1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 3D18E4BE1B236A7500627171 /* 1.m4a */; };
|
||||||
|
3D18E4C71B236A7500627171 /* 2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 3D18E4BF1B236A7500627171 /* 2.m4a */; };
|
||||||
|
3D18E4C81B236A7500627171 /* 3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 3D18E4C01B236A7500627171 /* 3.m4a */; };
|
||||||
|
3D18E4C91B236A7500627171 /* 4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 3D18E4C11B236A7500627171 /* 4.m4a */; };
|
||||||
|
3D18E4CA1B236A7500627171 /* 5.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 3D18E4C21B236A7500627171 /* 5.m4a */; };
|
||||||
|
3D18E4CB1B236A7500627171 /* 6.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 3D18E4C31B236A7500627171 /* 6.m4a */; };
|
||||||
|
3D18E4CC1B236A7500627171 /* 7.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 3D18E4C41B236A7500627171 /* 7.m4a */; };
|
||||||
|
3D18E4CE1B236C2A00627171 /* hello.zip in Resources */ = {isa = PBXBuildFile; fileRef = 3D18E4CD1B236C2A00627171 /* hello.zip */; };
|
||||||
|
A5CD0D3A1AD3490700E7F209 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A5CD0D391AD3490700E7F209 /* Default-568h@2x.png */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
@@ -48,21 +60,22 @@
|
|||||||
/* End PBXContainerItemProxy section */
|
/* End PBXContainerItemProxy section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
|
011F4B95182D71B700DE704F /* RelativeSymbolicLink.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = RelativeSymbolicLink.zip; sourceTree = "<group>"; };
|
||||||
|
210D524B17DEFB880060D41A /* crypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crypt.h; sourceTree = "<group>"; };
|
||||||
|
210D524C17DEFB880060D41A /* ioapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ioapi.c; sourceTree = "<group>"; };
|
||||||
|
210D524D17DEFB880060D41A /* ioapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ioapi.h; sourceTree = "<group>"; };
|
||||||
|
210D524E17DEFB880060D41A /* mztools.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mztools.c; sourceTree = "<group>"; };
|
||||||
|
210D524F17DEFB880060D41A /* mztools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mztools.h; sourceTree = "<group>"; };
|
||||||
|
210D525017DEFB880060D41A /* unzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = unzip.c; sourceTree = "<group>"; };
|
||||||
|
210D525117DEFB880060D41A /* unzip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unzip.h; sourceTree = "<group>"; };
|
||||||
|
210D525217DEFB880060D41A /* zip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip.c; sourceTree = "<group>"; };
|
||||||
|
210D525317DEFB880060D41A /* zip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zip.h; sourceTree = "<group>"; };
|
||||||
21CC41A517DB7D1300201DDC /* SSZipArchive.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SSZipArchive.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
21CC41A517DB7D1300201DDC /* SSZipArchive.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SSZipArchive.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
21CC41A817DB7D1300201DDC /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
21CC41A817DB7D1300201DDC /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
||||||
21CC41AA17DB7D1300201DDC /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
|
21CC41AA17DB7D1300201DDC /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
|
||||||
21CC41AC17DB7D1300201DDC /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
|
21CC41AC17DB7D1300201DDC /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
|
||||||
21CC41C017DB7D1300201DDC /* SSZipArchiveTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SSZipArchiveTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
21CC41C017DB7D1300201DDC /* SSZipArchiveTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SSZipArchiveTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
21CC41C117DB7D1300201DDC /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
|
21CC41C117DB7D1300201DDC /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
|
||||||
21CC41D917DB7D2F00201DDC /* crypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crypt.h; sourceTree = "<group>"; };
|
|
||||||
21CC41DA17DB7D2F00201DDC /* ioapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ioapi.c; sourceTree = "<group>"; };
|
|
||||||
21CC41DB17DB7D2F00201DDC /* ioapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ioapi.h; sourceTree = "<group>"; };
|
|
||||||
21CC41DC17DB7D2F00201DDC /* mztools.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mztools.c; sourceTree = "<group>"; };
|
|
||||||
21CC41DD17DB7D2F00201DDC /* mztools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mztools.h; sourceTree = "<group>"; };
|
|
||||||
21CC41DE17DB7D2F00201DDC /* unzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = unzip.c; sourceTree = "<group>"; };
|
|
||||||
21CC41DF17DB7D2F00201DDC /* unzip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unzip.h; sourceTree = "<group>"; };
|
|
||||||
21CC41E017DB7D2F00201DDC /* zip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip.c; sourceTree = "<group>"; };
|
|
||||||
21CC41E117DB7D2F00201DDC /* zip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zip.h; sourceTree = "<group>"; };
|
|
||||||
21CC41E217DB7D2F00201DDC /* SSZipArchive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SSZipArchive.h; sourceTree = "<group>"; };
|
21CC41E217DB7D2F00201DDC /* SSZipArchive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SSZipArchive.h; sourceTree = "<group>"; };
|
||||||
21CC41E317DB7D2F00201DDC /* SSZipArchive.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SSZipArchive.m; sourceTree = "<group>"; };
|
21CC41E317DB7D2F00201DDC /* SSZipArchive.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SSZipArchive.m; sourceTree = "<group>"; };
|
||||||
21CC41F017DB7D3500201DDC /* IncorrectHeaders.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = IncorrectHeaders.zip; sourceTree = "<group>"; };
|
21CC41F017DB7D3500201DDC /* IncorrectHeaders.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = IncorrectHeaders.zip; sourceTree = "<group>"; };
|
||||||
@@ -77,9 +90,20 @@
|
|||||||
21CC420317DB7D6300201DDC /* SSAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SSAppDelegate.m; sourceTree = "<group>"; };
|
21CC420317DB7D6300201DDC /* SSAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SSAppDelegate.m; sourceTree = "<group>"; };
|
||||||
21CC420517DB7D6300201DDC /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
21CC420517DB7D6300201DDC /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
||||||
21CC420617DB7D6300201DDC /* SSZipArchive-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SSZipArchive-Prefix.pch"; sourceTree = "<group>"; };
|
21CC420617DB7D6300201DDC /* SSZipArchive-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SSZipArchive-Prefix.pch"; sourceTree = "<group>"; };
|
||||||
21CC420817DB7D6300201DDC /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
|
|
||||||
21CC420917DB7D6300201DDC /* SSZipArchive-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "SSZipArchive-Info.plist"; sourceTree = "<group>"; };
|
21CC420917DB7D6300201DDC /* SSZipArchive-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "SSZipArchive-Info.plist"; sourceTree = "<group>"; };
|
||||||
21CC421217DB7E0500201DDC /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
|
21CC421217DB7E0500201DDC /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
|
||||||
|
3D18E4BA1B2367A300627171 /* CollectingDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CollectingDelegate.h; sourceTree = "<group>"; };
|
||||||
|
3D18E4BB1B2367A300627171 /* CollectingDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CollectingDelegate.m; sourceTree = "<group>"; };
|
||||||
|
3D18E4BD1B236A7500627171 /* 0.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; name = 0.m4a; path = Tests/Multi_Zip_Test/0.m4a; sourceTree = SOURCE_ROOT; };
|
||||||
|
3D18E4BE1B236A7500627171 /* 1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; name = 1.m4a; path = Tests/Multi_Zip_Test/1.m4a; sourceTree = SOURCE_ROOT; };
|
||||||
|
3D18E4BF1B236A7500627171 /* 2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; name = 2.m4a; path = Tests/Multi_Zip_Test/2.m4a; sourceTree = SOURCE_ROOT; };
|
||||||
|
3D18E4C01B236A7500627171 /* 3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; name = 3.m4a; path = Tests/Multi_Zip_Test/3.m4a; sourceTree = SOURCE_ROOT; };
|
||||||
|
3D18E4C11B236A7500627171 /* 4.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; name = 4.m4a; path = Tests/Multi_Zip_Test/4.m4a; sourceTree = SOURCE_ROOT; };
|
||||||
|
3D18E4C21B236A7500627171 /* 5.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; name = 5.m4a; path = Tests/Multi_Zip_Test/5.m4a; sourceTree = SOURCE_ROOT; };
|
||||||
|
3D18E4C31B236A7500627171 /* 6.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; name = 6.m4a; path = Tests/Multi_Zip_Test/6.m4a; sourceTree = SOURCE_ROOT; };
|
||||||
|
3D18E4C41B236A7500627171 /* 7.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; name = 7.m4a; path = Tests/Multi_Zip_Test/7.m4a; sourceTree = SOURCE_ROOT; };
|
||||||
|
3D18E4CD1B236C2A00627171 /* hello.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = hello.zip; sourceTree = "<group>"; };
|
||||||
|
A5CD0D391AD3490700E7F209 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
@@ -108,12 +132,28 @@
|
|||||||
/* End PBXFrameworksBuildPhase section */
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
/* Begin PBXGroup section */
|
||||||
|
210D524A17DEFB880060D41A /* minizip */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
210D524B17DEFB880060D41A /* crypt.h */,
|
||||||
|
210D524C17DEFB880060D41A /* ioapi.c */,
|
||||||
|
210D524D17DEFB880060D41A /* ioapi.h */,
|
||||||
|
210D524E17DEFB880060D41A /* mztools.c */,
|
||||||
|
210D524F17DEFB880060D41A /* mztools.h */,
|
||||||
|
210D525017DEFB880060D41A /* unzip.c */,
|
||||||
|
210D525117DEFB880060D41A /* unzip.h */,
|
||||||
|
210D525217DEFB880060D41A /* zip.c */,
|
||||||
|
210D525317DEFB880060D41A /* zip.h */,
|
||||||
|
);
|
||||||
|
path = minizip;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
21CC419C17DB7D1300201DDC = {
|
21CC419C17DB7D1300201DDC = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
21CC41D717DB7D2F00201DDC /* SSZipArchive */,
|
21CC41D717DB7D2F00201DDC /* SSZipArchive */,
|
||||||
21CC420017DB7D6300201DDC /* Example */,
|
|
||||||
21CC41EE17DB7D3500201DDC /* Tests */,
|
21CC41EE17DB7D3500201DDC /* Tests */,
|
||||||
|
21CC420017DB7D6300201DDC /* Sample Application */,
|
||||||
21CC41A717DB7D1300201DDC /* Frameworks */,
|
21CC41A717DB7D1300201DDC /* Frameworks */,
|
||||||
21CC41A617DB7D1300201DDC /* Products */,
|
21CC41A617DB7D1300201DDC /* Products */,
|
||||||
);
|
);
|
||||||
@@ -145,30 +185,17 @@
|
|||||||
children = (
|
children = (
|
||||||
21CC41E217DB7D2F00201DDC /* SSZipArchive.h */,
|
21CC41E217DB7D2F00201DDC /* SSZipArchive.h */,
|
||||||
21CC41E317DB7D2F00201DDC /* SSZipArchive.m */,
|
21CC41E317DB7D2F00201DDC /* SSZipArchive.m */,
|
||||||
21CC41D817DB7D2F00201DDC /* minizip */,
|
210D524A17DEFB880060D41A /* minizip */,
|
||||||
);
|
);
|
||||||
path = SSZipArchive;
|
path = SSZipArchive;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
21CC41D817DB7D2F00201DDC /* minizip */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
21CC41D917DB7D2F00201DDC /* crypt.h */,
|
|
||||||
21CC41DA17DB7D2F00201DDC /* ioapi.c */,
|
|
||||||
21CC41DB17DB7D2F00201DDC /* ioapi.h */,
|
|
||||||
21CC41DC17DB7D2F00201DDC /* mztools.c */,
|
|
||||||
21CC41DD17DB7D2F00201DDC /* mztools.h */,
|
|
||||||
21CC41DE17DB7D2F00201DDC /* unzip.c */,
|
|
||||||
21CC41DF17DB7D2F00201DDC /* unzip.h */,
|
|
||||||
21CC41E017DB7D2F00201DDC /* zip.c */,
|
|
||||||
21CC41E117DB7D2F00201DDC /* zip.h */,
|
|
||||||
);
|
|
||||||
path = minizip;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
21CC41EE17DB7D3500201DDC /* Tests */ = {
|
21CC41EE17DB7D3500201DDC /* Tests */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
3D18E4BA1B2367A300627171 /* CollectingDelegate.h */,
|
||||||
|
3D18E4BB1B2367A300627171 /* CollectingDelegate.m */,
|
||||||
|
3D18E4A91B23679000627171 /* Multi_Zip_Test */,
|
||||||
21CC41EF17DB7D3500201DDC /* Fixtures */,
|
21CC41EF17DB7D3500201DDC /* Fixtures */,
|
||||||
21CC41F617DB7D3500201DDC /* SSZipArchiveTests-Info.plist */,
|
21CC41F617DB7D3500201DDC /* SSZipArchiveTests-Info.plist */,
|
||||||
21CC41F717DB7D3500201DDC /* SSZipArchiveTests.m */,
|
21CC41F717DB7D3500201DDC /* SSZipArchiveTests.m */,
|
||||||
@@ -179,6 +206,8 @@
|
|||||||
21CC41EF17DB7D3500201DDC /* Fixtures */ = {
|
21CC41EF17DB7D3500201DDC /* Fixtures */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
3D18E4CD1B236C2A00627171 /* hello.zip */,
|
||||||
|
011F4B95182D71B700DE704F /* RelativeSymbolicLink.zip */,
|
||||||
21CC41F017DB7D3500201DDC /* IncorrectHeaders.zip */,
|
21CC41F017DB7D3500201DDC /* IncorrectHeaders.zip */,
|
||||||
21CC41F117DB7D3500201DDC /* PermissionsTestApp.app */,
|
21CC41F117DB7D3500201DDC /* PermissionsTestApp.app */,
|
||||||
21CC41F217DB7D3500201DDC /* SymbolicLink.zip */,
|
21CC41F217DB7D3500201DDC /* SymbolicLink.zip */,
|
||||||
@@ -189,41 +218,41 @@
|
|||||||
path = Fixtures;
|
path = Fixtures;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
21CC420017DB7D6300201DDC /* Example */ = {
|
21CC420017DB7D6300201DDC /* Sample Application */ = {
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
21CC420117DB7D6300201DDC /* Classes */,
|
|
||||||
21CC420417DB7D6300201DDC /* Other Sources */,
|
|
||||||
21CC420717DB7D6300201DDC /* Resources */,
|
|
||||||
);
|
|
||||||
path = Example;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
21CC420117DB7D6300201DDC /* Classes */ = {
|
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
21CC420217DB7D6300201DDC /* SSAppDelegate.h */,
|
21CC420217DB7D6300201DDC /* SSAppDelegate.h */,
|
||||||
21CC420317DB7D6300201DDC /* SSAppDelegate.m */,
|
21CC420317DB7D6300201DDC /* SSAppDelegate.m */,
|
||||||
|
21CC420417DB7D6300201DDC /* Supporting Files */,
|
||||||
);
|
);
|
||||||
path = Classes;
|
path = "Sample Application";
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
21CC420417DB7D6300201DDC /* Other Sources */ = {
|
21CC420417DB7D6300201DDC /* Supporting Files */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
A5CD0D391AD3490700E7F209 /* Default-568h@2x.png */,
|
||||||
21CC420517DB7D6300201DDC /* main.m */,
|
21CC420517DB7D6300201DDC /* main.m */,
|
||||||
21CC420617DB7D6300201DDC /* SSZipArchive-Prefix.pch */,
|
21CC420617DB7D6300201DDC /* SSZipArchive-Prefix.pch */,
|
||||||
);
|
|
||||||
path = "Other Sources";
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
21CC420717DB7D6300201DDC /* Resources */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
21CC420817DB7D6300201DDC /* Images.xcassets */,
|
|
||||||
21CC420917DB7D6300201DDC /* SSZipArchive-Info.plist */,
|
21CC420917DB7D6300201DDC /* SSZipArchive-Info.plist */,
|
||||||
);
|
);
|
||||||
path = Resources;
|
path = "Supporting Files";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
3D18E4A91B23679000627171 /* Multi_Zip_Test */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
3D18E4BD1B236A7500627171 /* 0.m4a */,
|
||||||
|
3D18E4BE1B236A7500627171 /* 1.m4a */,
|
||||||
|
3D18E4BF1B236A7500627171 /* 2.m4a */,
|
||||||
|
3D18E4C01B236A7500627171 /* 3.m4a */,
|
||||||
|
3D18E4C11B236A7500627171 /* 4.m4a */,
|
||||||
|
3D18E4C21B236A7500627171 /* 5.m4a */,
|
||||||
|
3D18E4C31B236A7500627171 /* 6.m4a */,
|
||||||
|
3D18E4C41B236A7500627171 /* 7.m4a */,
|
||||||
|
);
|
||||||
|
name = Multi_Zip_Test;
|
||||||
|
path = ../../../Pictures/ssziparchive/Tests/Multi_Zip_Test;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
@@ -302,7 +331,17 @@
|
|||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
21CC420F17DB7D6F00201DDC /* Images.xcassets in Resources */,
|
3D18E4C51B236A7500627171 /* 0.m4a in Resources */,
|
||||||
|
3D18E4CB1B236A7500627171 /* 6.m4a in Resources */,
|
||||||
|
3D18E4CC1B236A7500627171 /* 7.m4a in Resources */,
|
||||||
|
3D18E4C91B236A7500627171 /* 4.m4a in Resources */,
|
||||||
|
3D18E4C61B236A7500627171 /* 1.m4a in Resources */,
|
||||||
|
3D18E4CA1B236A7500627171 /* 5.m4a in Resources */,
|
||||||
|
011F4B96182D71B700DE704F /* RelativeSymbolicLink.zip in Resources */,
|
||||||
|
3D18E4CE1B236C2A00627171 /* hello.zip in Resources */,
|
||||||
|
A5CD0D3A1AD3490700E7F209 /* Default-568h@2x.png in Resources */,
|
||||||
|
3D18E4C81B236A7500627171 /* 3.m4a in Resources */,
|
||||||
|
3D18E4C71B236A7500627171 /* 2.m4a in Resources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -310,6 +349,7 @@
|
|||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
011F4B97182D72B400DE704F /* RelativeSymbolicLink.zip in Resources */,
|
||||||
21CC41F817DB7D3500201DDC /* IncorrectHeaders.zip in Resources */,
|
21CC41F817DB7D3500201DDC /* IncorrectHeaders.zip in Resources */,
|
||||||
21CC41FD17DB7D3500201DDC /* Unicode.zip in Resources */,
|
21CC41FD17DB7D3500201DDC /* Unicode.zip in Resources */,
|
||||||
21CC41FA17DB7D3500201DDC /* SymbolicLink.zip in Resources */,
|
21CC41FA17DB7D3500201DDC /* SymbolicLink.zip in Resources */,
|
||||||
@@ -326,13 +366,14 @@
|
|||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
21CC41E817DB7D2F00201DDC /* unzip.c in Sources */,
|
210D525817DEFB880060D41A /* unzip.c in Sources */,
|
||||||
21CC41EC17DB7D2F00201DDC /* SSZipArchive.m in Sources */,
|
21CC41EC17DB7D2F00201DDC /* SSZipArchive.m in Sources */,
|
||||||
21CC41EA17DB7D2F00201DDC /* zip.c in Sources */,
|
|
||||||
21CC421117DB7D7900201DDC /* SSAppDelegate.m in Sources */,
|
21CC421117DB7D7900201DDC /* SSAppDelegate.m in Sources */,
|
||||||
21CC41E617DB7D2F00201DDC /* mztools.c in Sources */,
|
210D525417DEFB880060D41A /* ioapi.c in Sources */,
|
||||||
|
210D525A17DEFB880060D41A /* zip.c in Sources */,
|
||||||
21CC421017DB7D7400201DDC /* main.m in Sources */,
|
21CC421017DB7D7400201DDC /* main.m in Sources */,
|
||||||
21CC41E417DB7D2F00201DDC /* ioapi.c in Sources */,
|
3D18E4BC1B2367A300627171 /* CollectingDelegate.m in Sources */,
|
||||||
|
210D525617DEFB880060D41A /* mztools.c in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -340,12 +381,12 @@
|
|||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
21CC41E517DB7D2F00201DDC /* ioapi.c in Sources */,
|
210D525517DEFB880060D41A /* ioapi.c in Sources */,
|
||||||
|
210D525917DEFB880060D41A /* unzip.c in Sources */,
|
||||||
21CC41FF17DB7D3500201DDC /* SSZipArchiveTests.m in Sources */,
|
21CC41FF17DB7D3500201DDC /* SSZipArchiveTests.m in Sources */,
|
||||||
|
210D525B17DEFB880060D41A /* zip.c in Sources */,
|
||||||
|
210D525717DEFB880060D41A /* mztools.c in Sources */,
|
||||||
21CC41ED17DB7D2F00201DDC /* SSZipArchive.m in Sources */,
|
21CC41ED17DB7D2F00201DDC /* SSZipArchive.m in Sources */,
|
||||||
21CC41E917DB7D2F00201DDC /* unzip.c in Sources */,
|
|
||||||
21CC41EB17DB7D2F00201DDC /* zip.c in Sources */,
|
|
||||||
21CC41E717DB7D2F00201DDC /* mztools.c in Sources */,
|
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -433,11 +474,10 @@
|
|||||||
21CC41D217DB7D1300201DDC /* Debug */ = {
|
21CC41D217DB7D1300201DDC /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||||
GCC_PREFIX_HEADER = "Example/Other Sources/SSZipArchive-Prefix.pch";
|
GCC_PREFIX_HEADER = "$(SRCROOT)/Sample Application/Supporting Files/SSZipArchive-Prefix.pch";
|
||||||
INFOPLIST_FILE = "Example/Resources/SSZipArchive-Info.plist";
|
INFOPLIST_FILE = "$(SRCROOT)/Sample Application/Supporting Files/SSZipArchive-Info.plist";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
WRAPPER_EXTENSION = app;
|
WRAPPER_EXTENSION = app;
|
||||||
};
|
};
|
||||||
@@ -446,11 +486,10 @@
|
|||||||
21CC41D317DB7D1300201DDC /* Release */ = {
|
21CC41D317DB7D1300201DDC /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||||
GCC_PREFIX_HEADER = "Example/Other Sources/SSZipArchive-Prefix.pch";
|
GCC_PREFIX_HEADER = "$(SRCROOT)/Sample Application/Supporting Files/SSZipArchive-Prefix.pch";
|
||||||
INFOPLIST_FILE = "Example/Resources/SSZipArchive-Info.plist";
|
INFOPLIST_FILE = "$(SRCROOT)/Sample Application/Supporting Files/SSZipArchive-Info.plist";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
WRAPPER_EXTENSION = app;
|
WRAPPER_EXTENSION = app;
|
||||||
};
|
};
|
||||||
@@ -460,6 +499,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/SSZipArchive.app/SSZipArchive";
|
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/SSZipArchive.app/SSZipArchive";
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
FRAMEWORK_SEARCH_PATHS = (
|
||||||
"$(SDKROOT)/Developer/Library/Frameworks",
|
"$(SDKROOT)/Developer/Library/Frameworks",
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
@@ -480,6 +520,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/SSZipArchive.app/SSZipArchive";
|
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/SSZipArchive.app/SSZipArchive";
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
FRAMEWORK_SEARCH_PATHS = (
|
||||||
"$(SDKROOT)/Developer/Library/Frameworks",
|
"$(SDKROOT)/Developer/Library/Frameworks",
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Workspace
|
||||||
|
version = "1.0">
|
||||||
|
<FileRef
|
||||||
|
location = "self:SSZipArchive.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
|
</Workspace>
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "0500"
|
||||||
|
version = "1.3">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "21CC41A417DB7D1300201DDC"
|
||||||
|
BuildableName = "SSZipArchive.app"
|
||||||
|
BlueprintName = "SSZipArchive"
|
||||||
|
ReferencedContainer = "container:SSZipArchive.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "21CC41BF17DB7D1300201DDC"
|
||||||
|
BuildableName = "SSZipArchiveTests.xctest"
|
||||||
|
BlueprintName = "SSZipArchiveTests"
|
||||||
|
ReferencedContainer = "container:SSZipArchive.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
|
</Testables>
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "21CC41A417DB7D1300201DDC"
|
||||||
|
BuildableName = "SSZipArchive.app"
|
||||||
|
BlueprintName = "SSZipArchive"
|
||||||
|
ReferencedContainer = "container:SSZipArchive.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
<BuildableProductRunnable>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "21CC41A417DB7D1300201DDC"
|
||||||
|
BuildableName = "SSZipArchive.app"
|
||||||
|
BlueprintName = "SSZipArchive"
|
||||||
|
ReferencedContainer = "container:SSZipArchive.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
<AdditionalOptions>
|
||||||
|
</AdditionalOptions>
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<BuildableProductRunnable>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "21CC41A417DB7D1300201DDC"
|
||||||
|
BuildableName = "SSZipArchive.app"
|
||||||
|
BlueprintName = "SSZipArchive"
|
||||||
|
ReferencedContainer = "container:SSZipArchive.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
||||||
@@ -3,14 +3,14 @@
|
|||||||
// SSZipArchive
|
// SSZipArchive
|
||||||
//
|
//
|
||||||
// Created by Sam Soffes on 7/21/10.
|
// Created by Sam Soffes on 7/21/10.
|
||||||
// Copyright (c) Sam Soffes 2010-2013. All rights reserved.
|
// Copyright (c) Sam Soffes 2010-2015. All rights reserved.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef _SSZIPARCHIVE_H
|
#ifndef _SSZIPARCHIVE_H
|
||||||
#define _SSZIPARCHIVE_H
|
#define _SSZIPARCHIVE_H
|
||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
#include "minizip/unzip.h"
|
#include "unzip.h"
|
||||||
|
|
||||||
@protocol SSZipArchiveDelegate;
|
@protocol SSZipArchiveDelegate;
|
||||||
|
|
||||||
@@ -18,24 +18,37 @@
|
|||||||
|
|
||||||
// Unzip
|
// Unzip
|
||||||
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination;
|
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination;
|
||||||
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError **)error;
|
|
||||||
|
|
||||||
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination delegate:(id<SSZipArchiveDelegate>)delegate;
|
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination delegate:(id<SSZipArchiveDelegate>)delegate;
|
||||||
|
|
||||||
|
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError **)error;
|
||||||
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError **)error delegate:(id<SSZipArchiveDelegate>)delegate;
|
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError **)error delegate:(id<SSZipArchiveDelegate>)delegate;
|
||||||
|
|
||||||
|
+ (BOOL)unzipFileAtPath:(NSString *)path
|
||||||
|
toDestination:(NSString *)destination
|
||||||
|
progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
|
||||||
|
completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler;
|
||||||
|
|
||||||
|
+ (BOOL)unzipFileAtPath:(NSString *)path
|
||||||
|
toDestination:(NSString *)destination
|
||||||
|
overwrite:(BOOL)overwrite
|
||||||
|
password:(NSString *)password
|
||||||
|
progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
|
||||||
|
completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler;
|
||||||
|
|
||||||
// Zip
|
// Zip
|
||||||
+ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)filenames;
|
+ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)filenames;
|
||||||
+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath;
|
+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath;
|
||||||
|
+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirectory;
|
||||||
|
|
||||||
- (id)initWithPath:(NSString *)path;
|
- (instancetype)initWithPath:(NSString *)path NS_DESIGNATED_INITIALIZER;
|
||||||
- (BOOL)open;
|
@property (NS_NONATOMIC_IOSONLY, readonly) BOOL open;
|
||||||
- (BOOL)writeFile:(NSString *)path;
|
- (BOOL)writeFile:(NSString *)path;
|
||||||
|
- (BOOL)writeFileAtPath:(NSString *)path withFileName:(NSString *)fileName;
|
||||||
- (BOOL)writeData:(NSData *)data filename:(NSString *)filename;
|
- (BOOL)writeData:(NSData *)data filename:(NSString *)filename;
|
||||||
- (BOOL)close;
|
@property (NS_NONATOMIC_IOSONLY, readonly) BOOL close;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
@protocol SSZipArchiveDelegate <NSObject>
|
@protocol SSZipArchiveDelegate <NSObject>
|
||||||
|
|
||||||
@optional
|
@optional
|
||||||
@@ -43,8 +56,13 @@
|
|||||||
- (void)zipArchiveWillUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo;
|
- (void)zipArchiveWillUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo;
|
||||||
- (void)zipArchiveDidUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo unzippedPath:(NSString *)unzippedPath;
|
- (void)zipArchiveDidUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo unzippedPath:(NSString *)unzippedPath;
|
||||||
|
|
||||||
|
- (BOOL)zipArchiveShouldUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo;
|
||||||
- (void)zipArchiveWillUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo;
|
- (void)zipArchiveWillUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo;
|
||||||
- (void)zipArchiveDidUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo;
|
- (void)zipArchiveDidUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo;
|
||||||
|
- (void)zipArchiveDidUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath unzippedFilePath:(NSString *)unzippedFilePath;
|
||||||
|
|
||||||
|
- (void)zipArchiveProgressEvent:(unsigned long long)loaded total:(unsigned long long)total;
|
||||||
|
- (void)zipArchiveDidUnzipArchiveFile:(NSString *)zipFile entryPath:(NSString *)entryPath destPath:(NSString *)destPath;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|||||||
+246
-99
@@ -3,11 +3,11 @@
|
|||||||
// SSZipArchive
|
// SSZipArchive
|
||||||
//
|
//
|
||||||
// Created by Sam Soffes on 7/21/10.
|
// Created by Sam Soffes on 7/21/10.
|
||||||
// Copyright (c) Sam Soffes 2010-2013. All rights reserved.
|
// Copyright (c) Sam Soffes 2010-2015. All rights reserved.
|
||||||
//
|
//
|
||||||
|
|
||||||
#import "SSZipArchive.h"
|
#import "SSZipArchive.h"
|
||||||
#include "minizip/zip.h"
|
#include "zip.h"
|
||||||
#import "zlib.h"
|
#import "zlib.h"
|
||||||
#import "zconf.h"
|
#import "zconf.h"
|
||||||
|
|
||||||
@@ -19,55 +19,104 @@
|
|||||||
+ (NSDate *)_dateWithMSDOSFormat:(UInt32)msdosDateTime;
|
+ (NSDate *)_dateWithMSDOSFormat:(UInt32)msdosDateTime;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@implementation SSZipArchive
|
||||||
@implementation SSZipArchive {
|
{
|
||||||
NSString *_path;
|
NSString *_path;
|
||||||
NSString *_filename;
|
NSString *_filename;
|
||||||
zipFile _zip;
|
zipFile _zip;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#pragma mark - Unzipping
|
#pragma mark - Unzipping
|
||||||
|
|
||||||
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination {
|
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination
|
||||||
|
{
|
||||||
return [self unzipFileAtPath:path toDestination:destination delegate:nil];
|
return [self unzipFileAtPath:path toDestination:destination delegate:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError **)error
|
||||||
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError **)error {
|
{
|
||||||
return [self unzipFileAtPath:path toDestination:destination overwrite:overwrite password:password error:error delegate:nil];
|
return [self unzipFileAtPath:path toDestination:destination overwrite:overwrite password:password error:error delegate:nil progressHandler:nil completionHandler:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination delegate:(id<SSZipArchiveDelegate>)delegate
|
||||||
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination delegate:(id<SSZipArchiveDelegate>)delegate {
|
{
|
||||||
return [self unzipFileAtPath:path toDestination:destination overwrite:YES password:nil error:nil delegate:delegate];
|
return [self unzipFileAtPath:path toDestination:destination overwrite:YES password:nil error:nil delegate:delegate progressHandler:nil completionHandler:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError **)error delegate:(id<SSZipArchiveDelegate>)delegate
|
||||||
|
{
|
||||||
|
return [self unzipFileAtPath:path toDestination:destination overwrite:overwrite password:password error:error delegate:delegate progressHandler:nil completionHandler:nil];
|
||||||
|
}
|
||||||
|
|
||||||
+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError **)error delegate:(id<SSZipArchiveDelegate>)delegate {
|
+ (BOOL)unzipFileAtPath:(NSString *)path
|
||||||
|
toDestination:(NSString *)destination
|
||||||
|
overwrite:(BOOL)overwrite
|
||||||
|
password:(NSString *)password
|
||||||
|
progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
|
||||||
|
completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler
|
||||||
|
{
|
||||||
|
return [self unzipFileAtPath:path toDestination:destination overwrite:overwrite password:password error:nil delegate:nil progressHandler:progressHandler completionHandler:completionHandler];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (BOOL)unzipFileAtPath:(NSString *)path
|
||||||
|
toDestination:(NSString *)destination
|
||||||
|
progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
|
||||||
|
completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler
|
||||||
|
{
|
||||||
|
return [self unzipFileAtPath:path toDestination:destination overwrite:YES password:nil error:nil delegate:nil progressHandler:progressHandler completionHandler:completionHandler];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (BOOL)unzipFileAtPath:(NSString *)path
|
||||||
|
toDestination:(NSString *)destination
|
||||||
|
overwrite:(BOOL)overwrite
|
||||||
|
password:(NSString *)password
|
||||||
|
error:(NSError **)error
|
||||||
|
delegate:(id<SSZipArchiveDelegate>)delegate
|
||||||
|
progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
|
||||||
|
completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler
|
||||||
|
{
|
||||||
// Begin opening
|
// Begin opening
|
||||||
zipFile zip = unzOpen((const char*)[path UTF8String]);
|
zipFile zip = unzOpen((const char*)[path UTF8String]);
|
||||||
if (zip == NULL) {
|
if (zip == NULL)
|
||||||
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:@"failed to open zip file" forKey:NSLocalizedDescriptionKey];
|
{
|
||||||
if (error) {
|
NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"failed to open zip file"};
|
||||||
*error = [NSError errorWithDomain:@"SSZipArchiveErrorDomain" code:-1 userInfo:userInfo];
|
NSError *err = [NSError errorWithDomain:@"SSZipArchiveErrorDomain" code:-1 userInfo:userInfo];
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
*error = err;
|
||||||
|
}
|
||||||
|
if (completionHandler)
|
||||||
|
{
|
||||||
|
completionHandler(nil, NO, err);
|
||||||
}
|
}
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NSDictionary * fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil];
|
||||||
|
unsigned long long fileSize = [fileAttributes[NSFileSize] unsignedLongLongValue];
|
||||||
|
unsigned long long currentPosition = 0;
|
||||||
|
|
||||||
unz_global_info globalInfo = {0ul, 0ul};
|
unz_global_info globalInfo = {0ul, 0ul};
|
||||||
unzGetGlobalInfo(zip, &globalInfo);
|
unzGetGlobalInfo(zip, &globalInfo);
|
||||||
|
|
||||||
// Begin unzipping
|
// Begin unzipping
|
||||||
if (unzGoToFirstFile(zip) != UNZ_OK) {
|
if (unzGoToFirstFile(zip) != UNZ_OK)
|
||||||
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:@"failed to open first file in zip file" forKey:NSLocalizedDescriptionKey];
|
{
|
||||||
if (error) {
|
NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"failed to open first file in zip file"};
|
||||||
*error = [NSError errorWithDomain:@"SSZipArchiveErrorDomain" code:-2 userInfo:userInfo];
|
NSError *err = [NSError errorWithDomain:@"SSZipArchiveErrorDomain" code:-2 userInfo:userInfo];
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
*error = err;
|
||||||
|
}
|
||||||
|
if (completionHandler)
|
||||||
|
{
|
||||||
|
completionHandler(nil, NO, err);
|
||||||
}
|
}
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL success = YES;
|
BOOL success = YES;
|
||||||
|
BOOL canceled = NO;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
unsigned char buffer[4096] = {0};
|
unsigned char buffer[4096] = {0};
|
||||||
NSFileManager *fileManager = [NSFileManager defaultManager];
|
NSFileManager *fileManager = [NSFileManager defaultManager];
|
||||||
@@ -77,6 +126,9 @@
|
|||||||
if ([delegate respondsToSelector:@selector(zipArchiveWillUnzipArchiveAtPath:zipInfo:)]) {
|
if ([delegate respondsToSelector:@selector(zipArchiveWillUnzipArchiveAtPath:zipInfo:)]) {
|
||||||
[delegate zipArchiveWillUnzipArchiveAtPath:path zipInfo:globalInfo];
|
[delegate zipArchiveWillUnzipArchiveAtPath:path zipInfo:globalInfo];
|
||||||
}
|
}
|
||||||
|
if ([delegate respondsToSelector:@selector(zipArchiveProgressEvent:total:)]) {
|
||||||
|
[delegate zipArchiveProgressEvent:(NSInteger)currentPosition total:(NSInteger)fileSize];
|
||||||
|
}
|
||||||
|
|
||||||
NSInteger currentFileNumber = 0;
|
NSInteger currentFileNumber = 0;
|
||||||
do {
|
do {
|
||||||
@@ -103,44 +155,52 @@
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
currentPosition += fileInfo.compressed_size;
|
||||||
|
|
||||||
// Message delegate
|
// Message delegate
|
||||||
|
if ([delegate respondsToSelector:@selector(zipArchiveShouldUnzipFileAtIndex:totalFiles:archivePath:fileInfo:)]) {
|
||||||
|
if (![delegate zipArchiveShouldUnzipFileAtIndex:currentFileNumber
|
||||||
|
totalFiles:(NSInteger)globalInfo.number_entry
|
||||||
|
archivePath:path fileInfo:fileInfo]) {
|
||||||
|
success = NO;
|
||||||
|
canceled = YES;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
if ([delegate respondsToSelector:@selector(zipArchiveWillUnzipFileAtIndex:totalFiles:archivePath:fileInfo:)]) {
|
if ([delegate respondsToSelector:@selector(zipArchiveWillUnzipFileAtIndex:totalFiles:archivePath:fileInfo:)]) {
|
||||||
[delegate zipArchiveWillUnzipFileAtIndex:currentFileNumber totalFiles:(NSInteger)globalInfo.number_entry
|
[delegate zipArchiveWillUnzipFileAtIndex:currentFileNumber totalFiles:(NSInteger)globalInfo.number_entry
|
||||||
archivePath:path fileInfo:fileInfo];
|
archivePath:path fileInfo:fileInfo];
|
||||||
}
|
}
|
||||||
|
if ([delegate respondsToSelector:@selector(zipArchiveProgressEvent:total:)]) {
|
||||||
|
[delegate zipArchiveProgressEvent:(NSInteger)currentPosition total:(NSInteger)fileSize];
|
||||||
|
}
|
||||||
|
|
||||||
char *filename = (char *)malloc(fileInfo.size_filename + 1);
|
char *filename = (char *)malloc(fileInfo.size_filename + 1);
|
||||||
unzGetCurrentFileInfo(zip, &fileInfo, filename, fileInfo.size_filename + 1, NULL, 0, NULL, 0);
|
unzGetCurrentFileInfo(zip, &fileInfo, filename, fileInfo.size_filename + 1, NULL, 0, NULL, 0);
|
||||||
filename[fileInfo.size_filename] = '\0';
|
filename[fileInfo.size_filename] = '\0';
|
||||||
|
|
||||||
//
|
//
|
||||||
// NOTE
|
// Determine whether this is a symbolic link:
|
||||||
// I used the ZIP spec from here:
|
// - File is stored with 'version made by' value of UNIX (3),
|
||||||
// http://www.pkware.com/documents/casestudies/APPNOTE.TXT
|
// as per http://www.pkware.com/documents/casestudies/APPNOTE.TXT
|
||||||
|
// in the upper byte of the version field.
|
||||||
|
// - BSD4.4 st_mode constants are stored in the high 16 bits of the
|
||||||
|
// external file attributes (defacto standard, verified against libarchive)
|
||||||
//
|
//
|
||||||
// ...to deduce this method of detecting whether the file in the ZIP is a symbolic link.
|
// The original constants can be found here:
|
||||||
// If it is, it is listed as a directory but has a data size greater than zero (real
|
// http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.4BSD/usr/include/sys/stat.h
|
||||||
// directories have it equal to 0) and the included, uncompressed data is the symbolic link path.
|
|
||||||
//
|
//
|
||||||
// ZIP files did not originally include support for symbolic links so the specification
|
const uLong ZipUNIXVersion = 3;
|
||||||
// doesn't include anything in them that isn't part of a unix extension that isn't being used
|
const uLong BSD_SFMT = 0170000;
|
||||||
// by the archivers we're testing. Most of this is figured out through trial and error and
|
const uLong BSD_IFLNK = 0120000;
|
||||||
// reading ZIP headers in hex editors. This seems to do the trick though.
|
|
||||||
//
|
|
||||||
|
|
||||||
const uLong ZipCompressionMethodStore = 0;
|
|
||||||
|
|
||||||
BOOL fileIsSymbolicLink = NO;
|
BOOL fileIsSymbolicLink = NO;
|
||||||
|
if (((fileInfo.version >> 8) == ZipUNIXVersion) && BSD_IFLNK == (BSD_SFMT & (fileInfo.external_fa >> 16))) {
|
||||||
if((fileInfo.compression_method == ZipCompressionMethodStore) && // Is it compressed?
|
fileIsSymbolicLink = NO;
|
||||||
(S_ISDIR(fileInfo.external_fa)) && // Is it marked as a directory
|
|
||||||
(fileInfo.compressed_size > 0)) // Is there any data?
|
|
||||||
{
|
|
||||||
fileIsSymbolicLink = YES;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if it contains directory
|
// Check if it contains directory
|
||||||
NSString *strPath = [NSString stringWithCString:filename encoding:NSUTF8StringEncoding];
|
NSString *strPath = @(filename);
|
||||||
BOOL isDirectory = NO;
|
BOOL isDirectory = NO;
|
||||||
if (filename[fileInfo.size_filename-1] == '/' || filename[fileInfo.size_filename-1] == '\\') {
|
if (filename[fileInfo.size_filename-1] == '/' || filename[fileInfo.size_filename-1] == '\\') {
|
||||||
isDirectory = YES;
|
isDirectory = YES;
|
||||||
@@ -155,7 +215,7 @@
|
|||||||
NSString *fullPath = [destination stringByAppendingPathComponent:strPath];
|
NSString *fullPath = [destination stringByAppendingPathComponent:strPath];
|
||||||
NSError *err = nil;
|
NSError *err = nil;
|
||||||
NSDate *modDate = [[self class] _dateWithMSDOSFormat:(UInt32)fileInfo.dosDate];
|
NSDate *modDate = [[self class] _dateWithMSDOSFormat:(UInt32)fileInfo.dosDate];
|
||||||
NSDictionary *directoryAttr = [NSDictionary dictionaryWithObjectsAndKeys:modDate, NSFileCreationDate, modDate, NSFileModificationDate, nil];
|
NSDictionary *directoryAttr = @{NSFileCreationDate: modDate, NSFileModificationDate: modDate};
|
||||||
|
|
||||||
if (isDirectory) {
|
if (isDirectory) {
|
||||||
[fileManager createDirectoryAtPath:fullPath withIntermediateDirectories:YES attributes:directoryAttr error:&err];
|
[fileManager createDirectoryAtPath:fullPath withIntermediateDirectories:YES attributes:directoryAttr error:&err];
|
||||||
@@ -167,7 +227,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!fileIsSymbolicLink)
|
if(!fileIsSymbolicLink)
|
||||||
[directoriesModificationDates addObject: [NSDictionary dictionaryWithObjectsAndKeys:fullPath, @"path", modDate, @"modDate", nil]];
|
[directoriesModificationDates addObject: @{@"path": fullPath, @"modDate": modDate}];
|
||||||
|
|
||||||
if ([fileManager fileExistsAtPath:fullPath] && !isDirectory && !overwrite) {
|
if ([fileManager fileExistsAtPath:fullPath] && !isDirectory && !overwrite) {
|
||||||
unzCloseCurrentFile(zip);
|
unzCloseCurrentFile(zip);
|
||||||
@@ -175,8 +235,7 @@
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!fileIsSymbolicLink)
|
if (!fileIsSymbolicLink) {
|
||||||
{
|
|
||||||
FILE *fp = fopen((const char*)[fullPath UTF8String], "wb");
|
FILE *fp = fopen((const char*)[fullPath UTF8String], "wb");
|
||||||
while (fp) {
|
while (fp) {
|
||||||
int readBytes = unzReadCurrentFile(zip, buffer, 4096);
|
int readBytes = unzReadCurrentFile(zip, buffer, 4096);
|
||||||
@@ -189,12 +248,19 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (fp) {
|
if (fp) {
|
||||||
|
if ([[[fullPath pathExtension] lowercaseString] isEqualToString:@"zip"]) {
|
||||||
|
NSLog(@"Unzipping nested .zip file: %@", [fullPath lastPathComponent]);
|
||||||
|
if ([self unzipFileAtPath:fullPath toDestination:[fullPath stringByDeletingLastPathComponent] overwrite:overwrite password:password error:nil delegate:nil]) {
|
||||||
|
[[NSFileManager defaultManager] removeItemAtPath:fullPath error:nil];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
||||||
// Set the original datetime property
|
// Set the original datetime property
|
||||||
if (fileInfo.dosDate != 0) {
|
if (fileInfo.dosDate != 0) {
|
||||||
NSDate *orgDate = [[self class] _dateWithMSDOSFormat:(UInt32)fileInfo.dosDate];
|
NSDate *orgDate = [[self class] _dateWithMSDOSFormat:(UInt32)fileInfo.dosDate];
|
||||||
NSDictionary *attr = [NSDictionary dictionaryWithObject:orgDate forKey:NSFileModificationDate];
|
NSDictionary *attr = @{NSFileModificationDate: orgDate};
|
||||||
|
|
||||||
if (attr) {
|
if (attr) {
|
||||||
if ([fileManager setAttributes:attr ofItemAtPath:fullPath error:nil] == NO) {
|
if ([fileManager setAttributes:attr ofItemAtPath:fullPath error:nil] == NO) {
|
||||||
@@ -221,36 +287,33 @@
|
|||||||
// Unable to set the permissions attribute
|
// Unable to set the permissions attribute
|
||||||
NSLog(@"[SSZipArchive] Failed to set attributes - whilst setting permissions");
|
NSLog(@"[SSZipArchive] Failed to set attributes - whilst setting permissions");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !__has_feature(objc_arc)
|
||||||
|
[attrs release];
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Get the path for the symbolic link
|
// Assemble the path for the symbolic link
|
||||||
|
NSMutableString* destinationPath = [NSMutableString string];
|
||||||
|
int bytesRead = 0;
|
||||||
|
while((bytesRead = unzReadCurrentFile(zip, buffer, 4096)) > 0)
|
||||||
|
{
|
||||||
|
buffer[bytesRead] = (int)0;
|
||||||
|
[destinationPath appendString:@((const char*)buffer)];
|
||||||
|
}
|
||||||
|
|
||||||
NSURL* symlinkURL = [NSURL fileURLWithPath:fullPath];
|
// Create the symbolic link (making sure it stays relative if it was relative before)
|
||||||
NSMutableString* destinationPath = [NSMutableString string];
|
int symlinkError = symlink([destinationPath cStringUsingEncoding:NSUTF8StringEncoding],
|
||||||
|
[fullPath cStringUsingEncoding:NSUTF8StringEncoding]);
|
||||||
|
|
||||||
int bytesRead = 0;
|
if(symlinkError != 0)
|
||||||
while((bytesRead = unzReadCurrentFile(zip, buffer, 4096)) > 0)
|
{
|
||||||
{
|
NSLog(@"Failed to create symbolic link at \"%@\" to \"%@\". symlink() error code: %d", fullPath, destinationPath, errno);
|
||||||
buffer[bytesRead] = 0;
|
}
|
||||||
[destinationPath appendString:[NSString stringWithUTF8String:(const char*)buffer]];
|
}
|
||||||
}
|
|
||||||
|
|
||||||
//NSLog(@"Symlinking to: %@", destinationPath);
|
|
||||||
|
|
||||||
NSURL* destinationURL = [NSURL fileURLWithPath:destinationPath];
|
|
||||||
|
|
||||||
// Create the symbolic link
|
|
||||||
NSError* symlinkError = nil;
|
|
||||||
[fileManager createSymbolicLinkAtURL:symlinkURL withDestinationURL:destinationURL error:&symlinkError];
|
|
||||||
|
|
||||||
if(symlinkError != nil)
|
|
||||||
{
|
|
||||||
NSLog(@"Failed to create symbolic link at \"%@\" to \"%@\". Error: %@", symlinkURL.absoluteString, destinationURL.absoluteString, symlinkError.localizedDescription);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unzCloseCurrentFile( zip );
|
unzCloseCurrentFile( zip );
|
||||||
ret = unzGoToNextFile( zip );
|
ret = unzGoToNextFile( zip );
|
||||||
@@ -259,9 +322,16 @@
|
|||||||
if ([delegate respondsToSelector:@selector(zipArchiveDidUnzipFileAtIndex:totalFiles:archivePath:fileInfo:)]) {
|
if ([delegate respondsToSelector:@selector(zipArchiveDidUnzipFileAtIndex:totalFiles:archivePath:fileInfo:)]) {
|
||||||
[delegate zipArchiveDidUnzipFileAtIndex:currentFileNumber totalFiles:(NSInteger)globalInfo.number_entry
|
[delegate zipArchiveDidUnzipFileAtIndex:currentFileNumber totalFiles:(NSInteger)globalInfo.number_entry
|
||||||
archivePath:path fileInfo:fileInfo];
|
archivePath:path fileInfo:fileInfo];
|
||||||
|
} else if ([delegate respondsToSelector: @selector(zipArchiveDidUnzipFileAtIndex:totalFiles:archivePath:unzippedFilePath:)]) {
|
||||||
|
[delegate zipArchiveDidUnzipFileAtIndex: currentFileNumber totalFiles: (NSInteger)globalInfo.number_entry
|
||||||
|
archivePath:path unzippedFilePath: fullPath];
|
||||||
}
|
}
|
||||||
|
|
||||||
currentFileNumber++;
|
currentFileNumber++;
|
||||||
|
if (progressHandler)
|
||||||
|
{
|
||||||
|
progressHandler(strPath, fileInfo, currentFileNumber, globalInfo.number_entry);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} while(ret == UNZ_OK && ret != UNZ_END_OF_LIST_OF_FILE);
|
} while(ret == UNZ_OK && ret != UNZ_END_OF_LIST_OF_FILE);
|
||||||
|
|
||||||
@@ -273,8 +343,8 @@
|
|||||||
// set the modification date on all of the directories.
|
// set the modification date on all of the directories.
|
||||||
NSError * err = nil;
|
NSError * err = nil;
|
||||||
for (NSDictionary * d in directoriesModificationDates) {
|
for (NSDictionary * d in directoriesModificationDates) {
|
||||||
if (![[NSFileManager defaultManager] setAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[d objectForKey:@"modDate"], NSFileModificationDate, nil] ofItemAtPath:[d objectForKey:@"path"] error:&err]) {
|
if (![[NSFileManager defaultManager] setAttributes:@{NSFileModificationDate: d[@"modDate"]} ofItemAtPath:d[@"path"] error:&err]) {
|
||||||
NSLog(@"[SSZipArchive] Set attributes failed for directory: %@.", [d objectForKey:@"path"]);
|
NSLog(@"[SSZipArchive] Set attributes failed for directory: %@.", d[@"path"]);
|
||||||
}
|
}
|
||||||
if (err) {
|
if (err) {
|
||||||
NSLog(@"[SSZipArchive] Error setting directory file modification date attribute: %@",err.localizedDescription);
|
NSLog(@"[SSZipArchive] Error setting directory file modification date attribute: %@",err.localizedDescription);
|
||||||
@@ -289,19 +359,27 @@
|
|||||||
if (success && [delegate respondsToSelector:@selector(zipArchiveDidUnzipArchiveAtPath:zipInfo:unzippedPath:)]) {
|
if (success && [delegate respondsToSelector:@selector(zipArchiveDidUnzipArchiveAtPath:zipInfo:unzippedPath:)]) {
|
||||||
[delegate zipArchiveDidUnzipArchiveAtPath:path zipInfo:globalInfo unzippedPath:destination];
|
[delegate zipArchiveDidUnzipArchiveAtPath:path zipInfo:globalInfo unzippedPath:destination];
|
||||||
}
|
}
|
||||||
|
// final progress event = 100%
|
||||||
|
if (!canceled && [delegate respondsToSelector:@selector(zipArchiveProgressEvent:total:)]) {
|
||||||
|
[delegate zipArchiveProgressEvent:fileSize total:fileSize];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (completionHandler)
|
||||||
|
{
|
||||||
|
completionHandler(path, YES, nil);
|
||||||
|
}
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#pragma mark - Zipping
|
#pragma mark - Zipping
|
||||||
|
|
||||||
+ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths {
|
+ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths
|
||||||
|
{
|
||||||
BOOL success = NO;
|
BOOL success = NO;
|
||||||
SSZipArchive *zipArchive = [[SSZipArchive alloc] initWithPath:path];
|
SSZipArchive *zipArchive = [[SSZipArchive alloc] initWithPath:path];
|
||||||
if ([zipArchive open]) {
|
if ([zipArchive open]) {
|
||||||
for (NSString *path in paths) {
|
for (NSString *filePath in paths) {
|
||||||
[zipArchive writeFile:path];
|
[zipArchive writeFile:filePath];
|
||||||
}
|
}
|
||||||
success = [zipArchive close];
|
success = [zipArchive close];
|
||||||
}
|
}
|
||||||
@@ -313,40 +391,58 @@
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath {
|
+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath {
|
||||||
|
return [self createZipFileAtPath:path withContentsOfDirectory:directoryPath keepParentDirectory:NO];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirectory {
|
||||||
BOOL success = NO;
|
BOOL success = NO;
|
||||||
|
|
||||||
NSFileManager *fileManager = nil;
|
NSFileManager *fileManager = nil;
|
||||||
SSZipArchive *zipArchive = [[SSZipArchive alloc] initWithPath:path];
|
SSZipArchive *zipArchive = [[SSZipArchive alloc] initWithPath:path];
|
||||||
|
|
||||||
if ([zipArchive open]) {
|
if ([zipArchive open]) {
|
||||||
// use a local filemanager (queue/thread compatibility)
|
// use a local filemanager (queue/thread compatibility)
|
||||||
fileManager = [[NSFileManager alloc] init];
|
fileManager = [[NSFileManager alloc] init];
|
||||||
NSDirectoryEnumerator *dirEnumerator = [fileManager enumeratorAtPath:directoryPath];
|
NSDirectoryEnumerator *dirEnumerator = [fileManager enumeratorAtPath:directoryPath];
|
||||||
|
NSString *fileName;
|
||||||
NSString *fileName;
|
|
||||||
while ((fileName = [dirEnumerator nextObject])) {
|
while ((fileName = [dirEnumerator nextObject])) {
|
||||||
BOOL isDir;
|
BOOL isDir;
|
||||||
NSString *fullFilePath = [directoryPath stringByAppendingPathComponent:fileName];
|
NSString *fullFilePath = [directoryPath stringByAppendingPathComponent:fileName];
|
||||||
[fileManager fileExistsAtPath:fullFilePath isDirectory:&isDir];
|
[fileManager fileExistsAtPath:fullFilePath isDirectory:&isDir];
|
||||||
if (!isDir) {
|
if (!isDir) {
|
||||||
|
if (keepParentDirectory)
|
||||||
|
{
|
||||||
|
fileName = [[directoryPath lastPathComponent] stringByAppendingPathComponent:fileName];
|
||||||
|
}
|
||||||
[zipArchive writeFileAtPath:fullFilePath withFileName:fileName];
|
[zipArchive writeFileAtPath:fullFilePath withFileName:fileName];
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if([[NSFileManager defaultManager] subpathsOfDirectoryAtPath:fullFilePath error:nil].count == 0)
|
||||||
|
{
|
||||||
|
NSString *tempName = [fullFilePath stringByAppendingPathComponent:@".DS_Store"];
|
||||||
|
[@"" writeToFile:tempName atomically:YES encoding:NSUTF8StringEncoding error:nil];
|
||||||
|
[zipArchive writeFileAtPath:tempName withFileName:[fileName stringByAppendingPathComponent:@".DS_Store"]];
|
||||||
|
[[NSFileManager defaultManager] removeItemAtPath:tempName error:nil];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
success = [zipArchive close];
|
success = [zipArchive close];
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !__has_feature(objc_arc)
|
#if !__has_feature(objc_arc)
|
||||||
[fileManager release];
|
[fileManager release];
|
||||||
[zipArchive release];
|
[zipArchive release];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (id)initWithPath:(NSString *)path {
|
- (instancetype)initWithPath:(NSString *)path
|
||||||
|
{
|
||||||
if ((self = [super init])) {
|
if ((self = [super init])) {
|
||||||
_path = [path copy];
|
_path = [path copy];
|
||||||
}
|
}
|
||||||
@@ -355,23 +451,30 @@
|
|||||||
|
|
||||||
|
|
||||||
#if !__has_feature(objc_arc)
|
#if !__has_feature(objc_arc)
|
||||||
- (void)dealloc {
|
- (void)dealloc
|
||||||
|
{
|
||||||
[_path release];
|
[_path release];
|
||||||
[super dealloc];
|
[super dealloc];
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
- (BOOL)open {
|
- (BOOL)open
|
||||||
|
{
|
||||||
NSAssert((_zip == NULL), @"Attempting open an archive which is already open");
|
NSAssert((_zip == NULL), @"Attempting open an archive which is already open");
|
||||||
_zip = zipOpen([_path UTF8String], APPEND_STATUS_CREATE);
|
_zip = zipOpen([_path UTF8String], APPEND_STATUS_CREATE);
|
||||||
return (NULL != _zip);
|
return (NULL != _zip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (void)zipInfo:(zip_fileinfo*)zipInfo setDate:(NSDate*)date {
|
- (void)zipInfo:(zip_fileinfo*)zipInfo setDate:(NSDate*)date
|
||||||
|
{
|
||||||
NSCalendar *currentCalendar = [NSCalendar currentCalendar];
|
NSCalendar *currentCalendar = [NSCalendar currentCalendar];
|
||||||
|
#if defined(__IPHONE_8_0) || defined(__MAC_10_10)
|
||||||
|
uint flags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
|
||||||
|
#else
|
||||||
uint flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
|
uint flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
|
||||||
|
#endif
|
||||||
NSDateComponents *components = [currentCalendar components:flags fromDate:date];
|
NSDateComponents *components = [currentCalendar components:flags fromDate:date];
|
||||||
zipInfo->tmz_date.tm_sec = (unsigned int)components.second;
|
zipInfo->tmz_date.tm_sec = (unsigned int)components.second;
|
||||||
zipInfo->tmz_date.tm_min = (unsigned int)components.minute;
|
zipInfo->tmz_date.tm_min = (unsigned int)components.minute;
|
||||||
@@ -381,6 +484,45 @@
|
|||||||
zipInfo->tmz_date.tm_year = (unsigned int)components.year;
|
zipInfo->tmz_date.tm_year = (unsigned int)components.year;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (BOOL)writeFolderAtPath:(NSString *)path withFolderName:(NSString *)folderName
|
||||||
|
{
|
||||||
|
NSAssert((_zip != NULL), @"Attempting to write to an archive which was never opened");
|
||||||
|
|
||||||
|
zip_fileinfo zipInfo = {{0}};
|
||||||
|
|
||||||
|
NSDictionary *attr = [[NSFileManager defaultManager] attributesOfItemAtPath:path error: nil];
|
||||||
|
if( attr )
|
||||||
|
{
|
||||||
|
NSDate *fileDate = (NSDate *)attr[NSFileModificationDate];
|
||||||
|
if( fileDate )
|
||||||
|
{
|
||||||
|
[self zipInfo:&zipInfo setDate: fileDate ];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write permissions into the external attributes, for details on this see here: http://unix.stackexchange.com/a/14727
|
||||||
|
// Get the permissions value from the files attributes
|
||||||
|
NSNumber *permissionsValue = (NSNumber *)attr[NSFilePosixPermissions];
|
||||||
|
if (permissionsValue) {
|
||||||
|
// Get the short value for the permissions
|
||||||
|
short permissionsShort = permissionsValue.shortValue;
|
||||||
|
|
||||||
|
// Convert this into an octal by adding 010000, 010000 being the flag for a regular file
|
||||||
|
NSInteger permissionsOctal = 0100000 + permissionsShort;
|
||||||
|
|
||||||
|
// Convert this into a long value
|
||||||
|
uLong permissionsLong = @(permissionsOctal).unsignedLongValue;
|
||||||
|
|
||||||
|
// Store this into the external file attributes once it has been shifted 16 places left to form part of the second from last byte
|
||||||
|
zipInfo.external_fa = permissionsLong << 16L;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int len = 0;
|
||||||
|
zipOpenNewFileInZip(_zip, [[folderName stringByAppendingString:@"/"] UTF8String], &zipInfo, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_NO_COMPRESSION);
|
||||||
|
zipWriteInFileInZip(_zip, &len, 0);
|
||||||
|
zipCloseFileInZip(_zip);
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
- (BOOL)writeFile:(NSString *)path
|
- (BOOL)writeFile:(NSString *)path
|
||||||
{
|
{
|
||||||
@@ -390,7 +532,8 @@
|
|||||||
// supports writing files with logical folder/directory structure
|
// supports writing files with logical folder/directory structure
|
||||||
// *path* is the absolute path of the file that will be compressed
|
// *path* is the absolute path of the file that will be compressed
|
||||||
// *fileName* is the relative name of the file how it is stored within the zip e.g. /folder/subfolder/text1.txt
|
// *fileName* is the relative name of the file how it is stored within the zip e.g. /folder/subfolder/text1.txt
|
||||||
- (BOOL)writeFileAtPath:(NSString *)path withFileName:(NSString *)fileName {
|
- (BOOL)writeFileAtPath:(NSString *)path withFileName:(NSString *)fileName
|
||||||
|
{
|
||||||
NSAssert((_zip != NULL), @"Attempting to write to an archive which was never opened");
|
NSAssert((_zip != NULL), @"Attempting to write to an archive which was never opened");
|
||||||
|
|
||||||
FILE *input = fopen([path UTF8String], "r");
|
FILE *input = fopen([path UTF8String], "r");
|
||||||
@@ -411,7 +554,7 @@
|
|||||||
NSDictionary *attr = [[NSFileManager defaultManager] attributesOfItemAtPath:path error: nil];
|
NSDictionary *attr = [[NSFileManager defaultManager] attributesOfItemAtPath:path error: nil];
|
||||||
if( attr )
|
if( attr )
|
||||||
{
|
{
|
||||||
NSDate *fileDate = (NSDate *)[attr objectForKey:NSFileModificationDate];
|
NSDate *fileDate = (NSDate *)attr[NSFileModificationDate];
|
||||||
if( fileDate )
|
if( fileDate )
|
||||||
{
|
{
|
||||||
[self zipInfo:&zipInfo setDate: fileDate ];
|
[self zipInfo:&zipInfo setDate: fileDate ];
|
||||||
@@ -419,7 +562,7 @@
|
|||||||
|
|
||||||
// Write permissions into the external attributes, for details on this see here: http://unix.stackexchange.com/a/14727
|
// Write permissions into the external attributes, for details on this see here: http://unix.stackexchange.com/a/14727
|
||||||
// Get the permissions value from the files attributes
|
// Get the permissions value from the files attributes
|
||||||
NSNumber *permissionsValue = (NSNumber *)[attr objectForKey:NSFilePosixPermissions];
|
NSNumber *permissionsValue = (NSNumber *)attr[NSFilePosixPermissions];
|
||||||
if (permissionsValue) {
|
if (permissionsValue) {
|
||||||
// Get the short value for the permissions
|
// Get the short value for the permissions
|
||||||
short permissionsShort = permissionsValue.shortValue;
|
short permissionsShort = permissionsValue.shortValue;
|
||||||
@@ -448,12 +591,11 @@
|
|||||||
|
|
||||||
zipCloseFileInZip(_zip);
|
zipCloseFileInZip(_zip);
|
||||||
free(buffer);
|
free(buffer);
|
||||||
fclose(input);
|
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (BOOL)writeData:(NSData *)data filename:(NSString *)filename
|
||||||
- (BOOL)writeData:(NSData *)data filename:(NSString *)filename {
|
{
|
||||||
if (!_zip) {
|
if (!_zip) {
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
@@ -472,13 +614,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (BOOL)close {
|
- (BOOL)close
|
||||||
|
{
|
||||||
NSAssert((_zip != NULL), @"[SSZipArchive] Attempting to close an archive which was never opened");
|
NSAssert((_zip != NULL), @"[SSZipArchive] Attempting to close an archive which was never opened");
|
||||||
zipClose(_zip, NULL);
|
zipClose(_zip, NULL);
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#pragma mark - Private
|
#pragma mark - Private
|
||||||
|
|
||||||
// Format from http://newsgroups.derkeiler.com/Archive/Comp/comp.os.msdos.programmer/2009-04/msg00060.html
|
// Format from http://newsgroups.derkeiler.com/Archive/Comp/comp.os.msdos.programmer/2009-04/msg00060.html
|
||||||
@@ -488,7 +630,8 @@
|
|||||||
//
|
//
|
||||||
// 3658 = 0011 0110 0101 1000 = 0011011 0010 11000 = 27 2 24 = 2007-02-24
|
// 3658 = 0011 0110 0101 1000 = 0011011 0010 11000 = 27 2 24 = 2007-02-24
|
||||||
// 7423 = 0111 0100 0010 0011 - 01110 100001 00011 = 14 33 2 = 14:33:06
|
// 7423 = 0111 0100 0010 0011 - 01110 100001 00011 = 14 33 2 = 14:33:06
|
||||||
+ (NSDate *)_dateWithMSDOSFormat:(UInt32)msdosDateTime {
|
+ (NSDate *)_dateWithMSDOSFormat:(UInt32)msdosDateTime
|
||||||
|
{
|
||||||
static const UInt32 kYearMask = 0xFE000000;
|
static const UInt32 kYearMask = 0xFE000000;
|
||||||
static const UInt32 kMonthMask = 0x1E00000;
|
static const UInt32 kMonthMask = 0x1E00000;
|
||||||
static const UInt32 kDayMask = 0x1F0000;
|
static const UInt32 kDayMask = 0x1F0000;
|
||||||
@@ -499,7 +642,11 @@
|
|||||||
static NSCalendar *gregorian;
|
static NSCalendar *gregorian;
|
||||||
static dispatch_once_t onceToken;
|
static dispatch_once_t onceToken;
|
||||||
dispatch_once(&onceToken, ^{
|
dispatch_once(&onceToken, ^{
|
||||||
gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
|
#if defined(__IPHONE_8_0) || defined(__MAC_10_10)
|
||||||
|
gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
|
||||||
|
#else
|
||||||
|
gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
|
||||||
|
#endif
|
||||||
});
|
});
|
||||||
|
|
||||||
NSDateComponents *components = [[NSDateComponents alloc] init];
|
NSDateComponents *components = [[NSDateComponents alloc] init];
|
||||||
|
|||||||
@@ -192,9 +192,8 @@ static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T
|
|||||||
}
|
}
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
if(fseeko64((FILE *)stream, offset, fseek_origin) != 0)
|
if(fseeko64((FILE *)stream, (long)offset, fseek_origin) != 0)
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1038,7 +1038,7 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file,
|
|||||||
/* ZIP64 extra fields */
|
/* ZIP64 extra fields */
|
||||||
if (headerId == 0x0001)
|
if (headerId == 0x0001)
|
||||||
{
|
{
|
||||||
uLong uL;
|
uLong uLZip64;
|
||||||
|
|
||||||
if(file_info.uncompressed_size == (ZPOS64_T)(unsigned long)-1)
|
if(file_info.uncompressed_size == (ZPOS64_T)(unsigned long)-1)
|
||||||
{
|
{
|
||||||
@@ -1062,7 +1062,7 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file,
|
|||||||
if(file_info.disk_num_start == (unsigned long)-1)
|
if(file_info.disk_num_start == (unsigned long)-1)
|
||||||
{
|
{
|
||||||
/* Disk Start Number */
|
/* Disk Start Number */
|
||||||
if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
|
if (unz64local_getLong(&s->z_filefunc, s->filestream,&uLZip64) != UNZ_OK)
|
||||||
err=UNZ_ERRNO;
|
err=UNZ_ERRNO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1514,6 +1514,7 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method,
|
|||||||
pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
|
pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
|
||||||
pfile_in_zip_read_info->pos_local_extrafield=0;
|
pfile_in_zip_read_info->pos_local_extrafield=0;
|
||||||
pfile_in_zip_read_info->raw=raw;
|
pfile_in_zip_read_info->raw=raw;
|
||||||
|
pfile_in_zip_read_info->byte_before_the_zipfile = 0;
|
||||||
|
|
||||||
if (pfile_in_zip_read_info->read_buffer==NULL)
|
if (pfile_in_zip_read_info->read_buffer==NULL)
|
||||||
{
|
{
|
||||||
@@ -1554,9 +1555,7 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method,
|
|||||||
pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method;
|
pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method;
|
||||||
pfile_in_zip_read_info->filestream=s->filestream;
|
pfile_in_zip_read_info->filestream=s->filestream;
|
||||||
pfile_in_zip_read_info->z_filefunc=s->z_filefunc;
|
pfile_in_zip_read_info->z_filefunc=s->z_filefunc;
|
||||||
#ifndef __clang_analyzer__
|
|
||||||
pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
|
pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
|
||||||
#endif
|
|
||||||
|
|
||||||
pfile_in_zip_read_info->stream.total_out = 0;
|
pfile_in_zip_read_info->stream.total_out = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -3,11 +3,9 @@
|
|||||||
// SSZipArchive
|
// SSZipArchive
|
||||||
//
|
//
|
||||||
// Created by Sam Soffes on 9/7/13.
|
// Created by Sam Soffes on 9/7/13.
|
||||||
// Copyright (c) 2013 Sam Soffes. All rights reserved.
|
// Copyright (c) 2013-2014 Sam Soffes. All rights reserved.
|
||||||
//
|
//
|
||||||
|
|
||||||
@interface SSAppDelegate : UIResponder <UIApplicationDelegate>
|
@interface SSAppDelegate : UIResponder <UIApplicationDelegate>
|
||||||
|
|
||||||
@property (strong, nonatomic) UIWindow *window;
|
@property (strong, nonatomic) UIWindow *window;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
// SSZipArchive
|
// SSZipArchive
|
||||||
//
|
//
|
||||||
// Created by Sam Soffes on 9/7/13.
|
// Created by Sam Soffes on 9/7/13.
|
||||||
// Copyright (c) 2013 Sam Soffes. All rights reserved.
|
// Copyright (c) 2013-2014 Sam Soffes. All rights reserved.
|
||||||
//
|
//
|
||||||
|
|
||||||
#import "SSAppDelegate.h"
|
#import "SSAppDelegate.h"
|
||||||
@@ -12,9 +12,6 @@
|
|||||||
|
|
||||||
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
|
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
|
||||||
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
|
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
|
||||||
|
|
||||||
// Nothing to see here yet.
|
|
||||||
|
|
||||||
[self.window makeKeyAndVisible];
|
[self.window makeKeyAndVisible];
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
+2
-2
@@ -17,11 +17,11 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>1.0</string>
|
<string>0.3.3</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>1.0</string>
|
<string>0.3.3</string>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>UIRequiredDeviceCapabilities</key>
|
<key>UIRequiredDeviceCapabilities</key>
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
// SSZipArchive
|
// SSZipArchive
|
||||||
//
|
//
|
||||||
// Created by Sam Soffes on 9/7/13.
|
// Created by Sam Soffes on 9/7/13.
|
||||||
// Copyright (c) 2013 Sam Soffes. All rights reserved.
|
// Copyright (c) 2013-2014 Sam Soffes. All rights reserved.
|
||||||
//
|
//
|
||||||
|
|
||||||
#import "SSAppDelegate.h"
|
#import "SSAppDelegate.h"
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test delegate by collecting its calls
|
||||||
|
*/
|
||||||
|
@interface CollectingDelegate : NSObject <SSZipArchiveDelegate>
|
||||||
|
@property(nonatomic, retain) NSMutableArray *files;
|
||||||
|
@end
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
//
|
||||||
|
// Created by chris on 8/1/12.
|
||||||
|
//
|
||||||
|
// To change the template use AppCode | Preferences | File Templates.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#import "SSZipArchive.h"
|
||||||
|
#import "CollectingDelegate.h"
|
||||||
|
|
||||||
|
@implementation CollectingDelegate {
|
||||||
|
|
||||||
|
}
|
||||||
|
@synthesize files = _files;
|
||||||
|
|
||||||
|
|
||||||
|
- (instancetype)init {
|
||||||
|
self = [super init];
|
||||||
|
if (self) {
|
||||||
|
self.files = [NSMutableArray array];
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)zipArchiveDidUnzipArchiveFile:(NSString *)zipFile entryPath:(NSString *)entryPath destPath:(NSString *)destPath {
|
||||||
|
[self.files addObject:entryPath];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@end
|
||||||
Binary file not shown.
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
@@ -0,0 +1,366 @@
|
|||||||
|
// !$*UTF8*$!
|
||||||
|
{
|
||||||
|
archiveVersion = 1;
|
||||||
|
classes = {
|
||||||
|
};
|
||||||
|
objectVersion = 46;
|
||||||
|
objects = {
|
||||||
|
|
||||||
|
/* Begin PBXBuildFile section */
|
||||||
|
0472DDA417AF617E007BDB8D /* 0.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 0472DD9C17AF617E007BDB8D /* 0.m4a */; };
|
||||||
|
0472DDA517AF617E007BDB8D /* 1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 0472DD9D17AF617E007BDB8D /* 1.m4a */; };
|
||||||
|
0472DDA617AF617E007BDB8D /* 2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 0472DD9E17AF617E007BDB8D /* 2.m4a */; };
|
||||||
|
0472DDA717AF617E007BDB8D /* 3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 0472DD9F17AF617E007BDB8D /* 3.m4a */; };
|
||||||
|
0472DDA817AF617E007BDB8D /* 4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 0472DDA017AF617E007BDB8D /* 4.m4a */; };
|
||||||
|
0472DDA917AF617E007BDB8D /* 5.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 0472DDA117AF617E007BDB8D /* 5.m4a */; };
|
||||||
|
0472DDAA17AF617E007BDB8D /* 6.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 0472DDA217AF617E007BDB8D /* 6.m4a */; };
|
||||||
|
0472DDAB17AF617E007BDB8D /* 7.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 0472DDA317AF617E007BDB8D /* 7.m4a */; };
|
||||||
|
AF313D09177B02A700478143 /* PermissionsTestApp.app in Resources */ = {isa = PBXBuildFile; fileRef = AF313D08177B02A700478143 /* PermissionsTestApp.app */; };
|
||||||
|
B215FB32143AD3C7003AC546 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B215FB31143AD3C7003AC546 /* SenTestingKit.framework */; };
|
||||||
|
B215FB63143AD514003AC546 /* SSZipArchiveTests.m in Sources */ = {isa = PBXBuildFile; fileRef = B215FB61143AD514003AC546 /* SSZipArchiveTests.m */; };
|
||||||
|
B215FB65143AD527003AC546 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = B215FB64143AD527003AC546 /* libz.dylib */; };
|
||||||
|
B215FB66143AD52D003AC546 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B215FB18143AD3C7003AC546 /* Foundation.framework */; };
|
||||||
|
B215FB67143AD56D003AC546 /* SSZipArchive.m in Sources */ = {isa = PBXBuildFile; fileRef = B215FB58143AD460003AC546 /* SSZipArchive.m */; };
|
||||||
|
B215FB68143AD576003AC546 /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = B215FB4F143AD460003AC546 /* ioapi.c */; };
|
||||||
|
B215FB69143AD576003AC546 /* mztools.c in Sources */ = {isa = PBXBuildFile; fileRef = B215FB51143AD460003AC546 /* mztools.c */; };
|
||||||
|
B215FB6A143AD576003AC546 /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = B215FB53143AD460003AC546 /* unzip.c */; };
|
||||||
|
B215FB6B143AD576003AC546 /* zip.c in Sources */ = {isa = PBXBuildFile; fileRef = B215FB55143AD460003AC546 /* zip.c */; };
|
||||||
|
B215FB6D143AD6FF003AC546 /* TestArchive.zip in Resources */ = {isa = PBXBuildFile; fileRef = B215FB6C143AD6FF003AC546 /* TestArchive.zip */; };
|
||||||
|
B2283D5D155AD80F00F9395A /* Unicode.zip in Resources */ = {isa = PBXBuildFile; fileRef = B2283D5C155AD80F00F9395A /* Unicode.zip */; };
|
||||||
|
B23FCC7F1558F1B70026375C /* TestPasswordArchive.zip in Resources */ = {isa = PBXBuildFile; fileRef = B23FCC7E1558F1B70026375C /* TestPasswordArchive.zip */; };
|
||||||
|
C5AE4E64155A12760045F3ED /* IncorrectHeaders.zip in Resources */ = {isa = PBXBuildFile; fileRef = C5AE4E63155A12760045F3ED /* IncorrectHeaders.zip */; };
|
||||||
|
C5AE4E6D155A8B010045F3ED /* SymbolicLink.zip in Resources */ = {isa = PBXBuildFile; fileRef = C5AE4E6C155A8B010045F3ED /* SymbolicLink.zip */; };
|
||||||
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
|
/* Begin PBXFileReference section */
|
||||||
|
0472DD9C17AF617E007BDB8D /* 0.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = 0.m4a; sourceTree = "<group>"; };
|
||||||
|
0472DD9D17AF617E007BDB8D /* 1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = 1.m4a; sourceTree = "<group>"; };
|
||||||
|
0472DD9E17AF617E007BDB8D /* 2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = 2.m4a; sourceTree = "<group>"; };
|
||||||
|
0472DD9F17AF617E007BDB8D /* 3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = 3.m4a; sourceTree = "<group>"; };
|
||||||
|
0472DDA017AF617E007BDB8D /* 4.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = 4.m4a; sourceTree = "<group>"; };
|
||||||
|
0472DDA117AF617E007BDB8D /* 5.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = 5.m4a; sourceTree = "<group>"; };
|
||||||
|
0472DDA217AF617E007BDB8D /* 6.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = 6.m4a; sourceTree = "<group>"; };
|
||||||
|
0472DDA317AF617E007BDB8D /* 7.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = 7.m4a; sourceTree = "<group>"; };
|
||||||
|
AF313D08177B02A700478143 /* PermissionsTestApp.app */ = {isa = PBXFileReference; lastKnownFileType = wrapper.application; path = PermissionsTestApp.app; sourceTree = "<group>"; };
|
||||||
|
B215FB18143AD3C7003AC546 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
||||||
|
B215FB30143AD3C7003AC546 /* SSZipArchiveTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SSZipArchiveTests.octest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
B215FB31143AD3C7003AC546 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; };
|
||||||
|
B215FB4E143AD460003AC546 /* crypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crypt.h; sourceTree = "<group>"; };
|
||||||
|
B215FB4F143AD460003AC546 /* ioapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ioapi.c; sourceTree = "<group>"; };
|
||||||
|
B215FB50143AD460003AC546 /* ioapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ioapi.h; sourceTree = "<group>"; };
|
||||||
|
B215FB51143AD460003AC546 /* mztools.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mztools.c; sourceTree = "<group>"; };
|
||||||
|
B215FB52143AD460003AC546 /* mztools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mztools.h; sourceTree = "<group>"; };
|
||||||
|
B215FB53143AD460003AC546 /* unzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = unzip.c; sourceTree = "<group>"; };
|
||||||
|
B215FB54143AD460003AC546 /* unzip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unzip.h; sourceTree = "<group>"; };
|
||||||
|
B215FB55143AD460003AC546 /* zip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip.c; sourceTree = "<group>"; };
|
||||||
|
B215FB56143AD460003AC546 /* zip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zip.h; sourceTree = "<group>"; };
|
||||||
|
B215FB57143AD460003AC546 /* SSZipArchive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SSZipArchive.h; path = ../SSZipArchive.h; sourceTree = "<group>"; };
|
||||||
|
B215FB58143AD460003AC546 /* SSZipArchive.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SSZipArchive.m; path = ../SSZipArchive.m; sourceTree = "<group>"; };
|
||||||
|
B215FB5F143AD514003AC546 /* SSZipArchiveTests-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "SSZipArchiveTests-Info.plist"; sourceTree = "<group>"; };
|
||||||
|
B215FB61143AD514003AC546 /* SSZipArchiveTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SSZipArchiveTests.m; sourceTree = "<group>"; };
|
||||||
|
B215FB64143AD527003AC546 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
|
||||||
|
B215FB6C143AD6FF003AC546 /* TestArchive.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = TestArchive.zip; sourceTree = "<group>"; };
|
||||||
|
B2283D5C155AD80F00F9395A /* Unicode.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = Unicode.zip; sourceTree = "<group>"; };
|
||||||
|
B23FCC7E1558F1B70026375C /* TestPasswordArchive.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = TestPasswordArchive.zip; sourceTree = "<group>"; };
|
||||||
|
C5AE4E63155A12760045F3ED /* IncorrectHeaders.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = IncorrectHeaders.zip; sourceTree = "<group>"; };
|
||||||
|
C5AE4E6C155A8B010045F3ED /* SymbolicLink.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = SymbolicLink.zip; sourceTree = "<group>"; };
|
||||||
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
B215FB2C143AD3C7003AC546 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
B215FB65143AD527003AC546 /* libz.dylib in Frameworks */,
|
||||||
|
B215FB66143AD52D003AC546 /* Foundation.framework in Frameworks */,
|
||||||
|
B215FB32143AD3C7003AC546 /* SenTestingKit.framework in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXGroup section */
|
||||||
|
0472DD9B17AF617E007BDB8D /* multi_zip_test */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
0472DD9C17AF617E007BDB8D /* 0.m4a */,
|
||||||
|
0472DD9D17AF617E007BDB8D /* 1.m4a */,
|
||||||
|
0472DD9E17AF617E007BDB8D /* 2.m4a */,
|
||||||
|
0472DD9F17AF617E007BDB8D /* 3.m4a */,
|
||||||
|
0472DDA017AF617E007BDB8D /* 4.m4a */,
|
||||||
|
0472DDA117AF617E007BDB8D /* 5.m4a */,
|
||||||
|
0472DDA217AF617E007BDB8D /* 6.m4a */,
|
||||||
|
0472DDA317AF617E007BDB8D /* 7.m4a */,
|
||||||
|
);
|
||||||
|
path = multi_zip_test;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
B215FB04143AD3C7003AC546 = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
B215FB4B143AD449003AC546 /* SSZipArchive */,
|
||||||
|
B215FB5E143AD505003AC546 /* SSZipArchiveTests */,
|
||||||
|
B215FB12143AD3C7003AC546 /* Frameworks */,
|
||||||
|
B215FB10143AD3C7003AC546 /* Products */,
|
||||||
|
);
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
B215FB10143AD3C7003AC546 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
B215FB30143AD3C7003AC546 /* SSZipArchiveTests.octest */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
B215FB12143AD3C7003AC546 /* Frameworks */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
B215FB64143AD527003AC546 /* libz.dylib */,
|
||||||
|
B215FB31143AD3C7003AC546 /* SenTestingKit.framework */,
|
||||||
|
B215FB18143AD3C7003AC546 /* Foundation.framework */,
|
||||||
|
);
|
||||||
|
name = Frameworks;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
B215FB4B143AD449003AC546 /* SSZipArchive */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
B215FB57143AD460003AC546 /* SSZipArchive.h */,
|
||||||
|
B215FB58143AD460003AC546 /* SSZipArchive.m */,
|
||||||
|
B215FB4D143AD460003AC546 /* minizip */,
|
||||||
|
);
|
||||||
|
name = SSZipArchive;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
B215FB4D143AD460003AC546 /* minizip */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
B215FB4E143AD460003AC546 /* crypt.h */,
|
||||||
|
B215FB4F143AD460003AC546 /* ioapi.c */,
|
||||||
|
B215FB50143AD460003AC546 /* ioapi.h */,
|
||||||
|
B215FB51143AD460003AC546 /* mztools.c */,
|
||||||
|
B215FB52143AD460003AC546 /* mztools.h */,
|
||||||
|
B215FB53143AD460003AC546 /* unzip.c */,
|
||||||
|
B215FB54143AD460003AC546 /* unzip.h */,
|
||||||
|
B215FB55143AD460003AC546 /* zip.c */,
|
||||||
|
B215FB56143AD460003AC546 /* zip.h */,
|
||||||
|
);
|
||||||
|
name = minizip;
|
||||||
|
path = ../minizip;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
B215FB5E143AD505003AC546 /* SSZipArchiveTests */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
0472DD9B17AF617E007BDB8D /* multi_zip_test */,
|
||||||
|
AF313D08177B02A700478143 /* PermissionsTestApp.app */,
|
||||||
|
B2283D5C155AD80F00F9395A /* Unicode.zip */,
|
||||||
|
B215FB61143AD514003AC546 /* SSZipArchiveTests.m */,
|
||||||
|
B215FB5F143AD514003AC546 /* SSZipArchiveTests-Info.plist */,
|
||||||
|
C5AE4E63155A12760045F3ED /* IncorrectHeaders.zip */,
|
||||||
|
B215FB6C143AD6FF003AC546 /* TestArchive.zip */,
|
||||||
|
B23FCC7E1558F1B70026375C /* TestPasswordArchive.zip */,
|
||||||
|
C5AE4E6C155A8B010045F3ED /* SymbolicLink.zip */,
|
||||||
|
);
|
||||||
|
name = SSZipArchiveTests;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
/* End PBXGroup section */
|
||||||
|
|
||||||
|
/* Begin PBXNativeTarget section */
|
||||||
|
B215FB2F143AD3C7003AC546 /* SSZipArchiveTests */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = B215FB44143AD3C7003AC546 /* Build configuration list for PBXNativeTarget "SSZipArchiveTests" */;
|
||||||
|
buildPhases = (
|
||||||
|
B215FB2B143AD3C7003AC546 /* Sources */,
|
||||||
|
B215FB2C143AD3C7003AC546 /* Frameworks */,
|
||||||
|
B215FB2D143AD3C7003AC546 /* Resources */,
|
||||||
|
B215FB2E143AD3C7003AC546 /* ShellScript */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = SSZipArchiveTests;
|
||||||
|
productName = SSZipArchiveTests;
|
||||||
|
productReference = B215FB30143AD3C7003AC546 /* SSZipArchiveTests.octest */;
|
||||||
|
productType = "com.apple.product-type.bundle";
|
||||||
|
};
|
||||||
|
/* End PBXNativeTarget section */
|
||||||
|
|
||||||
|
/* Begin PBXProject section */
|
||||||
|
B215FB06143AD3C7003AC546 /* Project object */ = {
|
||||||
|
isa = PBXProject;
|
||||||
|
attributes = {
|
||||||
|
LastUpgradeCheck = 0440;
|
||||||
|
ORGANIZATIONNAME = "Sam Soffes";
|
||||||
|
};
|
||||||
|
buildConfigurationList = B215FB09143AD3C7003AC546 /* Build configuration list for PBXProject "SSZipArchive" */;
|
||||||
|
compatibilityVersion = "Xcode 3.2";
|
||||||
|
developmentRegion = English;
|
||||||
|
hasScannedForEncodings = 0;
|
||||||
|
knownRegions = (
|
||||||
|
en,
|
||||||
|
);
|
||||||
|
mainGroup = B215FB04143AD3C7003AC546;
|
||||||
|
productRefGroup = B215FB10143AD3C7003AC546 /* Products */;
|
||||||
|
projectDirPath = "";
|
||||||
|
projectRoot = "";
|
||||||
|
targets = (
|
||||||
|
B215FB2F143AD3C7003AC546 /* SSZipArchiveTests */,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
/* End PBXProject section */
|
||||||
|
|
||||||
|
/* Begin PBXResourcesBuildPhase section */
|
||||||
|
B215FB2D143AD3C7003AC546 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
B215FB6D143AD6FF003AC546 /* TestArchive.zip in Resources */,
|
||||||
|
B23FCC7F1558F1B70026375C /* TestPasswordArchive.zip in Resources */,
|
||||||
|
AF313D09177B02A700478143 /* PermissionsTestApp.app in Resources */,
|
||||||
|
C5AE4E64155A12760045F3ED /* IncorrectHeaders.zip in Resources */,
|
||||||
|
C5AE4E6D155A8B010045F3ED /* SymbolicLink.zip in Resources */,
|
||||||
|
B2283D5D155AD80F00F9395A /* Unicode.zip in Resources */,
|
||||||
|
0472DDA417AF617E007BDB8D /* 0.m4a in Resources */,
|
||||||
|
0472DDA517AF617E007BDB8D /* 1.m4a in Resources */,
|
||||||
|
0472DDA617AF617E007BDB8D /* 2.m4a in Resources */,
|
||||||
|
0472DDA717AF617E007BDB8D /* 3.m4a in Resources */,
|
||||||
|
0472DDA817AF617E007BDB8D /* 4.m4a in Resources */,
|
||||||
|
0472DDA917AF617E007BDB8D /* 5.m4a in Resources */,
|
||||||
|
0472DDAA17AF617E007BDB8D /* 6.m4a in Resources */,
|
||||||
|
0472DDAB17AF617E007BDB8D /* 7.m4a in Resources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXShellScriptBuildPhase section */
|
||||||
|
B215FB2E143AD3C7003AC546 /* ShellScript */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n";
|
||||||
|
};
|
||||||
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
B215FB2B143AD3C7003AC546 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
B215FB63143AD514003AC546 /* SSZipArchiveTests.m in Sources */,
|
||||||
|
B215FB67143AD56D003AC546 /* SSZipArchive.m in Sources */,
|
||||||
|
B215FB68143AD576003AC546 /* ioapi.c in Sources */,
|
||||||
|
B215FB69143AD576003AC546 /* mztools.c in Sources */,
|
||||||
|
B215FB6A143AD576003AC546 /* unzip.c in Sources */,
|
||||||
|
B215FB6B143AD576003AC546 /* zip.c in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin XCBuildConfiguration section */
|
||||||
|
B215FB3F143AD3C7003AC546 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
|
||||||
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||||
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
|
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
||||||
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
|
"DEBUG=1",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
|
||||||
|
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||||
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
|
SDKROOT = macosx;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
B215FB40143AD3C7003AC546 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
|
||||||
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
|
COPY_PHASE_STRIP = YES;
|
||||||
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||||
|
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
||||||
|
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||||
|
SDKROOT = macosx;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
B215FB45143AD3C7003AC546 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
|
||||||
|
INFOPLIST_FILE = "SSZipArchiveTests-Info.plist";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
TEST_HOST = "$(BUNDLE_LOADER)";
|
||||||
|
WRAPPER_EXTENSION = octest;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
B215FB46143AD3C7003AC546 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
|
||||||
|
INFOPLIST_FILE = "SSZipArchiveTests-Info.plist";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
TEST_HOST = "$(BUNDLE_LOADER)";
|
||||||
|
WRAPPER_EXTENSION = octest;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
|
/* Begin XCConfigurationList section */
|
||||||
|
B215FB09143AD3C7003AC546 /* Build configuration list for PBXProject "SSZipArchive" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
B215FB3F143AD3C7003AC546 /* Debug */,
|
||||||
|
B215FB40143AD3C7003AC546 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
B215FB44143AD3C7003AC546 /* Build configuration list for PBXNativeTarget "SSZipArchiveTests" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
B215FB45143AD3C7003AC546 /* Debug */,
|
||||||
|
B215FB46143AD3C7003AC546 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
/* End XCConfigurationList section */
|
||||||
|
};
|
||||||
|
rootObject = B215FB06143AD3C7003AC546 /* Project object */;
|
||||||
|
}
|
||||||
+228
-61
@@ -3,39 +3,75 @@
|
|||||||
// SSZipArchiveTests
|
// SSZipArchiveTests
|
||||||
//
|
//
|
||||||
// Created by Sam Soffes on 10/3/11.
|
// Created by Sam Soffes on 10/3/11.
|
||||||
// Copyright (c) 2011 Sam Soffes. All rights reserved.
|
// Copyright (c) 2011-2014 Sam Soffes. All rights reserved.
|
||||||
//
|
//
|
||||||
|
|
||||||
#import "SSZipArchive.h"
|
#import "SSZipArchive.h"
|
||||||
#import <XCTest/XCTest.h>
|
#import <XCTest/XCTest.h>
|
||||||
|
#import "CollectingDelegate.h"
|
||||||
|
#import <XCTest/XCTest.h>
|
||||||
#import <CommonCrypto/CommonDigest.h>
|
#import <CommonCrypto/CommonDigest.h>
|
||||||
|
|
||||||
|
@interface CancelDelegate : NSObject <SSZipArchiveDelegate>
|
||||||
|
@property (nonatomic, assign) int numFilesUnzipped;
|
||||||
|
@property (nonatomic, assign) int numFilesToUnzip;
|
||||||
|
@property (nonatomic, assign) BOOL didUnzipArchive;
|
||||||
|
@property (nonatomic, assign) int loaded;
|
||||||
|
@property (nonatomic, assign) int total;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation CancelDelegate
|
||||||
|
- (void)zipArchiveDidUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo
|
||||||
|
{
|
||||||
|
_numFilesUnzipped = fileIndex + 1;
|
||||||
|
}
|
||||||
|
- (BOOL)zipArchiveShouldUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo
|
||||||
|
{
|
||||||
|
//return YES;
|
||||||
|
return _numFilesUnzipped < _numFilesToUnzip;
|
||||||
|
}
|
||||||
|
- (void)zipArchiveDidUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo unzippedPath:(NSString *)unzippedPath
|
||||||
|
{
|
||||||
|
_didUnzipArchive = YES;
|
||||||
|
}
|
||||||
|
- (void)zipArchiveProgressEvent:(NSInteger)loaded total:(NSInteger)total
|
||||||
|
{
|
||||||
|
_loaded = (int)loaded;
|
||||||
|
_total = (int)total;
|
||||||
|
}
|
||||||
|
@end
|
||||||
|
|
||||||
@interface SSZipArchiveTests : XCTestCase <SSZipArchiveDelegate>
|
@interface SSZipArchiveTests : XCTestCase <SSZipArchiveDelegate>
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation SSZipArchiveTests
|
@implementation SSZipArchiveTests {
|
||||||
|
NSMutableArray *progressEvents;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setUp {
|
||||||
|
[super setUp];
|
||||||
|
progressEvents = [NSMutableArray array];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)tearDown {
|
- (void)tearDown {
|
||||||
[super tearDown];
|
[super tearDown];
|
||||||
[[NSFileManager defaultManager] removeItemAtPath:[self _cachesPath:nil] error:nil];
|
[[NSFileManager defaultManager] removeItemAtPath:[self _cachesPath:nil] error:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (void)testZipping {
|
- (void)testZipping {
|
||||||
// use extracted files from [-testUnzipping]
|
// use extracted files from [-testUnzipping]
|
||||||
NSString *inputPath = [self _cachesPath:@"Regular"];
|
NSString *inputPath = [self _cachesPath:@"Regular"];
|
||||||
NSArray *inputPaths = [NSArray arrayWithObjects:
|
NSArray *inputPaths = @[[inputPath stringByAppendingPathComponent:@"Readme.markdown"],
|
||||||
[inputPath stringByAppendingPathComponent:@"Readme.markdown"],
|
[inputPath stringByAppendingPathComponent:@"LICENSE"]];
|
||||||
[inputPath stringByAppendingPathComponent:@"LICENSE"],
|
|
||||||
nil];
|
|
||||||
|
|
||||||
NSString *outputPath = [self _cachesPath:@"Zipped"];
|
NSString *outputPath = [self _cachesPath:@"Zipped"];
|
||||||
|
|
||||||
NSString *archivePath = [outputPath stringByAppendingPathComponent:@"CreatedArchive.zip"];
|
NSString *archivePath = [outputPath stringByAppendingPathComponent:@"CreatedArchive.zip"];
|
||||||
[SSZipArchive createZipFileAtPath:archivePath withFilesAtPaths:inputPaths];
|
[SSZipArchive createZipFileAtPath:archivePath withFilesAtPaths:inputPaths];
|
||||||
|
|
||||||
// TODO: Make sure the files are actually unzipped. They are, but the test should be better.
|
// TODO: Make sure the files are actually unzipped. They are, but the test should be better.
|
||||||
XCTAssertTrue([[NSFileManager defaultManager] fileExistsAtPath:archivePath], @"Archive created");
|
XCTAssertTrue([[NSFileManager defaultManager] fileExistsAtPath:archivePath], @"Archive created");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -50,35 +86,92 @@
|
|||||||
XCTAssertTrue([[NSFileManager defaultManager] fileExistsAtPath:archivePath], @"Folder Archive created");
|
XCTAssertTrue([[NSFileManager defaultManager] fileExistsAtPath:archivePath], @"Folder Archive created");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)testMultipleZippping{
|
||||||
|
|
||||||
|
NSArray *inputPaths = @[[[NSBundle mainBundle]pathForResource:@"0" ofType:@"m4a"],
|
||||||
|
|
||||||
|
[[NSBundle mainBundle]pathForResource:@"1" ofType:@"m4a"],
|
||||||
|
[[NSBundle mainBundle]pathForResource:@"2" ofType:@"m4a"],
|
||||||
|
[[NSBundle mainBundle]pathForResource:@"3" ofType:@"m4a"],
|
||||||
|
[[NSBundle mainBundle]pathForResource:@"4" ofType:@"m4a"],
|
||||||
|
[[NSBundle mainBundle]pathForResource:@"5" ofType:@"m4a"],
|
||||||
|
[[NSBundle mainBundle]pathForResource:@"6" ofType:@"m4a"],
|
||||||
|
[[NSBundle mainBundle]pathForResource:@"7" ofType:@"m4a"]
|
||||||
|
];
|
||||||
|
NSString *outputPath = [self _cachesPath:@"Zipped"];
|
||||||
|
|
||||||
|
// this is a monster
|
||||||
|
// if testing on iOS, within 30 loops it will fail; however, on OS X, it may take about 900 loops
|
||||||
|
for (int test = 0; test < 1000; test++)
|
||||||
|
{
|
||||||
|
// Zipping
|
||||||
|
NSString *archivePath = [outputPath stringByAppendingPathComponent:[NSString stringWithFormat:@"queue_test_%d.zip",test]];
|
||||||
|
|
||||||
|
[SSZipArchive createZipFileAtPath:archivePath withFilesAtPaths:inputPaths];
|
||||||
|
|
||||||
|
long long threshold = 510000; // 510kB:size slightly smaller than a successful zip, but much larger than a failed one
|
||||||
|
long long fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:archivePath error:nil][NSFileSize] longLongValue];
|
||||||
|
//STAssertTrue(fileSize > threshold, @"zipping failed at %@!",fileSize,archivePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
- (void)testUnzipping {
|
- (void)testUnzipping {
|
||||||
NSString *zipPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"TestArchive" ofType:@"zip"];
|
NSString *zipPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"TestArchive" ofType:@"zip"];
|
||||||
NSString *outputPath = [self _cachesPath:@"Regular"];
|
NSString *outputPath = [self _cachesPath:@"Regular"];
|
||||||
|
|
||||||
[SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath delegate:self];
|
[SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath delegate:self];
|
||||||
|
|
||||||
NSFileManager *fileManager = [NSFileManager defaultManager];
|
NSFileManager *fileManager = [NSFileManager defaultManager];
|
||||||
NSString *testPath = [outputPath stringByAppendingPathComponent:@"Readme.markdown"];
|
NSString *testPath = [outputPath stringByAppendingPathComponent:@"Readme.markdown"];
|
||||||
XCTAssertTrue([fileManager fileExistsAtPath:testPath], @"Readme unzipped");
|
XCTAssertTrue([fileManager fileExistsAtPath:testPath], @"Readme unzipped");
|
||||||
|
|
||||||
testPath = [outputPath stringByAppendingPathComponent:@"LICENSE"];
|
testPath = [outputPath stringByAppendingPathComponent:@"LICENSE"];
|
||||||
XCTAssertTrue([fileManager fileExistsAtPath:testPath], @"LICENSE unzipped");
|
XCTAssertTrue([fileManager fileExistsAtPath:testPath], @"LICENSE unzipped");
|
||||||
|
}
|
||||||
|
- (void)testSmallFileUnzipping {
|
||||||
|
NSString *zipPath = [[NSBundle mainBundle] pathForResource:@"hello" ofType:@"zip"];
|
||||||
|
NSString *outputPath = [self _cachesPath:@"Regular"];
|
||||||
|
|
||||||
|
[SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath delegate:self];
|
||||||
|
|
||||||
|
NSFileManager *fileManager = [NSFileManager defaultManager];
|
||||||
|
NSString *testPath = [outputPath stringByAppendingPathComponent:@"Readme.markdown"];
|
||||||
|
XCTAssertTrue([fileManager fileExistsAtPath:testPath], @"Readme unzipped");
|
||||||
|
|
||||||
|
testPath = [outputPath stringByAppendingPathComponent:@"LICENSE"];
|
||||||
|
XCTAssertTrue([fileManager fileExistsAtPath:testPath], @"LICENSE unzipped");
|
||||||
|
}
|
||||||
|
- (void)testUnzippingProgress {
|
||||||
|
NSString *zipPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"TestArchive" ofType:@"zip"];
|
||||||
|
NSString *outputPath = [self _cachesPath:@"Progress"];
|
||||||
|
|
||||||
|
[progressEvents removeAllObjects];
|
||||||
|
|
||||||
|
[SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath delegate:self];
|
||||||
|
|
||||||
|
// 4 events: the first, then for each of the two files one, then the final event
|
||||||
|
XCTAssertTrue(4 == [progressEvents count], @"Expected 4 progress events");
|
||||||
|
XCTAssertTrue(0 == [progressEvents[0] intValue]);
|
||||||
|
XCTAssertTrue(619 == [progressEvents[1] intValue]);
|
||||||
|
XCTAssertTrue(1114 == [progressEvents[2] intValue]);
|
||||||
|
XCTAssertTrue(1436 == [progressEvents[3] intValue]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (void)testUnzippingWithPassword {
|
- (void)testUnzippingWithPassword {
|
||||||
NSString *zipPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"TestPasswordArchive" ofType:@"zip"];
|
NSString *zipPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"TestPasswordArchive" ofType:@"zip"];
|
||||||
NSString *outputPath = [self _cachesPath:@"Password"];
|
NSString *outputPath = [self _cachesPath:@"Password"];
|
||||||
|
|
||||||
NSError *error = nil;
|
NSError *error = nil;
|
||||||
[SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath overwrite:YES password:@"passw0rd" error:&error delegate:self];
|
[SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath overwrite:YES password:@"passw0rd" error:&error delegate:self];
|
||||||
|
|
||||||
NSFileManager *fileManager = [NSFileManager defaultManager];
|
NSFileManager *fileManager = [NSFileManager defaultManager];
|
||||||
NSString *testPath = [outputPath stringByAppendingPathComponent:@"Readme.markdown"];
|
NSString *testPath = [outputPath stringByAppendingPathComponent:@"Readme.markdown"];
|
||||||
XCTAssertTrue([fileManager fileExistsAtPath:testPath], @"Readme unzipped");
|
XCTAssertTrue([fileManager fileExistsAtPath:testPath], @"Readme unzipped");
|
||||||
|
|
||||||
testPath = [outputPath stringByAppendingPathComponent:@"LICENSE"];
|
testPath = [outputPath stringByAppendingPathComponent:@"LICENSE"];
|
||||||
XCTAssertTrue([fileManager fileExistsAtPath:testPath], @"LICENSE unzipped");
|
XCTAssertTrue([fileManager fileExistsAtPath:testPath], @"LICENSE unzipped");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -120,6 +213,36 @@
|
|||||||
XCTAssertTrue(symbolicLinkToFilePersists && symbolicLinkToFolderPersists, @"Symbolic links should persist from the original archive to the outputted files.");
|
XCTAssertTrue(symbolicLinkToFilePersists && symbolicLinkToFolderPersists, @"Symbolic links should persist from the original archive to the outputted files.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)testUnzippingWithRelativeSymlink {
|
||||||
|
|
||||||
|
NSString *resourceName = @"RelativeSymbolicLink";
|
||||||
|
NSString* zipPath = [[NSBundle bundleForClass:[self class]] pathForResource:resourceName ofType:@"zip"];
|
||||||
|
NSString* outputPath = [self _cachesPath:resourceName];
|
||||||
|
|
||||||
|
[SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath delegate:self];
|
||||||
|
|
||||||
|
// Determine where the symlinks are
|
||||||
|
NSString *subfolderName = @"symlinks";
|
||||||
|
NSString *testBasePath = [NSString pathWithComponents:@[outputPath]];
|
||||||
|
NSString *testSymlinkFolder = [NSString pathWithComponents:@[testBasePath, subfolderName, @"folderSymlink"]];
|
||||||
|
NSString *testSymlinkFile = [NSString pathWithComponents:@[testBasePath, subfolderName, @"fileSymlink"]];
|
||||||
|
|
||||||
|
// Determine where the files they link to are
|
||||||
|
NSString *parentDir = @"../";
|
||||||
|
NSString *testSymlinkFolderTarget = [NSString pathWithComponents:@[parentDir, @"symlinkedFolder"]];
|
||||||
|
NSString *testSymlinkFileTarget = [NSString pathWithComponents:@[parentDir, @"symlinkedFile"]];
|
||||||
|
|
||||||
|
NSError *error = nil;
|
||||||
|
NSString *symlinkFolderPath = [[NSFileManager defaultManager] destinationOfSymbolicLinkAtPath:testSymlinkFolder error:&error];
|
||||||
|
bool symbolicLinkToFolderPersists = ((symlinkFolderPath != nil) && [symlinkFolderPath isEqualToString:testSymlinkFolderTarget]) && (error == nil);
|
||||||
|
|
||||||
|
error = nil;
|
||||||
|
|
||||||
|
NSString *symlinkFilePath = [[NSFileManager defaultManager] destinationOfSymbolicLinkAtPath:testSymlinkFile error:&error];
|
||||||
|
bool symbolicLinkToFilePersists = ((symlinkFilePath != nil) && [symlinkFilePath isEqualToString:testSymlinkFileTarget]) && (error == nil);
|
||||||
|
|
||||||
|
XCTAssertTrue(symbolicLinkToFilePersists && symbolicLinkToFolderPersists, @"Relative symbolic links should persist from the original archive to the outputted files (and also remain relative).");
|
||||||
|
}
|
||||||
|
|
||||||
- (void)testUnzippingWithUnicodeFilenameInside {
|
- (void)testUnzippingWithUnicodeFilenameInside {
|
||||||
|
|
||||||
@@ -139,22 +262,20 @@
|
|||||||
|
|
||||||
- (void)testZippingAndUnzippingForDate {
|
- (void)testZippingAndUnzippingForDate {
|
||||||
|
|
||||||
NSString *inputPath = [self _cachesPath:@"Regular"];
|
NSString *inputPath = [self _cachesPath:@"Regular"];
|
||||||
NSArray *inputPaths = [NSArray arrayWithObjects:
|
NSArray *inputPaths = @[[inputPath stringByAppendingPathComponent:@"Readme.markdown"]];
|
||||||
[inputPath stringByAppendingPathComponent:@"Readme.markdown"],
|
|
||||||
nil];
|
|
||||||
|
|
||||||
NSDictionary *originalFileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[inputPath stringByAppendingPathComponent:@"Readme.markdown"] error:nil];
|
NSDictionary *originalFileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[inputPath stringByAppendingPathComponent:@"Readme.markdown"] error:nil];
|
||||||
|
|
||||||
NSString *outputPath = [self _cachesPath:@"ZippedDate"];
|
NSString *outputPath = [self _cachesPath:@"ZippedDate"];
|
||||||
NSString *archivePath = [outputPath stringByAppendingPathComponent:@"CreatedArchive.zip"];
|
NSString *archivePath = [outputPath stringByAppendingPathComponent:@"CreatedArchive.zip"];
|
||||||
|
|
||||||
[SSZipArchive createZipFileAtPath:archivePath withFilesAtPaths:inputPaths];
|
[SSZipArchive createZipFileAtPath:archivePath withFilesAtPaths:inputPaths];
|
||||||
[SSZipArchive unzipFileAtPath:archivePath toDestination:outputPath delegate:self];
|
[SSZipArchive unzipFileAtPath:archivePath toDestination:outputPath delegate:self];
|
||||||
|
|
||||||
NSDictionary *createdFileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[outputPath stringByAppendingPathComponent:@"Readme.markdown"] error:nil];
|
NSDictionary *createdFileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[outputPath stringByAppendingPathComponent:@"Readme.markdown"] error:nil];
|
||||||
|
|
||||||
XCTAssertEqualObjects(originalFileAttributes[NSFileCreationDate], createdFileAttributes[@"NSFileCreationDate"], @"Orginal file creationDate should match created one");
|
XCTAssertEqualObjects(originalFileAttributes[NSFileCreationDate], createdFileAttributes[@"NSFileCreationDate"], @"Orginal file creationDate should match created one");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -198,6 +319,32 @@
|
|||||||
XCTAssertEqual(fileAttributes[NSFilePosixPermissions], preZipAttributes[NSFilePosixPermissions], @"File permissions should be retained during compression and de-compression");
|
XCTAssertEqual(fileAttributes[NSFilePosixPermissions], preZipAttributes[NSFilePosixPermissions], @"File permissions should be retained during compression and de-compression");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)testUnzippingWithCancel {
|
||||||
|
NSString *zipPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"TestArchive" ofType:@"zip"];
|
||||||
|
NSString *outputPath = [self _cachesPath:@"Cancel1"];
|
||||||
|
|
||||||
|
CancelDelegate *delegate = [[CancelDelegate alloc] init];
|
||||||
|
delegate.numFilesToUnzip = 1;
|
||||||
|
|
||||||
|
[SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath delegate:delegate];
|
||||||
|
|
||||||
|
XCTAssertEqual(delegate.numFilesUnzipped, 1);
|
||||||
|
XCTAssertFalse(delegate.didUnzipArchive);
|
||||||
|
XCTAssertNotEqual(delegate.loaded, delegate.total);
|
||||||
|
|
||||||
|
outputPath = [self _cachesPath:@"Cancel2"];
|
||||||
|
|
||||||
|
delegate = [[CancelDelegate alloc] init];
|
||||||
|
delegate.numFilesToUnzip = 1000;
|
||||||
|
|
||||||
|
[SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath delegate:delegate];
|
||||||
|
|
||||||
|
XCTAssertEqual(delegate.numFilesUnzipped, 2);
|
||||||
|
XCTAssertTrue(delegate.didUnzipArchive);
|
||||||
|
XCTAssertEqual(delegate.loaded, delegate.total);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// Commented out to avoid checking in several gig file into the repository. Simply add a file named
|
// Commented out to avoid checking in several gig file into the repository. Simply add a file named
|
||||||
// `LargeArchive.zip` to the project and uncomment out these lines to test.
|
// `LargeArchive.zip` to the project and uncomment out these lines to test.
|
||||||
//
|
//
|
||||||
@@ -208,56 +355,76 @@
|
|||||||
// [SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath];
|
// [SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath];
|
||||||
//}
|
//}
|
||||||
|
|
||||||
|
-(void)testShouldProvidePathOfUnzippedFileInDelegateCallback {
|
||||||
|
CollectingDelegate *collector = [CollectingDelegate new];
|
||||||
|
NSString *zipPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"TestArchive" ofType:@"zip"];
|
||||||
|
NSString *outputPath = [self _cachesPath:@"Regular"];
|
||||||
|
|
||||||
|
[SSZipArchive unzipFileAtPath:zipPath toDestination:outputPath delegate:collector];
|
||||||
|
|
||||||
|
// STAssertEqualObjects([collector.files objectAtIndex:0], @"LICENSE.txt", nil);
|
||||||
|
// STAssertEqualObjects([collector.files objectAtIndex:1], @"README.md", nil);
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark - SSZipArchiveDelegate
|
#pragma mark - SSZipArchiveDelegate
|
||||||
|
|
||||||
- (void)zipArchiveWillUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo {
|
- (void)zipArchiveWillUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo {
|
||||||
NSLog(@"*** zipArchiveWillUnzipArchiveAtPath: `%@` zipInfo:", path);
|
NSLog(@"*** zipArchiveWillUnzipArchiveAtPath: `%@` zipInfo:", path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (void)zipArchiveDidUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo unzippedPath:(NSString *)unzippedPath {
|
- (void)zipArchiveDidUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo unzippedPath:(NSString *)unzippedPath {
|
||||||
NSLog(@"*** zipArchiveDidUnzipArchiveAtPath: `%@` zipInfo: unzippedPath: `%@`", path, unzippedPath);
|
NSLog(@"*** zipArchiveDidUnzipArchiveAtPath: `%@` zipInfo: unzippedPath: `%@`", path, unzippedPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (BOOL)zipArchiveShouldUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo
|
||||||
|
{
|
||||||
|
NSLog(@"*** zipArchiveShouldUnzipFileAtIndex: `%d` totalFiles: `%d` archivePath: `%@` fileInfo:", (int)fileIndex, (int)totalFiles, archivePath);
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)zipArchiveWillUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo {
|
- (void)zipArchiveWillUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo {
|
||||||
NSLog(@"*** zipArchiveWillUnzipFileAtIndex: `%d` totalFiles: `%d` archivePath: `%@` fileInfo:", fileIndex, totalFiles, archivePath);
|
NSLog(@"*** zipArchiveWillUnzipFileAtIndex: `%d` totalFiles: `%d` archivePath: `%@` fileInfo:", (int)fileIndex, (int)totalFiles, archivePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (void)zipArchiveDidUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo {
|
- (void)zipArchiveDidUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo {
|
||||||
NSLog(@"*** zipArchiveDidUnzipFileAtIndex: `%d` totalFiles: `%d` archivePath: `%@` fileInfo:", fileIndex, totalFiles, archivePath);
|
NSLog(@"*** zipArchiveDidUnzipFileAtIndex: `%d` totalFiles: `%d` archivePath: `%@` fileInfo:", (int)fileIndex, (int)totalFiles, archivePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)zipArchiveProgressEvent:(NSInteger)loaded total:(NSInteger)total {
|
||||||
|
NSLog(@"*** zipArchiveProgressEvent: loaded: `%d` total: `%d`", (int)loaded, (int)total);
|
||||||
|
[progressEvents addObject:@(loaded)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#pragma mark - Private
|
#pragma mark - Private
|
||||||
|
|
||||||
- (NSString *)_cachesPath:(NSString *)directory {
|
- (NSString *)_cachesPath:(NSString *)directory {
|
||||||
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]
|
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]
|
||||||
stringByAppendingPathComponent:@"com.samsoffes.ssziparchive.tests"];
|
stringByAppendingPathComponent:@"com.samsoffes.ssziparchive.tests"];
|
||||||
if (directory) {
|
if (directory) {
|
||||||
path = [path stringByAppendingPathComponent:directory];
|
path = [path stringByAppendingPathComponent:directory];
|
||||||
}
|
}
|
||||||
|
|
||||||
NSFileManager *fileManager = [NSFileManager defaultManager];
|
NSFileManager *fileManager = [NSFileManager defaultManager];
|
||||||
if (![fileManager fileExistsAtPath:path]) {
|
if (![fileManager fileExistsAtPath:path]) {
|
||||||
[fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
|
[fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Taken from https://github.com/samsoffes/sstoolkit/blob/master/SSToolkit/NSData+SSToolkitAdditions.m
|
// Taken from https://github.com/samsoffes/sstoolkit/blob/master/SSToolkit/NSData+SSToolkitAdditions.m
|
||||||
- (NSString *)_calculateMD5Digest:(NSData *)data {
|
- (NSString *)_calculateMD5Digest:(NSData *)data {
|
||||||
unsigned char digest[CC_MD5_DIGEST_LENGTH], i;
|
unsigned char digest[CC_MD5_DIGEST_LENGTH], i;
|
||||||
CC_MD5(data.bytes, (unsigned int)data.length, digest);
|
CC_MD5(data.bytes, (unsigned int)data.length, digest);
|
||||||
NSMutableString *ms = [NSMutableString string];
|
NSMutableString *ms = [NSMutableString string];
|
||||||
for (i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
|
for (i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
|
||||||
[ms appendFormat: @"%02x", (int)(digest[i])];
|
[ms appendFormat: @"%02x", (int)(digest[i])];
|
||||||
}
|
}
|
||||||
return [ms copy];
|
return [ms copy];
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
Reference in New Issue
Block a user