Skip to content

Commit

Permalink
Added double and nil deserialization
Browse files Browse the repository at this point in the history
  • Loading branch information
odrobnik committed Apr 5, 2013
1 parent bad40ec commit 8feebf5
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 7 deletions.
2 changes: 2 additions & 0 deletions Core/Source/DTXMLRPCSerialization.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

/**
Methods to serialize and deserialize XML-RPC objects, e.g. method calls and responses.
Supported are XML-RPC data types described [here](http://en.wikipedia.org/wiki/XML-RPC#Data_types)
*/

@interface DTXMLRPCSerialization : NSObject
Expand Down
64 changes: 57 additions & 7 deletions Core/Source/DTXMLRPCSerialization.m
Original file line number Diff line number Diff line change
Expand Up @@ -667,6 +667,21 @@ - (NSNumber *)_numberFromIntegerSequence:(NSArray *)sequence
return [NSNumber numberWithInteger:i];
}

- (NSNumber *)_numberFromDoubleSequence:(NSArray *)sequence
{
if ([sequence count]!=1)
{
// illegal number of members
return nil;
}

NSString *contents = [sequence objectAtIndex:0];

double d = [contents doubleValue];

return [NSNumber numberWithInteger:d];
}

- (NSString *)_stringFromStringSequence:(NSArray *)sequence
{
if ([sequence count]!=1)
Expand Down Expand Up @@ -705,6 +720,24 @@ - (NSDate *)_dateFromDateTimeSequence:(NSArray *)sequence
return [dateFormatter dateFromString:contents];
}

- (NSData *)_dataFromBase64Sequence:(NSArray *)sequence
{
if ([sequence count]!=1)
{
// illegal number of members
return nil;
}

NSString *contents = [sequence objectAtIndex:0];

if (![contents isKindOfClass:[NSString class]])
{
return nil;
}

return [DTBase64Coding dataByDecodingString:contents];
}

// a sequence named value
- (id)_objectFromValueSequence:(NSArray *)sequence
{
Expand All @@ -724,31 +757,48 @@ - (id)_objectFromValueSequence:(NSArray *)sequence

NSString *stuffName = [stuff DTXMLRPCName];

// data types according to http://en.wikipedia.org/wiki/XML-RPC#Data_types

if ([stuffName isEqualToString:@"array"])
{
return [self _arrayFromSequence:stuff];
}
else if ([stuffName isEqualToString:@"struct"])
else if ([stuffName isEqualToString:@"base64"])
{
return [self _dictionaryFromSequence:stuff];
return [self _dataFromBase64Sequence:stuff];
}
else if ([stuffName isEqualToString:@"boolean"])
{
return [self _numberFromBooleanSequence:stuff];
}
else if ([stuffName isEqualToString:@"string"])
else if ([stuffName isEqualToString:@"dateTime.iso8601"])
{
return [self _stringFromStringSequence:stuff];
return [self _dateFromDateTimeSequence:stuff];
}
else if ([stuffName isEqualToString:@"double"])
{
return [self _numberFromDoubleSequence:stuff];
}
else if ([stuffName isEqualToString:@"int"] || [stuffName isEqualToString:@"i4"])
{
return [self _numberFromIntegerSequence:stuff];
}
else if ([stuffName isEqualToString:@"dateTime.iso8601"])
else if ([stuffName isEqualToString:@"string"])
{
return [self _dateFromDateTimeSequence:stuff];
return [self _stringFromStringSequence:stuff];
}
else if ([stuffName isEqualToString:@"struct"])
{
return [self _dictionaryFromSequence:stuff];
}
else if ([stuffName isEqualToString:@"nil"])
{
return [NSNull null];
}
else
{
NSLog(@"Unable to decode object of type '%@'", stuffName);
}
else NSLog(@"%@", stuffName);

return nil;
}
Expand Down

0 comments on commit 8feebf5

Please sign in to comment.