Skip to content

Commit

Permalink
API Generator: support JS on iOS
Browse files Browse the repository at this point in the history
  • Loading branch information
dmitrys committed Mar 1, 2013
1 parent a1f229d commit e188451
Show file tree
Hide file tree
Showing 35 changed files with 768 additions and 190 deletions.
26 changes: 24 additions & 2 deletions platform/shared/api_generator/iphone/CJSConverter.h
Expand Up @@ -3,12 +3,34 @@
#import "IMethodResult.h"



typedef struct RHO_API_PARAM RHO_API_PARAM;

typedef enum {
RHO_API_STRING,
RHO_API_INTEGER,
RHO_API_FLOAT,
RHO_API_BOOLEAN,
RHO_API_ARRAY,
RHO_API_HASH,
RHO_API_OBJECT

}RHO_API_PARAM_TYPE;

struct RHO_API_PARAM{
RHO_API_PARAM_TYPE type;
const char* class_name;
const char* name;
int subtypes_count;
RHO_API_PARAM* subtypes;
};

@interface CJSConverter : NSObject {
}

+ (NSString*) convertToJS:(NSObject*)objectiveC_value;
+ (NSString*) convertToJS:(NSObject*)objectiveC_value level:(int)level;

+ (NSObject*) convertFromJS:(void*)json_entry;
+ (NSObject*) convertFromJS:(void*)json_entry rho_api_param:(RHO_API_PARAM*)rho_api_param;

+ (NSObject*) getObjectiveCNULL;

Expand Down
152 changes: 150 additions & 2 deletions platform/shared/api_generator/iphone/CJSConverter.mm
Expand Up @@ -5,7 +5,95 @@

@implementation CJSConverter

