aboutsummaryrefslogtreecommitdiffstats
path: root/Source/SPFileManagerAdditions.m
diff options
context:
space:
mode:
Diffstat (limited to 'Source/SPFileManagerAdditions.m')
-rw-r--r--Source/SPFileManagerAdditions.m143
1 files changed, 143 insertions, 0 deletions
diff --git a/Source/SPFileManagerAdditions.m b/Source/SPFileManagerAdditions.m
new file mode 100644
index 00000000..179f33d7
--- /dev/null
+++ b/Source/SPFileManagerAdditions.m
@@ -0,0 +1,143 @@
+//
+// $Id$
+//
+// SPFileManagerAdditions.m
+// sequel-pro
+//
+// Created by Hans-Jörg Bibiko on August 19, 2010
+//
+// 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 "SPFileManagerAdditions.h"
+
+enum
+{
+ DirectoryLocationErrorNoPathFound,
+ DirectoryLocationErrorFileExistsAtLocation
+};
+
+NSString* const DirectoryLocationDomain = @"DirectoryLocationDomain";
+
+
+@implementation NSFileManager (SPFileManagerAdditions)
+
+/*
+ * Return the application support folder of the current application for 'subDirectory'.
+ * If this folder doesn't exist it will be created. If 'subDirectory' == nil it only returns
+ * the application support folder of the current application.
+ */
+- (NSString*)applicationSupportDirectoryForSubDirectory:(NSString*)subDirectory error:(NSError **)errorOut
+{
+ // Based on Matt Gallagher on 06 May 2010
+ //
+ // Permission is given to use this source code file, free of charge, in any
+ // project, commercial or otherwise, entirely at your risk, with the condition
+ // that any redistribution (in part or whole) of source code must retain
+ // this copyright and permission notice. Attribution in compiled projects is
+ // appreciated but not required.
+ //
+
+ NSError *error;
+
+ NSArray* paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
+
+ if (![paths count]) {
+ if (errorOut) {
+ NSDictionary *userInfo =
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ NSLocalizedStringFromTable(
+ @"No path found for directory in domain.",
+ @"Errors",
+ nil),
+ NSLocalizedDescriptionKey,
+ [NSNumber numberWithInteger:NSApplicationSupportDirectory],
+ @"NSSearchPathDirectory",
+ [NSNumber numberWithInteger:NSUserDomainMask],
+ @"NSSearchPathDomainMask",
+ nil];
+ *errorOut = [NSError
+ errorWithDomain:DirectoryLocationDomain
+ code:DirectoryLocationErrorNoPathFound
+ userInfo:userInfo];
+ }
+ return nil;
+ }
+
+ // Use only the first path returned
+ NSString *resolvedPath = [paths objectAtIndex:0];
+
+ // Append the application name
+ resolvedPath = [resolvedPath stringByAppendingPathComponent:[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleExecutable"]];
+
+ // Append the subdirectory if passed
+ if (subDirectory)
+ resolvedPath = [resolvedPath stringByAppendingPathComponent:subDirectory];
+
+ // Check if the path exists already
+ BOOL exists;
+ BOOL isDirectory;
+ exists = [self fileExistsAtPath:resolvedPath isDirectory:&isDirectory];
+ if (!exists || !isDirectory) {
+ if (exists) {
+ if (errorOut) {
+ NSDictionary *userInfo =
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ NSLocalizedStringFromTable(
+ @"File exists at requested directory location.",
+ @"Errors",
+ nil),
+ NSLocalizedDescriptionKey,
+ [NSNumber numberWithInteger:NSApplicationSupportDirectory],
+ @"NSSearchPathDirectory",
+ [NSNumber numberWithInteger:NSUserDomainMask],
+ @"NSSearchPathDomainMask",
+ nil];
+ *errorOut = [NSError
+ errorWithDomain:DirectoryLocationDomain
+ code:DirectoryLocationErrorFileExistsAtLocation
+ userInfo:userInfo];
+ }
+ return nil;
+ }
+
+ // Create the path if it doesn't exist
+ NSError *error = nil;
+ BOOL success = [self createDirectoryAtPath:resolvedPath withIntermediateDirectories:YES attributes:nil error:&error];
+ if (!success) {
+ if (errorOut) {
+ *errorOut = error;
+ }
+ return nil;
+ }
+ }
+
+ if (errorOut)
+ *errorOut = nil;
+
+ if (!resolvedPath) {
+ NSBeep();
+ NSLog(@"Unable to find or create application support directory:\n%@", error);
+ }
+
+
+ return resolvedPath;
+
+
+}
+
+@end