aboutsummaryrefslogtreecommitdiffstats
path: root/Source/MainController.m
diff options
context:
space:
mode:
Diffstat (limited to 'Source/MainController.m')
-rw-r--r--Source/MainController.m117
1 files changed, 117 insertions, 0 deletions
diff --git a/Source/MainController.m b/Source/MainController.m
index 25ffdeb9..4e1119a6 100644
--- a/Source/MainController.m
+++ b/Source/MainController.m
@@ -37,6 +37,48 @@
@implementation MainController
+
+- (id) init
+{
+ if ((self = [super init])) {
+ [NSApp setDelegate: self];
+ }
+
+ return self;
+}
+
+/**
+ * Called if user drag and drops files on Sequel Pro's dock item or double-clicked
+ * at files *.spf or *.sql
+ */
+- (void)application:(NSApplication *)app openFiles:(NSArray *)filenames
+{
+
+ for( NSString* filename in filenames ) {
+
+ // Opens a sql file and insert its content to the Custom Query editor
+ if([[[filename pathExtension] lowercaseString] isEqualToString:@"sql"]) {
+
+ // Check if at least one document exists
+ if (![[[NSDocumentController sharedDocumentController] documents] count]) {
+ // TODO : maybe open a connection first
+ return;
+ }
+
+ // Pass query to last created document
+ [[[[NSDocumentController sharedDocumentController] documents] objectAtIndex:([[[NSDocumentController sharedDocumentController] documents] count] - 1)] doPerformQueryService:[self contentOfFile:filename]];
+
+ }
+ else if([[[filename pathExtension] lowercaseString] isEqualToString:@"spf"]) {
+ NSLog(@"open connection %@", filename);
+ }
+ else {
+ NSLog(@"Only files with the extensions ‘spf’ or ‘sql’ are allowed.");
+ }
+ }
+
+}
+
/**
* Called even before init so we can register our preference defaults
*/
@@ -179,6 +221,81 @@
return NO;
}
+/*
+ * Insert content of a plain text file for a given path.
+ * In addition it tries to figure out the file's text encoding heuristically.
+ */
+- (NSString *)contentOfFile:(NSString *)aPath
+{
+
+ NSError *err = nil;
+ NSStringEncoding enc;
+ NSString *content = nil;
+
+ // Make usage of the UNIX command "file" to get an info
+ // about file type and encoding.
+ NSTask *task=[[NSTask alloc] init];
+ NSPipe *pipe=[[NSPipe alloc] init];
+ NSFileHandle *handle;
+ NSString *result;
+ [task setLaunchPath:@"/usr/bin/file"];
+ [task setArguments:[NSArray arrayWithObjects:aPath, @"-Ib", nil]];
+ [task setStandardOutput:pipe];
+ handle=[pipe fileHandleForReading];
+ [task launch];
+ result=[[NSString alloc] initWithData:[handle readDataToEndOfFile]
+ encoding:NSASCIIStringEncoding];
+
+ [pipe release];
+ [task release];
+
+ // UTF16/32 files are detected as application/octet-stream resp. audio/mpeg
+ if( [result hasPrefix:@"text/plain"]
+ || [[[aPath pathExtension] lowercaseString] isEqualToString:@"sql"]
+ || [[[aPath pathExtension] lowercaseString] isEqualToString:@"txt"]
+ || [result hasPrefix:@"audio/mpeg"]
+ || [result hasPrefix:@"application/octet-stream"]
+ )
+ {
+ // if UTF16/32 cocoa will try to find the correct encoding
+ if([result hasPrefix:@"application/octet-stream"] || [result hasPrefix:@"audio/mpeg"] || [result rangeOfString:@"utf-16"].length)
+ enc = 0;
+ else if([result rangeOfString:@"utf-8"].length)
+ enc = NSUTF8StringEncoding;
+ else if([result rangeOfString:@"iso-8859-1"].length)
+ enc = NSISOLatin1StringEncoding;
+ else if([result rangeOfString:@"us-ascii"].length)
+ enc = NSASCIIStringEncoding;
+ else
+ enc = 0;
+
+ if(enc == 0) // cocoa tries to detect the encoding
+ content = [NSString stringWithContentsOfFile:aPath usedEncoding:&enc error:&err];
+ else
+ content = [NSString stringWithContentsOfFile:aPath encoding:enc error:&err];
+
+ if(content)
+ {
+ [result release];
+ return content;
+ }
+ // If UNIX "file" failed try cocoa's encoding detection
+ content = [NSString stringWithContentsOfFile:aPath encoding:enc error:&err];
+ if(content)
+ {
+ [result release];
+ return content;
+ }
+ }
+
+ [result release];
+
+ NSLog(@"%@ ‘%@’.", NSLocalizedString(@"Couldn't read the file content of", @"Couldn't read the file content of"), aPath);
+
+ return @"";
+}
+
+
/**
* What exactly is this for?
*/