From ca7cce67d986c3a7e3d5b4d8503d33872e461b68 Mon Sep 17 00:00:00 2001 From: Bibiko Date: Tue, 25 Aug 2009 11:23:24 +0000 Subject: =?UTF-8?q?=E2=80=A2=20re-factored=20the=20SPF=20file=20structure?= =?UTF-8?q?=20-=20now=20it's=20an=20open=20format=20XML=20plist=20file=20w?= =?UTF-8?q?ith=20either=20encrypted=20=20key=20or=20plain=20text=20=20dict=20-=20(if=20option=20"Save=20Passords")=20the=20pa?= =?UTF-8?q?sswords=20will=20be=20readable=20if=20no=20encryption!=20-=20qu?= =?UTF-8?q?eries=20can=20be=20saved=20as=20plain=20text;=20whereby=20SP=20?= =?UTF-8?q?will=20compress=20the=20text=20chunk=20=20if=20length=20>=2050k?= =?UTF-8?q?=20automatically?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit NOTE: Basically it's working but the Save SPF file accessory is now a bit out of sync - waiting for stuart02 --- Source/TableDocument.m | 546 +++++++++++++++++++++++++++++-------------------- 1 file changed, 321 insertions(+), 225 deletions(-) (limited to 'Source/TableDocument.m') diff --git a/Source/TableDocument.m b/Source/TableDocument.m index 3f7bbac9..b89d6fe3 100644 --- a/Source/TableDocument.m +++ b/Source/TableDocument.m @@ -85,7 +85,7 @@ queryEditorInitString = nil; [saveConnectionEncryptString setStringValue:@""]; - spf = nil; + spfSession = nil; } @@ -171,13 +171,20 @@ NSError *readError = nil; NSString *convError = nil; NSPropertyListFormat format; + NSString *encryptpw = nil; - - NSData *pData = [[NSData dataWithContentsOfFile:path options:NSUncachedRead error:&readError] decompress]; + NSDictionary *data = nil; + NSDictionary *connection = nil; + NSDictionary *spf = nil; + + int connectionType; + + NSData *pData = [NSData dataWithContentsOfFile:path options:NSUncachedRead error:&readError]; + spf = [[NSPropertyListSerialization propertyListFromData:pData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&convError] retain]; - if(!spf || readError != nil || [convError length] | format != NSPropertyListBinaryFormat_v1_0) { + if(!spf || readError != nil || [convError length] || !(format == NSPropertyListXMLFormat_v1_0 || format == NSPropertyListBinaryFormat_v1_0)) { NSAlert *alert = [NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Error while reading connection data file", @"error while reading connection data file")] defaultButton:NSLocalizedString(@"OK", @"OK button") alternateButton:nil @@ -189,15 +196,30 @@ return; } - // Init Custom Query editor with the stored queries if given - if([spf objectForKey:@"queries"]) - [self initQueryEditorWithString:[spf objectForKey:@"queries"]]; + // For dispatching later + if(![[spf objectForKey:@"format"] isEqualToString:@"connection"]) { + NSLog(@"SPF file format is not 'connection'."); + return; + } + + if(![spf objectForKey:@"data"]) { + NSAlert *alert = [NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Error while reading connection data file", @"error while reading connection data file")] + defaultButton:NSLocalizedString(@"OK", @"OK button") + alternateButton:nil + otherButton:nil + informativeTextWithFormat:NSLocalizedString(@"No data found.", @"no data found")]; + + [alert setAlertStyle:NSCriticalAlertStyle]; + [alert runModal]; + return; + } // Clean fields [connectionController setName:@""]; [connectionController setUser:@""]; [connectionController setHost:@""]; [connectionController setPort:@""]; + [connectionController setSocket:@""]; [connectionController setSshHost:@""]; [connectionController setSshUser:@""]; [connectionController setSshPort:@""]; @@ -206,10 +228,10 @@ [connectionController setSshPassword:@""]; // Ask for a password if SPF file passwords were encrypted as sheet - if([spf objectForKey:@"encrypted"] && [[spf objectForKey:@"encrypted"] intValue] == NSOnState) { + if([spf objectForKey:@"encrypted"] && [[spf valueForKey:@"encrypted"] boolValue]) { [inputTextWindowHeader setStringValue:NSLocalizedString(@"Connection file is encrypted", @"Connection file is encrypted")]; - [inputTextWindowMessage setStringValue:NSLocalizedString(@"Please enter the password:",@"Please enter the password")]; + [inputTextWindowMessage setStringValue:[NSString stringWithFormat:NSLocalizedString(@"Enter password for ‘%@’:",@"Please enter the password"), [path lastPathComponent]]]; [inputTextWindowSecureTextField setStringValue:@""]; [inputTextWindowSecureTextField selectText:nil]; @@ -240,84 +262,113 @@ } - if([spf objectForKey:@"connectionType"]) { - [connectionController setType:[[spf objectForKey:@"connectionType"] intValue]]; - [connectionController resizeTabViewToConnectionType:[connectionController type] animating:NO]; - } - - if([spf objectForKey:@"name"]) - [connectionController setName:[spf objectForKey:@"name"]]; - if([spf objectForKey:@"user"]) - [connectionController setUser:[spf objectForKey:@"user"]]; - if([spf objectForKey:@"host"]) - [connectionController setHost:[spf objectForKey:@"host"]]; - if([spf objectForKey:@"port"]) - [connectionController setPort:[spf objectForKey:@"port"]]; - if([spf objectForKey:@"sshHost"]) - [connectionController setSshHost:[spf objectForKey:@"sshHost"]]; - if([spf objectForKey:@"sshUser"]) - [connectionController setSshUser:[spf objectForKey:@"sshUser"]]; - if([spf objectForKey:@"sshPort"]) - [connectionController setSshPort:[spf objectForKey:@"sshPort"]]; - if([spf objectForKey:@"selectedDatabase"]) - [connectionController setDatabase:[spf objectForKey:@"selectedDatabase"]]; - - // If password are stored in SPF file auto-connect - // otherwise wait for password(s) - if([spf objectForKey:@"auth"]) { - - NSString *sauth; - if(encryptpw != nil && [spf objectForKey:@"encrypted"] && [[spf objectForKey:@"encrypted"] intValue] == NSOnState) - if([[spf objectForKey:@"auth"] length]) - sauth = [[NSString alloc] initWithData:[[spf objectForKey:@"auth"] dataDecryptedWithPassword:encryptpw] encoding:NSUTF8StringEncoding]; - else - sauth = @""; - else - if([[spf objectForKey:@"auth"] length]) - sauth = [[NSString alloc] initWithData:[spf objectForKey:@"auth"] encoding:NSUTF8StringEncoding]; - else - sauth = @""; + if([[spf objectForKey:@"data"] isKindOfClass:[NSDictionary class]]) + data = [NSDictionary dictionaryWithDictionary:[spf objectForKey:@"data"]]; + else if([[spf objectForKey:@"data"] isKindOfClass:[NSData class]]) { + NSData *decryptdata = nil; + decryptdata = [[[NSMutableData alloc] initWithData:[(NSData *)[spf objectForKey:@"data"] dataDecryptedWithPassword:encryptpw]] autorelease]; + if(decryptdata != nil && [decryptdata length]) { + NSKeyedUnarchiver *unarchiver = [[[NSKeyedUnarchiver alloc] initForReadingWithData:decryptdata] autorelease]; + data = (NSDictionary *)[unarchiver decodeObjectForKey:@"data"]; + [unarchiver finishDecoding]; + } + if(data == nil) { + NSAlert *alert = [NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Error while reading connection data file", @"error while reading connection data file")] + defaultButton:NSLocalizedString(@"OK", @"OK button") + alternateButton:nil + otherButton:nil + informativeTextWithFormat:NSLocalizedString(@"Wrong data format or password.", @"wrong data format or password")]; + + [alert setAlertStyle:NSCriticalAlertStyle]; + [alert runModal]; + return; - [connectionController setPassword:sauth]; - [sauth release]; + } + } - if([connectionController type] == SP_CONNECTION_SSHTUNNEL) { + if(data == nil) { + NSAlert *alert = [NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Error while reading connection data file", @"error while reading connection data file")] + defaultButton:NSLocalizedString(@"OK", @"OK button") + alternateButton:nil + otherButton:nil + informativeTextWithFormat:NSLocalizedString(@"Wrong data format.", @"wrong data format")]; - if(![spf objectForKey:@"sshAuth"]) { - [connectionController setSshPassword:@""]; - [[connectionController valueForKeyPath:@"sshSSHPasswordField"] selectText:self]; - return; - } + [alert setAlertStyle:NSCriticalAlertStyle]; + [alert runModal]; + return; - NSString *sshauth; - if(encryptpw != nil && [spf objectForKey:@"encrypted"] && [[spf objectForKey:@"encrypted"] intValue] == NSOnState) - if([[spf objectForKey:@"sshAuth"] length]) - sshauth = [[NSString alloc] initWithData:[[spf objectForKey:@"sshAuth"] dataDecryptedWithPassword:encryptpw] encoding:NSUTF8StringEncoding]; - else - sshauth = @""; - else - if([[spf objectForKey:@"sshAuth"] length]) - sshauth = [[NSString alloc] initWithData:[spf objectForKey:@"sshAuth"] encoding:NSUTF8StringEncoding]; - else - sshauth = @""; + } - [connectionController setSshPassword:sshauth]; - [sshauth release]; - [connectionController initiateConnection:nil]; + encryptpw = nil; - } else { + if(![data objectForKey:@"connection"]) { + NSAlert *alert = [NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Error while reading connection data file", @"error while reading connection data file")] + defaultButton:NSLocalizedString(@"OK", @"OK button") + alternateButton:nil + otherButton:nil + informativeTextWithFormat:NSLocalizedString(@"No connection data found.", @"no connection data found")]; - [connectionController initiateConnection:nil]; + [alert setAlertStyle:NSCriticalAlertStyle]; + [alert runModal]; + return; + } - } - } else { + connection = [NSDictionary dictionaryWithDictionary:[data objectForKey:@"connection"]]; + + if([connection objectForKey:@"type"]) { + if([[connection objectForKey:@"type"] isEqualToString:@"SP_CONNECTION_TCPIP"]) + connectionType = SP_CONNECTION_TCPIP; + else if([[connection objectForKey:@"type"] isEqualToString:@"SP_CONNECTION_SOCKET"]) + connectionType = SP_CONNECTION_SOCKET; + else if([[connection objectForKey:@"type"] isEqualToString:@"SP_CONNECTION_SSHTUNNEL"]) + connectionType = SP_CONNECTION_SSHTUNNEL; + else + connectionType = SP_CONNECTION_TCPIP; + + [connectionController setType:connectionType]; + [connectionController resizeTabViewToConnectionType:connectionType animating:NO]; + } + + if([connection objectForKey:@"name"]) + [connectionController setName:[connection objectForKey:@"name"]]; + if([connection objectForKey:@"user"]) + [connectionController setUser:[connection objectForKey:@"user"]]; + if([connection objectForKey:@"host"]) + [connectionController setHost:[connection objectForKey:@"host"]]; + if([connection objectForKey:@"port"]) + [connectionController setPort:[NSString stringWithFormat:@"%d", [connection objectForKey:@"port"]]]; + if([connection objectForKey:@"password"]) + [connectionController setPassword:[connection objectForKey:@"password"]]; + if(connectionType == SP_CONNECTION_SOCKET && [connection objectForKey:@"socket"]) + [connectionController setSocket:[connection objectForKey:@"socket"]]; + + if(connectionType == SP_CONNECTION_SSHTUNNEL) { + if([connection objectForKey:@"ssh_host"]) + [connectionController setSshHost:[connection objectForKey:@"ssh_host"]]; + if([connection objectForKey:@"ssh_user"]) + [connectionController setSshUser:[connection objectForKey:@"ssh_user"]]; + if([connection objectForKey:@"ssh_port"]) + [connectionController setSshPort:[NSString stringWithFormat:@"%d", [connection objectForKey:@"ssh_port"]]]; + if([connection objectForKey:@"ssh_password"]) + [connectionController setSshPassword:[connection objectForKey:@"ssh_password"]]; + } + + if([connection objectForKey:@"database"]) + [connectionController setDatabase:[connection objectForKey:@"database"]]; + + if([data objectForKey:@"session"]) + spfSession = [[NSDictionary dictionaryWithDictionary:[data objectForKey:@"session"]] retain]; + + if(![connection objectForKey:@"password"]) { [connectionController setPassword:@""]; [connectionController setSshPassword:@""]; [[connectionController valueForKeyPath:@"standardPasswordField"] selectText:self]; - + return; } - encryptpw = nil; + + if([connection objectForKey:@"auto_connect"] && [[connection valueForKey:@"auto_connect"] boolValue]) + [connectionController initiateConnection:nil]; } @@ -330,70 +381,51 @@ // Check and set the table NSArray *tables = [tablesListInstance tables]; - // Give SP a bit time to load the table list - int cnt = 0; - while(cnt < 5) { - if(![tables indexOfObject:[spf objectForKey:@"selectedTable"]] == NSNotFound) break; - usleep(500); - cnt++; - } + if([tables indexOfObject:[spfSession objectForKey:@"table"]] == NSNotFound) return; - if([tables indexOfObject:[spf objectForKey:@"selectedTable"]] == NSNotFound) return; + // TODO up to now it doesn't work + if([spfSession objectForKey:@"contentSelectedIndexSet"]) { + NSMutableIndexSet *anIndexSet = [NSMutableIndexSet indexSet]; + NSArray *items = [spfSession objectForKey:@"contentSelectedIndexSet"]; + unsigned int i; + for(i=0; i<[items count]; i++) + [anIndexSet addIndex:(NSUInteger)NSArrayObjectAtIndex(items, i)]; - // Select table - [tablesListInstance selectTableAtIndex:[NSNumber numberWithInt:[tables indexOfObject:[spf objectForKey:@"selectedTable"]]]]; - [[tablesListInstance valueForKeyPath:@"tablesListView"] scrollRowToVisible:[tables indexOfObject:[spf objectForKey:@"selectedTable"]]]; + [tableContentInstance setSelectedRowIndexesToRestore:anIndexSet]; + } // Set table content details for restore - if([spf objectForKey:@"contentSortCol"]) - [tableContentInstance setSortColumnNameToRestore:[spf objectForKey:@"contentSortCol"] isAscending:[[spf objectForKey:@"contentSortCol"] boolValue]]; - if([spf objectForKey:@"contentLimitStartPosition"]) - [tableContentInstance setLimitStartToRestore:[[spf objectForKey:@"contentLimitStartPosition"] intValue]]; - if([spf objectForKey:@"contentViewport"]) - [tableContentInstance setViewportToRestore:NSRectFromString([spf objectForKey:@"contentViewport"])]; - if([spf objectForKey:@"contentFilter"]) - [tableContentInstance setFiltersToRestore:[spf objectForKey:@"contentFilter"]]; + if([spfSession objectForKey:@"contentSortCol"]) + [tableContentInstance setSortColumnNameToRestore:[spfSession objectForKey:@"contentSortCol"] isAscending:[[spfSession objectForKey:@"contentSortCol"] boolValue]]; + if([spfSession objectForKey:@"contentLimitStartPosition"]) + [tableContentInstance setLimitStartToRestore:[[spfSession objectForKey:@"contentLimitStartPosition"] intValue]]; + if([spfSession objectForKey:@"contentViewport"]) + [tableContentInstance setViewportToRestore:NSRectFromString([spfSession objectForKey:@"contentViewport"])]; + if([spfSession objectForKey:@"contentFilter"]) + [tableContentInstance setFiltersToRestore:[spfSession objectForKey:@"contentFilter"]]; - [tablesListInstance setContentRequiresReload:YES]; + // Select table + [tablesListInstance selectTableAtIndex:[NSNumber numberWithInt:[tables indexOfObject:[spfSession objectForKey:@"table"]]]]; + // [tablesListInstance setContentRequiresReload:YES]; + // Select view - if ([spHistoryControllerInstance currentlySelectedView] != [[spf objectForKey:@"view"] intValue]) { - switch ([[spf objectForKey:@"view"] intValue]) { - case SP_VIEW_STRUCTURE: - [self viewStructure:self]; - break; - case SP_VIEW_CONTENT: - [self viewContent:self]; - break; - case SP_VIEW_CUSTOMQUERY: - [self viewQuery:self]; - break; - case SP_VIEW_STATUS: - [self viewStatus:self]; - break; - case SP_VIEW_RELATIONS: - [self viewRelations:self]; - break; - } - if ([spHistoryControllerInstance currentlySelectedView] != [[spf objectForKey:@"view"] intValue]) { - return; - } - } + if([[spfSession objectForKey:@"view"] isEqualToString:@"SP_VIEW_STRUCTURE"]) + [self viewStructure:self]; + else if([[spfSession objectForKey:@"view"] isEqualToString:@"SP_VIEW_CONTENT"]) + [self viewContent:self]; + else if([[spfSession objectForKey:@"view"] isEqualToString:@"SP_VIEW_CUSTOMQUERY"]) + [self viewQuery:self]; + else if([[spfSession objectForKey:@"view"] isEqualToString:@"SP_VIEW_STATUS"]) + [self viewStatus:self]; + else if([[spfSession objectForKey:@"view"] isEqualToString:@"SP_VIEW_RELATIONS"]) + [self viewRelations:self]; - if([spf objectForKey:@"contentSelectedIndexSet"]) { - NSMutableIndexSet *anIndexSet = [NSMutableIndexSet indexSet]; - NSArray *items = [spf objectForKey:@"contentSelectedIndexSet"]; - unsigned int i; - for(i=0; i<[items count]; i++) - { - [anIndexSet addIndex:(NSUInteger)NSArrayObjectAtIndex(items, i)]; - } - [tableContentInstance setSelectedRowIndexesToRestore:anIndexSet]; - } + [[tablesListInstance valueForKeyPath:@"tablesListView"] scrollRowToVisible:[tables indexOfObject:[spfSession objectForKey:@"selectedTable"]]]; - // dealloc spf data - [spf release]; - spf = nil; + // dealloc spfSession data + [spfSession release]; + spfSession = nil; } /* @@ -481,6 +513,18 @@ description:[NSString stringWithFormat:NSLocalizedString(@"Connected to %@",@"description for connected growl notification"), [tableWindow title]] notificationName:@"Connected"]; + + // Init Custom Query editor with the stored queries in a spf file if given. + if(spfSession != nil && [spfSession objectForKey:@"queries"]) { + if([[spfSession objectForKey:@"queries"] isKindOfClass:[NSData class]]) { + NSString *q = [[NSString alloc] initWithData:[[spfSession objectForKey:@"queries"] decompress] encoding:NSUTF8StringEncoding]; + [self initQueryEditorWithString:q]; + [q release]; + } + else + [self initQueryEditorWithString:[spfSession objectForKey:@"queries"]]; + } + // Insert queryEditorInitString into the Query Editor if defined if(queryEditorInitString && [queryEditorInitString length]) { [self viewQuery:self]; @@ -496,7 +540,7 @@ else [tableWindow makeFirstResponder:[tablesListInstance valueForKeyPath:@"tablesListView"]]; - if(spf != nil) + if(spfSession != nil) [self restoreSession]; // [self performSelector:@selector(restoreSession) withObject:nil afterDelay:0.3]; @@ -1942,115 +1986,167 @@ [saveConnectionEncryptString abortEditing]; [saveConnectionEncryptString selectText:nil]; + [self saveSPFtoFile:fileName]; - NSMutableDictionary *spfdata = [NSMutableDictionary dictionary]; + } + } +} - NSIndexSet *contentSelectedIndexSet = [tableContentInstance selectedRowIndexes]; +- (void)saveSPFtoFile:(NSString *)fileName +{ + NSString *aString; - [spfdata setObject:[NSNumber numberWithInt:1] forKey:@"version"]; - [spfdata setObject:@"session" forKey:@"format"]; + NSMutableDictionary *spfdata = [NSMutableDictionary dictionary]; + NSMutableDictionary *connection = [NSMutableDictionary dictionary]; + NSMutableDictionary *session = nil; + NSMutableDictionary *data = [NSMutableDictionary dictionary]; - [spfdata setObject:[self name] forKey:@"name"]; - [spfdata setObject:[self host] forKey:@"host"]; - [spfdata setObject:[self user] forKey:@"user"]; + NSIndexSet *contentSelectedIndexSet = [tableContentInstance selectedRowIndexes]; - if([saveConnectionEncrypt isEnabled]) - [spfdata setObject:[NSNumber numberWithInt:[saveConnectionEncrypt state]] forKey:@"encrypted"]; + [spfdata setObject:[NSNumber numberWithInt:1] forKey:@"version"]; + [spfdata setObject:@"connection" forKey:@"format"]; + if([saveConnectionEncrypt isEnabled]) + [spfdata setObject:[NSNumber numberWithBool:([saveConnectionEncrypt state]==NSOnState) ? YES : NO ] forKey:@"encrypted"]; - [spfdata setObject:[NSNumber numberWithInt:[connectionController type]] forKey:@"connectionType"]; - if([connectionController type] == 2) { - [spfdata setObject:[connectionController sshHost] forKey:@"sshHost"]; - [spfdata setObject:[connectionController sshUser] forKey:@"sshUser"]; - [spfdata setObject:[connectionController sshPort] forKey:@"sshPort"]; - } + if([saveConnectionSavePassword state] == NSOnState) + [connection setObject:[NSNumber numberWithBool:([saveConnectionAutoConnect state]==NSOnState) ? YES : NO ] forKey:@"auto_connect"]; - if([saveConnectionSavePassword state] == NSOnState) { - NSString *pw = [self keychainPasswordForConnection:nil]; - if(![pw length]) pw = [connectionController password]; - if([saveConnectionEncrypt state] == NSOffState) { - if([pw length]) - [spfdata setObject:[pw dataUsingEncoding:NSUTF8StringEncoding] forKey:@"auth"]; - else - [spfdata setObject:[NSData data] forKey:@"auth"]; - if([[connectionController sshPassword] length]) - [spfdata setObject:[[connectionController sshPassword] dataUsingEncoding:NSUTF8StringEncoding] forKey:@"sshAuth"]; - else - [spfdata setObject:[NSData data] forKey:@"sshAuth"]; - } else { - if([pw length]) - [spfdata setObject:[[pw dataUsingEncoding:NSUTF8StringEncoding] dataEncryptedWithPassword:[saveConnectionEncryptString stringValue]] forKey:@"auth"]; - else - [spfdata setObject:[NSData data] forKey:@"auth"]; - if([[connectionController sshPassword] length]) - [spfdata setObject:[[[connectionController sshPassword] dataUsingEncoding:NSUTF8StringEncoding] dataEncryptedWithPassword:[saveConnectionEncryptString stringValue]] forKey:@"sshAuth"]; - else - [spfdata setObject:[NSData data] forKey:@"sshAuth"]; - } - } + [connection setObject:[self name] forKey:@"name"]; + [connection setObject:[self host] forKey:@"host"]; + [connection setObject:[self user] forKey:@"user"]; - if([connectionController port] &&[[connectionController port] length]) - [spfdata setObject:[connectionController port] forKey:@"port"]; - - if([[self database] length]) - [spfdata setObject:[self database] forKey:@"selectedDatabase"]; - - // Include session data like selected table, view etc. ? - if([saveConnectionIncludeData state] == NSOnState) { - if([[self table] length]) - [spfdata setObject:[self table] forKey:@"selectedTable"]; - if([tableContentInstance sortColumnName]) - [spfdata setObject:[tableContentInstance sortColumnName] forKey:@"contentSortCol"]; - - [spfdata setObject:[NSNumber numberWithInt:[spHistoryControllerInstance currentlySelectedView]] forKey:@"view"]; - [spfdata setObject:[NSNumber numberWithBool:[tableContentInstance sortColumnIsAscending]] forKey:@"contentSortColIsAsc"]; - [spfdata setObject:[NSNumber numberWithInt:[tableContentInstance limitStart]] forKey:@"contentLimitStartPosition"]; - [spfdata setObject:NSStringFromRect([tableContentInstance viewport]) forKey:@"contentViewport"]; - if([tableContentInstance filterSettings]) - [spfdata setObject:[tableContentInstance filterSettings] forKey:@"contentFilter"]; - - if([[[[customQueryInstance valueForKeyPath:@"textView"] textStorage] string] length]) - [spfdata setObject:[[[customQueryInstance valueForKeyPath:@"textView"] textStorage] string] forKey:@"queries"]; - - if (contentSelectedIndexSet && [contentSelectedIndexSet count]) { - NSMutableArray *indices = [NSMutableArray array]; - unsigned indexBuffer[[contentSelectedIndexSet count]]; - unsigned limit = [contentSelectedIndexSet getIndexes:indexBuffer maxCount:[contentSelectedIndexSet count] inIndexRange:NULL]; - unsigned idx; - for (idx = 0; idx < limit; idx++) { - [indices addObject:[NSNumber numberWithInt:indexBuffer[idx]]]; - } - [spfdata setObject:indices forKey:@"contentSelectedIndexSet"]; - } + switch([connectionController type]) { + case SP_CONNECTION_TCPIP: + aString = @"SP_CONNECTION_TCPIP"; + break; + case SP_CONNECTION_SOCKET: + aString = @"SP_CONNECTION_SOCKET"; + [connection setObject:[connectionController socket] forKey:@"socket"]; + break; + case SP_CONNECTION_SSHTUNNEL: + aString = @"SP_CONNECTION_SSHTUNNEL"; + [connection setObject:[connectionController sshHost] forKey:@"ssh_host"]; + [connection setObject:[connectionController sshUser] forKey:@"ssh_user"]; + if([connectionController port] && [[connectionController port] length]) + [connection setObject:[NSNumber numberWithInt:[[connectionController sshPort] intValue]] forKey:@"ssh_port"]; + break; + default: + aString = @"SP_CONNECTION_TCPIP"; + } + [connection setObject:aString forKey:@"type"]; + + + if([saveConnectionSavePassword state] == NSOnState) { + NSString *pw = [self keychainPasswordForConnection:nil]; + if(![pw length]) pw = [connectionController password]; + [connection setObject:pw forKey:@"password"]; + if([connectionController type] == SP_CONNECTION_SSHTUNNEL) + [connection setObject:[connectionController sshPassword] forKey:@"ssh_password"]; + } + + if([connectionController port] && [[connectionController port] length]) + [connection setObject:[NSNumber numberWithInt:[[connectionController port] intValue]] forKey:@"port"]; + + if([[self database] length]) + [connection setObject:[self database] forKey:@"database"]; + + // Include session data like selected table, view etc. ? + if([saveConnectionIncludeData state] == NSOnState) { + + session = [NSMutableDictionary dictionary]; + + if([[self table] length]) + [session setObject:[self table] forKey:@"table"]; + if([tableContentInstance sortColumnName]) + [session setObject:[tableContentInstance sortColumnName] forKey:@"contentSortCol"]; + + switch([spHistoryControllerInstance currentlySelectedView]){ + case SP_VIEW_STRUCTURE: + aString = @"SP_VIEW_STRUCTURE"; + break; + case SP_VIEW_CONTENT: + aString = @"SP_VIEW_CONTENT"; + break; + case SP_VIEW_CUSTOMQUERY: + aString = @"SP_VIEW_CUSTOMQUERY"; + break; + case SP_VIEW_STATUS: + aString = @"SP_VIEW_STATUS"; + break; + case SP_VIEW_RELATIONS: + aString = @"SP_VIEW_RELATIONS"; + break; + default: + aString = @"SP_VIEW_STRUCTURE"; } + [session setObject:aString forKey:@"view"]; - NSString *err = nil; - NSData *plist = [NSPropertyListSerialization dataFromPropertyList:spfdata - format:NSPropertyListBinaryFormat_v1_0 - errorDescription:&err]; - - if(err != nil) { - NSAlert *alert = [NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Error while converting connection data", @"error while converting connection data")] - defaultButton:NSLocalizedString(@"OK", @"OK button") - alternateButton:nil - otherButton:nil - informativeTextWithFormat:err]; - - [alert setAlertStyle:NSCriticalAlertStyle]; - [alert runModal]; - return; + [session setObject:[NSNumber numberWithBool:[tableContentInstance sortColumnIsAscending]] forKey:@"contentSortColIsAsc"]; + [session setObject:[NSNumber numberWithInt:[tableContentInstance limitStart]] forKey:@"contentLimitStartPosition"]; + [session setObject:NSStringFromRect([tableContentInstance viewport]) forKey:@"contentViewport"]; + if([tableContentInstance filterSettings]) + [session setObject:[tableContentInstance filterSettings] forKey:@"contentFilter"]; + + if([[[[customQueryInstance valueForKeyPath:@"textView"] textStorage] string] length]) + if([[[[customQueryInstance valueForKeyPath:@"textView"] textStorage] string] length] > 50000) + [session setObject:[[[[[customQueryInstance valueForKeyPath:@"textView"] textStorage] string] dataUsingEncoding:NSUTF8StringEncoding] compress] forKey:@"queries"]; + else + [session setObject:[[[customQueryInstance valueForKeyPath:@"textView"] textStorage] string] forKey:@"queries"]; + if (contentSelectedIndexSet && [contentSelectedIndexSet count]) { + NSMutableArray *indices = [NSMutableArray array]; + unsigned indexBuffer[[contentSelectedIndexSet count]]; + unsigned limit = [contentSelectedIndexSet getIndexes:indexBuffer maxCount:[contentSelectedIndexSet count] inIndexRange:NULL]; + unsigned idx; + for (idx = 0; idx < limit; idx++) { + [indices addObject:[NSNumber numberWithInt:indexBuffer[idx]]]; + } + [session setObject:indices forKey:@"contentSelectedIndexSet"]; } + } + - NSError *error = nil; - [[plist compress] writeToFile:fileName options:NSAtomicWrite error:&error]; - if(error != nil){ - NSAlert *errorAlert = [NSAlert alertWithError:error]; - [errorAlert runModal]; - return; - } + [data setObject:connection forKey:@"connection"]; + if(session != nil) + [data setObject:session forKey:@"session"]; + + if([saveConnectionEncrypt state] == NSOffState) { + [spfdata setObject:data forKey:@"data"]; + } else { + NSMutableData *encryptdata = [[[NSMutableData alloc] init] autorelease]; + NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:encryptdata] autorelease]; + [archiver encodeObject:data forKey:@"data"]; + [archiver finishEncoding]; + [spfdata setObject:[encryptdata dataEncryptedWithPassword:[saveConnectionEncryptString stringValue]] forKey:@"data"]; + } + + // NSLog(@"%@", spfdata); + + NSString *err = nil; + NSData *plist = [NSPropertyListSerialization dataFromPropertyList:spfdata + format:NSPropertyListXMLFormat_v1_0 + errorDescription:&err]; + + if(err != nil) { + NSAlert *alert = [NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Error while converting connection data", @"error while converting connection data")] + defaultButton:NSLocalizedString(@"OK", @"OK button") + alternateButton:nil + otherButton:nil + informativeTextWithFormat:err]; + + [alert setAlertStyle:NSCriticalAlertStyle]; + [alert runModal]; return; } - } + + NSError *error = nil; + [plist writeToFile:fileName options:NSAtomicWrite error:&error]; + if(error != nil){ + NSAlert *errorAlert = [NSAlert alertWithError:error]; + [errorAlert runModal]; + } + } + /** * Passes the request to the tableDump object */ @@ -2850,7 +2946,7 @@ if (mySQLVersion) [mySQLVersion release]; [allDatabases release]; if(queryEditorInitString) [queryEditorInitString release]; - if(spf) [spf release]; + if(spfSession) [spfSession release]; if(userManagerInstance) [userManagerInstance release]; [super dealloc]; } -- cgit v1.2.3