Support serialization of NSDate and NSNumber

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@14968 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-Macdonald 2002-11-10 11:46:49 +00:00
parent f0705e979e
commit 4bf7f35f87
2 changed files with 50 additions and 0 deletions

View file

@ -6,6 +6,7 @@
* Source/NSArray.m: Use new plist code
* Source/NSData.m: ditto
* Source/NSDictionary.m: ditto
* Source/NSSerializer.m: handle NSNumber and NSDate
* Source/NSString.m: ditto, plus implement extensions to old plist
support so we can encode NSNumber and NSDate values.
Remove GNUstep property list extensions from the api ... make more

View file

@ -37,6 +37,7 @@
#include <Foundation/NSThread.h>
#include <Foundation/NSNotificationQueue.h>
#include <Foundation/NSObjCRuntime.h>
#include <Foundation/NSValue.h>
#include "GSPrivate.h"
@ -82,6 +83,8 @@
#define ST_DICT 5
#define ST_MDICT 6
#define ST_DATA 7
#define ST_DATE 8
#define ST_NUMBER 9
static char st_xref = (char)ST_XREF;
static char st_cstring = (char)ST_CSTRING;
@ -91,6 +94,8 @@ static char st_marray = (char)ST_MARRAY;
static char st_dict = (char)ST_DICT;
static char st_mdict = (char)ST_MDICT;
static char st_data = (char)ST_DATA;
static char st_date = (char)ST_DATE;
static char st_number = (char)ST_NUMBER;
@ -100,11 +105,13 @@ static char st_data = (char)ST_DATA;
static Class ArrayClass = 0;
static Class MutableArrayClass = 0;
static Class DataClass = 0;
static Class DateClass = 0;
static Class DictionaryClass = 0;
static Class MutableDictionaryClass = 0;
static Class CStringClass = 0;
static Class MStringClass = 0;
static Class StringClass = 0;
static Class NumberClass = 0;
typedef struct {
@defs(GSString)
@ -296,6 +303,24 @@ serializeToInfo(id object, _NSSerializerInfo* info)
(*info->serImp)(info->data, serSel, [object length]);
(*info->appImp)(info->data, appSel, [object bytes], [object length]);
}
else if (GSObjCIsKindOf(c, DateClass))
{
NSTimeInterval ti = [object timeIntervalSinceReferenceDate];
(*info->appImp)(info->data, appSel, &st_date, 1);
[info->data serializeDataAt: &ti
ofObjCType: @encode(NSTimeInterval)
context: nil];
}
else if (GSObjCIsKindOf(c, NumberClass))
{
double d = [object doubleValue];
(*info->appImp)(info->data, appSel, &st_number, 1);
[info->data serializeDataAt: &d
ofObjCType: @encode(double)
context: nil];
}
else
{
[NSException raise: NSInvalidArgumentException
@ -322,6 +347,8 @@ static BOOL shouldBeCompact = NO;
ArrayClass = [NSArray class];
MutableArrayClass = [NSMutableArray class];
DataClass = [NSData class];
DateClass = [NSDate class];
NumberClass = [NSNumber class];
DictionaryClass = [NSDictionary class];
MutableDictionaryClass = [NSMutableDictionary class];
StringClass = [NSString class];
@ -649,6 +676,28 @@ deserializeFromInfo(_NSDeserializerInfo* info)
return d;
}
case ST_DATE:
{
NSTimeInterval ti;
[info->data deserializeDataAt: &ti
ofObjCType: @encode(NSTimeInterval)
atCursor: info->cursor
context: nil];
return [[NSDate alloc] initWithTimeIntervalSinceReferenceDate: ti];
}
case ST_NUMBER:
{
double d;
[info->data deserializeDataAt: &d
ofObjCType: @encode(double)
atCursor: info->cursor
context: nil];
return [[NSNumber alloc] initWithDouble: d];
}
default:
return nil;
}