2004-10-07 21:23:35 +02:00
|
|
|
// A general system of converting between native objects and their JavaScript representations
|
|
|
|
|
2007-05-07 18:33:24 +02:00
|
|
|
#ifndef INCLUDED_JSCONVERSIONS
|
|
|
|
#define INCLUDED_JSCONVERSIONS
|
2004-10-07 21:23:35 +02:00
|
|
|
|
|
|
|
#include "scripting/ScriptingHost.h"
|
|
|
|
|
|
|
|
class CEntity;
|
|
|
|
class HEntity;
|
2006-07-13 05:29:33 +02:00
|
|
|
class CEntityTemplate;
|
2004-10-07 21:23:35 +02:00
|
|
|
class CStrW;
|
|
|
|
class CScriptObject;
|
|
|
|
class CObjectEntry;
|
|
|
|
class CVector3D;
|
2005-01-18 11:52:22 +01:00
|
|
|
class CPlayer;
|
2004-10-07 21:23:35 +02:00
|
|
|
|
|
|
|
// -----
|
|
|
|
//
|
|
|
|
// Defaults
|
|
|
|
//
|
|
|
|
// -----
|
|
|
|
|
|
|
|
template<typename T> T* ToNative( JSContext* cx, JSObject* obj )
|
|
|
|
{
|
|
|
|
return( (T*)JS_GetInstancePrivate( cx, obj, &T::JSI_class, NULL ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename T> JSObject* ToScript( T* Native )
|
|
|
|
{
|
2004-10-23 16:39:28 +02:00
|
|
|
if( !Native )
|
2005-05-10 09:13:25 +02:00
|
|
|
return( (JSObject*)NULL );
|
2004-10-07 21:23:35 +02:00
|
|
|
return( Native->GetScript() );
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename T> T* ToNative( jsval v )
|
|
|
|
{
|
|
|
|
if( !JSVAL_IS_OBJECT( v ) ) return( NULL );
|
2005-05-10 09:13:25 +02:00
|
|
|
if( v == JSVAL_NULL ) return( NULL );
|
2004-10-07 21:23:35 +02:00
|
|
|
return( ToNative<T>( g_ScriptingHost.GetContext(), JSVAL_TO_OBJECT( v ) ) );
|
|
|
|
}
|
|
|
|
|
2005-08-09 17:55:44 +02:00
|
|
|
template<typename T> bool ToPrimitive( JSContext* UNUSED(cx), jsval v, T& Storage )
|
2004-10-07 21:23:35 +02:00
|
|
|
{
|
|
|
|
T* Native = ToNative<T>( v );
|
|
|
|
if( !Native ) return( false );
|
|
|
|
Storage = *Native;
|
|
|
|
return( true );
|
|
|
|
}
|
|
|
|
|
2004-11-11 08:09:32 +01:00
|
|
|
// Handle pointer-to-objects sensibly (by automatically dereferencing them one level)
|
2005-08-09 17:55:44 +02:00
|
|
|
template<typename T> bool ToPrimitive( JSContext* UNUSED(cx), jsval v, T*& Storage )
|
2004-11-11 08:09:32 +01:00
|
|
|
{
|
|
|
|
T* Native = ToNative<T>( v );
|
|
|
|
if( !Native ) return( false );
|
|
|
|
Storage = Native;
|
|
|
|
return( true );
|
|
|
|
}
|
|
|
|
|
2005-08-13 20:32:58 +02:00
|
|
|
// Throws PSERROR_Scripting_ConversionFailed on failure.
|
|
|
|
template<typename T> inline T ToPrimitive( JSContext* cx, jsval v )
|
|
|
|
{
|
|
|
|
T Temp;
|
|
|
|
bool ok = ToPrimitive( cx, v, Temp );
|
|
|
|
if( !ok ) throw PSERROR_Scripting_ConversionFailed();
|
|
|
|
return( Temp );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Throws PSERROR_Scripting_ConversionFailed on failure.
|
|
|
|
template<typename T> inline T ToPrimitive( jsval v )
|
|
|
|
{
|
|
|
|
return( ToPrimitive<T>( g_ScriptingHost.GetContext(), v ) );
|
|
|
|
}
|
2004-10-07 21:23:35 +02:00
|
|
|
|
|
|
|
template<typename T> jsval ToJSVal( T& Native )
|
|
|
|
{
|
|
|
|
return( OBJECT_TO_JSVAL( ToScript<T>( &Native ) ) );
|
|
|
|
}
|
|
|
|
|
2004-11-11 08:09:32 +01:00
|
|
|
template<typename T> jsval ToJSVal( T*& Native )
|
|
|
|
{
|
|
|
|
return( OBJECT_TO_JSVAL( ToScript<T>( Native ) ) );
|
|
|
|
}
|
|
|
|
|
2004-10-07 21:23:35 +02:00
|
|
|
template<typename T> jsval ToJSVal( const T& Native );
|
|
|
|
|
|
|
|
// -----
|
|
|
|
//
|
|
|
|
// Overrides
|
|
|
|
//
|
|
|
|
// -----
|
|
|
|
|
|
|
|
// CVector3D
|
|
|
|
template<> CVector3D* ToNative<CVector3D>( JSContext* cx, JSObject* obj );
|
|
|
|
template<> JSObject* ToScript<CVector3D>( CVector3D* Native );
|
2005-03-29 00:13:47 +02:00
|
|
|
template<> jsval ToJSVal<CVector3D>( const CVector3D& Native );
|
2004-10-07 21:23:35 +02:00
|
|
|
|
2006-07-13 05:29:33 +02:00
|
|
|
// CEntityTemplate
|
|
|
|
template<> bool ToPrimitive<CEntityTemplate*>( JSContext* cx, jsval v, CEntityTemplate*& Storage );
|
|
|
|
template<> JSObject* ToScript<CEntityTemplate*>( CEntityTemplate** Native );
|
2004-10-07 21:23:35 +02:00
|
|
|
|
|
|
|
// CObjectEntry
|
2004-11-11 08:09:32 +01:00
|
|
|
template<> bool ToPrimitive<CObjectEntry>( JSContext* cx, jsval v, CObjectEntry*& Storage );
|
|
|
|
template<> jsval ToJSVal<CObjectEntry>( CObjectEntry*& Native );
|
2004-10-07 21:23:35 +02:00
|
|
|
|
|
|
|
// HEntity
|
|
|
|
template<> HEntity* ToNative<HEntity>( JSContext* cx, JSObject* obj );
|
|
|
|
template<> JSObject* ToScript<HEntity>( HEntity* Native );
|
|
|
|
|
2005-01-18 11:52:22 +01:00
|
|
|
// CPlayer*
|
|
|
|
template<> bool ToPrimitive<CPlayer*>( JSContext* cx, jsval v, CPlayer*& Storage );
|
|
|
|
template<> JSObject* ToScript<CPlayer*>( CPlayer** Native );
|
|
|
|
|
2004-10-07 21:23:35 +02:00
|
|
|
// CScriptObject
|
|
|
|
template<> bool ToPrimitive<CScriptObject>( JSContext* cx, jsval v, CScriptObject& Storage );
|
|
|
|
template<> jsval ToJSVal<CScriptObject>( CScriptObject& Native );
|
|
|
|
|
2004-11-11 08:09:32 +01:00
|
|
|
// int
|
|
|
|
template<> bool ToPrimitive<int>( JSContext* cx, jsval v, int& Storage );
|
|
|
|
template<> jsval ToJSVal<int>( const int& Native );
|
|
|
|
template<> jsval ToJSVal<int>( int& Native );
|
|
|
|
|
|
|
|
// uint
|
|
|
|
template<> bool ToPrimitive<uint>( JSContext* cx, jsval v, uint& Storage );
|
|
|
|
template<> jsval ToJSVal<uint>( const uint& Native );
|
|
|
|
template<> jsval ToJSVal<uint>( uint& Native );
|
2004-10-07 21:23:35 +02:00
|
|
|
|
|
|
|
// double
|
|
|
|
template<> bool ToPrimitive<double>( JSContext* cx, jsval v, double& Storage );
|
|
|
|
template<> jsval ToJSVal<double>( const double& Native );
|
|
|
|
template<> jsval ToJSVal<double>( double& Native );
|
|
|
|
|
|
|
|
// float
|
|
|
|
template<> bool ToPrimitive<float>( JSContext* cx, jsval v, float& Storage );
|
|
|
|
template<> jsval ToJSVal<float>( const float& Native );
|
|
|
|
template<> jsval ToJSVal<float>( float& Native );
|
|
|
|
|
|
|
|
// bool
|
|
|
|
template<> bool ToPrimitive<bool>( JSContext* cx, jsval v, bool& Storage );
|
|
|
|
template<> jsval ToJSVal<bool>( const bool& Native );
|
|
|
|
template<> jsval ToJSVal<bool>( bool& Native );
|
|
|
|
|
2005-03-30 18:14:19 +02:00
|
|
|
/*
|
|
|
|
// char*
|
|
|
|
template<> bool ToPrimitive<char*>( JSContext* cx, jsval v, char*& Storage );
|
|
|
|
template<> jsval ToJSVal<char*>( const char* Native );
|
|
|
|
template<> jsval ToJSVal<char*>( char* Native );
|
|
|
|
*/
|
|
|
|
|
2004-10-07 21:23:35 +02:00
|
|
|
// CStrW
|
|
|
|
template<> bool ToPrimitive<CStrW>( JSContext* cx, jsval v, CStrW& Storage );
|
|
|
|
template<> jsval ToJSVal<CStrW>( const CStrW& Native );
|
|
|
|
template<> jsval ToJSVal<CStrW>( CStrW& Native );
|
|
|
|
|
2005-05-03 06:27:07 +02:00
|
|
|
// CStr(8)
|
|
|
|
template<> bool ToPrimitive<CStr8>( JSContext* cx, jsval v, CStr8& Storage );
|
|
|
|
template<> jsval ToJSVal<CStr8>( const CStr8& Native );
|
|
|
|
template<> jsval ToJSVal<CStr8>( CStr8& Native );
|
|
|
|
|
2004-10-07 21:23:35 +02:00
|
|
|
// jsval
|
|
|
|
|
2007-05-29 21:01:21 +02:00
|
|
|
// Don't want to just use jsval directly, because it's equivalent to long and
|
|
|
|
// can cause conflicts or confusion. So create a simple wrapper class for it,
|
|
|
|
// so it's a real distinguishable type.
|
|
|
|
struct jsval_t
|
|
|
|
{
|
|
|
|
jsval v;
|
|
|
|
jsval_t(jsval v) : v(v) {}
|
|
|
|
};
|
|
|
|
template<> jsval ToJSVal<jsval_t>( const jsval_t& Native );
|
2004-10-07 21:23:35 +02:00
|
|
|
|
2004-11-27 21:02:51 +01:00
|
|
|
// Intelligent CStrW->JSVal conversion
|
2004-10-07 21:23:35 +02:00
|
|
|
|
2004-11-27 21:02:51 +01:00
|
|
|
jsval JSParseString( const CStrW& String );
|
2004-10-07 21:23:35 +02:00
|
|
|
|
2005-05-03 06:27:07 +02:00
|
|
|
/* MT: Maybe:
|
|
|
|
#define JSCOPY_CAST( For, Use ) \
|
|
|
|
template<> bool ToPrimitive<For>( JSContext* cx, jsval v, For& Storage ) \
|
|
|
|
{ \
|
|
|
|
Use temp; \
|
|
|
|
if( !ToPrimitive<Use>( cx, v, temp ) ) \
|
|
|
|
return( false ); \
|
|
|
|
Storage = (For)temp; \
|
|
|
|
} \
|
|
|
|
template<> jsval ToJSVal<For>( const For& Native ) \
|
|
|
|
{ \
|
|
|
|
Use temp = (Use)Native; \
|
|
|
|
return( ToJSVal<Use>( temp ) ); \
|
|
|
|
} \
|
|
|
|
template<> jsval ToJSVal<For>( For& Native ) \
|
|
|
|
{ \
|
|
|
|
Use temp = (Use)Native; \
|
|
|
|
return( ToJSVal<Use>( temp ) ); \
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
2004-11-07 22:30:47 +01:00
|
|
|
#endif
|