#include "precompiled.h" #include "JSConversions.h" #include "Entity.h" #include "ObjectManager.h" #include "scripting/JSInterface_Vector3D.h" #include "Parser.h" #include "BaseEntity.h" // HEntity template<> HEntity* ToNative( JSContext* cx, JSObject* obj ) { CEntity* e = ToNative( cx, obj ); return( &( e->me ) ); } template<> JSObject* ToScript( HEntity* Native ) { return( ToScript( &( **Native ) ) ); } // CBaseEntity* template<> bool ToPrimitive( JSContext* cx, jsval v, CBaseEntity*& Storage ) { if( !JSVAL_IS_OBJECT( v ) ) return( false ); CBaseEntity* Data = (CBaseEntity*)JS_GetInstancePrivate( cx, JSVAL_TO_OBJECT( v ), &CBaseEntity::JSI_class, NULL ); if( !Data ) return( false ); Storage = Data; return( true ); } template<> JSObject* ToScript( CBaseEntity** Native ) { return( ToScript( *Native ) ); } // CObjectEntry template<> bool ToPrimitive( JSContext* cx, jsval v, CObjectEntry*& Storage ) { CStrW ActorName; if( !ToPrimitive( cx, v, ActorName ) ) return( false ); Storage = g_ObjMan.FindObject( (CStr)ActorName ); return( true ); } template<> jsval ToJSVal( CObjectEntry*& Native ) { if( !Native ) return( ToJSVal( CStrW( L"[No actor]" ) ) ); return( ToJSVal( CStrW( Native->m_Name ) ) ); } // CVector3D template<> CVector3D* ToNative( JSContext* cx, JSObject* obj ) { JSI_Vector3D::Vector3D_Info* v = (JSI_Vector3D::Vector3D_Info*)JS_GetPrivate( cx, obj ); return( v->vector ); } template<> JSObject* ToScript( CVector3D* Native ) { JSObject* Script = JS_NewObject( g_ScriptingHost.GetContext(), &JSI_Vector3D::JSI_class, NULL, NULL ); JS_SetPrivate( g_ScriptingHost.GetContext(), Script, new JSI_Vector3D::Vector3D_Info( *Native ) ); return( Script ); } // CScriptObject template<> jsval ToJSVal( CScriptObject& Native ) { return( OBJECT_TO_JSVAL( Native.GetFunctionObject() ) ); } template<> bool ToPrimitive( JSContext* cx, jsval v, CScriptObject& Storage ) { Storage.SetJSVal( v ); return( true ); } // int template<> jsval ToJSVal( const int& Native ) { return( INT_TO_JSVAL( Native ) ); } template<> jsval ToJSVal( int& Native ) { return( INT_TO_JSVAL( Native ) ); } template<> bool ToPrimitive( JSContext* cx, jsval v, int& Storage ) { try { Storage = g_ScriptingHost.ValueToInt( v ); } catch( PSERROR_Scripting_ConversionFailed ) { return( false ); } return( true ); } // uint template<> jsval ToJSVal( const uint& Native ) { return( INT_TO_JSVAL( Native ) ); } template<> jsval ToJSVal( uint& Native ) { return( INT_TO_JSVAL( Native ) ); } template<> bool ToPrimitive( JSContext* cx, jsval v, uint& Storage ) { try { int t = g_ScriptingHost.ValueToInt( v ); if( t < 0 ) return( false ); Storage = t; } catch( PSERROR_Scripting_ConversionFailed ) { return( false ); } return( true ); } // double template<> jsval ToJSVal( const double& Native ) { return( DOUBLE_TO_JSVAL( JS_NewDouble( g_ScriptingHost.getContext(), Native ) ) ); } template<> jsval ToJSVal( double& Native ) { return( DOUBLE_TO_JSVAL( JS_NewDouble( g_ScriptingHost.getContext(), Native ) ) ); } template<> bool ToPrimitive( JSContext* cx, jsval v, double& Storage ) { try { Storage = g_ScriptingHost.ValueToDouble( v ); } catch( PSERROR_Scripting_ConversionFailed ) { return( false ); } return( true ); } // float template<> jsval ToJSVal( const float& Native ) { return( DOUBLE_TO_JSVAL( JS_NewDouble( g_ScriptingHost.getContext(), Native ) ) ); } template<> jsval ToJSVal( float& Native ) { return( DOUBLE_TO_JSVAL( JS_NewDouble( g_ScriptingHost.getContext(), Native ) ) ); } template<> bool ToPrimitive( JSContext* cx, jsval v, float& Storage ) { try { Storage = (float)g_ScriptingHost.ValueToDouble( v ); } catch( PSERROR_Scripting_ConversionFailed ) { return( false ); } return( true ); } // bool template<> jsval ToJSVal( const bool& Native ) { return( BOOLEAN_TO_JSVAL( Native ) ); } template<> jsval ToJSVal( bool& Native ) { return( BOOLEAN_TO_JSVAL( Native ) ); } template<> bool ToPrimitive( JSContext* cx, jsval v, bool& Storage ) { try { Storage = g_ScriptingHost.ValueToBool( v ); } catch( PSERROR_Scripting_ConversionFailed ) { return( false ); } return( true ); } // CStrW template<> bool ToPrimitive( JSContext* cx, jsval v, CStrW& Storage ) { try { Storage = g_ScriptingHost.ValueToUCString( v ); } catch( PSERROR_Scripting_ConversionFailed ) { return( false ); } return( true ); } template<> jsval ToJSVal( const CStrW& Native ) { return( STRING_TO_JSVAL( JS_NewUCStringCopyZ( g_ScriptingHost.GetContext(), Native.utf16().c_str() ) ) ); } template<> jsval ToJSVal( CStrW& Native ) { return( STRING_TO_JSVAL( JS_NewUCStringCopyZ( g_ScriptingHost.GetContext(), Native.utf16().c_str() ) ) ); } // jsval template<> jsval ToJSVal( const jsval& Native ) { return( Native ); } // String->JSVal jsval JSParseString( const CStrW& Native ) { CParser stringParser; stringParser.InputTaskType( "string", "_$value_" ); CParserLine result; result.ParseString( stringParser, (CStr)Native ); bool boolResult; int intResult; float floatResult; if( result.GetArgBool( 0, boolResult ) ) return( BOOLEAN_TO_JSVAL( boolResult ) ); if( result.GetArgInt( 0, intResult ) ) { if( INT_FITS_IN_JSVAL( intResult ) ) return( ToJSVal( intResult ) ); } if( result.GetArgFloat( 0, floatResult ) ) return( ToJSVal( floatResult ) ); return( ToJSVal( Native ) ); }