Compare commits
65 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a289602590 | ||
|
|
6e16750451 | ||
|
|
0582706134 | ||
|
|
ed43028b8d | ||
|
|
e136e27380 | ||
|
|
61b0029250 | ||
|
|
54de82a95b | ||
|
|
04d8d9d1d4 | ||
|
|
cc40af1311 | ||
|
|
1dbde8f9c9 | ||
|
|
5a90a66267 | ||
|
|
00386a3fe9 | ||
|
|
ec6056de67 | ||
|
|
2485f97586 | ||
|
|
8364f87f9a | ||
|
|
9dfa7e43da | ||
|
|
401dfa4b17 | ||
|
|
a1e5810879 | ||
|
|
64185c4750 | ||
|
|
4ed48f8e04 | ||
|
|
6797222f63 | ||
|
|
f1f4fee67f | ||
|
|
07288c8e00 | ||
|
|
1409b8622d | ||
|
|
7f6ea3dd22 | ||
|
|
f3ccab7a68 | ||
|
|
74cbccda01 | ||
|
|
5178459102 | ||
|
|
51b449b51f | ||
|
|
2b57e61fbc | ||
|
|
94312b945e | ||
|
|
dbd1e5962f | ||
|
|
6e0a47fc64 | ||
|
|
b7dcbb63b3 | ||
|
|
b87bd38b66 | ||
|
|
4be16c97b0 | ||
|
|
1839a1c65c | ||
|
|
2be9361540 | ||
|
|
faa7e4d897 | ||
|
|
1a91d92c51 | ||
|
|
0d62b04cc6 | ||
|
|
e2e8bdc700 | ||
|
|
48a53904d8 | ||
|
|
5cbe4cde4d | ||
|
|
433d629232 | ||
|
|
c8f2e3843f | ||
|
|
f05b2ed31b | ||
|
|
049d1d4359 | ||
|
|
1c2bf920ac | ||
|
|
0148dc65ef | ||
|
|
1f0a183797 | ||
|
|
ae5dad01c2 | ||
|
|
2e737d29cd | ||
|
|
4f5072e155 | ||
|
|
bc9cedb8e8 | ||
|
|
5efa1efdb1 | ||
|
|
16978b4606 | ||
|
|
24b8531dd4 | ||
|
|
136f0da35c | ||
|
|
8c8a7ca683 | ||
|
|
2caf1cea56 | ||
|
|
e8b715640e | ||
|
|
7c0f2a7a07 | ||
|
|
9faa93e605 | ||
|
|
667b62fcc1 |
@@ -1,47 +0,0 @@
|
||||
//
|
||||
// Objective_ZipAppDelegate.h
|
||||
// Objective-Zip
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright Flying Dolphin Studio 2009. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@class Objective_ZipViewController;
|
||||
|
||||
@interface Objective_ZipAppDelegate : NSObject <UIApplicationDelegate> {
|
||||
UIWindow *window;
|
||||
Objective_ZipViewController *viewController;
|
||||
}
|
||||
|
||||
@property (nonatomic, retain) IBOutlet UIWindow *window;
|
||||
@property (nonatomic, retain) IBOutlet Objective_ZipViewController *viewController;
|
||||
|
||||
@end
|
||||
|
||||
@@ -1,208 +0,0 @@
|
||||
//
|
||||
// Objective_ZipViewController.m
|
||||
// Objective-Zip
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright Flying Dolphin Studio 2009. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "Objective_ZipViewController.h"
|
||||
#import "../Objective-Zip/ZipFile.h"
|
||||
#import "../Objective-Zip/ZipException.h"
|
||||
#import "../Objective-Zip/FileInZipInfo.h"
|
||||
#import "../Objective-Zip/ZipWriteStream.h"
|
||||
#import "../Objective-Zip/ZipReadStream.h"
|
||||
|
||||
|
||||
@implementation Objective_ZipViewController
|
||||
|
||||
|
||||
- (void) loadView {
|
||||
[super loadView];
|
||||
|
||||
_textView.font= [UIFont fontWithName:@"Helvetica" size:11.0];
|
||||
}
|
||||
|
||||
- (void) dealloc {
|
||||
if (_testThread)
|
||||
[_testThread release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void) didReceiveMemoryWarning {
|
||||
[super didReceiveMemoryWarning];
|
||||
}
|
||||
|
||||
- (IBAction) zipUnzip {
|
||||
if (_testThread)
|
||||
[_testThread release];
|
||||
|
||||
_testThread= [[NSThread alloc] initWithTarget:self selector:@selector(test) object:nil];
|
||||
[_testThread start];
|
||||
}
|
||||
|
||||
- (void) test {
|
||||
NSAutoreleasePool *pool= [[NSAutoreleasePool alloc] init];
|
||||
|
||||
@try {
|
||||
NSString *documentsDir= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
|
||||
NSString *filePath= [documentsDir stringByAppendingPathComponent:@"test.zip"];
|
||||
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Opening zip file for writing..." waitUntilDone:YES];
|
||||
|
||||
ZipFile *zipFile= [[ZipFile alloc] initWithFileName:filePath mode:ZipFileModeCreate];
|
||||
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Adding first file..." waitUntilDone:YES];
|
||||
|
||||
ZipWriteStream *stream1= [zipFile writeFileInZipWithName:@"abc.txt" fileDate:[NSDate dateWithTimeIntervalSinceNow:-86400.0] compressionLevel:ZipCompressionLevelBest];
|
||||
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Writing to first file's stream..." waitUntilDone:YES];
|
||||
|
||||
NSString *text= @"abc";
|
||||
[stream1 writeData:[text dataUsingEncoding:NSUTF8StringEncoding]];
|
||||
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Closing first file's stream..." waitUntilDone:YES];
|
||||
|
||||
[stream1 finishedWriting];
|
||||
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Adding second file..." waitUntilDone:YES];
|
||||
|
||||
ZipWriteStream *stream2= [zipFile writeFileInZipWithName:@"x/y/z/xyz.txt" compressionLevel:ZipCompressionLevelNone];
|
||||
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Writing to second file's stream..." waitUntilDone:YES];
|
||||
|
||||
NSString *text2= @"XYZ";
|
||||
[stream2 writeData:[text2 dataUsingEncoding:NSUTF8StringEncoding]];
|
||||
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Closing second file's stream..." waitUntilDone:YES];
|
||||
|
||||
[stream2 finishedWriting];
|
||||
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Closing zip file..." waitUntilDone:YES];
|
||||
|
||||
[zipFile close];
|
||||
[zipFile release];
|
||||
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Opening zip file for reading..." waitUntilDone:YES];
|
||||
|
||||
ZipFile *unzipFile= [[ZipFile alloc] initWithFileName:filePath mode:ZipFileModeUnzip];
|
||||
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Reading file infos..." waitUntilDone:YES];
|
||||
|
||||
NSArray *infos= [unzipFile listFileInZipInfos];
|
||||
for (FileInZipInfo *info in infos) {
|
||||
NSString *fileInfo= [NSString stringWithFormat:@"- %@ %@ %d (%d)", info.name, info.date, info.size, info.level];
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:fileInfo waitUntilDone:YES];
|
||||
}
|
||||
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Opening first file..." waitUntilDone:YES];
|
||||
|
||||
[unzipFile goToFirstFileInZip];
|
||||
ZipReadStream *read1= [unzipFile readCurrentFileInZip];
|
||||
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Reading from first file's stream..." waitUntilDone:YES];
|
||||
|
||||
NSMutableData *data1= [[[NSMutableData alloc] initWithLength:256] autorelease];
|
||||
int bytesRead1= [read1 readDataWithBuffer:data1];
|
||||
|
||||
BOOL ok= NO;
|
||||
if (bytesRead1 == 3) {
|
||||
NSString *fileText1= [[[NSString alloc] initWithBytes:[data1 bytes] length:bytesRead1 encoding:NSUTF8StringEncoding] autorelease];
|
||||
if ([fileText1 isEqualToString:@"abc"])
|
||||
ok= YES;
|
||||
}
|
||||
|
||||
if (ok)
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Content of first file is OK" waitUntilDone:YES];
|
||||
else
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Content of first file is WRONG" waitUntilDone:YES];
|
||||
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Closing first file's stream..." waitUntilDone:YES];
|
||||
|
||||
[read1 finishedReading];
|
||||
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Opening second file..." waitUntilDone:YES];
|
||||
|
||||
[unzipFile goToNextFileInZip];
|
||||
ZipReadStream *read2= [unzipFile readCurrentFileInZip];
|
||||
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Reading from second file's stream..." waitUntilDone:YES];
|
||||
|
||||
NSMutableData *data2= [[[NSMutableData alloc] initWithLength:256] autorelease];
|
||||
int bytesRead2= [read2 readDataWithBuffer:data2];
|
||||
|
||||
ok= NO;
|
||||
if (bytesRead2 == 3) {
|
||||
NSString *fileText2= [[[NSString alloc] initWithBytes:[data2 bytes] length:bytesRead2 encoding:NSUTF8StringEncoding] autorelease];
|
||||
if ([fileText2 isEqualToString:@"XYZ"])
|
||||
ok= YES;
|
||||
}
|
||||
|
||||
if (ok)
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Content of second file is OK" waitUntilDone:YES];
|
||||
else
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Content of second file is WRONG" waitUntilDone:YES];
|
||||
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Closing second file's stream..." waitUntilDone:YES];
|
||||
|
||||
[read2 finishedReading];
|
||||
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Closing zip file..." waitUntilDone:YES];
|
||||
|
||||
[unzipFile close];
|
||||
[unzipFile release];
|
||||
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Test terminated succesfully" waitUntilDone:YES];
|
||||
|
||||
} @catch (ZipException *ze) {
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Caught a ZipException (see logs), terminating..." waitUntilDone:YES];
|
||||
|
||||
NSLog(@"ZipException caught: %d - %@", ze.error, [ze reason]);
|
||||
|
||||
} @catch (id e) {
|
||||
[self performSelectorOnMainThread:@selector(log:) withObject:@"Caught a generic exception (see logs), terminating..." waitUntilDone:YES];
|
||||
|
||||
NSLog(@"Exception caught: %@ - %@", [[e class] description], [e description]);
|
||||
}
|
||||
|
||||
[pool drain];
|
||||
}
|
||||
|
||||
- (void) log:(NSString *)text {
|
||||
NSLog(@"%@", text);
|
||||
|
||||
_textView.text= [_textView.text stringByAppendingString:text];
|
||||
_textView.text= [_textView.text stringByAppendingString:@"\n"];
|
||||
|
||||
NSRange range;
|
||||
range.location= [_textView.text length] -6;
|
||||
range.length= 5;
|
||||
[_textView scrollRangeToVisible:range];
|
||||
}
|
||||
|
||||
@end
|
||||
BIN
Default.png
BIN
Default.png
Binary file not shown.
|
Before Width: | Height: | Size: 408 KiB |
@@ -1,172 +0,0 @@
|
||||
|
||||
Getting started with Objective-Zip
|
||||
==================================
|
||||
|
||||
Objective-Zip exposes basic functionalities to read and write zip files,
|
||||
encapsulating both ZLib for the compression mechanism and MiniZip for
|
||||
the zip wrapping.
|
||||
|
||||
Adding Objective-Zip to your project
|
||||
------------------------------------
|
||||
|
||||
The library is distributed as source only, so simply download the unit
|
||||
test application and copy-paste these directories in your own project:
|
||||
- ZLib,
|
||||
- MiniZip,
|
||||
- Objective-Zip.
|
||||
|
||||
The first two are simply copies of the distribution of version 1.2.7 of
|
||||
ZLib and of version 1.1 of MiniZip (which is itself part of ZLib
|
||||
contributions), while the third is their Objective-C wrapper.
|
||||
|
||||
Main concepts
|
||||
-------------
|
||||
|
||||
Objective-Zip is centered on a class called (with a lack of fantasy)
|
||||
ZipFile. It can be created with the common Objective-C procedure of an
|
||||
alloc followed by an init, specifying in the latter if the zip file is
|
||||
being created, appended or unzipped:
|
||||
|
||||
ZipFile *zipFile= [[ZipFile alloc] initWithFileName:@"test.zip"
|
||||
mode:ZipFileModeCreate];
|
||||
|
||||
Creating and appending are both write-only modalities, while unzipping
|
||||
is a read-only modality. You can not request reading operations on a
|
||||
write-mode zip file, nor request writing operations on a read-mode zip
|
||||
file.
|
||||
|
||||
Adding a file to a zip file
|
||||
---------------------------
|
||||
|
||||
The ZipFile class has a couple of methods to add new files to a zip
|
||||
file, one of which keeps the file in clear and the other encrypts it
|
||||
with a password. Both methods return an instance of a ZipWriteStream
|
||||
class, which will be used solely for the scope of writing the content of
|
||||
the file, and then must be closed:
|
||||
|
||||
ZipWriteStream *stream= [zipFile writeFileInZipWithName:@"abc.txt"
|
||||
compressionLevel:ZipCompressionLevelBest];
|
||||
|
||||
[stream writeData:abcData];
|
||||
[stream finishedWriting];
|
||||
|
||||
Reading a file from a zip file
|
||||
------------------------------
|
||||
|
||||
The ZipFile class, when used in unzip mode, must be treated like a
|
||||
cursor: you position the instance on a file at a time, either by
|
||||
step-forwarding or by locating the file by name. Once you are on the
|
||||
correct file, you can obtain an instance of a ZipReadStream that will
|
||||
let you read the content (and then must be closed):
|
||||
|
||||
ZipFile *unzipFile= [[ZipFile alloc] initWithFileName:@"test.zip"
|
||||
mode:ZipFileModeUnzip];
|
||||
|
||||
[unzipFile goToFirstFileInZip];
|
||||
|
||||
ZipReadStream *read= [unzipFile readCurrentFileInZip];
|
||||
NSMutableData *data= [[NSMutableData alloc] initWithLength:256];
|
||||
int bytesRead= [read readDataWithBuffer:data];
|
||||
|
||||
[read finishedReading];
|
||||
|
||||
Note that the NSMutableData instance that acts as the read buffer must
|
||||
have been set with a length greater than 0: the readDataWithBuffer API
|
||||
will use that length to know how many bytes it can fetch from the zip
|
||||
file.
|
||||
|
||||
Listing files in a zip file
|
||||
---------------------------
|
||||
|
||||
When the ZipFile class is used in unzip mode, it can also list the files
|
||||
contained in zip by filling an NSArray with instances of FileInZipInfo
|
||||
class. You can then use its name property to locate the file inside the
|
||||
zip and expand it:
|
||||
|
||||
ZipFile *unzipFile= [[ZipFile alloc] initWithFileName:@"test.zip"
|
||||
mode:ZipFileModeUnzip];
|
||||
|
||||
NSArray *infos= [unzipFile listFileInZipInfos];
|
||||
for (FileInZipInfo *info in infos) {
|
||||
NSLog(@"- %@ %@ %d (%d)", info.name, info.date, info.size,
|
||||
info.level);
|
||||
|
||||
// Locate the file in the zip
|
||||
[unzipFile locateFileInZip:info.name];
|
||||
|
||||
// Expand the file in memory
|
||||
ZipReadStream *read= [unzipFile readCurrentFileInZip];
|
||||
NSMutableData *data= [[NSMutableData alloc] initWithLength:256];
|
||||
int bytesRead= [read readDataWithBuffer:data];
|
||||
[read finishedReading];
|
||||
}
|
||||
|
||||
Note that the FileInZipInfo class provide two sizes:
|
||||
- length is the original (uncompressed) file size, while
|
||||
- size is the compressed file size.
|
||||
|
||||
Closing the zip file
|
||||
--------------------
|
||||
|
||||
Remember, when you are done, to close your ZipFile instance to avoid
|
||||
file corruption problems:
|
||||
|
||||
[zipFile close];
|
||||
|
||||
Notes
|
||||
=====
|
||||
|
||||
File/folder hierarchy inide the zip
|
||||
-----------------------------------
|
||||
|
||||
Please note that inside the zip files there is no representation of a
|
||||
file-folder hierarchy: it is simply embedded in file names (i.e.: a file
|
||||
with a name like "x/y/z/file.txt"). It is up to the program that
|
||||
extracts the files to consider these file names as expressing a
|
||||
structure and rebuild it on the file system (and viceversa during
|
||||
creation). Common zippers/unzippers simply follow this rule.
|
||||
|
||||
Memory management
|
||||
-----------------
|
||||
|
||||
If you need to extract huge files that cannot be contained in memory,
|
||||
you can do so using a read-then-write buffered loop like this:
|
||||
|
||||
NSFileHandle *file= [NSFileHandle fileHandleForWritingAtPath:filePath];
|
||||
NSMutableData *buffer= [[NSMutableData alloc]
|
||||
initWithLength:BUFFER_SIZE];
|
||||
|
||||
ZipReadStream *read= [unzipFile readCurrentFileInZip];
|
||||
|
||||
// Read-then-write buffered loop
|
||||
do {
|
||||
|
||||
// Reset buffer length
|
||||
[buffer setLength:BUFFER_SIZE];
|
||||
|
||||
// Expand next chunk of bytes
|
||||
int bytesRead= [read readDataWithBuffer:buffer];
|
||||
if (bytesRead > 0) {
|
||||
|
||||
// Write what we have read
|
||||
[buffer setLength:bytesRead];
|
||||
[file writeData:buffer];
|
||||
|
||||
} else
|
||||
break;
|
||||
|
||||
} while (YES);
|
||||
|
||||
// Clean up
|
||||
[file closeFile];
|
||||
[read finishedReading];
|
||||
[buffer release];
|
||||
|
||||
Exception handling
|
||||
------------------
|
||||
|
||||
If something goes wrong during an operation, Objective-Zip will always
|
||||
throw an exception of class ZipException, which contains a property with
|
||||
the specific error number of MiniZip. With that number you are supposed
|
||||
to find the reason of the error.
|
||||
|
||||
219
MainWindow.xib
219
MainWindow.xib
@@ -1,219 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.10">
|
||||
<data>
|
||||
<int key="IBDocument.SystemTarget">784</int>
|
||||
<string key="IBDocument.SystemVersion">10A394</string>
|
||||
<string key="IBDocument.InterfaceBuilderVersion">732</string>
|
||||
<string key="IBDocument.AppKitVersion">1027.1</string>
|
||||
<string key="IBDocument.HIToolboxVersion">430.00</string>
|
||||
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
|
||||
<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string key="NS.object.0">60</string>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<integer value="10"/>
|
||||
</object>
|
||||
<object class="NSArray" key="IBDocument.PluginDependencies">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="IBDocument.Metadata">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSArray" key="dict.sortedKeys" id="0">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBProxyObject" id="841351856">
|
||||
<string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
|
||||
</object>
|
||||
<object class="IBProxyObject" id="427554174">
|
||||
<string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
|
||||
</object>
|
||||
<object class="IBUICustomObject" id="664661524"/>
|
||||
<object class="IBUIViewController" id="943309135">
|
||||
<string key="IBUINibName">Objective_ZipViewController</string>
|
||||
<object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
|
||||
</object>
|
||||
<object class="IBUIWindow" id="117978783">
|
||||
<nil key="NSNextResponder"/>
|
||||
<int key="NSvFlags">292</int>
|
||||
<string key="NSFrameSize">{320, 480}</string>
|
||||
<object class="NSColor" key="IBUIBackgroundColor">
|
||||
<int key="NSColorSpace">1</int>
|
||||
<bytes key="NSRGB">MSAxIDEAA</bytes>
|
||||
</object>
|
||||
<bool key="IBUIOpaque">NO</bool>
|
||||
<bool key="IBUIClearsContextBeforeDrawing">NO</bool>
|
||||
<object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBObjectContainer" key="IBDocument.Objects">
|
||||
<object class="NSMutableArray" key="connectionRecords">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchOutletConnection" key="connection">
|
||||
<string key="label">delegate</string>
|
||||
<reference key="source" ref="841351856"/>
|
||||
<reference key="destination" ref="664661524"/>
|
||||
</object>
|
||||
<int key="connectionID">4</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchOutletConnection" key="connection">
|
||||
<string key="label">viewController</string>
|
||||
<reference key="source" ref="664661524"/>
|
||||
<reference key="destination" ref="943309135"/>
|
||||
</object>
|
||||
<int key="connectionID">11</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchOutletConnection" key="connection">
|
||||
<string key="label">window</string>
|
||||
<reference key="source" ref="664661524"/>
|
||||
<reference key="destination" ref="117978783"/>
|
||||
</object>
|
||||
<int key="connectionID">14</int>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBMutableOrderedSet" key="objectRecords">
|
||||
<object class="NSArray" key="orderedObjects">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">0</int>
|
||||
<reference key="object" ref="0"/>
|
||||
<reference key="children" ref="1000"/>
|
||||
<nil key="parent"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-1</int>
|
||||
<reference key="object" ref="841351856"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
<string key="objectName">File's Owner</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">3</int>
|
||||
<reference key="object" ref="664661524"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
<string key="objectName">Objective_Zip App Delegate</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-2</int>
|
||||
<reference key="object" ref="427554174"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">10</int>
|
||||
<reference key="object" ref="943309135"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">12</int>
|
||||
<reference key="object" ref="117978783"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="flattenedProperties">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>-1.CustomClassName</string>
|
||||
<string>-2.CustomClassName</string>
|
||||
<string>10.CustomClassName</string>
|
||||
<string>10.IBEditorWindowLastContentRect</string>
|
||||
<string>10.IBPluginDependency</string>
|
||||
<string>12.IBEditorWindowLastContentRect</string>
|
||||
<string>12.IBPluginDependency</string>
|
||||
<string>3.CustomClassName</string>
|
||||
<string>3.IBPluginDependency</string>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>UIApplication</string>
|
||||
<string>UIResponder</string>
|
||||
<string>Objective_ZipViewController</string>
|
||||
<string>{{512, 351}, {320, 480}}</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string>{{525, 346}, {320, 480}}</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string>Objective_ZipAppDelegate</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="unlocalizedProperties">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<reference key="dict.sortedKeys" ref="0"/>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
</object>
|
||||
<nil key="activeLocalization"/>
|
||||
<object class="NSMutableDictionary" key="localizations">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<reference key="dict.sortedKeys" ref="0"/>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
</object>
|
||||
<nil key="sourceID"/>
|
||||
<int key="maxID">14</int>
|
||||
</object>
|
||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">Objective_ZipAppDelegate</string>
|
||||
<string key="superclassName">NSObject</string>
|
||||
<object class="NSMutableDictionary" key="outlets">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>viewController</string>
|
||||
<string>window</string>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>Objective_ZipViewController</string>
|
||||
<string>UIWindow</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">Classes/Objective_ZipAppDelegate.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">Objective_ZipAppDelegate</string>
|
||||
<string key="superclassName">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBUserSource</string>
|
||||
<string key="minorKey"/>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">Objective_ZipViewController</string>
|
||||
<string key="superclassName">UIViewController</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">Classes/Objective_ZipViewController.h</string>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<int key="IBDocument.localizationMode">0</int>
|
||||
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
|
||||
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
|
||||
<integer value="3100" key="NS.object.0"/>
|
||||
</object>
|
||||
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
|
||||
<string key="IBDocument.LastKnownRelativeProjectPath">Objective-Zip.xcodeproj</string>
|
||||
<int key="IBDocument.defaultPropertyAccessControl">3</int>
|
||||
<string key="IBCocoaTouchPluginVersion">3.1</string>
|
||||
</data>
|
||||
</archive>
|
||||
158
MiniZip/crypt.c
Normal file
158
MiniZip/crypt.c
Normal file
@@ -0,0 +1,158 @@
|
||||
/* crypt.h -- base code for traditional PKWARE encryption
|
||||
Version 1.01e, February 12th, 2005
|
||||
|
||||
Copyright (C) 1998-2005 Gilles Vollant
|
||||
Modifications for Info-ZIP crypting
|
||||
Copyright (C) 2003 Terry Thorsen
|
||||
|
||||
This code is a modified version of crypting code in Info-ZIP distribution
|
||||
|
||||
Copyright (C) 1990-2000 Info-ZIP. All rights reserved.
|
||||
|
||||
This program is distributed under the terms of the same license as zlib.
|
||||
See the accompanying LICENSE file for the full text of the license.
|
||||
|
||||
This encryption code is a direct transcription of the algorithm from
|
||||
Roger Schlafly, described by Phil Katz in the file appnote.txt. This
|
||||
file (appnote.txt) is distributed with the PKZIP program (even in the
|
||||
version without encryption capabilities).
|
||||
|
||||
If you don't need crypting in your application, just define symbols
|
||||
NOCRYPT and NOUNCRYPT.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <time.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
# include <windows.h>
|
||||
# include <wincrypt.h>
|
||||
#else
|
||||
# include <sys/stat.h>
|
||||
# include <fcntl.h>
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "zlib.h"
|
||||
|
||||
#include "crypt.h"
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
#define CRC32(c, b) ((*(pcrc_32_tab+(((uint32_t)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
|
||||
|
||||
#ifndef ZCR_SEED2
|
||||
# define ZCR_SEED2 3141592654UL /* use PI as default pattern */
|
||||
#endif
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
uint8_t decrypt_byte(uint32_t *pkeys)
|
||||
{
|
||||
unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
|
||||
* unpredictable manner on 16-bit systems; not a problem
|
||||
* with any known compiler so far, though */
|
||||
|
||||
temp = ((uint32_t)(*(pkeys+2)) & 0xffff) | 2;
|
||||
return (uint8_t)(((temp * (temp ^ 1)) >> 8) & 0xff);
|
||||
}
|
||||
|
||||
uint8_t update_keys(uint32_t *pkeys, const z_crc_t *pcrc_32_tab, int32_t c)
|
||||
{
|
||||
(*(pkeys+0)) = (uint32_t)CRC32((*(pkeys+0)), c);
|
||||
(*(pkeys+1)) += (*(pkeys+0)) & 0xff;
|
||||
(*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
|
||||
{
|
||||
register int32_t keyshift = (int32_t)((*(pkeys + 1)) >> 24);
|
||||
(*(pkeys+2)) = (uint32_t)CRC32((*(pkeys+2)), keyshift);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
void init_keys(const char *passwd, uint32_t *pkeys, const z_crc_t *pcrc_32_tab)
|
||||
{
|
||||
*(pkeys+0) = 305419896L;
|
||||
*(pkeys+1) = 591751049L;
|
||||
*(pkeys+2) = 878082192L;
|
||||
while (*passwd != 0)
|
||||
{
|
||||
update_keys(pkeys, pcrc_32_tab, *passwd);
|
||||
passwd += 1;
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
int cryptrand(unsigned char *buf, unsigned int len)
|
||||
{
|
||||
static unsigned calls = 0;
|
||||
int rlen = 0;
|
||||
#ifdef _WIN32
|
||||
HCRYPTPROV provider;
|
||||
unsigned __int64 pentium_tsc[1];
|
||||
int result = 0;
|
||||
|
||||
|
||||
if (CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
|
||||
{
|
||||
result = CryptGenRandom(provider, len, buf);
|
||||
CryptReleaseContext(provider, 0);
|
||||
if (result)
|
||||
return len;
|
||||
}
|
||||
|
||||
for (rlen = 0; rlen < (int)len; ++rlen)
|
||||
{
|
||||
if (rlen % 8 == 0)
|
||||
QueryPerformanceCounter((LARGE_INTEGER *)pentium_tsc);
|
||||
buf[rlen] = ((unsigned char*)pentium_tsc)[rlen % 8];
|
||||
}
|
||||
#else
|
||||
int frand = open("/dev/urandom", O_RDONLY);
|
||||
if (frand != -1)
|
||||
{
|
||||
rlen = (int)read(frand, buf, len);
|
||||
close(frand);
|
||||
}
|
||||
#endif
|
||||
if (rlen < (int)len)
|
||||
{
|
||||
/* Ensure different random header each time */
|
||||
if (++calls == 1)
|
||||
srand((unsigned)(time(NULL) ^ ZCR_SEED2));
|
||||
|
||||
while (rlen < (int)len)
|
||||
buf[rlen++] = (rand() >> 7) & 0xff;
|
||||
}
|
||||
return rlen;
|
||||
}
|
||||
|
||||
int crypthead(const char *passwd, uint8_t *buf, int buf_size,
|
||||
uint32_t *pkeys, const z_crc_t *pcrc_32_tab, uint32_t crc_for_crypting)
|
||||
{
|
||||
uint8_t n = 0; /* index in random header */
|
||||
uint8_t header[RAND_HEAD_LEN-2]; /* random header */
|
||||
uint16_t t = 0; /* temporary */
|
||||
|
||||
if (buf_size < RAND_HEAD_LEN)
|
||||
return 0;
|
||||
|
||||
init_keys(passwd, pkeys, pcrc_32_tab);
|
||||
|
||||
/* First generate RAND_HEAD_LEN-2 random bytes. */
|
||||
cryptrand(header, RAND_HEAD_LEN-2);
|
||||
|
||||
/* Encrypt random header (last two bytes is high word of crc) */
|
||||
init_keys(passwd, pkeys, pcrc_32_tab);
|
||||
|
||||
for (n = 0; n < RAND_HEAD_LEN-2; n++)
|
||||
buf[n] = (uint8_t)zencode(pkeys, pcrc_32_tab, header[n], t);
|
||||
|
||||
buf[n++] = (uint8_t)zencode(pkeys, pcrc_32_tab, (uint8_t)((crc_for_crypting >> 16) & 0xff), t);
|
||||
buf[n++] = (uint8_t)zencode(pkeys, pcrc_32_tab, (uint8_t)((crc_for_crypting >> 24) & 0xff), t);
|
||||
return n;
|
||||
}
|
||||
|
||||
/***************************************************************************/
|
||||
154
MiniZip/crypt.h
154
MiniZip/crypt.h
@@ -1,131 +1,57 @@
|
||||
/* crypt.h -- base code for crypt/uncrypt ZIPfile
|
||||
|
||||
|
||||
/* crypt.h -- base code for traditional PKWARE encryption
|
||||
Version 1.01e, February 12th, 2005
|
||||
|
||||
Copyright (C) 1998-2005 Gilles Vollant
|
||||
Modifications for Info-ZIP crypting
|
||||
Copyright (C) 2003 Terry Thorsen
|
||||
|
||||
This code is a modified version of crypting code in Infozip distribution
|
||||
This code is a modified version of crypting code in Info-ZIP distribution
|
||||
|
||||
The encryption/decryption parts of this source code (as opposed to the
|
||||
non-echoing password parts) were originally written in Europe. The
|
||||
whole source package can be freely distributed, including from the USA.
|
||||
(Prior to January 2000, re-export from the US was a violation of US law.)
|
||||
Copyright (C) 1990-2000 Info-ZIP. All rights reserved.
|
||||
|
||||
This encryption code is a direct transcription of the algorithm from
|
||||
Roger Schlafly, described by Phil Katz in the file appnote.txt. This
|
||||
file (appnote.txt) is distributed with the PKZIP program (even in the
|
||||
version without encryption capabilities).
|
||||
|
||||
If you don't need crypting in your application, just define symbols
|
||||
NOCRYPT and NOUNCRYPT.
|
||||
|
||||
This code support the "Traditional PKWARE Encryption".
|
||||
|
||||
The new AES encryption added on Zip format by Winzip (see the page
|
||||
http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong
|
||||
Encryption is not supported.
|
||||
This program is distributed under the terms of the same license as zlib.
|
||||
See the accompanying LICENSE file for the full text of the license.
|
||||
*/
|
||||
|
||||
#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
|
||||
#ifndef _MINICRYPT_H
|
||||
#define _MINICRYPT_H
|
||||
|
||||
/***********************************************************************
|
||||
* Return the next byte in the pseudo-random sequence
|
||||
*/
|
||||
static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
|
||||
{
|
||||
unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
|
||||
* unpredictable manner on 16-bit systems; not a problem
|
||||
* with any known compiler so far, though */
|
||||
|
||||
temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
|
||||
return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* Update the encryption keys with the next byte of plain text
|
||||
*/
|
||||
static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
|
||||
{
|
||||
(*(pkeys+0)) = CRC32((*(pkeys+0)), c);
|
||||
(*(pkeys+1)) += (*(pkeys+0)) & 0xff;
|
||||
(*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
|
||||
{
|
||||
register int keyshift = (int)((*(pkeys+1)) >> 24);
|
||||
(*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* Initialize the encryption keys and the random header according to
|
||||
* the given password.
|
||||
*/
|
||||
static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
|
||||
{
|
||||
*(pkeys+0) = 305419896L;
|
||||
*(pkeys+1) = 591751049L;
|
||||
*(pkeys+2) = 878082192L;
|
||||
while (*passwd != '\0') {
|
||||
update_keys(pkeys,pcrc_32_tab,(int)*passwd);
|
||||
passwd++;
|
||||
}
|
||||
}
|
||||
|
||||
#define zdecode(pkeys,pcrc_32_tab,c) \
|
||||
(update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
|
||||
|
||||
#define zencode(pkeys,pcrc_32_tab,c,t) \
|
||||
(t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
|
||||
|
||||
#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define RAND_HEAD_LEN 12
|
||||
/* "last resort" source for second part of crypt seed pattern */
|
||||
# ifndef ZCR_SEED2
|
||||
# define ZCR_SEED2 3141592654UL /* use PI as default pattern */
|
||||
# endif
|
||||
|
||||
static int crypthead(const char* passwd, /* password string */
|
||||
unsigned char* buf, /* where to write header */
|
||||
int bufSize,
|
||||
unsigned long* pkeys,
|
||||
const unsigned long* pcrc_32_tab,
|
||||
unsigned long crcForCrypting)
|
||||
{
|
||||
int n; /* index in random header */
|
||||
int t; /* temporary */
|
||||
int c; /* random byte */
|
||||
unsigned char header[RAND_HEAD_LEN-2]; /* random header */
|
||||
static unsigned calls = 0; /* ensure different random header each time */
|
||||
/***************************************************************************/
|
||||
|
||||
if (bufSize<RAND_HEAD_LEN)
|
||||
return 0;
|
||||
#define zdecode(pkeys,pcrc_32_tab,c) \
|
||||
(update_keys(pkeys,pcrc_32_tab, c ^= decrypt_byte(pkeys)))
|
||||
|
||||
/* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
|
||||
* output of rand() to get less predictability, since rand() is
|
||||
* often poorly implemented.
|
||||
*/
|
||||
if (++calls == 1)
|
||||
{
|
||||
srand((unsigned)(time(NULL) ^ ZCR_SEED2));
|
||||
}
|
||||
init_keys(passwd, pkeys, pcrc_32_tab);
|
||||
for (n = 0; n < RAND_HEAD_LEN-2; n++)
|
||||
{
|
||||
c = (rand() >> 7) & 0xff;
|
||||
header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
|
||||
}
|
||||
/* Encrypt random header (last two bytes is high word of crc) */
|
||||
init_keys(passwd, pkeys, pcrc_32_tab);
|
||||
for (n = 0; n < RAND_HEAD_LEN-2; n++)
|
||||
{
|
||||
buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
|
||||
}
|
||||
buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
|
||||
buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
|
||||
return n;
|
||||
#define zencode(pkeys,pcrc_32_tab,c,t) \
|
||||
(t = decrypt_byte(pkeys), update_keys(pkeys,pcrc_32_tab,c), t^(c))
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
/* Return the next byte in the pseudo-random sequence */
|
||||
uint8_t decrypt_byte(uint32_t *pkeys);
|
||||
|
||||
/* Update the encryption keys with the next byte of plain text */
|
||||
uint8_t update_keys(uint32_t *pkeys, const z_crc_t *pcrc_32_tab, int32_t c);
|
||||
|
||||
/* Initialize the encryption keys and the random header according to the given password. */
|
||||
void init_keys(const char *passwd, uint32_t *pkeys, const z_crc_t *pcrc_32_tab);
|
||||
|
||||
/* Generate cryptographically secure random numbers */
|
||||
int cryptrand(unsigned char *buf, unsigned int len);
|
||||
|
||||
/* Create encryption header */
|
||||
int crypthead(const char *passwd, uint8_t *buf, int buf_size, uint32_t *pkeys,
|
||||
const z_crc_t *pcrc_32_tab, uint32_t crc_for_crypting);
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
342
MiniZip/ioapi.c
Normal file → Executable file
342
MiniZip/ioapi.c
Normal file → Executable file
@@ -1,63 +1,72 @@
|
||||
/* ioapi.h -- IO base function header for compress/uncompress .zip
|
||||
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
||||
part of the MiniZip project
|
||||
|
||||
Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
|
||||
|
||||
Modifications for Zip64 support
|
||||
Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
|
||||
|
||||
For more info read MiniZip_info.txt
|
||||
Copyright (C) 1998-2010 Gilles Vollant
|
||||
http://www.winimage.com/zLibDll/minizip.html
|
||||
Modifications for Zip64 support
|
||||
Copyright (C) 2009-2010 Mathias Svensson
|
||||
http://result42.com
|
||||
|
||||
This program is distributed under the terms of the same license as zlib.
|
||||
See the accompanying LICENSE file for the full text of the license.
|
||||
*/
|
||||
|
||||
#if (defined(_WIN32))
|
||||
#define _CRT_SECURE_NO_WARNINGS
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#if defined unix || defined __APPLE__
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "ioapi.h"
|
||||
|
||||
voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)
|
||||
#if defined(_WIN32)
|
||||
# define snprintf _snprintf
|
||||
#endif
|
||||
|
||||
voidpf call_zopen64(const zlib_filefunc64_32_def *pfilefunc, const void *filename, int mode)
|
||||
{
|
||||
if (pfilefunc->zfile_func64.zopen64_file != NULL)
|
||||
return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode);
|
||||
else
|
||||
{
|
||||
return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode);
|
||||
}
|
||||
return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque, filename, mode);
|
||||
return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque, (const char*)filename, mode);
|
||||
}
|
||||
|
||||
long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)
|
||||
voidpf call_zopendisk64(const zlib_filefunc64_32_def *pfilefunc, voidpf filestream, uint32_t number_disk, int mode)
|
||||
{
|
||||
if (pfilefunc->zfile_func64.zopendisk64_file != NULL)
|
||||
return (*(pfilefunc->zfile_func64.zopendisk64_file)) (pfilefunc->zfile_func64.opaque, filestream, number_disk, mode);
|
||||
return (*(pfilefunc->zopendisk32_file))(pfilefunc->zfile_func64.opaque, filestream, number_disk, mode);
|
||||
}
|
||||
|
||||
long call_zseek64(const zlib_filefunc64_32_def *pfilefunc, voidpf filestream, uint64_t offset, int origin)
|
||||
{
|
||||
uint32_t offset_truncated = 0;
|
||||
if (pfilefunc->zfile_func64.zseek64_file != NULL)
|
||||
return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin);
|
||||
else
|
||||
{
|
||||
uLong offsetTruncated = (uLong)offset;
|
||||
if (offsetTruncated != offset)
|
||||
return -1;
|
||||
else
|
||||
return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin);
|
||||
}
|
||||
offset_truncated = (uint32_t)offset;
|
||||
if (offset_truncated != offset)
|
||||
return -1;
|
||||
return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream, offset_truncated, origin);
|
||||
}
|
||||
|
||||
ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)
|
||||
uint64_t call_ztell64(const zlib_filefunc64_32_def *pfilefunc, voidpf filestream)
|
||||
{
|
||||
uint64_t position;
|
||||
if (pfilefunc->zfile_func64.zseek64_file != NULL)
|
||||
return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream);
|
||||
else
|
||||
{
|
||||
uLong tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream);
|
||||
if ((tell_uLong) == ((uLong)-1))
|
||||
return (ZPOS64_T)-1;
|
||||
else
|
||||
return tell_uLong;
|
||||
}
|
||||
return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque, filestream);
|
||||
position = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque, filestream);
|
||||
if ((position) == UINT32_MAX)
|
||||
return (uint64_t)-1;
|
||||
return position;
|
||||
}
|
||||
|
||||
void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32)
|
||||
void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def *p_filefunc64_32, const zlib_filefunc_def *p_filefunc32)
|
||||
{
|
||||
p_filefunc64_32->zfile_func64.zopen64_file = NULL;
|
||||
p_filefunc64_32->zfile_func64.zopendisk64_file = NULL;
|
||||
p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file;
|
||||
p_filefunc64_32->zopendisk32_file = p_filefunc32->zopendisk_file;
|
||||
p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
|
||||
p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file;
|
||||
p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file;
|
||||
@@ -70,149 +79,255 @@ void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filef
|
||||
p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file;
|
||||
}
|
||||
|
||||
static voidpf ZCALLBACK fopen_file_func(voidpf opaque, const char *filename, int mode);
|
||||
static uint32_t ZCALLBACK fread_file_func(voidpf opaque, voidpf stream, void* buf, uint32_t size);
|
||||
static uint32_t ZCALLBACK fwrite_file_func(voidpf opaque, voidpf stream, const void *buf, uint32_t size);
|
||||
static uint64_t ZCALLBACK ftell64_file_func(voidpf opaque, voidpf stream);
|
||||
static long ZCALLBACK fseek64_file_func(voidpf opaque, voidpf stream, uint64_t offset, int origin);
|
||||
static int ZCALLBACK fclose_file_func(voidpf opaque, voidpf stream);
|
||||
static int ZCALLBACK ferror_file_func(voidpf opaque, voidpf stream);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
FILE *file;
|
||||
int filenameLength;
|
||||
void *filename;
|
||||
} FILE_IOPOSIX;
|
||||
|
||||
static voidpf ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode));
|
||||
static uLong ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size));
|
||||
static uLong ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size));
|
||||
static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream));
|
||||
static long ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
|
||||
static int ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream));
|
||||
static int ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream));
|
||||
static voidpf file_build_ioposix(FILE *file, const char *filename)
|
||||
{
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
if (file == NULL)
|
||||
return NULL;
|
||||
ioposix = (FILE_IOPOSIX*)malloc(sizeof(FILE_IOPOSIX));
|
||||
ioposix->file = file;
|
||||
ioposix->filenameLength = (int)strlen(filename) + 1;
|
||||
ioposix->filename = (char*)malloc(ioposix->filenameLength * sizeof(char));
|
||||
strncpy((char*)ioposix->filename, filename, ioposix->filenameLength);
|
||||
return (voidpf)ioposix;
|
||||
}
|
||||
|
||||
static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode)
|
||||
static voidpf ZCALLBACK fopen_file_func(voidpf opaque, const char *filename, int mode)
|
||||
{
|
||||
FILE* file = NULL;
|
||||
const char* mode_fopen = NULL;
|
||||
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
|
||||
const char *mode_fopen = NULL;
|
||||
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ)
|
||||
mode_fopen = "rb";
|
||||
else
|
||||
if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
|
||||
else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
|
||||
mode_fopen = "r+b";
|
||||
else
|
||||
if (mode & ZLIB_FILEFUNC_MODE_CREATE)
|
||||
else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
|
||||
mode_fopen = "wb";
|
||||
|
||||
if ((filename!=NULL) && (mode_fopen != NULL))
|
||||
if ((filename != NULL) && (mode_fopen != NULL))
|
||||
{
|
||||
file = fopen(filename, mode_fopen);
|
||||
return file_build_ioposix(file, filename);
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode)
|
||||
static voidpf ZCALLBACK fopen64_file_func(voidpf opaque, const void *filename, int mode)
|
||||
{
|
||||
FILE* file = NULL;
|
||||
const char* mode_fopen = NULL;
|
||||
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
|
||||
const char *mode_fopen = NULL;
|
||||
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ)
|
||||
mode_fopen = "rb";
|
||||
else
|
||||
if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
|
||||
else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
|
||||
mode_fopen = "r+b";
|
||||
else
|
||||
if (mode & ZLIB_FILEFUNC_MODE_CREATE)
|
||||
else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
|
||||
mode_fopen = "wb";
|
||||
|
||||
if ((filename!=NULL) && (mode_fopen != NULL))
|
||||
if ((filename != NULL) && (mode_fopen != NULL))
|
||||
{
|
||||
file = fopen64((const char*)filename, mode_fopen);
|
||||
return file_build_ioposix(file, (const char*)filename);
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
|
||||
static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size)
|
||||
static voidpf ZCALLBACK fopendisk64_file_func(voidpf opaque, voidpf stream, uint32_t number_disk, int mode)
|
||||
{
|
||||
uLong ret;
|
||||
ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
char *diskFilename = NULL;
|
||||
voidpf ret = NULL;
|
||||
int i = 0;
|
||||
|
||||
if (stream == NULL)
|
||||
return NULL;
|
||||
ioposix = (FILE_IOPOSIX*)stream;
|
||||
diskFilename = (char*)malloc(ioposix->filenameLength * sizeof(char));
|
||||
strncpy(diskFilename, (const char*)ioposix->filename, ioposix->filenameLength);
|
||||
for (i = ioposix->filenameLength - 1; i >= 0; i -= 1)
|
||||
{
|
||||
if (diskFilename[i] != '.')
|
||||
continue;
|
||||
snprintf(&diskFilename[i], ioposix->filenameLength - i, ".z%02u", number_disk + 1);
|
||||
break;
|
||||
}
|
||||
if (i >= 0)
|
||||
ret = fopen64_file_func(opaque, diskFilename, mode);
|
||||
free(diskFilename);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size)
|
||||
static voidpf ZCALLBACK fopendisk_file_func(voidpf opaque, voidpf stream, uint32_t number_disk, int mode)
|
||||
{
|
||||
uLong ret;
|
||||
ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
char *diskFilename = NULL;
|
||||
voidpf ret = NULL;
|
||||
int i = 0;
|
||||
|
||||
if (stream == NULL)
|
||||
return NULL;
|
||||
ioposix = (FILE_IOPOSIX*)stream;
|
||||
diskFilename = (char*)malloc(ioposix->filenameLength * sizeof(char));
|
||||
strncpy(diskFilename, (const char*)ioposix->filename, ioposix->filenameLength);
|
||||
for (i = ioposix->filenameLength - 1; i >= 0; i -= 1)
|
||||
{
|
||||
if (diskFilename[i] != '.')
|
||||
continue;
|
||||
snprintf(&diskFilename[i], ioposix->filenameLength - i, ".z%02u", number_disk + 1);
|
||||
break;
|
||||
}
|
||||
if (i >= 0)
|
||||
ret = fopen_file_func(opaque, diskFilename, mode);
|
||||
free(diskFilename);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream)
|
||||
static uint32_t ZCALLBACK fread_file_func(voidpf opaque, voidpf stream, void* buf, uint32_t size)
|
||||
{
|
||||
long ret;
|
||||
ret = ftell((FILE *)stream);
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
uint32_t read = (uint32_t)-1;
|
||||
if (stream == NULL)
|
||||
return read;
|
||||
ioposix = (FILE_IOPOSIX*)stream;
|
||||
read = (uint32_t)fread(buf, 1, (size_t)size, ioposix->file);
|
||||
return read;
|
||||
}
|
||||
|
||||
static uint32_t ZCALLBACK fwrite_file_func(voidpf opaque, voidpf stream, const void *buf, uint32_t size)
|
||||
{
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
uint32_t written = (uint32_t)-1;
|
||||
if (stream == NULL)
|
||||
return written;
|
||||
ioposix = (FILE_IOPOSIX*)stream;
|
||||
written = (uint32_t)fwrite(buf, 1, (size_t)size, ioposix->file);
|
||||
return written;
|
||||
}
|
||||
|
||||
static long ZCALLBACK ftell_file_func(voidpf opaque, voidpf stream)
|
||||
{
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
long ret = -1;
|
||||
if (stream == NULL)
|
||||
return ret;
|
||||
ioposix = (FILE_IOPOSIX*)stream;
|
||||
ret = ftell(ioposix->file);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream)
|
||||
static uint64_t ZCALLBACK ftell64_file_func(voidpf opaque, voidpf stream)
|
||||
{
|
||||
ZPOS64_T ret;
|
||||
ret = ftello64((FILE *)stream);
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
uint64_t ret = (uint64_t)-1;
|
||||
if (stream == NULL)
|
||||
return ret;
|
||||
ioposix = (FILE_IOPOSIX*)stream;
|
||||
ret = ftello64(ioposix->file);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin)
|
||||
static long ZCALLBACK fseek_file_func(voidpf opaque, voidpf stream, uint32_t offset, int origin)
|
||||
{
|
||||
int fseek_origin=0;
|
||||
long ret;
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
int fseek_origin = 0;
|
||||
long ret = 0;
|
||||
|
||||
if (stream == NULL)
|
||||
return -1;
|
||||
ioposix = (FILE_IOPOSIX*)stream;
|
||||
|
||||
switch (origin)
|
||||
{
|
||||
case ZLIB_FILEFUNC_SEEK_CUR :
|
||||
fseek_origin = SEEK_CUR;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_END :
|
||||
fseek_origin = SEEK_END;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_SET :
|
||||
fseek_origin = SEEK_SET;
|
||||
break;
|
||||
default: return -1;
|
||||
case ZLIB_FILEFUNC_SEEK_CUR:
|
||||
fseek_origin = SEEK_CUR;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_END:
|
||||
fseek_origin = SEEK_END;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_SET:
|
||||
fseek_origin = SEEK_SET;
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
ret = 0;
|
||||
if (fseek((FILE *)stream, offset, fseek_origin) != 0)
|
||||
if (fseek(ioposix->file, offset, fseek_origin) != 0)
|
||||
ret = -1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)
|
||||
static long ZCALLBACK fseek64_file_func(voidpf opaque, voidpf stream, uint64_t offset, int origin)
|
||||
{
|
||||
int fseek_origin=0;
|
||||
long ret;
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
int fseek_origin = 0;
|
||||
long ret = 0;
|
||||
|
||||
if (stream == NULL)
|
||||
return -1;
|
||||
ioposix = (FILE_IOPOSIX*)stream;
|
||||
|
||||
switch (origin)
|
||||
{
|
||||
case ZLIB_FILEFUNC_SEEK_CUR :
|
||||
fseek_origin = SEEK_CUR;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_END :
|
||||
fseek_origin = SEEK_END;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_SET :
|
||||
fseek_origin = SEEK_SET;
|
||||
break;
|
||||
default: return -1;
|
||||
case ZLIB_FILEFUNC_SEEK_CUR:
|
||||
fseek_origin = SEEK_CUR;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_END:
|
||||
fseek_origin = SEEK_END;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_SET:
|
||||
fseek_origin = SEEK_SET;
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
ret = 0;
|
||||
|
||||
if(fseeko64((FILE *)stream, offset, fseek_origin) != 0)
|
||||
ret = -1;
|
||||
if (fseeko64(ioposix->file, offset, fseek_origin) != 0)
|
||||
ret = -1;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream)
|
||||
static int ZCALLBACK fclose_file_func(voidpf opaque, voidpf stream)
|
||||
{
|
||||
int ret;
|
||||
ret = fclose((FILE *)stream);
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
int ret = -1;
|
||||
if (stream == NULL)
|
||||
return ret;
|
||||
ioposix = (FILE_IOPOSIX*)stream;
|
||||
if (ioposix->filename != NULL)
|
||||
free(ioposix->filename);
|
||||
ret = fclose(ioposix->file);
|
||||
free(ioposix);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream)
|
||||
static int ZCALLBACK ferror_file_func(voidpf opaque, voidpf stream)
|
||||
{
|
||||
int ret;
|
||||
ret = ferror((FILE *)stream);
|
||||
FILE_IOPOSIX *ioposix = NULL;
|
||||
int ret = -1;
|
||||
if (stream == NULL)
|
||||
return ret;
|
||||
ioposix = (FILE_IOPOSIX*)stream;
|
||||
ret = ferror(ioposix->file);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void fill_fopen_filefunc (pzlib_filefunc_def)
|
||||
zlib_filefunc_def* pzlib_filefunc_def;
|
||||
void fill_fopen_filefunc(zlib_filefunc_def *pzlib_filefunc_def)
|
||||
{
|
||||
pzlib_filefunc_def->zopen_file = fopen_file_func;
|
||||
pzlib_filefunc_def->zopendisk_file = fopendisk_file_func;
|
||||
pzlib_filefunc_def->zread_file = fread_file_func;
|
||||
pzlib_filefunc_def->zwrite_file = fwrite_file_func;
|
||||
pzlib_filefunc_def->ztell_file = ftell_file_func;
|
||||
@@ -222,9 +337,10 @@ void fill_fopen_filefunc (pzlib_filefunc_def)
|
||||
pzlib_filefunc_def->opaque = NULL;
|
||||
}
|
||||
|
||||
void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def)
|
||||
void fill_fopen64_filefunc(zlib_filefunc64_def *pzlib_filefunc_def)
|
||||
{
|
||||
pzlib_filefunc_def->zopen64_file = fopen64_file_func;
|
||||
pzlib_filefunc_def->zopendisk64_file = fopendisk64_file_func;
|
||||
pzlib_filefunc_def->zread_file = fread_file_func;
|
||||
pzlib_filefunc_def->zwrite_file = fwrite_file_func;
|
||||
pzlib_filefunc_def->ztell64_file = ftell64_file_func;
|
||||
|
||||
218
MiniZip/ioapi.h
Normal file → Executable file
218
MiniZip/ioapi.h
Normal file → Executable file
@@ -1,201 +1,143 @@
|
||||
/* ioapi.h -- IO base function header for compress/uncompress .zip
|
||||
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
||||
part of the MiniZip project
|
||||
|
||||
Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
|
||||
|
||||
Modifications for Zip64 support
|
||||
Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
|
||||
|
||||
For more info read MiniZip_info.txt
|
||||
|
||||
Changes
|
||||
|
||||
Oct-2009 - Defined ZPOS64_T to fpos_t on windows and u_int64_t on linux. (might need to find a better why for this)
|
||||
Oct-2009 - Change to fseeko64, ftello64 and fopen64 so large files would work on linux.
|
||||
More if/def section may be needed to support other platforms
|
||||
Oct-2009 - Defined fxxxx64 calls to normal fopen/ftell/fseek so they would compile on windows.
|
||||
(but you should use iowin32.c for windows instead)
|
||||
Copyright (C) 1998-2010 Gilles Vollant
|
||||
http://www.winimage.com/zLibDll/minizip.html
|
||||
Modifications for Zip64 support
|
||||
Copyright (C) 2009-2010 Mathias Svensson
|
||||
http://result42.com
|
||||
|
||||
This program is distributed under the terms of the same license as zlib.
|
||||
See the accompanying LICENSE file for the full text of the license.
|
||||
*/
|
||||
|
||||
#ifndef _ZLIBIOAPI64_H
|
||||
#define _ZLIBIOAPI64_H
|
||||
|
||||
#if (!defined(_WIN32)) && (!defined(WIN32))
|
||||
|
||||
// Linux needs this to support file operation on files larger then 4+GB
|
||||
// But might need better if/def to select just the platforms that needs them.
|
||||
|
||||
#ifndef __USE_FILE_OFFSET64
|
||||
#define __USE_FILE_OFFSET64
|
||||
#endif
|
||||
#ifndef __USE_LARGEFILE64
|
||||
#define __USE_LARGEFILE64
|
||||
#endif
|
||||
#ifndef _LARGEFILE64_SOURCE
|
||||
#define _LARGEFILE64_SOURCE
|
||||
#endif
|
||||
#ifndef _FILE_OFFSET_BIT
|
||||
#define _FILE_OFFSET_BIT 64
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "zlib.h"
|
||||
|
||||
#ifdef __APPLE__
|
||||
# define USE_FILE32API
|
||||
#endif
|
||||
|
||||
#if defined(USE_FILE32API)
|
||||
#define fopen64 fopen
|
||||
#define ftello64 ftell
|
||||
#define fseeko64 fseek
|
||||
# define fopen64 fopen
|
||||
# define ftello64 ftell
|
||||
# define fseeko64 fseek
|
||||
#else
|
||||
#ifdef _MSC_VER
|
||||
#define fopen64 fopen
|
||||
#if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC)))
|
||||
#define ftello64 _ftelli64
|
||||
#define fseeko64 _fseeki64
|
||||
#else // old MSC
|
||||
#define ftello64 ftell
|
||||
#define fseeko64 fseek
|
||||
#endif
|
||||
# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__APPLE__)
|
||||
# define fopen64 fopen
|
||||
# define ftello64 ftello
|
||||
# define fseeko64 fseeko
|
||||
# endif
|
||||
# ifdef _MSC_VER
|
||||
# define fopen64 fopen
|
||||
# if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC)))
|
||||
# define ftello64 _ftelli64
|
||||
# define fseeko64 _fseeki64
|
||||
# else /* old MSC */
|
||||
# define ftello64 ftell
|
||||
# define fseeko64 fseek
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
#ifndef ZPOS64_T
|
||||
#ifdef _WIN32
|
||||
#define ZPOS64_T fpos_t
|
||||
#else
|
||||
#include <stdint.h>
|
||||
#define ZPOS64_T uint64_t
|
||||
#endif
|
||||
#endif
|
||||
*/
|
||||
|
||||
#ifdef HAVE_MINIZIP64_CONF_H
|
||||
#include "mz64conf.h"
|
||||
#endif
|
||||
|
||||
/* a type choosen by DEFINE */
|
||||
#ifdef HAVE_64BIT_INT_CUSTOM
|
||||
typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T;
|
||||
#else
|
||||
#ifdef HAS_STDINT_H
|
||||
#include "stdint.h"
|
||||
typedef uint64_t ZPOS64_T;
|
||||
#else
|
||||
|
||||
|
||||
#if defined(_MSC_VER) || defined(__BORLANDC__)
|
||||
typedef unsigned __int64 ZPOS64_T;
|
||||
#else
|
||||
typedef unsigned long long int ZPOS64_T;
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#define ZLIB_FILEFUNC_SEEK_CUR (1)
|
||||
#define ZLIB_FILEFUNC_SEEK_END (2)
|
||||
#define ZLIB_FILEFUNC_SEEK_SET (0)
|
||||
|
||||
#define ZLIB_FILEFUNC_MODE_READ (1)
|
||||
#define ZLIB_FILEFUNC_MODE_WRITE (2)
|
||||
#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
|
||||
|
||||
#define ZLIB_FILEFUNC_MODE_EXISTING (4)
|
||||
#define ZLIB_FILEFUNC_MODE_CREATE (8)
|
||||
|
||||
#define ZLIB_FILEFUNC_MODE_READ (1)
|
||||
#define ZLIB_FILEFUNC_MODE_WRITE (2)
|
||||
#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
|
||||
#define ZLIB_FILEFUNC_MODE_EXISTING (4)
|
||||
#define ZLIB_FILEFUNC_MODE_CREATE (8)
|
||||
|
||||
#ifndef ZCALLBACK
|
||||
#if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
|
||||
#define ZCALLBACK CALLBACK
|
||||
#else
|
||||
#define ZCALLBACK
|
||||
#endif
|
||||
# if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || \
|
||||
defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
|
||||
# define ZCALLBACK CALLBACK
|
||||
# else
|
||||
# define ZCALLBACK
|
||||
# endif
|
||||
#endif
|
||||
|
||||
typedef voidpf (ZCALLBACK *open_file_func) (voidpf opaque, const char *filename, int mode);
|
||||
typedef voidpf (ZCALLBACK *opendisk_file_func) (voidpf opaque, voidpf stream, uint32_t number_disk, int mode);
|
||||
typedef uint32_t (ZCALLBACK *read_file_func) (voidpf opaque, voidpf stream, void* buf, uint32_t size);
|
||||
typedef uint32_t (ZCALLBACK *write_file_func) (voidpf opaque, voidpf stream, const void *buf, uint32_t size);
|
||||
typedef int (ZCALLBACK *close_file_func) (voidpf opaque, voidpf stream);
|
||||
typedef int (ZCALLBACK *error_file_func) (voidpf opaque, voidpf stream);
|
||||
|
||||
|
||||
|
||||
typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode));
|
||||
typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size));
|
||||
typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
|
||||
typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream));
|
||||
typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
|
||||
|
||||
typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream));
|
||||
typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin));
|
||||
|
||||
typedef long (ZCALLBACK *tell_file_func) (voidpf opaque, voidpf stream);
|
||||
typedef long (ZCALLBACK *seek_file_func) (voidpf opaque, voidpf stream, uint32_t offset, int origin);
|
||||
|
||||
/* here is the "old" 32 bits structure structure */
|
||||
typedef struct zlib_filefunc_def_s
|
||||
{
|
||||
open_file_func zopen_file;
|
||||
opendisk_file_func zopendisk_file;
|
||||
read_file_func zread_file;
|
||||
write_file_func zwrite_file;
|
||||
tell_file_func ztell_file;
|
||||
seek_file_func zseek_file;
|
||||
close_file_func zclose_file;
|
||||
testerror_file_func zerror_file;
|
||||
error_file_func zerror_file;
|
||||
voidpf opaque;
|
||||
} zlib_filefunc_def;
|
||||
|
||||
typedef ZPOS64_T (ZCALLBACK *tell64_file_func) OF((voidpf opaque, voidpf stream));
|
||||
typedef long (ZCALLBACK *seek64_file_func) OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
|
||||
typedef voidpf (ZCALLBACK *open64_file_func) OF((voidpf opaque, const void* filename, int mode));
|
||||
typedef uint64_t (ZCALLBACK *tell64_file_func) (voidpf opaque, voidpf stream);
|
||||
typedef long (ZCALLBACK *seek64_file_func) (voidpf opaque, voidpf stream, uint64_t offset, int origin);
|
||||
typedef voidpf (ZCALLBACK *open64_file_func) (voidpf opaque, const void *filename, int mode);
|
||||
typedef voidpf (ZCALLBACK *opendisk64_file_func)(voidpf opaque, voidpf stream, uint32_t number_disk, int mode);
|
||||
|
||||
typedef struct zlib_filefunc64_def_s
|
||||
{
|
||||
open64_file_func zopen64_file;
|
||||
read_file_func zread_file;
|
||||
write_file_func zwrite_file;
|
||||
tell64_file_func ztell64_file;
|
||||
seek64_file_func zseek64_file;
|
||||
close_file_func zclose_file;
|
||||
testerror_file_func zerror_file;
|
||||
voidpf opaque;
|
||||
open64_file_func zopen64_file;
|
||||
opendisk64_file_func zopendisk64_file;
|
||||
read_file_func zread_file;
|
||||
write_file_func zwrite_file;
|
||||
tell64_file_func ztell64_file;
|
||||
seek64_file_func zseek64_file;
|
||||
close_file_func zclose_file;
|
||||
error_file_func zerror_file;
|
||||
voidpf opaque;
|
||||
} zlib_filefunc64_def;
|
||||
|
||||
void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def));
|
||||
void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
|
||||
void fill_fopen_filefunc(zlib_filefunc_def *pzlib_filefunc_def);
|
||||
void fill_fopen64_filefunc(zlib_filefunc64_def *pzlib_filefunc_def);
|
||||
|
||||
/* now internal definition, only for zip.c and unzip.h */
|
||||
typedef struct zlib_filefunc64_32_def_s
|
||||
{
|
||||
zlib_filefunc64_def zfile_func64;
|
||||
open_file_func zopen32_file;
|
||||
opendisk_file_func zopendisk32_file;
|
||||
tell_file_func ztell32_file;
|
||||
seek_file_func zseek32_file;
|
||||
} zlib_filefunc64_32_def;
|
||||
|
||||
#define ZREAD64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zread_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size))
|
||||
#define ZWRITE64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zwrite_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size))
|
||||
/*#define ZTELL64(filefunc,filestream) ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream))*/
|
||||
/*#define ZSEEK64(filefunc,filestream,pos,mode) ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode))*/
|
||||
#define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream))
|
||||
#define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream))
|
||||
|
||||
#define ZREAD64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zread_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size))
|
||||
#define ZWRITE64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zwrite_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size))
|
||||
//#define ZTELL64(filefunc,filestream) ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream))
|
||||
//#define ZSEEK64(filefunc,filestream,pos,mode) ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode))
|
||||
#define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream))
|
||||
#define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream))
|
||||
voidpf call_zopen64(const zlib_filefunc64_32_def *pfilefunc,const void*filename, int mode);
|
||||
voidpf call_zopendisk64(const zlib_filefunc64_32_def *pfilefunc, voidpf filestream, uint32_t number_disk, int mode);
|
||||
long call_zseek64(const zlib_filefunc64_32_def *pfilefunc, voidpf filestream, uint64_t offset, int origin);
|
||||
uint64_t call_ztell64(const zlib_filefunc64_32_def *pfilefunc, voidpf filestream);
|
||||
|
||||
voidpf call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode));
|
||||
long call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin));
|
||||
ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream));
|
||||
void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def *p_filefunc64_32, const zlib_filefunc_def *p_filefunc32);
|
||||
|
||||
void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32);
|
||||
|
||||
#define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode)))
|
||||
#define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream)))
|
||||
#define ZSEEK64(filefunc,filestream,pos,mode) (call_zseek64((&(filefunc)),(filestream),(pos),(mode)))
|
||||
#define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode)))
|
||||
#define ZOPENDISK64(filefunc,filestream,diskn,mode) (call_zopendisk64((&(filefunc)),(filestream),(diskn),(mode)))
|
||||
#define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream)))
|
||||
#define ZSEEK64(filefunc,filestream,pos,mode) (call_zseek64((&(filefunc)),(filestream),(pos),(mode)))
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -1,281 +0,0 @@
|
||||
/*
|
||||
Additional tools for Minizip
|
||||
Code: Xavier Roche '2004
|
||||
License: Same as ZLIB (www.gzip.org)
|
||||
*/
|
||||
|
||||
/* Code */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "zlib.h"
|
||||
#include "unzip.h"
|
||||
|
||||
#define READ_8(adr) ((unsigned char)*(adr))
|
||||
#define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) )
|
||||
#define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) )
|
||||
|
||||
#define WRITE_8(buff, n) do { \
|
||||
*((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \
|
||||
} while(0)
|
||||
#define WRITE_16(buff, n) do { \
|
||||
WRITE_8((unsigned char*)(buff), n); \
|
||||
WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \
|
||||
} while(0)
|
||||
#define WRITE_32(buff, n) do { \
|
||||
WRITE_16((unsigned char*)(buff), (n) & 0xffff); \
|
||||
WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \
|
||||
} while(0)
|
||||
|
||||
extern int ZEXPORT unzRepair(file, fileOut, fileOutTmp, nRecovered, bytesRecovered)
|
||||
const char* file;
|
||||
const char* fileOut;
|
||||
const char* fileOutTmp;
|
||||
uLong* nRecovered;
|
||||
uLong* bytesRecovered;
|
||||
{
|
||||
int err = Z_OK;
|
||||
FILE* fpZip = fopen(file, "rb");
|
||||
FILE* fpOut = fopen(fileOut, "wb");
|
||||
FILE* fpOutCD = fopen(fileOutTmp, "wb");
|
||||
if (fpZip != NULL && fpOut != NULL) {
|
||||
int entries = 0;
|
||||
uLong totalBytes = 0;
|
||||
char header[30];
|
||||
char filename[256];
|
||||
char extra[1024];
|
||||
int offset = 0;
|
||||
int offsetCD = 0;
|
||||
while ( fread(header, 1, 30, fpZip) == 30 ) {
|
||||
int currentOffset = offset;
|
||||
|
||||
/* File entry */
|
||||
if (READ_32(header) == 0x04034b50) {
|
||||
unsigned int version = READ_16(header + 4);
|
||||
unsigned int gpflag = READ_16(header + 6);
|
||||
unsigned int method = READ_16(header + 8);
|
||||
unsigned int filetime = READ_16(header + 10);
|
||||
unsigned int filedate = READ_16(header + 12);
|
||||
unsigned int crc = READ_32(header + 14); /* crc */
|
||||
unsigned int cpsize = READ_32(header + 18); /* compressed size */
|
||||
unsigned int uncpsize = READ_32(header + 22); /* uncompressed sz */
|
||||
unsigned int fnsize = READ_16(header + 26); /* file name length */
|
||||
unsigned int extsize = READ_16(header + 28); /* extra field length */
|
||||
filename[0] = extra[0] = '\0';
|
||||
|
||||
/* Header */
|
||||
if (fwrite(header, 1, 30, fpOut) == 30) {
|
||||
offset += 30;
|
||||
} else {
|
||||
err = Z_ERRNO;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Filename */
|
||||
if (fnsize > 0) {
|
||||
if (fread(filename, 1, fnsize, fpZip) == fnsize) {
|
||||
if (fwrite(filename, 1, fnsize, fpOut) == fnsize) {
|
||||
offset += fnsize;
|
||||
} else {
|
||||
err = Z_ERRNO;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
err = Z_ERRNO;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
err = Z_STREAM_ERROR;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Extra field */
|
||||
if (extsize > 0) {
|
||||
if (fread(extra, 1, extsize, fpZip) == extsize) {
|
||||
if (fwrite(extra, 1, extsize, fpOut) == extsize) {
|
||||
offset += extsize;
|
||||
} else {
|
||||
err = Z_ERRNO;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
err = Z_ERRNO;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Data */
|
||||
{
|
||||
int dataSize = cpsize;
|
||||
if (dataSize == 0) {
|
||||
dataSize = uncpsize;
|
||||
}
|
||||
if (dataSize > 0) {
|
||||
char* data = malloc(dataSize);
|
||||
if (data != NULL) {
|
||||
if ((int)fread(data, 1, dataSize, fpZip) == dataSize) {
|
||||
if ((int)fwrite(data, 1, dataSize, fpOut) == dataSize) {
|
||||
offset += dataSize;
|
||||
totalBytes += dataSize;
|
||||
} else {
|
||||
err = Z_ERRNO;
|
||||
}
|
||||
} else {
|
||||
err = Z_ERRNO;
|
||||
}
|
||||
free(data);
|
||||
if (err != Z_OK) {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
err = Z_MEM_ERROR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Central directory entry */
|
||||
{
|
||||
char header[46];
|
||||
char* comment = "";
|
||||
int comsize = (int) strlen(comment);
|
||||
WRITE_32(header, 0x02014b50);
|
||||
WRITE_16(header + 4, version);
|
||||
WRITE_16(header + 6, version);
|
||||
WRITE_16(header + 8, gpflag);
|
||||
WRITE_16(header + 10, method);
|
||||
WRITE_16(header + 12, filetime);
|
||||
WRITE_16(header + 14, filedate);
|
||||
WRITE_32(header + 16, crc);
|
||||
WRITE_32(header + 20, cpsize);
|
||||
WRITE_32(header + 24, uncpsize);
|
||||
WRITE_16(header + 28, fnsize);
|
||||
WRITE_16(header + 30, extsize);
|
||||
WRITE_16(header + 32, comsize);
|
||||
WRITE_16(header + 34, 0); /* disk # */
|
||||
WRITE_16(header + 36, 0); /* int attrb */
|
||||
WRITE_32(header + 38, 0); /* ext attrb */
|
||||
WRITE_32(header + 42, currentOffset);
|
||||
/* Header */
|
||||
if (fwrite(header, 1, 46, fpOutCD) == 46) {
|
||||
offsetCD += 46;
|
||||
|
||||
/* Filename */
|
||||
if (fnsize > 0) {
|
||||
if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) {
|
||||
offsetCD += fnsize;
|
||||
} else {
|
||||
err = Z_ERRNO;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
err = Z_STREAM_ERROR;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Extra field */
|
||||
if (extsize > 0) {
|
||||
if (fwrite(extra, 1, extsize, fpOutCD) == extsize) {
|
||||
offsetCD += extsize;
|
||||
} else {
|
||||
err = Z_ERRNO;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Comment field */
|
||||
if (comsize > 0) {
|
||||
if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) {
|
||||
offsetCD += comsize;
|
||||
} else {
|
||||
err = Z_ERRNO;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
err = Z_ERRNO;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Success */
|
||||
entries++;
|
||||
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Final central directory */
|
||||
{
|
||||
int entriesZip = entries;
|
||||
char header[22];
|
||||
char* comment = ""; // "ZIP File recovered by zlib/minizip/mztools";
|
||||
int comsize = (int) strlen(comment);
|
||||
if (entriesZip > 0xffff) {
|
||||
entriesZip = 0xffff;
|
||||
}
|
||||
WRITE_32(header, 0x06054b50);
|
||||
WRITE_16(header + 4, 0); /* disk # */
|
||||
WRITE_16(header + 6, 0); /* disk # */
|
||||
WRITE_16(header + 8, entriesZip); /* hack */
|
||||
WRITE_16(header + 10, entriesZip); /* hack */
|
||||
WRITE_32(header + 12, offsetCD); /* size of CD */
|
||||
WRITE_32(header + 16, offset); /* offset to CD */
|
||||
WRITE_16(header + 20, comsize); /* comment */
|
||||
|
||||
/* Header */
|
||||
if (fwrite(header, 1, 22, fpOutCD) == 22) {
|
||||
|
||||
/* Comment field */
|
||||
if (comsize > 0) {
|
||||
if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) {
|
||||
err = Z_ERRNO;
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
err = Z_ERRNO;
|
||||
}
|
||||
}
|
||||
|
||||
/* Final merge (file + central directory) */
|
||||
fclose(fpOutCD);
|
||||
if (err == Z_OK) {
|
||||
fpOutCD = fopen(fileOutTmp, "rb");
|
||||
if (fpOutCD != NULL) {
|
||||
int nRead;
|
||||
char buffer[8192];
|
||||
while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) {
|
||||
if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) {
|
||||
err = Z_ERRNO;
|
||||
break;
|
||||
}
|
||||
}
|
||||
fclose(fpOutCD);
|
||||
}
|
||||
}
|
||||
|
||||
/* Close */
|
||||
fclose(fpZip);
|
||||
fclose(fpOut);
|
||||
|
||||
/* Wipe temporary file */
|
||||
(void)remove(fileOutTmp);
|
||||
|
||||
/* Number of recovered entries */
|
||||
if (err == Z_OK) {
|
||||
if (nRecovered != NULL) {
|
||||
*nRecovered = entries;
|
||||
}
|
||||
if (bytesRecovered != NULL) {
|
||||
*bytesRecovered = totalBytes;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
err = Z_STREAM_ERROR;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
Additional tools for Minizip
|
||||
Code: Xavier Roche '2004
|
||||
License: Same as ZLIB (www.gzip.org)
|
||||
*/
|
||||
|
||||
#ifndef _zip_tools_H
|
||||
#define _zip_tools_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef _ZLIB_H
|
||||
#include "zlib.h"
|
||||
#endif
|
||||
|
||||
#include "unzip.h"
|
||||
|
||||
/* Repair a ZIP file (missing central directory)
|
||||
file: file to recover
|
||||
fileOut: output file after recovery
|
||||
fileOutTmp: temporary file name used for recovery
|
||||
*/
|
||||
extern int ZEXPORT unzRepair(const char* file,
|
||||
const char* fileOut,
|
||||
const char* fileOutTmp,
|
||||
uLong* nRecovered,
|
||||
uLong* bytesRecovered);
|
||||
|
||||
#endif
|
||||
3174
MiniZip/unzip.c
3174
MiniZip/unzip.c
File diff suppressed because it is too large
Load Diff
541
MiniZip/unzip.h
541
MiniZip/unzip.h
@@ -1,47 +1,21 @@
|
||||
/* unzip.h -- IO for uncompress .zip files using zlib
|
||||
Version 1.1, February 14h, 2010
|
||||
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
||||
part of the MiniZip project
|
||||
|
||||
Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
|
||||
|
||||
Modifications of Unzip for Zip64
|
||||
Copyright (C) 2007-2008 Even Rouault
|
||||
|
||||
Modifications for Zip64 support on both zip and unzip
|
||||
Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
|
||||
|
||||
For more info read MiniZip_info.txt
|
||||
|
||||
---------------------------------------------------------------------------------
|
||||
|
||||
Condition of use and distribution are the same than zlib :
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
|
||||
---------------------------------------------------------------------------------
|
||||
|
||||
Changes
|
||||
|
||||
See header of unzip64.c
|
||||
Copyright (C) 1998-2010 Gilles Vollant
|
||||
http://www.winimage.com/zLibDll/minizip.html
|
||||
Modifications of Unzip for Zip64
|
||||
Copyright (C) 2007-2008 Even Rouault
|
||||
Modifications for Zip64 support on both zip and unzip
|
||||
Copyright (C) 2009-2010 Mathias Svensson
|
||||
http://result42.com
|
||||
|
||||
This program is distributed under the terms of the same license as zlib.
|
||||
See the accompanying LICENSE file for the full text of the license.
|
||||
*/
|
||||
|
||||
#ifndef _unz64_H
|
||||
#define _unz64_H
|
||||
#ifndef _UNZ_H
|
||||
#define _UNZ_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -51,7 +25,7 @@ extern "C" {
|
||||
#include "zlib.h"
|
||||
#endif
|
||||
|
||||
#ifndef _ZLIBIOAPI_H
|
||||
#ifndef _ZLIBIOAPI_H
|
||||
#include "ioapi.h"
|
||||
#endif
|
||||
|
||||
@@ -64,13 +38,12 @@ extern "C" {
|
||||
#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
|
||||
/* like the STRICT of WIN32, we define a pointer that cannot be converted
|
||||
from (void*) without cast */
|
||||
typedef struct TagunzFile__ { int unused; } unzFile__;
|
||||
typedef unzFile__ *unzFile;
|
||||
typedef struct TagunzFile__ { int unused; } unz_file__;
|
||||
typedef unz_file__ *unzFile;
|
||||
#else
|
||||
typedef voidp unzFile;
|
||||
#endif
|
||||
|
||||
|
||||
#define UNZ_OK (0)
|
||||
#define UNZ_END_OF_LIST_OF_FILE (-100)
|
||||
#define UNZ_ERRNO (Z_ERRNO)
|
||||
@@ -79,359 +52,255 @@ typedef voidp unzFile;
|
||||
#define UNZ_BADZIPFILE (-103)
|
||||
#define UNZ_INTERNALERROR (-104)
|
||||
#define UNZ_CRCERROR (-105)
|
||||
|
||||
/* tm_unz contain date/time info */
|
||||
typedef struct tm_unz_s
|
||||
{
|
||||
uInt tm_sec; /* seconds after the minute - [0,59] */
|
||||
uInt tm_min; /* minutes after the hour - [0,59] */
|
||||
uInt tm_hour; /* hours since midnight - [0,23] */
|
||||
uInt tm_mday; /* day of the month - [1,31] */
|
||||
uInt tm_mon; /* months since January - [0,11] */
|
||||
uInt tm_year; /* years - [1980..2044] */
|
||||
} tm_unz;
|
||||
#define UNZ_BADPASSWORD (-106)
|
||||
|
||||
/* unz_global_info structure contain global data about the ZIPfile
|
||||
These data comes from the end of central dir */
|
||||
typedef struct unz_global_info64_s
|
||||
{
|
||||
ZPOS64_T number_entry; /* total number of entries in
|
||||
the central dir on this disk */
|
||||
uLong size_comment; /* size of the global comment of the zipfile */
|
||||
uint64_t number_entry; /* total number of entries in the central dir on this disk */
|
||||
uint32_t number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP*/
|
||||
uint16_t size_comment; /* size of the global comment of the zipfile */
|
||||
} unz_global_info64;
|
||||
|
||||
typedef struct unz_global_info_s
|
||||
{
|
||||
uLong number_entry; /* total number of entries in
|
||||
the central dir on this disk */
|
||||
uLong size_comment; /* size of the global comment of the zipfile */
|
||||
uint32_t number_entry; /* total number of entries in the central dir on this disk */
|
||||
uint32_t number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP*/
|
||||
uint16_t size_comment; /* size of the global comment of the zipfile */
|
||||
} unz_global_info;
|
||||
|
||||
/* unz_file_info contain information about a file in the zipfile */
|
||||
typedef struct unz_file_info64_s
|
||||
{
|
||||
uLong version; /* version made by 2 bytes */
|
||||
uLong version_needed; /* version needed to extract 2 bytes */
|
||||
uLong flag; /* general purpose bit flag 2 bytes */
|
||||
uLong compression_method; /* compression method 2 bytes */
|
||||
uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
|
||||
uLong crc; /* crc-32 4 bytes */
|
||||
ZPOS64_T compressed_size; /* compressed size 8 bytes */
|
||||
ZPOS64_T uncompressed_size; /* uncompressed size 8 bytes */
|
||||
uLong size_filename; /* filename length 2 bytes */
|
||||
uLong size_file_extra; /* extra field length 2 bytes */
|
||||
uLong size_file_comment; /* file comment length 2 bytes */
|
||||
uint16_t version; /* version made by 2 bytes */
|
||||
uint16_t version_needed; /* version needed to extract 2 bytes */
|
||||
uint16_t flag; /* general purpose bit flag 2 bytes */
|
||||
uint16_t compression_method; /* compression method 2 bytes */
|
||||
uint32_t dos_date; /* last mod file date in Dos fmt 4 bytes */
|
||||
uint32_t crc; /* crc-32 4 bytes */
|
||||
uint64_t compressed_size; /* compressed size 8 bytes */
|
||||
uint64_t uncompressed_size; /* uncompressed size 8 bytes */
|
||||
uint16_t size_filename; /* filename length 2 bytes */
|
||||
uint16_t size_file_extra; /* extra field length 2 bytes */
|
||||
uint16_t size_file_comment; /* file comment length 2 bytes */
|
||||
|
||||
uLong disk_num_start; /* disk number start 2 bytes */
|
||||
uLong internal_fa; /* internal file attributes 2 bytes */
|
||||
uLong external_fa; /* external file attributes 4 bytes */
|
||||
uint32_t disk_num_start; /* disk number start 4 bytes */
|
||||
uint16_t internal_fa; /* internal file attributes 2 bytes */
|
||||
uint32_t external_fa; /* external file attributes 4 bytes */
|
||||
|
||||
tm_unz tmu_date;
|
||||
uint64_t disk_offset;
|
||||
|
||||
uint16_t size_file_extra_internal;
|
||||
} unz_file_info64;
|
||||
|
||||
typedef struct unz_file_info_s
|
||||
{
|
||||
uLong version; /* version made by 2 bytes */
|
||||
uLong version_needed; /* version needed to extract 2 bytes */
|
||||
uLong flag; /* general purpose bit flag 2 bytes */
|
||||
uLong compression_method; /* compression method 2 bytes */
|
||||
uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
|
||||
uLong crc; /* crc-32 4 bytes */
|
||||
uLong compressed_size; /* compressed size 4 bytes */
|
||||
uLong uncompressed_size; /* uncompressed size 4 bytes */
|
||||
uLong size_filename; /* filename length 2 bytes */
|
||||
uLong size_file_extra; /* extra field length 2 bytes */
|
||||
uLong size_file_comment; /* file comment length 2 bytes */
|
||||
uint16_t version; /* version made by 2 bytes */
|
||||
uint16_t version_needed; /* version needed to extract 2 bytes */
|
||||
uint16_t flag; /* general purpose bit flag 2 bytes */
|
||||
uint16_t compression_method; /* compression method 2 bytes */
|
||||
uint32_t dos_date; /* last mod file date in Dos fmt 4 bytes */
|
||||
uint32_t crc; /* crc-32 4 bytes */
|
||||
uint32_t compressed_size; /* compressed size 4 bytes */
|
||||
uint32_t uncompressed_size; /* uncompressed size 4 bytes */
|
||||
uint16_t size_filename; /* filename length 2 bytes */
|
||||
uint16_t size_file_extra; /* extra field length 2 bytes */
|
||||
uint16_t size_file_comment; /* file comment length 2 bytes */
|
||||
|
||||
uLong disk_num_start; /* disk number start 2 bytes */
|
||||
uLong internal_fa; /* internal file attributes 2 bytes */
|
||||
uLong external_fa; /* external file attributes 4 bytes */
|
||||
uint16_t disk_num_start; /* disk number start 2 bytes */
|
||||
uint16_t internal_fa; /* internal file attributes 2 bytes */
|
||||
uint32_t external_fa; /* external file attributes 4 bytes */
|
||||
|
||||
tm_unz tmu_date;
|
||||
uint64_t disk_offset;
|
||||
} unz_file_info;
|
||||
|
||||
extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
|
||||
const char* fileName2,
|
||||
int iCaseSensitivity));
|
||||
/*
|
||||
Compare two filename (fileName1,fileName2).
|
||||
If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
|
||||
If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
|
||||
or strcasecmp)
|
||||
If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
|
||||
(like 1 on Unix, 2 on Windows)
|
||||
*/
|
||||
/***************************************************************************/
|
||||
/* Opening and close a zip file */
|
||||
|
||||
extern unzFile ZEXPORT unzOpen(const char *path);
|
||||
extern unzFile ZEXPORT unzOpen64(const void *path);
|
||||
/* Open a Zip file.
|
||||
|
||||
extern unzFile ZEXPORT unzOpen OF((const char *path));
|
||||
extern unzFile ZEXPORT unzOpen64 OF((const void *path));
|
||||
/*
|
||||
Open a Zip file. path contain the full pathname (by example,
|
||||
on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer
|
||||
"zlib/zlib113.zip".
|
||||
If the zipfile cannot be opened (file don't exist or in not valid), the
|
||||
return value is NULL.
|
||||
Else, the return value is a unzFile Handle, usable with other function
|
||||
of this unzip package.
|
||||
the "64" function take a const void* pointer, because the path is just the
|
||||
value passed to the open64_file_func callback.
|
||||
Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path
|
||||
is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char*
|
||||
does not describe the reality
|
||||
*/
|
||||
path should contain the full path (by example, on a Windows XP computer
|
||||
"c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip".
|
||||
return NULL if zipfile cannot be opened or doesn't exist
|
||||
return unzFile handle if no error
|
||||
|
||||
NOTE: The "64" function take a const void *pointer, because the path is just the value passed to the
|
||||
open64_file_func callback. Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path
|
||||
is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char *does not describe the reality */
|
||||
|
||||
extern unzFile ZEXPORT unzOpen2 OF((const char *path,
|
||||
zlib_filefunc_def* pzlib_filefunc_def));
|
||||
/*
|
||||
Open a Zip file, like unzOpen, but provide a set of file low level API
|
||||
for read/write the zip file (see ioapi.h)
|
||||
*/
|
||||
extern unzFile ZEXPORT unzOpen2(const char *path, zlib_filefunc_def *pzlib_filefunc_def);
|
||||
/* Open a Zip file, like unzOpen, but provide a set of file low level API for read/write operations */
|
||||
extern unzFile ZEXPORT unzOpen2_64(const void *path, zlib_filefunc64_def *pzlib_filefunc_def);
|
||||
/* Open a Zip file, like unz64Open, but provide a set of file low level API for read/write 64-bit operations */
|
||||
|
||||
extern unzFile ZEXPORT unzOpen2_64 OF((const void *path,
|
||||
zlib_filefunc64_def* pzlib_filefunc_def));
|
||||
/*
|
||||
Open a Zip file, like unz64Open, but provide a set of file low level API
|
||||
for read/write the zip file (see ioapi.h)
|
||||
*/
|
||||
extern int ZEXPORT unzClose(unzFile file);
|
||||
/* Close a ZipFile opened with unzOpen. If there is files inside the .Zip opened with unzOpenCurrentFile,
|
||||
these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
|
||||
|
||||
extern int ZEXPORT unzClose OF((unzFile file));
|
||||
/*
|
||||
Close a ZipFile opened with unzipOpen.
|
||||
If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
|
||||
these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
|
||||
return UNZ_OK if there is no problem. */
|
||||
return UNZ_OK if there is no error */
|
||||
|
||||
extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
|
||||
unz_global_info *pglobal_info));
|
||||
extern int ZEXPORT unzGetGlobalInfo(unzFile file, unz_global_info *pglobal_info);
|
||||
extern int ZEXPORT unzGetGlobalInfo64(unzFile file, unz_global_info64 *pglobal_info);
|
||||
/* Write info about the ZipFile in the *pglobal_info structure.
|
||||
|
||||
extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file,
|
||||
unz_global_info64 *pglobal_info));
|
||||
/*
|
||||
Write info about the ZipFile in the *pglobal_info structure.
|
||||
No preparation of the structure is needed
|
||||
return UNZ_OK if there is no problem. */
|
||||
return UNZ_OK if no error */
|
||||
|
||||
extern int ZEXPORT unzGetGlobalComment(unzFile file, char *comment, uint16_t comment_size);
|
||||
/* Get the global comment string of the ZipFile, in the comment buffer.
|
||||
|
||||
extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
|
||||
char *szComment,
|
||||
uLong uSizeBuf));
|
||||
/*
|
||||
Get the global comment string of the ZipFile, in the szComment buffer.
|
||||
uSizeBuf is the size of the szComment buffer.
|
||||
return the number of byte copied or an error code <0
|
||||
*/
|
||||
|
||||
uSizeBuf is the size of the szComment buffer.
|
||||
return the number of byte copied or an error code <0 */
|
||||
|
||||
/***************************************************************************/
|
||||
/* Unzip package allow you browse the directory of the zipfile */
|
||||
/* Reading the content of the current zipfile, you can open it, read data from it, and close it
|
||||
(you can close it before reading all the file) */
|
||||
|
||||
extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
|
||||
/*
|
||||
Set the current file of the zipfile to the first file.
|
||||
return UNZ_OK if there is no problem
|
||||
*/
|
||||
extern int ZEXPORT unzOpenCurrentFile(unzFile file);
|
||||
/* Open for reading data the current file in the zipfile.
|
||||
|
||||
extern int ZEXPORT unzGoToNextFile OF((unzFile file));
|
||||
/*
|
||||
Set the current file of the zipfile to the next file.
|
||||
return UNZ_OK if there is no problem
|
||||
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
|
||||
*/
|
||||
return UNZ_OK if no error */
|
||||
|
||||
extern int ZEXPORT unzLocateFile OF((unzFile file,
|
||||
const char *szFileName,
|
||||
int iCaseSensitivity));
|
||||
/*
|
||||
Try locate the file szFileName in the zipfile.
|
||||
For the iCaseSensitivity signification, see unzStringFileNameCompare
|
||||
extern int ZEXPORT unzOpenCurrentFilePassword(unzFile file, const char *password);
|
||||
/* Open for reading data the current file in the zipfile.
|
||||
password is a crypting password
|
||||
|
||||
return value :
|
||||
UNZ_OK if the file is found. It becomes the current file.
|
||||
UNZ_END_OF_LIST_OF_FILE if the file is not found
|
||||
*/
|
||||
return UNZ_OK if no error */
|
||||
|
||||
extern int ZEXPORT unzOpenCurrentFile2(unzFile file, int *method, int *level, int raw);
|
||||
/* Same as unzOpenCurrentFile, but open for read raw the file (not uncompress)
|
||||
if raw==1 *method will receive method of compression, *level will receive level of compression
|
||||
|
||||
NOTE: you can set level parameter as NULL (if you did not want known level,
|
||||
but you CANNOT set method parameter as NULL */
|
||||
|
||||
extern int ZEXPORT unzOpenCurrentFile3(unzFile file, int *method, int *level, int raw, const char *password);
|
||||
/* Same as unzOpenCurrentFile, but takes extra parameter password for encrypted files */
|
||||
|
||||
extern int ZEXPORT unzReadCurrentFile(unzFile file, voidp buf, uint32_t len);
|
||||
/* Read bytes from the current file (opened by unzOpenCurrentFile)
|
||||
buf contain buffer where data must be copied
|
||||
len the size of buf.
|
||||
|
||||
return the number of byte copied if somes bytes are copied
|
||||
return 0 if the end of file was reached
|
||||
return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */
|
||||
|
||||
extern int ZEXPORT unzGetCurrentFileInfo(unzFile file, unz_file_info *pfile_info, char *filename,
|
||||
uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size);
|
||||
extern int ZEXPORT unzGetCurrentFileInfo64(unzFile file, unz_file_info64 *pfile_info, char *filename,
|
||||
uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size);
|
||||
/* Get Info about the current file
|
||||
|
||||
pfile_info if != NULL, the *pfile_info structure will contain somes info about the current file
|
||||
filename if != NULL, the file name string will be copied in filename
|
||||
filename_size is the size of the filename buffer
|
||||
extrafield if != NULL, the extra field information from the central header will be copied in to
|
||||
extrafield_size is the size of the extraField buffer
|
||||
comment if != NULL, the comment string of the file will be copied in to
|
||||
comment_size is the size of the comment buffer */
|
||||
|
||||
extern int ZEXPORT unzGetLocalExtrafield(unzFile file, voidp buf, uint32_t len);
|
||||
/* Read extra field from the current file (opened by unzOpenCurrentFile)
|
||||
This is the local-header version of the extra field (sometimes, there is
|
||||
more info in the local-header version than in the central-header)
|
||||
|
||||
if buf == NULL, it return the size of the local extra field
|
||||
if buf != NULL, len is the size of the buffer, the extra header is copied in buf.
|
||||
|
||||
return number of bytes copied in buf, or (if <0) the error code */
|
||||
|
||||
extern int ZEXPORT unzCloseCurrentFile(unzFile file);
|
||||
/* Close the file in zip opened with unzOpenCurrentFile
|
||||
|
||||
return UNZ_CRCERROR if all the file was read but the CRC is not good */
|
||||
|
||||
/***************************************************************************/
|
||||
/* Browse the directory of the zipfile */
|
||||
|
||||
typedef int (*unzFileNameComparer)(unzFile file, const char *filename1, const char *filename2);
|
||||
typedef int (*unzIteratorFunction)(unzFile file);
|
||||
typedef int (*unzIteratorFunction2)(unzFile file, unz_file_info64 *pfile_info, char *filename,
|
||||
uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size);
|
||||
|
||||
extern int ZEXPORT unzGoToFirstFile(unzFile file);
|
||||
/* Set the current file of the zipfile to the first file.
|
||||
|
||||
return UNZ_OK if no error */
|
||||
|
||||
extern int ZEXPORT unzGoToFirstFile2(unzFile file, unz_file_info64 *pfile_info, char *filename,
|
||||
uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size);
|
||||
/* Set the current file of the zipfile to the first file and retrieves the current info on success.
|
||||
Not as seek intensive as unzGoToFirstFile + unzGetCurrentFileInfo.
|
||||
|
||||
return UNZ_OK if no error */
|
||||
|
||||
extern int ZEXPORT unzGoToNextFile(unzFile file);
|
||||
/* Set the current file of the zipfile to the next file.
|
||||
|
||||
return UNZ_OK if no error
|
||||
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest */
|
||||
|
||||
extern int ZEXPORT unzGoToNextFile2(unzFile file, unz_file_info64 *pfile_info, char *filename,
|
||||
uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size);
|
||||
/* Set the current file of the zipfile to the next file and retrieves the current
|
||||
info on success. Does less seeking around than unzGotoNextFile + unzGetCurrentFileInfo.
|
||||
|
||||
return UNZ_OK if no error
|
||||
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest */
|
||||
|
||||
extern int ZEXPORT unzLocateFile(unzFile file, const char *filename, unzFileNameComparer filename_compare_func);
|
||||
/* Try locate the file szFileName in the zipfile. For custom filename comparison pass in comparison function.
|
||||
|
||||
return UNZ_OK if the file is found (it becomes the current file)
|
||||
return UNZ_END_OF_LIST_OF_FILE if the file is not found */
|
||||
|
||||
/***************************************************************************/
|
||||
/* Raw access to zip file */
|
||||
|
||||
/* ****************************************** */
|
||||
/* Ryan supplied functions */
|
||||
/* unz_file_info contain information about a file in the zipfile */
|
||||
typedef struct unz_file_pos_s
|
||||
{
|
||||
uLong pos_in_zip_directory; /* offset in zip file directory */
|
||||
uLong num_of_file; /* # of file */
|
||||
uint32_t pos_in_zip_directory; /* offset in zip file directory */
|
||||
uint32_t num_of_file; /* # of file */
|
||||
} unz_file_pos;
|
||||
|
||||
extern int ZEXPORT unzGetFilePos(
|
||||
unzFile file,
|
||||
unz_file_pos* file_pos);
|
||||
|
||||
extern int ZEXPORT unzGoToFilePos(
|
||||
unzFile file,
|
||||
unz_file_pos* file_pos);
|
||||
extern int ZEXPORT unzGetFilePos(unzFile file, unz_file_pos *file_pos);
|
||||
extern int ZEXPORT unzGoToFilePos(unzFile file, unz_file_pos *file_pos);
|
||||
|
||||
typedef struct unz64_file_pos_s
|
||||
{
|
||||
ZPOS64_T pos_in_zip_directory; /* offset in zip file directory */
|
||||
ZPOS64_T num_of_file; /* # of file */
|
||||
uint64_t pos_in_zip_directory; /* offset in zip file directory */
|
||||
uint64_t num_of_file; /* # of file */
|
||||
} unz64_file_pos;
|
||||
|
||||
extern int ZEXPORT unzGetFilePos64(
|
||||
unzFile file,
|
||||
unz64_file_pos* file_pos);
|
||||
|
||||
extern int ZEXPORT unzGoToFilePos64(
|
||||
unzFile file,
|
||||
const unz64_file_pos* file_pos);
|
||||
|
||||
/* ****************************************** */
|
||||
|
||||
extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file,
|
||||
unz_file_info64 *pfile_info,
|
||||
char *szFileName,
|
||||
uLong fileNameBufferSize,
|
||||
void *extraField,
|
||||
uLong extraFieldBufferSize,
|
||||
char *szComment,
|
||||
uLong commentBufferSize));
|
||||
|
||||
extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
|
||||
unz_file_info *pfile_info,
|
||||
char *szFileName,
|
||||
uLong fileNameBufferSize,
|
||||
void *extraField,
|
||||
uLong extraFieldBufferSize,
|
||||
char *szComment,
|
||||
uLong commentBufferSize));
|
||||
/*
|
||||
Get Info about the current file
|
||||
if pfile_info!=NULL, the *pfile_info structure will contain somes info about
|
||||
the current file
|
||||
if szFileName!=NULL, the filemane string will be copied in szFileName
|
||||
(fileNameBufferSize is the size of the buffer)
|
||||
if extraField!=NULL, the extra field information will be copied in extraField
|
||||
(extraFieldBufferSize is the size of the buffer).
|
||||
This is the Central-header version of the extra field
|
||||
if szComment!=NULL, the comment string of the file will be copied in szComment
|
||||
(commentBufferSize is the size of the buffer)
|
||||
*/
|
||||
|
||||
|
||||
/** Addition for GDAL : START */
|
||||
|
||||
extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file));
|
||||
|
||||
/** Addition for GDAL : END */
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* for reading the content of the current zipfile, you can open it, read data
|
||||
from it, and close it (you can close it before reading all the file)
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
|
||||
/*
|
||||
Open for reading data the current file in the zipfile.
|
||||
If there is no error, the return value is UNZ_OK.
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file,
|
||||
const char* password));
|
||||
/*
|
||||
Open for reading data the current file in the zipfile.
|
||||
password is a crypting password
|
||||
If there is no error, the return value is UNZ_OK.
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file,
|
||||
int* method,
|
||||
int* level,
|
||||
int raw));
|
||||
/*
|
||||
Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
|
||||
if raw==1
|
||||
*method will receive method of compression, *level will receive level of
|
||||
compression
|
||||
note : you can set level parameter as NULL (if you did not want known level,
|
||||
but you CANNOT set method parameter as NULL
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file,
|
||||
int* method,
|
||||
int* level,
|
||||
int raw,
|
||||
const char* password));
|
||||
/*
|
||||
Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
|
||||
if raw==1
|
||||
*method will receive method of compression, *level will receive level of
|
||||
compression
|
||||
note : you can set level parameter as NULL (if you did not want known level,
|
||||
but you CANNOT set method parameter as NULL
|
||||
*/
|
||||
|
||||
|
||||
extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
|
||||
/*
|
||||
Close the file in zip opened with unzOpenCurrentFile
|
||||
Return UNZ_CRCERROR if all the file was read but the CRC is not good
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzReadCurrentFile OF((unzFile file,
|
||||
voidp buf,
|
||||
unsigned len));
|
||||
/*
|
||||
Read bytes from the current file (opened by unzOpenCurrentFile)
|
||||
buf contain buffer where data must be copied
|
||||
len the size of buf.
|
||||
|
||||
return the number of byte copied if somes bytes are copied
|
||||
return 0 if the end of file was reached
|
||||
return <0 with error code if there is an error
|
||||
(UNZ_ERRNO for IO error, or zLib error for uncompress error)
|
||||
*/
|
||||
|
||||
extern z_off_t ZEXPORT unztell OF((unzFile file));
|
||||
|
||||
extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file));
|
||||
/*
|
||||
Give the current position in uncompressed data
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzeof OF((unzFile file));
|
||||
/*
|
||||
return 1 if the end of file was reached, 0 elsewhere
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
|
||||
voidp buf,
|
||||
unsigned len));
|
||||
/*
|
||||
Read extra field from the current file (opened by unzOpenCurrentFile)
|
||||
This is the local-header version of the extra field (sometimes, there is
|
||||
more info in the local-header version than in the central-header)
|
||||
|
||||
if buf==NULL, it return the size of the local extra field
|
||||
|
||||
if buf!=NULL, len is the size of the buffer, the extra header is copied in
|
||||
buf.
|
||||
the return value is the number of bytes copied in buf, or (if <0)
|
||||
the error code
|
||||
*/
|
||||
|
||||
/***************************************************************************/
|
||||
extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos *file_pos);
|
||||
extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos *file_pos);
|
||||
|
||||
extern int32_t ZEXPORT unzGetOffset(unzFile file);
|
||||
extern int64_t ZEXPORT unzGetOffset64(unzFile file);
|
||||
/* Get the current file offset */
|
||||
extern ZPOS64_T ZEXPORT unzGetOffset64 (unzFile file);
|
||||
extern uLong ZEXPORT unzGetOffset (unzFile file);
|
||||
|
||||
extern int ZEXPORT unzSetOffset(unzFile file, uint32_t pos);
|
||||
extern int ZEXPORT unzSetOffset64(unzFile file, uint64_t pos);
|
||||
/* Set the current file offset */
|
||||
extern int ZEXPORT unzSetOffset64 (unzFile file, ZPOS64_T pos);
|
||||
extern int ZEXPORT unzSetOffset (unzFile file, uLong pos);
|
||||
|
||||
extern int32_t ZEXPORT unzTell(unzFile file);
|
||||
extern int64_t ZEXPORT unzTell64(unzFile file);
|
||||
/* return current position in uncompressed data */
|
||||
|
||||
extern int ZEXPORT unzSeek(unzFile file, uint32_t offset, int origin);
|
||||
extern int ZEXPORT unzSeek64(unzFile file, uint64_t offset, int origin);
|
||||
/* Seek within the uncompressed data if compression method is storage */
|
||||
|
||||
extern int ZEXPORT unzEndOfFile(unzFile file);
|
||||
/* return 1 if the end of file was reached, 0 elsewhere */
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _unz64_H */
|
||||
#endif /* _UNZ_H */
|
||||
|
||||
3985
MiniZip/zip.c
Normal file → Executable file
3985
MiniZip/zip.c
Normal file → Executable file
File diff suppressed because it is too large
Load Diff
388
MiniZip/zip.h
388
MiniZip/zip.h
@@ -1,61 +1,34 @@
|
||||
/* zip.h -- IO on .zip files using zlib
|
||||
Version 1.1, February 14h, 2010
|
||||
part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
|
||||
part of the MiniZip project
|
||||
|
||||
Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
|
||||
|
||||
Modifications for Zip64 support
|
||||
Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
|
||||
|
||||
For more info read MiniZip_info.txt
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Condition of use and distribution are the same than zlib :
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Changes
|
||||
|
||||
See header of zip.h
|
||||
Copyright (C) 1998-2010 Gilles Vollant
|
||||
http://www.winimage.com/zLibDll/minizip.html
|
||||
Modifications for Zip64 support
|
||||
Copyright (C) 2009-2010 Mathias Svensson
|
||||
http://result42.com
|
||||
|
||||
This program is distributed under the terms of the same license as zlib.
|
||||
See the accompanying LICENSE file for the full text of the license.
|
||||
*/
|
||||
|
||||
#ifndef _zip12_H
|
||||
#define _zip12_H
|
||||
#ifndef _ZIP_H
|
||||
#define _ZIP_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
//#define HAVE_BZIP2
|
||||
|
||||
#ifndef _ZLIB_H
|
||||
#include "zlib.h"
|
||||
# include "zlib.h"
|
||||
#endif
|
||||
|
||||
#ifndef _ZLIBIOAPI_H
|
||||
#include "ioapi.h"
|
||||
# include "ioapi.h"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_BZIP2
|
||||
#include "bzlib.h"
|
||||
# include "bzlib.h"
|
||||
#endif
|
||||
|
||||
#define Z_BZIP2ED 12
|
||||
@@ -63,8 +36,8 @@ extern "C" {
|
||||
#if defined(STRICTZIP) || defined(STRICTZIPUNZIP)
|
||||
/* like the STRICT of WIN32, we define a pointer that cannot be converted
|
||||
from (void*) without cast */
|
||||
typedef struct TagzipFile__ { int unused; } zipFile__;
|
||||
typedef zipFile__ *zipFile;
|
||||
typedef struct TagzipFile__ { int unused; } zip_file__;
|
||||
typedef zip_file__ *zipFile;
|
||||
#else
|
||||
typedef voidp zipFile;
|
||||
#endif
|
||||
@@ -83,280 +56,135 @@ typedef voidp zipFile;
|
||||
# define DEF_MEM_LEVEL MAX_MEM_LEVEL
|
||||
# endif
|
||||
#endif
|
||||
/* default memLevel */
|
||||
|
||||
/* tm_zip contain date/time info */
|
||||
typedef struct tm_zip_s
|
||||
{
|
||||
uInt tm_sec; /* seconds after the minute - [0,59] */
|
||||
uInt tm_min; /* minutes after the hour - [0,59] */
|
||||
uInt tm_hour; /* hours since midnight - [0,23] */
|
||||
uInt tm_mday; /* day of the month - [1,31] */
|
||||
uInt tm_mon; /* months since January - [0,11] */
|
||||
uInt tm_year; /* years - [1980..2044] */
|
||||
} tm_zip;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
tm_zip tmz_date; /* date in understandable format */
|
||||
uLong dosDate; /* if dos_date == 0, tmu_date is used */
|
||||
/* uLong flag; */ /* general purpose bit flag 2 bytes */
|
||||
|
||||
uLong internal_fa; /* internal file attributes 2 bytes */
|
||||
uLong external_fa; /* external file attributes 4 bytes */
|
||||
uint32_t dos_date;
|
||||
uint16_t internal_fa; /* internal file attributes 2 bytes */
|
||||
uint32_t external_fa; /* external file attributes 4 bytes */
|
||||
} zip_fileinfo;
|
||||
|
||||
typedef const char* zipcharpc;
|
||||
|
||||
|
||||
#define APPEND_STATUS_CREATE (0)
|
||||
#define APPEND_STATUS_CREATEAFTER (1)
|
||||
#define APPEND_STATUS_ADDINZIP (2)
|
||||
|
||||
extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append));
|
||||
extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append));
|
||||
/*
|
||||
Create a zipfile.
|
||||
pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on
|
||||
an Unix computer "zlib/zlib113.zip".
|
||||
if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip
|
||||
will be created at the end of the file.
|
||||
(useful if the file contain a self extractor code)
|
||||
if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will
|
||||
add files in existing zip (be sure you don't add file that doesn't exist)
|
||||
If the zipfile cannot be opened, the return value is NULL.
|
||||
Else, the return value is a zipFile Handle, usable with other function
|
||||
of this zip package.
|
||||
*/
|
||||
/***************************************************************************/
|
||||
/* Writing a zip file */
|
||||
|
||||
/* Note : there is no delete function into a zipfile.
|
||||
If you want delete file into a zipfile, you must open a zipfile, and create another
|
||||
Of couse, you can use RAW reading and writing to copy the file you did not want delte
|
||||
*/
|
||||
extern zipFile ZEXPORT zipOpen(const char *path, int append);
|
||||
extern zipFile ZEXPORT zipOpen64(const void *path, int append);
|
||||
/* Create a zipfile.
|
||||
|
||||
extern zipFile ZEXPORT zipOpen2 OF((const char *pathname,
|
||||
int append,
|
||||
zipcharpc* globalcomment,
|
||||
zlib_filefunc_def* pzlib_filefunc_def));
|
||||
path should contain the full path (by example, on a Windows XP computer
|
||||
"c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip".
|
||||
|
||||
extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname,
|
||||
int append,
|
||||
zipcharpc* globalcomment,
|
||||
zlib_filefunc64_def* pzlib_filefunc_def));
|
||||
return NULL if zipfile cannot be opened
|
||||
return zipFile handle if no error
|
||||
|
||||
extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file,
|
||||
const char* filename,
|
||||
const zip_fileinfo* zipfi,
|
||||
const void* extrafield_local,
|
||||
uInt size_extrafield_local,
|
||||
const void* extrafield_global,
|
||||
uInt size_extrafield_global,
|
||||
const char* comment,
|
||||
int method,
|
||||
int level));
|
||||
If the file path exist and append == APPEND_STATUS_CREATEAFTER, the zip
|
||||
will be created at the end of the file. (useful if the file contain a self extractor code)
|
||||
If the file path exist and append == APPEND_STATUS_ADDINZIP, we will add files in existing
|
||||
zip (be sure you don't add file that doesn't exist)
|
||||
|
||||
extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file,
|
||||
const char* filename,
|
||||
const zip_fileinfo* zipfi,
|
||||
const void* extrafield_local,
|
||||
uInt size_extrafield_local,
|
||||
const void* extrafield_global,
|
||||
uInt size_extrafield_global,
|
||||
const char* comment,
|
||||
int method,
|
||||
int level,
|
||||
int zip64));
|
||||
NOTE: There is no delete function into a zipfile. If you want delete file into a zipfile,
|
||||
you must open a zipfile, and create another. Of course, you can use RAW reading and writing to copy
|
||||
the file you did not want delete. */
|
||||
|
||||
/*
|
||||
Open a file in the ZIP for writing.
|
||||
filename : the filename in zip (if NULL, '-' without quote will be used
|
||||
*zipfi contain supplemental information
|
||||
if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local
|
||||
contains the extrafield data the the local header
|
||||
if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global
|
||||
contains the extrafield data the the local header
|
||||
if comment != NULL, comment contain the comment string
|
||||
method contain the compression method (0 for store, Z_DEFLATED for deflate)
|
||||
level contain the level of compression (can be Z_DEFAULT_COMPRESSION)
|
||||
zip64 is set to 1 if a zip64 extended information block should be added to the local file header.
|
||||
this MUST be '1' if the uncompressed size is >= 0xffffffff.
|
||||
extern zipFile ZEXPORT zipOpen2(const char *path, int append, const char **globalcomment,
|
||||
zlib_filefunc_def *pzlib_filefunc_def);
|
||||
|
||||
*/
|
||||
extern zipFile ZEXPORT zipOpen2_64(const void *path, int append, const char **globalcomment,
|
||||
zlib_filefunc64_def *pzlib_filefunc_def);
|
||||
|
||||
extern zipFile ZEXPORT zipOpen3(const char *path, int append, uint64_t disk_size,
|
||||
const char **globalcomment, zlib_filefunc_def *pzlib_filefunc_def);
|
||||
/* Same as zipOpen2 but allows specification of spanned zip size */
|
||||
|
||||
extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file,
|
||||
const char* filename,
|
||||
const zip_fileinfo* zipfi,
|
||||
const void* extrafield_local,
|
||||
uInt size_extrafield_local,
|
||||
const void* extrafield_global,
|
||||
uInt size_extrafield_global,
|
||||
const char* comment,
|
||||
int method,
|
||||
int level,
|
||||
int raw));
|
||||
extern zipFile ZEXPORT zipOpen3_64(const void *path, int append, uint64_t disk_size,
|
||||
const char **globalcomment, zlib_filefunc64_def *pzlib_filefunc_def);
|
||||
|
||||
extern int ZEXPORT zipOpenNewFileInZip(zipFile file, const char *filename, const zip_fileinfo *zipfi,
|
||||
const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
|
||||
uint16_t size_extrafield_global, const char *comment, uint16_t method, int level);
|
||||
/* Open a file in the ZIP for writing.
|
||||
|
||||
extern int ZEXPORT zipOpenNewFileInZip2_64 OF((zipFile file,
|
||||
const char* filename,
|
||||
const zip_fileinfo* zipfi,
|
||||
const void* extrafield_local,
|
||||
uInt size_extrafield_local,
|
||||
const void* extrafield_global,
|
||||
uInt size_extrafield_global,
|
||||
const char* comment,
|
||||
int method,
|
||||
int level,
|
||||
int raw,
|
||||
int zip64));
|
||||
/*
|
||||
Same than zipOpenNewFileInZip, except if raw=1, we write raw file
|
||||
*/
|
||||
filename : the filename in zip (if NULL, '-' without quote will be used
|
||||
*zipfi contain supplemental information
|
||||
extrafield_local buffer to store the local header extra field data, can be NULL
|
||||
size_extrafield_local size of extrafield_local buffer
|
||||
extrafield_global buffer to store the global header extra field data, can be NULL
|
||||
size_extrafield_global size of extrafield_local buffer
|
||||
comment buffer for comment string
|
||||
method contain the compression method (0 for store, Z_DEFLATED for deflate)
|
||||
level contain the level of compression (can be Z_DEFAULT_COMPRESSION)
|
||||
zip64 is set to 1 if a zip64 extended information block should be added to the local file header.
|
||||
this MUST be '1' if the uncompressed size is >= 0xffffffff. */
|
||||
|
||||
extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file,
|
||||
const char* filename,
|
||||
const zip_fileinfo* zipfi,
|
||||
const void* extrafield_local,
|
||||
uInt size_extrafield_local,
|
||||
const void* extrafield_global,
|
||||
uInt size_extrafield_global,
|
||||
const char* comment,
|
||||
int method,
|
||||
int level,
|
||||
int raw,
|
||||
int windowBits,
|
||||
int memLevel,
|
||||
int strategy,
|
||||
const char* password,
|
||||
uLong crcForCrypting));
|
||||
extern int ZEXPORT zipOpenNewFileInZip64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
|
||||
const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
|
||||
uint16_t size_extrafield_global, const char *comment, uint16_t method, int level, int zip64);
|
||||
/* Same as zipOpenNewFileInZip with zip64 support */
|
||||
|
||||
extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file,
|
||||
const char* filename,
|
||||
const zip_fileinfo* zipfi,
|
||||
const void* extrafield_local,
|
||||
uInt size_extrafield_local,
|
||||
const void* extrafield_global,
|
||||
uInt size_extrafield_global,
|
||||
const char* comment,
|
||||
int method,
|
||||
int level,
|
||||
int raw,
|
||||
int windowBits,
|
||||
int memLevel,
|
||||
int strategy,
|
||||
const char* password,
|
||||
uLong crcForCrypting,
|
||||
int zip64
|
||||
));
|
||||
extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char *filename, const zip_fileinfo *zipfi,
|
||||
const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
|
||||
uint16_t size_extrafield_global, const char *comment, uint16_t method, int level, int raw);
|
||||
/* Same as zipOpenNewFileInZip, except if raw=1, we write raw file */
|
||||
|
||||
/*
|
||||
Same than zipOpenNewFileInZip2, except
|
||||
windowBits,memLevel,,strategy : see parameter strategy in deflateInit2
|
||||
extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
|
||||
const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
|
||||
uint16_t size_extrafield_global, const char *comment, uint16_t method, int level, int raw, int zip64);
|
||||
/* Same as zipOpenNewFileInZip3 with zip64 support */
|
||||
|
||||
extern int ZEXPORT zipOpenNewFileInZip3(zipFile file, const char *filename, const zip_fileinfo *zipfi,
|
||||
const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
|
||||
uint16_t size_extrafield_global, const char *comment, uint16_t method, int level, int raw, int windowBits, int memLevel,
|
||||
int strategy, const char *password, uint32_t crcForCrypting);
|
||||
/* Same as zipOpenNewFileInZip2, except
|
||||
windowBits, memLevel, strategy : see parameter strategy in deflateInit2
|
||||
password : crypting password (NULL for no crypting)
|
||||
crcForCrypting : crc of file to compress (needed for crypting)
|
||||
*/
|
||||
crcForCrypting : crc of file to compress (needed for crypting) */
|
||||
|
||||
extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file,
|
||||
const char* filename,
|
||||
const zip_fileinfo* zipfi,
|
||||
const void* extrafield_local,
|
||||
uInt size_extrafield_local,
|
||||
const void* extrafield_global,
|
||||
uInt size_extrafield_global,
|
||||
const char* comment,
|
||||
int method,
|
||||
int level,
|
||||
int raw,
|
||||
int windowBits,
|
||||
int memLevel,
|
||||
int strategy,
|
||||
const char* password,
|
||||
uLong crcForCrypting,
|
||||
uLong versionMadeBy,
|
||||
uLong flagBase
|
||||
));
|
||||
extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
|
||||
const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
|
||||
uint16_t size_extrafield_global, const char *comment, uint16_t method, int level, int raw, int windowBits, int memLevel,
|
||||
int strategy, const char *password, uint32_t crc_for_crypting, int zip64);
|
||||
/* Same as zipOpenNewFileInZip3 with zip64 support */
|
||||
|
||||
extern int ZEXPORT zipOpenNewFileInZip4(zipFile file, const char *filename, const zip_fileinfo *zipfi,
|
||||
const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
|
||||
uint16_t size_extrafield_global, const char *comment, uint16_t method, int level, int raw, int windowBits, int memLevel,
|
||||
int strategy, const char *password, uint32_t crc_for_crypting, uint16_t version_madeby, uint16_t flag_base);
|
||||
/* Same as zipOpenNewFileInZip3 except versionMadeBy & flag fields */
|
||||
|
||||
extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file,
|
||||
const char* filename,
|
||||
const zip_fileinfo* zipfi,
|
||||
const void* extrafield_local,
|
||||
uInt size_extrafield_local,
|
||||
const void* extrafield_global,
|
||||
uInt size_extrafield_global,
|
||||
const char* comment,
|
||||
int method,
|
||||
int level,
|
||||
int raw,
|
||||
int windowBits,
|
||||
int memLevel,
|
||||
int strategy,
|
||||
const char* password,
|
||||
uLong crcForCrypting,
|
||||
uLong versionMadeBy,
|
||||
uLong flagBase,
|
||||
int zip64
|
||||
));
|
||||
/*
|
||||
Same than zipOpenNewFileInZip4, except
|
||||
versionMadeBy : value for Version made by field
|
||||
flag : value for flag field (compression level info will be added)
|
||||
*/
|
||||
extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,
|
||||
const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global,
|
||||
uint16_t size_extrafield_global, const char *comment, uint16_t method, int level, int raw, int windowBits, int memLevel,
|
||||
int strategy, const char *password, uint32_t crc_for_crypting, uint16_t version_madeby, uint16_t flag_base, int zip64);
|
||||
/* Same as zipOpenNewFileInZip4 with zip64 support */
|
||||
|
||||
extern int ZEXPORT zipWriteInFileInZip(zipFile file, const void *buf, uint32_t len);
|
||||
/* Write data in the zipfile */
|
||||
|
||||
extern int ZEXPORT zipWriteInFileInZip OF((zipFile file,
|
||||
const void* buf,
|
||||
unsigned len));
|
||||
/*
|
||||
Write data in the zipfile
|
||||
*/
|
||||
extern int ZEXPORT zipCloseFileInZip(zipFile file);
|
||||
/* Close the current file in the zipfile */
|
||||
|
||||
extern int ZEXPORT zipCloseFileInZip OF((zipFile file));
|
||||
/*
|
||||
Close the current file in the zipfile
|
||||
*/
|
||||
extern int ZEXPORT zipCloseFileInZipRaw(zipFile file, uint32_t uncompressed_size, uint32_t crc32);
|
||||
extern int ZEXPORT zipCloseFileInZipRaw64(zipFile file, uint64_t uncompressed_size, uint32_t crc32);
|
||||
/* Close the current file in the zipfile, for file opened with parameter raw=1 in zipOpenNewFileInZip2
|
||||
where raw is compressed data. Parameters uncompressed_size and crc32 are value for the uncompressed data. */
|
||||
|
||||
extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file,
|
||||
uLong uncompressed_size,
|
||||
uLong crc32));
|
||||
extern int ZEXPORT zipClose(zipFile file, const char *global_comment);
|
||||
/* Close the zipfile */
|
||||
|
||||
extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file,
|
||||
ZPOS64_T uncompressed_size,
|
||||
uLong crc32));
|
||||
extern int ZEXPORT zipClose_64(zipFile file, const char *global_comment);
|
||||
|
||||
/*
|
||||
Close the current file in the zipfile, for file opened with
|
||||
parameter raw=1 in zipOpenNewFileInZip2
|
||||
uncompressed_size and crc32 are value for the uncompressed size
|
||||
*/
|
||||
extern int ZEXPORT zipClose2_64(zipFile file, const char *global_comment, uint16_t version_madeby);
|
||||
/* Same as zipClose_64 except version_madeby field */
|
||||
|
||||
extern int ZEXPORT zipClose OF((zipFile file,
|
||||
const char* global_comment));
|
||||
/*
|
||||
Close the zipfile
|
||||
*/
|
||||
|
||||
|
||||
extern int ZEXPORT zipRemoveExtraInfoBlock OF((char* pData, int* dataLen, short sHeader));
|
||||
/*
|
||||
zipRemoveExtraInfoBlock - Added by Mathias Svensson
|
||||
|
||||
Remove extra information block from a extra information data for the local file header or central directory header
|
||||
|
||||
It is needed to remove ZIP64 extra information blocks when before data is written if using RAW mode.
|
||||
|
||||
0x0001 is the signature header for the ZIP64 extra information blocks
|
||||
|
||||
usage.
|
||||
Remove ZIP64 Extra information from a central director extra field data
|
||||
zipRemoveExtraInfoBlock(pCenDirExtraFieldData, &nCenDirExtraFieldDataLen, 0x0001);
|
||||
|
||||
Remove ZIP64 Extra information from a Local File Header extra field data
|
||||
zipRemoveExtraInfoBlock(pLocalHeaderExtraFieldData, &nLocalHeaderExtraFieldDataLen, 0x0001);
|
||||
*/
|
||||
/***************************************************************************/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _zip64_H */
|
||||
#endif /* _ZIP_H */
|
||||
|
||||
@@ -3,28 +3,22 @@
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>${PRODUCT_NAME}</string>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>ObjectiveZipIcon.png</string>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.yourcompany.${PRODUCT_NAME:rfc1034identifier}</string>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>${PRODUCT_NAME}</string>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<string>BNDL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>NSMainNibFile</key>
|
||||
<string>MainWindow</string>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,5 @@
|
||||
//
|
||||
// Use this file to import your target's public headers that you would like to expose to Swift.
|
||||
//
|
||||
|
||||
#import "Objective-Zip+NSError.h"
|
||||
@@ -0,0 +1,5 @@
|
||||
//
|
||||
// Use this file to import your target's public headers that you would like to expose to Swift.
|
||||
//
|
||||
|
||||
#import "Objective-Zip+NSError.h"
|
||||
454
Objective-Zip Tests/Objective-Zip_Swift_Tests.swift
Normal file
454
Objective-Zip Tests/Objective-Zip_Swift_Tests.swift
Normal file
@@ -0,0 +1,454 @@
|
||||
//
|
||||
// Objective-Zip_Swift_Tests.swift
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 20/09/15.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR PROFITS OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
import XCTest
|
||||
|
||||
let HUGE_TEST_BLOCK_LENGTH = 50000
|
||||
let HUGE_TEST_NUMBER_OF_BLOCKS = 100000
|
||||
|
||||
let MAC_TEST_ZIP = "UEsDBBQACAAIAPWF10IAAAAAAAAAAAAAAAANABAAdGVzdF9maWxlLnR4dFVYDACQCsdRjQrHUfYB9gHzT8pKTS7JLEvVjcosUPBNTFYoSS0uUUjLzEnlAgBQSwcIlXE92h4AAAAcAAAAUEsDBAoAAAAAAACG10IAAAAAAAAAAAAAAAAJABAAX19NQUNPU1gvVVgMAKAKx1GgCsdR9gH2AVBLAwQUAAgACAD1hddCAAAAAAAAAAAAAAAAGAAQAF9fTUFDT1NYLy5fdGVzdF9maWxlLnR4dFVYDACQCsdRjQrHUfYB9gFjYBVjZ2BiYPBNTFbwD1aIUIACkBgDJxAbAXElEIP4qxmIAo4hIUFQJkjHHCDmR1PCiBAXT87P1UssKMhJ1QtJrShxzUvOT8nMSwdKlpak6VpYGxqbGBmaW1qYAABQSwcIcBqNwF0AAACrAAAAUEsBAhUDFAAIAAgA9YXXQpVxPdoeAAAAHAAAAA0ADAAAAAAAAAAAQKSBAAAAAHRlc3RfZmlsZS50eHRVWAgAkArHUY0Kx1FQSwECFQMKAAAAAAAAhtdCAAAAAAAAAAAAAAAACQAMAAAAAAAAAABA/UFpAAAAX19NQUNPU1gvVVgIAKAKx1GgCsdRUEsBAhUDFAAIAAgA9YXXQnAajcBdAAAAqwAAABgADAAAAAAAAAAAQKSBoAAAAF9fTUFDT1NYLy5fdGVzdF9maWxlLnR4dFVYCACQCsdRjQrHUVBLBQYAAAAAAwADANwAAABTAQAAAAA="
|
||||
let WIN_TEST_ZIP = "UEsDBBQAAAAAAMmF10L4VbPKIQAAACEAAAANAAAAdGVzdF9maWxlLnR4dE9iamVjdGl2ZS1aaXAgV2luZG93cyB0ZXN0IGZpbGUNClBLAQIUABQAAAAAAMmF10L4VbPKIQAAACEAAAANAAAAAAAAAAEAIAAAAAAAAAB0ZXN0X2ZpbGUudHh0UEsFBgAAAAABAAEAOwAAAEwAAAAAAA=="
|
||||
|
||||
class Objective_Zip_Swift_Tests: XCTestCase {
|
||||
|
||||
override func setUp() {
|
||||
super.setUp()
|
||||
}
|
||||
|
||||
override func tearDown() {
|
||||
super.tearDown()
|
||||
}
|
||||
|
||||
func test01_ZipAndUnzip() {
|
||||
let documentsUrl = URL(fileURLWithPath:NSHomeDirectory(), isDirectory:true).appendingPathComponent("Documents")
|
||||
let fileUrl = documentsUrl.appendingPathComponent("test.zip")
|
||||
let filePath = fileUrl.path
|
||||
|
||||
do {
|
||||
try FileManager.default.removeItem(atPath: filePath)
|
||||
} catch {}
|
||||
|
||||
defer {
|
||||
do {
|
||||
try FileManager.default.removeItem(atPath: filePath)
|
||||
} catch {}
|
||||
}
|
||||
|
||||
do {
|
||||
NSLog("Test 1: opening zip file for writing...")
|
||||
|
||||
let zipFile = try OZZipFile(fileName:filePath, mode:OZZipFileMode.create)
|
||||
|
||||
XCTAssertNotNil(zipFile)
|
||||
|
||||
NSLog("Test 1: adding first file...")
|
||||
|
||||
let stream1 = try zipFile.writeInZip(withName: "abc.txt", fileDate:Date(timeIntervalSinceNow:-86400.0), compressionLevel:OZZipCompressionLevel.best)
|
||||
|
||||
XCTAssertNotNil(stream1)
|
||||
|
||||
NSLog("Test 1: writing to first file's stream...")
|
||||
|
||||
let text = "abc"
|
||||
try stream1.write(text.data(using: String.Encoding.utf8)!)
|
||||
|
||||
NSLog("Test 1: closing first file's stream...")
|
||||
|
||||
try stream1.finishedWriting()
|
||||
|
||||
NSLog("Test 1: adding second file...")
|
||||
|
||||
let file2name = "x/y/z/xyz.txt"
|
||||
let stream2 = try zipFile.writeInZip(withName: file2name, compressionLevel:OZZipCompressionLevel.none)
|
||||
|
||||
XCTAssertNotNil(stream2)
|
||||
|
||||
NSLog("Test 1: writing to second file's stream...")
|
||||
|
||||
let text2 = "XYZ"
|
||||
try stream2.write(text2.data(using: String.Encoding.utf8)!)
|
||||
|
||||
NSLog("Test 1: closing second file's stream...")
|
||||
|
||||
try stream2.finishedWriting()
|
||||
|
||||
NSLog("Test 1: closing zip file...")
|
||||
|
||||
try zipFile.close()
|
||||
|
||||
NSLog("Test 1: opening zip file for reading...")
|
||||
|
||||
let unzipFile = try OZZipFile(fileName:filePath, mode:OZZipFileMode.unzip)
|
||||
|
||||
XCTAssertNotNil(unzipFile)
|
||||
|
||||
NSLog("Test 1: reading file infos...")
|
||||
|
||||
let infos = try unzipFile.listFileInZipInfos()
|
||||
|
||||
XCTAssertEqual(2, infos.count)
|
||||
|
||||
let info1 = infos[0] as! OZFileInZipInfo
|
||||
|
||||
XCTAssertEqualWithAccuracy(Date().timeIntervalSinceReferenceDate, info1.date.timeIntervalSinceReferenceDate + 86400, accuracy:5.0)
|
||||
|
||||
NSLog("Test 1: - \(info1.name) \(info1.date) \(info1.size) (\(info1.level))")
|
||||
|
||||
let info2 = infos[1] as! OZFileInZipInfo
|
||||
|
||||
XCTAssertEqualWithAccuracy(Date().timeIntervalSinceReferenceDate, info2.date.timeIntervalSinceReferenceDate, accuracy:5.0)
|
||||
|
||||
NSLog("Test 1: - \(info2.name) \(info2.date) \(info2.size) (\(info2.level))")
|
||||
|
||||
NSLog("Test 1: opening first file...")
|
||||
|
||||
try unzipFile.goToFirstFileInZip()
|
||||
let read1 = try unzipFile.readCurrentFileInZip()
|
||||
|
||||
XCTAssertNotNil(read1)
|
||||
|
||||
NSLog("Test 1: reading from first file's stream...")
|
||||
|
||||
let data1 = NSMutableData(length:256)!
|
||||
let bytesRead1 = try read1.readData(withBuffer: data1)
|
||||
|
||||
XCTAssertEqual(3, bytesRead1)
|
||||
|
||||
let fileText1 = NSString(bytes:data1.bytes, length:Int(bytesRead1), encoding:String.Encoding.utf8.rawValue)
|
||||
|
||||
XCTAssertEqual("abc", fileText1)
|
||||
|
||||
NSLog("Test 1: closing first file's stream...")
|
||||
|
||||
try read1.finishedReading()
|
||||
|
||||
NSLog("Test 1: opening second file...")
|
||||
|
||||
try unzipFile.locateFile(inZip: file2name)
|
||||
let read2 = try unzipFile.readCurrentFileInZip()
|
||||
|
||||
XCTAssertNotNil(read2)
|
||||
|
||||
NSLog("Test 1: reading from second file's stream...")
|
||||
|
||||
let data2 = NSMutableData(length:256)!
|
||||
let bytesRead2 = try read2.readData(withBuffer: data2)
|
||||
|
||||
XCTAssertEqual(3, bytesRead2)
|
||||
|
||||
let fileText2 = NSString(bytes:data2.bytes, length:Int(bytesRead2), encoding:String.Encoding.utf8.rawValue)
|
||||
|
||||
XCTAssertEqual("XYZ", fileText2)
|
||||
|
||||
NSLog("Test 1: closing second file's stream...")
|
||||
|
||||
try read2.finishedReading()
|
||||
|
||||
NSLog("Test 1: closing zip file...")
|
||||
|
||||
try unzipFile.close()
|
||||
|
||||
NSLog("Test 1: test terminated succesfully")
|
||||
|
||||
} catch let error as NSError {
|
||||
NSLog("Test 1: error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey]!)")
|
||||
|
||||
XCTFail("Error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey]!)")
|
||||
|
||||
} catch let error {
|
||||
NSLog("Test 1: generic error caught: \(error)")
|
||||
|
||||
XCTFail("Generic error caught: \(error)")
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Uncomment to execute this test, but be careful: takes 5 minutes and consumes 5 GB of disk space
|
||||
*
|
||||
func test02_ZipAndUnzip5GB() {
|
||||
|
||||
let documentsUrl = NSURL(fileURLWithPath:NSHomeDirectory(), isDirectory:true).URLByAppendingPathComponent("Documents")
|
||||
let fileUrl = documentsUrl.URLByAppendingPathComponent("huge_test.zip")
|
||||
let filePath = fileUrl.path!
|
||||
|
||||
do {
|
||||
try NSFileManager.defaultManager().removeItemAtPath(filePath)
|
||||
} catch {}
|
||||
|
||||
defer {
|
||||
do {
|
||||
try NSFileManager.defaultManager().removeItemAtPath(filePath)
|
||||
} catch {}
|
||||
}
|
||||
|
||||
do {
|
||||
NSLog("Test 2: opening zip file for writing...")
|
||||
|
||||
let zipFile = try OZZipFile(fileName:filePath, mode:OZZipFileMode.Create)
|
||||
|
||||
XCTAssertNotNil(zipFile)
|
||||
|
||||
NSLog("Test 2: adding file...")
|
||||
|
||||
let stream = try zipFile.writeFileInZipWithName("huge_file.txt", compressionLevel:OZZipCompressionLevel.Best)
|
||||
|
||||
XCTAssertNotNil(stream)
|
||||
|
||||
NSLog("Test 2: writing to file's stream...")
|
||||
|
||||
let data = NSMutableData(length:HUGE_TEST_BLOCK_LENGTH)!
|
||||
SecRandomCopyBytes(kSecRandomDefault, data.length, UnsafeMutablePointer<UInt8>(data.mutableBytes))
|
||||
|
||||
let checkData = data.subdataWithRange(NSMakeRange(0, 100))
|
||||
|
||||
let buffer = NSMutableData(length:HUGE_TEST_BLOCK_LENGTH)! // For use later
|
||||
|
||||
for (var i = 0; i < HUGE_TEST_NUMBER_OF_BLOCKS; i++) {
|
||||
try stream.writeData(data)
|
||||
|
||||
if (i % 100 == 0) {
|
||||
NSLog("Test 2: written \((data.length / 1024) * (i + 1)) KB...")
|
||||
}
|
||||
}
|
||||
|
||||
NSLog("Test 2: closing file's stream...")
|
||||
|
||||
try stream.finishedWriting()
|
||||
|
||||
NSLog("Test 2: closing zip file...")
|
||||
|
||||
try zipFile.close()
|
||||
|
||||
NSLog("Test 2: opening zip file for reading...")
|
||||
|
||||
let unzipFile = try OZZipFile(fileName:filePath, mode:OZZipFileMode.Unzip)
|
||||
|
||||
XCTAssertNotNil(unzipFile)
|
||||
|
||||
NSLog("Test 1: reading file infos...")
|
||||
|
||||
let infos = try unzipFile.listFileInZipInfos()
|
||||
|
||||
XCTAssertEqual(1, infos.count)
|
||||
|
||||
let info1 = infos[0] as! OZFileInZipInfo
|
||||
|
||||
XCTAssertEqual(info1.length, UInt64(HUGE_TEST_NUMBER_OF_BLOCKS) * UInt64(HUGE_TEST_BLOCK_LENGTH))
|
||||
|
||||
NSLog("Test 1: - \(info1.name) \(info1.date) \(info1.size) (\(info1.level))")
|
||||
|
||||
NSLog("Test 2: opening file...")
|
||||
|
||||
try unzipFile.goToFirstFileInZip()
|
||||
let read = try unzipFile.readCurrentFileInZip()
|
||||
|
||||
XCTAssertNotNil(read)
|
||||
|
||||
NSLog("Test 2: reading from file's stream...")
|
||||
|
||||
for (var i = 0; i < HUGE_TEST_NUMBER_OF_BLOCKS; i++) {
|
||||
let bytesRead = try read.readDataWithBuffer(buffer)
|
||||
|
||||
XCTAssertEqual(data.length, bytesRead)
|
||||
|
||||
let range = buffer.rangeOfData(checkData, options:NSDataSearchOptions(), range:NSMakeRange(0, buffer.length))
|
||||
|
||||
XCTAssertEqual(0, range.location)
|
||||
|
||||
if (i % 100 == 0) {
|
||||
NSLog("Test 2: read \((buffer.length / 1024) * (i + 1))) KB...")
|
||||
}
|
||||
}
|
||||
|
||||
NSLog("Test 2: closing file's stream...")
|
||||
|
||||
try read.finishedReading()
|
||||
|
||||
NSLog("Test 2: closing zip file...")
|
||||
|
||||
try unzipFile.close()
|
||||
|
||||
NSLog("Test 2: test terminated succesfully")
|
||||
|
||||
} catch let error as NSError {
|
||||
NSLog("Test 2: error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey])")
|
||||
|
||||
XCTFail("Error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey])")
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
func test03_UnzipMacZipFile() -> () {
|
||||
let documentsUrl = URL(fileURLWithPath:NSHomeDirectory(), isDirectory:true).appendingPathComponent("Documents")
|
||||
let fileUrl = documentsUrl.appendingPathComponent("mac_test_file.zip")
|
||||
let filePath = fileUrl.path
|
||||
|
||||
do {
|
||||
try FileManager.default.removeItem(atPath: filePath)
|
||||
} catch {}
|
||||
|
||||
let macZipData = Data(base64Encoded:MAC_TEST_ZIP, options:NSData.Base64DecodingOptions())!
|
||||
try? macZipData.write(to: URL(fileURLWithPath: filePath), options: [])
|
||||
|
||||
defer {
|
||||
do {
|
||||
try FileManager.default.removeItem(atPath: filePath)
|
||||
} catch {}
|
||||
}
|
||||
|
||||
do {
|
||||
NSLog("Test 3: opening zip file for reading...")
|
||||
|
||||
let unzipFile = try OZZipFile(fileName:filePath, mode:OZZipFileMode.unzip)
|
||||
|
||||
XCTAssertNotNil(unzipFile)
|
||||
|
||||
NSLog("Test 3: opening file...")
|
||||
|
||||
try unzipFile.goToFirstFileInZip()
|
||||
let read = try unzipFile.readCurrentFileInZip()
|
||||
|
||||
XCTAssertNotNil(read)
|
||||
|
||||
NSLog("Test 3: reading from file's stream...")
|
||||
|
||||
let buffer = NSMutableData(length:1024)!
|
||||
let bytesRead = try read.readData(withBuffer: buffer)
|
||||
|
||||
let fileText = NSString(bytes:buffer.bytes, length:Int(bytesRead), encoding:String.Encoding.utf8.rawValue)
|
||||
|
||||
XCTAssertEqual("Objective-Zip Mac test file\n", fileText)
|
||||
|
||||
NSLog("Test 3: closing file's stream...")
|
||||
|
||||
try read.finishedReading()
|
||||
|
||||
NSLog("Test 3: closing zip file...")
|
||||
|
||||
try unzipFile.close()
|
||||
|
||||
NSLog("Test 3: test terminated succesfully")
|
||||
|
||||
} catch let error as NSError {
|
||||
NSLog("Test 3: error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey]!)")
|
||||
|
||||
XCTFail("Error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey]!)")
|
||||
}
|
||||
}
|
||||
|
||||
func test04_UnzipWinZipFile() {
|
||||
let documentsUrl = URL(fileURLWithPath:NSHomeDirectory(), isDirectory:true).appendingPathComponent("Documents")
|
||||
let fileUrl = documentsUrl.appendingPathComponent("win_test_file.zip")
|
||||
let filePath = fileUrl.path
|
||||
|
||||
do {
|
||||
try FileManager.default.removeItem(atPath: filePath)
|
||||
} catch {}
|
||||
|
||||
let winZipData = Data(base64Encoded:WIN_TEST_ZIP, options:NSData.Base64DecodingOptions())!
|
||||
try? winZipData.write(to: URL(fileURLWithPath: filePath), options: [])
|
||||
|
||||
defer {
|
||||
do {
|
||||
try FileManager.default.removeItem(atPath: filePath)
|
||||
} catch {}
|
||||
}
|
||||
|
||||
do {
|
||||
NSLog("Test 4: opening zip file for reading...")
|
||||
|
||||
let unzipFile = try OZZipFile(fileName:filePath, mode:OZZipFileMode.unzip)
|
||||
|
||||
XCTAssertNotNil(unzipFile)
|
||||
|
||||
NSLog("Test 4: opening file...")
|
||||
|
||||
try unzipFile.goToFirstFileInZip()
|
||||
let read = try unzipFile.readCurrentFileInZip()
|
||||
|
||||
XCTAssertNotNil(read)
|
||||
|
||||
NSLog("Test 4: reading from file's stream...")
|
||||
|
||||
let buffer = NSMutableData(length:1024)!
|
||||
let bytesRead = try read.readData(withBuffer: buffer)
|
||||
|
||||
let fileText = NSString(bytes:buffer.bytes, length:Int(bytesRead), encoding:String.Encoding.utf8.rawValue)
|
||||
|
||||
XCTAssertEqual("Objective-Zip Windows test file\r\n", fileText)
|
||||
|
||||
NSLog("Test 4: closing file's stream...")
|
||||
|
||||
try read.finishedReading()
|
||||
|
||||
NSLog("Test 4: closing zip file...")
|
||||
|
||||
try unzipFile.close()
|
||||
|
||||
NSLog("Test 4: test terminated succesfully")
|
||||
|
||||
} catch let error as NSError {
|
||||
NSLog("Test 4: error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey]!)")
|
||||
|
||||
XCTFail("Error caught: \(error.code) - \(error.userInfo[NSLocalizedFailureReasonErrorKey]!)")
|
||||
}
|
||||
}
|
||||
|
||||
func test05_ErrorWrapping() {
|
||||
let fileUrl = URL(fileURLWithPath:"/root.zip", isDirectory:false)
|
||||
let filePath = fileUrl.path
|
||||
|
||||
defer {
|
||||
do {
|
||||
try FileManager.default.removeItem(atPath: filePath)
|
||||
} catch {}
|
||||
}
|
||||
|
||||
do {
|
||||
NSLog("Test 5: opening impossible zip file for writing...")
|
||||
|
||||
let zipFile = try OZZipFile(fileName:filePath, mode:OZZipFileMode.create)
|
||||
|
||||
try zipFile.close()
|
||||
|
||||
NSLog("Test 5: test failed, no error reported")
|
||||
|
||||
XCTFail("No error reported")
|
||||
|
||||
} catch let error as NSError {
|
||||
XCTAssertEqual(OZ_ERROR_NO_SUCH_FILE, error.code)
|
||||
|
||||
NSLog("Test 5: test terminated succesfully")
|
||||
}
|
||||
}
|
||||
}
|
||||
1097
Objective-Zip Tests/ObjectiveZip_Tests.m
Normal file
1097
Objective-Zip Tests/ObjectiveZip_Tests.m
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -1,49 +1,48 @@
|
||||
//
|
||||
// Objective_ZipViewController.h
|
||||
// Objective-Zip
|
||||
// NSData+CRC32.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright Flying Dolphin Studio 2009. All rights reserved.
|
||||
// Created by Gianluca Bertani on 13/05/2017.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface Objective_ZipViewController : UIViewController {
|
||||
IBOutlet UITextView *_textView;
|
||||
|
||||
@private
|
||||
NSThread *_testThread;
|
||||
}
|
||||
@interface NSData (CRC32)
|
||||
|
||||
- (IBAction) zipUnzip;
|
||||
|
||||
- (void) test;
|
||||
- (void) log:(NSString *)text;
|
||||
#pragma mark -
|
||||
#pragma mark Handy CRC32 computation
|
||||
|
||||
- (uint32_t) crc32;
|
||||
- (uint32_t) crc32withInitialCrc32:(uint32_t)initialCrc32;
|
||||
|
||||
|
||||
@end
|
||||
|
||||
58
Objective-Zip/NSData+CRC32.m
Normal file
58
Objective-Zip/NSData+CRC32.m
Normal file
@@ -0,0 +1,58 @@
|
||||
//
|
||||
// NSData+CRC32.m
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 13/05/2017.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "NSData+CRC32.h"
|
||||
|
||||
|
||||
// Part of ZLib, see crc32.c
|
||||
unsigned long crc32(unsigned long crc, const unsigned char *buf, unsigned int len);
|
||||
|
||||
|
||||
@implementation NSData (CRC32)
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Handy CRC32 computation
|
||||
|
||||
- (uint32_t) crc32 {
|
||||
return [self crc32withInitialCrc32:0];
|
||||
}
|
||||
|
||||
- (uint32_t) crc32withInitialCrc32:(uint32_t)initialCrc32 {
|
||||
return (uint32_t) crc32(initialCrc32, [self bytes], (unsigned int) [self length]);
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
@@ -1,51 +1,48 @@
|
||||
//
|
||||
// ZipWriteStream.h
|
||||
// Objective-Zip v. 0.8
|
||||
// NSDate+DOSDate.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-10 Flying Dolphin Studio. All rights reserved.
|
||||
// Created by Gianluca Bertani on 13/05/2017.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#include "zip.h"
|
||||
|
||||
@interface NSDate (DOSDate)
|
||||
|
||||
|
||||
@interface ZipWriteStream : NSObject {
|
||||
NSString *_fileNameInZip;
|
||||
#pragma mark -
|
||||
#pragma mark Conversion to/from 32 bit DOS date format
|
||||
|
||||
@private
|
||||
zipFile _zipFile;
|
||||
}
|
||||
- (uint32_t) dosDate;
|
||||
+ (NSDate *) fromDosDate:(uint32_t)dosDate;
|
||||
|
||||
- (id) initWithZipFileStruct:(zipFile)zipFile fileNameInZip:(NSString *)fileNameInZip;
|
||||
|
||||
- (void) writeData:(NSData *)data;
|
||||
- (void) finishedWriting;
|
||||
|
||||
@end
|
||||
|
||||
69
Objective-Zip/NSDate+DOSDate.m
Normal file
69
Objective-Zip/NSDate+DOSDate.m
Normal file
@@ -0,0 +1,69 @@
|
||||
//
|
||||
// NSDate+DOSDate.m
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 13/05/2017.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "NSDate+DOSDate.h"
|
||||
|
||||
|
||||
@implementation NSDate (DOSDate)
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Conversion to/from 32 bit DOS date format
|
||||
|
||||
- (uint32_t) dosDate {
|
||||
NSCalendar *calendar= [NSCalendar currentCalendar];
|
||||
NSDateComponents *date= [calendar components:(NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear) fromDate:self];
|
||||
|
||||
return (((uint32_t)[date day] + (32 * (uint32_t)[date month]) + (512 * ((uint32_t)[date year] - 1980))) << 16) |
|
||||
(((uint32_t)[date second] / 2) + (32 * (uint32_t)[date minute]) + (2048 * (uint32_t)[date hour]));
|
||||
}
|
||||
|
||||
+ (NSDate *) fromDosDate:(uint32_t)dosDate {
|
||||
uint64_t date= (uint64_t)(dosDate >> 16);
|
||||
|
||||
NSDateComponents *components= [[NSDateComponents alloc] init];
|
||||
[components setDay:date & 0x1f];
|
||||
[components setMonth:(date & 0x1E0) / 0x20];
|
||||
[components setYear:((date & 0x0FE00) / 0x0200) + 1980];
|
||||
[components setHour:(dosDate & 0xF800) / 0x800];
|
||||
[components setMinute:(dosDate & 0x7E0) / 0x20];
|
||||
[components setSecond:2 * (dosDate & 0x1f)];
|
||||
|
||||
NSCalendar *calendar= [NSCalendar currentCalendar];
|
||||
return [calendar dateFromComponents:components];
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
46
Objective-Zip/OZFileInZipInfo+Internals.h
Normal file
46
Objective-Zip/OZFileInZipInfo+Internals.h
Normal file
@@ -0,0 +1,46 @@
|
||||
//
|
||||
// OZFileInZipInfo+Internals.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "OZFileInZipInfo.h"
|
||||
|
||||
|
||||
@interface OZFileInZipInfo (Internals)
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Initialization
|
||||
|
||||
- (nonnull instancetype) initWithName:(nonnull NSString *)name length:(unsigned long long)length level:(OZZipCompressionLevel)level crypted:(BOOL)crypted size:(unsigned long long)size date:(nonnull NSDate *)date crc32:(NSUInteger)crc32;
|
||||
|
||||
|
||||
@end
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// FileInZipInfo.h
|
||||
// Objective-Zip v. 0.8
|
||||
// OZFileInZipInfo.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/12/09.
|
||||
// Copyright 2009-10 Flying Dolphin Studio. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
@@ -32,29 +32,63 @@
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "ZipFile.h"
|
||||
|
||||
#import "OZZipCompressionLevel.h"
|
||||
|
||||
|
||||
@interface FileInZipInfo : NSObject {
|
||||
|
||||
@private
|
||||
NSUInteger _length;
|
||||
ZipCompressionLevel _level;
|
||||
BOOL _crypted;
|
||||
NSUInteger _size;
|
||||
NSDate *_date;
|
||||
NSUInteger _crc32;
|
||||
NSString *_name;
|
||||
}
|
||||
/**
|
||||
@brief OZFileInZipInfo provides properties to inspect a file contained in
|
||||
the zip file.
|
||||
*/
|
||||
@interface OZFileInZipInfo : NSObject
|
||||
|
||||
- (id) initWithName:(NSString *)name length:(NSUInteger)length level:(ZipCompressionLevel)level crypted:(BOOL)crypted size:(NSUInteger)size date:(NSDate *)date crc32:(NSUInteger)crc32;
|
||||
|
||||
@property (nonatomic, readonly) NSString *name;
|
||||
@property (nonatomic, readonly) NSUInteger length;
|
||||
@property (nonatomic, readonly) ZipCompressionLevel level;
|
||||
#pragma mark -
|
||||
#pragma mark Properties
|
||||
|
||||
/**
|
||||
@brief Name of the file in the zip file.
|
||||
<p>Note: in case the zip file has a directory structure, directory and
|
||||
subdirectory names are prepended to the file name, e.g.
|
||||
"docs/html/index.html".</p>
|
||||
*/
|
||||
@property (nonatomic, readonly, nonnull) NSString *name;
|
||||
|
||||
/**
|
||||
@brief Length in bytes of the uncompressed file.
|
||||
*/
|
||||
@property (nonatomic, readonly) unsigned long long length;
|
||||
|
||||
/**
|
||||
@brief Compression level of the file. Can be:<ul>
|
||||
<li>OZZipCompressionLevelNone: not compressed (stored as is).
|
||||
<li>OZZipCompressionLevelFastest: minimum compression.
|
||||
<li>OZZipCompressionLevelBest: maximum compression
|
||||
<li>OZZipCompressionLevelDefault: intermediate compression.
|
||||
</ul>
|
||||
*/
|
||||
@property (nonatomic, readonly) OZZipCompressionLevel level;
|
||||
|
||||
/**
|
||||
@brief <code>YES</code> if the file has been encrypted during
|
||||
writing, <code>NO</code> if the file is not encrypted.
|
||||
*/
|
||||
@property (nonatomic, readonly) BOOL crypted;
|
||||
@property (nonatomic, readonly) NSUInteger size;
|
||||
@property (nonatomic, readonly) NSDate *date;
|
||||
|
||||
/**
|
||||
@brief Length in bytes of the (compressed) file in the zip file.
|
||||
*/
|
||||
@property (nonatomic, readonly) unsigned long long size;
|
||||
|
||||
/**
|
||||
@brief Date/time the of file.
|
||||
*/
|
||||
@property (nonatomic, readonly, nonnull) NSDate *date;
|
||||
|
||||
/**
|
||||
@brief CRC32 of the file.
|
||||
*/
|
||||
@property (nonatomic, readonly) NSUInteger crc32;
|
||||
|
||||
|
||||
@end
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// FileInZipInfo.m
|
||||
// Objective-Zip v. 0.8
|
||||
// OZFileInZipInfo.m
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/12/09.
|
||||
// Copyright 2009-10 Flying Dolphin Studio. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
@@ -31,30 +31,54 @@
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "FileInZipInfo.h"
|
||||
#import "OZFileInZipInfo.h"
|
||||
|
||||
|
||||
@implementation FileInZipInfo
|
||||
#pragma mark -
|
||||
#pragma mark OZFileInZipInfo extension
|
||||
|
||||
- (id) initWithName:(NSString *)name length:(NSUInteger)length level:(ZipCompressionLevel)level crypted:(BOOL)crypted size:(NSUInteger)size date:(NSDate *)date crc32:(NSUInteger)crc32 {
|
||||
@interface OZFileInZipInfo () {
|
||||
|
||||
@private
|
||||
unsigned long long _length;
|
||||
OZZipCompressionLevel _level;
|
||||
BOOL _crypted;
|
||||
unsigned long long _size;
|
||||
NSDate *_date;
|
||||
NSUInteger _crc32;
|
||||
NSString *_name;
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark OZFileInZipInfo implementation
|
||||
|
||||
@implementation OZFileInZipInfo
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Initialization
|
||||
|
||||
- (instancetype) initWithName:(NSString *)name length:(unsigned long long)length level:(OZZipCompressionLevel)level crypted:(BOOL)crypted size:(unsigned long long)size date:(NSDate *)date crc32:(NSUInteger)crc32 {
|
||||
if (self= [super init]) {
|
||||
_name= [name retain];
|
||||
_name= name;
|
||||
_length= length;
|
||||
_level= level;
|
||||
_crypted= crypted;
|
||||
_size= size;
|
||||
_date= [date retain];
|
||||
_date= date;
|
||||
_crc32= crc32;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) dealloc {
|
||||
[_date release];
|
||||
[_name release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Properties
|
||||
|
||||
@synthesize name= _name;
|
||||
@synthesize length= _length;
|
||||
@@ -64,4 +88,5 @@
|
||||
@synthesize date= _date;
|
||||
@synthesize crc32= _crc32;
|
||||
|
||||
|
||||
@end
|
||||
70
Objective-Zip/OZZipCompressionLevel.h
Normal file
70
Objective-Zip/OZZipCompressionLevel.h
Normal file
@@ -0,0 +1,70 @@
|
||||
//
|
||||
// OZZipCompressionLevel.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#ifndef Objective_Zip_OZZipCompressionLevel_h
|
||||
#define Objective_Zip_OZZipCompressionLevel_h
|
||||
|
||||
|
||||
/**
|
||||
@brief Compression level to be used to compress new files added to the zip
|
||||
file.
|
||||
*/
|
||||
typedef NS_ENUM(NSInteger, OZZipCompressionLevel) {
|
||||
|
||||
/**
|
||||
@brief Compression level that compresses the new file somewhere inbetween
|
||||
OZZipCompressionLevelBest and OZZipCompressionLevelFastest.
|
||||
*/
|
||||
OZZipCompressionLevelDefault= -1,
|
||||
|
||||
/**
|
||||
@brief Compression level that does not compress the new file, it is
|
||||
stored as is.
|
||||
*/
|
||||
OZZipCompressionLevelNone= 0,
|
||||
|
||||
/**
|
||||
@brief Compression level that compresses the new file as fast as
|
||||
possible, corresponding to the least compression.
|
||||
*/
|
||||
OZZipCompressionLevelFastest= 1,
|
||||
|
||||
/**
|
||||
@brief Compression level that compresses the new file as much as
|
||||
possible, corresponding to the slowest compression.
|
||||
*/
|
||||
OZZipCompressionLevelBest= 9
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
69
Objective-Zip/OZZipException+Internals.h
Normal file
69
Objective-Zip/OZZipException+Internals.h
Normal file
@@ -0,0 +1,69 @@
|
||||
//
|
||||
// OZZipException+Internals.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "OZZipException.h"
|
||||
|
||||
#define ERROR_WRAP_BEGIN \
|
||||
@try {
|
||||
|
||||
#define ERROR_WRAP_END_AND_RETURN(err, ret) \
|
||||
} @catch (OZZipException *ze) { \
|
||||
if (ze.error) { \
|
||||
if (err) { \
|
||||
*err= [NSError errorWithDomain:@"ObjectiveZipErrorDomain" \
|
||||
code:ze.error \
|
||||
userInfo:@{NSLocalizedDescriptionKey: ze.name, \
|
||||
NSLocalizedFailureReasonErrorKey: ze.reason}]; \
|
||||
} \
|
||||
return ret; \
|
||||
} else \
|
||||
@throw ze; \
|
||||
} @catch (NSException *exc) { \
|
||||
@throw exc; \
|
||||
}
|
||||
|
||||
|
||||
@interface OZZipException (Internals)
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Initialization
|
||||
|
||||
+ (nonnull OZZipException *) zipExceptionWithReason:(nonnull NSString *)format, ...;
|
||||
+ (nonnull OZZipException *) zipExceptionWithError:(NSInteger)error reason:(nonnull NSString *)format, ...;
|
||||
|
||||
- (nonnull instancetype) initWithReason:(nonnull NSString *)reason;
|
||||
- (nonnull instancetype) initWithError:(NSInteger)error reason:(nonnull NSString *)reason;
|
||||
|
||||
|
||||
@end
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// Objective_ZipAppDelegate.m
|
||||
// Objective-Zip
|
||||
// OZZipException.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright Flying Dolphin Studio 2009. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
@@ -31,26 +31,33 @@
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "Objective_ZipAppDelegate.h"
|
||||
#import "Objective_ZipViewController.h"
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@implementation Objective_ZipAppDelegate
|
||||
|
||||
@synthesize window;
|
||||
@synthesize viewController;
|
||||
extern const NSInteger OZ_ERROR_NO_SUCH_FILE;
|
||||
|
||||
|
||||
- (void)applicationDidFinishLaunching:(UIApplication *)application {
|
||||
[window addSubview:viewController.view];
|
||||
[window makeKeyAndVisible];
|
||||
}
|
||||
/**
|
||||
@brief OZZipException is a custom exception type to quickly discern between
|
||||
error originated during the zip/unzip process or elsewhere.
|
||||
</p>All exceptions thrown by Objective-Zip are of OZZipException type.</p>
|
||||
*/
|
||||
@interface OZZipException : NSException
|
||||
|
||||
|
||||
- (void)dealloc {
|
||||
[viewController release];
|
||||
[window release];
|
||||
[super dealloc];
|
||||
}
|
||||
#pragma mark -
|
||||
#pragma mark Properties
|
||||
|
||||
/**
|
||||
@brief Underlying error code provided by MiniZip/ZLib libraries. May be
|
||||
<code>0</code> if the exception originated in the Objective-Zip layer.
|
||||
<p>Common error codes are:<ul>
|
||||
<li>-1: System error.
|
||||
<li>-103: Bad zip file.
|
||||
<li>-104: Internal error.
|
||||
<li>-105: CRC error.
|
||||
</ul></p>
|
||||
*/
|
||||
@property (nonatomic, readonly) NSInteger error;
|
||||
|
||||
|
||||
@end
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// ZipException.m
|
||||
// Objective-Zip v. 0.8
|
||||
// OZZipException.m
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-10 Flying Dolphin Studio. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
@@ -31,27 +31,80 @@
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "ZipException.h"
|
||||
#import "OZZipException.h"
|
||||
|
||||
|
||||
@implementation ZipException
|
||||
#pragma mark -
|
||||
#pragma mark OZZipException extension
|
||||
|
||||
- (id) initWithReason:(NSString *)reason {
|
||||
if (self= [super initWithName:@"ZipException" reason:reason userInfo:nil]) {
|
||||
@interface OZZipException () {
|
||||
|
||||
@private
|
||||
NSInteger _error;
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark OZZipException constants
|
||||
|
||||
const NSInteger OZ_ERROR_NO_SUCH_FILE= -9001;
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark OZZipException implementation
|
||||
|
||||
@implementation OZZipException
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Initialization
|
||||
|
||||
+ (OZZipException *) zipExceptionWithReason:(NSString *)format, ... {
|
||||
|
||||
// Variable arguments formatting
|
||||
va_list arguments;
|
||||
va_start(arguments, format);
|
||||
NSString *reason= [[NSString alloc] initWithFormat:format arguments:arguments];
|
||||
va_end(arguments);
|
||||
|
||||
return [[OZZipException alloc] initWithReason:reason];
|
||||
}
|
||||
|
||||
+ (OZZipException *) zipExceptionWithError:(NSInteger)error reason:(NSString *)format, ... {
|
||||
|
||||
// Variable arguments formatting
|
||||
va_list arguments;
|
||||
va_start(arguments, format);
|
||||
NSString *reason= [[NSString alloc] initWithFormat:format arguments:arguments];
|
||||
va_end(arguments);
|
||||
|
||||
return [[OZZipException alloc] initWithError:error reason:reason];
|
||||
}
|
||||
|
||||
- (instancetype) initWithReason:(NSString *)reason {
|
||||
if (self= [super initWithName:@"OZZipException" reason:reason userInfo:nil]) {
|
||||
_error= 0;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id) initWithError:(NSInteger)error reason:(NSString *)reason {
|
||||
if (self= [super initWithName:@"ZipException" reason:reason userInfo:nil]) {
|
||||
- (instancetype) initWithError:(NSInteger)error reason:(NSString *)reason {
|
||||
if (self= [super initWithName:@"OZZipException" reason:reason userInfo:nil]) {
|
||||
_error= error;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Properties
|
||||
|
||||
@synthesize error= _error;
|
||||
|
||||
|
||||
@end
|
||||
329
Objective-Zip/OZZipFile+NSError.h
Normal file
329
Objective-Zip/OZZipFile+NSError.h
Normal file
@@ -0,0 +1,329 @@
|
||||
//
|
||||
// OZZipFile+NSError.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "OZZipFile.h"
|
||||
|
||||
|
||||
/**
|
||||
@brief Indicates the file could not be located in the zip file.
|
||||
*/
|
||||
static const NSInteger OZLocateFileResultNotFound= -1;
|
||||
|
||||
/**
|
||||
@brief Indicates the file has been successfully located in the zip file.
|
||||
*/
|
||||
static const NSInteger OZLocateFileResultFound= 1;
|
||||
|
||||
|
||||
@interface OZZipFile (NSError)
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Initialization (NSError variants)
|
||||
|
||||
/**
|
||||
@brief Creates a OZZipFile with the specified zip file name and access mode.
|
||||
<p>The access mode specifies if the zip is being created, appended, or
|
||||
unzipped.</p>
|
||||
<p>Note: the zip file is opened in 64-bit mode.</p>
|
||||
@param fileName File name of the zip file.
|
||||
@param mode Access mode, can be:<ul>
|
||||
<li>OZZipFileModeUnzip: the zip file is opened for reading.
|
||||
<li>OZZipFileModeCreate: the zip file is opened for creation.
|
||||
<br/>Note: if the file already exists the behavior is unspecified.
|
||||
<li>OZZipFileModeAppend: the zip file is opened for writing.
|
||||
</ul>
|
||||
@param error If passed, may be filled with an NSError is case the file
|
||||
can't be opened.
|
||||
@throws OZZipException If the access mode is invalid.
|
||||
*/
|
||||
- (nullable instancetype) initWithFileName:(nonnull NSString *)fileName mode:(OZZipFileMode)mode error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
/**
|
||||
@brief Creates a OZZipFile with the specified zip file name, access mode and
|
||||
legacy 32-bit mode compatibility.
|
||||
<p>The access mode specifies if the zip is being created, appended, or
|
||||
unzipped.</p>
|
||||
@param fileName File name of the zip file.
|
||||
@param mode Access mode, can be:<ul>
|
||||
<li>OZZipFileModeUnzip: the zip file is opened for reading.
|
||||
<li>OZZipFileModeCreate: the zip file is opened for creation.
|
||||
<br/>Note: if the file already exists the behavior is unspecified.
|
||||
<li>OZZipFileModeAppend: the zip file is opened for writing.
|
||||
</ul>
|
||||
@param legacy32BitMode If set, the zip file is opened in 32-bit mode to
|
||||
provide compatibility with older operating systems (such as some
|
||||
version of Android).
|
||||
@param error If passed, may be filled with an NSError is case the file
|
||||
can't be opened.
|
||||
@throws OZZipException If the access mode is invalid.
|
||||
*/
|
||||
- (nullable instancetype) initWithFileName:(nonnull NSString *)fileName mode:(OZZipFileMode)mode legacy32BitMode:(BOOL)legacy32BitMode error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark File writing (NSError variants)
|
||||
|
||||
/**
|
||||
@brief Creates a new OZZipWriteStream for adding a new file in the zip file
|
||||
content.
|
||||
<p>The returned write stream can be used to write data to the new file.</p>
|
||||
<p>Note: the new file is added with the current date/time.</p>
|
||||
@param fileNameInZip Name of the new file that must be added to the zip file
|
||||
content.
|
||||
<br/>Note: to structure the zip file with directories and subdirectories,
|
||||
ensure to prepend them in the file name, e.g. "docs/html/index.html"
|
||||
@param compressionLevel The compression level that must be used to compress
|
||||
the new file added to the zip file content. Can be:<ul>
|
||||
<li>OZZipCompressionLevelNone: does not compress the new file, it is stored
|
||||
as is.
|
||||
<li>OZZipCompressionLevelFastest: uses the fastest compression level, which
|
||||
also compresses the least.
|
||||
<li>OZZipCompressionLevelBest: uses the best compression level, which is also
|
||||
the slowest.
|
||||
<li>OZZipCompressionLevelDefault: uses the default compression level,
|
||||
somewhere inbetween OZZipCompressionLevelBest and
|
||||
OZZipCompressionLevelFastest.
|
||||
</ul>
|
||||
@param error If passed, may be filled with an NSError is case the write
|
||||
stream can't be opened.
|
||||
@return A new OZZipWriteStream for writing data to the new file in the zip
|
||||
file content, or <code>nil</code> if an error occurs.
|
||||
@throws OZZipException If the zip file has been opened in unzip mode.
|
||||
*/
|
||||
- (nullable OZZipWriteStream *) writeFileInZipWithName:(nonnull NSString *)fileNameInZip compressionLevel:(OZZipCompressionLevel)compressionLevel error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
/**
|
||||
@brief Creates a new OZZipWriteStream for adding a new file in the zip file
|
||||
content.
|
||||
<p>The returned write stream can be used to write data to the new file.</p>
|
||||
@param fileNameInZip Name of the new file that must be added to the zip file
|
||||
content.
|
||||
<br/>Note: to structure the zip file with directories and subdirectories,
|
||||
ensure to prepend them in the file name, e.g. "docs/html/index.html"
|
||||
@param fileDate The date/time of the new file that must be added to the zip
|
||||
file content.
|
||||
@param compressionLevel The compression level that must be used to compress
|
||||
the new file added to the zip file content. Can be:<ul>
|
||||
<li>OZZipCompressionLevelNone: does not compress the new file, it is stored
|
||||
as is.
|
||||
<li>OZZipCompressionLevelFastest: uses the fastest compression level, which
|
||||
also compresses the least.
|
||||
<li>OZZipCompressionLevelBest: uses the best compression level, which is also
|
||||
the slowest.
|
||||
<li>OZZipCompressionLevelDefault: uses the default compression level,
|
||||
somewhere inbetween OZZipCompressionLevelBest and
|
||||
OZZipCompressionLevelFastest.
|
||||
</ul>
|
||||
@param error If passed, may be filled with an NSError is case the write
|
||||
stream can't be opened.
|
||||
@return A new OZZipWriteStream for writing data to the new file in the zip
|
||||
file content, or <code>nil</code> if an error occurs.
|
||||
@throws OZZipException If the zip file has been opened in unzip mode.
|
||||
*/
|
||||
- (nullable OZZipWriteStream *) writeFileInZipWithName:(nonnull NSString *)fileNameInZip fileDate:(nonnull NSDate *)fileDate compressionLevel:(OZZipCompressionLevel)compressionLevel error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
/**
|
||||
@brief Creates a new OZZipWriteStream for adding a new encrypted file in the
|
||||
zip file content.
|
||||
<p>The returned write stream can be used to write data to the new file.</p>
|
||||
@param fileNameInZip Name of the new file that must be added to the zip file
|
||||
content.
|
||||
<br/>Note: to structure the zip file with directories and subdirectories,
|
||||
ensure to prepend them in the file name, e.g. "docs/html/index.html"
|
||||
@param fileDate The date/time of the new file that must be added to the zip
|
||||
file content.
|
||||
@param compressionLevel The compression level that must be used to compress
|
||||
the new file added to the zip file content. Can be:<ul>
|
||||
<li>OZZipCompressionLevelNone: does not compress the new file, it is stored
|
||||
as is.
|
||||
<li>OZZipCompressionLevelFastest: uses the fastest compression level, which
|
||||
also compresses the least.
|
||||
<li>OZZipCompressionLevelBest: uses the best compression level, which is also
|
||||
the slowest.
|
||||
<li>OZZipCompressionLevelDefault: uses the default compression level,
|
||||
somewhere inbetween OZZipCompressionLevelBest and
|
||||
OZZipCompressionLevelFastest.
|
||||
</ul>
|
||||
@param password The password that must be used to encrypt the new file data.
|
||||
@param crc32 A precomputed CRC32 of the new file data (needed for crypting).
|
||||
@param error If passed, may be filled with an NSError is case the write
|
||||
stream can't be opened.
|
||||
@return A new OZZipWriteStream for writing data to the new file in the zip
|
||||
file content, or <code>nil</code> if an error occurs.
|
||||
@throws OZZipException If the zip file has been opened in unzip mode.
|
||||
*/
|
||||
- (nullable OZZipWriteStream *) writeFileInZipWithName:(nonnull NSString *)fileNameInZip fileDate:(nonnull NSDate *)fileDate compressionLevel:(OZZipCompressionLevel)compressionLevel password:(nonnull NSString *)password crc32:(uint32_t)crc32 error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark File seeking and info (NSError variants)
|
||||
|
||||
/**
|
||||
@brief Moves selection to the first file contained in the zip file.
|
||||
<p>The selected file may then be read by obaining a OZZipReadStream with
|
||||
<code>readCurrentFileInZip</code>.</p>
|
||||
@param error If passed, may be filled with an NSError is case the first file
|
||||
can't be selected.
|
||||
@return <code>YES</code> if the first file has been selected, <code>NO</code>
|
||||
if it could not select the first file due to an error.
|
||||
@throws OZZipException If the zip file has been opened with a mode other than
|
||||
Unzip.
|
||||
*/
|
||||
- (BOOL) goToFirstFileInZipWithError:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
/**
|
||||
@brief Moves selection to the next file contained in the zip file.
|
||||
<p>The selected file may then be read by obaining a OZZipReadStream with
|
||||
<code>readCurrentFileInZip</code>.</p>
|
||||
@param error If passed, may be filled with an NSError is case the next file
|
||||
can't be selected.
|
||||
@return <code>YES</code> if the next file has been selected, <code>NO</code>
|
||||
if there were no more files to select in the zip file, or the next file could
|
||||
not be selected due to an error.
|
||||
@throws OZZipException If the zip file has been opened with a mode other than
|
||||
Unzip.
|
||||
*/
|
||||
- (BOOL) goToNextFileInZipWithError:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
/**
|
||||
@brief Locates a file by name in the zip file and selects it.
|
||||
<p>The selected file may then be read by obaining a OZZipReadStream with
|
||||
<code>readCurrentFileInZip</code>.</p>
|
||||
@param error If passed, may be filled with an NSError is case the file can't
|
||||
be located.
|
||||
@return <code>OZLocateFileResultFound</code> if the file has been located
|
||||
and selected, <code>OZLocateFileResultNotFound</code> if the specified
|
||||
file name is not present in the zip file, or <code>0</code> if the file could
|
||||
not be located due to an error.
|
||||
<br/>NOTE: return value convention is different in the standard (non-NSError
|
||||
compliant) interface.
|
||||
@throws OZZipException If the zip file has been opened with a mode other than
|
||||
Unzip.
|
||||
*/
|
||||
- (NSInteger) __attribute__((swift_error(nonnull_error))) locateFileInZip:(nonnull NSString *)fileNameInZip error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
/**
|
||||
@brief Returns the number of files contained in the zip file.
|
||||
@param error If passed, may be filled with an NSError is case the number of
|
||||
files could not be obtained.
|
||||
@return The number of files contained in the zip file, 0 if the number of
|
||||
files could not be obtained due to an error.
|
||||
@throws OZZipException If the zip file has been opened with a mode other
|
||||
than Unzip.
|
||||
*/
|
||||
- (NSUInteger) __attribute__((swift_error(nonnull_error))) numFilesInZipWithError:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
/**
|
||||
@brief Returns a list of OZFileInZipInfo with the information on all the files
|
||||
contained in the zip file.
|
||||
@param error If passed, may be filled with an NSError is case the list of
|
||||
file info could not be obtained.
|
||||
@return The list of OZFileInZipInfo with the information on all the files
|
||||
contained in the zip file, <code>nil</code> if the list of file info could
|
||||
not be obtained due to an error.
|
||||
@throws OZZipException If the zip file has been opened with a mode other than
|
||||
Unzip.
|
||||
*/
|
||||
- (nullable NSArray *) listFileInZipInfosWithError:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
/**
|
||||
@brief Returns an OZFileInZipInfo with the information on the currently
|
||||
selected file in the zip file.
|
||||
@param error If passed, may be filled with an NSError is case the file info
|
||||
could not be obtained.
|
||||
@return An OZFileInZipInfo with the information on the currently
|
||||
selected file in the zip file, <code>nil</code> if the file info could not be
|
||||
obtained due to an error.
|
||||
@throws OZZipException If the zip file has been opened with a mode other than
|
||||
Unzip.
|
||||
*/
|
||||
- (nullable OZFileInZipInfo *) getCurrentFileInZipInfoWithError:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark File reading (NSError variants)
|
||||
|
||||
/**
|
||||
@brief Creates a OZZipReadStream for reading the currently selected file in
|
||||
the zip file.
|
||||
<p>A file in the zip file can be selected using
|
||||
<code>goToFirstFileInZip</code>, <code>goToNextFileInZip</code> and
|
||||
<code>locateFileInZip:</code>.</p>
|
||||
@param error If passed, may be filled with an NSError is case the read stream
|
||||
could not be created.
|
||||
@return The OZZipReadStream to be used for reading the currently selected file
|
||||
in the zip file, <code>nil</code> if the read stream could not be created
|
||||
due to an error.
|
||||
@throws OZZipException If the zip file has been opened with a mode other than
|
||||
Unzip.
|
||||
*/
|
||||
- (nullable OZZipReadStream *) readCurrentFileInZipWithError:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
/**
|
||||
@brief Creates a OZZipReadStream for reading the currently selected file in
|
||||
the zip file, if it is encrypted.
|
||||
<p>A file in the zip file can be selected using
|
||||
<code>goToFirstFileInZip</code>, <code>goToNextFileInZip</code> and
|
||||
<code>locateFileInZip:</code>.</p>
|
||||
@param password The password that must be used to decrypt the file data.
|
||||
@param error If passed, may be filled with an NSError is case the read stream
|
||||
could not be created.
|
||||
@return The OZZipReadStream to be used for reading the currently selected file
|
||||
in the zip file, <code>nil</code> if the read stream could not be created
|
||||
due to an error.
|
||||
@throws OZZipException If the zip file has been opened with a mode other than
|
||||
Unzip.
|
||||
*/
|
||||
- (nullable OZZipReadStream *) readCurrentFileInZipWithPassword:(nonnull NSString *)password error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Closing (NSError variants)
|
||||
|
||||
/**
|
||||
@brief Closes the zip file and releases its resources.
|
||||
<p>Once you have finished working with the zip file (e.g. all files have been
|
||||
unzipped, or all files have been added), it is important to close it so system
|
||||
resources may be freed.</p>
|
||||
<p>Note: after the zip file has been closed any subsequent call will result in an
|
||||
error.</p>
|
||||
@param error If passed, may be filled with an NSError is case the zip file
|
||||
could not be closed.
|
||||
@return <code>YES</code> if the zip file has been closed, <code>NO</code> if
|
||||
the zip file could not be closed due to an error.
|
||||
*/
|
||||
- (BOOL) closeWithError:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
|
||||
@end
|
||||
284
Objective-Zip/OZZipFile+Standard.h
Normal file
284
Objective-Zip/OZZipFile+Standard.h
Normal file
@@ -0,0 +1,284 @@
|
||||
//
|
||||
// OZZipFile+Standard.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "OZZipFile.h"
|
||||
|
||||
|
||||
@interface OZZipFile (Standard)
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Initialization
|
||||
|
||||
/**
|
||||
@brief Creates a OZZipFile with the specified zip file name and access mode.
|
||||
<p>The access mode specifies if the zip is being created, appended, or
|
||||
unzipped.</p>
|
||||
<p>Note: the zip file is opened in 64-bit mode.</p>
|
||||
@param fileName File name of the zip file.
|
||||
@param mode Access mode, can be:<ul>
|
||||
<li>OZZipFileModeUnzip: the zip file is opened for reading.
|
||||
<li>OZZipFileModeCreate: the zip file is opened for creation.
|
||||
<br/>Note: if the file already exists the behavior is unspecified.
|
||||
<li>OZZipFileModeAppend: the zip file is opened for writing.
|
||||
</ul>
|
||||
@throws OZZipException If the file can't be opened due to an erroror if the
|
||||
access mode is invalid.
|
||||
*/
|
||||
- (nonnull instancetype) initWithFileName:(nonnull NSString *)fileName mode:(OZZipFileMode)mode;
|
||||
|
||||
/**
|
||||
@brief Creates a OZZipFile with the specified zip file name, access mode and
|
||||
legacy 32-bit mode compatibility.
|
||||
<p>The access mode specifies if the zip is being created, appended, or
|
||||
unzipped.</p>
|
||||
@param fileName File name of the zip file.
|
||||
@param mode Access mode, can be:<ul>
|
||||
<li>OZZipFileModeUnzip: the zip file is opened for reading.
|
||||
<li>OZZipFileModeCreate: the zip file is opened for creation.
|
||||
<br/>Note: if the file already exists the behavior is unspecified.
|
||||
<li>OZZipFileModeAppend: the zip file is opened for writing.
|
||||
</ul>
|
||||
@param legacy32BitMode If set, the zip file is opened in 32-bit mode to
|
||||
provide compatibility with older operating systems (such as some
|
||||
version of Android).
|
||||
@throws OZZipException If the file can't be opened due to an error or if the
|
||||
access mode is invalid.
|
||||
*/
|
||||
- (nonnull instancetype) initWithFileName:(nonnull NSString *)fileName mode:(OZZipFileMode)mode legacy32BitMode:(BOOL)legacy32BitMode;
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark File writing
|
||||
|
||||
/**
|
||||
@brief Creates a new OZZipWriteStream for adding a new file in the zip file
|
||||
content.
|
||||
<p>The returned write stream can be used to write data to the new file.</p>
|
||||
<p>Note: the new file is added with the current date/time.</p>
|
||||
@param fileNameInZip Name of the new file that must be added to the zip file
|
||||
content.
|
||||
<br/>Note: to structure the zip file with directories and subdirectories,
|
||||
ensure to prepend them in the file name, e.g. "docs/html/index.html"
|
||||
@param compressionLevel The compression level that must be used to compress
|
||||
the new file added to the zip file content. Can be:<ul>
|
||||
<li>OZZipCompressionLevelNone: does not compress the new file, it is stored
|
||||
as is.
|
||||
<li>OZZipCompressionLevelFastest: uses the fastest compression level, which
|
||||
also compresses the least.
|
||||
<li>OZZipCompressionLevelBest: uses the best compression level, which is also
|
||||
the slowest.
|
||||
<li>OZZipCompressionLevelDefault: uses the default compression level,
|
||||
somewhere inbetween OZZipCompressionLevelBest and
|
||||
OZZipCompressionLevelFastest.
|
||||
</ul>
|
||||
@return A new OZZipWriteStream for writing data to the new file in the zip
|
||||
file content.
|
||||
@throws OZZipException If the file stream can't be created due to an error or
|
||||
if the zip file has been opened in unzip mode.
|
||||
*/
|
||||
- (nonnull OZZipWriteStream *) writeFileInZipWithName:(nonnull NSString *)fileNameInZip compressionLevel:(OZZipCompressionLevel)compressionLevel;
|
||||
|
||||
/**
|
||||
@brief Creates a new OZZipWriteStream for adding a new file in the zip file
|
||||
content.
|
||||
<p>The returned write stream can be used to write data to the new file.</p>
|
||||
@param fileNameInZip Name of the new file that must be added to the zip file
|
||||
content.
|
||||
<br/>Note: to structure the zip file with directories and subdirectories,
|
||||
ensure to prepend them in the file name, e.g. "docs/html/index.html"
|
||||
@param fileDate The date/time of the new file that must be added to the zip
|
||||
file content.
|
||||
@param compressionLevel The compression level that must be used to compress
|
||||
the new file added to the zip file content. Can be:<ul>
|
||||
<li>OZZipCompressionLevelNone: does not compress the new file, it is stored
|
||||
as is.
|
||||
<li>OZZipCompressionLevelFastest: uses the fastest compression level, which
|
||||
also compresses the least.
|
||||
<li>OZZipCompressionLevelBest: uses the best compression level, which is also
|
||||
the slowest.
|
||||
<li>OZZipCompressionLevelDefault: uses the default compression level,
|
||||
somewhere inbetween OZZipCompressionLevelBest and
|
||||
OZZipCompressionLevelFastest.
|
||||
</ul>
|
||||
@return A new OZZipWriteStream for writing data to the new file in the zip
|
||||
file content.
|
||||
@throws OZZipException If the file stream can't be created due to an error or
|
||||
if the zip file has been opened in unzip mode.
|
||||
*/
|
||||
- (nonnull OZZipWriteStream *) writeFileInZipWithName:(nonnull NSString *)fileNameInZip fileDate:(nonnull NSDate *)fileDate compressionLevel:(OZZipCompressionLevel)compressionLevel;
|
||||
|
||||
/**
|
||||
@brief Creates a new OZZipWriteStream for adding a new encrypted file in the
|
||||
zip file content.
|
||||
<p>The returned write stream can be used to write data to the new file.</p>
|
||||
@param fileNameInZip Name of the new file that must be added to the zip file
|
||||
content.
|
||||
<br/>Note: to structure the zip file with directories and subdirectories,
|
||||
ensure to prepend them in the file name, e.g. "docs/html/index.html"
|
||||
@param fileDate The date/time of the new file that must be added to the zip
|
||||
file content.
|
||||
@param compressionLevel The compression level that must be used to compress
|
||||
the new file added to the zip file content. Can be:<ul>
|
||||
<li>OZZipCompressionLevelNone: does not compress the new file, it is stored
|
||||
as is.
|
||||
<li>OZZipCompressionLevelFastest: uses the fastest compression level, which
|
||||
also compresses the least.
|
||||
<li>OZZipCompressionLevelBest: uses the best compression level, which is also
|
||||
the slowest.
|
||||
<li>OZZipCompressionLevelDefault: uses the default compression level,
|
||||
somewhere inbetween OZZipCompressionLevelBest and
|
||||
OZZipCompressionLevelFastest.
|
||||
</ul>
|
||||
@param password The password that must be used to encrypt the new file data.
|
||||
@param crc32 A precomputed CRC32 of the new file data (needed for crypting).
|
||||
@return A new OZZipWriteStream for writing data to the new file in the zip
|
||||
file content.
|
||||
@throws OZZipException If the file stream can't be created due to an error or
|
||||
if the zip file has been opened in unzip mode.
|
||||
*/
|
||||
- (nonnull OZZipWriteStream *) writeFileInZipWithName:(nonnull NSString *)fileNameInZip fileDate:(nonnull NSDate *)fileDate compressionLevel:(OZZipCompressionLevel)compressionLevel password:(nonnull NSString *)password crc32:(uint32_t)crc32;
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark File seeking and info
|
||||
|
||||
/**
|
||||
@brief Moves selection to the first file contained in the zip file.
|
||||
<p>The selected file may then be read by obaining a OZZipReadStream with
|
||||
<code>readCurrentFileInZip</code>.</p>
|
||||
@throws OZZipException If the first file can't be selected due to an error or
|
||||
if the zip file has been opened with a mode other than Unzip.
|
||||
*/
|
||||
- (void) goToFirstFileInZip;
|
||||
|
||||
/**
|
||||
@brief Moves selection to the next file contained in the zip file.
|
||||
<p>The selected file may then be read by obaining a OZZipReadStream with
|
||||
<code>readCurrentFileInZip</code>.</p>
|
||||
@return <code>YES</code> if the next file has been selected,
|
||||
<code>NO</code> if there were no more files to select in the zip file.
|
||||
@throws OZZipException If the next file can't be selected due to an error or
|
||||
if the zip file has been opened with a mode other than Unzip.
|
||||
*/
|
||||
- (BOOL) goToNextFileInZip;
|
||||
|
||||
/**
|
||||
@brief Locates a file by name in the zip file and selects it.
|
||||
<p>The selected file may then be read by obaining a OZZipReadStream with
|
||||
<code>readCurrentFileInZip</code>.</p>
|
||||
@return <code>YES</code> if the file has been located and selected,
|
||||
<code>NO</code> if the specified file name is not present in the zip file.
|
||||
<br/>NOTE: return value convention is different in NSError compliant
|
||||
interface.
|
||||
@throws OZZipException If the file can't be located due to an error or if the
|
||||
zip file has been opened with a mode other than Unzip.
|
||||
*/
|
||||
- (BOOL) locateFileInZip:(nonnull NSString *)fileNameInZip;
|
||||
|
||||
/**
|
||||
@brief Returns the number of files contained in the zip file.
|
||||
@return The number of files contained in the zip file.
|
||||
@throws OZZipException If the number of files could not be obtained due to an
|
||||
error or if the zip file has been opened with a mode other than Unzip.
|
||||
*/
|
||||
- (NSUInteger) numFilesInZip;
|
||||
|
||||
/**
|
||||
@brief Returns a list of OZFileInZipInfo with the information on all the files
|
||||
contained in the zip file.
|
||||
@return The list of OZFileInZipInfo with the information on all the files
|
||||
contained in the zip file.
|
||||
@throws OZZipException If the list of file info could not be obtained due to
|
||||
an error or if the zip file has been opened with a mode other than Unzip.
|
||||
*/
|
||||
- (nonnull NSArray *) listFileInZipInfos;
|
||||
|
||||
/**
|
||||
@brief Returns an OZFileInZipInfo with the information on the currently
|
||||
selected file in the zip file.
|
||||
@return An OZFileInZipInfo with the information on the currently
|
||||
selected file in the zip file.
|
||||
@throws OZZipException If the info info could not be obtained due to an error
|
||||
or if the zip file has been opened with a mode other than Unzip.
|
||||
*/
|
||||
- (nonnull OZFileInZipInfo *) getCurrentFileInZipInfo;
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark File reading
|
||||
|
||||
/**
|
||||
@brief Creates a OZZipReadStream for reading the currently selected file in
|
||||
the zip file.
|
||||
<p>A file in the zip file can be selected using
|
||||
<code>goToFirstFileInZip</code>, <code>goToNextFileInZip</code> and
|
||||
<code>locateFileInZip:</code>.</p>
|
||||
@return The OZZipReadStream to be used for reading the currently selected file
|
||||
in the zip file.
|
||||
@throws OZZipException If the read stream could not be created due to an error
|
||||
or if the zip file has been opened with a mode other than Unzip.
|
||||
*/
|
||||
- (nonnull OZZipReadStream *) readCurrentFileInZip;
|
||||
|
||||
/**
|
||||
@brief Creates a OZZipReadStream for reading the currently selected file in
|
||||
the zip file, if it is encrypted.
|
||||
<p>A file in the zip file can be selected using
|
||||
<code>goToFirstFileInZip</code>, <code>goToNextFileInZip</code> and
|
||||
<code>locateFileInZip:</code>.</p>
|
||||
@param password The password that must be used to decrypt the file data.
|
||||
@return The OZZipReadStream to be used for reading the currently selected file
|
||||
in the zip file.
|
||||
@throws OZZipException If the read stream could not be created due to an error
|
||||
or if the zip file has been opened with a mode other than Unzip.
|
||||
*/
|
||||
- (nonnull OZZipReadStream *) readCurrentFileInZipWithPassword:(nonnull NSString *)password;
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Closing
|
||||
|
||||
/**
|
||||
@brief Closes the zip file and releases its resources.
|
||||
<p>Once you have finished working with the zip file (e.g. all files have been
|
||||
unzipped, or all files have been added), it is important to close it so system
|
||||
resources may be freed.</p>
|
||||
<p>Note: after the zip file has been closed any subsequent call will result in an
|
||||
error.</p>
|
||||
@throws OZZipException If the zip file could not be closed due to an error.
|
||||
*/
|
||||
- (void) close;
|
||||
|
||||
|
||||
@end
|
||||
84
Objective-Zip/OZZipFile.h
Normal file
84
Objective-Zip/OZZipFile.h
Normal file
@@ -0,0 +1,84 @@
|
||||
//
|
||||
// OZZipFile.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "OZZipFileMode.h"
|
||||
#import "OZZipCompressionLevel.h"
|
||||
|
||||
|
||||
@class OZZipReadStream;
|
||||
@class OZZipWriteStream;
|
||||
@class OZFileInZipInfo;
|
||||
|
||||
/**
|
||||
@brief OZZipFile provides read or write access to a single zip file.
|
||||
<p> During initialization you must specify the access mode, i.e. if the zip
|
||||
file is being created, appended, or unzipped. You can also specify if the zip
|
||||
file must be opened in legacy 32-bit mode, to be compatible with older
|
||||
operating systems (such as some versions of Android).</p>
|
||||
<p> If the zip file has been opened in unzip mode, you can list its content,
|
||||
move within its content from file to file, and finally open a reading stream
|
||||
of the selected file.</p>
|
||||
<p> If the zip file has been opened in creation or append mode, you can open a
|
||||
writing stream to add new files to its content.</p>
|
||||
*/
|
||||
@interface OZZipFile : NSObject
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Properties
|
||||
|
||||
/**
|
||||
@brief File name of the zip file.
|
||||
*/
|
||||
@property (nonatomic, readonly, nonnull) NSString *fileName;
|
||||
|
||||
/**
|
||||
@brief Access mode specified during opening. Can be:<ul>
|
||||
<li>OZZipFileModeUnzip: the zip file has been opened for reading.
|
||||
<li>OZZipFileModeCreate: the zip file has been opened for creation.
|
||||
<li>OZZipFileModeAppend: the zip file has been opened for writing.
|
||||
</ul>
|
||||
*/
|
||||
@property (nonatomic, readonly) OZZipFileMode mode;
|
||||
|
||||
/**
|
||||
@brief <code>YES</code> if the zip file has been opened in 32-bit
|
||||
compatibility mode, <code>NO</code> if it has been opened in standard
|
||||
(default) 64-bit mode.
|
||||
*/
|
||||
@property (nonatomic, readonly) BOOL legacy32BitMode;
|
||||
|
||||
|
||||
@end
|
||||
570
Objective-Zip/OZZipFile.m
Normal file
570
Objective-Zip/OZZipFile.m
Normal file
@@ -0,0 +1,570 @@
|
||||
//
|
||||
// OZZipFile.m
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "OZZipFile.h"
|
||||
#import "OZZipFile+Standard.h"
|
||||
#import "OZZipFile+NSError.h"
|
||||
#import "OZZipException.h"
|
||||
#import "OZZipException+Internals.h"
|
||||
#import "OZZipReadStream.h"
|
||||
#import "OZZipReadStream+Standard.h"
|
||||
#import "OZZipReadStream+NSError.h"
|
||||
#import "OZZipReadStream+Internals.h"
|
||||
#import "OZZipWriteStream.h"
|
||||
#import "OZZipWriteStream+Standard.h"
|
||||
#import "OZZipWriteStream+NSError.h"
|
||||
#import "OZZipWriteStream+Internals.h"
|
||||
#import "OZFileInZipInfo.h"
|
||||
#import "OZFileInZipInfo+Internals.h"
|
||||
#import "NSDate+DOSDate.h"
|
||||
|
||||
#include "zip.h"
|
||||
#include "unzip.h"
|
||||
|
||||
#define FILE_IN_ZIP_MAX_NAME_LENGTH (256)
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark OZZipFile extension
|
||||
|
||||
@interface OZZipFile () {
|
||||
NSString *_fileName;
|
||||
OZZipFileMode _mode;
|
||||
BOOL _legacy32BitMode;
|
||||
|
||||
@private
|
||||
zipFile _zipFile;
|
||||
unzFile _unzFile;
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark OZZipFile implementation
|
||||
|
||||
@implementation OZZipFile
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Initialization
|
||||
|
||||
- (instancetype) initWithFileName:(NSString *)fileName mode:(OZZipFileMode)mode {
|
||||
return [self initWithFileName:fileName mode:mode legacy32BitMode:NO];
|
||||
}
|
||||
|
||||
- (instancetype) initWithFileName:(NSString *)fileName mode:(OZZipFileMode)mode legacy32BitMode:(BOOL)legacy32BitMode {
|
||||
if (self= [super init]) {
|
||||
_fileName= fileName;
|
||||
_mode= mode;
|
||||
_legacy32BitMode= legacy32BitMode;
|
||||
|
||||
const char *path= [_fileName cStringUsingEncoding:NSUTF8StringEncoding];
|
||||
switch (mode) {
|
||||
case OZZipFileModeUnzip:
|
||||
|
||||
// Support for legacy 32 bit mode: here we use 32 or 64 bit version
|
||||
// alternatively, as internal (common) version is not exposed
|
||||
_unzFile= (_legacy32BitMode ? unzOpen(path) : unzOpen64(path));
|
||||
if (_unzFile == NULL)
|
||||
@throw [OZZipException zipExceptionWithError:OZ_ERROR_NO_SUCH_FILE reason:@"Can't open '%@'", _fileName];
|
||||
break;
|
||||
|
||||
case OZZipFileModeCreate:
|
||||
|
||||
// Support for legacy 32 bit mode: here we use the common version
|
||||
_zipFile= zipOpen3(path, APPEND_STATUS_CREATE, 0, NULL, NULL);
|
||||
if (_zipFile == NULL)
|
||||
@throw [OZZipException zipExceptionWithError:OZ_ERROR_NO_SUCH_FILE reason:@"Can't open '%@'", _fileName];
|
||||
break;
|
||||
|
||||
case OZZipFileModeAppend:
|
||||
|
||||
// Support for legacy 32 bit mode: here we use the common version
|
||||
_zipFile= zipOpen3(path, APPEND_STATUS_ADDINZIP, 0, NULL, NULL);
|
||||
if (_zipFile == NULL)
|
||||
@throw [OZZipException zipExceptionWithError:OZ_ERROR_NO_SUCH_FILE reason:@"Can't open '%@'", _fileName];
|
||||
break;
|
||||
|
||||
default:
|
||||
@throw [OZZipException zipExceptionWithReason:@"Unknown mode %d", _mode];
|
||||
}
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Initialization (NSError variants)
|
||||
|
||||
- (instancetype) initWithFileName:(NSString *)fileName mode:(OZZipFileMode)mode error:(NSError *__autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
return [self initWithFileName:fileName mode:mode];
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, nil);
|
||||
}
|
||||
|
||||
- (instancetype) initWithFileName:(NSString *)fileName mode:(OZZipFileMode)mode legacy32BitMode:(BOOL)legacy32BitMode error:(NSError *__autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
return [self initWithFileName:fileName mode:mode legacy32BitMode:legacy32BitMode];
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, nil);
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark File writing
|
||||
|
||||
- (OZZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip compressionLevel:(OZZipCompressionLevel)compressionLevel {
|
||||
if (_mode == OZZipFileModeUnzip)
|
||||
@throw [OZZipException zipExceptionWithReason:@"Operation not permitted in Unzip mode"];
|
||||
|
||||
zip_fileinfo zi;
|
||||
zi.internal_fa= 0;
|
||||
zi.external_fa= 0;
|
||||
zi.dos_date= [[NSDate date] dosDate];
|
||||
|
||||
// Support for legacy 32 bit mode: here we use the common version,
|
||||
// passing a flag to tell if it is a 32 or 64 bit file
|
||||
int err= zipOpenNewFileInZip3_64(_zipFile,
|
||||
[fileNameInZip cStringUsingEncoding:NSUTF8StringEncoding],
|
||||
&zi,
|
||||
NULL, 0, NULL, 0, NULL,
|
||||
(compressionLevel != OZZipCompressionLevelNone) ? Z_DEFLATED : 0,
|
||||
compressionLevel, 0,
|
||||
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
|
||||
NULL, 0,
|
||||
(_legacy32BitMode ? 0 : 1));
|
||||
|
||||
if (err != ZIP_OK)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error opening '%@' in zipfile", fileNameInZip];
|
||||
|
||||
return [[OZZipWriteStream alloc] initWithZipFileStruct:_zipFile fileNameInZip:fileNameInZip];
|
||||
}
|
||||
|
||||
- (OZZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip fileDate:(NSDate *)fileDate compressionLevel:(OZZipCompressionLevel)compressionLevel {
|
||||
if (_mode == OZZipFileModeUnzip)
|
||||
@throw [OZZipException zipExceptionWithReason:@"Operation not permitted in Unzip mode"];
|
||||
|
||||
zip_fileinfo zi;
|
||||
zi.internal_fa= 0;
|
||||
zi.external_fa= 0;
|
||||
zi.dos_date= [fileDate dosDate];
|
||||
|
||||
// Support for legacy 32 bit mode: here we use the common version,
|
||||
// passing a flag to tell if it is a 32 or 64 bit file
|
||||
int err= zipOpenNewFileInZip3_64(_zipFile,
|
||||
[fileNameInZip cStringUsingEncoding:NSUTF8StringEncoding],
|
||||
&zi,
|
||||
NULL, 0, NULL, 0, NULL,
|
||||
(compressionLevel != OZZipCompressionLevelNone) ? Z_DEFLATED : 0,
|
||||
compressionLevel, 0,
|
||||
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
|
||||
NULL, 0,
|
||||
(_legacy32BitMode ? 0 : 1));
|
||||
|
||||
if (err != ZIP_OK)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error opening '%@' in zipfile", fileNameInZip];
|
||||
|
||||
return [[OZZipWriteStream alloc] initWithZipFileStruct:_zipFile fileNameInZip:fileNameInZip];
|
||||
}
|
||||
|
||||
- (OZZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip fileDate:(NSDate *)fileDate compressionLevel:(OZZipCompressionLevel)compressionLevel password:(NSString *)password crc32:(uint32_t)crc32 {
|
||||
if (_mode == OZZipFileModeUnzip)
|
||||
@throw [OZZipException zipExceptionWithReason:@"Operation not permitted in Unzip mode"];
|
||||
|
||||
zip_fileinfo zi;
|
||||
zi.internal_fa= 0;
|
||||
zi.external_fa= 0;
|
||||
zi.dos_date= [fileDate dosDate];
|
||||
|
||||
// Support for legacy 32 bit mode: here we use the common version,
|
||||
// passing a flag to tell if it is a 32 or 64 bit file
|
||||
int err= zipOpenNewFileInZip3_64(_zipFile,
|
||||
[fileNameInZip cStringUsingEncoding:NSUTF8StringEncoding],
|
||||
&zi,
|
||||
NULL, 0, NULL, 0, NULL,
|
||||
(compressionLevel != OZZipCompressionLevelNone) ? Z_DEFLATED : 0,
|
||||
compressionLevel, 0,
|
||||
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
|
||||
[password cStringUsingEncoding:NSUTF8StringEncoding], crc32,
|
||||
(_legacy32BitMode ? 0 : 1));
|
||||
|
||||
if (err != ZIP_OK)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error opening '%@' in zipfile", fileNameInZip];
|
||||
|
||||
return [[OZZipWriteStream alloc] initWithZipFileStruct:_zipFile fileNameInZip:fileNameInZip];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark File writing (NSError variants)
|
||||
|
||||
- (OZZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip compressionLevel:(OZZipCompressionLevel)compressionLevel error:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
return [self writeFileInZipWithName:fileNameInZip compressionLevel:compressionLevel];
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, nil);
|
||||
}
|
||||
|
||||
- (OZZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip fileDate:(NSDate *)fileDate compressionLevel:(OZZipCompressionLevel)compressionLevel error:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
return [self writeFileInZipWithName:fileNameInZip fileDate:fileDate compressionLevel:compressionLevel];
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, nil);
|
||||
}
|
||||
|
||||
- (OZZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip fileDate:(NSDate *)fileDate compressionLevel:(OZZipCompressionLevel)compressionLevel password:(NSString *)password crc32:(uint32_t)crc32 error:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
return [self writeFileInZipWithName:fileNameInZip fileDate:fileDate compressionLevel:compressionLevel password:password crc32:crc32];
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, nil);
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark File seeking and info
|
||||
|
||||
- (void) goToFirstFileInZip {
|
||||
if (_mode != OZZipFileModeUnzip)
|
||||
@throw [OZZipException zipExceptionWithReason:@"Operation permitted only in Unzip mode"];
|
||||
|
||||
int err= unzGoToFirstFile(_unzFile);
|
||||
if (err != UNZ_OK)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error going to first file in zip of '%@'", _fileName];
|
||||
}
|
||||
|
||||
- (BOOL) goToNextFileInZip {
|
||||
if (_mode != OZZipFileModeUnzip)
|
||||
@throw [OZZipException zipExceptionWithReason:@"Operation permitted only in Unzip mode"];
|
||||
|
||||
int err= unzGoToNextFile(_unzFile);
|
||||
if (err == UNZ_END_OF_LIST_OF_FILE)
|
||||
return NO;
|
||||
|
||||
if (err != UNZ_OK)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error going to next file in zip of '%@'", _fileName];
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (BOOL) locateFileInZip:(NSString *)fileNameInZip {
|
||||
if (_mode != OZZipFileModeUnzip)
|
||||
@throw [OZZipException zipExceptionWithReason:@"Operation permitted only in Unzip mode"];
|
||||
|
||||
int err= unzLocateFile(_unzFile, [fileNameInZip cStringUsingEncoding:NSUTF8StringEncoding], NULL);
|
||||
if (err == UNZ_END_OF_LIST_OF_FILE)
|
||||
return NO;
|
||||
|
||||
if (err != UNZ_OK)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error localting file in zip of '%@'", _fileName];
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (NSUInteger) numFilesInZip {
|
||||
if (_mode != OZZipFileModeUnzip)
|
||||
@throw [OZZipException zipExceptionWithReason:@"Operation permitted only in Unzip mode"];
|
||||
|
||||
// Support for legacy 32 bit mode: here we use the 32 or 64 bit
|
||||
// version alternatively, as there is not internal (common) version
|
||||
if (_legacy32BitMode) {
|
||||
unz_global_info gi;
|
||||
|
||||
int err= unzGetGlobalInfo(_unzFile, &gi);
|
||||
if (err != UNZ_OK)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error getting global info of '%@'", _fileName];
|
||||
|
||||
return gi.number_entry;
|
||||
|
||||
} else {
|
||||
unz_global_info64 gi;
|
||||
|
||||
int err= unzGetGlobalInfo64(_unzFile, &gi);
|
||||
if (err != UNZ_OK)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error getting global info of '%@'", _fileName];
|
||||
|
||||
return (NSUInteger) gi.number_entry;
|
||||
}
|
||||
}
|
||||
|
||||
- (NSArray *) listFileInZipInfos {
|
||||
NSUInteger num= [self numFilesInZip];
|
||||
if (num < 1)
|
||||
return [NSArray array];
|
||||
|
||||
NSMutableArray *files= [[NSMutableArray alloc] initWithCapacity:num];
|
||||
|
||||
[self goToFirstFileInZip];
|
||||
for (int i= 0; i < num; i++) {
|
||||
OZFileInZipInfo *info= [self getCurrentFileInZipInfo];
|
||||
[files addObject:info];
|
||||
|
||||
if ((i +1) < num)
|
||||
[self goToNextFileInZip];
|
||||
}
|
||||
|
||||
return files;
|
||||
}
|
||||
|
||||
- (OZFileInZipInfo *) getCurrentFileInZipInfo {
|
||||
if (_mode != OZZipFileModeUnzip)
|
||||
@throw [OZZipException zipExceptionWithReason:@"Operation permitted only in Unzip mode"];
|
||||
|
||||
char filename_inzip[FILE_IN_ZIP_MAX_NAME_LENGTH];
|
||||
unz_file_info64 file_info;
|
||||
|
||||
// Support for legacy 32 bit mode: here we use the 64 bit version,
|
||||
// as it also internally called from the 32 bit version
|
||||
int err= unzGetCurrentFileInfo64(_unzFile, &file_info, filename_inzip, sizeof(filename_inzip), NULL, 0, NULL, 0);
|
||||
if (err != UNZ_OK)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error getting current file info of '%@'", _fileName];
|
||||
|
||||
NSString *name= [NSString stringWithCString:filename_inzip encoding:NSUTF8StringEncoding];
|
||||
|
||||
OZZipCompressionLevel level= OZZipCompressionLevelNone;
|
||||
if (file_info.compression_method != 0) {
|
||||
switch ((file_info.flag & 0x6) / 2) {
|
||||
case 0:
|
||||
level= OZZipCompressionLevelDefault;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
level= OZZipCompressionLevelBest;
|
||||
break;
|
||||
|
||||
default:
|
||||
level= OZZipCompressionLevelFastest;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
BOOL crypted= ((file_info.flag & 1) != 0);
|
||||
NSDate *date= [NSDate fromDosDate:file_info.dos_date];
|
||||
|
||||
OZFileInZipInfo *info= [[OZFileInZipInfo alloc] initWithName:name
|
||||
length:file_info.uncompressed_size
|
||||
level:level
|
||||
crypted:crypted
|
||||
size:file_info.compressed_size
|
||||
date:date
|
||||
crc32:file_info.crc];
|
||||
return info;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark File seeking and info (NSError variants)
|
||||
|
||||
- (BOOL) goToFirstFileInZipWithError:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
[self goToFirstFileInZip];
|
||||
|
||||
return YES;
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, NO);
|
||||
}
|
||||
|
||||
- (BOOL) goToNextFileInZipWithError:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
return [self goToNextFileInZip];
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, NO);
|
||||
}
|
||||
|
||||
- (NSInteger) locateFileInZip:(NSString *)fileNameInZip error:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
BOOL located= [self locateFileInZip:fileNameInZip];
|
||||
return (located ? OZLocateFileResultFound : OZLocateFileResultNotFound);
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, 0);
|
||||
}
|
||||
|
||||
- (NSUInteger) numFilesInZipWithError:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
return [self numFilesInZip];
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, 0);
|
||||
}
|
||||
|
||||
- (NSArray *) listFileInZipInfosWithError:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
return [self listFileInZipInfos];
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, nil);
|
||||
}
|
||||
|
||||
- (OZFileInZipInfo *) getCurrentFileInZipInfoWithError:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
return [self getCurrentFileInZipInfo];
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, nil);
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark File reading
|
||||
|
||||
- (OZZipReadStream *) readCurrentFileInZip {
|
||||
if (_mode != OZZipFileModeUnzip)
|
||||
@throw [OZZipException zipExceptionWithReason:@"Operation permitted only in Unzip mode"];
|
||||
|
||||
char filename_inzip[FILE_IN_ZIP_MAX_NAME_LENGTH];
|
||||
unz_file_info64 file_info;
|
||||
|
||||
// Support for legacy 32 bit mode: here we use the 64 bit version,
|
||||
// as it also internally called from the 32 bit version
|
||||
int err= unzGetCurrentFileInfo64(_unzFile, &file_info, filename_inzip, sizeof(filename_inzip), NULL, 0, NULL, 0);
|
||||
if (err != UNZ_OK)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error getting current file info of '%@'", _fileName];
|
||||
|
||||
NSString *fileNameInZip= [NSString stringWithCString:filename_inzip encoding:NSUTF8StringEncoding];
|
||||
|
||||
err= unzOpenCurrentFilePassword(_unzFile, NULL);
|
||||
if (err != UNZ_OK)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error opening current file of '%@'", _fileName];
|
||||
|
||||
return [[OZZipReadStream alloc] initWithUnzFileStruct:_unzFile fileNameInZip:fileNameInZip];
|
||||
}
|
||||
|
||||
- (OZZipReadStream *) readCurrentFileInZipWithPassword:(NSString *)password {
|
||||
if (_mode != OZZipFileModeUnzip)
|
||||
@throw [OZZipException zipExceptionWithReason:@"Operation permitted only in Unzip mode"];
|
||||
|
||||
char filename_inzip[FILE_IN_ZIP_MAX_NAME_LENGTH];
|
||||
unz_file_info64 file_info;
|
||||
|
||||
// Support for legacy 32 bit mode: here we use the 64 bit version,
|
||||
// as it also internally called from the 32 bit version
|
||||
int err= unzGetCurrentFileInfo64(_unzFile, &file_info, filename_inzip, sizeof(filename_inzip), NULL, 0, NULL, 0);
|
||||
if (err != UNZ_OK)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error getting current file info of '%@'", _fileName];
|
||||
|
||||
NSString *fileNameInZip= [NSString stringWithCString:filename_inzip encoding:NSUTF8StringEncoding];
|
||||
|
||||
err= unzOpenCurrentFilePassword(_unzFile, [password cStringUsingEncoding:NSUTF8StringEncoding]);
|
||||
if (err != UNZ_OK)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error opening current file of '%@'", _fileName];
|
||||
|
||||
return [[OZZipReadStream alloc] initWithUnzFileStruct:_unzFile fileNameInZip:fileNameInZip];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark File reading (NSError variants)
|
||||
|
||||
- (OZZipReadStream *) readCurrentFileInZipWithError:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
return [self readCurrentFileInZip];
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, nil);
|
||||
}
|
||||
|
||||
- (OZZipReadStream *) readCurrentFileInZipWithPassword:(NSString *)password error:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
return [self readCurrentFileInZipWithPassword:password];
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, nil);
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Closing
|
||||
|
||||
- (void) close {
|
||||
switch (_mode) {
|
||||
case OZZipFileModeUnzip: {
|
||||
int err= unzClose(_unzFile);
|
||||
if (err != UNZ_OK)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error closing '%@'", _fileName];
|
||||
break;
|
||||
}
|
||||
|
||||
case OZZipFileModeCreate: {
|
||||
int err= zipClose(_zipFile, NULL);
|
||||
if (err != ZIP_OK)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error closing '%@'", _fileName];
|
||||
break;
|
||||
}
|
||||
|
||||
case OZZipFileModeAppend: {
|
||||
int err= zipClose(_zipFile, NULL);
|
||||
if (err != ZIP_OK)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error closing '%@'", _fileName];
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
@throw [OZZipException zipExceptionWithReason:@"Unknown mode %d", _mode];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Closing (NSError variants)
|
||||
|
||||
- (BOOL) closeWithError:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
[self close];
|
||||
|
||||
return YES;
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, NO);
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Properties
|
||||
|
||||
@synthesize fileName= _fileName;
|
||||
@synthesize mode= _mode;
|
||||
@synthesize legacy32BitMode= _legacy32BitMode;
|
||||
|
||||
|
||||
@end
|
||||
60
Objective-Zip/OZZipFileMode.h
Normal file
60
Objective-Zip/OZZipFileMode.h
Normal file
@@ -0,0 +1,60 @@
|
||||
//
|
||||
// OZZipFileMode.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#ifndef Objective_Zip_OZZipFileMode_h
|
||||
#define Objective_Zip_OZZipFileMode_h
|
||||
|
||||
/**
|
||||
@brief Access mode for opening a zip file.
|
||||
*/
|
||||
typedef NS_ENUM(NSInteger, OZZipFileMode) {
|
||||
|
||||
/**
|
||||
@brief Acces mode for opening the zip file for reading.
|
||||
*/
|
||||
OZZipFileModeUnzip,
|
||||
|
||||
/**
|
||||
@brief Acces mode for opening the zip file for creation.
|
||||
<br/>Note: if the file already exists the behavior is unspecified.
|
||||
*/
|
||||
OZZipFileModeCreate,
|
||||
|
||||
/**
|
||||
@brief Acces mode for opening the zip file for writing.
|
||||
*/
|
||||
OZZipFileModeAppend
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,51 +1,48 @@
|
||||
//
|
||||
// ZipReadStream.h
|
||||
// Objective-Zip v. 0.8
|
||||
// OZZipReadStream+Internals.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 28/12/09.
|
||||
// Copyright 2009-10 Flying Dolphin Studio. All rights reserved.
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "OZZipReadStream.h"
|
||||
|
||||
#include "unzip.h"
|
||||
|
||||
|
||||
@interface ZipReadStream : NSObject {
|
||||
NSString *_fileNameInZip;
|
||||
|
||||
@private
|
||||
unzFile _unzFile;
|
||||
}
|
||||
@interface OZZipReadStream (Internals)
|
||||
|
||||
- (id) initWithUnzFileStruct:(unzFile)unzFile fileNameInZip:(NSString *)fileNameInZip;
|
||||
|
||||
- (NSUInteger) readDataWithBuffer:(NSMutableData *)buffer;
|
||||
- (void) finishedReading;
|
||||
#pragma mark -
|
||||
#pragma mark Initialization
|
||||
|
||||
- (nonnull instancetype) initWithUnzFileStruct:(nonnull unzFile)unzFile fileNameInZip:(nonnull NSString *)fileNameInZip;
|
||||
|
||||
|
||||
@end
|
||||
77
Objective-Zip/OZZipReadStream+NSError.h
Normal file
77
Objective-Zip/OZZipReadStream+NSError.h
Normal file
@@ -0,0 +1,77 @@
|
||||
//
|
||||
// OZZipReadStream+NSError.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "OZZipReadStream.h"
|
||||
|
||||
|
||||
/**
|
||||
@brief Indicates the end of the file has been reached.
|
||||
*/
|
||||
static const NSInteger OZReadStreamResultEndOfFile= -1;
|
||||
|
||||
|
||||
@interface OZZipReadStream (NSError)
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Reading data (NSError variants)
|
||||
|
||||
/**
|
||||
@brief Reads and uncompresses data from the file in the zip file and stores
|
||||
them in the specified buffer.
|
||||
@param buffer The buffer where read and uncompressed data must be stored.
|
||||
@param error If passed, may be filled with an NSError is case data could
|
||||
not be read.
|
||||
@return The number of uncompressed bytes read, <code>OZReadStreamResultEndOfFile</code>
|
||||
if the end of the file has been reached, or <code>0</code>
|
||||
if data could not be read due to an error.
|
||||
<br/>NOTE: return value convention is different in the standard (non-NSError
|
||||
compliant) interface.
|
||||
*/
|
||||
- (NSInteger) __attribute__((swift_error(nonnull_error))) readDataWithBuffer:(nonnull NSMutableData *)buffer error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
/**
|
||||
@brief Closes the read steam.
|
||||
<p>Once you have finished read data to the file, it is important to close
|
||||
the stream so system resources may be freed.</p>
|
||||
<p>Note: after the stream has been closed any subsequent read will result in
|
||||
an error.</p>
|
||||
@param error If passed, may be filled with an NSError is case the stream could
|
||||
not be closed.
|
||||
@return <code>YES</code> if the stream has been closed, <code>NO</code> if
|
||||
the stream could not be closed due to an error.
|
||||
*/
|
||||
- (BOOL) finishedReadingWithError:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
|
||||
@end
|
||||
66
Objective-Zip/OZZipReadStream+Standard.h
Normal file
66
Objective-Zip/OZZipReadStream+Standard.h
Normal file
@@ -0,0 +1,66 @@
|
||||
//
|
||||
// OZZipReadStream+Standard.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "OZZipReadStream.h"
|
||||
|
||||
|
||||
@interface OZZipReadStream (Standard)
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Reading data
|
||||
|
||||
/**
|
||||
@brief Reads and uncompresses data from the file in the zip file and stores
|
||||
them in the specified buffer.
|
||||
@param buffer The buffer where read and uncompressed data must be stored.
|
||||
@return The number of uncompressed bytes read, <code>0</code> if the end of
|
||||
the file has been reached.
|
||||
<br/>NOTE: return value convention is different in NSError compliant
|
||||
interface.
|
||||
@throws OZZipException If the data could not be read due to an error.
|
||||
*/
|
||||
- (NSUInteger) readDataWithBuffer:(nonnull NSMutableData *)buffer;
|
||||
|
||||
/**
|
||||
@brief Closes the read steam.
|
||||
<p>Once you have finished read data to the file, it is important to close
|
||||
the stream so system resources may be freed.</p>
|
||||
<p>Note: after the stream has been closed any subsequent read will result in
|
||||
an error.</p>
|
||||
@throws OZZipException If the stream could not be closed due to an error.
|
||||
*/
|
||||
- (void) finishedReading;
|
||||
|
||||
|
||||
@end
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// ZipException.h
|
||||
// Objective-Zip v. 0.8
|
||||
// OZZipReadStream.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-10 Flying Dolphin Studio. All rights reserved.
|
||||
// Created by Gianluca Bertani on 28/12/09.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
@@ -34,15 +34,11 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
|
||||
@interface ZipException : NSException {
|
||||
|
||||
@private
|
||||
NSInteger _error;
|
||||
}
|
||||
/**
|
||||
@brief OZZipReadStream implements a read stream and provides services to
|
||||
read content from a file in the zip file.
|
||||
*/
|
||||
@interface OZZipReadStream : NSObject
|
||||
|
||||
- (id) initWithReason:(NSString *)reason;
|
||||
- (id) initWithError:(NSInteger)error reason:(NSString *)reason;
|
||||
|
||||
@property (nonatomic, readonly) NSInteger error;
|
||||
|
||||
@end
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// ZipReadStream.m
|
||||
// Objective-Zip v. 0.8
|
||||
// OZZipReadStream.m
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 28/12/09.
|
||||
// Copyright 2009-10 Flying Dolphin Studio. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
@@ -31,16 +31,38 @@
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "ZipReadStream.h"
|
||||
#import "ZipException.h"
|
||||
|
||||
#include "unzip.h"
|
||||
#import "OZZipReadStream.h"
|
||||
#import "OZZipReadStream+Standard.h"
|
||||
#import "OZZipReadStream+NSError.h"
|
||||
#import "OZZipReadStream+Internals.h"
|
||||
#import "OZZipException.h"
|
||||
#import "OZZipException+Internals.h"
|
||||
|
||||
|
||||
@implementation ZipReadStream
|
||||
#pragma mark -
|
||||
#pragma mark OZZipReadStream extension
|
||||
|
||||
@interface OZZipReadStream () {
|
||||
NSString *_fileNameInZip;
|
||||
|
||||
@private
|
||||
unzFile _unzFile;
|
||||
}
|
||||
|
||||
|
||||
- (id) initWithUnzFileStruct:(unzFile)unzFile fileNameInZip:(NSString *)fileNameInZip {
|
||||
@end
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark OZZipReadStream implementation
|
||||
|
||||
@implementation OZZipReadStream
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Initialization
|
||||
|
||||
- (instancetype) initWithUnzFileStruct:(unzFile)unzFile fileNameInZip:(NSString *)fileNameInZip {
|
||||
if (self= [super init]) {
|
||||
_unzFile= unzFile;
|
||||
_fileNameInZip= fileNameInZip;
|
||||
@@ -49,22 +71,45 @@
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Reading data
|
||||
|
||||
- (NSUInteger) readDataWithBuffer:(NSMutableData *)buffer {
|
||||
int err= unzReadCurrentFile(_unzFile, [buffer mutableBytes], [buffer length]);
|
||||
if (err < 0) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Error in reading '%@' in the zipfile", _fileNameInZip];
|
||||
@throw [[[ZipException alloc] initWithError:err reason:reason] autorelease];
|
||||
}
|
||||
int err= unzReadCurrentFile(_unzFile, [buffer mutableBytes], (uInt) [buffer length]);
|
||||
if (err < 0)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error reading '%@' in the zipfile", _fileNameInZip];
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
- (void) finishedReading {
|
||||
int err= unzCloseCurrentFile(_unzFile);
|
||||
if (err != UNZ_OK) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Error in closing '%@' in the zipfile", _fileNameInZip];
|
||||
@throw [[[ZipException alloc] initWithError:err reason:reason] autorelease];
|
||||
}
|
||||
if (err != UNZ_OK)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error closing '%@' in the zipfile", _fileNameInZip];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Reading data (NSError variants)
|
||||
|
||||
- (NSInteger) readDataWithBuffer:(NSMutableData *)buffer error:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
NSUInteger bytesRead= [self readDataWithBuffer:buffer];
|
||||
return (bytesRead == 0) ? OZReadStreamResultEndOfFile : bytesRead;
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, 0);
|
||||
}
|
||||
|
||||
- (BOOL) finishedReadingWithError:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
[self finishedReading];
|
||||
|
||||
return YES;
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, NO);
|
||||
}
|
||||
|
||||
|
||||
48
Objective-Zip/OZZipWriteStream+Internals.h
Normal file
48
Objective-Zip/OZZipWriteStream+Internals.h
Normal file
@@ -0,0 +1,48 @@
|
||||
//
|
||||
// OZZipWriteStream+Internals.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "OZZipWriteStream.h"
|
||||
|
||||
#include "zip.h"
|
||||
|
||||
|
||||
@interface OZZipWriteStream (Internals)
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Initialization
|
||||
|
||||
- (nonnull instancetype) initWithZipFileStruct:(nonnull zipFile)zipFile fileNameInZip:(nonnull NSString *)fileNameInZip;
|
||||
|
||||
|
||||
@end
|
||||
69
Objective-Zip/OZZipWriteStream+NSError.h
Normal file
69
Objective-Zip/OZZipWriteStream+NSError.h
Normal file
@@ -0,0 +1,69 @@
|
||||
//
|
||||
// OZZipWriteStream+NSError.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "OZZipWriteStream.h"
|
||||
|
||||
|
||||
@interface OZZipWriteStream (NSError)
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Writing data (NSError variants)
|
||||
|
||||
/**
|
||||
@brief Compresses and writes data to the new file in the zip file.
|
||||
<p>Data are compressed depending on the choice of compression level specified
|
||||
during creation of the write stream.</p>
|
||||
@param data The data to be compressed and written.
|
||||
@param error If passed, may be filled with an NSError is case data could
|
||||
not be written.
|
||||
@return <code>YES</code> if data has been written, <code>NO</code> if
|
||||
data could not be written due to an error.
|
||||
*/
|
||||
- (BOOL) writeData:(nonnull NSData *)data error:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
/**
|
||||
@brief Closes the write stream.
|
||||
<p>Once you have finished writing data to the new file, it is important to
|
||||
close the stream so system resources may be freed.</p>
|
||||
<p>Note: after the stream has been closed any subsequent write will result in
|
||||
an error.</p>
|
||||
@param error If passed, may be filled with an NSError is case the stream could
|
||||
not be closed.
|
||||
@return <code>YES</code> if the stream has been closed, <code>NO</code> if
|
||||
the stream could not be closed due to an error.
|
||||
*/
|
||||
- (BOOL) finishedWritingWithError:(NSError * __autoreleasing __nullable * __nullable)error;
|
||||
|
||||
|
||||
@end
|
||||
63
Objective-Zip/OZZipWriteStream+Standard.h
Normal file
63
Objective-Zip/OZZipWriteStream+Standard.h
Normal file
@@ -0,0 +1,63 @@
|
||||
//
|
||||
// OZZipWriteStream+Standard.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "OZZipWriteStream.h"
|
||||
|
||||
|
||||
@interface OZZipWriteStream (Standard)
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Writing data
|
||||
|
||||
/**
|
||||
@brief Compresses and writes data to the new file in the zip file.
|
||||
<p>Data are compressed depending on the choice of compression level specified
|
||||
during creation of the write stream.</p>
|
||||
@param data The data to be compressed and written.
|
||||
@throws OZZipException If the data could not be written due to an error.
|
||||
*/
|
||||
- (void) writeData:(nonnull NSData *)data;
|
||||
|
||||
/**
|
||||
@brief Closes the write stream.
|
||||
<p>Once you have finished writing data to the new file, it is important to
|
||||
close the stream so system resources may be freed.</p>
|
||||
<p>Note: after the stream has been closed any subsequent write will result in
|
||||
an error.</p>
|
||||
@throws OZZipException If the stream could not be closed due to an error.
|
||||
*/
|
||||
- (void) finishedWriting;
|
||||
|
||||
|
||||
@end
|
||||
@@ -1,9 +1,9 @@
|
||||
//
|
||||
// main.m
|
||||
// Objective-Zip
|
||||
// OZZipWriteStream.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright Flying Dolphin Studio 2009. All rights reserved.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
@@ -31,12 +31,14 @@
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
|
||||
int retVal = UIApplicationMain(argc, argv, nil, nil);
|
||||
[pool release];
|
||||
return retVal;
|
||||
}
|
||||
|
||||
/**
|
||||
@brief OZZipWriteStream implements a write stream and provides services to
|
||||
write content to a new file in the zip file.
|
||||
*/
|
||||
@interface OZZipWriteStream : NSObject
|
||||
|
||||
|
||||
@end
|
||||
118
Objective-Zip/OZZipWriteStream.m
Normal file
118
Objective-Zip/OZZipWriteStream.m
Normal file
@@ -0,0 +1,118 @@
|
||||
//
|
||||
// OZZipWriteStream.m
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "OZZipWriteStream.h"
|
||||
#import "OZZipWriteStream+Standard.h"
|
||||
#import "OZZipWriteStream+NSError.h"
|
||||
#import "OZZipWriteStream+Internals.h"
|
||||
#import "OZZipException.h"
|
||||
#import "OZZipException+Internals.h"
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark OZZipWriteStream extension
|
||||
|
||||
@interface OZZipWriteStream () {
|
||||
NSString *_fileNameInZip;
|
||||
|
||||
@private
|
||||
zipFile _zipFile;
|
||||
}
|
||||
-(instancetype) initWithZipFileStruct:(zipFile)zipFile fileNameInZip:(NSString *)fileNameInZip;
|
||||
- (void) writeData:(NSData *)data;
|
||||
- (void) finishedWriting;
|
||||
- (BOOL) writeData:(NSData *)data error:(NSError * __autoreleasing *)error;
|
||||
- (BOOL) finishedWritingWithError:(NSError * __autoreleasing *)error;
|
||||
@end
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark OZZipWriteStream implementation
|
||||
|
||||
@implementation OZZipWriteStream
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Initialization
|
||||
|
||||
- (instancetype) initWithZipFileStruct:(zipFile)zipFile fileNameInZip:(NSString *)fileNameInZip {
|
||||
if (self= [super init]) {
|
||||
_zipFile= zipFile;
|
||||
_fileNameInZip= fileNameInZip;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Writing data
|
||||
|
||||
- (void) writeData:(NSData *)data {
|
||||
int err= zipWriteInFileInZip(_zipFile, [data bytes], (uInt) [data length]);
|
||||
if (err < 0)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error writing '%@' in the zipfile", _fileNameInZip];
|
||||
}
|
||||
|
||||
- (void) finishedWriting {
|
||||
int err= zipCloseFileInZip(_zipFile);
|
||||
if (err != ZIP_OK)
|
||||
@throw [OZZipException zipExceptionWithError:err reason:@"Error closing '%@' in the zipfile", _fileNameInZip];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Writing data (NSError variants)
|
||||
|
||||
- (BOOL) writeData:(NSData *)data error:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
[self writeData:data];
|
||||
|
||||
return YES;
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, NO);
|
||||
}
|
||||
|
||||
- (BOOL) finishedWritingWithError:(NSError * __autoreleasing *)error {
|
||||
ERROR_WRAP_BEGIN {
|
||||
|
||||
[self finishedWriting];
|
||||
|
||||
return YES;
|
||||
|
||||
} ERROR_WRAP_END_AND_RETURN(error, NO);
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
45
Objective-Zip/Objective-Zip+NSError.h
Normal file
45
Objective-Zip/Objective-Zip+NSError.h
Normal file
@@ -0,0 +1,45 @@
|
||||
//
|
||||
// Objective-Zip+NSError.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 09/09/15.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "OZZipFile.h"
|
||||
#import "OZZipFile+NSError.h"
|
||||
#import "OZZipFileMode.h"
|
||||
#import "OZZipCompressionLevel.h"
|
||||
#import "OZZipException.h"
|
||||
#import "OZZipWriteStream.h"
|
||||
#import "OZZipWriteStream+NSError.h"
|
||||
#import "OZZipReadStream.h"
|
||||
#import "OZZipReadStream+NSError.h"
|
||||
#import "OZFileInZipInfo.h"
|
||||
#import "NSDate+DOSDate.h"
|
||||
#import "NSData+CRC32.h"
|
||||
45
Objective-Zip/Objective-Zip.h
Normal file
45
Objective-Zip/Objective-Zip.h
Normal file
@@ -0,0 +1,45 @@
|
||||
//
|
||||
// Objective-Zip.h
|
||||
// Objective-Zip v. 1.0.5
|
||||
//
|
||||
// Created by Gianluca Bertani on 27/08/15.
|
||||
// Copyright 2009-2017 Gianluca Bertani. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "OZZipFile.h"
|
||||
#import "OZZipFile+Standard.h"
|
||||
#import "OZZipFileMode.h"
|
||||
#import "OZZipCompressionLevel.h"
|
||||
#import "OZZipException.h"
|
||||
#import "OZZipWriteStream.h"
|
||||
#import "OZZipWriteStream+Standard.h"
|
||||
#import "OZZipReadStream.h"
|
||||
#import "OZZipReadStream+Standard.h"
|
||||
#import "OZFileInZipInfo.h"
|
||||
#import "NSDate+DOSDate.h"
|
||||
#import "NSData+CRC32.h"
|
||||
@@ -1,87 +0,0 @@
|
||||
//
|
||||
// ZipFile.h
|
||||
// Objective-Zip v.0.8
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-10 Flying Dolphin Studio. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#include "zip.h"
|
||||
#include "unzip.h"
|
||||
|
||||
|
||||
typedef enum {
|
||||
ZipFileModeUnzip,
|
||||
ZipFileModeCreate,
|
||||
ZipFileModeAppend
|
||||
} ZipFileMode;
|
||||
|
||||
typedef enum {
|
||||
ZipCompressionLevelDefault= -1,
|
||||
ZipCompressionLevelNone= 0,
|
||||
ZipCompressionLevelFastest= 1,
|
||||
ZipCompressionLevelBest= 9
|
||||
} ZipCompressionLevel;
|
||||
|
||||
@class ZipReadStream;
|
||||
@class ZipWriteStream;
|
||||
@class FileInZipInfo;
|
||||
|
||||
@interface ZipFile : NSObject {
|
||||
NSString *_fileName;
|
||||
ZipFileMode _mode;
|
||||
|
||||
@private
|
||||
zipFile _zipFile;
|
||||
unzFile _unzFile;
|
||||
}
|
||||
|
||||
- (id) initWithFileName:(NSString *)fileName mode:(ZipFileMode)mode;
|
||||
|
||||
- (ZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip compressionLevel:(ZipCompressionLevel)compressionLevel;
|
||||
- (ZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip fileDate:(NSDate *)fileDate compressionLevel:(ZipCompressionLevel)compressionLevel;
|
||||
- (ZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip fileDate:(NSDate *)fileDate compressionLevel:(ZipCompressionLevel)compressionLevel password:(NSString *)password crc32:(NSUInteger)crc32;
|
||||
|
||||
- (NSString*) fileName;
|
||||
- (NSUInteger) numFilesInZip;
|
||||
- (NSArray *) listFileInZipInfos;
|
||||
|
||||
- (void) goToFirstFileInZip;
|
||||
- (BOOL) goToNextFileInZip;
|
||||
- (BOOL) locateFileInZip:(NSString *)fileNameInZip;
|
||||
|
||||
- (FileInZipInfo *) getCurrentFileInZipInfo;
|
||||
|
||||
- (ZipReadStream *) readCurrentFileInZip;
|
||||
- (ZipReadStream *) readCurrentFileInZipWithPassword:(NSString *)password;
|
||||
|
||||
- (void) close;
|
||||
|
||||
@end
|
||||
@@ -1,427 +0,0 @@
|
||||
//
|
||||
// ZipFile.m
|
||||
// Objective-Zip v. 0.8
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-10 Flying Dolphin Studio. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "ZipFile.h"
|
||||
#import "ZipException.h"
|
||||
#import "ZipReadStream.h"
|
||||
#import "ZipWriteStream.h"
|
||||
#import "FIleInZipInfo.h"
|
||||
|
||||
#define FILE_IN_ZIP_MAX_NAME_LENGTH (256)
|
||||
|
||||
|
||||
@implementation ZipFile
|
||||
|
||||
|
||||
- (id) initWithFileName:(NSString *)fileName mode:(ZipFileMode)mode {
|
||||
if (self= [super init]) {
|
||||
_fileName= [fileName retain];
|
||||
_mode= mode;
|
||||
|
||||
switch (mode) {
|
||||
case ZipFileModeUnzip:
|
||||
_unzFile= unzOpen([_fileName cStringUsingEncoding:NSUTF8StringEncoding]);
|
||||
if (_unzFile == NULL) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Can't open '%@'", _fileName];
|
||||
@throw [[[ZipException alloc] initWithReason:reason] autorelease];
|
||||
}
|
||||
break;
|
||||
|
||||
case ZipFileModeCreate:
|
||||
_zipFile= zipOpen([_fileName cStringUsingEncoding:NSUTF8StringEncoding], APPEND_STATUS_CREATE);
|
||||
if (_zipFile == NULL) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Can't open '%@'", _fileName];
|
||||
@throw [[[ZipException alloc] initWithReason:reason] autorelease];
|
||||
}
|
||||
break;
|
||||
|
||||
case ZipFileModeAppend:
|
||||
_zipFile= zipOpen([_fileName cStringUsingEncoding:NSUTF8StringEncoding], APPEND_STATUS_ADDINZIP);
|
||||
if (_zipFile == NULL) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Can't open '%@'", _fileName];
|
||||
@throw [[[ZipException alloc] initWithReason:reason] autorelease];
|
||||
}
|
||||
break;
|
||||
|
||||
default: {
|
||||
NSString *reason= [NSString stringWithFormat:@"Unknown mode %d", _mode];
|
||||
@throw [[[ZipException alloc] initWithReason:reason] autorelease];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) dealloc {
|
||||
[_fileName release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (ZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip compressionLevel:(ZipCompressionLevel)compressionLevel {
|
||||
if (_mode == ZipFileModeUnzip) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Operation not permitted with Unzip mode"];
|
||||
@throw [[[ZipException alloc] initWithReason:reason] autorelease];
|
||||
}
|
||||
|
||||
NSDate *now= [NSDate date];
|
||||
NSCalendar *calendar= [NSCalendar currentCalendar];
|
||||
NSDateComponents *date= [calendar components:(NSSecondCalendarUnit | NSMinuteCalendarUnit | NSHourCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:now];
|
||||
zip_fileinfo zi;
|
||||
zi.tmz_date.tm_sec= [date second];
|
||||
zi.tmz_date.tm_min= [date minute];
|
||||
zi.tmz_date.tm_hour= [date hour];
|
||||
zi.tmz_date.tm_mday= [date day];
|
||||
zi.tmz_date.tm_mon= [date month] -1;
|
||||
zi.tmz_date.tm_year= [date year];
|
||||
zi.internal_fa= 0;
|
||||
zi.external_fa= 0;
|
||||
zi.dosDate= 0;
|
||||
|
||||
int err= zipOpenNewFileInZip3(
|
||||
_zipFile,
|
||||
[fileNameInZip cStringUsingEncoding:NSUTF8StringEncoding],
|
||||
&zi,
|
||||
NULL, 0, NULL, 0, NULL,
|
||||
(compressionLevel != ZipCompressionLevelNone) ? Z_DEFLATED : 0,
|
||||
compressionLevel, 0,
|
||||
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
|
||||
NULL, 0);
|
||||
if (err != ZIP_OK) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Error in opening '%@' in zipfile", fileNameInZip];
|
||||
@throw [[[ZipException alloc] initWithError:err reason:reason] autorelease];
|
||||
}
|
||||
|
||||
return [[[ZipWriteStream alloc] initWithZipFileStruct:_zipFile fileNameInZip:fileNameInZip] autorelease];
|
||||
}
|
||||
|
||||
- (ZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip fileDate:(NSDate *)fileDate compressionLevel:(ZipCompressionLevel)compressionLevel {
|
||||
if (_mode == ZipFileModeUnzip) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Operation not permitted with Unzip mode"];
|
||||
@throw [[[ZipException alloc] initWithReason:reason] autorelease];
|
||||
}
|
||||
|
||||
NSCalendar *calendar= [NSCalendar currentCalendar];
|
||||
NSDateComponents *date= [calendar components:(NSSecondCalendarUnit | NSMinuteCalendarUnit | NSHourCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:fileDate];
|
||||
zip_fileinfo zi;
|
||||
zi.tmz_date.tm_sec= [date second];
|
||||
zi.tmz_date.tm_min= [date minute];
|
||||
zi.tmz_date.tm_hour= [date hour];
|
||||
zi.tmz_date.tm_mday= [date day];
|
||||
zi.tmz_date.tm_mon= [date month] -1;
|
||||
zi.tmz_date.tm_year= [date year];
|
||||
zi.internal_fa= 0;
|
||||
zi.external_fa= 0;
|
||||
zi.dosDate= 0;
|
||||
|
||||
int err= zipOpenNewFileInZip3(
|
||||
_zipFile,
|
||||
[fileNameInZip cStringUsingEncoding:NSUTF8StringEncoding],
|
||||
&zi,
|
||||
NULL, 0, NULL, 0, NULL,
|
||||
(compressionLevel != ZipCompressionLevelNone) ? Z_DEFLATED : 0,
|
||||
compressionLevel, 0,
|
||||
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
|
||||
NULL, 0);
|
||||
if (err != ZIP_OK) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Error in opening '%@' in zipfile", fileNameInZip];
|
||||
@throw [[[ZipException alloc] initWithError:err reason:reason] autorelease];
|
||||
}
|
||||
|
||||
return [[[ZipWriteStream alloc] initWithZipFileStruct:_zipFile fileNameInZip:fileNameInZip] autorelease];
|
||||
}
|
||||
|
||||
- (ZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip fileDate:(NSDate *)fileDate compressionLevel:(ZipCompressionLevel)compressionLevel password:(NSString *)password crc32:(NSUInteger)crc32 {
|
||||
if (_mode == ZipFileModeUnzip) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Operation not permitted with Unzip mode"];
|
||||
@throw [[[ZipException alloc] initWithReason:reason] autorelease];
|
||||
}
|
||||
|
||||
NSCalendar *calendar= [NSCalendar currentCalendar];
|
||||
NSDateComponents *date= [calendar components:(NSSecondCalendarUnit | NSMinuteCalendarUnit | NSHourCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:fileDate];
|
||||
zip_fileinfo zi;
|
||||
zi.tmz_date.tm_sec= [date second];
|
||||
zi.tmz_date.tm_min= [date minute];
|
||||
zi.tmz_date.tm_hour= [date hour];
|
||||
zi.tmz_date.tm_mday= [date day];
|
||||
zi.tmz_date.tm_mon= [date month] -1;
|
||||
zi.tmz_date.tm_year= [date year];
|
||||
zi.internal_fa= 0;
|
||||
zi.external_fa= 0;
|
||||
zi.dosDate= 0;
|
||||
|
||||
int err= zipOpenNewFileInZip3(
|
||||
_zipFile,
|
||||
[fileNameInZip cStringUsingEncoding:NSUTF8StringEncoding],
|
||||
&zi,
|
||||
NULL, 0, NULL, 0, NULL,
|
||||
(compressionLevel != ZipCompressionLevelNone) ? Z_DEFLATED : 0,
|
||||
compressionLevel, 0,
|
||||
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
|
||||
[password cStringUsingEncoding:NSUTF8StringEncoding], crc32);
|
||||
if (err != ZIP_OK) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Error in opening '%@' in zipfile", fileNameInZip];
|
||||
@throw [[[ZipException alloc] initWithError:err reason:reason] autorelease];
|
||||
}
|
||||
|
||||
return [[[ZipWriteStream alloc] initWithZipFileStruct:_zipFile fileNameInZip:fileNameInZip] autorelease];
|
||||
}
|
||||
|
||||
- (NSString*) fileName {
|
||||
return _fileName;
|
||||
}
|
||||
|
||||
- (NSUInteger) numFilesInZip {
|
||||
if (_mode != ZipFileModeUnzip) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Operation not permitted without Unzip mode"];
|
||||
@throw [[[ZipException alloc] initWithReason:reason] autorelease];
|
||||
}
|
||||
|
||||
unz_global_info gi;
|
||||
int err= unzGetGlobalInfo(_unzFile, &gi);
|
||||
if (err != UNZ_OK) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Error in getting global info in '%@'", _fileName];
|
||||
@throw [[[ZipException alloc] initWithError:err reason:reason] autorelease];
|
||||
}
|
||||
|
||||
return gi.number_entry;
|
||||
}
|
||||
|
||||
- (NSArray *) listFileInZipInfos {
|
||||
int num= [self numFilesInZip];
|
||||
if (num < 1)
|
||||
return [[[NSArray alloc] init] autorelease];
|
||||
|
||||
NSMutableArray *files= [[[NSMutableArray alloc] initWithCapacity:num] autorelease];
|
||||
|
||||
[self goToFirstFileInZip];
|
||||
for (int i= 0; i < num; i++) {
|
||||
FileInZipInfo *info= [self getCurrentFileInZipInfo];
|
||||
[files addObject:info];
|
||||
|
||||
if ((i +1) < num)
|
||||
[self goToNextFileInZip];
|
||||
}
|
||||
|
||||
return files;
|
||||
}
|
||||
|
||||
- (void) goToFirstFileInZip {
|
||||
if (_mode != ZipFileModeUnzip) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Operation not permitted without Unzip mode"];
|
||||
@throw [[[ZipException alloc] initWithReason:reason] autorelease];
|
||||
}
|
||||
|
||||
int err= unzGoToFirstFile(_unzFile);
|
||||
if (err != UNZ_OK) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Error in going to first file in zip in '%@'", _fileName];
|
||||
@throw [[[ZipException alloc] initWithError:err reason:reason] autorelease];
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL) goToNextFileInZip {
|
||||
if (_mode != ZipFileModeUnzip) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Operation not permitted without Unzip mode"];
|
||||
@throw [[[ZipException alloc] initWithReason:reason] autorelease];
|
||||
}
|
||||
|
||||
int err= unzGoToNextFile(_unzFile);
|
||||
if (err == UNZ_END_OF_LIST_OF_FILE)
|
||||
return NO;
|
||||
|
||||
if (err != UNZ_OK) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Error in going to next file in zip in '%@'", _fileName];
|
||||
@throw [[[ZipException alloc] initWithError:err reason:reason] autorelease];
|
||||
}
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (BOOL) locateFileInZip:(NSString *)fileNameInZip {
|
||||
if (_mode != ZipFileModeUnzip) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Operation not permitted without Unzip mode"];
|
||||
@throw [[[ZipException alloc] initWithReason:reason] autorelease];
|
||||
}
|
||||
|
||||
int err= unzLocateFile(_unzFile, [fileNameInZip cStringUsingEncoding:NSUTF8StringEncoding], 1);
|
||||
if (err == UNZ_END_OF_LIST_OF_FILE)
|
||||
return NO;
|
||||
|
||||
if (err != UNZ_OK) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Error in going to next file in zip in '%@'", _fileName];
|
||||
@throw [[[ZipException alloc] initWithError:err reason:reason] autorelease];
|
||||
}
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (FileInZipInfo *) getCurrentFileInZipInfo {
|
||||
if (_mode != ZipFileModeUnzip) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Operation not permitted without Unzip mode"];
|
||||
@throw [[[ZipException alloc] initWithReason:reason] autorelease];
|
||||
}
|
||||
|
||||
char filename_inzip[FILE_IN_ZIP_MAX_NAME_LENGTH];
|
||||
unz_file_info file_info;
|
||||
|
||||
int err= unzGetCurrentFileInfo(_unzFile, &file_info, filename_inzip, sizeof(filename_inzip), NULL, 0, NULL, 0);
|
||||
if (err != UNZ_OK) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Error in getting current file info in '%@'", _fileName];
|
||||
@throw [[[ZipException alloc] initWithError:err reason:reason] autorelease];
|
||||
}
|
||||
|
||||
NSString *name= [NSString stringWithCString:filename_inzip encoding:NSUTF8StringEncoding];
|
||||
|
||||
ZipCompressionLevel level= ZipCompressionLevelNone;
|
||||
if (file_info.compression_method != 0) {
|
||||
switch ((file_info.flag & 0x6) / 2) {
|
||||
case 0:
|
||||
level= ZipCompressionLevelDefault;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
level= ZipCompressionLevelBest;
|
||||
break;
|
||||
|
||||
default:
|
||||
level= ZipCompressionLevelFastest;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
BOOL crypted= ((file_info.flag & 1) != 0);
|
||||
|
||||
NSDateComponents *components= [[[NSDateComponents alloc] init] autorelease];
|
||||
[components setDay:file_info.tmu_date.tm_mday];
|
||||
[components setMonth:file_info.tmu_date.tm_mon +1];
|
||||
[components setYear:file_info.tmu_date.tm_year];
|
||||
[components setHour:file_info.tmu_date.tm_hour];
|
||||
[components setMinute:file_info.tmu_date.tm_min];
|
||||
[components setSecond:file_info.tmu_date.tm_sec];
|
||||
NSCalendar *calendar= [NSCalendar currentCalendar];
|
||||
NSDate *date= [calendar dateFromComponents:components];
|
||||
|
||||
FileInZipInfo *info= [[FileInZipInfo alloc] initWithName:name length:file_info.uncompressed_size level:level crypted:crypted size:file_info.compressed_size date:date crc32:file_info.crc];
|
||||
return [info autorelease];
|
||||
}
|
||||
|
||||
- (ZipReadStream *) readCurrentFileInZip {
|
||||
if (_mode != ZipFileModeUnzip) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Operation not permitted without Unzip mode"];
|
||||
@throw [[[ZipException alloc] initWithReason:reason] autorelease];
|
||||
}
|
||||
|
||||
char filename_inzip[FILE_IN_ZIP_MAX_NAME_LENGTH];
|
||||
unz_file_info file_info;
|
||||
|
||||
int err= unzGetCurrentFileInfo(_unzFile, &file_info, filename_inzip, sizeof(filename_inzip), NULL, 0, NULL, 0);
|
||||
if (err != UNZ_OK) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Error in getting current file info in '%@'", _fileName];
|
||||
@throw [[[ZipException alloc] initWithError:err reason:reason] autorelease];
|
||||
}
|
||||
|
||||
NSString *fileNameInZip= [NSString stringWithCString:filename_inzip encoding:NSUTF8StringEncoding];
|
||||
|
||||
err= unzOpenCurrentFilePassword(_unzFile, NULL);
|
||||
if (err != UNZ_OK) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Error in opening current file in '%@'", _fileName];
|
||||
@throw [[[ZipException alloc] initWithError:err reason:reason] autorelease];
|
||||
}
|
||||
|
||||
return [[[ZipReadStream alloc] initWithUnzFileStruct:_unzFile fileNameInZip:fileNameInZip] autorelease];
|
||||
}
|
||||
|
||||
- (ZipReadStream *) readCurrentFileInZipWithPassword:(NSString *)password {
|
||||
if (_mode != ZipFileModeUnzip) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Operation not permitted without Unzip mode"];
|
||||
@throw [[[ZipException alloc] initWithReason:reason] autorelease];
|
||||
}
|
||||
|
||||
char filename_inzip[FILE_IN_ZIP_MAX_NAME_LENGTH];
|
||||
unz_file_info file_info;
|
||||
|
||||
int err= unzGetCurrentFileInfo(_unzFile, &file_info, filename_inzip, sizeof(filename_inzip), NULL, 0, NULL, 0);
|
||||
if (err != UNZ_OK) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Error in getting current file info in '%@'", _fileName];
|
||||
@throw [[[ZipException alloc] initWithError:err reason:reason] autorelease];
|
||||
}
|
||||
|
||||
NSString *fileNameInZip= [NSString stringWithCString:filename_inzip encoding:NSUTF8StringEncoding];
|
||||
|
||||
err= unzOpenCurrentFilePassword(_unzFile, [password cStringUsingEncoding:NSUTF8StringEncoding]);
|
||||
if (err != UNZ_OK) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Error in opening current file in '%@'", _fileName];
|
||||
@throw [[[ZipException alloc] initWithError:err reason:reason] autorelease];
|
||||
}
|
||||
|
||||
return [[[ZipReadStream alloc] initWithUnzFileStruct:_unzFile fileNameInZip:fileNameInZip] autorelease];
|
||||
}
|
||||
|
||||
- (void) close {
|
||||
switch (_mode) {
|
||||
case ZipFileModeUnzip: {
|
||||
int err= unzClose(_unzFile);
|
||||
if (err != UNZ_OK) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Error in closing '%@'", _fileName];
|
||||
@throw [[[ZipException alloc] initWithError:err reason:reason] autorelease];
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case ZipFileModeCreate: {
|
||||
int err= zipClose(_zipFile, NULL);
|
||||
if (err != ZIP_OK) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Error in closing '%@'", _fileName];
|
||||
@throw [[[ZipException alloc] initWithError:err reason:reason] autorelease];
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case ZipFileModeAppend: {
|
||||
int err= zipClose(_zipFile, NULL);
|
||||
if (err != ZIP_OK) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Error in closing '%@'", _fileName];
|
||||
@throw [[[ZipException alloc] initWithError:err reason:reason] autorelease];
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
NSString *reason= [NSString stringWithFormat:@"Unknown mode %d", _mode];
|
||||
@throw [[[ZipException alloc] initWithReason:reason] autorelease];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
@@ -1,69 +0,0 @@
|
||||
//
|
||||
// ZipWriteStream.m
|
||||
// Objective-Zip v. 0.8
|
||||
//
|
||||
// Created by Gianluca Bertani on 25/12/09.
|
||||
// Copyright 2009-10 Flying Dolphin Studio. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither the name of Gianluca Bertani nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
|
||||
#import "ZipWriteStream.h"
|
||||
#import "ZipException.h"
|
||||
|
||||
#include "zip.h"
|
||||
|
||||
|
||||
@implementation ZipWriteStream
|
||||
|
||||
|
||||
- (id) initWithZipFileStruct:(zipFile)zipFile fileNameInZip:(NSString *)fileNameInZip {
|
||||
if (self= [super init]) {
|
||||
_zipFile= zipFile;
|
||||
_fileNameInZip= fileNameInZip;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) writeData:(NSData *)data {
|
||||
int err= zipWriteInFileInZip(_zipFile, [data bytes], [data length]);
|
||||
if (err < 0) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Error in writing '%@' in the zipfile", _fileNameInZip];
|
||||
@throw [[[ZipException alloc] initWithError:err reason:reason] autorelease];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) finishedWriting {
|
||||
int err= zipCloseFileInZip(_zipFile);
|
||||
if (err != ZIP_OK) {
|
||||
NSString *reason= [NSString stringWithFormat:@"Error in closing '%@' in the zipfile", _fileNameInZip];
|
||||
@throw [[[ZipException alloc] initWithError:err reason:reason] autorelease];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 10 KiB |
@@ -1,509 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.10">
|
||||
<data>
|
||||
<int key="IBDocument.SystemTarget">784</int>
|
||||
<string key="IBDocument.SystemVersion">10C540</string>
|
||||
<string key="IBDocument.InterfaceBuilderVersion">740</string>
|
||||
<string key="IBDocument.AppKitVersion">1038.25</string>
|
||||
<string key="IBDocument.HIToolboxVersion">458.00</string>
|
||||
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
|
||||
<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string key="NS.object.0">62</string>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<integer value="6"/>
|
||||
</object>
|
||||
<object class="NSArray" key="IBDocument.PluginDependencies">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="IBDocument.Metadata">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSArray" key="dict.sortedKeys" id="0">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBProxyObject" id="372490531">
|
||||
<string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
|
||||
</object>
|
||||
<object class="IBProxyObject" id="843779117">
|
||||
<string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
|
||||
</object>
|
||||
<object class="IBUIView" id="774585933">
|
||||
<reference key="NSNextResponder"/>
|
||||
<int key="NSvFlags">274</int>
|
||||
<object class="NSMutableArray" key="NSSubviews">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBUIImageView" id="296619241">
|
||||
<reference key="NSNextResponder" ref="774585933"/>
|
||||
<int key="NSvFlags">292</int>
|
||||
<string key="NSFrame">{{0, -20}, {320, 480}}</string>
|
||||
<reference key="NSSuperview" ref="774585933"/>
|
||||
<bool key="IBUIOpaque">NO</bool>
|
||||
<bool key="IBUIClearsContextBeforeDrawing">NO</bool>
|
||||
<int key="IBUIContentMode">4</int>
|
||||
<bool key="IBUIUserInteractionEnabled">NO</bool>
|
||||
<object class="NSCustomResource" key="IBUIImage">
|
||||
<string key="NSClassName">NSImage</string>
|
||||
<string key="NSResourceName">Default.png</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBUIButton" id="422324197">
|
||||
<reference key="NSNextResponder" ref="774585933"/>
|
||||
<int key="NSvFlags">292</int>
|
||||
<string key="NSFrame">{{20, 20}, {280, 37}}</string>
|
||||
<reference key="NSSuperview" ref="774585933"/>
|
||||
<bool key="IBUIOpaque">NO</bool>
|
||||
<bool key="IBUIClearsContextBeforeDrawing">NO</bool>
|
||||
<int key="IBUIContentHorizontalAlignment">0</int>
|
||||
<int key="IBUIContentVerticalAlignment">0</int>
|
||||
<object class="NSFont" key="IBUIFont">
|
||||
<string key="NSName">Helvetica-Bold</string>
|
||||
<double key="NSSize">15</double>
|
||||
<int key="NSfFlags">16</int>
|
||||
</object>
|
||||
<int key="IBUIButtonType">1</int>
|
||||
<string key="IBUINormalTitle">Zip & Unzip</string>
|
||||
<object class="NSColor" key="IBUIHighlightedTitleColor" id="884333554">
|
||||
<int key="NSColorSpace">3</int>
|
||||
<bytes key="NSWhite">MQA</bytes>
|
||||
</object>
|
||||
<object class="NSColor" key="IBUINormalTitleColor">
|
||||
<int key="NSColorSpace">1</int>
|
||||
<bytes key="NSRGB">MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA</bytes>
|
||||
</object>
|
||||
<object class="NSColor" key="IBUINormalTitleShadowColor">
|
||||
<int key="NSColorSpace">3</int>
|
||||
<bytes key="NSWhite">MC41AA</bytes>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBUIView" id="261814878">
|
||||
<reference key="NSNextResponder" ref="774585933"/>
|
||||
<int key="NSvFlags">292</int>
|
||||
<string key="NSFrame">{{20, 65}, {280, 375}}</string>
|
||||
<reference key="NSSuperview" ref="774585933"/>
|
||||
<object class="NSColor" key="IBUIBackgroundColor">
|
||||
<int key="NSColorSpace">3</int>
|
||||
<bytes key="NSWhite">MAA</bytes>
|
||||
</object>
|
||||
<bool key="IBUIClearsContextBeforeDrawing">NO</bool>
|
||||
<float key="IBUIAlpha">0.5</float>
|
||||
</object>
|
||||
<object class="IBUITextView" id="718446055">
|
||||
<reference key="NSNextResponder" ref="774585933"/>
|
||||
<int key="NSvFlags">274</int>
|
||||
<string key="NSFrame">{{20, 65}, {280, 375}}</string>
|
||||
<reference key="NSSuperview" ref="774585933"/>
|
||||
<bool key="IBUIOpaque">NO</bool>
|
||||
<bool key="IBUIClipsSubviews">YES</bool>
|
||||
<bool key="IBUIMultipleTouchEnabled">YES</bool>
|
||||
<bool key="IBUIShowsHorizontalScrollIndicator">NO</bool>
|
||||
<bool key="IBUIDelaysContentTouches">NO</bool>
|
||||
<bool key="IBUICanCancelContentTouches">NO</bool>
|
||||
<bool key="IBUIBouncesZoom">NO</bool>
|
||||
<bool key="IBUIEditable">NO</bool>
|
||||
<string key="IBUIText"/>
|
||||
<reference key="IBUITextColor" ref="884333554"/>
|
||||
<object class="IBUITextInputTraits" key="IBUITextInputTraits"/>
|
||||
</object>
|
||||
</object>
|
||||
<string key="NSFrameSize">{320, 460}</string>
|
||||
<reference key="NSSuperview"/>
|
||||
<object class="NSColor" key="IBUIBackgroundColor">
|
||||
<int key="NSColorSpace">3</int>
|
||||
<bytes key="NSWhite">MC43NQA</bytes>
|
||||
<object class="NSColorSpace" key="NSCustomColorSpace">
|
||||
<int key="NSID">2</int>
|
||||
</object>
|
||||
</object>
|
||||
<bool key="IBUIClearsContextBeforeDrawing">NO</bool>
|
||||
<object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBObjectContainer" key="IBDocument.Objects">
|
||||
<object class="NSMutableArray" key="connectionRecords">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchOutletConnection" key="connection">
|
||||
<string key="label">view</string>
|
||||
<reference key="source" ref="372490531"/>
|
||||
<reference key="destination" ref="774585933"/>
|
||||
</object>
|
||||
<int key="connectionID">7</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchOutletConnection" key="connection">
|
||||
<string key="label">_textView</string>
|
||||
<reference key="source" ref="372490531"/>
|
||||
<reference key="destination" ref="718446055"/>
|
||||
</object>
|
||||
<int key="connectionID">11</int>
|
||||
</object>
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchEventConnection" key="connection">
|
||||
<string key="label">zipUnzip</string>
|
||||
<reference key="source" ref="422324197"/>
|
||||
<reference key="destination" ref="372490531"/>
|
||||
<int key="IBEventType">7</int>
|
||||
</object>
|
||||
<int key="connectionID">14</int>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBMutableOrderedSet" key="objectRecords">
|
||||
<object class="NSArray" key="orderedObjects">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">0</int>
|
||||
<reference key="object" ref="0"/>
|
||||
<reference key="children" ref="1000"/>
|
||||
<nil key="parent"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-1</int>
|
||||
<reference key="object" ref="372490531"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
<string key="objectName">File's Owner</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-2</int>
|
||||
<reference key="object" ref="843779117"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">6</int>
|
||||
<reference key="object" ref="774585933"/>
|
||||
<object class="NSMutableArray" key="children">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<reference ref="422324197"/>
|
||||
<reference ref="261814878"/>
|
||||
<reference ref="718446055"/>
|
||||
<reference ref="296619241"/>
|
||||
</object>
|
||||
<reference key="parent" ref="0"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">8</int>
|
||||
<reference key="object" ref="422324197"/>
|
||||
<reference key="parent" ref="774585933"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">9</int>
|
||||
<reference key="object" ref="261814878"/>
|
||||
<object class="NSMutableArray" key="children">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
<reference key="parent" ref="774585933"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">10</int>
|
||||
<reference key="object" ref="718446055"/>
|
||||
<reference key="parent" ref="774585933"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">13</int>
|
||||
<reference key="object" ref="296619241"/>
|
||||
<reference key="parent" ref="774585933"/>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="flattenedProperties">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="NSArray" key="dict.sortedKeys">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>-1.CustomClassName</string>
|
||||
<string>-2.CustomClassName</string>
|
||||
<string>10.IBPluginDependency</string>
|
||||
<string>13.IBPluginDependency</string>
|
||||
<string>6.IBEditorWindowLastContentRect</string>
|
||||
<string>6.IBPluginDependency</string>
|
||||
<string>8.IBPluginDependency</string>
|
||||
<string>9.IBPluginDependency</string>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<string>Objective_ZipViewController</string>
|
||||
<string>UIResponder</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string>{{731, 409}, {320, 480}}</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="unlocalizedProperties">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<reference key="dict.sortedKeys" ref="0"/>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
</object>
|
||||
<nil key="activeLocalization"/>
|
||||
<object class="NSMutableDictionary" key="localizations">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<reference key="dict.sortedKeys" ref="0"/>
|
||||
<object class="NSMutableArray" key="dict.values">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
</object>
|
||||
</object>
|
||||
<nil key="sourceID"/>
|
||||
<int key="maxID">14</int>
|
||||
</object>
|
||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">Objective_ZipViewController</string>
|
||||
<string key="superclassName">UIViewController</string>
|
||||
<object class="NSMutableDictionary" key="actions">
|
||||
<string key="NS.key.0">zipUnzip</string>
|
||||
<string key="NS.object.0">id</string>
|
||||
</object>
|
||||
<object class="NSMutableDictionary" key="outlets">
|
||||
<string key="NS.key.0">_textView</string>
|
||||
<string key="NS.object.0">UITextView</string>
|
||||
</object>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">Classes/Objective_ZipViewController.h</string>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
|
||||
<bool key="EncodedWithXMLCoder">YES</bool>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">Foundation.framework/Headers/NSError.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">Foundation.framework/Headers/NSNetServices.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">Foundation.framework/Headers/NSPort.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">Foundation.framework/Headers/NSStream.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">Foundation.framework/Headers/NSXMLParser.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">UIKit.framework/Headers/UIAccessibility.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">UIKit.framework/Headers/UINibLoading.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier" id="415773902">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">UIKit.framework/Headers/UIResponder.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">UIButton</string>
|
||||
<string key="superclassName">UIControl</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">UIKit.framework/Headers/UIButton.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">UIControl</string>
|
||||
<string key="superclassName">UIView</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">UIKit.framework/Headers/UIControl.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">UIImageView</string>
|
||||
<string key="superclassName">UIView</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">UIKit.framework/Headers/UIImageView.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">UIResponder</string>
|
||||
<string key="superclassName">NSObject</string>
|
||||
<reference key="sourceIdentifier" ref="415773902"/>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">UIScrollView</string>
|
||||
<string key="superclassName">UIView</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">UIKit.framework/Headers/UIScrollView.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">UISearchBar</string>
|
||||
<string key="superclassName">UIView</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">UIKit.framework/Headers/UISearchBar.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">UISearchDisplayController</string>
|
||||
<string key="superclassName">NSObject</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">UIKit.framework/Headers/UISearchDisplayController.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">UITextView</string>
|
||||
<string key="superclassName">UIScrollView</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">UIKit.framework/Headers/UITextView.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">UIView</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">UIKit.framework/Headers/UITextField.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">UIView</string>
|
||||
<string key="superclassName">UIResponder</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">UIKit.framework/Headers/UIView.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">UIViewController</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">UIKit.framework/Headers/UINavigationController.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">UIViewController</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">UIKit.framework/Headers/UITabBarController.h</string>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">UIViewController</string>
|
||||
<string key="superclassName">UIResponder</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBFrameworkSource</string>
|
||||
<string key="minorKey">UIKit.framework/Headers/UIViewController.h</string>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<int key="IBDocument.localizationMode">0</int>
|
||||
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
|
||||
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
|
||||
<integer value="3100" key="NS.object.0"/>
|
||||
</object>
|
||||
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
|
||||
<string key="IBDocument.LastKnownRelativeProjectPath">Objective-Zip.xcodeproj</string>
|
||||
<int key="IBDocument.defaultPropertyAccessControl">3</int>
|
||||
<string key="IBCocoaTouchPluginVersion">3.1</string>
|
||||
</data>
|
||||
</archive>
|
||||
@@ -1,8 +0,0 @@
|
||||
//
|
||||
// Prefix header for all source files of the 'Objective-Zip' target in the 'Objective-Zip' project
|
||||
//
|
||||
|
||||
#ifdef __OBJC__
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <UIKit/UIKit.h>
|
||||
#endif
|
||||
393
README.md
393
README.md
@@ -1,21 +1,29 @@
|
||||
|
||||
|
||||
Objective-Zip
|
||||
=============
|
||||
|
||||
|
||||
## Deprecated
|
||||
|
||||
**This library is deprecated.** If you are still using it, you are encouraged to find alternatives.
|
||||
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
Objective-Zip is a small Objective-C library that wraps ZLib and MiniZip in
|
||||
an object-oriented friendly way.
|
||||
|
||||
|
||||
What is contained here
|
||||
----------------------
|
||||
|
||||
The source repository contains a sample application with full
|
||||
sources for ZLib, MiniZip and Objective-Zip, together with a unit test
|
||||
UI. The versions included are:
|
||||
- 1.2.7 for ZLib;
|
||||
- 1.1 for MiniZip;
|
||||
The source repository contains full sources for ZLib, MiniZip and
|
||||
Objective-Zip, together with some unit tests. The versions included are:
|
||||
|
||||
- 1.2.8 for [ZLib](http://zlib.net).
|
||||
- 1.1 (as of 13/5/2017) for [MiniZip](https://github.com/nmoinvaz/minizip).
|
||||
- latest version for Objective-Zip.
|
||||
|
||||
Please note that ZLib and MiniZip are included here only to provide a
|
||||
@@ -24,41 +32,396 @@ respective authors and redistributed on respect of their software
|
||||
license. Please refer to their websites (linked above) for more
|
||||
informations.
|
||||
|
||||
Getting started
|
||||
---------------
|
||||
|
||||
Please see GETTING_STARTED.
|
||||
Getting started
|
||||
===============
|
||||
|
||||
Objective-Zip exposes basic functionalities to read and write zip files,
|
||||
encapsulating both ZLib for the compression mechanism and MiniZip for
|
||||
the zip wrapping.
|
||||
|
||||
|
||||
Adding Objective-Zip to your project
|
||||
------------------------------------
|
||||
|
||||
The library is distributed via CocoaPods, you can add a dependency in you pod
|
||||
file with the following line:
|
||||
|
||||
pod 'objective-zip', '~> 1.0'
|
||||
|
||||
You can then access Objective-Zip classes with the following import
|
||||
statement if you plan to use exception handling:
|
||||
|
||||
```objective-c
|
||||
#import "Objective-Zip.h"
|
||||
```
|
||||
|
||||
Alternatively you can use the following import statement if you plan to use
|
||||
Apple's NSError pattern:
|
||||
|
||||
```objective-c
|
||||
#import "Objective-Zip+NSError.h"
|
||||
```
|
||||
|
||||
More on error handling at the end of this document.
|
||||
|
||||
|
||||
Main concepts
|
||||
-------------
|
||||
|
||||
Objective-Zip is centered on a class called (with a lack of fantasy)
|
||||
OZZipFile. It can be created with the common Objective-C procedure of an
|
||||
alloc followed by an init, specifying in the latter if the zip file is
|
||||
being created, appended or unzipped:
|
||||
|
||||
```objective-c
|
||||
OZZipFile *zipFile= [[OZZipFile alloc] initWithFileName:@"test.zip"
|
||||
mode:OZZipFileModeCreate];
|
||||
```
|
||||
|
||||
Creating and appending are both write-only modalities, while unzipping
|
||||
is a read-only modality. You can not request reading operations on a
|
||||
write-mode zip file, nor request writing operations on a read-mode zip
|
||||
file.
|
||||
|
||||
|
||||
Adding a file to a zip file
|
||||
---------------------------
|
||||
|
||||
The ZipFile class has a couple of methods to add new files to a zip
|
||||
file, one of which keeps the file in clear and the other encrypts it
|
||||
with a password. Both methods return an instance of a OZZipWriteStream
|
||||
class, which will be used solely for the scope of writing the content of
|
||||
the file, and then must be closed:
|
||||
|
||||
```objective-c
|
||||
OZZipWriteStream *stream= [zipFile writeFileInZipWithName:@"abc.txt"
|
||||
compressionLevel:OZZipCompressionLevelBest];
|
||||
|
||||
[stream writeData:abcData];
|
||||
[stream finishedWriting];
|
||||
```
|
||||
|
||||
|
||||
Adding a file to a zip file using encryption
|
||||
--------------------------------------------
|
||||
|
||||
Objective-Zip supports only traditional PKWare encryption, which is also the
|
||||
format most widely supported by common unzip utilities.
|
||||
|
||||
To add a file with encryption, it is necessary to precompute a CRC32 of
|
||||
the file being added. This is needed by traditional PKWare encryption
|
||||
to later verify that the password provided for decryption is correct.
|
||||
|
||||
The library includes a handy crc32 method as an NSData category
|
||||
(automatically imported under the umbrella header):
|
||||
|
||||
```objective-c
|
||||
NSData *fileData= // Your file data
|
||||
uint32_t crc= [fileData crc32];
|
||||
|
||||
OZZipWriteStream *stream= [zipFile writeFileInZipWithName:@"abc.txt"
|
||||
compressionLevel:OZZipCompressionLevelBest
|
||||
password:@"password"
|
||||
crc32:crc];
|
||||
|
||||
[stream writeData:fileData];
|
||||
[stream finishedWriting];
|
||||
```
|
||||
|
||||
Note that passing 0 (or any other non-CRC32 number) as the crc32 argument will make
|
||||
the decryption fail, even if the correct password is specified.
|
||||
|
||||
Note also that if your file is too large to be stored in a single NSData, you
|
||||
can still compute the CRC32 progressively by using a loop:
|
||||
|
||||
```objective-c
|
||||
NSFileHandle *fileHandle= // Your file handle
|
||||
|
||||
uint32_t crc= 0;
|
||||
do {
|
||||
|
||||
// Read a chunk of the file in data buffer
|
||||
NSData *data= [fileHandle readDataOfLength:BUFFER_SIZE];
|
||||
if ([data length] == 0)
|
||||
break;
|
||||
|
||||
crc= [data crc32withInitialCrc32:crc];
|
||||
|
||||
} while (YES);
|
||||
```
|
||||
|
||||
|
||||
Reading a file from a zip file
|
||||
------------------------------
|
||||
|
||||
The OZZipFile class, when used in unzip mode, must be treated like a
|
||||
cursor: you position the instance on a file at a time, either by
|
||||
step-forwarding or by locating the file by name. Once you are on the
|
||||
correct file, you can obtain an instance of a OZZipReadStream that will
|
||||
let you read the content (and then must be closed).
|
||||
|
||||
Since the file may not fit into memory, you can read it block by block using
|
||||
a buffer:
|
||||
|
||||
```objective-c
|
||||
OZZipFile *unzipFile= [[OZZipFile alloc] initWithFileName:@"test.zip"
|
||||
mode:OZZipFileModeUnzip];
|
||||
|
||||
[unzipFile goToFirstFileInZip];
|
||||
|
||||
OZZipReadStream *read= [unzipFile readCurrentFileInZip];
|
||||
NSMutableData *data= [[NSMutableData alloc] initWithLength:BUFFER_SIZE];
|
||||
|
||||
do {
|
||||
|
||||
// Reset buffer length
|
||||
[data setLength:BUFFER_SIZE];
|
||||
|
||||
// Read bytes and check for end of file
|
||||
int bytesRead= [read readDataWithBuffer:data];
|
||||
if (bytesRead <= 0)
|
||||
break;
|
||||
|
||||
[data setLength:bytesRead];
|
||||
|
||||
// Do something with data
|
||||
|
||||
} while (YES);
|
||||
|
||||
[read finishedReading];
|
||||
```
|
||||
|
||||
Alternatively, if you know in advance the file will fit into memory, you may
|
||||
preallocate a buffer big enough and read the all file at once. In the example
|
||||
below the buffer is preallocated with precisely the uncompressed size of the
|
||||
file:
|
||||
|
||||
```objective-c
|
||||
OZZipFile *unzipFile= [[OZZipFile alloc] initWithFileName:@"test.zip"
|
||||
mode:OZZipFileModeUnzip];
|
||||
|
||||
[unzipFile goToFirstFileInZip];
|
||||
OZFileInZipInfo *info= [unzipFile getCurrentFileInZipInfo];
|
||||
|
||||
OZZipReadStream *read= [unzipFile readCurrentFileInZip];
|
||||
NSMutableData *data= [[NSMutableData alloc] initWithLength:info.length];
|
||||
[read readDataWithBuffer:data];
|
||||
|
||||
// Do something with data
|
||||
|
||||
[read finishedReading];
|
||||
```
|
||||
|
||||
Note that the NSMutableData instance that acts as the read buffer must
|
||||
have been set with a length greater than 0: the `readDataWithBuffer` API
|
||||
will use that length to know how many bytes it can fetch from the zip
|
||||
file.
|
||||
|
||||
|
||||
Listing files in a zip file
|
||||
---------------------------
|
||||
|
||||
When the ZipFile class is used in unzip mode, it can also list the files
|
||||
contained in zip by filling an NSArray with instances of FileInZipInfo
|
||||
class. You can then use its name property to locate the file inside the
|
||||
zip and expand it:
|
||||
|
||||
```objective-c
|
||||
OZZipFile *unzipFile= [[OZZipFile alloc] initWithFileName:@"test.zip"
|
||||
mode:OZZipFileModeUnzip];
|
||||
|
||||
NSArray *infos= [unzipFile listFileInZipInfos];
|
||||
for (OZFileInZipInfo *info in infos) {
|
||||
NSLog(@"- %@ %@ %llu (%d)", info.name, info.date, info.size, info.level);
|
||||
|
||||
// Locate the file in the zip
|
||||
[unzipFile locateFileInZip:info.name];
|
||||
|
||||
// Expand the file in memory
|
||||
OZZipReadStream *read= [unzipFile readCurrentFileInZip];
|
||||
NSMutableData *data= [[NSMutableData alloc] initWithLength:info.length];
|
||||
int bytesRead= [read readDataWithBuffer:data];
|
||||
[read finishedReading];
|
||||
}
|
||||
```
|
||||
|
||||
Note that the OZFileInZipInfo class provide two sizes:
|
||||
|
||||
- **length** is the original (uncompressed) file size, while
|
||||
- **size** is the compressed file size.
|
||||
|
||||
|
||||
Closing the zip file
|
||||
--------------------
|
||||
|
||||
Remember, when you are done, to close your OZZipFile instance to avoid
|
||||
file corruption problems:
|
||||
|
||||
```objective-c
|
||||
[zipFile close];
|
||||
```
|
||||
|
||||
|
||||
File/folder hierarchy inide the zip
|
||||
-----------------------------------
|
||||
|
||||
Please note that inside the zip files there is no representation of a
|
||||
file-folder hierarchy: it is simply embedded in file names (i.e.: a file
|
||||
with a name like "x/y/z/file.txt"). It is up to the program that
|
||||
extracts files to consider these file names as expressing a structure and
|
||||
rebuild it on the file system (and viceversa during creation). Common
|
||||
zippers/unzippers simply follow this rule.
|
||||
|
||||
|
||||
Error handling
|
||||
--------------
|
||||
|
||||
Objective-Zip provides two kinds of error handling:
|
||||
|
||||
- standard exception handling;
|
||||
- Apple's NSError pattern.
|
||||
|
||||
With standard exception handling, Objective-Zip will throw an exception of
|
||||
class OZZipException any time an error occurs (programmer or runtime errors).
|
||||
|
||||
To use standard exception handling import Objective-Zip in your project with
|
||||
this statement:
|
||||
|
||||
```objective-c
|
||||
#import "Objective-Zip.h"
|
||||
```
|
||||
|
||||
With Apple's NSError pattern, Objective-Zip will expect a NSError
|
||||
pointer-to-pointer argument and will fill it with an NSError instance
|
||||
whenever a runtime error occurs. Will revert to throwing an exception (of
|
||||
OZZipException class) in case of programmer errors.
|
||||
|
||||
To use Apple's NSError pattern import Objective-Zip in your project with this
|
||||
statement:
|
||||
|
||||
```objective-c
|
||||
#import "Objective-Zip+NSError.h"
|
||||
```
|
||||
|
||||
Apple's NSError pattern is of course mandatory with Swift programming
|
||||
language, since it does not support exception handling.
|
||||
|
||||
|
||||
Differences in the interface
|
||||
----------------------------
|
||||
|
||||
Note that a few minor differences exist in the standard interface vs. the
|
||||
NSError pattern interface. Specifically:
|
||||
|
||||
* `[OZZipFile locateFileInZip:error:]` returns a `NSInteger` in place of a
|
||||
`BOOL`. Here the special values `OZLocateFileResultNotFound` and
|
||||
`OZLocateFileResultNotFound`, respectively `1` and `-1`, are used in place of
|
||||
`YES` and `NO`, since `0` is reserved for the case where an error occurred.
|
||||
* `[OZZipReadStream readDataWithBuffer:error:]` similarly returns a
|
||||
`NSInteger` in place of a `NSUInteger`. Here the special value
|
||||
`OZReadStreamResultEndOfFile`, corresponding to `-1`, is used for the
|
||||
end-of-file case, since `0` is again reserved for error occurrence.
|
||||
|
||||
|
||||
License
|
||||
-------
|
||||
=======
|
||||
|
||||
The library is distributed under the New BSD License.
|
||||
|
||||
|
||||
Version history
|
||||
---------------
|
||||
===============
|
||||
|
||||
Version 1.0.5:
|
||||
|
||||
- Improved support for computation of CRC32
|
||||
|
||||
Version 1.0.4:
|
||||
|
||||
- Updated to latest version of MiniZip (as of 13/5/2017)
|
||||
- Added unit tests for 32/64 cross compatibility
|
||||
- Added unit tests for encryption/decryption with password
|
||||
|
||||
Version 1.0.3:
|
||||
|
||||
- Fixed some memory leaks in MiniZip (contributed by @SheffieldKevin)
|
||||
- Silenced a warning about shifting a negative value in ZLib (contributed by Martin Winter)
|
||||
- Fixed throwing of errors so that it is compatible with Swift 3 (contributed by @andyj-at-aspin)
|
||||
- Fixed typos and errors in README (contributed by @deni2s)
|
||||
|
||||
Version 1.0.2:
|
||||
|
||||
- Fixed interface for `locateFileInZip` and `readDataWithBuffer` in NSError
|
||||
version so that they correctly support Swift error handling.
|
||||
|
||||
Version 1.0.1:
|
||||
|
||||
- Fixed compatibility bugs with Swift
|
||||
- Added Swift unit tests
|
||||
- Merged back GETTING STARTED in README
|
||||
|
||||
Version 1.0.0:
|
||||
|
||||
- Added official podspec to distribute via CocoaPods.
|
||||
- Added API docs.
|
||||
- Added nullability annotations.
|
||||
- Refactored DIY tests as unit tests.
|
||||
- Added targets for static libraries.
|
||||
- Added alternative interfaces with NSError pattern in place of exceptions.
|
||||
- Added support for legacy 32-bit zip files.
|
||||
- Added class prefix "OZ" to make Objective-Zip a good citizen.
|
||||
- Fully ARC-ified (removed ARCHelper)
|
||||
- Some code clean-up.
|
||||
|
||||
Version 0.8.3:
|
||||
|
||||
- Finally used correctly the 64 bit APIs. Thanks to Nathan Moinvaziri for advicing.
|
||||
- Updated test code to zip & unzip up to 5 GB.
|
||||
- Added tests with unzip & check of zip files create with Mac OS X 10.8 and Windows 7.
|
||||
|
||||
Version 0.8.2:
|
||||
|
||||
- Updated ZLib to 1.2.8
|
||||
- Updated MiniZip to Nathan Moinvaziri's Version (thanks [Sergio](http://mrsergio.com) for the suggestions)
|
||||
- Added test code to zip & unzip up to (slighlty less than) 4 GB:
|
||||
the library is able to create and expand files up to
|
||||
4,293,387,000 bytes (compressed); use the test with caution,
|
||||
requires 4 GB of free space and around 10 minutes on the
|
||||
iOS simulator
|
||||
|
||||
Version 0.8.1:
|
||||
|
||||
- Added support for ARC through Nick Lockwood's [ARC Helper](https://gist.github.com/1563325)
|
||||
|
||||
Version 0.8:
|
||||
- Updated ZLip to 1.2.7
|
||||
|
||||
- Updated ZLib to 1.2.7
|
||||
- Updated MiniZip to 1.1
|
||||
- Added method to get file name from a ZipFile instance
|
||||
|
||||
Version 0.7.3:
|
||||
|
||||
- Fixed memory leak in test app
|
||||
|
||||
Version 0.7.2:
|
||||
|
||||
- Added variant of writeFileInZipWithName that accepts also a file date
|
||||
- Fixed bug with date handling
|
||||
|
||||
Version 0.7.1:
|
||||
|
||||
- Fixed a bug in creation of an encrypted zip file
|
||||
|
||||
Version 0.7.0:
|
||||
|
||||
- Initial public beta release
|
||||
|
||||
|
||||
Compatibility
|
||||
-------------
|
||||
=============
|
||||
|
||||
Version 0.8 has been tested with iOS from 4.2 to 5.1, but should be
|
||||
compatible with earlier versions too. Le me know of any issues that
|
||||
should arise.
|
||||
Version 1.0.5 has been tested with iOS up to 10.3 and OS X up to 10.12, but
|
||||
should be compatible with earlier versions too, down to iOS 8.0 and OS X 10.7.
|
||||
Le me know of any issues that should arise.
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
|
||||
z_stream stream;
|
||||
int err;
|
||||
|
||||
stream.next_in = (Bytef*)source;
|
||||
stream.next_in = (z_const Bytef *)source;
|
||||
stream.avail_in = (uInt)sourceLen;
|
||||
#ifdef MAXSEG_64K
|
||||
/* Check for source > 64K on 16-bit machine: */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* deflate.c -- compress data using the deflation algorithm
|
||||
* Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler
|
||||
* Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
#include "deflate.h"
|
||||
|
||||
const char deflate_copyright[] =
|
||||
" deflate 1.2.7 Copyright 1995-2012 Jean-loup Gailly and Mark Adler ";
|
||||
" deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler ";
|
||||
/*
|
||||
If you use the zlib library in a product, an acknowledgment is welcome
|
||||
in the documentation of your product. If for some reason you cannot
|
||||
@@ -305,7 +305,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
|
||||
if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
|
||||
s->pending_buf == Z_NULL) {
|
||||
s->status = FINISH_STATE;
|
||||
strm->msg = (char*)ERR_MSG(Z_MEM_ERROR);
|
||||
strm->msg = ERR_MSG(Z_MEM_ERROR);
|
||||
deflateEnd (strm);
|
||||
return Z_MEM_ERROR;
|
||||
}
|
||||
@@ -329,7 +329,7 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
|
||||
uInt str, n;
|
||||
int wrap;
|
||||
unsigned avail;
|
||||
unsigned char *next;
|
||||
z_const unsigned char *next;
|
||||
|
||||
if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL)
|
||||
return Z_STREAM_ERROR;
|
||||
@@ -359,7 +359,7 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
|
||||
avail = strm->avail_in;
|
||||
next = strm->next_in;
|
||||
strm->avail_in = dictLength;
|
||||
strm->next_in = (Bytef *)dictionary;
|
||||
strm->next_in = (z_const Bytef *)dictionary;
|
||||
fill_window(s);
|
||||
while (s->lookahead >= MIN_MATCH) {
|
||||
str = s->strstart;
|
||||
@@ -513,6 +513,8 @@ int ZEXPORT deflateParams(strm, level, strategy)
|
||||
strm->total_in != 0) {
|
||||
/* Flush the last buffer: */
|
||||
err = deflate(strm, Z_BLOCK);
|
||||
if (err == Z_BUF_ERROR && s->pending == 0)
|
||||
err = Z_OK;
|
||||
}
|
||||
if (s->level != level) {
|
||||
s->level = level;
|
||||
|
||||
@@ -104,7 +104,7 @@ typedef struct internal_state {
|
||||
int wrap; /* bit 0 true for zlib, bit 1 true for gzip */
|
||||
gz_headerp gzhead; /* gzip header information to write */
|
||||
uInt gzindex; /* where in extra, name, or comment */
|
||||
Byte method; /* STORED (for zip only) or DEFLATED */
|
||||
Byte method; /* can only be DEFLATED */
|
||||
int last_flush; /* value of flush param for previous deflate call */
|
||||
|
||||
/* used by deflate.c: */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* gzguts.h -- zlib internal header definitions for gz* operations
|
||||
* Copyright (C) 2004, 2005, 2010, 2011, 2012 Mark Adler
|
||||
* Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
@@ -41,6 +41,13 @@
|
||||
# include <io.h>
|
||||
#endif
|
||||
|
||||
#ifdef WINAPI_FAMILY
|
||||
# define open _open
|
||||
# define read _read
|
||||
# define write _write
|
||||
# define close _close
|
||||
#endif
|
||||
|
||||
#ifdef NO_DEFLATE /* for compatibility with old definition */
|
||||
# define NO_GZCOMPRESS
|
||||
#endif
|
||||
@@ -66,7 +73,7 @@
|
||||
#ifndef HAVE_VSNPRINTF
|
||||
# ifdef MSDOS
|
||||
/* vsnprintf may exist on some MS-DOS compilers (DJGPP?),
|
||||
but for now we just assume it doesn't. */
|
||||
but for now we just assume it doesn't. */
|
||||
# define NO_vsnprintf
|
||||
# endif
|
||||
# ifdef __TURBOC__
|
||||
@@ -94,6 +101,14 @@
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* unlike snprintf (which is required in C99, yet still not supported by
|
||||
Microsoft more than a decade later!), _snprintf does not guarantee null
|
||||
termination of the result -- however this is only used in gzlib.c where
|
||||
the result is assured to fit in the space provided */
|
||||
#ifdef _MSC_VER
|
||||
# define snprintf _snprintf
|
||||
#endif
|
||||
|
||||
#ifndef local
|
||||
# define local static
|
||||
#endif
|
||||
@@ -133,7 +148,8 @@
|
||||
# define DEF_MEM_LEVEL MAX_MEM_LEVEL
|
||||
#endif
|
||||
|
||||
/* default i/o buffer size -- double this for output when reading */
|
||||
/* default i/o buffer size -- double this for output when reading (this and
|
||||
twice this must be able to fit in an unsigned type) */
|
||||
#define GZBUFSIZE 8192
|
||||
|
||||
/* gzip modes, also provide a little integrity check on the passed structure */
|
||||
|
||||
46
ZLib/gzlib.c
46
ZLib/gzlib.c
@@ -1,5 +1,5 @@
|
||||
/* gzlib.c -- zlib functions common to reading and writing gzip files
|
||||
* Copyright (C) 2004, 2010, 2011, 2012 Mark Adler
|
||||
* Copyright (C) 2004, 2010, 2011, 2012, 2013 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
@@ -108,7 +108,7 @@ local gzFile gz_open(path, fd, mode)
|
||||
return NULL;
|
||||
|
||||
/* allocate gzFile structure to return */
|
||||
state = malloc(sizeof(gz_state));
|
||||
state = (gz_statep)malloc(sizeof(gz_state));
|
||||
if (state == NULL)
|
||||
return NULL;
|
||||
state->size = 0; /* no buffers allocated yet */
|
||||
@@ -162,8 +162,10 @@ local gzFile gz_open(path, fd, mode)
|
||||
break;
|
||||
case 'F':
|
||||
state->strategy = Z_FIXED;
|
||||
break;
|
||||
case 'T':
|
||||
state->direct = 1;
|
||||
break;
|
||||
default: /* could consider as an error, but just ignore */
|
||||
;
|
||||
}
|
||||
@@ -194,8 +196,8 @@ local gzFile gz_open(path, fd, mode)
|
||||
}
|
||||
else
|
||||
#endif
|
||||
len = strlen(path);
|
||||
state->path = malloc(len + 1);
|
||||
len = strlen((const char *)path);
|
||||
state->path = (char *)malloc(len + 1);
|
||||
if (state->path == NULL) {
|
||||
free(state);
|
||||
return NULL;
|
||||
@@ -208,7 +210,11 @@ local gzFile gz_open(path, fd, mode)
|
||||
*(state->path) = 0;
|
||||
else
|
||||
#endif
|
||||
#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
|
||||
snprintf(state->path, len + 1, "%s", (const char *)path);
|
||||
#else
|
||||
strcpy(state->path, path);
|
||||
#endif
|
||||
|
||||
/* compute the flags for open() */
|
||||
oflag =
|
||||
@@ -236,7 +242,7 @@ local gzFile gz_open(path, fd, mode)
|
||||
#ifdef _WIN32
|
||||
fd == -2 ? _wopen(path, oflag, 0666) :
|
||||
#endif
|
||||
open(path, oflag, 0666));
|
||||
open((const char *)path, oflag, 0666));
|
||||
if (state->fd == -1) {
|
||||
free(state->path);
|
||||
free(state);
|
||||
@@ -247,7 +253,7 @@ local gzFile gz_open(path, fd, mode)
|
||||
|
||||
/* save the current position for rewinding (only if reading) */
|
||||
if (state->mode == GZ_READ) {
|
||||
state->start = LSEEK(state->fd, 0, SEEK_CUR);
|
||||
state->start = (z_off64_t) LSEEK(state->fd, 0, SEEK_CUR);
|
||||
if (state->start == -1) state->start = 0;
|
||||
}
|
||||
|
||||
@@ -282,9 +288,13 @@ gzFile ZEXPORT gzdopen(fd, mode)
|
||||
char *path; /* identifier for error messages */
|
||||
gzFile gz;
|
||||
|
||||
if (fd == -1 || (path = malloc(7 + 3 * sizeof(int))) == NULL)
|
||||
if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL)
|
||||
return NULL;
|
||||
#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
|
||||
snprintf(path, 7 + 3 * sizeof(int), "<fd:%d>", fd); /* for debugging */
|
||||
#else
|
||||
sprintf(path, "<fd:%d>", fd); /* for debugging */
|
||||
#endif
|
||||
gz = gz_open(path, fd, mode);
|
||||
free(path);
|
||||
return gz;
|
||||
@@ -383,7 +393,7 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence)
|
||||
/* if within raw area while reading, just go there */
|
||||
if (state->mode == GZ_READ && state->how == COPY &&
|
||||
state->x.pos + offset >= 0) {
|
||||
ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR);
|
||||
ret = (z_off64_t) LSEEK(state->fd, offset - state->x.have, SEEK_CUR);
|
||||
if (ret == -1)
|
||||
return -1;
|
||||
state->x.have = 0;
|
||||
@@ -479,7 +489,7 @@ z_off64_t ZEXPORT gzoffset64(file)
|
||||
return -1;
|
||||
|
||||
/* compute and return effective offset in file */
|
||||
offset = LSEEK(state->fd, 0, SEEK_CUR);
|
||||
offset = (z_off64_t) LSEEK(state->fd, 0, SEEK_CUR);
|
||||
if (offset == -1)
|
||||
return -1;
|
||||
if (state->mode == GZ_READ) /* reading */
|
||||
@@ -531,7 +541,8 @@ const char * ZEXPORT gzerror(file, errnum)
|
||||
/* return error information */
|
||||
if (errnum != NULL)
|
||||
*errnum = state->err;
|
||||
return state->msg == NULL ? "" : state->msg;
|
||||
return state->err == Z_MEM_ERROR ? "out of memory" :
|
||||
(state->msg == NULL ? "" : state->msg);
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
@@ -582,21 +593,24 @@ void ZLIB_INTERNAL gz_error(state, err, msg)
|
||||
if (msg == NULL)
|
||||
return;
|
||||
|
||||
/* for an out of memory error, save as static string */
|
||||
if (err == Z_MEM_ERROR) {
|
||||
state->msg = (char *)msg;
|
||||
/* for an out of memory error, return literal string when requested */
|
||||
if (err == Z_MEM_ERROR)
|
||||
return;
|
||||
}
|
||||
|
||||
/* construct error message with path */
|
||||
if ((state->msg = malloc(strlen(state->path) + strlen(msg) + 3)) == NULL) {
|
||||
if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) ==
|
||||
NULL) {
|
||||
state->err = Z_MEM_ERROR;
|
||||
state->msg = (char *)"out of memory";
|
||||
return;
|
||||
}
|
||||
#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
|
||||
snprintf(state->msg, strlen(state->path) + strlen(msg) + 3,
|
||||
"%s%s%s", state->path, ": ", msg);
|
||||
#else
|
||||
strcpy(state->msg, state->path);
|
||||
strcat(state->msg, ": ");
|
||||
strcat(state->msg, msg);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* gzread.c -- zlib functions for reading gzip files
|
||||
* Copyright (C) 2004, 2005, 2010, 2011, 2012 Mark Adler
|
||||
* Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
@@ -27,7 +27,7 @@ local int gz_load(state, buf, len, have)
|
||||
|
||||
*have = 0;
|
||||
do {
|
||||
ret = read(state->fd, buf + *have, len - *have);
|
||||
ret = (int) read(state->fd, buf + *have, len - *have);
|
||||
if (ret <= 0)
|
||||
break;
|
||||
*have += ret;
|
||||
@@ -58,7 +58,8 @@ local int gz_avail(state)
|
||||
return -1;
|
||||
if (state->eof == 0) {
|
||||
if (strm->avail_in) { /* copy what's there to the start */
|
||||
unsigned char *p = state->in, *q = strm->next_in;
|
||||
unsigned char *p = state->in;
|
||||
unsigned const char *q = strm->next_in;
|
||||
unsigned n = strm->avail_in;
|
||||
do {
|
||||
*p++ = *q++;
|
||||
@@ -90,8 +91,8 @@ local int gz_look(state)
|
||||
/* allocate read buffers and inflate memory */
|
||||
if (state->size == 0) {
|
||||
/* allocate buffers */
|
||||
state->in = malloc(state->want);
|
||||
state->out = malloc(state->want << 1);
|
||||
state->in = (unsigned char *)malloc(state->want);
|
||||
state->out = (unsigned char *)malloc(state->want << 1);
|
||||
if (state->in == NULL || state->out == NULL) {
|
||||
if (state->out != NULL)
|
||||
free(state->out);
|
||||
@@ -352,14 +353,14 @@ int ZEXPORT gzread(file, buf, len)
|
||||
|
||||
/* large len -- read directly into user buffer */
|
||||
else if (state->how == COPY) { /* read directly */
|
||||
if (gz_load(state, buf, len, &n) == -1)
|
||||
if (gz_load(state, (unsigned char *)buf, len, &n) == -1)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* large len -- decompress directly into user buffer */
|
||||
else { /* state->how == GZIP */
|
||||
strm->avail_out = len;
|
||||
strm->next_out = buf;
|
||||
strm->next_out = (unsigned char *)buf;
|
||||
if (gz_decomp(state) == -1)
|
||||
return -1;
|
||||
n = state->x.have;
|
||||
@@ -378,7 +379,11 @@ int ZEXPORT gzread(file, buf, len)
|
||||
}
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
#undef gzgetc
|
||||
#ifdef Z_PREFIX_SET
|
||||
# undef z_gzgetc
|
||||
#else
|
||||
# undef gzgetc
|
||||
#endif
|
||||
int ZEXPORT gzgetc(file)
|
||||
gzFile file;
|
||||
{
|
||||
@@ -518,7 +523,7 @@ char * ZEXPORT gzgets(file, buf, len)
|
||||
|
||||
/* look for end-of-line in current output buffer */
|
||||
n = state->x.have > left ? left : state->x.have;
|
||||
eol = memchr(state->x.next, '\n', n);
|
||||
eol = (unsigned char *)memchr(state->x.next, '\n', n);
|
||||
if (eol != NULL)
|
||||
n = (unsigned)(eol - state->x.next) + 1;
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* gzwrite.c -- zlib functions for writing gzip files
|
||||
* Copyright (C) 2004, 2005, 2010, 2011, 2012 Mark Adler
|
||||
* Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
@@ -19,7 +19,7 @@ local int gz_init(state)
|
||||
z_streamp strm = &(state->strm);
|
||||
|
||||
/* allocate input buffer */
|
||||
state->in = malloc(state->want);
|
||||
state->in = (unsigned char *)malloc(state->want);
|
||||
if (state->in == NULL) {
|
||||
gz_error(state, Z_MEM_ERROR, "out of memory");
|
||||
return -1;
|
||||
@@ -28,7 +28,7 @@ local int gz_init(state)
|
||||
/* only need output buffer and deflate state if compressing */
|
||||
if (!state->direct) {
|
||||
/* allocate output buffer */
|
||||
state->out = malloc(state->want);
|
||||
state->out = (unsigned char *)malloc(state->want);
|
||||
if (state->out == NULL) {
|
||||
free(state->in);
|
||||
gz_error(state, Z_MEM_ERROR, "out of memory");
|
||||
@@ -81,7 +81,7 @@ local int gz_comp(state, flush)
|
||||
|
||||
/* write directly if requested */
|
||||
if (state->direct) {
|
||||
got = write(state->fd, strm->next_in, strm->avail_in);
|
||||
got = (int) write(state->fd, strm->next_in, strm->avail_in);
|
||||
if (got < 0 || (unsigned)got != strm->avail_in) {
|
||||
gz_error(state, Z_ERRNO, zstrerror());
|
||||
return -1;
|
||||
@@ -98,7 +98,7 @@ local int gz_comp(state, flush)
|
||||
if (strm->avail_out == 0 || (flush != Z_NO_FLUSH &&
|
||||
(flush != Z_FINISH || ret == Z_STREAM_END))) {
|
||||
have = (unsigned)(strm->next_out - state->x.next);
|
||||
if (have && ((got = write(state->fd, state->x.next, have)) < 0 ||
|
||||
if (have && ((got = (int) write(state->fd, state->x.next, have)) < 0 ||
|
||||
(unsigned)got != have)) {
|
||||
gz_error(state, Z_ERRNO, zstrerror());
|
||||
return -1;
|
||||
@@ -168,7 +168,6 @@ int ZEXPORT gzwrite(file, buf, len)
|
||||
unsigned len;
|
||||
{
|
||||
unsigned put = len;
|
||||
unsigned n;
|
||||
gz_statep state;
|
||||
z_streamp strm;
|
||||
|
||||
@@ -208,16 +207,19 @@ int ZEXPORT gzwrite(file, buf, len)
|
||||
if (len < state->size) {
|
||||
/* copy to input buffer, compress when full */
|
||||
do {
|
||||
unsigned have, copy;
|
||||
|
||||
if (strm->avail_in == 0)
|
||||
strm->next_in = state->in;
|
||||
n = state->size - strm->avail_in;
|
||||
if (n > len)
|
||||
n = len;
|
||||
memcpy(strm->next_in + strm->avail_in, buf, n);
|
||||
strm->avail_in += n;
|
||||
state->x.pos += n;
|
||||
buf = (char *)buf + n;
|
||||
len -= n;
|
||||
have = (unsigned)((strm->next_in + strm->avail_in) - state->in);
|
||||
copy = state->size - have;
|
||||
if (copy > len)
|
||||
copy = len;
|
||||
memcpy(state->in + have, buf, copy);
|
||||
strm->avail_in += copy;
|
||||
state->x.pos += copy;
|
||||
buf = (const char *)buf + copy;
|
||||
len -= copy;
|
||||
if (len && gz_comp(state, Z_NO_FLUSH) == -1)
|
||||
return 0;
|
||||
} while (len);
|
||||
@@ -229,7 +231,7 @@ int ZEXPORT gzwrite(file, buf, len)
|
||||
|
||||
/* directly compress user buffer to file */
|
||||
strm->avail_in = len;
|
||||
strm->next_in = (voidp)buf;
|
||||
strm->next_in = (z_const Bytef *)buf;
|
||||
state->x.pos += len;
|
||||
if (gz_comp(state, Z_NO_FLUSH) == -1)
|
||||
return 0;
|
||||
@@ -244,6 +246,7 @@ int ZEXPORT gzputc(file, c)
|
||||
gzFile file;
|
||||
int c;
|
||||
{
|
||||
unsigned have;
|
||||
unsigned char buf[1];
|
||||
gz_statep state;
|
||||
z_streamp strm;
|
||||
@@ -267,12 +270,16 @@ int ZEXPORT gzputc(file, c)
|
||||
|
||||
/* try writing to input buffer for speed (state->size == 0 if buffer not
|
||||
initialized) */
|
||||
if (strm->avail_in < state->size) {
|
||||
if (state->size) {
|
||||
if (strm->avail_in == 0)
|
||||
strm->next_in = state->in;
|
||||
strm->next_in[strm->avail_in++] = c;
|
||||
state->x.pos++;
|
||||
return c & 0xff;
|
||||
have = (unsigned)((strm->next_in + strm->avail_in) - state->in);
|
||||
if (have < state->size) {
|
||||
state->in[have] = c;
|
||||
strm->avail_in++;
|
||||
state->x.pos++;
|
||||
return c & 0xff;
|
||||
}
|
||||
}
|
||||
|
||||
/* no room in buffer or not initialized, use gz_write() */
|
||||
@@ -300,12 +307,11 @@ int ZEXPORT gzputs(file, str)
|
||||
#include <stdarg.h>
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
int ZEXPORTVA gzprintf (gzFile file, const char *format, ...)
|
||||
int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va)
|
||||
{
|
||||
int size, len;
|
||||
gz_statep state;
|
||||
z_streamp strm;
|
||||
va_list va;
|
||||
|
||||
/* get internal structure */
|
||||
if (file == NULL)
|
||||
@@ -335,25 +341,20 @@ int ZEXPORTVA gzprintf (gzFile file, const char *format, ...)
|
||||
/* do the printf() into the input buffer, put length in len */
|
||||
size = (int)(state->size);
|
||||
state->in[size - 1] = 0;
|
||||
va_start(va, format);
|
||||
#ifdef NO_vsnprintf
|
||||
# ifdef HAS_vsprintf_void
|
||||
(void)vsprintf((char *)(state->in), format, va);
|
||||
va_end(va);
|
||||
for (len = 0; len < size; len++)
|
||||
if (state->in[len] == 0) break;
|
||||
# else
|
||||
len = vsprintf((char *)(state->in), format, va);
|
||||
va_end(va);
|
||||
# endif
|
||||
#else
|
||||
# ifdef HAS_vsnprintf_void
|
||||
(void)vsnprintf((char *)(state->in), size, format, va);
|
||||
va_end(va);
|
||||
len = strlen((char *)(state->in));
|
||||
# else
|
||||
len = vsnprintf((char *)(state->in), size, format, va);
|
||||
va_end(va);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
@@ -368,6 +369,17 @@ int ZEXPORTVA gzprintf (gzFile file, const char *format, ...)
|
||||
return len;
|
||||
}
|
||||
|
||||
int ZEXPORTVA gzprintf(gzFile file, const char *format, ...)
|
||||
{
|
||||
va_list va;
|
||||
int ret;
|
||||
|
||||
va_start(va, format);
|
||||
ret = gzvprintf(file, format, va);
|
||||
va_end(va);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#else /* !STDC && !Z_HAVE_STDARG_H */
|
||||
|
||||
/* -- see zlib.h -- */
|
||||
@@ -547,9 +559,9 @@ int ZEXPORT gzclose_w(file)
|
||||
}
|
||||
|
||||
/* flush, free memory, and close file */
|
||||
if (gz_comp(state, Z_FINISH) == -1)
|
||||
ret = state->err;
|
||||
if (state->size) {
|
||||
if (gz_comp(state, Z_FINISH) == -1)
|
||||
ret = state->err;
|
||||
if (!state->direct) {
|
||||
(void)deflateEnd(&(state->strm));
|
||||
free(state->out);
|
||||
|
||||
@@ -255,7 +255,7 @@ out_func out;
|
||||
void FAR *out_desc;
|
||||
{
|
||||
struct inflate_state FAR *state;
|
||||
unsigned char FAR *next; /* next input */
|
||||
z_const unsigned char FAR *next; /* next input */
|
||||
unsigned char FAR *put; /* next output */
|
||||
unsigned have, left; /* available input and output */
|
||||
unsigned long hold; /* bit buffer */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* inffast.c -- fast decoding
|
||||
* Copyright (C) 1995-2008, 2010 Mark Adler
|
||||
* Copyright (C) 1995-2008, 2010, 2013 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
@@ -69,8 +69,8 @@ z_streamp strm;
|
||||
unsigned start; /* inflate()'s starting value for strm->avail_out */
|
||||
{
|
||||
struct inflate_state FAR *state;
|
||||
unsigned char FAR *in; /* local strm->next_in */
|
||||
unsigned char FAR *last; /* while in < last, enough input available */
|
||||
z_const unsigned char FAR *in; /* local strm->next_in */
|
||||
z_const unsigned char FAR *last; /* have enough input while in < last */
|
||||
unsigned char FAR *out; /* local strm->next_out */
|
||||
unsigned char FAR *beg; /* inflate()'s initial strm->next_out */
|
||||
unsigned char FAR *end; /* while out < end, enough space available */
|
||||
|
||||
@@ -93,11 +93,12 @@
|
||||
|
||||
/* function prototypes */
|
||||
local void fixedtables OF((struct inflate_state FAR *state));
|
||||
local int updatewindow OF((z_streamp strm, unsigned out));
|
||||
local int updatewindow OF((z_streamp strm, const unsigned char FAR *end,
|
||||
unsigned copy));
|
||||
#ifdef BUILDFIXED
|
||||
void makefixed OF((void));
|
||||
#endif
|
||||
local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf,
|
||||
local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf,
|
||||
unsigned len));
|
||||
|
||||
int ZEXPORT inflateResetKeep(strm)
|
||||
@@ -375,12 +376,13 @@ void makefixed()
|
||||
output will fall in the output data, making match copies simpler and faster.
|
||||
The advantage may be dependent on the size of the processor's data caches.
|
||||
*/
|
||||
local int updatewindow(strm, out)
|
||||
local int updatewindow(strm, end, copy)
|
||||
z_streamp strm;
|
||||
unsigned out;
|
||||
const Bytef *end;
|
||||
unsigned copy;
|
||||
{
|
||||
struct inflate_state FAR *state;
|
||||
unsigned copy, dist;
|
||||
unsigned dist;
|
||||
|
||||
state = (struct inflate_state FAR *)strm->state;
|
||||
|
||||
@@ -400,19 +402,18 @@ unsigned out;
|
||||
}
|
||||
|
||||
/* copy state->wsize or less output bytes into the circular window */
|
||||
copy = out - strm->avail_out;
|
||||
if (copy >= state->wsize) {
|
||||
zmemcpy(state->window, strm->next_out - state->wsize, state->wsize);
|
||||
zmemcpy(state->window, end - state->wsize, state->wsize);
|
||||
state->wnext = 0;
|
||||
state->whave = state->wsize;
|
||||
}
|
||||
else {
|
||||
dist = state->wsize - state->wnext;
|
||||
if (dist > copy) dist = copy;
|
||||
zmemcpy(state->window + state->wnext, strm->next_out - copy, dist);
|
||||
zmemcpy(state->window + state->wnext, end - copy, dist);
|
||||
copy -= dist;
|
||||
if (copy) {
|
||||
zmemcpy(state->window, strm->next_out - copy, copy);
|
||||
zmemcpy(state->window, end - copy, copy);
|
||||
state->wnext = copy;
|
||||
state->whave = state->wsize;
|
||||
}
|
||||
@@ -606,7 +607,7 @@ z_streamp strm;
|
||||
int flush;
|
||||
{
|
||||
struct inflate_state FAR *state;
|
||||
unsigned char FAR *next; /* next input */
|
||||
z_const unsigned char FAR *next; /* next input */
|
||||
unsigned char FAR *put; /* next output */
|
||||
unsigned have, left; /* available input and output */
|
||||
unsigned long hold; /* bit buffer */
|
||||
@@ -920,7 +921,7 @@ int flush;
|
||||
while (state->have < 19)
|
||||
state->lens[order[state->have++]] = 0;
|
||||
state->next = state->codes;
|
||||
state->lencode = (code const FAR *)(state->next);
|
||||
state->lencode = (const code FAR *)(state->next);
|
||||
state->lenbits = 7;
|
||||
ret = inflate_table(CODES, state->lens, 19, &(state->next),
|
||||
&(state->lenbits), state->work);
|
||||
@@ -994,7 +995,7 @@ int flush;
|
||||
values here (9 and 6) without reading the comments in inftrees.h
|
||||
concerning the ENOUGH constants, which depend on those values */
|
||||
state->next = state->codes;
|
||||
state->lencode = (code const FAR *)(state->next);
|
||||
state->lencode = (const code FAR *)(state->next);
|
||||
state->lenbits = 9;
|
||||
ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
|
||||
&(state->lenbits), state->work);
|
||||
@@ -1003,7 +1004,7 @@ int flush;
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
state->distcode = (code const FAR *)(state->next);
|
||||
state->distcode = (const code FAR *)(state->next);
|
||||
state->distbits = 6;
|
||||
ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
|
||||
&(state->next), &(state->distbits), state->work);
|
||||
@@ -1230,7 +1231,7 @@ int flush;
|
||||
RESTORE();
|
||||
if (state->wsize || (out != strm->avail_out && state->mode < BAD &&
|
||||
(state->mode < CHECK || flush != Z_FINISH)))
|
||||
if (updatewindow(strm, out)) {
|
||||
if (updatewindow(strm, strm->next_out, out - strm->avail_out)) {
|
||||
state->mode = MEM;
|
||||
return Z_MEM_ERROR;
|
||||
}
|
||||
@@ -1264,6 +1265,29 @@ z_streamp strm;
|
||||
return Z_OK;
|
||||
}
|
||||
|
||||
int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength)
|
||||
z_streamp strm;
|
||||
Bytef *dictionary;
|
||||
uInt *dictLength;
|
||||
{
|
||||
struct inflate_state FAR *state;
|
||||
|
||||
/* check state */
|
||||
if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
|
||||
state = (struct inflate_state FAR *)strm->state;
|
||||
|
||||
/* copy dictionary */
|
||||
if (state->whave && dictionary != Z_NULL) {
|
||||
zmemcpy(dictionary, state->window + state->wnext,
|
||||
state->whave - state->wnext);
|
||||
zmemcpy(dictionary + state->whave - state->wnext,
|
||||
state->window, state->wnext);
|
||||
}
|
||||
if (dictLength != Z_NULL)
|
||||
*dictLength = state->whave;
|
||||
return Z_OK;
|
||||
}
|
||||
|
||||
int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)
|
||||
z_streamp strm;
|
||||
const Bytef *dictionary;
|
||||
@@ -1271,8 +1295,6 @@ uInt dictLength;
|
||||
{
|
||||
struct inflate_state FAR *state;
|
||||
unsigned long dictid;
|
||||
unsigned char *next;
|
||||
unsigned avail;
|
||||
int ret;
|
||||
|
||||
/* check state */
|
||||
@@ -1291,13 +1313,7 @@ uInt dictLength;
|
||||
|
||||
/* copy dictionary to window using updatewindow(), which will amend the
|
||||
existing dictionary if appropriate */
|
||||
next = strm->next_out;
|
||||
avail = strm->avail_out;
|
||||
strm->next_out = (Bytef *)dictionary + dictLength;
|
||||
strm->avail_out = 0;
|
||||
ret = updatewindow(strm, dictLength);
|
||||
strm->avail_out = avail;
|
||||
strm->next_out = next;
|
||||
ret = updatewindow(strm, dictionary + dictLength, dictLength);
|
||||
if (ret) {
|
||||
state->mode = MEM;
|
||||
return Z_MEM_ERROR;
|
||||
@@ -1337,7 +1353,7 @@ gz_headerp head;
|
||||
*/
|
||||
local unsigned syncsearch(have, buf, len)
|
||||
unsigned FAR *have;
|
||||
unsigned char FAR *buf;
|
||||
const unsigned char FAR *buf;
|
||||
unsigned len;
|
||||
{
|
||||
unsigned got;
|
||||
@@ -1488,9 +1504,10 @@ z_streamp strm;
|
||||
{
|
||||
struct inflate_state FAR *state;
|
||||
|
||||
if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16;
|
||||
if (strm == Z_NULL || strm->state == Z_NULL)
|
||||
return (long)(((unsigned long)0 - 1) << 16);
|
||||
state = (struct inflate_state FAR *)strm->state;
|
||||
return ((long)(state->back) << 16) +
|
||||
return (long)(((unsigned long)((long)state->back)) << 16) +
|
||||
(state->mode == COPY ? state->length :
|
||||
(state->mode == MATCH ? state->was - state->length : 0));
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* inftrees.c -- generate Huffman trees for efficient decoding
|
||||
* Copyright (C) 1995-2012 Mark Adler
|
||||
* Copyright (C) 1995-2013 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
#define MAXBITS 15
|
||||
|
||||
const char inflate_copyright[] =
|
||||
" inflate 1.2.7 Copyright 1995-2012 Mark Adler ";
|
||||
" inflate 1.2.8 Copyright 1995-2013 Mark Adler ";
|
||||
/*
|
||||
If you use the zlib library in a product, an acknowledgment is welcome
|
||||
in the documentation of your product. If for some reason you cannot
|
||||
@@ -62,7 +62,7 @@ unsigned short FAR *work;
|
||||
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
|
||||
static const unsigned short lext[31] = { /* Length codes 257..285 extra */
|
||||
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
|
||||
19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 78, 68};
|
||||
19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78};
|
||||
static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
|
||||
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
|
||||
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
|
||||
@@ -208,8 +208,8 @@ unsigned short FAR *work;
|
||||
mask = used - 1; /* mask for comparing low */
|
||||
|
||||
/* check available table space */
|
||||
if ((type == LENS && used >= ENOUGH_LENS) ||
|
||||
(type == DISTS && used >= ENOUGH_DISTS))
|
||||
if ((type == LENS && used > ENOUGH_LENS) ||
|
||||
(type == DISTS && used > ENOUGH_DISTS))
|
||||
return 1;
|
||||
|
||||
/* process all codes and make table entries */
|
||||
@@ -277,8 +277,8 @@ unsigned short FAR *work;
|
||||
|
||||
/* check for enough space */
|
||||
used += 1U << curr;
|
||||
if ((type == LENS && used >= ENOUGH_LENS) ||
|
||||
(type == DISTS && used >= ENOUGH_DISTS))
|
||||
if ((type == LENS && used > ENOUGH_LENS) ||
|
||||
(type == DISTS && used > ENOUGH_DISTS))
|
||||
return 1;
|
||||
|
||||
/* point entry in root table to sub-table */
|
||||
|
||||
14
ZLib/trees.c
14
ZLib/trees.c
@@ -146,8 +146,8 @@ local void send_tree OF((deflate_state *s, ct_data *tree, int max_code));
|
||||
local int build_bl_tree OF((deflate_state *s));
|
||||
local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
|
||||
int blcodes));
|
||||
local void compress_block OF((deflate_state *s, ct_data *ltree,
|
||||
ct_data *dtree));
|
||||
local void compress_block OF((deflate_state *s, const ct_data *ltree,
|
||||
const ct_data *dtree));
|
||||
local int detect_data_type OF((deflate_state *s));
|
||||
local unsigned bi_reverse OF((unsigned value, int length));
|
||||
local void bi_windup OF((deflate_state *s));
|
||||
@@ -972,7 +972,8 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
|
||||
} else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) {
|
||||
#endif
|
||||
send_bits(s, (STATIC_TREES<<1)+last, 3);
|
||||
compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree);
|
||||
compress_block(s, (const ct_data *)static_ltree,
|
||||
(const ct_data *)static_dtree);
|
||||
#ifdef DEBUG
|
||||
s->compressed_len += 3 + s->static_len;
|
||||
#endif
|
||||
@@ -980,7 +981,8 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
|
||||
send_bits(s, (DYN_TREES<<1)+last, 3);
|
||||
send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,
|
||||
max_blindex+1);
|
||||
compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree);
|
||||
compress_block(s, (const ct_data *)s->dyn_ltree,
|
||||
(const ct_data *)s->dyn_dtree);
|
||||
#ifdef DEBUG
|
||||
s->compressed_len += 3 + s->opt_len;
|
||||
#endif
|
||||
@@ -1057,8 +1059,8 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc)
|
||||
*/
|
||||
local void compress_block(s, ltree, dtree)
|
||||
deflate_state *s;
|
||||
ct_data *ltree; /* literal tree */
|
||||
ct_data *dtree; /* distance tree */
|
||||
const ct_data *ltree; /* literal tree */
|
||||
const ct_data *dtree; /* distance tree */
|
||||
{
|
||||
unsigned dist; /* distance of matched string */
|
||||
int lc; /* match length or unmatched char (if dist == 0) */
|
||||
|
||||
@@ -30,7 +30,7 @@ int ZEXPORT uncompress (dest, destLen, source, sourceLen)
|
||||
z_stream stream;
|
||||
int err;
|
||||
|
||||
stream.next_in = (Bytef*)source;
|
||||
stream.next_in = (z_const Bytef *)source;
|
||||
stream.avail_in = (uInt)sourceLen;
|
||||
/* Check for source > 64K on 16-bit machine: */
|
||||
if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
|
||||
|
||||
33
ZLib/zconf.h
33
ZLib/zconf.h
@@ -1,5 +1,5 @@
|
||||
/* zconf.h -- configuration of the zlib compression library
|
||||
* Copyright (C) 1995-2012 Jean-loup Gailly.
|
||||
* Copyright (C) 1995-2013 Jean-loup Gailly.
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
# define _dist_code z__dist_code
|
||||
# define _length_code z__length_code
|
||||
# define _tr_align z__tr_align
|
||||
# define _tr_flush_bits z__tr_flush_bits
|
||||
# define _tr_flush_block z__tr_flush_block
|
||||
# define _tr_init z__tr_init
|
||||
# define _tr_stored_block z__tr_stored_block
|
||||
@@ -77,6 +78,7 @@
|
||||
# define gzopen_w z_gzopen_w
|
||||
# endif
|
||||
# define gzprintf z_gzprintf
|
||||
# define gzvprintf z_gzvprintf
|
||||
# define gzputc z_gzputc
|
||||
# define gzputs z_gzputs
|
||||
# define gzread z_gzread
|
||||
@@ -103,6 +105,7 @@
|
||||
# define inflateReset z_inflateReset
|
||||
# define inflateReset2 z_inflateReset2
|
||||
# define inflateSetDictionary z_inflateSetDictionary
|
||||
# define inflateGetDictionary z_inflateGetDictionary
|
||||
# define inflateSync z_inflateSync
|
||||
# define inflateSyncPoint z_inflateSyncPoint
|
||||
# define inflateUndermine z_inflateUndermine
|
||||
@@ -388,20 +391,14 @@ typedef uLong FAR uLongf;
|
||||
typedef Byte *voidp;
|
||||
#endif
|
||||
|
||||
/* ./configure may #define Z_U4 here */
|
||||
|
||||
#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC)
|
||||
# include <limits.h>
|
||||
# if (UINT_MAX == 0xffffffffUL)
|
||||
# define Z_U4 unsigned
|
||||
# else
|
||||
# if (ULONG_MAX == 0xffffffffUL)
|
||||
# define Z_U4 unsigned long
|
||||
# else
|
||||
# if (USHRT_MAX == 0xffffffffUL)
|
||||
# define Z_U4 unsigned short
|
||||
# endif
|
||||
# endif
|
||||
# elif (ULONG_MAX == 0xffffffffUL)
|
||||
# define Z_U4 unsigned long
|
||||
# elif (USHRT_MAX == 0xffffffffUL)
|
||||
# define Z_U4 unsigned short
|
||||
# endif
|
||||
#endif
|
||||
|
||||
@@ -425,8 +422,16 @@ typedef uLong FAR uLongf;
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(STDC) || defined(Z_HAVE_STDARG_H)
|
||||
# ifndef Z_SOLO
|
||||
# include <stdarg.h> /* for va_list */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
# include <stddef.h> /* for wchar_t */
|
||||
# ifndef Z_SOLO
|
||||
# include <stddef.h> /* for wchar_t */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and
|
||||
@@ -435,7 +440,7 @@ typedef uLong FAR uLongf;
|
||||
* both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as
|
||||
* equivalently requesting no 64-bit operations
|
||||
*/
|
||||
#if defined(LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1
|
||||
#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1
|
||||
# undef _LARGEFILE64_SOURCE
|
||||
#endif
|
||||
|
||||
@@ -443,7 +448,7 @@ typedef uLong FAR uLongf;
|
||||
# define Z_HAVE_UNISTD_H
|
||||
#endif
|
||||
#ifndef Z_SOLO
|
||||
# if defined(Z_HAVE_UNISTD_H) || defined(LARGEFILE64_SOURCE)
|
||||
# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)
|
||||
# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */
|
||||
# ifdef VMS
|
||||
# include <unixio.h> /* for off_t */
|
||||
|
||||
48
ZLib/zlib.h
48
ZLib/zlib.h
@@ -1,7 +1,7 @@
|
||||
/* zlib.h -- interface of the 'zlib' general purpose compression library
|
||||
version 1.2.7, May 2nd, 2012
|
||||
version 1.2.8, April 28th, 2013
|
||||
|
||||
Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler
|
||||
Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
@@ -37,11 +37,11 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define ZLIB_VERSION "1.2.7"
|
||||
#define ZLIB_VERNUM 0x1270
|
||||
#define ZLIB_VERSION "1.2.8"
|
||||
#define ZLIB_VERNUM 0x1280
|
||||
#define ZLIB_VER_MAJOR 1
|
||||
#define ZLIB_VER_MINOR 2
|
||||
#define ZLIB_VER_REVISION 7
|
||||
#define ZLIB_VER_REVISION 8
|
||||
#define ZLIB_VER_SUBREVISION 0
|
||||
|
||||
/*
|
||||
@@ -839,6 +839,21 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
|
||||
inflate().
|
||||
*/
|
||||
|
||||
ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm,
|
||||
Bytef *dictionary,
|
||||
uInt *dictLength));
|
||||
/*
|
||||
Returns the sliding dictionary being maintained by inflate. dictLength is
|
||||
set to the number of bytes in the dictionary, and that many bytes are copied
|
||||
to dictionary. dictionary must have enough space, where 32768 bytes is
|
||||
always enough. If inflateGetDictionary() is called with dictionary equal to
|
||||
Z_NULL, then only the dictionary length is returned, and nothing is copied.
|
||||
Similary, if dictLength is Z_NULL, then it is not set.
|
||||
|
||||
inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the
|
||||
stream state is inconsistent.
|
||||
*/
|
||||
|
||||
ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
|
||||
/*
|
||||
Skips invalid compressed data until a possible full flush point (see above
|
||||
@@ -846,7 +861,7 @@ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
|
||||
available input is skipped. No output is provided.
|
||||
|
||||
inflateSync searches for a 00 00 FF FF pattern in the compressed data.
|
||||
All full flush points have this pattern, but not all occurences of this
|
||||
All full flush points have this pattern, but not all occurrences of this
|
||||
pattern are full flush points.
|
||||
|
||||
inflateSync returns Z_OK if a possible full flush point has been found,
|
||||
@@ -1007,7 +1022,8 @@ ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
|
||||
the version of the header file.
|
||||
*/
|
||||
|
||||
typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *));
|
||||
typedef unsigned (*in_func) OF((void FAR *,
|
||||
z_const unsigned char FAR * FAR *));
|
||||
typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
|
||||
|
||||
ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
|
||||
@@ -1015,11 +1031,12 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
|
||||
out_func out, void FAR *out_desc));
|
||||
/*
|
||||
inflateBack() does a raw inflate with a single call using a call-back
|
||||
interface for input and output. This is more efficient than inflate() for
|
||||
file i/o applications in that it avoids copying between the output and the
|
||||
sliding window by simply making the window itself the output buffer. This
|
||||
function trusts the application to not change the output buffer passed by
|
||||
the output function, at least until inflateBack() returns.
|
||||
interface for input and output. This is potentially more efficient than
|
||||
inflate() for file i/o applications, in that it avoids copying between the
|
||||
output and the sliding window by simply making the window itself the output
|
||||
buffer. inflate() can be faster on modern CPUs when used with large
|
||||
buffers. inflateBack() trusts the application to not change the output
|
||||
buffer passed by the output function, at least until inflateBack() returns.
|
||||
|
||||
inflateBackInit() must be called first to allocate the internal state
|
||||
and to initialize the state with the user-provided window buffer.
|
||||
@@ -1736,6 +1753,13 @@ ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp));
|
||||
ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path,
|
||||
const char *mode));
|
||||
#endif
|
||||
#if defined(STDC) || defined(Z_HAVE_STDARG_H)
|
||||
# ifndef Z_SOLO
|
||||
ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file,
|
||||
const char *format,
|
||||
va_list va));
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
struct internal_state {int dummy;}; /* for buggy compilers */
|
||||
#endif
|
||||
|
||||
const char * const z_errmsg[10] = {
|
||||
z_const char * const z_errmsg[10] = {
|
||||
"need dictionary", /* Z_NEED_DICT 2 */
|
||||
"stream end", /* Z_STREAM_END 1 */
|
||||
"", /* Z_OK 0 */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* zutil.h -- internal interface and configuration of the compression library
|
||||
* Copyright (C) 1995-2012 Jean-loup Gailly.
|
||||
* Copyright (C) 1995-2013 Jean-loup Gailly.
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
@@ -44,13 +44,13 @@ typedef unsigned short ush;
|
||||
typedef ush FAR ushf;
|
||||
typedef unsigned long ulg;
|
||||
|
||||
extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
|
||||
extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
|
||||
/* (size given to avoid silly warnings with Visual C++) */
|
||||
|
||||
#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
|
||||
|
||||
#define ERR_RETURN(strm,err) \
|
||||
return (strm->msg = (char*)ERR_MSG(err), (err))
|
||||
return (strm->msg = ERR_MSG(err), (err))
|
||||
/* To be used only when the state is known to be valid */
|
||||
|
||||
/* common constants */
|
||||
@@ -168,7 +168,8 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
|
||||
#endif
|
||||
|
||||
/* provide prototypes for these when building zlib without LFS */
|
||||
#if !defined(_WIN32) && (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
|
||||
#if !defined(_WIN32) && \
|
||||
(!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
|
||||
ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
|
||||
ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
|
||||
#endif
|
||||
|
||||
68
objective-zip.podspec
Normal file
68
objective-zip.podspec
Normal file
@@ -0,0 +1,68 @@
|
||||
Pod::Spec.new do |s|
|
||||
|
||||
# ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
|
||||
|
||||
s.name = "objective-zip"
|
||||
s.version = "1.0.5"
|
||||
s.summary = "An object-oriented friendly wrapper library for ZLib and MiniZip, in Objective-C for iOS and OS X"
|
||||
|
||||
s.description = <<-DESC
|
||||
Objective-Zip is a small Objective-C library that wraps ZLib and
|
||||
MiniZip in an object-oriented friendly way. It supports:
|
||||
|
||||
* Zipping and unzipping of common zip file formats.
|
||||
* Multi-GB zip files thanks to 64-bit APIs, even with limited memory available.
|
||||
* Per-file compression level and encryption.
|
||||
|
||||
Objective-Zip includes sources of latest versions of ZLib and MiniZip.
|
||||
DESC
|
||||
|
||||
s.homepage = "https://github.com/gianlucabertani/Objective-Zip"
|
||||
|
||||
|
||||
# ――― Spec License ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
|
||||
|
||||
s.license = { :type => "BSD 2.0", :file => "LICENSE.md" }
|
||||
|
||||
|
||||
# ――― Author Metadata ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
|
||||
|
||||
s.author = { "Gianluca Bertani" => "gianluca.bertani@email.it" }
|
||||
s.social_media_url = "https://twitter.com/self_vs_this"
|
||||
|
||||
|
||||
# ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
|
||||
|
||||
s.ios.deployment_target = "8.0"
|
||||
s.osx.deployment_target = "10.7"
|
||||
|
||||
|
||||
# ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
|
||||
|
||||
s.source = { :git => "https://github.com/gianlucabertani/Objective-Zip.git",
|
||||
:tag => s.version.to_s }
|
||||
|
||||
|
||||
# ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
|
||||
|
||||
s.source_files = "Objective-Zip/**/*.{h,m}", "MiniZip/**/*.{h,c}", "ZLib/**/*.{h,c}"
|
||||
|
||||
|
||||
# ――― Publich Headers ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
|
||||
|
||||
s.public_header_files = ["Objective-Zip/OZZipFile.h", "Objective-Zip/OZZipFile+Standard.h", "Objective-Zip/OZZipFile+NSError.h",
|
||||
"Objective-Zip/OZZipFileMode.h", "Objective-Zip/OZZipCompressionLevel.h", "Objective-Zip/OZZipException.h",
|
||||
"Objective-Zip/OZZipWriteStream.h", "Objective-Zip/OZZipWriteStream+Standard.h",
|
||||
"Objective-Zip/OZZipWriteStream+NSError.h", "Objective-Zip/OZZipReadStream.h",
|
||||
"Objective-Zip/OZZipReadStream+Standard.h", "Objective-Zip/OZZipReadStream+NSError.h",
|
||||
"Objective-Zip/OZFileInZipInfo.h", "Objective-Zip/Objective-Zip.h", "Objective-Zip/Objective-Zip+NSError.h",
|
||||
"Objective-Zip/NSDate+DOSDate.h", "Objective-Zip/NSData+CRC32.h"]
|
||||
|
||||
|
||||
# ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
|
||||
|
||||
s.requires_arc = true
|
||||
s.xcconfig = { "OTHER_LDFLAGS" => "-ObjC",
|
||||
"GCC_WARN_UNUSED_FUNCTION" => "NO" }
|
||||
|
||||
end
|
||||
Reference in New Issue
Block a user