diff --git a/Headers/gnustep/gui/NSPasteboard.h b/Headers/gnustep/gui/NSPasteboard.h index 7f7a3632f..004baca86 100644 --- a/Headers/gnustep/gui/NSPasteboard.h +++ b/Headers/gnustep/gui/NSPasteboard.h @@ -46,10 +46,21 @@ APPKIT_EXPORT NSString *NSStringPboardType; /** - * Pasteboard contains string color information + * Pasteboard contains color information */ APPKIT_EXPORT NSString *NSColorPboardType; + +/** + * Pasteboard contains generic file content information (serialized) + * as written by [NSPasteboard-writeFileContents:] or + * [NSPasteboard-writeFileWrapper:] + */ APPKIT_EXPORT NSString *NSFileContentsPboardType; + +/** + * Pasteboard contains an array of filenames (serialized) + * as written by [NSPasteboard-setPropertyList:forType:] + */ APPKIT_EXPORT NSString *NSFilenamesPboardType; /** diff --git a/Source/GSServicesManager.m b/Source/GSServicesManager.m index 856e2277d..f7424c434 100644 --- a/Source/GSServicesManager.m +++ b/Source/GSServicesManager.m @@ -1362,11 +1362,14 @@ GSPerformService(NSString *serviceItem, NSPasteboard *pboard, BOOL isFilter) finishBy = [NSDate dateWithTimeIntervalSinceNow: seconds]; appPath = [service objectForKey: @"ServicePath"]; userData = [service objectForKey: @"NSUserData"]; - message = [service objectForKey: @"NSMessage"]; - if (isFilter == YES && [message length] == 0) + if (isFilter == YES) { message = [service objectForKey: @"NSFilter"]; } + else + { + message = [service objectForKey: @"NSMessage"]; + } selName = [message stringByAppendingString: @":userData:error:"]; /* diff --git a/Source/NSPasteboard.m b/Source/NSPasteboard.m index 97b58782a..e2e60dbc6 100644 --- a/Source/NSPasteboard.m +++ b/Source/NSPasteboard.m @@ -209,6 +209,7 @@ static NSString *namePrefix = @"NSTypedFilenamesPboardType:"; { NSMutableData *m = [NSMutableData dataWithCapacity: 1023]; NSString *filename; + NSString *path; NSData *d; NSPipe *p; NSTask *t; @@ -217,8 +218,8 @@ static NSString *namePrefix = @"NSTypedFilenamesPboardType:"; /* * The data for an NSUnixStdio filter must be one or more filenames */ - if ([type isEqualToString: NSFilenamesPboardType] == NO - && [type hasPrefix: namePrefix] == NO) + if ([fromType isEqualToString: NSFilenamesPboardType] == NO + && [fromType hasPrefix: namePrefix] == NO) { [sender setData: [NSData data] forType: type]; return; // Not the name of a file to filter. @@ -258,7 +259,12 @@ static NSString *namePrefix = @"NSTypedFilenamesPboardType:"; * Set up and launch task to filter the named file. */ t = [NSTask new]; - [t setLaunchPath: [info objectForKey: @"NSPortName"]]; + path = [info objectForKey: @"NSExecutable"]; + if ([path length] == 0) + { + path = [info objectForKey: @"NSPortName"]; + } + [t setLaunchPath: path]; [t setArguments: [NSArray arrayWithObject: filename]]; p = [NSPipe pipe]; [t setStandardOutput: p]; @@ -267,7 +273,8 @@ static NSString *namePrefix = @"NSTypedFilenamesPboardType:"; /* * Read all the data that the task writes. */ - while ((d = [[p fileHandleForReading] availableData]) != nil) + while ((d = [[p fileHandleForReading] availableData]) != nil + && [d length] > 0) { [m appendData: d]; } diff --git a/Tools/exampleInfo.plist b/Tools/exampleInfo.plist index 163068299..0a412206b 100644 --- a/Tools/exampleInfo.plist +++ b/Tools/exampleInfo.plist @@ -1,4 +1,15 @@ NSServices = ( + { + NSFilter = cat; + NSInputMechanism = NSUnixStdio; + NSPortName = "/bin/cat"; + NSSendTypes = ( + NSFilenamesPboardType + ); + NSReturnTypes = ( + NSGeneralPboardType + ); + }, { NSPortName = ExampleServices; NSFilter = md5; diff --git a/Tools/md5Digest.m b/Tools/md5Digest.m index 2e6509f13..8e137a5d2 100644 --- a/Tools/md5Digest.m +++ b/Tools/md5Digest.m @@ -25,33 +25,50 @@ #include #include #include +#include #include int main(int argc, char** argv, char **env_c) { CREATE_AUTORELEASE_POOL(pool); - NSFileHandle *fh; - NSData *data; - NSString *string; - NSPasteboard *pb; + NSFileHandle *fh; + NSData *data; + NSString *string; + NSPasteboard *pb; + NSUserDefaults *defs; #ifdef GS_PASS_ARGUMENTS [NSProcessInfo initializeWithArguments:argv count:argc environment:env_c]; #endif - NSLog(@"This program expects to read utf8 text from stdin -"); - fh = [NSFileHandle fileHandleWithStandardInput]; - data = [fh readDataToEndOfFile]; - string = [[NSString alloc] initWithData: data - encoding: NSUTF8StringEncoding]; - data = [NSSerializer serializePropertyList: string]; + defs = [NSUserDefaults standardUserDefaults]; + string = [defs stringForKey: @"CatFile"]; + if (string != nil) + { + data = [NSSerializer serializePropertyList: string]; + pb = [NSPasteboard pasteboardByFilteringData: data + ofType: NSFilenamesPboardType]; + NSLog(@"Types: %@", [pb types]); + data = [pb dataForType: NSGeneralPboardType]; + NSLog(@"Got %@", data); + } + else + { + NSLog(@"This program expects to read utf8 text from stdin -"); + fh = [NSFileHandle fileHandleWithStandardInput]; + data = [fh readDataToEndOfFile]; + string = [[NSString alloc] initWithData: data + encoding: NSUTF8StringEncoding]; + data = [NSSerializer serializePropertyList: string]; + + pb = [NSPasteboard pasteboardByFilteringData: data + ofType: NSStringPboardType]; + NSLog(@"Types: %@", [pb types]); + data = [pb dataForType: @"md5Digest"]; + NSLog(@"Got %@", data); + } - pb = [NSPasteboard pasteboardByFilteringData: data - ofType: NSStringPboardType]; - NSLog(@"Types: %@", [pb types]); - data = [pb dataForType: @"md5Digest"]; - NSLog(@"Got %@", data); RELEASE(pool); exit(EXIT_SUCCESS); }