diff --git a/ChangeLog b/ChangeLog index ca4edac20..0cc650160 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2011-07-27 Wolfgang Sourdeau + + * OpenChange/plreader.m: new test tool to dump property lists + independently from their serialization format. + 2011-07-27 Francis Lachapelle * SoObjects/SOGo/SOGoUserFolder.m (-ownerInContext:): in case the diff --git a/OpenChange/GNUmakefile b/OpenChange/GNUmakefile index cda60674a..f1a6d55d5 100644 --- a/OpenChange/GNUmakefile +++ b/OpenChange/GNUmakefile @@ -115,6 +115,13 @@ $(SOGOBACKEND)_OBJC_FILES += \ $(SOGOBACKEND)_RESOURCE_FILES += \ product.plist +### pl reader +PLREADER_TOOL = plreader +$(PLREADER_TOOL)_OBJC_FILES += \ + plreader.m \ + +TEST_TOOL_NAME += $(PLREADER_TOOL) + ### cflags and libs LIBMAPI_CFLAGS = $(shell pkg-config libmapi --cflags) LIBMAPISTORE_CFLAGS = $(shell pkg-config libmapistore --cflags) @@ -145,6 +152,7 @@ SAMBA_LIB_DIR = $(shell pkg-config libmapistore --variable=libdir) -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/bundle.make include $(GNUSTEP_MAKEFILES)/library.make +include $(GNUSTEP_MAKEFILES)/test-tool.make -include GNUmakefile.postamble endif diff --git a/OpenChange/plreader.m b/OpenChange/plreader.m new file mode 100644 index 000000000..bb76685b9 --- /dev/null +++ b/OpenChange/plreader.m @@ -0,0 +1,191 @@ +/* plreader.m - this file is part of SOGo + * + * Copyright (C) 2011 Inverse inc + * + * Author: Wolfgang Sourdeau + * + * This file 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, or (at your option) + * any later version. + * + * This file 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* A format-agnostic property list dumper. + Usage: plreader [filename] */ + +#import +#import +#import +#import +#import +#import +#import +#import + +const char *indentationStep = " "; + +@interface NSObject (plext) + +- (void) displayWithIndentation: (NSInteger) anInt; + +@end + +@implementation NSObject (plext) + +- (void) _outputIndentation: (NSInteger) anInt +{ + NSInteger i; + + for (i = 0; i < anInt; i++) + printf ("%s", indentationStep); +} + +- (void) displayWithIndentation: (NSInteger) anInt +{ + [self _outputIndentation: anInt]; + printf ("(%s) %s\n", + [NSStringFromClass (isa) UTF8String], + [[self description] UTF8String]); +} + +@end + +@implementation NSDictionary (plext) + +- (void) displayKey: (NSString *) key + withIndentation: (NSInteger) anInt +{ + [self _outputIndentation: anInt]; + printf ("%s =\n", + [[key description] UTF8String]); +} + +- (void) displayWithIndentation: (NSInteger) anInt +{ + NSUInteger i, max; + NSArray *keys; + NSInteger subIndent; + NSString *key; + + keys = [self allKeys]; + max = [keys count]; + + [self _outputIndentation: anInt]; + printf ("{ (%ld) items\n", max); + + subIndent = anInt + 1; + + for (i = 0; i < max; i++) + { + key = [keys objectAtIndex: i]; + [self displayKey: key withIndentation: subIndent]; + [[self objectForKey: key] displayWithIndentation: subIndent + 1]; + } + + [self _outputIndentation: anInt]; + printf ("}\n"); +} + +@end + +@implementation NSArray (plext) + +- (void) displayCount: (NSUInteger) count + withIndentation: (NSInteger) anInt +{ + [self _outputIndentation: anInt]; + printf ("%lu =\n", count); +} + +- (void) displayWithIndentation: (NSInteger) anInt +{ + NSUInteger i, max; + NSInteger subIndent; + + max = [self count]; + + [self _outputIndentation: anInt]; + printf ("[ (%ld) items\n", max); + + subIndent = anInt + 1; + + for (i = 0; i < max; i++) + { + [self displayCount: i withIndentation: subIndent]; + [[self objectAtIndex: i] displayWithIndentation: subIndent + 1]; + } + + [self _outputIndentation: anInt]; + printf ("]\n"); +} + +@end + +static void +PLReaderDumpPListFile (NSString *filename) +{ + NSData *content; + NSDictionary *d; + NSPropertyListFormat format; + NSString *error = nil; + const char *formatName; + + content = [NSData dataWithContentsOfFile: filename]; + d = [NSPropertyListSerialization propertyListFromData: content + mutabilityOption: NSPropertyListImmutable + format: &format + errorDescription: &error]; + if (error) + printf ("an error occurred: %s\n", [error UTF8String]); + else + { + switch (format) + { + case NSPropertyListOpenStepFormat: + formatName = "OpenStep"; + break; + case NSPropertyListXMLFormat_v1_0: + formatName = "XML"; + break; + case NSPropertyListBinaryFormat_v1_0: + formatName = "Binary"; + break; + case NSPropertyListGNUstepFormat: + formatName = "GNUstep"; + break; + case NSPropertyListGNUstepBinaryFormat: + formatName = "GNUstep binary"; + break; + default: formatName = "unknown"; + } + + printf ("File format is: %s\n", formatName); + [d displayWithIndentation: 0]; + } +} + +int main() +{ + NSAutoreleasePool *p; + NSProcessInfo *pi; + NSArray *arguments; + + p = [NSAutoreleasePool new]; + pi = [NSProcessInfo processInfo]; + arguments = [pi arguments]; + if ([arguments count] > 1) + PLReaderDumpPListFile ([arguments objectAtIndex: 1]); + [p release]; + + return 0; +}