/* * Given an ActionScript object, push it onto the Lua stack as a Lua native * type if a primitive class (String, Number, Boolean, int, null). * If object is not convertible to native Lua value, do not push anything * (and return 0). * * WARNING: It important that this function does not touch * non-primitive values (like Arrays). If this will be changed, * optional primitive autoconversion logic will break. */ int push_as3_to_lua_stack_if_convertible(lua_State * L, AS3_Val val) { LCALL(L, stack); #ifdef DO_SPAM SPAM(("push_as3_to_lua_stack_if_convertible(): begin: value, type")); AS3_Trace(val); AS3_Trace( AS3_Call( getQualifiedClassName_method, NULL, AS3_Array("AS3ValType", val) ) ); #endif /* DO_SPAM */ if (AS3_InstanceOf(val, Number_class)) { lua_pushnumber(L, AS3_NumberValue(val)); } else if (AS3_InstanceOf(val, int_class)) { lua_pushinteger(L, AS3_IntValue(val)); } else if (AS3_InstanceOf(val, String_class)) { size_t length = 0; AS3_Malloced_Str str = get_string_bytes(val, &length); lua_pushlstring(L, str, length); free(str); } else if (AS3_InstanceOf(val, Boolean_class)) { lua_pushboolean(L, AS3_IntValue(val)); } else if (val == AS3_Undefined()) { lua_pushnil(L); } else if (is_null(val)) { lua_pushnil(L); } else { SPAM(("push_as3_to_lua_stack_if_convertible(): not convertible")); LRETURN(L, stack, 0); } SPAM(("push_as3_to_lua_stack_if_convertible(): end")); LRETURN(L, stack, 1); }
int push_as3_array_to_lua_stack(lua_State * L, AS3_Val array) { LCALL(L, stack); int len = 0; int i = 0; AS3_Val cur; AS3_Val len_v; if (!AS3_InstanceOf(array, Array_class)) { LRETURN(L, stack, 0); } len_v = AS3_GetS(array, "length"); len = AS3_IntValue(len_v); SAFE_RELEASE(len_v); for (i = 0; i < len; i++) { AS3_Val i_v = AS3_Int(i); cur = AS3_Get(array, i_v); SAFE_RELEASE(i_v); /* TODO: This probably should be push_as3_to_lua_stack */ push_as3_lua_userdata(L, cur); SAFE_RELEASE(cur); } LRETURN(L, stack, len); }
int push_as3_array_to_lua_stack_convert_values(lua_State * L, AS3_Val array) { LCALL(L, stack); int len = 0; int i = 0; AS3_Val cur; AS3_Val len_v; if (!AS3_InstanceOf(array, Array_class)) { LRETURN(L, stack, 0); } len_v = AS3_GetS(array, "length"); len = AS3_IntValue(len_v); SAFE_RELEASE(len_v); for (i = 0; i < len; i++) { AS3_Val i_v = AS3_Int(i); cur = AS3_Get(array, i_v); SAFE_RELEASE(i_v); push_as3_to_lua_stack(L, cur); SAFE_RELEASE(cur); } LRETURN(L, stack, len); }
//Method exposed to ActionScript //Takes a String and echos it static AS3_Val echo(void* self, AS3_Val args) { AS3_Val byteArray; AS3_ArrayValue( args, "AS3ValType", &byteArray); AS3_Val length = AS3_GetS(byteArray, "length"); sztrace("length getted!"); int len = AS3_IntValue(length); //if(len>0) return length; char *data=NULL; data=malloc(len); memset(data,0,len); int fileLen = AS3_ByteArray_readBytes(data,byteArray, len); char *out= NULL; out = malloc(fileLen); memset(out,0,fileLen); ByteArray * bytearray = ByteArray_new(fileLen); bytearray->data = data; PdfFile_free(PdfFile_parse(bytearray,out)); ByteArray_free(bytearray); return AS3_String(out); }
QSP_BOOL qspCallIsPlayingFile(QSP_CHAR *file) { /* Здесь проверяем, проигрывается ли файл */ QSPCallState state; QSP_BOOL isPlaying; AS3_Val args; char *strUTF8; if (qspCallBacks[QSP_CALL_ISPLAYINGFILE].IsSet) { qspSaveCallState(&state, QSP_TRUE, QSP_FALSE); if (file) { strUTF8 = qspW2C(file); args = AS3_Array("StrType", strUTF8); free(strUTF8); } else args = AS3_Array("StrType", 0); AS3_Call(qspCallBacks[QSP_CALL_ISPLAYINGFILE].FuncVal, qspCallBacks[QSP_CALL_ISPLAYINGFILE].ThisVal, args); AS3_Release(args); flyield(); isPlaying = (QSP_BOOL)AS3_IntValue(result); AS3_Release(result); qspRestoreCallState(&state); return isPlaying; } return QSP_FALSE; }
static AS3_Val thunk_PacketToByteArray(void *gg_clientData, AS3_Val gg_args) { AS3_Val bytes; AS3_Val packet; AS3_ArrayValue(gg_args, "AS3ValType, AS3ValType", &bytes, &packet); AS3_Val actionVal = AS3_GetS(packet, "action"); AS3_Val transactionIdVal = AS3_GetS(packet, "transactionId"); AS3_Val protocolVersionVal = AS3_GetS(packet, "protocolVersion"); AS3_Release(AS3_CallTS("writeByte", bytes, "IntType", AS3_IntValue(actionVal))); AS3_Release(AS3_CallTS("writeUnsignedInt", bytes, "IntType", AS3_IntValue(transactionIdVal))); AS3_Release(AS3_CallTS("writeShort", bytes, "IntType", AS3_IntValue(protocolVersionVal))); AS3_Release(actionVal); AS3_Release(transactionIdVal); AS3_Release(protocolVersionVal); AS3_Release(bytes); AS3_Release(packet); return NULL; }
static AS3_Val thunk_SubPieceRequestPacketToByteArray(void *gg_clientData, AS3_Val gg_args) { AS3_Val packet; AS3_Val bytes; AS3_ArrayValue(gg_args, "AS3ValType, AS3ValType", &packet, &bytes); AS3_Val subpieces = AS3_GetS(packet, "subpieces"); AS3_Val lengthVal = AS3_GetS(subpieces, "length"); AS3_Val priorityVal = AS3_GetS(packet, "priority"); AS3_Release(AS3_CallTS("writeShort", bytes, "IntType", AS3_IntValue(lengthVal))); AS3_Release(AS3_CallTS("WriteSubpieces", packet, "AS3ValType", bytes)); AS3_Release(AS3_CallTS("writeShort", bytes, "IntType", AS3_IntValue(priorityVal))); AS3_Release(subpieces); AS3_Release(lengthVal); AS3_Release(priorityVal); AS3_Release(packet); AS3_Release(bytes); return NULL; }
static AS3_Val initparam(void* self, AS3_Val args) { AS3_Val tmp = AS3_Undefined(); int il, len; for (il=0; il < sizeof(models)/sizeof(LAYER); ++il) { tmp = AS3_Get(args, AS3_Int(2*il)); len = AS3_IntValue(AS3_GetS(tmp, "length")); models[il].w = (float*) malloc(len); AS3_ByteArray_readBytes(models[il].w, tmp, len); tmp = AS3_Get(args, AS3_Int(2*il+1)); len = AS3_IntValue(AS3_GetS(tmp, "length")); models[il].b = (float*) malloc(len); AS3_ByteArray_readBytes(models[il].b, tmp, len); } data = (float*) malloc(BUF_SIZE); o = (float*) malloc(BUF_SIZE); return AS3_Int(0); }
// Go check a Flash event queue for events SDL should be aware of! void FLASH_PumpEvents(_THIS) { if (!FLASH_EMPTY_PARAMS) FLASH_EMPTY_PARAMS = AS3_Array(""); // Event Vars AS3_Val mouseEvent, mouseEvents, mousePosition, keyboardEvent, keyboardEvents; int buttonState, rawKeyboardEvent, scanCode, keyState; SDL_keysym keysym; mousePosition = AS3_CallS( "pumpMousePosition", FLASH_EVENT_MANAGER_OBJECT, FLASH_EMPTY_PARAMS ); mouseEvents = AS3_CallS( "pumpMouseEvents", FLASH_EVENT_MANAGER_OBJECT, FLASH_EMPTY_PARAMS ); keyboardEvents = AS3_CallS( "pumpKeyEvents", FLASH_EVENT_MANAGER_OBJECT, FLASH_EMPTY_PARAMS ); // Mouse Position if (mousePosition) { AS3_ObjectValue( mousePosition, "x:IntType, y:IntType", &FLASH_mouseX, &FLASH_mouseY ); SDL_PrivateMouseMotion( 0, 0, FLASH_mouseX, FLASH_mouseY ); } // Mouse Click Events while( AS3_IntValue(AS3_GetS(mouseEvents, "size")) > 0 ) { mouseEvent = AS3_CallS( "dequeue", mouseEvents, FLASH_EMPTY_PARAMS ); buttonState = AS3_IntValue( mouseEvent )? SDL_PRESSED: SDL_RELEASED; SDL_PrivateMouseButton(buttonState, SDL_BUTTON_LEFT, FLASH_mouseX, FLASH_mouseY); } // Keyboard Events while( AS3_IntValue(AS3_GetS(keyboardEvents, "size")) > 0 ) { keyboardEvent = AS3_CallS( "dequeue", keyboardEvents, FLASH_EMPTY_PARAMS ); rawKeyboardEvent = AS3_IntValue( keyboardEvent ); scanCode = rawKeyboardEvent & 0xFF; // Packed event format: 9th bit for press/release, lower 8 bits for scan code keyState = rawKeyboardEvent >> 8; SDL_PrivateKeyboard(keyState, TranslateKey(scanCode, &keysym)); } }
int qspCallGetMSCount() { /* Здесь получаем количество миллисекунд, прошедших с момента последнего вызова функции */ QSPCallState state; int count; AS3_Val args; if (qspCallBacks[QSP_CALL_GETMSCOUNT].IsSet) { qspSaveCallState(&state, QSP_TRUE, QSP_FALSE); args = AS3_Array(""); AS3_Call(qspCallBacks[QSP_CALL_GETMSCOUNT].FuncVal, qspCallBacks[QSP_CALL_GETMSCOUNT].ThisVal, args); AS3_Release(args); flyield(); count = AS3_IntValue(result); AS3_Release(result); qspRestoreCallState(&state); return count; } return 0; }
int qspCallShowMenu() { /* «десь показываем меню */ QSPCallState state; int index; AS3_Val args; if (qspCallBacks[QSP_CALL_SHOWMENU].IsSet) { qspSaveCallState(&state, QSP_FALSE, QSP_TRUE); args = AS3_Array(""); AS3_Call(qspCallBacks[QSP_CALL_SHOWMENU].FuncVal, qspCallBacks[QSP_CALL_SHOWMENU].ThisVal, args); AS3_Release(args); flyield(); index = AS3_IntValue(result); AS3_Release(result); qspRestoreCallState(&state); return index; } return -1; }
static AS3_Val thunk_InitPeerDownloadInfo(void *gg_clientData, AS3_Val gg_args) { AS3_Val info; AS3_Val bytes; AS3_ArrayValue(gg_args, "AS3ValType, AS3ValType", &info, &bytes); AS3_Val isDownloadingVal = AS3_CallTS("readUnsignedByte", bytes, ""); if (AS3_IntValue(isDownloadingVal) == 1) { AS3_Val true = AS3_True(); AS3_SetS(info, "isDownloading", true); AS3_Release(true); } else { AS3_Val false = AS3_False(); AS3_SetS(info, "isDownloading", false); AS3_Release(false); } AS3_Val onLineTimeVal = AS3_CallTS("readUnsignedInt", bytes, ""); AS3_Val avgDownloadVal = AS3_CallTS("readUnsignedShort", bytes, ""); AS3_Val nowDownloadVal = AS3_CallTS("readUnsignedShort", bytes, ""); AS3_Val avgUploadVal = AS3_CallTS("readUnsignedShort", bytes, ""); AS3_Val nowUploadVal = AS3_CallTS("readUnsignedShort", bytes, ""); AS3_SetS(info, "onLineTime", onLineTimeVal); AS3_SetS(info, "avgDownload", avgDownloadVal); AS3_SetS(info, "nowDownload", nowDownloadVal); AS3_SetS(info, "avgUpload", avgUploadVal); AS3_SetS(info, "nowUpload", nowUploadVal); AS3_ByteArray_seek(bytes, 3, 1); // ignore 3 byte reserved bytes AS3_Release(isDownloadingVal); AS3_Release(onLineTimeVal); AS3_Release(avgDownloadVal); AS3_Release(nowDownloadVal); AS3_Release(avgUploadVal); AS3_Release(nowUploadVal); AS3_Release(bytes); AS3_Release(info); return NULL; }
static AS3_Val thunk_CreatePacketFromByteArray(void *gg_clientData, AS3_Val gg_args) { AS3_Val bytes; AS3_ArrayValue(gg_args, "AS3ValType", &bytes); AS3_Val actionVal = AS3_CallTS("readUnsignedByte", bytes, ""); AS3_Val transactionIdVal = AS3_CallTS("readUnsignedInt", bytes, ""); AS3_Val protocolVersionVal = AS3_CallTS("readUnsignedShort", bytes, ""); AS3_Val pplive_protocol_namespace = AS3_String("com.pplive.p2p.network.protocol"); AS3_Val PacketClass = AS3_NSGetS(pplive_protocol_namespace, "Packet"); AS3_Val paramArray = AS3_Array("IntType, IntType, IntType", AS3_IntValue(actionVal), AS3_IntValue(transactionIdVal), AS3_IntValue(protocolVersionVal)); AS3_Val packet = AS3_New(PacketClass, paramArray); AS3_Release(paramArray); AS3_Release(PacketClass); AS3_Release(pplive_protocol_namespace); AS3_Release(protocolVersionVal); AS3_Release(transactionIdVal); AS3_Release(actionVal); AS3_Release(bytes); return packet; }
static AS3_Val prediction(void* self, AS3_Val args) { AS3_Val in_arr = AS3_Undefined(), out_arr = AS3_Array(0); float *tmp, d, e; int i,j,k,l, n,x,y, newx,newy, il, dx,dy; LAYER *pL; AS3_ArrayValue( args, "AS3ValType", &in_arr ); for(i=0; i < 1024; ++i) data[i] = AS3_IntValue(AS3_Get(in_arr, AS3_Int(4*i+1))) /255.0; n = 1; x = 32; y = 32; #define DATA(l,j,i) data[((l)*y + (j))*x + (i)] #define O(k,dy,dx) o[((k)*newy + (dy))*newx + (dx)] #define W(k,l,j,i) pL->w[(((k)*n + (l))*pL->y + (j))*pL->x + (i)] for (il=0; il < nl; ++il) { flyield(); pL = L+il; newx = x+1-pL->x; newy = y+1-pL->y; for (dx=0; dx < newx; ++dx) for (dy=0; dy < newy; ++dy) for (k=0; k < pL->n; ++k) { d = pL->b[k]; for (l=0; l < n; ++l) for(j=0; j < pL->y; ++j) for(i=0; i < pL->x; ++i) d += DATA(l,j+dy,i+dx)*W(k,l,j,i); O(k,dy,dx) = d; } if(pL->maxpool) { for (k=0; k < pL->n; ++k) for (dx=0; dx < newx; dx+=2) for (dy=0; dy < newy; dy+=2) { d=O(k,dy,dx); e=O(k,dy,dx+1); if(e>d) d=e; e=O(k,dy+1,dx); if(e>d) d=e; e=O(k,dy+1,dx+1); if(e>d) d=e; O(k,dy/2,dx/2)=d; } newx /= 2; newy /= 2; } for (dx=0; dx < newx; ++dx) for (dy=0; dy < newy; ++dy) { e = 0; for (k=0; k < pL->n; ++k) { d = O(k,dy,dx); if(pL->nonlin==1) d=1.0/(1.0 + exp(-d)); else if(pL->nonlin==2) d=tanh(d); else if(pL->nonlin==3) { d=exp(d); e += d; } O(k,dy,dx) = d; } if(pL->nonlin==3 && e) for (k=0; k < pL->n; ++k) O(k,dy,dx) /= e; } tmp = data; data = o; o = tmp; x = newx; y = newy; n = pL->n; } for(i=0; i < n*x*y; ++i) AS3_Set(out_arr, AS3_Int(i), AS3_Number(data[i])); return out_arr; }
static AS3_Val thunk_InitBlockMap(void *gg_clientData, AS3_Val gg_args) { AS3_Val map; AS3_Val bytes; AS3_ArrayValue(gg_args, "AS3ValType, AS3ValType", &map, &bytes); AS3_Val blockCountVal = AS3_CallTS("readUnsignedInt", bytes, ""); AS3_Val bitset = AS3_GetS(map, "bitset"); AS3_SetS(map, "blockCount", blockCountVal); AS3_Release(AS3_CallTS("readBytes", bytes, "AS3ValType, IntType, IntType", bitset, 0, (int)((AS3_IntValue(blockCountVal) + 7) / 8))); AS3_Release(blockCountVal); AS3_Release(bitset); AS3_Release(map); AS3_Release(bytes); return NULL; }