+ (NSString*) convertToJS:(NSObject*)objectiveC_value {



+ (NSString*) convertToJS:(NSObject*)objectiveC_value level:(int)level {

NSString* strRes = @"";
if (level == 0)
strRes = [NSString stringWithUTF8String:"{"];

if ([objectiveC_value isKindOfClass:[NSString class]]) {
// string
NSString* objString = (NSString*)objectiveC_value;

if (level == 0)
strRes = [strRes stringByAppendingString:@"'_RhoValue':'"];
strRes = [strRes stringByAppendingString:objString];
strRes = [strRes stringByAppendingString:@"'"];
}
else if ([objectiveC_value isKindOfClass:[NSNumber class]]) {
// int, bool or float
NSNumber* objNumber = (NSNumber*)objectiveC_value;
NSString* str = @"";
if ([CMethodResult isBoolInsideNumber:objNumber]) {
if([objNumber boolValue]) {
str = @"true";
}
else {
str = @"false";
}
}
else if ([CMethodResult isFloatInsideNumber:objNumber]) {
str = [NSString stringWithFormat:@"%@", objNumber];
}
else {
str = [NSString stringWithFormat:@"%@", objNumber];
}
if (level == 0)
strRes = [strRes stringByAppendingString:@"'_RhoValue':"];
strRes = [strRes stringByAppendingString:str];
}
else if ([objectiveC_value isKindOfClass:[NSArray class]]) {
// array
strRes = [strRes stringByAppendingString:@"["];
NSArray* objArray = (NSArray*)objectiveC_value;
int count = [objArray count];
int i;
for (i = 0; i < count; i++) {
if (i > 0) {
strRes = [strRes stringByAppendingString:@","];
}
NSObject* obj = [objArray objectAtIndex:i];
strRes = [strRes stringByAppendingString:[CJSConverter convertToJS:obj level:(level+1)]];
}
strRes = [strRes stringByAppendingString:@"]"];
}
else if ([objectiveC_value isKindOfClass:[CRhoAPIClassInstance class]]) {
// rubyModule
CRhoAPIClassInstance* rubyModule = (CRhoAPIClassInstance*)objectiveC_value;
NSString* rubyPath = [rubyModule getClassName];
if (level == 0)
strRes = [strRes stringByAppendingString:@"'_RhoValue':'"];
strRes = [strRes stringByAppendingString:rubyPath];
strRes = [strRes stringByAppendingString:@"'"];
}
else if ([objectiveC_value isKindOfClass:[NSDictionary class]]) {
// dictionary
strRes = [strRes stringByAppendingString:@"["];
NSDictionary* objDictionary = (NSDictionary*)objectiveC_value;
NSEnumerator* enumerator = [objDictionary keyEnumerator];
NSObject* obj = nil;
BOOL is_first = YES;
while ((obj = [enumerator nextObject]) != nil) {
NSString* objKey = (NSString*)obj;
NSObject* objValue = [objDictionary objectForKey:objKey];
if (!is_first) {
strRes = [strRes stringByAppendingString:@","];
}
strRes = [strRes stringByAppendingString:@"'"];
strRes = [strRes stringByAppendingString:objKey];
strRes = [strRes stringByAppendingString:@"':"];

strRes = [strRes stringByAppendingString:[CJSConverter convertToJS:objValue level:(level+1)]];

is_first = NO;
}
}
if (level == 0)
strRes = [strRes stringByAppendingString:@"}"];
return strRes;

/*
rho::String strRes = "{}";
Expand Down Expand Up @@ -51,11 +139,71 @@ + (NSString*) convertToJS:(NSObject*)objectiveC_value {
return nil;
}

+ (NSObject*) convertFromJS:(void*)json_entry {
+ (NSObject*) convertFromJSentry:(rho::json::CJSONEntry*)json_entry rho_api_param:(RHO_API_PARAM*)rho_api_param {
rho::json::CJSONEntry* jsonEntry = (rho::json::CJSONEntry*)json_entry;


if (jsonEntry->isString()) {
return [NSString stringWithUTF8String:jsonEntry->getString()];
}
if (jsonEntry->isInteger()) {
return [NSNumber numberWithInt:jsonEntry->getInt()];
}
if (jsonEntry->isFloat()) {
return [NSNumber numberWithDouble:jsonEntry->getDouble()];
}
if (jsonEntry->isBoolean()) {
return [NSNumber numberWithBool:(jsonEntry->getBoolean() == true)];
}
if (jsonEntry->isArray()) {
rho::json::CJSONArray js_array(*jsonEntry);
int i;
int count = js_array.getSize();
NSMutableArray* ns_array = [NSMutableArray arrayWithCapacity:count];
for (i =0 ; i < count; i++) {
rho::json::CJSONEntry js_entry = js_array[i];
[ns_array addObject:[CJSConverter convertFromJSentry:&js_entry rho_api_param:NULL]];
}
return ns_array;
}
if (jsonEntry->isObject()) {
rho::json::CJSONStructIterator js_iterator(*jsonEntry);

NSMutableDictionary* ns_hash = [NSMutableDictionary dictionaryWithCapacity:10];

while (!js_iterator.isEnd()) {
rho::String key = js_iterator.getCurKey();
rho::json::CJSONEntry js_entry = js_iterator.getCurValue();

[ns_hash setObject:[CJSConverter convertFromJSentry:&js_entry rho_api_param:NULL] forKey:[NSString stringWithUTF8String:(key.c_str())]];

js_iterator.next();
}

return ns_hash;
}
return nil;
}


+ (NSObject*) convertFromJS:(void*)json_entry rho_api_param:(RHO_API_PARAM*)rho_api_param {
rho::json::CJSONEntry* jsonEntry = (rho::json::CJSONEntry*)json_entry;


//TODO:
@try {
return [CJSConverter convertFromJSentry:jsonEntry rho_api_param:rho_api_param];
}
@catch (NSException *exception) {

}
@finally {

}




return nil;
}

Expand Down
33 changes: 33 additions & 0 deletions platform/shared/api_generator/iphone/CMethodResult.h
Expand Up @@ -4,6 +4,39 @@
#import "ruby/ext/rho/rhoruby.h"


@interface CMethodResultError : NSObject {
NSString* errorType;
NSString* errorDescription;
}

-(id)init;

+ (CMethodResultError*) errorWithType:(NSString*)error_type description:(NSString*)description;

-(NSString*)getErrorType;
-(NSString*)getErrorDescription;

-(void)dealloc;

@end

@interface CRhoAPIClassInstance : NSObject {
NSString* mClassName;
NSString* mInstanceID;
}

- (id) init:(NSString*)clasRubyFullName iID:(NSString*)iID;

+(CRhoAPIClassInstance*) rubyClassByName:(NSString*)className instanceID:(NSString*)instanceID;

-(NSString*)getClassName;

-(NSString*)getInstanceID;

@end



@protocol IMethodResult_RubyObjectFactory <NSObject>

- (VALUE) makeRubyValue:(NSObject*)obj;
Expand Down
74 changes: 71 additions & 3 deletions platform/shared/api_generator/iphone/CMethodResult.m
Expand Up @@ -5,6 +5,72 @@
#import "CJSConverter.h"
#import "RubyCallbackHelper.h"


@implementation CMethodResultError

-(id)init:(NSString*)error_type description:(NSString*)description {
self = [super init];
errorType = error_type;
errorDescription = description;
return self;
}

+ (CMethodResultError*) errorWithType:(NSString*)error_type description:(NSString*)description {
CMethodResultError* b = [[CMethodResultError alloc] init:error_type description:description];
return b;
}

-(NSString*)getErrorType {
return errorType;
}

-(NSString*)getErrorDescription {
return errorDescription;
}

-(void)dealloc {
[errorDescription release];
[super dealloc];
}


@end


@implementation CRhoAPIClassInstance

- (id) init:(NSString*)clasRubyFullName iID:(NSString*)iID {
self = [super init];
mClassName = [clasRubyFullName retain];
mInstanceID = [iID retain];
return self;
}

+(CRhoAPIClassInstance*) rubyClassByName:(NSString*)className instanceID:(NSString*)instanceID {
CRhoAPIClassInstance* m = [[CRhoAPIClassInstance alloc] init:className iID:instanceID];
return m;
}

-(NSString*)getClassName {
return mClassName;
}

-(NSString*)getInstanceID {
return mInstanceID;
}

-(void)dealloc {
[mClassName release];
[mInstanceID release];
[super dealloc];
}

@end





@implementation CMethodResult

-(id) init {
Expand All @@ -22,7 +88,7 @@ - (void) setResult:(NSObject*)value {
if (mRubyModulePath != nil) {
// convert all strings into CRubyModule !
if ([value isKindOfClass:[NSString class]]) {
mValue = [CRubyClass rubyClassByName:mRubyModulePath instanceID:((NSString*)value)];
mValue = [CRhoAPIClassInstance rubyClassByName:mRubyModulePath instanceID:((NSString*)value)];
}
else if ([value isKindOfClass:[NSArray class]]) {
NSArray* value_ar = (NSArray*)value;
Expand All @@ -31,7 +97,7 @@ - (void) setResult:(NSObject*)value {
for (i = 0; i < [value_ar count]; i++) {
NSObject* item = [value_ar objectAtIndex:i];
if ([item isKindOfClass:[NSString class]]) {
item = [CRubyClass rubyClassByName:mRubyModulePath instanceID:((NSString*)item)];
item = [CRhoAPIClassInstance rubyClassByName:mRubyModulePath instanceID:((NSString*)item)];
}
[aValue addObject:item];
}
Expand Down Expand Up @@ -60,7 +126,9 @@ -(VALUE) toRuby {
}

-(NSString*) toJSON {
return [CJSConverter convertToJS:mValue];
NSString* res = [CJSConverter convertToJS:mValue level:0];
const char* ttt = [res UTF8String];
return res;
}

-(BOOL) isHash {
Expand Down
14 changes: 0 additions & 14 deletions platform/shared/api_generator/iphone/CRubyConverter.h
Expand Up @@ -4,20 +4,6 @@
#import "ruby/ext/rho/rhoruby.h"


@interface CRubyClass : NSObject {
NSString* mClassName;
NSString* mInstanceID;
}

- (id) init:(NSString*)clasRubyFullName iID:(NSString*)iID;

+(CRubyClass*) rubyClassByName:(NSString*)className instanceID:(NSString*)instanceID;

-(NSString*)getClassName;

-(NSString*)getInstanceID;

@end


@interface CRubyConverter : NSObject {
Expand Down

0 comments on commit e188451

Please sign in to comment.