/* =========================================================================== Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Doom 3 BFG Edition Source Code. If not, see . In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. =========================================================================== */ #ifndef __SWF_SCRIPTOBJECT_H__ #define __SWF_SCRIPTOBJECT_H__ class idSWFSpriteInstance; /* ======================== This is the base class for script variables which are implemented in code ======================== */ class idSWFScriptNativeVariable { public: virtual bool IsReadOnly() { return false; } virtual void Set( class idSWFScriptObject* object, const idSWFScriptVar& value ) = 0; virtual idSWFScriptVar Get( class idSWFScriptObject* object ) = 0; }; #define SWF_NATIVE_VAR_DECLARE( x ) \ class idSWFScriptNativeVar_##x : public idSWFScriptNativeVariable { \ public: \ void Set( class idSWFScriptObject * object, const idSWFScriptVar & value ); \ idSWFScriptVar Get( class idSWFScriptObject * object ); \ } swfScriptVar_##x; #define SWF_NATIVE_VAR_DECLARE_READONLY( x ) \ class idSWFScriptNativeVar_##x : public idSWFScriptNativeVariable { \ public: \ bool IsReadOnly() { return true; } \ void Set( class idSWFScriptObject * object, const idSWFScriptVar & value ) { assert( false ); } \ idSWFScriptVar Get( class idSWFScriptObject * object ); \ } swfScriptVar_##x; /* ======================== This is a helper class for quickly setting up native variables which need access to a parent class ======================== */ template< typename T > class idSWFScriptNativeVariable_Nested : public idSWFScriptNativeVariable { public: idSWFScriptNativeVariable_Nested() : pThis( NULL ) { } idSWFScriptNativeVariable_Nested* Bind( T* p ) { pThis = p; return this; } virtual void Set( class idSWFScriptObject* object, const idSWFScriptVar& value ) = 0; virtual idSWFScriptVar Get( class idSWFScriptObject* object ) = 0; protected: T* pThis; }; #define SWF_NATIVE_VAR_DECLARE_NESTED( x, y ) \ class idSWFScriptNativeVar_##x : public idSWFScriptNativeVariable_Nested { \ public: \ void Set( class idSWFScriptObject * object, const idSWFScriptVar & value ); \ idSWFScriptVar Get( class idSWFScriptObject * object ); \ } swfScriptVar_##x; #define SWF_NATIVE_VAR_DECLARE_NESTED_READONLY( x, y, z ) \ class idSWFScriptNativeVar_##x : public idSWFScriptNativeVariable_Nested { \ public: \ bool IsReadOnly() { return true; } \ void Set( class idSWFScriptObject * object, const idSWFScriptVar & value ) { assert( false ); } \ idSWFScriptVar Get( class idSWFScriptObject * object ) { return pThis->z; } \ } swfScriptVar_##x; /* ======================== An object in an action script is a collection of variables. functions are also variables. ======================== */ class idSWFScriptObject { public: idSWFScriptObject(); virtual ~idSWFScriptObject(); static idSWFScriptObject* Alloc(); void AddRef(); void Release(); void SetNoAutoDelete( bool b ) { noAutoDelete = b; } void Clear(); void MakeArray(); void SetSprite( idSWFSpriteInstance* s ) { objectType = SWF_OBJECT_SPRITE; data.sprite = s; } idSWFSpriteInstance* GetSprite() { return ( objectType == SWF_OBJECT_SPRITE ) ? data.sprite : NULL; } void SetText( idSWFTextInstance* t ) { objectType = SWF_OBJECT_TEXT; data.text = t; } idSWFTextInstance* GetText() { return ( objectType == SWF_OBJECT_TEXT ) ? data.text : NULL; } // Also accessible via __proto__ property idSWFScriptObject* GetPrototype() { return prototype; } void SetPrototype( idSWFScriptObject* _prototype ) { assert( prototype == NULL ); prototype = _prototype; prototype->AddRef(); } idSWFScriptVar Get( int index ); idSWFScriptVar Get( const char* name ); idSWFSpriteInstance* GetSprite( int index ); idSWFSpriteInstance* GetSprite( const char* name ); idSWFScriptObject* GetObject( int index ); idSWFScriptObject* GetObject( const char* name ); idSWFTextInstance* GetText( int index ); idSWFTextInstance* GetText( const char* name ); void Set( int index, const idSWFScriptVar& value ); void Set( const char* name, const idSWFScriptVar& value ); void SetNative( const char* name, idSWFScriptNativeVariable* native ); bool HasProperty( const char* name ); bool HasValidProperty( const char* name ); idSWFScriptVar DefaultValue( bool stringHint ); // This is to implement for-in (fixme: respect DONTENUM flag) int NumVariables() { return variables.Num(); } const char* EnumVariable( int i ) { return variables[i].name; } idSWFScriptVar GetNestedVar( const char* arg1, const char* arg2 = NULL, const char* arg3 = NULL, const char* arg4 = NULL, const char* arg5 = NULL, const char* arg6 = NULL ); idSWFScriptObject* GetNestedObj( const char* arg1, const char* arg2 = NULL, const char* arg3 = NULL, const char* arg4 = NULL, const char* arg5 = NULL, const char* arg6 = NULL ); idSWFSpriteInstance* GetNestedSprite( const char* arg1, const char* arg2 = NULL, const char* arg3 = NULL, const char* arg4 = NULL, const char* arg5 = NULL, const char* arg6 = NULL ); idSWFTextInstance* GetNestedText( const char* arg1, const char* arg2 = NULL, const char* arg3 = NULL, const char* arg4 = NULL, const char* arg5 = NULL, const char* arg6 = NULL ); void PrintToConsole() const; private: int refCount; bool noAutoDelete; enum swfNamedVarFlags_t { SWF_VAR_FLAG_NONE = 0, SWF_VAR_FLAG_READONLY = BIT( 1 ), SWF_VAR_FLAG_DONTENUM = BIT( 2 ) }; struct swfNamedVar_t { swfNamedVar_t() : native( NULL ) { } ~swfNamedVar_t(); swfNamedVar_t& operator=( const swfNamedVar_t& other ); int index; int hashNext; idStr name; idSWFScriptVar value; idSWFScriptNativeVariable* native; int flags; }; idList< swfNamedVar_t, TAG_SWF > variables; static const int VARIABLE_HASH_BUCKETS = 16; int variablesHash[VARIABLE_HASH_BUCKETS]; idSWFScriptObject* prototype; enum swfObjectType_t { SWF_OBJECT_OBJECT, SWF_OBJECT_ARRAY, SWF_OBJECT_SPRITE, SWF_OBJECT_TEXT } objectType; union swfObjectData_t { idSWFSpriteInstance* sprite; // only valid if objectType == SWF_OBJECT_SPRITE idSWFTextInstance* text; // only valid if objectType == SWF_OBJECT_TEXT } data; swfNamedVar_t* GetVariable( int index, bool create ); swfNamedVar_t* GetVariable( const char* name, bool create ); }; #endif // !__SWF_SCRIPTOBJECT_H__