1996-01-26 02:57:43 +00:00
|
|
|
|
/* A demonstration of writing and reading with NSArchiver */
|
|
|
|
|
|
1996-02-22 15:04:01 +00:00
|
|
|
|
#if 1
|
1996-02-13 01:57:17 +00:00
|
|
|
|
|
1996-01-26 02:57:43 +00:00
|
|
|
|
#include <Foundation/NSArchiver.h>
|
|
|
|
|
#include <Foundation/NSString.h>
|
|
|
|
|
#include <Foundation/NSAutoreleasePool.h>
|
|
|
|
|
#include <Foundation/NSSet.h>
|
|
|
|
|
#include <Foundation/NSUtilities.h>
|
|
|
|
|
|
|
|
|
|
int main()
|
|
|
|
|
{
|
|
|
|
|
id set;
|
|
|
|
|
id arp;
|
1997-09-01 21:59:51 +00:00
|
|
|
|
id arc;
|
|
|
|
|
id una;
|
|
|
|
|
id xxx;
|
|
|
|
|
id apl;
|
|
|
|
|
|
|
|
|
|
[NSAutoreleasePool enableDoubleReleaseCheck:YES];
|
1996-01-26 02:57:43 +00:00
|
|
|
|
|
|
|
|
|
arp = [[NSAutoreleasePool alloc] init];
|
|
|
|
|
|
|
|
|
|
/* Create a Set of int's */
|
|
|
|
|
set = [[NSSet alloc] initWithObjects:
|
|
|
|
|
@"apple", @"banana", @"carrot", @"dal", @"escarole", @"fava", nil];
|
|
|
|
|
|
|
|
|
|
/* Display the set */
|
|
|
|
|
printf("Writing:\n");
|
|
|
|
|
{
|
|
|
|
|
id o, e = [set objectEnumerator];
|
|
|
|
|
while ((o = [e nextObject]))
|
1996-07-15 18:41:44 +00:00
|
|
|
|
printf("%s\n", [o cStringNoCopy]);
|
1996-01-26 02:57:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
1997-09-01 21:59:51 +00:00
|
|
|
|
apl = [[NSAutoreleasePool alloc] init];
|
|
|
|
|
arc = [[NSArchiver new] autorelease];
|
|
|
|
|
printf("%u\n", [arc retainCount]);
|
|
|
|
|
[arc retain];
|
|
|
|
|
printf("%u\n", [arc retainCount]);
|
|
|
|
|
[arc release];
|
|
|
|
|
printf("%u\n", [arc retainCount]);
|
|
|
|
|
[arc encodeRootObject: set];
|
|
|
|
|
/* Intentionally dodgy code - autorelease before init to see if init copes. */
|
|
|
|
|
una = [[[NSUnarchiver alloc] autorelease] initForReadingWithData: [arc archiverData]];
|
|
|
|
|
xxx = [una decodeObject];
|
|
|
|
|
[xxx release];
|
|
|
|
|
[apl release];
|
|
|
|
|
|
1996-01-26 02:57:43 +00:00
|
|
|
|
/* Write it to a file */
|
|
|
|
|
[NSArchiver archiveRootObject: set toFile: @"./nsarchiver.dat"];
|
|
|
|
|
|
|
|
|
|
/* Release the object that was coded */
|
|
|
|
|
[set release];
|
|
|
|
|
|
|
|
|
|
/* Read it back in from the file */
|
1996-02-13 01:57:17 +00:00
|
|
|
|
#if 1
|
|
|
|
|
{
|
|
|
|
|
id d = [[NSData alloc] initWithContentsOfFile:@"./nsarchiver.dat"];
|
|
|
|
|
id a = [NSUnarchiver alloc];
|
|
|
|
|
a = [a initForReadingWithData:d];
|
|
|
|
|
set = [a decodeObject];
|
|
|
|
|
}
|
|
|
|
|
#else
|
1996-01-26 19:49:12 +00:00
|
|
|
|
set = [NSUnarchiver unarchiveObjectWithFile: @"./nsarchiver.dat"];
|
1996-02-13 01:57:17 +00:00
|
|
|
|
#endif
|
1996-01-26 02:57:43 +00:00
|
|
|
|
|
|
|
|
|
/* Display what we read, to make sure it matches what we wrote */
|
|
|
|
|
printf("\nReading:\n");
|
|
|
|
|
{
|
|
|
|
|
id o, e = [set objectEnumerator];
|
1996-04-16 22:05:21 +00:00
|
|
|
|
while ((o = [e nextObject]))
|
1996-07-15 18:41:44 +00:00
|
|
|
|
printf("%s\n", [o cStringNoCopy]);
|
1996-01-26 02:57:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Do the autorelease. */
|
|
|
|
|
[arp release];
|
|
|
|
|
|
|
|
|
|
exit(0);
|
|
|
|
|
}
|
1996-02-13 01:57:17 +00:00
|
|
|
|
|
1996-05-07 01:20:44 +00:00
|
|
|
|
|
|
|
|
|
/* An old, unused test. */
|
1996-02-13 01:57:17 +00:00
|
|
|
|
#else
|
|
|
|
|
|
1996-04-17 18:46:15 +00:00
|
|
|
|
#include <gnustep/base/all.h>
|
1996-02-13 01:57:17 +00:00
|
|
|
|
#include <Foundation/NSArchiver.h>
|
|
|
|
|
#include <Foundation/NSAutoreleasePool.h>
|
|
|
|
|
|
|
|
|
|
@interface TestClass : NSObject
|
|
|
|
|
{
|
|
|
|
|
id next_responder;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)setNextResponder: anObject;
|
|
|
|
|
- nextResponder;
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
|
|
@implementation TestClass
|
|
|
|
|
|
|
|
|
|
- (void)setNextResponder: anObject
|
|
|
|
|
{
|
|
|
|
|
next_responder = anObject;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- nextResponder
|
|
|
|
|
{
|
|
|
|
|
return next_responder;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// NSCoding protocol
|
|
|
|
|
- (void)encodeWithCoder:aCoder
|
|
|
|
|
{
|
|
|
|
|
[super encodeWithCoder:aCoder];
|
|
|
|
|
[aCoder encodeObjectReference:next_responder withName:@"Next Responder"];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- initWithCoder:aDecoder
|
|
|
|
|
{
|
|
|
|
|
id d;
|
|
|
|
|
[super initWithCoder:aDecoder];
|
|
|
|
|
[aDecoder decodeObjectAt:&next_responder withName:&d];
|
|
|
|
|
return self;
|
|
|
|
|
}
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
int main()
|
|
|
|
|
{
|
|
|
|
|
id arp;
|
|
|
|
|
id r1, r2;
|
|
|
|
|
|
|
|
|
|
arp = [[NSAutoreleasePool alloc] init];
|
|
|
|
|
|
|
|
|
|
// Create a simple loop
|
|
|
|
|
r1 = [[TestClass alloc] init];
|
|
|
|
|
r2 = [[TestClass alloc] init];
|
|
|
|
|
[r1 setNextResponder: r2];
|
|
|
|
|
[r2 setNextResponder: r1];
|
|
|
|
|
|
|
|
|
|
printf("Writing\n");
|
|
|
|
|
printf("%d\n", [r1 hash]);
|
|
|
|
|
printf("%d\n", [r2 hash]);
|
|
|
|
|
printf("%d\n", [[r1 nextResponder] hash]);
|
|
|
|
|
printf("%d\n", [[r2 nextResponder] hash]);
|
|
|
|
|
|
|
|
|
|
/* Write it to a file */
|
|
|
|
|
{
|
|
|
|
|
id d = [[NSMutableData alloc] init];
|
1996-02-22 15:04:01 +00:00
|
|
|
|
id a = [[Archiver alloc] initForWritingWithMutableData: d];
|
1996-02-13 01:57:17 +00:00
|
|
|
|
|
|
|
|
|
[a startEncodingInterconnectedObjects];
|
|
|
|
|
[a encodeObject: r1 withName:@"one"];
|
|
|
|
|
[a encodeObject: r2 withName:@"another"];
|
|
|
|
|
[a finishEncodingInterconnectedObjects];
|
|
|
|
|
|
|
|
|
|
[d writeToFile: @"./nsarchiver.dat" atomically:NO];
|
|
|
|
|
|
|
|
|
|
[d release];
|
|
|
|
|
[a release];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Release the object that was coded */
|
|
|
|
|
[r1 release];
|
|
|
|
|
[r2 release];
|
|
|
|
|
|
|
|
|
|
/* Read it back in from the file */
|
|
|
|
|
printf("\nReading:\n");
|
|
|
|
|
{
|
|
|
|
|
id d;
|
1996-02-22 15:04:01 +00:00
|
|
|
|
id a = [Unarchiver newReadingFromFile:@"./nsarchiver.dat"];
|
1996-02-13 01:57:17 +00:00
|
|
|
|
|
|
|
|
|
[a startDecodingInterconnectedObjects];
|
|
|
|
|
[a decodeObjectAt: &r1 withName:&d];
|
|
|
|
|
[a decodeObjectAt: &r2 withName:&d];
|
|
|
|
|
[a finishDecodingInterconnectedObjects];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Display what we read, to make sure it matches what we wrote */
|
|
|
|
|
{
|
|
|
|
|
printf("%d\n", [r1 hash]);
|
|
|
|
|
printf("%d\n", [r2 hash]);
|
|
|
|
|
printf("%d\n", [[r1 nextResponder] hash]);
|
|
|
|
|
printf("%d\n", [[r2 nextResponder] hash]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Do the autorelease. */
|
|
|
|
|
[arp release];
|
|
|
|
|
|
|
|
|
|
exit(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif
|