//
// 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;
}