From 7b02207537d35bfa1714bf8beafc921f717d100a Mon Sep 17 00:00:00 2001 From: 单军华 Date: Wed, 11 Jul 2018 10:47:42 +0800 Subject: [PATCH] 首次上传 --- screendisplay/Pods/YYCategories/YYCategories/Foundation/NSData+YYAdd.m | 642 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 642 insertions(+), 0 deletions(-) diff --git a/screendisplay/Pods/YYCategories/YYCategories/Foundation/NSData+YYAdd.m b/screendisplay/Pods/YYCategories/YYCategories/Foundation/NSData+YYAdd.m new file mode 100755 index 0000000..26c7f0e --- /dev/null +++ b/screendisplay/Pods/YYCategories/YYCategories/Foundation/NSData+YYAdd.m @@ -0,0 +1,642 @@ +// +// NSData+YYAdd.m +// YYCategories <https://github.com/ibireme/YYCategories> +// +// Created by ibireme on 13/4/4. +// Copyright (c) 2015 ibireme. +// +// This source code is licensed under the MIT-style license found in the +// LICENSE file in the root directory of this source tree. +// + +#import "NSData+YYAdd.h" +#import "YYCategoriesMacro.h" +#include <CommonCrypto/CommonCrypto.h> +#include <zlib.h> + +YYSYNTH_DUMMY_CLASS(NSData_YYAdd) + + +@implementation NSData (YYAdd) + +- (NSString *)md2String { + unsigned char result[CC_MD2_DIGEST_LENGTH]; + CC_MD2(self.bytes, (CC_LONG)self.length, result); + return [NSString stringWithFormat: + @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + result[0], result[1], result[2], result[3], + result[4], result[5], result[6], result[7], + result[8], result[9], result[10], result[11], + result[12], result[13], result[14], result[15] + ]; +} + +- (NSData *)md2Data { + unsigned char result[CC_MD2_DIGEST_LENGTH]; + CC_MD2(self.bytes, (CC_LONG)self.length, result); + return [NSData dataWithBytes:result length:CC_MD2_DIGEST_LENGTH]; +} + +- (NSString *)md4String { + unsigned char result[CC_MD4_DIGEST_LENGTH]; + CC_MD4(self.bytes, (CC_LONG)self.length, result); + return [NSString stringWithFormat: + @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + result[0], result[1], result[2], result[3], + result[4], result[5], result[6], result[7], + result[8], result[9], result[10], result[11], + result[12], result[13], result[14], result[15] + ]; +} + +- (NSData *)md4Data { + unsigned char result[CC_MD4_DIGEST_LENGTH]; + CC_MD4(self.bytes, (CC_LONG)self.length, result); + return [NSData dataWithBytes:result length:CC_MD4_DIGEST_LENGTH]; +} + +- (NSString *)md5String { + unsigned char result[CC_MD5_DIGEST_LENGTH]; + CC_MD5(self.bytes, (CC_LONG)self.length, result); + return [NSString stringWithFormat: + @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + result[0], result[1], result[2], result[3], + result[4], result[5], result[6], result[7], + result[8], result[9], result[10], result[11], + result[12], result[13], result[14], result[15] + ]; +} + +- (NSData *)md5Data { + unsigned char result[CC_MD5_DIGEST_LENGTH]; + CC_MD5(self.bytes, (CC_LONG)self.length, result); + return [NSData dataWithBytes:result length:CC_MD5_DIGEST_LENGTH]; +} + +- (NSString *)sha1String { + unsigned char result[CC_SHA1_DIGEST_LENGTH]; + CC_SHA1(self.bytes, (CC_LONG)self.length, result); + NSMutableString *hash = [NSMutableString + stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2]; + for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) { + [hash appendFormat:@"%02x", result[i]]; + } + return hash; +} + +- (NSData *)sha1Data { + unsigned char result[CC_SHA1_DIGEST_LENGTH]; + CC_SHA1(self.bytes, (CC_LONG)self.length, result); + return [NSData dataWithBytes:result length:CC_SHA1_DIGEST_LENGTH]; +} + +- (NSString *)sha224String { + unsigned char result[CC_SHA224_DIGEST_LENGTH]; + CC_SHA224(self.bytes, (CC_LONG)self.length, result); + NSMutableString *hash = [NSMutableString + stringWithCapacity:CC_SHA224_DIGEST_LENGTH * 2]; + for (int i = 0; i < CC_SHA224_DIGEST_LENGTH; i++) { + [hash appendFormat:@"%02x", result[i]]; + } + return hash; +} + +- (NSData *)sha224Data { + unsigned char result[CC_SHA224_DIGEST_LENGTH]; + CC_SHA224(self.bytes, (CC_LONG)self.length, result); + return [NSData dataWithBytes:result length:CC_SHA224_DIGEST_LENGTH]; +} + +- (NSString *)sha256String { + unsigned char result[CC_SHA256_DIGEST_LENGTH]; + CC_SHA256(self.bytes, (CC_LONG)self.length, result); + NSMutableString *hash = [NSMutableString + stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2]; + for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) { + [hash appendFormat:@"%02x", result[i]]; + } + return hash; +} + +- (NSData *)sha256Data { + unsigned char result[CC_SHA256_DIGEST_LENGTH]; + CC_SHA256(self.bytes, (CC_LONG)self.length, result); + return [NSData dataWithBytes:result length:CC_SHA256_DIGEST_LENGTH]; +} + +- (NSString *)sha384String { + unsigned char result[CC_SHA384_DIGEST_LENGTH]; + CC_SHA384(self.bytes, (CC_LONG)self.length, result); + NSMutableString *hash = [NSMutableString + stringWithCapacity:CC_SHA384_DIGEST_LENGTH * 2]; + for (int i = 0; i < CC_SHA384_DIGEST_LENGTH; i++) { + [hash appendFormat:@"%02x", result[i]]; + } + return hash; +} + +- (NSData *)sha384Data { + unsigned char result[CC_SHA384_DIGEST_LENGTH]; + CC_SHA384(self.bytes, (CC_LONG)self.length, result); + return [NSData dataWithBytes:result length:CC_SHA384_DIGEST_LENGTH]; +} + +- (NSString *)sha512String { + unsigned char result[CC_SHA512_DIGEST_LENGTH]; + CC_SHA512(self.bytes, (CC_LONG)self.length, result); + NSMutableString *hash = [NSMutableString + stringWithCapacity:CC_SHA512_DIGEST_LENGTH * 2]; + for (int i = 0; i < CC_SHA512_DIGEST_LENGTH; i++) { + [hash appendFormat:@"%02x", result[i]]; + } + return hash; +} + +- (NSData *)sha512Data { + unsigned char result[CC_SHA512_DIGEST_LENGTH]; + CC_SHA512(self.bytes, (CC_LONG)self.length, result); + return [NSData dataWithBytes:result length:CC_SHA512_DIGEST_LENGTH]; +} + +- (NSString *)hmacStringUsingAlg:(CCHmacAlgorithm)alg withKey:(NSString *)key { + size_t size; + switch (alg) { + case kCCHmacAlgMD5: size = CC_MD5_DIGEST_LENGTH; break; + case kCCHmacAlgSHA1: size = CC_SHA1_DIGEST_LENGTH; break; + case kCCHmacAlgSHA224: size = CC_SHA224_DIGEST_LENGTH; break; + case kCCHmacAlgSHA256: size = CC_SHA256_DIGEST_LENGTH; break; + case kCCHmacAlgSHA384: size = CC_SHA384_DIGEST_LENGTH; break; + case kCCHmacAlgSHA512: size = CC_SHA512_DIGEST_LENGTH; break; + default: return nil; + } + unsigned char result[size]; + const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; + CCHmac(alg, cKey, strlen(cKey), self.bytes, self.length, result); + NSMutableString *hash = [NSMutableString stringWithCapacity:size * 2]; + for (int i = 0; i < size; i++) { + [hash appendFormat:@"%02x", result[i]]; + } + return hash; +} + +- (NSData *)hmacDataUsingAlg:(CCHmacAlgorithm)alg withKey:(NSData *)key { + size_t size; + switch (alg) { + case kCCHmacAlgMD5: size = CC_MD5_DIGEST_LENGTH; break; + case kCCHmacAlgSHA1: size = CC_SHA1_DIGEST_LENGTH; break; + case kCCHmacAlgSHA224: size = CC_SHA224_DIGEST_LENGTH; break; + case kCCHmacAlgSHA256: size = CC_SHA256_DIGEST_LENGTH; break; + case kCCHmacAlgSHA384: size = CC_SHA384_DIGEST_LENGTH; break; + case kCCHmacAlgSHA512: size = CC_SHA512_DIGEST_LENGTH; break; + default: return nil; + } + unsigned char result[size]; + CCHmac(alg, [key bytes], key.length, self.bytes, self.length, result); + return [NSData dataWithBytes:result length:size]; +} + +- (NSString *)hmacMD5StringWithKey:(NSString *)key { + return [self hmacStringUsingAlg:kCCHmacAlgMD5 withKey:key]; +} + +- (NSData *)hmacMD5DataWithKey:(NSData *)key { + return [self hmacDataUsingAlg:kCCHmacAlgMD5 withKey:key]; +} + +- (NSString *)hmacSHA1StringWithKey:(NSString *)key { + return [self hmacStringUsingAlg:kCCHmacAlgSHA1 withKey:key]; +} + +- (NSData *)hmacSHA1DataWithKey:(NSData *)key { + return [self hmacDataUsingAlg:kCCHmacAlgSHA1 withKey:key]; +} + +- (NSString *)hmacSHA224StringWithKey:(NSString *)key { + return [self hmacStringUsingAlg:kCCHmacAlgSHA224 withKey:key]; +} + +- (NSData *)hmacSHA224DataWithKey:(NSData *)key { + return [self hmacDataUsingAlg:kCCHmacAlgSHA224 withKey:key]; +} + +- (NSString *)hmacSHA256StringWithKey:(NSString *)key { + return [self hmacStringUsingAlg:kCCHmacAlgSHA256 withKey:key]; +} + +- (NSData *)hmacSHA256DataWithKey:(NSData *)key { + return [self hmacDataUsingAlg:kCCHmacAlgSHA256 withKey:key]; +} + +- (NSString *)hmacSHA384StringWithKey:(NSString *)key { + return [self hmacStringUsingAlg:kCCHmacAlgSHA384 withKey:key]; +} + +- (NSData *)hmacSHA384DataWithKey:(NSData *)key { + return [self hmacDataUsingAlg:kCCHmacAlgSHA384 withKey:key]; +} + +- (NSString *)hmacSHA512StringWithKey:(NSString *)key { + return [self hmacStringUsingAlg:kCCHmacAlgSHA512 withKey:key]; +} + +- (NSData *)hmacSHA512DataWithKey:(NSData *)key { + return [self hmacDataUsingAlg:kCCHmacAlgSHA512 withKey:key]; +} + +- (NSString *)crc32String { + uLong result = crc32(0, self.bytes, (uInt)self.length); + return [NSString stringWithFormat:@"%08x", (uint32_t)result]; +} + +- (uint32_t)crc32 { + uLong result = crc32(0, self.bytes, (uInt)self.length); + return (uint32_t)result; +} + +- (NSData *)aes256EncryptWithKey:(NSData *)key iv:(NSData *)iv { + if (key.length != 16 && key.length != 24 && key.length != 32) { + return nil; + } + if (iv.length != 16 && iv.length != 0) { + return nil; + } + + NSData *result = nil; + size_t bufferSize = self.length + kCCBlockSizeAES128; + void *buffer = malloc(bufferSize); + if (!buffer) return nil; + size_t encryptedSize = 0; + CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, + kCCAlgorithmAES128, + kCCOptionPKCS7Padding, + key.bytes, + key.length, + iv.bytes, + self.bytes, + self.length, + buffer, + bufferSize, + &encryptedSize); + if (cryptStatus == kCCSuccess) { + result = [[NSData alloc]initWithBytes:buffer length:encryptedSize]; + free(buffer); + return result; + } else { + free(buffer); + return nil; + } +} + +- (NSData *)aes256DecryptWithkey:(NSData *)key iv:(NSData *)iv { + if (key.length != 16 && key.length != 24 && key.length != 32) { + return nil; + } + if (iv.length != 16 && iv.length != 0) { + return nil; + } + + NSData *result = nil; + size_t bufferSize = self.length + kCCBlockSizeAES128; + void *buffer = malloc(bufferSize); + if (!buffer) return nil; + size_t encryptedSize = 0; + CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, + kCCAlgorithmAES128, + kCCOptionPKCS7Padding, + key.bytes, + key.length, + iv.bytes, + self.bytes, + self.length, + buffer, + bufferSize, + &encryptedSize); + if (cryptStatus == kCCSuccess) { + result = [[NSData alloc]initWithBytes:buffer length:encryptedSize]; + free(buffer); + return result; + } else { + free(buffer); + return nil; + } +} + +- (NSString *)utf8String { + if (self.length > 0) { + return [[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding]; + } + return @""; +} + +- (NSString *)hexString { + NSUInteger length = self.length; + NSMutableString *result = [NSMutableString stringWithCapacity:length * 2]; + const unsigned char *byte = self.bytes; + for (int i = 0; i < length; i++, byte++) { + [result appendFormat:@"%02X", *byte]; + } + return result; +} + ++ (NSData *)dataWithHexString:(NSString *)hexStr { + hexStr = [hexStr stringByReplacingOccurrencesOfString:@" " withString:@""]; + hexStr = [hexStr lowercaseString]; + NSUInteger len = hexStr.length; + if (!len) return nil; + unichar *buf = malloc(sizeof(unichar) * len); + if (!buf) return nil; + [hexStr getCharacters:buf range:NSMakeRange(0, len)]; + + NSMutableData *result = [NSMutableData data]; + unsigned char bytes; + char str[3] = { '\0', '\0', '\0' }; + int i; + for (i = 0; i < len / 2; i++) { + str[0] = buf[i * 2]; + str[1] = buf[i * 2 + 1]; + bytes = strtol(str, NULL, 16); + [result appendBytes:&bytes length:1]; + } + free(buf); + return result; +} + +static const char base64EncodingTable[64] += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +static const short base64DecodingTable[256] = { + -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -2, -1, -1, -2, -2, + -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, + -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, -2, -2, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, -2, -2, -2, + -2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, -2, + -2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2, + -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, + -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, + -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, + -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, + -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, + -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, + -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, + -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2 +}; + +- (NSString *)base64EncodedString { + NSUInteger length = self.length; + if (length == 0) + return @""; + + NSUInteger out_length = ((length + 2) / 3) * 4; + uint8_t *output = malloc(((out_length + 2) / 3) * 4); + if (output == NULL) + return nil; + + const char *input = self.bytes; + NSInteger i, value; + for (i = 0; i < length; i += 3) { + value = 0; + for (NSInteger j = i; j < i + 3; j++) { + value <<= 8; + if (j < length) { + value |= (0xFF & input[j]); + } + } + NSInteger index = (i / 3) * 4; + output[index + 0] = base64EncodingTable[(value >> 18) & 0x3F]; + output[index + 1] = base64EncodingTable[(value >> 12) & 0x3F]; + output[index + 2] = ((i + 1) < length) + ? base64EncodingTable[(value >> 6) & 0x3F] + : '='; + output[index + 3] = ((i + 2) < length) + ? base64EncodingTable[(value >> 0) & 0x3F] + : '='; + } + + NSString *base64 = [[NSString alloc] initWithBytes:output + length:out_length + encoding:NSASCIIStringEncoding]; + free(output); + return base64; +} + ++ (NSData *)dataWithBase64EncodedString:(NSString *)base64EncodedString { + NSInteger length = base64EncodedString.length; + const char *string = [base64EncodedString cStringUsingEncoding:NSASCIIStringEncoding]; + if (string == NULL) + return nil; + + while (length > 0 && string[length - 1] == '=') + length--; + + NSInteger outputLength = length * 3 / 4; + NSMutableData *data = [NSMutableData dataWithLength:outputLength]; + if (data == nil) + return nil; + if (length == 0) + return data; + + uint8_t *output = data.mutableBytes; + NSInteger inputPoint = 0; + NSInteger outputPoint = 0; + while (inputPoint < length) { + char i0 = string[inputPoint++]; + char i1 = string[inputPoint++]; + char i2 = inputPoint < length ? string[inputPoint++] : 'A'; + char i3 = inputPoint < length ? string[inputPoint++] : 'A'; + + output[outputPoint++] = (base64DecodingTable[i0] << 2) + | (base64DecodingTable[i1] >> 4); + if (outputPoint < outputLength) { + output[outputPoint++] = ((base64DecodingTable[i1] & 0xf) << 4) + | (base64DecodingTable[i2] >> 2); + } + if (outputPoint < outputLength) { + output[outputPoint++] = ((base64DecodingTable[i2] & 0x3) << 6) + | base64DecodingTable[i3]; + } + } + + return data; +} + +- (id)jsonValueDecoded { + NSError *error = nil; + id value = [NSJSONSerialization JSONObjectWithData:self options:kNilOptions error:&error]; + if (error) { + NSLog(@"jsonValueDecoded error:%@", error); + } + return value; +} + +- (NSData *)gzipInflate { + if ([self length] == 0) return self; + + unsigned full_length = (unsigned)[self length]; + unsigned half_length = (unsigned)[self length] / 2; + + NSMutableData *decompressed = [NSMutableData + dataWithLength:full_length + half_length]; + BOOL done = NO; + int status; + + z_stream strm; + strm.next_in = (Bytef *)[self bytes]; + strm.avail_in = (unsigned)[self length]; + strm.total_out = 0; + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + + if (inflateInit2(&strm, (15 + 32)) != Z_OK) return nil; + while (!done) { + // Make sure we have enough room and reset the lengths. + if (strm.total_out >= [decompressed length]) + [decompressed increaseLengthBy:half_length]; + strm.next_out = [decompressed mutableBytes] + strm.total_out; + strm.avail_out = (uInt)([decompressed length] - strm.total_out); + + // Inflate another chunk. + status = inflate(&strm, Z_SYNC_FLUSH); + if (status == Z_STREAM_END) done = YES; + else if (status != Z_OK) break; + } + if (inflateEnd(&strm) != Z_OK) return nil; + + // Set real length. + if (done) { + [decompressed setLength:strm.total_out]; + return [NSData dataWithData:decompressed]; + } else return nil; +} + +- (NSData *)gzipDeflate { + if ([self length] == 0) return self; + + z_stream strm; + + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.total_out = 0; + strm.next_in = (Bytef *)[self bytes]; + strm.avail_in = (uInt)[self length]; + + // Compresssion Levels: + // Z_NO_COMPRESSION + // Z_BEST_SPEED + // Z_BEST_COMPRESSION + // Z_DEFAULT_COMPRESSION + + if (deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, (15 + 16), + 8, Z_DEFAULT_STRATEGY) != Z_OK) + return nil; + + // 16K chunks for expansion + NSMutableData *compressed = [NSMutableData dataWithLength:16384]; + + do { + if (strm.total_out >= [compressed length]) + [compressed increaseLengthBy:16384]; + + strm.next_out = [compressed mutableBytes] + strm.total_out; + strm.avail_out = (uInt)([compressed length] - strm.total_out); + + deflate(&strm, Z_FINISH); + } + while (strm.avail_out == 0); + + deflateEnd(&strm); + + [compressed setLength:strm.total_out]; + return [NSData dataWithData:compressed]; +} + +- (NSData *)zlibInflate { + if ([self length] == 0) return self; + + NSUInteger full_length = [self length]; + NSUInteger half_length = [self length] / 2; + + NSMutableData *decompressed = [NSMutableData + dataWithLength:full_length + half_length]; + BOOL done = NO; + int status; + + z_stream strm; + strm.next_in = (Bytef *)[self bytes]; + strm.avail_in = (uInt)full_length; + strm.total_out = 0; + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + + if (inflateInit(&strm) != Z_OK) return nil; + + while (!done) { + // Make sure we have enough room and reset the lengths. + if (strm.total_out >= [decompressed length]) + [decompressed increaseLengthBy:half_length]; + strm.next_out = [decompressed mutableBytes] + strm.total_out; + strm.avail_out = (uInt)([decompressed length] - strm.total_out); + + // Inflate another chunk. + status = inflate(&strm, Z_SYNC_FLUSH); + if (status == Z_STREAM_END) done = YES; + else if (status != Z_OK) break; + } + if (inflateEnd(&strm) != Z_OK) return nil; + + // Set real length. + if (done) { + [decompressed setLength:strm.total_out]; + return [NSData dataWithData:decompressed]; + } else return nil; +} + +- (NSData *)zlibDeflate { + if ([self length] == 0) return self; + + z_stream strm; + + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.total_out = 0; + strm.next_in = (Bytef *)[self bytes]; + strm.avail_in = (uInt)[self length]; + + // Compresssion Levels: + // Z_NO_COMPRESSION + // Z_BEST_SPEED + // Z_BEST_COMPRESSION + // Z_DEFAULT_COMPRESSION + + if (deflateInit(&strm, Z_DEFAULT_COMPRESSION) != Z_OK) return nil; + + // 16K chuncks for expansion + NSMutableData *compressed = [NSMutableData dataWithLength:16384]; + + do { + if (strm.total_out >= [compressed length]) + [compressed increaseLengthBy:16384]; + + strm.next_out = [compressed mutableBytes] + strm.total_out; + strm.avail_out = (uInt)([compressed length] - strm.total_out); + + deflate(&strm, Z_FINISH); + } + while (strm.avail_out == 0); + + deflateEnd(&strm); + + [compressed setLength:strm.total_out]; + return [NSData dataWithData:compressed]; +} + ++ (NSData *)dataNamed:(NSString *)name { + NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@""]; + if (!path) return nil; + NSData *data = [NSData dataWithContentsOfFile:path]; + return data; +} + +@end -- Gitblit v1.8.0