diff options
Diffstat (limited to 'SpotlightPlugins/AppleScript/GetMetadataForFile.m')
-rw-r--r-- | SpotlightPlugins/AppleScript/GetMetadataForFile.m | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/SpotlightPlugins/AppleScript/GetMetadataForFile.m b/SpotlightPlugins/AppleScript/GetMetadataForFile.m new file mode 100644 index 0000000..d635f40 --- /dev/null +++ b/SpotlightPlugins/AppleScript/GetMetadataForFile.m @@ -0,0 +1,121 @@ +// +// GetMetadataForFile.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import <AppKit/AppKit.h> +#import <Carbon/Carbon.h> + +static BOOL ImportScriptBundle(NSMutableDictionary *attributes, + NSString *path) { + NSBundle *scriptBundle = [NSBundle bundleWithPath:path]; + NSString *descriptionPath = [scriptBundle pathForResource:@"description" + ofType:@"rtfd"]; + NSAttributedString *attrString = nil; + if (descriptionPath) { + attrString = [[[NSAttributedString alloc] initWithPath:descriptionPath + documentAttributes:NULL] autorelease]; + } + BOOL wasGood = NO; + if (attrString) { + NSString *description = [attrString string]; + [attributes setObject:description forKey:(NSString*)kMDItemDescription]; + wasGood = YES; + } + + NSArray *scripts = [scriptBundle pathsForResourcesOfType:@"scpt" + inDirectory:@"Scripts"]; + NSEnumerator *scriptEnum = [scripts objectEnumerator]; + NSString *scriptPath; + NSMutableArray *scriptSources = [NSMutableArray array]; + while ((scriptPath = [scriptEnum nextObject])) { + NSURL *scriptURL = [NSURL fileURLWithPath:scriptPath]; + NSDictionary *error; + NSAppleScript *script + = [[[NSAppleScript alloc] initWithContentsOfURL:scriptURL + error:&error] + autorelease]; + NSString *scriptSource = [script source]; + if (scriptSource) { + [scriptSources addObject:scriptSource]; + } + } + if ([scriptSources count]) { + NSString *source = [scriptSources componentsJoinedByString:@"\n"]; + [attributes setObject:source forKey:(NSString*)kMDItemTextContent]; + wasGood = YES; + } + return wasGood; +} + +static BOOL ImportScript(NSMutableDictionary *attributes, + NSString *path) { + NSURL *fileURL = [NSURL fileURLWithPath:path]; + FSRef ref; + BOOL wasGood = NO; + if (CFURLGetFSRef((CFURLRef)fileURL, &ref)) { + ResFileRefNum resFile = FSOpenResFile(&ref, fsRdPerm); + if (resFile) { + const ResID kScriptDescriptionResID = 1128; + ResFileRefNum curResFile = CurResFile(); + UseResFile(resFile); + Handle res = Get1Resource('TEXT', kScriptDescriptionResID); + if (res) { + NSString *descString + = [[[NSString alloc]initWithBytes:(char*)(*res) + length:GetHandleSize(res) + encoding:NSMacOSRomanStringEncoding] autorelease]; + ReleaseResource(res); + if (descString) { + [attributes setObject:descString forKey:(NSString*)kMDItemDescription]; + wasGood = YES; + } + } + UseResFile(curResFile); + CloseResFile(resFile); + } + + NSDictionary *error; + NSAppleScript *script = [[[NSAppleScript alloc] initWithContentsOfURL:fileURL + error:&error] + autorelease]; + NSString *scriptSource = [script source]; + if (scriptSource) { + [attributes setObject:scriptSource forKey:(NSString*)kMDItemTextContent]; + wasGood = YES; + } + } + return wasGood; +} + +// Currently grabs the script description and puts it into kMDItemDescription. +// Grabs the script code and puts it into kMDItemTextContent. +Boolean GetMetadataForFile(void* interface, + CFMutableDictionaryRef cfAttributes, + CFStringRef cfContentTypeUTI, + CFStringRef cfPathToFile) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSMutableDictionary *attributes = (NSMutableDictionary*)cfAttributes; + NSString *pathToFile = (NSString*)cfPathToFile; + BOOL wasGood = NO; + if (UTTypeConformsTo(cfContentTypeUTI, CFSTR("com.apple.applescript.scriptbundle"))) { + wasGood = ImportScriptBundle(attributes, pathToFile); + } else if (UTTypeConformsTo(cfContentTypeUTI, CFSTR("com.apple.applescript.script"))) { + wasGood = ImportScript(attributes, pathToFile); + } + [pool release]; + return wasGood ? TRUE : FALSE; +} |