// // IOSExtension.m // IOSExtension // // Created by Tom Krcha on 11/3/11. // Copyright 2011 Krcha. All rights reserved. // #import "FlashRuntimeExtensions.h" FREObject sum(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]){ double number1; FREGetObjectAsDouble(argv[0], &number1); double number2; FREGetObjectAsDouble(argv[1], &number2); double sum = number1 + number2; NSLog(@"%f+%f=%f",number1,number2,sum); FREObject sumToReturn = nil; FRENewObjectFromDouble(sum, &sumToReturn); return sumToReturn; } FREObject subtract(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]){ int32_t int1; FREGetObjectAsInt32(argv[0], &int1); int32_t int2; FREGetObjectAsInt32(argv[1], &int2); int32_t sum = int1 - int2; NSLog(@"%d-%d=%d",int1,int2,sum); FREObject sumToReturn = nil; FRENewObjectFromInt32(sum, &sumToReturn); return sumToReturn; } FREObject multiply(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]){ uint32_t uint1; FREGetObjectAsUint32(argv[0], &uint1); uint32_t uint2; FREGetObjectAsUint32(argv[1], &uint2); uint32_t sum = uint1*uint2; NSLog(@"%d*%d=%d",uint1,uint2,sum); FREObject sumToReturn = nil; FRENewObjectFromUint32(sum, &sumToReturn); return sumToReturn; } FREObject concatenate(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]){ // To be filled uint32_t string1Length; const uint8_t *string1; FREGetObjectAsUTF8(argv[0], &string1Length, &string1); uint32_t string2Length; const uint8_t *string2; FREGetObjectAsUTF8(argv[1], &string2Length, &string2); // Convert C strings to Obj-C strings NSString *string1ObjC = [NSString stringWithUTF8String:(char*)string1]; NSString *string2ObjC = [NSString stringWithUTF8String:(char*)string2]; // Concat strings NSString *returnString = [string1ObjC stringByAppendingString:string2ObjC]; // Convert Obj-C string to C UTF8String const char *str = [returnString UTF8String]; // Prepare for AS3 FREObject retStr; FRENewObjectFromUTF8(strlen(str)+1, (const uint8_t*)str, &retStr); // Return data back to ActionScript return retStr; } FREObject opposite(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]){ uint32_t boolean; FREGetObjectAsBool(argv[0], &boolean); uint32_t oppositeValue = !boolean; FREObject retBool = nil; FRENewObjectFromBool(oppositeValue, &retBool); return retBool; } FREObject reverseArray(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]){ FREObject arr = argv[0]; // array uint32_t arr_len; // array length FREGetArrayLength(arr, &arr_len); FREObject populatedArray = NULL; // Create a new AS3 Array, pass 0 arguments to the constructor (and no arguments values = NULL) FRENewObject((const uint8_t*)"Array", 0, NULL, &populatedArray, nil); FRESetArrayLength(populatedArray, arr_len); NSLog(@"Going through the array: %d",arr_len); int32_t j = 0; for(int32_t i=arr_len-1; i>=0;i--){ // get an element at index FREObject element; FREGetArrayElementAt(arr, i, &element); // OPTIONAL: get an int value out of the element int32_t value; FREGetObjectAsInt32(element, &value); // log index and value NSLog(@"Get item %d: %d",i,value); NSLog(@"Set item %d: %d",j,value); FRESetArrayElementAt(populatedArray, j, element); j++; } return populatedArray; } FREObject reverseVector(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]){ FREObject arr = argv[0]; // array uint32_t arr_len; // array length FREGetArrayLength(arr, &arr_len); FREObject populatedVector = NULL; // Create a new AS3 Array, pass 0 arguments to the constructor (and no arguments values = NULL) FRENewObject((const uint8_t*)"Vector.", 0, NULL, &populatedVector, nil); FRESetArrayLength(populatedVector, arr_len); NSLog(@"Going through the vector: %d",arr_len); int32_t j = 0; for(int32_t i=arr_len-1; i>=0;i--){ // get an element at index FREObject element; FREGetArrayElementAt(arr, i, &element); // OPTIONAL: get an int value out of the element int32_t value; FREGetObjectAsInt32(element, &value); // log index and value NSLog(@"Get item %d: %d",i,value); NSLog(@"Set item %d: %d",j,value); FRESetArrayElementAt(populatedVector, j, element); j++; } return populatedVector; } //------------------------------------ // // Required Methods. // //------------------------------------ // ContextInitializer() // // The context initializer is called when the runtime creates the extension context instance. void ContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctionsToTest, const FRENamedFunction** functionsToSet) { *numFunctionsToTest = 7; FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * 7); func[0].name = (const uint8_t*) "sum"; func[0].functionData = NULL; func[0].function = ∑ func[1].name = (const uint8_t*) "subtract"; func[1].functionData = NULL; func[1].function = &subtract; func[2].name = (const uint8_t*) "multiply"; func[2].functionData = NULL; func[2].function = &multiply; func[3].name = (const uint8_t*) "concatenate"; func[3].functionData = NULL; func[3].function = &concatenate; func[4].name = (const uint8_t*) "opposite"; func[4].functionData = NULL; func[4].function = &opposite; func[5].name = (const uint8_t*) "reverseArray"; func[5].functionData = NULL; func[5].function = &reverseArray; func[6].name = (const uint8_t*) "reverseVector"; func[6].functionData = NULL; func[6].function = &reverseVector; *functionsToSet = func; // Init our Obj-C extension //extension = [[IOSExtension alloc] init]; //[extension release]; } // ContextFinalizer() // // The context finalizer is called when the extension's ActionScript code // calls the ExtensionContext instance's dispose() method. // If the AIR runtime garbage collector disposes of the ExtensionContext instance, the runtime also calls // ContextFinalizer(). void ContextFinalizer(FREContext ctx) { NSLog(@"Entering ContextFinalizer()"); // Nothing to clean up. NSLog(@"Exiting ContextFinalizer()"); // dealloc our Obj-C extension instance //[extension dealloc]; return; } // ExtInitializer() // // The extension initializer is called the first time the ActionScript side of the extension // calls ExtensionContext.createExtensionContext() for any context. void ADBEExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet,FREContextFinalizer* ctxFinalizerToSet) { NSLog(@"Entering ExtInitializer()"); *extDataToSet = NULL; *ctxInitializerToSet = &ContextInitializer; *ctxFinalizerToSet = &ContextFinalizer; NSLog(@"Exiting ExtInitializer()"); } // ExtFinalizer() // // The extension finalizer is called when the runtime unloads the extension. However, it is not always called. void ADBEExtFinalizer(void* extData) { NSLog(@"Entering ExtFinalizer()"); // Nothing to clean up. NSLog(@"Exiting ExtFinalizer()"); return; }