Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/iridia-irodkit'
Browse files Browse the repository at this point in the history
Conflicts:
	IRWebAPIResponseParser.h
  • Loading branch information
Evadne Wu committed Jan 9, 2012
2 parents 3a2517c + e4040cd commit 18cd31b
Show file tree
Hide file tree
Showing 3 changed files with 147 additions and 34 deletions.
1 change: 1 addition & 0 deletions IRWebAPIInterface+Validators.h
Expand Up @@ -6,6 +6,7 @@
// Copyright 2011 Iridia Productions. All rights reserved.
//

#import "IRWebAPIKitDefines.h"
#import "IRWebAPIInterface.h"


Expand Down
1 change: 1 addition & 0 deletions IRWebAPIResponseParser.h
Expand Up @@ -12,6 +12,7 @@
extern IRWebAPIResponseParser IRWebAPIResponseDefaultParserMake (void);
extern IRWebAPIResponseParser IRWebAPIResponseQueryResponseParserMake (void);
extern IRWebAPIResponseParser IRWebAPIResponseDefaultJSONParserMake (void);
extern IRWebAPIResponseParser IRWebAPIResponseDefaultXMLParserMake ();



Expand Down
179 changes: 145 additions & 34 deletions IRWebAPIResponseParser.m
Expand Up @@ -80,51 +80,162 @@ IRWebAPIResponseParser IRWebAPIResponseQueryResponseParserMake () {

IRWebAPIResponseParser IRWebAPIResponseDefaultJSONParserMake () {

NSDictionary * (^defaultJSONParser) (NSData *) = ^ NSDictionary * (NSData *inData) {
static id parserInstance = nil;
static IRWebAPIResponseParser parserBlock = nil;

if (parserBlock)
return parserBlock;

NSDictionary * (^dictionarize)(id<NSObject>) = ^ (id<NSObject> incomingObject) {

Class classCJSONDeserializer = NSClassFromString(@"CJSONDeserializer");

if (!classCJSONDeserializer)
return nil;
if (!incomingObject)
return (NSDictionary *)nil;

if (![(NSObject *)classCJSONDeserializer respondsToSelector:@selector(deserializer)])
return nil;
id deserializer = [classCJSONDeserializer performSelector:@selector(deserializer)];
if (![incomingObject isKindOfClass:[NSDictionary class]])
return [NSDictionary dictionaryWithObject:incomingObject forKey:@"response"];

return (NSDictionary *)incomingObject;

if (!deserializer)
return nil;
};

Class classJSONKit = NSClassFromString(@"JSONDecoder");
if (classJSONKit) {

parserInstance = [classJSONKit performSelector:@selector(decoder)];
[parserInstance retain];

parserBlock = (IRWebAPIResponseParser)[[^ (NSData *incomingData) {
return dictionarize([parserInstance performSelector:@selector(objectWithData:) withObject:incomingData]);
} copy] autorelease];

SEL selDeserialize = @selector(deserialize:error:);
return parserBlock;

if (![deserializer respondsToSelector:selDeserialize])
return nil;
}

Class classTouchJSON = NSClassFromString(@"CJSONDeserializer");
if (classTouchJSON) {

id incomingObject;

NSError *error = nil;
NSError **errorPointer = &error;
parserInstance = [classTouchJSON performSelector:@selector(deserializer)];
[parserInstance retain];

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[deserializer methodSignatureForSelector:selDeserialize]];

[invocation setTarget:deserializer];
[invocation setSelector:selDeserialize];
[invocation setArgument:&inData atIndex:2];
[invocation setArgument:&errorPointer atIndex:3];
parserBlock = (IRWebAPIResponseParser)[[^ (NSData *incomingData) {

SEL selDeserialize = @selector(deserialize:error:);
id incomingObject;

[invocation invoke];
[invocation getReturnValue:&incomingObject];
NSError *error = nil;
NSError **errorPointer = &error;
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[parserInstance methodSignatureForSelector:selDeserialize]];

[invocation setTarget:parserInstance];
[invocation setSelector:selDeserialize];
[invocation setArgument:&incomingData atIndex:2];
[invocation setArgument:&errorPointer atIndex:3];
[invocation invoke];
[invocation getReturnValue:&incomingObject];

return dictionarize(incomingObject);

} copy] autorelease];

if (!incomingObject)
return nil;
return parserBlock;

}

return IRWebAPIResponseDefaultParserMake();

}

if ([incomingObject isKindOfClass:[NSDictionary class]])
return (NSDictionary *)incomingObject;

return [NSDictionary dictionaryWithObject:incomingObject forKey:@"response"];
IRWebAPIResponseParser IRWebAPIResponseDefaultXMLParserMake () {

static IRWebAPIResponseParser parserBlock = nil;

};
if (parserBlock)
return parserBlock;

// __block NSDictionary * (^dictionarize)(id<NSObject>);
// dictionarize = [[^ (id<NSObject> incomingObject) {
//
// if (!incomingObject)
// return (NSDictionary *)nil;
//
// NSArray *children = [incomingObject performSelector:@selector(children)];
// NSArray *attributes = [incomingObject respondsToSelector:@selector(attributes)] ? [incomingObject performSelector:@selector(attributes)] : nil;
//
// NSMutableDictionary *returnedDictionary = [NSMutableDictionary dictionary];
//
// [returnedDictionary setObject:[incomingObject performSelector:@selector(name)] forKey:@"name"];
//
// if ([children count]) {
//
// NSMutableArray *childrenDictionaries = [NSMutableArray array];
//
// for (id element in children)
// [childrenDictionaries addObject:dictionarize(element)];
//
// [returnedDictionary setObject:childrenDictionaries forKey:@"children"];
//
// }
//
// if ([attributes count]) {
//
// NSMutableArray *attributesDictionaries = [NSMutableArray array];
//
// for (id element in attributes)
// [attributesDictionaries addObject:dictionarize(element)];
//
// [returnedDictionary setObject:attributesDictionaries forKey:@"attributes"];
//
// }
//
// [returnedDictionary setObject:[incomingObject performSelector:@selector(stringValue)] forKey:@"value"];
//
// return returnedDictionary;
//
// } copy] autorelease];
//
// [dictionarize retain];

Class classTouchXMLDocument = NSClassFromString(@"CXMLDocument");
if (classTouchXMLDocument) {

parserBlock = (IRWebAPIResponseParser)[[^ (NSData *incomingData) {

SEL selInstantiate = @selector(initWithData:encoding:options:error:);
id incomingObject = nil;

NSError *error = nil;
NSError **errorPointer = &error;

id parserInstance = [classTouchXMLDocument performSelector:@selector(alloc)];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[parserInstance methodSignatureForSelector:selInstantiate]];

NSStringEncoding stringEncoding = NSUTF8StringEncoding;
NSUInteger options = 0;

[invocation setTarget:parserInstance];
[invocation setSelector:selInstantiate];
[invocation setArgument:&incomingData atIndex:2];
[invocation setArgument:&stringEncoding atIndex:3];
[invocation setArgument:&options atIndex:4];
[invocation setArgument:&errorPointer atIndex:5];
[invocation invoke];
[invocation getReturnValue:&incomingObject];

return [NSDictionary dictionaryWithObjectsAndKeys:

incomingObject, @"object",
incomingData, @"data",
// dictionarize([incomingObject performSelector:@selector(rootElement)]), @"interpretation",

nil];

return [[defaultJSONParser copy] autorelease];
} copy] autorelease];

return parserBlock;

}

return IRWebAPIResponseDefaultParserMake();

}

0 comments on commit 18cd31b

Please sign in to comment.