More filter stuff added

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@17058 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
CaS 2003-06-28 06:46:14 +00:00
parent b9c468e0d1
commit d13626fc75
8 changed files with 276 additions and 184 deletions

View file

@ -1,3 +1,11 @@
2003-06-28 Richard Frith-Macdonald <rfm@gnu.org>
* Tools/make_services.m: Alter format of filter info.
* Tools/example.m: Added an example filter.
* Tools/md5Digest.m: Example filter user.
* Source/GSServicesManager.m: tweak for filters.
* Source/NSPasteboard.m: more documentation
2003-06-27 Richard Frith-Macdonald <rfm@gnu.org> 2003-06-27 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSPasteboard.m: Documented all methods, fixed minor bugs * Source/NSPasteboard.m: Documented all methods, fixed minor bugs

View file

@ -1330,18 +1330,23 @@ GSPerformService(NSString *serviceItem, NSPasteboard *pboard, BOOL isFilter)
if (isFilter == YES) if (isFilter == YES)
{ {
service = [[manager filters] objectForKey: serviceItem]; service = [[manager filters] objectForKey: serviceItem];
if (service == nil)
{
NSLog(@"No service matching '%@'", serviceItem);
return NO; /* No matching service. */
}
} }
else else
{ {
service = [[manager menuServices] objectForKey: serviceItem]; service = [[manager menuServices] objectForKey: serviceItem];
} if (service == nil)
if (service == nil) {
{ NSRunAlertPanel(nil,
NSRunAlertPanel(nil, @"No service matching '%@'",
@"No service matching '%@'", @"Continue", nil, nil,
@"Continue", nil, nil, serviceItem);
serviceItem); return NO; /* No matching service. */
return NO; /* No matching service. */ }
} }
port = [service objectForKey: @"NSPortName"]; port = [service objectForKey: @"NSPortName"];
@ -1358,6 +1363,10 @@ GSPerformService(NSString *serviceItem, NSPasteboard *pboard, BOOL isFilter)
appPath = [service objectForKey: @"ServicePath"]; appPath = [service objectForKey: @"ServicePath"];
userData = [service objectForKey: @"NSUserData"]; userData = [service objectForKey: @"NSUserData"];
message = [service objectForKey: @"NSMessage"]; message = [service objectForKey: @"NSMessage"];
if (isFilter == YES && [message length] == 0)
{
message = [service objectForKey: @"NSFilter"];
}
selName = [message stringByAppendingString: @":userData:error:"]; selName = [message stringByAppendingString: @":userData:error:"];
/* /*
@ -1367,10 +1376,17 @@ GSPerformService(NSString *serviceItem, NSPasteboard *pboard, BOOL isFilter)
provider = GSContactApplication(appPath, port, finishBy); provider = GSContactApplication(appPath, port, finishBy);
if (provider == nil) if (provider == nil)
{ {
NSRunAlertPanel(nil, if (isFilter == YES)
@"Failed to contact service provider for '%@'", {
@"Continue", nil, nil, NSLog(@"Failed to contact service provider for '%@'", serviceItem);
serviceItem); }
else
{
NSRunAlertPanel(nil,
@"Failed to contact service provider for '%@'",
@"Continue", nil, nil,
serviceItem);
}
return NO; return NO;
} }
@ -1406,10 +1422,18 @@ GSPerformService(NSString *serviceItem, NSPasteboard *pboard, BOOL isFilter)
if (error != nil) if (error != nil)
{ {
NSRunAlertPanel(nil, if (isFilter == YES)
@"Failed to contact service provider for '%@': %@", {
@"Continue", nil, nil, NSLog(@"Failed to contact service provider for '%@': %@",
serviceItem, error); serviceItem, error);
}
else
{
NSRunAlertPanel(nil,
@"Failed to contact service provider for '%@': %@",
@"Continue", nil, nil,
serviceItem, error);
}
return NO; return NO;
} }

View file

@ -971,7 +971,10 @@ static NSMapTable *mimeMap = NULL;
* pasteboard server using the -setData:forType: method. * pasteboard server using the -setData:forType: method.
* </p> * </p>
* <p>Data written using this method can be read by -propertyListForType: * <p>Data written using this method can be read by -propertyListForType:
* or, of it was a simple string, by -stringForType: * or, if it was a simple string, by -stringForType:
* </p>
* <p>If the data is retrieved using -dataForType: then it needs to be
* deserialized into a property list.
* </p> * </p>
*/ */
- (BOOL) setPropertyList: (id)propertyList - (BOOL) setPropertyList: (id)propertyList
@ -989,6 +992,9 @@ static NSMapTable *mimeMap = NULL;
* <p>The data may subsequently be read from the reciver using the * <p>The data may subsequently be read from the reciver using the
* -stringForType: or -propertyListForType: method. * -stringForType: or -propertyListForType: method.
* </p> * </p>
* <p>If the data is retrieved using -dataForType: then it needs to be
* deserialized into a property list.
* </p>
*/ */
- (BOOL) setString: (NSString*)string - (BOOL) setString: (NSString*)string
forType: (NSString*)dataType forType: (NSString*)dataType
@ -1006,6 +1012,9 @@ static NSMapTable *mimeMap = NULL;
* <p>Data written to a pasteboard by this method should be read using * <p>Data written to a pasteboard by this method should be read using
* the -readFileContentsType:toFile: or -readFileWrapper method. * the -readFileContentsType:toFile: or -readFileWrapper method.
* </p> * </p>
* <p>If the data is retrieved using -dataForType: then it needs to be
* deserialized by the NSFileWrapper class.
* </p>
*/ */
- (BOOL) writeFileContents: (NSString*)filename - (BOOL) writeFileContents: (NSString*)filename
{ {
@ -1062,6 +1071,9 @@ static NSMapTable *mimeMap = NULL;
* <p>Data written to a pasteboard by this method should be read using * <p>Data written to a pasteboard by this method should be read using
* the -readFileContentsType:toFile: or -readFileWrapper method. * the -readFileContentsType:toFile: or -readFileWrapper method.
* </p> * </p>
* <p>If the data is retrieved using -dataForType: then it needs to be
* deserialized by the NSFileWrapper class.
* </p>
*/ */
- (BOOL) writeFileWrapper: (NSFileWrapper *)wrapper - (BOOL) writeFileWrapper: (NSFileWrapper *)wrapper
{ {

View file

@ -29,10 +29,13 @@ include ../config.make
include ../Version include ../Version
SUBPROJECTS = $(BUILD_GSND) SUBPROJECTS = $(BUILD_GSND)
APP_NAME = md5Digest
TOOL_NAME = make_services set_show_service gopen TOOL_NAME = make_services set_show_service gopen
SERVICE_NAME = example GSspell SERVICE_NAME = example GSspell
# The source files to be compiled # The source files to be compiled
md5Digest_OBJC_FILES = md5Digest.m
gopen_OBJC_FILES = gopen.m gopen_OBJC_FILES = gopen.m
make_services_OBJC_FILES = make_services.m make_services_OBJC_FILES = make_services.m
@ -49,6 +52,7 @@ include GNUmakefile.preamble
GNUSTEP_MAKE_SERVICES=./$(GNUSTEP_OBJ_DIR)/make_services GNUSTEP_MAKE_SERVICES=./$(GNUSTEP_OBJ_DIR)/make_services
include $(GNUSTEP_MAKEFILES)/application.make
include $(GNUSTEP_MAKEFILES)/tool.make include $(GNUSTEP_MAKEFILES)/tool.make
include $(GNUSTEP_MAKEFILES)/service.make include $(GNUSTEP_MAKEFILES)/service.make
include $(GNUSTEP_MAKEFILES)/aggregate.make include $(GNUSTEP_MAKEFILES)/aggregate.make

View file

@ -1,7 +1,7 @@
NSServices = ( NSServices = (
{ {
NSPortName = ExampleServices; NSPortName = ExampleServices;
NSFilter = "md5"; NSFilter = md5;
NSSendTypes = ( NSSendTypes = (
NSStringPboardType NSStringPboardType
); );

View file

@ -38,8 +38,7 @@
int int
main(int argc, char** argv, char **env_c) main(int argc, char** argv, char **env_c)
{ {
NSAutoreleasePool *pool; CREATE_AUTORELEASE_POOL(pool);
NSArray *arguments = nil;
NSEnumerator *argEnumerator = nil; NSEnumerator *argEnumerator = nil;
NSWorkspace *workspace = nil; NSWorkspace *workspace = nil;
NSFileManager *fm = nil; NSFileManager *fm = nil;
@ -56,14 +55,15 @@ main(int argc, char** argv, char **env_c)
#ifdef GS_PASS_ARGUMENTS #ifdef GS_PASS_ARGUMENTS
[NSProcessInfo initializeWithArguments:argv count:argc environment:env_c]; [NSProcessInfo initializeWithArguments:argv count:argc environment:env_c];
#endif #endif
pool = [NSAutoreleasePool new];
argEnumerator = [[[NSProcessInfo processInfo] arguments] objectEnumerator]; argEnumerator = [[[NSProcessInfo processInfo] arguments] objectEnumerator];
workspace = [NSWorkspace sharedWorkspace]; workspace = [NSWorkspace sharedWorkspace];
fm = [NSFileManager defaultManager]; fm = [NSFileManager defaultManager];
// Default applications for opening unregistered file types.... // Default applications for opening unregistered file types....
editor = [[NSUserDefaults standardUserDefaults] stringForKey: @"GSDefaultEditor"]; editor = [[NSUserDefaults standardUserDefaults]
terminal = [[NSUserDefaults standardUserDefaults] stringForKey: @"GSDefaultTerminal"]; stringForKey: @"GSDefaultEditor"];
terminal = [[NSUserDefaults standardUserDefaults]
stringForKey: @"GSDefaultTerminal"];
// Process options... // Process options...
application = [[NSUserDefaults standardUserDefaults] stringForKey: @"a"]; application = [[NSUserDefaults standardUserDefaults] stringForKey: @"a"];
@ -71,32 +71,34 @@ main(int argc, char** argv, char **env_c)
filetoprint = [[NSUserDefaults standardUserDefaults] stringForKey: @"p"]; filetoprint = [[NSUserDefaults standardUserDefaults] stringForKey: @"p"];
nxhost = [[NSUserDefaults standardUserDefaults] stringForKey: @"NXHost"]; nxhost = [[NSUserDefaults standardUserDefaults] stringForKey: @"NXHost"];
if(application) if (application)
{ {
[workspace launchApplication: application]; [workspace launchApplication: application];
} }
if(filetoopen) if (filetoopen)
{ {
[workspace openFile: filetoopen]; [workspace openFile: filetoopen];
} }
if(filetoprint) if (filetoprint)
{ {
puts("Not implemented"); puts("Not implemented");
} }
if(nxhost) if (nxhost)
{ {
puts("Not implemented"); puts("Not implemented");
} }
if(argc == 1) if (argc == 1)
{ {
NSFileHandle *fh = [NSFileHandle fileHandleWithStandardInput]; NSFileHandle *fh = [NSFileHandle fileHandleWithStandardInput];
NSData *data = [fh readDataToEndOfFile]; NSData *data = [fh readDataToEndOfFile];
NSString *tempFile = [NSTemporaryDirectory() stringByAppendingPathComponent: @"openfiletmp"]; NSString *tempFile = [NSTemporaryDirectory()
NSNumber *processId = [NSNumber numberWithInt: [[NSProcessInfo processInfo] processIdentifier]]; stringByAppendingPathComponent: @"openfiletmp"];
NSNumber *processId = [NSNumber numberWithInt:
[[NSProcessInfo processInfo] processIdentifier]];
tempFile = [tempFile stringByAppendingString: [processId stringValue]]; tempFile = [tempFile stringByAppendingString: [processId stringValue]];
tempFile = [tempFile stringByAppendingString: @".txt"]; tempFile = [tempFile stringByAppendingString: @".txt"];
@ -105,27 +107,26 @@ main(int argc, char** argv, char **env_c)
} }
[argEnumerator nextObject]; // skip the first element, which is empty. [argEnumerator nextObject]; // skip the first element, which is empty.
while((arg = [argEnumerator nextObject]) != nil) while ((arg = [argEnumerator nextObject]) != nil)
{ {
NSString *ext = [arg pathExtension]; NSString *ext = [arg pathExtension];
NSString *appName = nil;
if( [arg isEqualToString: @"-a"] ) if ([arg isEqualToString: @"-a"])
{ {
// skip since this is handled above... // skip since this is handled above...
arg = [argEnumerator nextObject]; arg = [argEnumerator nextObject];
} }
else if( [arg isEqualToString: @"-o"] ) else if ([arg isEqualToString: @"-o"])
{ {
// skip since this is handled above... // skip since this is handled above...
arg = [argEnumerator nextObject]; arg = [argEnumerator nextObject];
} }
else if( [arg isEqualToString: @"-p"] ) else if ([arg isEqualToString: @"-p"])
{ {
// skip since this is handled above... // skip since this is handled above...
arg = [argEnumerator nextObject]; arg = [argEnumerator nextObject];
} }
else if( [arg isEqualToString: @"-NXHost"] ) else if ([arg isEqualToString: @"-NXHost"])
{ {
// skip since this is handled above... // skip since this is handled above...
arg = [argEnumerator nextObject]; arg = [argEnumerator nextObject];
@ -133,54 +134,59 @@ main(int argc, char** argv, char **env_c)
else // no option specified else // no option specified
{ {
NS_DURING NS_DURING
BOOL isDir = NO, exists = NO; {
BOOL isDir = NO, exists = NO;
exists = [fm fileExistsAtPath: arg isDirectory: &isDir]; exists = [fm fileExistsAtPath: arg isDirectory: &isDir];
if( exists && !isDir && [fm isExecutableFileAtPath: arg] ) if (exists && !isDir && [fm isExecutableFileAtPath: arg])
{ {
[workspace openFile: arg withApplication: terminal]; [workspace openFile: arg withApplication: terminal];
} }
else // no argument specified else // no argument specified
{ {
// First check to see if it's an application // First check to see if it's an application
if( [ext isEqualToString: @"app"] || if ([ext isEqualToString: @"app"] ||
[ext isEqualToString: @"debug"] || [ext isEqualToString: @"debug"] ||
[ext isEqualToString: @"profile"] ) [ext isEqualToString: @"profile"])
{
NSString *appName =
[[arg lastPathComponent] stringByDeletingPathExtension];
NSString *executable =
[arg stringByAppendingPathComponent: appName];
NSTask *task = nil;
if([fm fileExistsAtPath: arg])
{
if ([NSTask launchedTaskWithLaunchPath: executable
arguments: nil] == nil)
{
NSLog(@"Unable to launch: %@",arg);
}
}
else
{
[workspace launchApplication: arg];
}
}
else
if( ![workspace openFile: arg] )
{ {
// no recognized extension, NSString *appName =
// run application indicated by environment var. [[arg lastPathComponent] stringByDeletingPathExtension];
NSLog(@"Opening %@ with %@",arg,editor); NSString *executable =
[workspace openFile: arg withApplication: editor]; [arg stringByAppendingPathComponent: appName];
if ([fm fileExistsAtPath: arg])
{
if ([NSTask launchedTaskWithLaunchPath: executable
arguments: nil] == nil)
{
NSLog(@"Unable to launch: %@",arg);
}
}
else
{
[workspace launchApplication: arg];
}
} }
} else
NS_HANDLER {
if (![workspace openFile: arg])
{
// no recognized extension,
// run application indicated by environment var.
NSLog(@"Opening %@ with %@",arg,editor);
[workspace openFile: arg withApplication: editor];
}
}
}
}
NS_HANDLER
{
NSLog(@"Exception while attempting open file %@ - %@: %@", NSLog(@"Exception while attempting open file %@ - %@: %@",
arg, [localException name], [localException reason]); arg, [localException name], [localException reason]);
NS_ENDHANDLER }
} NS_ENDHANDLER
}
} }
[pool release]; RELEASE(pool);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }

View file

@ -86,7 +86,7 @@ main(int argc, char** argv, char **env_c)
proc = [NSProcessInfo processInfo]; proc = [NSProcessInfo processInfo];
if (proc == nil) if (proc == nil)
{ {
NSLog(@"unable to get process information!\n"); NSLog(@"unable to get process information!");
[pool release]; [pool release];
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }
@ -141,12 +141,12 @@ main(int argc, char** argv, char **env_c)
} }
else else
{ {
NSLog(@"bad info - %@\n", file); NSLog(@"bad info - %@", file);
} }
} }
else else
{ {
NSLog(@"bad info - %@\n", file); NSLog(@"bad info - %@", file);
} }
} }
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
@ -196,7 +196,7 @@ main(int argc, char** argv, char **env_c)
{ {
if ([mgr createDirectoryAtPath: usrRoot attributes: nil] == NO) if ([mgr createDirectoryAtPath: usrRoot attributes: nil] == NO)
{ {
NSLog(@"couldn't create %@\n", usrRoot); NSLog(@"couldn't create %@", usrRoot);
[pool release]; [pool release];
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -209,7 +209,7 @@ main(int argc, char** argv, char **env_c)
{ {
if ([mgr createDirectoryAtPath: usrRoot attributes: nil] == NO) if ([mgr createDirectoryAtPath: usrRoot attributes: nil] == NO)
{ {
NSLog(@"couldn't create %@\n", usrRoot); NSLog(@"couldn't create %@", usrRoot);
[pool release]; [pool release];
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -306,7 +306,7 @@ main(int argc, char** argv, char **env_c)
data = [NSSerializer serializePropertyList: fullMap]; data = [NSSerializer serializePropertyList: fullMap];
if ([data writeToFile: str atomically: YES] == NO) if ([data writeToFile: str atomically: YES] == NO)
{ {
NSLog(@"couldn't write %@\n", str); NSLog(@"couldn't write %@", str);
[pool release]; [pool release];
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -329,7 +329,7 @@ main(int argc, char** argv, char **env_c)
data = [NSSerializer serializePropertyList: applicationMap]; data = [NSSerializer serializePropertyList: applicationMap];
if ([data writeToFile: str atomically: YES] == NO) if ([data writeToFile: str atomically: YES] == NO)
{ {
NSLog(@"couldn't write %@\n", str); NSLog(@"couldn't write %@", str);
[pool release]; [pool release];
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -358,7 +358,7 @@ static void addExtensionsForApplication(NSDictionary *info, NSString *app)
{ {
if ([o0 isKindOfClass: aClass] == NO) if ([o0 isKindOfClass: aClass] == NO)
{ {
NSLog(@"bad app NSTypes (not an array) - %@\n", app); NSLog(@"bad app NSTypes (not an array) - %@", app);
return; return;
} }
a0 = (NSArray*)o0; a0 = (NSArray*)o0;
@ -372,7 +372,7 @@ static void addExtensionsForApplication(NSDictionary *info, NSString *app)
if ([o1 isKindOfClass: dClass] == NO) if ([o1 isKindOfClass: dClass] == NO)
{ {
NSLog(@"bad app NSTypes (type not a dictionary) - %@\n", app); NSLog(@"bad app NSTypes (type not a dictionary) - %@", app);
return; return;
} }
/* /*
@ -386,7 +386,7 @@ static void addExtensionsForApplication(NSDictionary *info, NSString *app)
} }
if ([o1 isKindOfClass: aClass] == NO) if ([o1 isKindOfClass: aClass] == NO)
{ {
NSLog(@"bad app NSType (extensions not an array) - %@\n", app); NSLog(@"bad app NSType (extensions not an array) - %@", app);
return; return;
} }
a1 = (NSArray*)o1; a1 = (NSArray*)o1;
@ -399,7 +399,7 @@ static void addExtensionsForApplication(NSDictionary *info, NSString *app)
e = [[a1 objectAtIndex: j] lowercaseString]; e = [[a1 objectAtIndex: j] lowercaseString];
if ([e length] == 0) if ([e length] == 0)
{ {
NSLog(@"Illegal (nul) extension ignored for - %@\n", app); NSLog(@"Illegal (nul) extension ignored for - %@", app);
return; return;
} }
d = [extensionsMap objectForKey: e]; d = [extensionsMap objectForKey: e];
@ -426,7 +426,7 @@ static void addExtensionsForApplication(NSDictionary *info, NSString *app)
} }
if ([o0 isKindOfClass: dClass] == NO) if ([o0 isKindOfClass: dClass] == NO)
{ {
NSLog(@"bad app NSExtensions (not a dictionary) - %@\n", app); NSLog(@"bad app NSExtensions (not a dictionary) - %@", app);
return; return;
} }
extensions = (NSDictionary *) o0; extensions = (NSDictionary *) o0;
@ -440,7 +440,8 @@ static void addExtensionsForApplication(NSDictionary *info, NSString *app)
if ([tmp isKindOfClass: dClass] == NO) if ([tmp isKindOfClass: dClass] == NO)
{ {
NSLog(@"bad app NSExtensions (value isn't a dictionary) - %@\n", app); NSLog(@"bad app NSExtensions (value isn't a dictionary) - %@",
app);
continue; continue;
} }
name = [[a0 objectAtIndex: i] lowercaseString]; name = [[a0 objectAtIndex: i] lowercaseString];
@ -496,7 +497,7 @@ scanDirectory(NSMutableDictionary *services, NSString *path)
* this name, we skip this one - the first one takes * this name, we skip this one - the first one takes
* precedence. * precedence.
*/ */
NSLog(@"duplicate app (%@) at '%@' and '%@'\n", NSLog(@"duplicate app (%@) at '%@' and '%@'",
name, oldPath, newPath); name, oldPath, newPath);
continue; continue;
} }
@ -526,12 +527,12 @@ scanDirectory(NSMutableDictionary *services, NSString *path)
} }
else else
{ {
NSLog(@"bad app info - %@\n", newPath); NSLog(@"bad app info - %@", newPath);
} }
} }
else else
{ {
NSLog(@"bad application - %@\n", newPath); NSLog(@"bad application - %@", newPath);
} }
} }
else if (ext != nil && [ext isEqualToString: @"service"]) else if (ext != nil && [ext isEqualToString: @"service"])
@ -560,17 +561,17 @@ scanDirectory(NSMutableDictionary *services, NSString *path)
} }
else else
{ {
NSLog(@"missing info - %@\n", newPath); NSLog(@"missing info - %@", newPath);
} }
} }
else else
{ {
NSLog(@"bad service info - %@\n", newPath); NSLog(@"bad service info - %@", newPath);
} }
} }
else else
{ {
NSLog(@"bad services bundle - %@\n", newPath); NSLog(@"bad services bundle - %@", newPath);
} }
} }
else else
@ -631,7 +632,7 @@ scanDynamic(NSMutableDictionary *services, NSString *path)
} }
else else
{ {
NSLog(@"bad app info - %@\n", infPath); NSLog(@"bad app info - %@", infPath);
} }
} }
[arp release]; [arp release];
@ -646,7 +647,7 @@ validateEntry(id svcs, NSString *path)
if ([svcs isKindOfClass: aClass] == NO) if ([svcs isKindOfClass: aClass] == NO)
{ {
NSLog(@"NSServices entry not an array - %@\n", path); NSLog(@"NSServices entry not an array - %@", path);
return nil; return nil;
} }
@ -670,7 +671,7 @@ validateEntry(id svcs, NSString *path)
} }
else else
{ {
NSLog(@"NSServices entry %u not a dictionary - %@\n", NSLog(@"NSServices entry %u not a dictionary - %@",
pos, path); pos, path);
} }
} }
@ -722,7 +723,7 @@ validateService(NSDictionary *service, NSString *path, unsigned pos)
if (type == nil) if (type == nil)
{ {
NSLog(@"NSServices entry %u spurious field (%@)- %@\n", pos, k, path); NSLog(@"NSServices entry %u spurious field (%@)- %@", pos, k, path);
} }
else else
{ {
@ -732,7 +733,7 @@ validateService(NSDictionary *service, NSString *path, unsigned pos)
if ([obj isKindOfClass: sClass] == NO) if ([obj isKindOfClass: sClass] == NO)
{ {
NSLog(@"NSServices entry %u field %@ is not a string " NSLog(@"NSServices entry %u field %@ is not a string "
@"- %@\n", pos, k, path); @"- %@", pos, k, path);
return nil; return nil;
} }
[result setObject: obj forKey: k]; [result setObject: obj forKey: k];
@ -744,14 +745,14 @@ validateService(NSDictionary *service, NSString *path, unsigned pos)
if ([obj isKindOfClass: aClass] == NO) if ([obj isKindOfClass: aClass] == NO)
{ {
NSLog(@"NSServices entry %u field %@ is not an array " NSLog(@"NSServices entry %u field %@ is not an array "
@"- %@\n", pos, k, path); @"- %@", pos, k, path);
return nil; return nil;
} }
a = (NSArray*)obj; a = (NSArray*)obj;
if ([a count] == 0) if ([a count] == 0)
{ {
NSLog(@"NSServices entry %u field %@ is an empty array " NSLog(@"NSServices entry %u field %@ is an empty array "
@"- %@\n", pos, k, path); @"- %@", pos, k, path);
} }
else else
{ {
@ -762,7 +763,7 @@ validateService(NSDictionary *service, NSString *path, unsigned pos)
if ([[a objectAtIndex: i] isKindOfClass: sClass] == NO) if ([[a objectAtIndex: i] isKindOfClass: sClass] == NO)
{ {
NSLog(@"NSServices entry %u field %@ element %u is " NSLog(@"NSServices entry %u field %@ element %u is "
@"not a string - %@\n", pos, k, i, path); @"not a string - %@", pos, k, i, path);
return nil; return nil;
} }
} }
@ -776,14 +777,14 @@ validateService(NSDictionary *service, NSString *path, unsigned pos)
if ([obj isKindOfClass: dClass] == NO) if ([obj isKindOfClass: dClass] == NO)
{ {
NSLog(@"NSServices entry %u field %@ is not a dictionary " NSLog(@"NSServices entry %u field %@ is not a dictionary "
@"- %@\n", pos, k, path); @"- %@", pos, k, path);
return nil; return nil;
} }
d = (NSDictionary*)obj; d = (NSDictionary*)obj;
if ([d objectForKey: @"default"] == nil) if ([d objectForKey: @"default"] == nil)
{ {
NSLog(@"NSServices entry %u field %@ has no default value " NSLog(@"NSServices entry %u field %@ has no default value "
@"- %@\n", pos, k, path); @"- %@", pos, k, path);
} }
else else
{ {
@ -794,7 +795,7 @@ validateService(NSDictionary *service, NSString *path, unsigned pos)
if ([obj isKindOfClass: sClass] == NO) if ([obj isKindOfClass: sClass] == NO)
{ {
NSLog(@"NSServices entry %u field %@ contains " NSLog(@"NSServices entry %u field %@ contains "
@"non-string value - %@\n", pos, k, path); @"non-string value - %@", pos, k, path);
return nil; return nil;
} }
} }
@ -812,7 +813,53 @@ validateService(NSDictionary *service, NSString *path, unsigned pos)
/* /*
* Now check that we have the required fields for the service. * Now check that we have the required fields for the service.
*/ */
if ((obj = [result objectForKey: @"NSMessage"]) != nil) if ((obj = [result objectForKey: @"NSFilter"]) != nil)
{
NSDictionary *inf;
NSString *str;
NSArray *snd;
NSArray *ret;
str = [result objectForKey: @"NSInputMechanism"];
if (str)
{
if ([str isEqualToString: @"NSUnixStdio"] == NO
&& [str isEqualToString: @"NSMapFile"] == NO
&& [str isEqualToString: @"NSIdentity"] == NO)
{
NSLog(@"NSServices entry %u bad input mechanism - %@", pos, path);
return nil;
}
}
else
{
if ([result objectForKey: @"NSPortName"] == nil)
{
NSLog(@"NSServices entry %u NSPortName missing - %@", pos, path);
return nil;
}
}
snd = [result objectForKey: @"NSSendTypes"];
ret = [result objectForKey: @"NSReturnTypes"];
if (snd == nil || ret == nil)
{
NSLog(@"NSServices entry %u types missing - %@", pos, path);
return nil;
}
inf = [filterMap objectForKey: obj];
if (inf != nil)
{
if (verbose)
{
NSLog(@"Ignoring duplicate %u in %@ -\n%@", pos, path, result);
}
return nil;
}
[filterMap setObject: result forKey: obj];
}
else if ((obj = [result objectForKey: @"NSMessage"]) != nil)
{ {
NSDictionary *item; NSDictionary *item;
NSEnumerator *e; NSEnumerator *e;
@ -821,18 +868,18 @@ validateService(NSDictionary *service, NSString *path, unsigned pos)
if ([result objectForKey: @"NSPortName"] == nil) if ([result objectForKey: @"NSPortName"] == nil)
{ {
NSLog(@"NSServices entry %u NSPortName missing - %@\n", pos, path); NSLog(@"NSServices entry %u NSPortName missing - %@", pos, path);
return nil; return nil;
} }
if ([result objectForKey: @"NSSendTypes"] == nil && if ([result objectForKey: @"NSSendTypes"] == nil &&
[result objectForKey: @"NSReturnTypes"] == nil) [result objectForKey: @"NSReturnTypes"] == nil)
{ {
NSLog(@"NSServices entry %u types missing - %@\n", pos, path); NSLog(@"NSServices entry %u types missing - %@", pos, path);
return nil; return nil;
} }
if ((item = [result objectForKey: @"NSMenuItem"]) == nil) if ((item = [result objectForKey: @"NSMenuItem"]) == nil)
{ {
NSLog(@"NSServices entry %u NSMenuItem missing - %@\n", pos, path); NSLog(@"NSServices entry %u NSMenuItem missing - %@", pos, path);
return nil; return nil;
} }
@ -862,76 +909,11 @@ validateService(NSDictionary *service, NSString *path, unsigned pos)
{ {
if (verbose) if (verbose)
{ {
NSLog(@"Ignoring entry %u in %@ -\n%@\n", pos, path, result); NSLog(@"Ignoring entry %u in %@ -\n%@", pos, path, result);
} }
return nil; /* Ignore - already got service with this name */ return nil; /* Ignore - already got service with this name */
} }
} }
else if ((obj = [result objectForKey: @"NSFilter"]) != nil)
{
NSString *str;
NSArray *snd;
NSArray *ret;
unsigned spos;
BOOL used = NO;
str = [result objectForKey: @"NSInputMechanism"];
if (str)
{
if ([str isEqualToString: @"NSUnixStdio"] == NO &&
[str isEqualToString: @"NSMapFile"] == NO &&
[str isEqualToString: @"NSIdentity"] == NO)
{
NSLog(@"NSServices entry %u bad input mechanism - %@\n", pos, path);
return nil;
}
}
snd = [result objectForKey: @"NSSendTypes"];
ret = [result objectForKey: @"NSReturnTypes"];
if (snd == nil || ret == nil)
{
NSLog(@"NSServices entry %u types missing - %@\n", pos, path);
return nil;
}
/*
* For each send-type/return-type combination, see if we
* already have a filter - if so - ignore this one.
*/
spos = [snd count];
while (spos-- > 0)
{
NSString *stype = [snd objectAtIndex: spos];
NSMutableDictionary *sdict = [filterMap objectForKey: stype];
unsigned rpos;
if (sdict == nil)
{
sdict = [NSMutableDictionary dictionaryWithCapacity: [snd count]];
[filterMap setObject: sdict forKey: stype];
}
rpos = [ret count];
while (rpos-- > 0)
{
NSString *rtype = [ret objectAtIndex: rpos];
if ([sdict objectForKey: rtype] == nil)
{
[sdict setObject: result forKey: rtype];
used = YES;
}
}
}
if (used == NO)
{
if (verbose)
{
NSLog(@"Ignoring entry %u in %@ -\n%@\n", pos, path, result);
}
return nil; /* Ignore - already got filter for types. */
}
}
else if ((obj = [result objectForKey: @"NSPrintFilter"]) != nil) else if ((obj = [result objectForKey: @"NSPrintFilter"]) != nil)
{ {
NSDictionary *item; NSDictionary *item;
@ -941,7 +923,7 @@ validateService(NSDictionary *service, NSString *path, unsigned pos)
if ((item = [result objectForKey: @"NSMenuItem"]) == nil) if ((item = [result objectForKey: @"NSMenuItem"]) == nil)
{ {
NSLog(@"NSServices entry %u NSMenuItem missing - %@\n", pos, path); NSLog(@"NSServices entry %u NSMenuItem missing - %@", pos, path);
return nil; return nil;
} }
/* /*
@ -970,7 +952,7 @@ validateService(NSDictionary *service, NSString *path, unsigned pos)
{ {
if (verbose) if (verbose)
{ {
NSLog(@"Ignoring entry %u in %@ -\n%@\n", pos, path, result); NSLog(@"Ignoring entry %u in %@ -\n%@", pos, path, result);
} }
return nil; /* Ignore - already got filter with this name */ return nil; /* Ignore - already got filter with this name */
} }
@ -983,7 +965,7 @@ validateService(NSDictionary *service, NSString *path, unsigned pos)
if ((item = [result objectForKey: @"NSLanguages"]) == nil) if ((item = [result objectForKey: @"NSLanguages"]) == nil)
{ {
NSLog(@"NSServices entry %u NSLanguages missing - %@\n", pos, path); NSLog(@"NSServices entry %u NSLanguages missing - %@", pos, path);
return nil; return nil;
} }
/* /*
@ -1005,14 +987,14 @@ validateService(NSDictionary *service, NSString *path, unsigned pos)
{ {
if (verbose) if (verbose)
{ {
NSLog(@"Ignoring entry %u in %@ -\n%@\n", pos, path, result); NSLog(@"Ignoring entry %u in %@ -\n%@", pos, path, result);
} }
return nil; /* Ignore - already got speller with language. */ return nil; /* Ignore - already got speller with language. */
} }
} }
else else
{ {
NSLog(@"NSServices entry %u unknown service/filter - %@\n", pos, path); NSLog(@"NSServices entry %u unknown service/filter - %@", pos, path);
return nil; return nil;
} }

56
Tools/md5Digest.m Normal file
View file

@ -0,0 +1,56 @@
/* This tool creates an md5 digest using the example filter
based on what type of file is being accessed.
Copyright (C) 2003 Free Software Foundation, Inc.
Written by: Rrichard Frith-Macdonald <rfm@gnu.org>
Created: June 2003
This file is part of the GNUstep Project
This library 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.
You should have received a copy of the GNU General Public
License along with this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <Foundation/NSAutoreleasePool.h>
#include <Foundation/NSData.h>
#include <Foundation/NSFileHandle.h>
#include <Foundation/NSProcessInfo.h>
#include <Foundation/NSString.h>
#include <AppKit/NSPasteboard.h>
int
main(int argc, char** argv, char **env_c)
{
CREATE_AUTORELEASE_POOL(pool);
NSFileHandle *fh;
NSData *data;
NSString *string;
NSPasteboard *pb;
#ifdef GS_PASS_ARGUMENTS
[NSProcessInfo initializeWithArguments:argv count:argc environment:env_c];
#endif
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);
RELEASE(pool);
exit(EXIT_SUCCESS);
}