| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | // Value.cpp: implementation of the CValue class.
 | 
					
						
							|  |  |  | // developed at Eindhoven University of Technology, 1997
 | 
					
						
							|  |  |  | // by the OOPS team
 | 
					
						
							|  |  |  | //////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 1996-2000 Erwin Coumans <coockie@acm.org> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Permission to use, copy, modify, distribute and sell this software | 
					
						
							|  |  |  |  * and its documentation for any purpose is hereby granted without fee, | 
					
						
							|  |  |  |  * provided that the above copyright notice appear in all copies and | 
					
						
							|  |  |  |  * that both that copyright notice and this permission notice appear | 
					
						
							|  |  |  |  * in supporting documentation.  Erwin Coumans makes no | 
					
						
							|  |  |  |  * representations about the suitability of this software for any | 
					
						
							|  |  |  |  * purpose.  It is provided "as is" without express or implied warranty. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #include "Value.h"
 | 
					
						
							|  |  |  | #include "FloatValue.h"
 | 
					
						
							|  |  |  | #include "IntValue.h"
 | 
					
						
							|  |  |  | #include "VectorValue.h"
 | 
					
						
							|  |  |  | #include "VoidValue.h"
 | 
					
						
							|  |  |  | #include "StringValue.h"
 | 
					
						
							|  |  |  | #include "ErrorValue.h"
 | 
					
						
							|  |  |  | #include "ListValue.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-11-25 15:29:57 +00:00
										 |  |  | #ifdef HAVE_CONFIG_H
 | 
					
						
							|  |  |  | #include <config.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | //////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | // Construction/Destruction
 | 
					
						
							|  |  |  | //////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | double CValue::m_sZeroVec[3] = {0.0,0.0,0.0}; | 
					
						
							| 
									
										
										
										
											2008-12-29 16:36:58 +00:00
										 |  |  | bool CValue::m_ignore_deprecation_warnings(false); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifndef NO_EXP_PYTHON_EMBEDDING
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyTypeObject CValue::Type = { | 
					
						
							| 
									
										
										
										
											2009-04-03 14:51:06 +00:00
										 |  |  | 	PyObject_HEAD_INIT(NULL) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	0, | 
					
						
							|  |  |  | 	"CValue", | 
					
						
							| 
									
										
										
										
											2009-04-19 14:57:52 +00:00
										 |  |  | 	sizeof(PyObjectPlus_Proxy), | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	0, | 
					
						
							| 
									
										
										
										
											2009-04-19 14:57:52 +00:00
										 |  |  | 	py_base_dealloc, | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	0, | 
					
						
							| 
									
										
										
										
											2009-04-03 14:51:06 +00:00
										 |  |  | 	0, | 
					
						
							|  |  |  | 	0, | 
					
						
							| 
									
										
										
										
											2009-04-19 06:48:27 +00:00
										 |  |  | 	0, | 
					
						
							| 
									
										
										
										
											2009-04-03 14:51:06 +00:00
										 |  |  | 	py_base_repr, | 
					
						
							| 
									
										
										
										
											2009-04-19 06:48:27 +00:00
										 |  |  | 	0, | 
					
						
							| 
									
										
										
										
											2009-04-03 14:51:06 +00:00
										 |  |  | 	0,0,0,0,0, | 
					
						
							|  |  |  | 	py_base_getattro, | 
					
						
							|  |  |  | 	py_base_setattro, | 
					
						
							|  |  |  | 	0,0,0,0,0,0,0,0,0, | 
					
						
							| 
									
										
										
										
											2009-04-03 04:12:20 +00:00
										 |  |  | 	Methods | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyParentObject CValue::Parents[] = { | 
					
						
							|  |  |  | 	&CValue::Type, | 
					
						
							|  |  |  | 		NULL | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyMethodDef CValue::Methods[] = { | 
					
						
							| 
									
										
										
										
											2008-08-14 03:23:36 +00:00
										 |  |  | //  	{ "printHello", (PyCFunction) CValue::sPyPrintHello, METH_VARARGS},
 | 
					
						
							|  |  |  | 	{ "getName", (PyCFunction) CValue::sPyGetName, METH_NOARGS}, | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	{NULL,NULL} //Sentinel
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-19 17:29:07 +00:00
										 |  |  | PyObject* CValue::PyGetName() | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-08-14 03:23:36 +00:00
										 |  |  | 	return PyString_FromString(this->GetName()); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | /*#define CVALUE_DEBUG*/ | 
					
						
							|  |  |  | #ifdef CVALUE_DEBUG
 | 
					
						
							|  |  |  | int gRefCount; | 
					
						
							|  |  |  | struct SmartCValueRef  | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	CValue *m_ref; | 
					
						
							|  |  |  | 	int m_count; | 
					
						
							|  |  |  | 	SmartCValueRef(CValue *ref) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		m_ref = ref; | 
					
						
							|  |  |  | 		m_count = gRefCount++; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | #include <vector>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | std::vector<SmartCValueRef> gRefList; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _DEBUG
 | 
					
						
							|  |  |  | //int gRefCountValue;
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | CValue::CValue(PyTypeObject *T) | 
					
						
							|  |  |  | 		: PyObjectPlus(T), | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | CValue::CValue() | 
					
						
							|  |  |  | :  | 
					
						
							|  |  |  | #endif //NO_EXP_PYTHON_EMBEDDING
 | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2004-04-24 06:40:15 +00:00
										 |  |  | m_pNamedPropertyArray(NULL), | 
					
						
							|  |  |  | m_refcount(1) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | pre: false | 
					
						
							|  |  |  | effect: constucts a CValue | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	//debug(gRefCountValue++)	// debugging
 | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | #ifdef _DEBUG
 | 
					
						
							|  |  |  | 	//gRefCountValue++;
 | 
					
						
							|  |  |  | #ifdef CVALUE_DEBUG
 | 
					
						
							|  |  |  | 	gRefList.push_back(SmartCValueRef(this)); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CValue::~CValue() | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  | pre: | 
					
						
							|  |  |  | effect: deletes the object | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	ClearProperties(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	assertd (m_refcount==0); | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | #ifdef CVALUE_DEBUG
 | 
					
						
							|  |  |  | 	std::vector<SmartCValueRef>::iterator it; | 
					
						
							|  |  |  | 	for (it=gRefList.begin(); it!=gRefList.end(); it++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (it->m_ref == this) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			*it = gRefList.back(); | 
					
						
							|  |  |  | 			gRefList.pop_back(); | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define VALUE_SUB(val1, val2) (val1)->Calc(VALUE_SUB_OPERATOR, val2)
 | 
					
						
							|  |  |  | #define VALUE_MUL(val1, val2) (val1)->Calc(VALUE_MUL_OPERATOR, val2)
 | 
					
						
							|  |  |  | #define VALUE_DIV(val1, val2) (val1)->Calc(VALUE_DIV_OPERATOR, val2)
 | 
					
						
							|  |  |  | #define VALUE_NEG(val1)       (val1)->Calc(VALUE_NEG_OPERATOR, val1)
 | 
					
						
							|  |  |  | #define VALUE_POS(val1)       (val1)->Calc(VALUE_POS_OPERATOR, val1)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | STR_String CValue::op2str (VALUE_OPERATOR op) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	//pre:
 | 
					
						
							|  |  |  | 	//ret: the stringrepresentation of operator op
 | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	STR_String opmsg; | 
					
						
							|  |  |  | 	switch (op) { | 
					
						
							| 
									
										
										
										
											2009-03-11 22:11:52 +00:00
										 |  |  | 	case VALUE_MOD_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " % "; | 
					
						
							|  |  |  | 		break; | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	case VALUE_ADD_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " + "; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_SUB_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " - "; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_MUL_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " * "; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_DIV_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " / "; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_NEG_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " -"; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_POS_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " +"; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_AND_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " & "; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_OR_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " | "; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_EQL_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " = "; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_NEQ_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " != "; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_NOT_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " !"; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		opmsg="Error in Errorhandling routine."; | 
					
						
							|  |  |  | 		//		AfxMessageBox("Invalid operator");
 | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return opmsg; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //---------------------------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | //	Property Management
 | 
					
						
							|  |  |  | //---------------------------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Set property <ioProperty>, overwrites and releases a previous property with the same name if needed
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | void CValue::SetProperty(const STR_String & name,CValue* ioProperty) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (ioProperty==NULL) | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	{	// Check if somebody is setting an empty property
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 		trace("Warning:trying to set empty property!"); | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	if (m_pNamedPropertyArray) | 
					
						
							|  |  |  | 	{	// Try to replace property (if so -> exit as soon as we replaced it)
 | 
					
						
							|  |  |  | 		CValue* oldval = (*m_pNamedPropertyArray)[name]; | 
					
						
							|  |  |  | 		if (oldval) | 
					
						
							|  |  |  | 			oldval->Release(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else { // Make sure we have a property array
 | 
					
						
							| 
									
										
										
										
											2003-12-01 15:01:20 +00:00
										 |  |  | 		m_pNamedPropertyArray = new std::map<STR_String,CValue *>; | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	// Add property at end of array
 | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | 	(*m_pNamedPropertyArray)[name] = ioProperty->AddRef();//->Add(ioProperty);
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | void CValue::SetProperty(const char* name,CValue* ioProperty) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (ioProperty==NULL) | 
					
						
							|  |  |  | 	{	// Check if somebody is setting an empty property
 | 
					
						
							|  |  |  | 		trace("Warning:trying to set empty property!"); | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	if (m_pNamedPropertyArray) | 
					
						
							|  |  |  | 	{	// Try to replace property (if so -> exit as soon as we replaced it)
 | 
					
						
							|  |  |  | 		CValue* oldval = (*m_pNamedPropertyArray)[name]; | 
					
						
							|  |  |  | 		if (oldval) | 
					
						
							|  |  |  | 			oldval->Release(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else { // Make sure we have a property array
 | 
					
						
							|  |  |  | 		m_pNamedPropertyArray = new std::map<STR_String,CValue *>; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	// Add property at end of array
 | 
					
						
							|  |  |  | 	(*m_pNamedPropertyArray)[name] = ioProperty->AddRef();//->Add(ioProperty);
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Get pointer to a property with name <inName>, returns NULL if there is no property named <inName>
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | CValue* CValue::GetProperty(const STR_String & inName) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	if (m_pNamedPropertyArray) { | 
					
						
							|  |  |  | 		std::map<STR_String,CValue*>::iterator it = m_pNamedPropertyArray->find(inName); | 
					
						
							|  |  |  | 		if (it != m_pNamedPropertyArray->end()) | 
					
						
							|  |  |  | 			return (*it).second; | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	return NULL; | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | CValue* CValue::GetProperty(const char *inName) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (m_pNamedPropertyArray) { | 
					
						
							|  |  |  | 		std::map<STR_String,CValue*>::iterator it = m_pNamedPropertyArray->find(inName); | 
					
						
							|  |  |  | 		if (it != m_pNamedPropertyArray->end()) | 
					
						
							|  |  |  | 			return (*it).second; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Get text description of property with name <inName>, returns an empty string if there is no property named <inName>
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | STR_String CValue::GetPropertyText(const STR_String & inName,const STR_String& deftext) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	CValue *property = GetProperty(inName); | 
					
						
							|  |  |  | 	if (property) | 
					
						
							|  |  |  | 		return property->GetText(); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		return deftext;//String::sEmpty;
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | float CValue::GetPropertyNumber(const STR_String& inName,float defnumber) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	CValue *property = GetProperty(inName); | 
					
						
							|  |  |  | 	if (property) | 
					
						
							| 
									
										
										
										
											2009-04-12 06:41:01 +00:00
										 |  |  | 		return property->GetNumber();  | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	else | 
					
						
							|  |  |  | 		return defnumber; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Remove the property named <inName>, returns true if the property was succesfully removed, false if property was not found or could not be removed
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | bool CValue::RemoveProperty(const char *inName) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	// Check if there are properties at all which can be removed
 | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	if (m_pNamedPropertyArray) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		std::map<STR_String,CValue*>::iterator it = m_pNamedPropertyArray->find(inName); | 
					
						
							|  |  |  | 		if (it != m_pNamedPropertyArray->end()) | 
					
						
							| 
									
										
										
										
											2008-09-03 06:43:07 +00:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 			((*it).second)->Release(); | 
					
						
							|  |  |  | 			m_pNamedPropertyArray->erase(it); | 
					
						
							| 
									
										
										
										
											2008-09-03 06:43:07 +00:00
										 |  |  | 			return true; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-09-03 06:43:07 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-12 10:21:37 +00:00
										 |  |  | //
 | 
					
						
							|  |  |  | // Get Property Names
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | vector<STR_String> CValue::GetPropertyNames() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	vector<STR_String> result; | 
					
						
							|  |  |  | 	if(!m_pNamedPropertyArray) return result; | 
					
						
							| 
									
										
										
										
											2009-04-09 09:50:17 +00:00
										 |  |  | 	result.reserve(m_pNamedPropertyArray->size()); | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	std::map<STR_String,CValue*>::iterator it; | 
					
						
							|  |  |  | 	for (it= m_pNamedPropertyArray->begin(); (it != m_pNamedPropertyArray->end()); it++) | 
					
						
							| 
									
										
										
										
											2008-07-12 10:21:37 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		result.push_back((*it).first); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return result; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Clear all properties
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | void CValue::ClearProperties() | 
					
						
							|  |  |  | {		 | 
					
						
							|  |  |  | 	// Check if we have any properties
 | 
					
						
							|  |  |  | 	if (m_pNamedPropertyArray == NULL) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Remove all properties
 | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	std::map<STR_String,CValue*>::iterator it; | 
					
						
							|  |  |  | 	for (it= m_pNamedPropertyArray->begin();(it != m_pNamedPropertyArray->end()); it++) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		CValue* tmpval = (*it).second; | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | 		//STR_String name = (*it).first;
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 		tmpval->Release(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Delete property array
 | 
					
						
							|  |  |  | 	delete m_pNamedPropertyArray; | 
					
						
							|  |  |  | 	m_pNamedPropertyArray=NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Set all properties' modified flag to <inModified>
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | void CValue::SetPropertiesModified(bool inModified) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	if(!m_pNamedPropertyArray) return; | 
					
						
							|  |  |  | 	std::map<STR_String,CValue*>::iterator it; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	for (it= m_pNamedPropertyArray->begin();(it != m_pNamedPropertyArray->end()); it++) | 
					
						
							|  |  |  | 		((*it).second)->SetModified(inModified); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Check if any of the properties in this value have been modified
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | bool CValue::IsAnyPropertyModified() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	if(!m_pNamedPropertyArray) return false; | 
					
						
							|  |  |  | 	std::map<STR_String,CValue*>::iterator it; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	for (it= m_pNamedPropertyArray->begin();(it != m_pNamedPropertyArray->end()); it++) | 
					
						
							|  |  |  | 		if (((*it).second)->IsModified()) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 			return true; | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Get property number <inIndex>
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | CValue* CValue::GetProperty(int inIndex) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int count=0; | 
					
						
							|  |  |  | 	CValue* result = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (m_pNamedPropertyArray) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 		std::map<STR_String,CValue*>::iterator it; | 
					
						
							|  |  |  | 		for (it= m_pNamedPropertyArray->begin(); (it != m_pNamedPropertyArray->end()); it++) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			if (count++==inIndex) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				result = (*it).second; | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Get the amount of properties assiocated with this value
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | int CValue::GetPropertyCount() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (m_pNamedPropertyArray) | 
					
						
							|  |  |  | 		return m_pNamedPropertyArray->size(); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CValue::CloneProperties(CValue *replica) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if (m_pNamedPropertyArray) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		replica->m_pNamedPropertyArray=NULL; | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 		std::map<STR_String,CValue*>::iterator it; | 
					
						
							|  |  |  | 		for (it= m_pNamedPropertyArray->begin(); (it != m_pNamedPropertyArray->end()); it++) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | 			CValue *val = (*it).second->GetReplica(); | 
					
						
							|  |  |  | 			replica->SetProperty((*it).first,val); | 
					
						
							|  |  |  | 			val->Release(); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | double*		CValue::GetVector3(bool bGetTransformedVec) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	assertd(false); // don;t get vector from me
 | 
					
						
							|  |  |  | 	return m_sZeroVec;//::sZero;
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*---------------------------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 	Reference Counting | 
					
						
							|  |  |  | ---------------------------------------------------------------------------------------------------------------------*/ | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Add a reference to this value
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | CValue *CValue::AddRef() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	// Increase global reference count, used to see at the end of the program
 | 
					
						
							|  |  |  | 	// if all CValue-derived classes have been dereferenced to 0
 | 
					
						
							|  |  |  | 	//debug(gRefCountValue++);
 | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | #ifdef _DEBUG
 | 
					
						
							|  |  |  | 	//gRefCountValue++;
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	m_refcount++;  | 
					
						
							|  |  |  | 	return this; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Release a reference to this value (when reference count reaches 0, the value is removed from the heap)
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | int	CValue::Release() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	// Decrease global reference count, used to see at the end of the program
 | 
					
						
							|  |  |  | 	// if all CValue-derived classes have been dereferenced to 0
 | 
					
						
							|  |  |  | 	//debug(gRefCountValue--);
 | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | #ifdef _DEBUG
 | 
					
						
							|  |  |  | 	//gRefCountValue--;
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	// Decrease local reference count, if it reaches 0 the object should be freed
 | 
					
						
							|  |  |  | 	if (--m_refcount > 0) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// Reference count normal, return new reference count
 | 
					
						
							|  |  |  | 		return m_refcount; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// Reference count reached 0, delete ourselves and return 0
 | 
					
						
							| 
									
										
										
										
											2005-03-25 10:33:39 +00:00
										 |  |  | //		MT_assert(m_refcount==0, "Reference count reached sub-zero, object released too much");
 | 
					
						
							| 
									
										
										
										
											2009-04-17 20:06:06 +00:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 		delete this; | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Disable reference counting for this value
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | void CValue::DisableRefCount() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	assertd(m_refcount == 1); | 
					
						
							|  |  |  | 	m_refcount--; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//debug(gRefCountValue--);
 | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | #ifdef _DEBUG
 | 
					
						
							|  |  |  | 	//gRefCountValue--;
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	m_ValFlags.RefCountDisabled=true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CValue::AddDataToReplica(CValue *replica) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	replica->m_refcount = 1; | 
					
						
							| 
									
										
										
										
											2005-12-31 07:20:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | #ifdef _DEBUG
 | 
					
						
							|  |  |  | 	//gRefCountValue++;
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 	replica->m_ValFlags.RefCountDisabled = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	replica->ReplicaSetName(GetName()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//copy all props
 | 
					
						
							|  |  |  | 	CloneProperties(replica); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CValue*	CValue::FindIdentifier(const STR_String& identifiername) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	CValue* result = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int pos = 0; | 
					
						
							|  |  |  | 	// if a dot exists, explode the name into pieces to get the subcontext
 | 
					
						
							|  |  |  | 	if ((pos=identifiername.Find('.'))>=0) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		const STR_String rightstring = identifiername.Right(identifiername.Length() -1 - pos); | 
					
						
							|  |  |  | 		const STR_String leftstring = identifiername.Left(pos); | 
					
						
							|  |  |  | 		CValue* tempresult = GetProperty(leftstring); | 
					
						
							|  |  |  | 		if (tempresult) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			result=tempresult->FindIdentifier(rightstring); | 
					
						
							|  |  |  | 		}  | 
					
						
							|  |  |  | 	} else | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		result = GetProperty(identifiername); | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | 		if (result) | 
					
						
							|  |  |  | 			return result->AddRef(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (!result) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// warning here !!!
 | 
					
						
							|  |  |  | 		result = new CErrorValue(identifiername+" not found"); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef NO_EXP_PYTHON_EMBEDDING
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyMethodDef	CValueMethods[] =  | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-08-14 03:23:36 +00:00
										 |  |  | 	//{ "new", CValue::PyMake , METH_VARARGS},
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	{ NULL,NULL}	// Sentinel
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-26 09:04:06 +00:00
										 |  |  | PyAttributeDef CValue::Attributes[] = { | 
					
						
							|  |  |  | 	{ NULL }	//Sentinel
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-03 14:51:06 +00:00
										 |  |  | PyObject*	CValue::py_getattro(PyObject *attr) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-04-03 14:51:06 +00:00
										 |  |  | 	char *attr_str= PyString_AsString(attr); | 
					
						
							|  |  |  | 	CValue* resultattr = GetProperty(attr_str); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	if (resultattr) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 		PyObject* pyconvert = resultattr->ConvertValueToPython(); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 		if (pyconvert) | 
					
						
							|  |  |  | 			return pyconvert; | 
					
						
							|  |  |  | 		else | 
					
						
							| 
									
										
										
										
											2009-04-19 12:46:39 +00:00
										 |  |  | 			return resultattr->GetProxy(); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-04-03 14:51:06 +00:00
										 |  |  | 	py_getattro_up(PyObjectPlus); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CValue* CValue::ConvertPythonToValue(PyObject* pyobj) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	CValue* vallie = NULL; | 
					
						
							| 
									
										
										
										
											2009-04-12 14:22:51 +00:00
										 |  |  | 	/* refcounting is broking here! - this crashes anyway, just store a python list for KX_GameObject */ | 
					
						
							|  |  |  | #if 0
 | 
					
						
							| 
									
										
										
										
											2008-08-12 12:32:54 +00:00
										 |  |  | 	if (PyList_Check(pyobj)) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		CListValue* listval = new CListValue(); | 
					
						
							|  |  |  | 		bool error = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		int i; | 
					
						
							|  |  |  | 		int numitems = PyList_Size(pyobj); | 
					
						
							|  |  |  | 		for (i=0;i<numitems;i++) | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2004-05-21 09:18:42 +00:00
										 |  |  | 			PyObject* listitem = PyList_GetItem(pyobj,i); /* borrowed ref */ | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 			CValue* listitemval = ConvertPythonToValue(listitem); | 
					
						
							|  |  |  | 			if (listitemval) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				listval->Add(listitemval); | 
					
						
							|  |  |  | 			} else | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				error = true; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (!error) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			// jippie! could be converted
 | 
					
						
							|  |  |  | 			vallie = listval; | 
					
						
							|  |  |  | 		} else | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			// list could not be converted... bad luck
 | 
					
						
							|  |  |  | 			listval->Release(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} else | 
					
						
							| 
									
										
										
										
											2009-04-12 14:22:51 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-08-12 12:32:54 +00:00
										 |  |  | 	if (PyFloat_Check(pyobj)) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2008-08-12 12:32:54 +00:00
										 |  |  | 		vallie = new CFloatValue( (float)PyFloat_AsDouble(pyobj) ); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	} else | 
					
						
							| 
									
										
										
										
											2008-08-12 12:32:54 +00:00
										 |  |  | 	if (PyInt_Check(pyobj)) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-04-12 06:41:01 +00:00
										 |  |  | 		vallie = new CIntValue( (cInt)PyInt_AS_LONG(pyobj) ); | 
					
						
							|  |  |  | 	} else | 
					
						
							|  |  |  | 	if (PyLong_Check(pyobj)) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		vallie = new CIntValue( (cInt)PyLong_AsLongLong(pyobj) ); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	} else | 
					
						
							| 
									
										
										
										
											2008-08-12 12:32:54 +00:00
										 |  |  | 	if (PyString_Check(pyobj)) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		vallie = new CStringValue(PyString_AsString(pyobj),""); | 
					
						
							|  |  |  | 	} else | 
					
						
							| 
									
										
										
										
											2008-08-12 12:32:54 +00:00
										 |  |  | 	if (pyobj->ob_type==&CValue::Type || pyobj->ob_type==&CListValue::Type) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		vallie = ((CValue*) pyobj)->AddRef(); | 
					
						
							| 
									
										
										
										
											2008-08-12 12:32:54 +00:00
										 |  |  | 	} else | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		/* return an error value from the caller */ | 
					
						
							| 
									
										
										
										
											2009-04-19 21:01:12 +00:00
										 |  |  | 		PyErr_SetString(PyExc_TypeError, "This python type could not be converted to a to a game engine property"); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return vallie; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2004-11-22 10:19:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-03 14:51:06 +00:00
										 |  |  | int	CValue::py_delattro(PyObject *attr) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-04-03 14:51:06 +00:00
										 |  |  | 	char *attr_str= PyString_AsString(attr); | 
					
						
							|  |  |  | 	if (RemoveProperty(STR_String(attr_str))) | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 		return 0; | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-04-03 14:51:06 +00:00
										 |  |  | 	PyErr_Format(PyExc_AttributeError, "attribute \"%s\" dosnt exist", attr_str); | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	return 1; | 
					
						
							| 
									
										
										
										
											2004-11-22 10:19:19 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-03 14:51:06 +00:00
										 |  |  | int	CValue::py_setattro(PyObject *attr, PyObject* pyobj) | 
					
						
							| 
									
										
										
										
											2004-11-22 10:19:19 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-04-12 14:22:51 +00:00
										 |  |  | 	char *attr_str= PyString_AsString(attr); | 
					
						
							|  |  |  | 	CValue* oldprop = GetProperty(attr_str); | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	CValue* vallie = ConvertPythonToValue(pyobj); | 
					
						
							|  |  |  | 	if (vallie) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (oldprop) | 
					
						
							|  |  |  | 			oldprop->SetValue(vallie); | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 		else | 
					
						
							| 
									
										
										
										
											2009-04-03 14:51:06 +00:00
										 |  |  | 			SetProperty(attr_str, vallie); | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 		vallie->Release(); | 
					
						
							| 
									
										
										
										
											2009-04-12 14:22:51 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							|  |  |  | 		// ConvertPythonToValue sets the error message
 | 
					
						
							|  |  |  | 		// must return missing so KX_GameObect knows this
 | 
					
						
							|  |  |  | 		// attribute was not a function or bult in attribute,
 | 
					
						
							|  |  |  | 		//
 | 
					
						
							|  |  |  | 		// CValue attributes override internal attributes
 | 
					
						
							|  |  |  | 		// so if it exists as a CValue attribute already,
 | 
					
						
							|  |  |  | 		// assume your trying to set it to a differnt CValue attribute
 | 
					
						
							|  |  |  | 		// otherwise return PY_SET_ATTR_MISSING so children
 | 
					
						
							|  |  |  | 		// classes know they can set it without conflict 
 | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		if (GetProperty(attr_str)) | 
					
						
							|  |  |  | 			return PY_SET_ATTR_COERCE_FAIL; /* failed to set an existing attribute */ | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			return PY_SET_ATTR_MISSING; /* allow the KX_GameObject dict to set */ | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-04-03 14:51:06 +00:00
										 |  |  | 	//PyObjectPlus::py_setattro(attr,value);
 | 
					
						
							| 
									
										
										
										
											2009-04-12 09:56:30 +00:00
										 |  |  | 	return PY_SET_ATTR_SUCCESS; | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2008-06-26 12:39:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | PyObject*	CValue::ConvertKeysToPython( void ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	PyObject *pylist = PyList_New( 0 ); | 
					
						
							|  |  |  | 	PyObject *pystr; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if (m_pNamedPropertyArray) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 		std::map<STR_String,CValue*>::iterator it; | 
					
						
							|  |  |  | 		for (it= m_pNamedPropertyArray->begin(); (it != m_pNamedPropertyArray->end()); it++) | 
					
						
							| 
									
										
										
										
											2008-06-26 12:39:06 +00:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			pystr = PyString_FromString( (*it).first ); | 
					
						
							|  |  |  | 			PyList_Append(pylist, pystr); | 
					
						
							|  |  |  | 			Py_DECREF( pystr ); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return pylist; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | PyObject*	CValue::PyMake(PyObject* ignored,PyObject* args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-10 16:45:19 +00:00
										 |  |  | 	//if (!PyArg_ParseTuple(args,"s:make",&name)) return NULL;
 | 
					
						
							| 
									
										
										
										
											2008-08-14 03:23:36 +00:00
										 |  |  | 	Py_RETURN_NONE;//new CValue();
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | 	void initCValue(void) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		Py_InitModule("CValue",CValueMethods); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif //NO_EXP_PYTHON_EMBEDDING
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | /* These implementations were moved out of the header */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CValue::SetOwnerExpression(class CExpression* expr) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* intentionally empty */ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CValue::SetColorOperator(VALUE_OPERATOR op) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* intentionally empty */ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | void CValue::SetValue(CValue* newval) | 
					
						
							|  |  |  | {  | 
					
						
							|  |  |  | 	// no one should get here
 | 
					
						
							|  |  |  | 	assertd(newval->GetNumber() == 10121969);	 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							| 
									
										
										
										
											2008-12-29 16:36:58 +00:00
										 |  |  | /* deprecation warning management */ | 
					
						
							|  |  |  | void CValue::SetDeprecationWarnings(bool ignoreDeprecationWarnings) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	m_ignore_deprecation_warnings = ignoreDeprecationWarnings; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CValue::ShowDeprecationWarning(const char* old_way,const char* new_way) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-02-22 10:22:49 +00:00
										 |  |  | 	if (!m_ignore_deprecation_warnings) { | 
					
						
							| 
									
										
										
										
											2008-12-29 16:36:58 +00:00
										 |  |  | 		printf("Method %s is deprecated, please use %s instead.\n", old_way, new_way); | 
					
						
							| 
									
										
										
										
											2009-02-22 10:22:49 +00:00
										 |  |  | 		 | 
					
						
							|  |  |  | 		// import sys; print '\t%s:%d' % (sys._getframe(0).f_code.co_filename, sys._getframe(0).f_lineno)
 | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		PyObject *getframe, *frame; | 
					
						
							|  |  |  | 		PyObject *f_lineno, *f_code, *co_filename; | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2009-04-19 17:29:07 +00:00
										 |  |  | 		getframe = PySys_GetObject((char *)"_getframe"); // borrowed
 | 
					
						
							| 
									
										
										
										
											2009-02-22 10:22:49 +00:00
										 |  |  | 		if (getframe) { | 
					
						
							|  |  |  | 			frame = PyObject_CallObject(getframe, NULL); | 
					
						
							|  |  |  | 			if (frame) { | 
					
						
							|  |  |  | 				f_lineno= PyObject_GetAttrString(frame, "f_lineno"); | 
					
						
							|  |  |  | 				f_code= PyObject_GetAttrString(frame, "f_code"); | 
					
						
							|  |  |  | 				if (f_lineno && f_code) { | 
					
						
							|  |  |  | 					co_filename= PyObject_GetAttrString(f_code, "co_filename"); | 
					
						
							|  |  |  | 					if (co_filename) { | 
					
						
							|  |  |  | 						 | 
					
						
							|  |  |  | 						printf("\t%s:%d\n", PyString_AsString(co_filename), (int)PyInt_AsLong(f_lineno)); | 
					
						
							|  |  |  | 						 | 
					
						
							|  |  |  | 						Py_DECREF(f_lineno); | 
					
						
							|  |  |  | 						Py_DECREF(f_code); | 
					
						
							|  |  |  | 						Py_DECREF(co_filename); | 
					
						
							|  |  |  | 						Py_DECREF(frame); | 
					
						
							|  |  |  | 						return; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				 | 
					
						
							|  |  |  | 				Py_XDECREF(f_lineno); | 
					
						
							|  |  |  | 				Py_XDECREF(f_code); | 
					
						
							|  |  |  | 				Py_DECREF(frame); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		PyErr_Clear(); | 
					
						
							|  |  |  | 		printf("\tERROR - Could not access sys._getframe(0).f_lineno or sys._getframe().f_code.co_filename\n"); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-12-29 16:36:58 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 |