From 21d3023a9b7b6aff68c1170e345951396b1c6cfd Mon Sep 17 00:00:00 2001 From: 单军华 Date: Tue, 31 Jul 2018 13:35:21 +0800 Subject: [PATCH] no message --- screendisplay/Pods/ASIHTTPRequest/Classes/ASIDataCompressor.m | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 219 insertions(+), 0 deletions(-) diff --git a/screendisplay/Pods/ASIHTTPRequest/Classes/ASIDataCompressor.m b/screendisplay/Pods/ASIHTTPRequest/Classes/ASIDataCompressor.m new file mode 100755 index 0000000..c9a5cd5 --- /dev/null +++ b/screendisplay/Pods/ASIHTTPRequest/Classes/ASIDataCompressor.m @@ -0,0 +1,219 @@ +// +// ASIDataCompressor.m +// Part of ASIHTTPRequest -> http://allseeing-i.com/ASIHTTPRequest +// +// Created by Ben Copsey on 17/08/2010. +// Copyright 2010 All-Seeing Interactive. All rights reserved. +// + +#import "ASIDataCompressor.h" +#import "ASIHTTPRequest.h" + +#define DATA_CHUNK_SIZE 262144 // Deal with gzipped data in 256KB chunks +#define COMPRESSION_AMOUNT Z_DEFAULT_COMPRESSION + +@interface ASIDataCompressor () ++ (NSError *)deflateErrorWithCode:(int)code; +@end + +@implementation ASIDataCompressor + ++ (id)compressor +{ + ASIDataCompressor *compressor = [[[self alloc] init] autorelease]; + [compressor setupStream]; + return compressor; +} + +- (void)dealloc +{ + if (streamReady) { + [self closeStream]; + } + [super dealloc]; +} + +- (NSError *)setupStream +{ + if (streamReady) { + return nil; + } + // Setup the inflate stream + zStream.zalloc = Z_NULL; + zStream.zfree = Z_NULL; + zStream.opaque = Z_NULL; + zStream.avail_in = 0; + zStream.next_in = 0; + int status = deflateInit2(&zStream, COMPRESSION_AMOUNT, Z_DEFLATED, (15+16), 8, Z_DEFAULT_STRATEGY); + if (status != Z_OK) { + return [[self class] deflateErrorWithCode:status]; + } + streamReady = YES; + return nil; +} + +- (NSError *)closeStream +{ + if (!streamReady) { + return nil; + } + // Close the deflate stream + streamReady = NO; + int status = deflateEnd(&zStream); + if (status != Z_OK) { + return [[self class] deflateErrorWithCode:status]; + } + return nil; +} + +- (NSData *)compressBytes:(Bytef *)bytes length:(NSUInteger)length error:(NSError **)err shouldFinish:(BOOL)shouldFinish +{ + if (length == 0) return nil; + + NSUInteger halfLength = length/2; + + // We'll take a guess that the compressed data will fit in half the size of the original (ie the max to compress at once is half DATA_CHUNK_SIZE), if not, we'll increase it below + NSMutableData *outputData = [NSMutableData dataWithLength:length/2]; + + int status; + + zStream.next_in = bytes; + zStream.avail_in = (unsigned int)length; + zStream.avail_out = 0; + + NSInteger bytesProcessedAlready = zStream.total_out; + while (zStream.avail_out == 0) { + + if (zStream.total_out-bytesProcessedAlready >= [outputData length]) { + [outputData increaseLengthBy:halfLength]; + } + + zStream.next_out = (Bytef*)[outputData mutableBytes] + zStream.total_out-bytesProcessedAlready; + zStream.avail_out = (unsigned int)([outputData length] - (zStream.total_out-bytesProcessedAlready)); + status = deflate(&zStream, shouldFinish ? Z_FINISH : Z_NO_FLUSH); + + if (status == Z_STREAM_END) { + break; + } else if (status != Z_OK) { + if (err) { + *err = [[self class] deflateErrorWithCode:status]; + } + return NO; + } + } + + // Set real length + [outputData setLength: zStream.total_out-bytesProcessedAlready]; + return outputData; +} + + ++ (NSData *)compressData:(NSData*)uncompressedData error:(NSError **)err +{ + NSError *theError = nil; + NSData *outputData = [[ASIDataCompressor compressor] compressBytes:(Bytef *)[uncompressedData bytes] length:[uncompressedData length] error:&theError shouldFinish:YES]; + if (theError) { + if (err) { + *err = theError; + } + return nil; + } + return outputData; +} + + + ++ (BOOL)compressDataFromFile:(NSString *)sourcePath toFile:(NSString *)destinationPath error:(NSError **)err +{ + NSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease]; + + // Create an empty file at the destination path + if (![fileManager createFileAtPath:destinationPath contents:[NSData data] attributes:nil]) { + if (err) { + *err = [NSError errorWithDomain:NetworkRequestErrorDomain code:ASICompressionError userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"Compression of %@ failed because we were to create a file at %@",sourcePath,destinationPath],NSLocalizedDescriptionKey,nil]]; + } + return NO; + } + + // Ensure the source file exists + if (![fileManager fileExistsAtPath:sourcePath]) { + if (err) { + *err = [NSError errorWithDomain:NetworkRequestErrorDomain code:ASICompressionError userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"Compression of %@ failed the file does not exist",sourcePath],NSLocalizedDescriptionKey,nil]]; + } + return NO; + } + + UInt8 inputData[DATA_CHUNK_SIZE]; + NSData *outputData; + NSInteger readLength; + NSError *theError = nil; + + ASIDataCompressor *compressor = [ASIDataCompressor compressor]; + + NSInputStream *inputStream = [NSInputStream inputStreamWithFileAtPath:sourcePath]; + [inputStream open]; + NSOutputStream *outputStream = [NSOutputStream outputStreamToFileAtPath:destinationPath append:NO]; + [outputStream open]; + + while ([compressor streamReady]) { + + // Read some data from the file + readLength = [inputStream read:inputData maxLength:DATA_CHUNK_SIZE]; + + // Make sure nothing went wrong + if ([inputStream streamStatus] == NSStreamStatusError) { + if (err) { + *err = [NSError errorWithDomain:NetworkRequestErrorDomain code:ASICompressionError userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"Compression of %@ failed because we were unable to read from the source data file",sourcePath],NSLocalizedDescriptionKey,[inputStream streamError],NSUnderlyingErrorKey,nil]]; + } + [compressor closeStream]; + return NO; + } + // Have we reached the end of the input data? + if (!readLength) { + break; + } + + // Attempt to deflate the chunk of data + outputData = [compressor compressBytes:inputData length:readLength error:&theError shouldFinish:readLength < DATA_CHUNK_SIZE ]; + if (theError) { + if (err) { + *err = theError; + } + [compressor closeStream]; + return NO; + } + + // Write the deflated data out to the destination file + [outputStream write:(const uint8_t *)[outputData bytes] maxLength:[outputData length]]; + + // Make sure nothing went wrong + if ([inputStream streamStatus] == NSStreamStatusError) { + if (err) { + *err = [NSError errorWithDomain:NetworkRequestErrorDomain code:ASICompressionError userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"Compression of %@ failed because we were unable to write to the destination data file at %@",sourcePath,destinationPath],NSLocalizedDescriptionKey,[outputStream streamError],NSUnderlyingErrorKey,nil]]; + } + [compressor closeStream]; + return NO; + } + + } + [inputStream close]; + [outputStream close]; + + NSError *error = [compressor closeStream]; + if (error) { + if (err) { + *err = error; + } + return NO; + } + + return YES; +} + ++ (NSError *)deflateErrorWithCode:(int)code +{ + return [NSError errorWithDomain:NetworkRequestErrorDomain code:ASICompressionError userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"Compression of data failed with code %d",code],NSLocalizedDescriptionKey,nil]]; +} + +@synthesize streamReady; +@end -- Gitblit v1.8.0