diff options
-rw-r--r-- | Source/SPCategoryAdditions.h | 1 | ||||
-rw-r--r-- | Source/SPDataAdditions.h | 1 | ||||
-rw-r--r-- | Source/SPDataAdditions.m | 73 | ||||
-rw-r--r-- | Source/SPDataBase64EncodingAdditions.h | 31 | ||||
-rw-r--r-- | Source/SPDataBase64EncodingAdditions.m | 117 | ||||
-rw-r--r-- | Source/SPTableContent.m | 4 | ||||
-rw-r--r-- | sequel-pro.xcodeproj/project.pbxproj | 6 |
7 files changed, 157 insertions, 76 deletions
diff --git a/Source/SPCategoryAdditions.h b/Source/SPCategoryAdditions.h index 2ca3a50e..90c29d95 100644 --- a/Source/SPCategoryAdditions.h +++ b/Source/SPCategoryAdditions.h @@ -36,6 +36,7 @@ #import "SPTextViewAdditions.h" #import "SPWindowAdditions.h" #import "SPDataAdditions.h" +#import "SPDataBase64EncodingAdditions.h" #import "SPMenuAdditions.h" #import "SPNotLoaded.h" #import "SPMainThreadTrampoline.h" diff --git a/Source/SPDataAdditions.h b/Source/SPDataAdditions.h index 4deb3f48..956e5b64 100644 --- a/Source/SPDataAdditions.h +++ b/Source/SPDataAdditions.h @@ -24,7 +24,6 @@ @interface NSData (SPDataAdditions) -- (NSString *)base64EncodingWithLineLength:(NSUInteger)lineLength; - (NSString *)dataToFormattedHexString; - (NSString *)shortStringRepresentationUsingEncoding:(NSStringEncoding)encoding; - (NSData *)dataEncryptedWithPassword:(NSString *)password; diff --git a/Source/SPDataAdditions.m b/Source/SPDataAdditions.m index 805692c6..0329395c 100644 --- a/Source/SPDataAdditions.m +++ b/Source/SPDataAdditions.m @@ -33,81 +33,8 @@ #include <openssl/aes.h> #include <openssl/sha.h> -static char base64encodingTable[64] = { -'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P', -'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f', -'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v', -'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/' }; - @implementation NSData (SPDataAdditions) -/* - * Derived from http://colloquy.info/project/browser/trunk/NSDataAdditions.m?rev=1576 - * Created by khammond on Mon Oct 29 2001. - * Formatted by Timothy Hatcher on Sun Jul 4 2004. - * Copyright (c) 2001 Kyle Hammond. All rights reserved. - * Original development by Dave Winer. - * - * Convert self to a base64 encoded NSString - */ -- (NSString *) base64EncodingWithLineLength:(NSUInteger)lineLength { - - const unsigned char *bytes = [self bytes]; - NSUInteger ixtext = 0; - NSUInteger lentext = [self length]; - NSInteger ctremaining = 0; - unsigned char inbuf[3], outbuf[4]; - NSUInteger i = 0; - NSUInteger charsonline = 0, ctcopy = 0; - NSUInteger ix = 0; - - NSMutableString *base64 = [NSMutableString stringWithCapacity:lentext]; - - while(1) { - ctremaining = lentext - ixtext; - if( ctremaining <= 0 ) break; - - for( i = 0; i < 3; i++ ) { - ix = ixtext + i; - if( ix < lentext ) inbuf[i] = bytes[ix]; - else inbuf [i] = 0; - } - - outbuf [0] = (inbuf [0] & 0xFC) >> 2; - outbuf [1] = ((inbuf [0] & 0x03) << 4) | ((inbuf [1] & 0xF0) >> 4); - outbuf [2] = ((inbuf [1] & 0x0F) << 2) | ((inbuf [2] & 0xC0) >> 6); - outbuf [3] = inbuf [2] & 0x3F; - ctcopy = 4; - - switch( ctremaining ) { - case 1: - ctcopy = 2; - break; - case 2: - ctcopy = 3; - break; - } - - for( i = 0; i < ctcopy; i++ ) - [base64 appendFormat:@"%c", base64encodingTable[outbuf[i]]]; - - for( i = ctcopy; i < 4; i++ ) - [base64 appendFormat:@"%c",'=']; - - ixtext += 3; - charsonline += 4; - - if( lineLength > 0 ) { - if (charsonline >= lineLength) { - charsonline = 0; - [base64 appendString:@"\n"]; - } - } - } - - return base64; -} - - (NSData *)dataEncryptedWithPassword:(NSString *)password { // Create a random 128-bit initialization vector diff --git a/Source/SPDataBase64EncodingAdditions.h b/Source/SPDataBase64EncodingAdditions.h new file mode 100644 index 00000000..63812025 --- /dev/null +++ b/Source/SPDataBase64EncodingAdditions.h @@ -0,0 +1,31 @@ +// +// $Id$ +// +// SPDataBase64EncodingAdditions.m +// sequel-pro +// +// Created by Rowan Beentje on March 18th, 2012 +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// More info at <http://code.google.com/p/sequel-pro/> + + +@interface NSData (SPDataBase64EncodingAdditions) + +- (NSString *)base64Encoding; +- (NSString *)base64EncodingWithLineLength:(NSUInteger)lineLength; + +@end diff --git a/Source/SPDataBase64EncodingAdditions.m b/Source/SPDataBase64EncodingAdditions.m new file mode 100644 index 00000000..9ca32b14 --- /dev/null +++ b/Source/SPDataBase64EncodingAdditions.m @@ -0,0 +1,117 @@ +// +// $Id$ +// +// SPDataBase64EncodingAdditions.m +// sequel-pro +// +// Created by Rowan Beentje on March 18th, 2012 +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// More info at <http://code.google.com/p/sequel-pro/> + + +#import "SPDataBase64EncodingAdditions.h" + +static const char _base64EncodingTable[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +@implementation NSData (SPDataBase64EncodingAdditions) + +/** + * Returns a base64-encoded representation of the NSData as an NSString, + * on a single line. + */ +- (NSString *)base64Encoding +{ + return [self base64EncodingWithLineLength:NSNotFound]; +} + +/** + * Returns a base64-encoded representation of the NSData as an NSString. + * Takes an argument for the maximum output line length; supply 0 or NSNotFound + * to have the results on a single line. + * + * Derived from the MIT-licensed Quasidea Development QSUtilities implementation, + * available in its original form at https://github.com/mikeho/QSUtilities ; + * QSUtilities implementation author Mike Ho, Copyright (c) 2010 - 2011 + * Quasidea Development, LLC . + * + * That implementation is itself an implementation ported from the PHP core; + * the PHP implementation is covered by the PHP license, a BSD-alike which + * is available at http://www.php.net/license/3_01.txt . + * PHP implementation author Jim Winstead <jimw@php.net>, Copyright (c) 1997-2012 + * The PHP Group. + */ +- (NSString *)base64EncodingWithLineLength:(NSUInteger)lineLength +{ + const unsigned char *objRawData = [self bytes]; + char *objPointer; + char *strResult; + + // Line length details - record bool and tweak to account for 3-octet processing + BOOL hasMaxLineLength = (lineLength && lineLength != NSNotFound); + NSUInteger maxLineLengthChunks = hasMaxLineLength ? floorf(lineLength / 4) : 1; + if (!maxLineLengthChunks) maxLineLengthChunks++; + + // Get the Raw Data length and ensure we actually have data + size_t intLength = [self length]; + if (intLength == 0) return nil; + + // Setup the String-based result placeholder and pointer within that placeholder + size_t encodedLength = ceilf((intLength + 2) / 3) * 4; + if (hasMaxLineLength) encodedLength += ceilf(encodedLength / (maxLineLengthChunks * 4)) - 1; + strResult = (char *)calloc(encodedLength, sizeof(char)); + objPointer = strResult; + + // Iterate through everything + NSUInteger octetsOnLine = 0; + while (intLength > 2) { // keep going until we have less than 24 bits + *objPointer++ = _base64EncodingTable[objRawData[0] >> 2]; + *objPointer++ = _base64EncodingTable[((objRawData[0] & 0x03) << 4) + (objRawData[1] >> 4)]; + *objPointer++ = _base64EncodingTable[((objRawData[1] & 0x0f) << 2) + (objRawData[2] >> 6)]; + *objPointer++ = _base64EncodingTable[objRawData[2] & 0x3f]; + + // we just handled 3 octets (24 bits) of data + objRawData += 3; + intLength -= 3; + + if (hasMaxLineLength) { + octetsOnLine++; + if (octetsOnLine >= maxLineLengthChunks) { + *objPointer++ = '\n'; + octetsOnLine = 0; + } + } + } + + // now deal with the tail end of things + if (intLength != 0) { + *objPointer++ = _base64EncodingTable[objRawData[0] >> 2]; + if (intLength > 1) { + *objPointer++ = _base64EncodingTable[((objRawData[0] & 0x03) << 4) + (objRawData[1] >> 4)]; + *objPointer++ = _base64EncodingTable[(objRawData[1] & 0x0f) << 2]; + *objPointer++ = '='; + } else { + *objPointer++ = _base64EncodingTable[(objRawData[0] & 0x03) << 4]; + *objPointer++ = '='; + *objPointer++ = '='; + } + } + + NSString *strToReturn = [[NSString alloc] initWithBytesNoCopy:strResult length:objPointer - strResult encoding:NSASCIIStringEncoding freeWhenDone:YES]; + return [strToReturn autorelease]; +} + +@end diff --git a/Source/SPTableContent.m b/Source/SPTableContent.m index 11e19588..7afbfe84 100644 --- a/Source/SPTableContent.m +++ b/Source/SPTableContent.m @@ -2273,7 +2273,7 @@ @"<BR><IMG %@='%ld' SRC=\"data:image/auto;base64,%@\">", maxSizeValue, (long)imageWidth, - [[image TIFFRepresentationUsingCompression:NSTIFFCompressionJPEG factor:0.01f] base64EncodingWithLineLength:0]]; + [[image TIFFRepresentationUsingCompression:NSTIFFCompressionJPEG factor:0.01f] base64Encoding]]; } [v release]; @@ -2289,7 +2289,7 @@ [tempRow addObject:[NSString stringWithFormat: @"<IMG WIDTH='%ld' SRC=\"data:image/auto;base64,%@\">", (long)imageWidth, - [[image TIFFRepresentationUsingCompression:NSTIFFCompressionJPEG factor:0.01f] base64EncodingWithLineLength:0]]]; + [[image TIFFRepresentationUsingCompression:NSTIFFCompressionJPEG factor:0.01f] base64Encoding]]]; } else { [tempRow addObject:@"<BLOB>"]; diff --git a/sequel-pro.xcodeproj/project.pbxproj b/sequel-pro.xcodeproj/project.pbxproj index 908bdbe4..b50b810a 100644 --- a/sequel-pro.xcodeproj/project.pbxproj +++ b/sequel-pro.xcodeproj/project.pbxproj @@ -66,6 +66,7 @@ 1741368B1516290D00DF1EE6 /* SPConnectionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 174136881516290D00DF1EE6 /* SPConnectionHandler.m */; }; 174136931516294000DF1EE6 /* SPFavoritesExporter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1741368E1516294000DF1EE6 /* SPFavoritesExporter.m */; }; 174136941516294000DF1EE6 /* SPFavoritesImporter.m in Sources */ = {isa = PBXBuildFile; fileRef = 174136911516294000DF1EE6 /* SPFavoritesImporter.m */; }; + 174137641516793B00DF1EE6 /* SPDataBase64EncodingAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 174137631516793B00DF1EE6 /* SPDataBase64EncodingAdditions.m */; }; 174CE11E10AB80B5008F892B /* DatabaseProcessList.xib in Resources */ = {isa = PBXBuildFile; fileRef = 174CE11C10AB80B5008F892B /* DatabaseProcessList.xib */; }; 174CE14210AB9281008F892B /* SPProcessListController.m in Sources */ = {isa = PBXBuildFile; fileRef = 174CE14110AB9281008F892B /* SPProcessListController.m */; }; 175EC63512733B36009A7C0F /* SPExportControllerDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 175EC63412733B36009A7C0F /* SPExportControllerDelegate.m */; }; @@ -679,6 +680,8 @@ 174136901516294000DF1EE6 /* SPFavoritesImporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPFavoritesImporter.h; sourceTree = "<group>"; }; 174136911516294000DF1EE6 /* SPFavoritesImporter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPFavoritesImporter.m; sourceTree = "<group>"; }; 174136921516294000DF1EE6 /* SPFavoritesImportProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPFavoritesImportProtocol.h; sourceTree = "<group>"; }; + 174137621516793B00DF1EE6 /* SPDataBase64EncodingAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPDataBase64EncodingAdditions.h; sourceTree = "<group>"; }; + 174137631516793B00DF1EE6 /* SPDataBase64EncodingAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPDataBase64EncodingAdditions.m; sourceTree = "<group>"; }; 174A345112DA4ED000DB0ADE /* create-test-stubs.pl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.perl; path = "create-test-stubs.pl"; sourceTree = "<group>"; }; 174CE11D10AB80B5008F892B /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Interfaces/English.lproj/DatabaseProcessList.xib; sourceTree = "<group>"; }; 174CE14010AB9281008F892B /* SPProcessListController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPProcessListController.h; sourceTree = "<group>"; }; @@ -2573,6 +2576,8 @@ BC32F241121D66260067305E /* SPFileManagerAdditions.m */, 1741367D151628A400DF1EE6 /* SPMutableArrayAdditions.h */, 1741367E151628A400DF1EE6 /* SPMutableArrayAdditions.m */, + 174137621516793B00DF1EE6 /* SPDataBase64EncodingAdditions.h */, + 174137631516793B00DF1EE6 /* SPDataBase64EncodingAdditions.m */, ); name = "Category Additions"; sourceTree = "<group>"; @@ -3273,6 +3278,7 @@ 1741368B1516290D00DF1EE6 /* SPConnectionHandler.m in Sources */, 174136931516294000DF1EE6 /* SPFavoritesExporter.m in Sources */, 174136941516294000DF1EE6 /* SPFavoritesImporter.m in Sources */, + 174137641516793B00DF1EE6 /* SPDataBase64EncodingAdditions.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; |