430 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			430 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /* 
 | ||
|  |  * $Id$ | ||
|  |  * | ||
|  |  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** | ||
|  |  * | ||
|  |  * This program 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 2 | ||
|  |  * of the License, or (at your option) any later version. The Blender | ||
|  |  * Foundation also sells licenses for use in proprietary software under | ||
|  |  * the Blender License.  See http://www.blender.org/BL/ for information
 | ||
|  |  * about this. | ||
|  |  * | ||
|  |  * This program 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 this program; if not, write to the Free Software Foundation, | ||
|  |  * Inc., 59 Temple Place - Suite 330, Boston, MA	02111-1307, USA. | ||
|  |  * | ||
|  |  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. | ||
|  |  * All rights reserved. | ||
|  |  * | ||
|  |  * This is a new part of Blender. | ||
|  |  * | ||
|  |  * Contributor(s): Campbell Barton | ||
|  |  * | ||
|  |  * ***** END GPL/BL DUAL LICENSE BLOCK ***** | ||
|  | */ | ||
|  | 
 | ||
|  | /* python types */ | ||
|  | #include "DNA_userdef_types.h"
 | ||
|  | #include "gen_utils.h"
 | ||
|  | #include "Config.h"
 | ||
|  | 
 | ||
|  | enum conf_consts { | ||
|  | 	/*string*/ | ||
|  | 	EXPP_CONF_ATTR_PATH_YF_EXPORT = 0, | ||
|  | 	EXPP_CONF_ATTR_PATH_FONT, | ||
|  | 	EXPP_CONF_ATTR_PATH_RENDER, | ||
|  | 	EXPP_CONF_ATTR_PATH_TEXTURE, | ||
|  | 	EXPP_CONF_ATTR_PATH_PYTHON, | ||
|  | 	EXPP_CONF_ATTR_PATH_TEX_PLUGIN, | ||
|  | 	EXPP_CONF_ATTR_PATH_SOUND, | ||
|  | 	EXPP_CONF_ATTR_PATH_SEQ_PLUGIN, | ||
|  | 	EXPP_CONF_ATTR_PATH_TEMP, | ||
|  | 	 | ||
|  | 	/*int*/ | ||
|  | 	EXPP_CONF_ATTR_UNDOSTEPS, | ||
|  | 	EXPP_CONF_ATTR_TEX_TIMEOUT, | ||
|  | 	EXPP_CONF_ATTR_TEX_COLLECT_RATE, | ||
|  | 	EXPP_CONF_ATTR_MEM_CACHE_LIMIT, | ||
|  | 	EXPP_CONF_ATTR_FONT_SIZE | ||
|  | }; | ||
|  | 
 | ||
|  | PyObject *Config_CreatePyObject( ) | ||
|  | { | ||
|  | 	BPy_Config *conf = PyObject_NEW( BPy_Config, &Config_Type); | ||
|  | 	return (PyObject *)conf; | ||
|  | } | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * repr function | ||
|  |  * callback functions building meaninful string to representations | ||
|  |  */ | ||
|  | static PyObject *Config_repr( BPy_Config * self ) | ||
|  | { | ||
|  | 	return PyString_FromFormat( "[Blender Configuration Data]"); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | /*-----------------------Config module Init())-----------------------------*/ | ||
|  | /* see Main.c */ | ||
|  | /*
 | ||
|  | static struct PyMethodDef BPy_Config_methods[] = { | ||
|  | 	{"new", (PyCFunction)MainSeq_new, METH_VARARGS, | ||
|  | 		"(name) - Create a new object in this scene from the obdata given and return a new object"}, | ||
|  | 	{"load", (PyCFunction)MainSeq_load, METH_VARARGS, | ||
|  | 		"(filename) - loads the given filename for image, font and sound types"}, | ||
|  | 	{"unlink", (PyCFunction)MainSeq_unlink, METH_VARARGS, | ||
|  | 		"unlinks the object from the scene"}, | ||
|  | 	{NULL, NULL, 0, NULL} | ||
|  | };*/ | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * get integer attributes | ||
|  |  */ | ||
|  | static PyObject *getStrAttr( BPy_Config *self, void *type ) | ||
|  | { | ||
|  | 	PyObject *attr = NULL; | ||
|  | 	char *param = NULL; | ||
|  | 	 | ||
|  | 	 | ||
|  | 	switch( (int)type ) { | ||
|  | 	case EXPP_CONF_ATTR_PATH_YF_EXPORT: | ||
|  | 		param = U.yfexportdir; | ||
|  | 		break; | ||
|  | 	case EXPP_CONF_ATTR_PATH_FONT: | ||
|  | 		param = U.fontdir; | ||
|  | 		break; | ||
|  | 	case EXPP_CONF_ATTR_PATH_RENDER: | ||
|  | 		param = U.renderdir; | ||
|  | 		break;	 | ||
|  | 	case EXPP_CONF_ATTR_PATH_TEXTURE: | ||
|  | 		param = U.textudir; | ||
|  | 		break; | ||
|  | 	case EXPP_CONF_ATTR_PATH_PYTHON: | ||
|  | 		param = U.pythondir; | ||
|  | 		break; | ||
|  | 	case EXPP_CONF_ATTR_PATH_TEX_PLUGIN: | ||
|  | 		param = U.plugtexdir; | ||
|  | 		break; | ||
|  | 	case EXPP_CONF_ATTR_PATH_SOUND: | ||
|  | 		param = U.sounddir; | ||
|  | 		break; | ||
|  | 	case EXPP_CONF_ATTR_PATH_SEQ_PLUGIN: | ||
|  | 		param = U.plugseqdir; | ||
|  | 		break; | ||
|  | 	case EXPP_CONF_ATTR_PATH_TEMP: | ||
|  | 		param = U.tempdir; | ||
|  | 		break;	 | ||
|  | 	 | ||
|  | 	default: | ||
|  | 		return EXPP_ReturnPyObjError( PyExc_RuntimeError, | ||
|  | 				"undefined type in getStrAttr" ); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	attr = PyString_FromString( param ); | ||
|  | 	 | ||
|  | 	if( attr ) | ||
|  | 		return attr; | ||
|  | 
 | ||
|  | 	return EXPP_ReturnPyObjError( PyExc_MemoryError, | ||
|  | 				"PyString_FromString() failed!" ); | ||
|  | } | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * set integer attributes which require clamping | ||
|  |  */ | ||
|  | 
 | ||
|  | static int setStrAttr( BPy_Config *self, PyObject *value, void *type ) | ||
|  | { | ||
|  | 	char *param; | ||
|  | 	int len=160; | ||
|  | 	char *str = PyString_AsString(value); | ||
|  | 	 | ||
|  | 	if (!str) | ||
|  | 		return EXPP_ReturnIntError( PyExc_TypeError, | ||
|  | 			"error, must assign a python string for setStrAttr"); | ||
|  | 	 | ||
|  | 	switch( (int)type ) { | ||
|  | 	case EXPP_CONF_ATTR_PATH_YF_EXPORT: | ||
|  | 		param = U.yfexportdir; | ||
|  | 		break; | ||
|  | 	case EXPP_CONF_ATTR_PATH_FONT: | ||
|  | 		param = U.fontdir; | ||
|  | 		break; | ||
|  | 	case EXPP_CONF_ATTR_PATH_RENDER: | ||
|  | 		param = U.renderdir; | ||
|  | 		break;	 | ||
|  | 	case EXPP_CONF_ATTR_PATH_TEXTURE: | ||
|  | 		param = U.textudir; | ||
|  | 		break; | ||
|  | 	case EXPP_CONF_ATTR_PATH_PYTHON: | ||
|  | 		param = U.pythondir; | ||
|  | 		break; | ||
|  | 	case EXPP_CONF_ATTR_PATH_TEX_PLUGIN: | ||
|  | 		param = U.plugtexdir; | ||
|  | 		break; | ||
|  | 	case EXPP_CONF_ATTR_PATH_SOUND: | ||
|  | 		param = U.sounddir; | ||
|  | 		break; | ||
|  | 	case EXPP_CONF_ATTR_PATH_SEQ_PLUGIN: | ||
|  | 		param = U.plugseqdir; | ||
|  | 		break; | ||
|  | 	case EXPP_CONF_ATTR_PATH_TEMP: | ||
|  | 		param = U.tempdir; | ||
|  | 		break; | ||
|  | 		 | ||
|  | 	default: | ||
|  | 		return EXPP_ReturnIntError( PyExc_RuntimeError, | ||
|  | 				"undefined type in setStrAttr"); | ||
|  | 	} | ||
|  | 	 | ||
|  | 	strncpy(param, str, len); | ||
|  | 	return 0; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * get integer attributes | ||
|  |  */ | ||
|  | 
 | ||
|  | static PyObject *getIntAttr( BPy_Config *self, void *type ) | ||
|  | { | ||
|  | 	PyObject *attr = NULL; | ||
|  | 	int param; | ||
|  | 
 | ||
|  | 	switch( (int)type ) { | ||
|  | 	case EXPP_CONF_ATTR_UNDOSTEPS: | ||
|  | 		param = (int)U.undosteps; | ||
|  | 		break; | ||
|  | 	case EXPP_CONF_ATTR_TEX_TIMEOUT: | ||
|  | 		param = U.textimeout; | ||
|  | 		break;		 | ||
|  | 	case EXPP_CONF_ATTR_TEX_COLLECT_RATE: | ||
|  | 		param = U.texcollectrate; | ||
|  | 		break; | ||
|  | 	case EXPP_CONF_ATTR_MEM_CACHE_LIMIT: | ||
|  | 		param = U.memcachelimit; | ||
|  | 		break;		 | ||
|  | 	case EXPP_CONF_ATTR_FONT_SIZE: | ||
|  | 		param = U.fontsize; | ||
|  | 		break; | ||
|  | 	 | ||
|  | 	default: | ||
|  | 		return EXPP_ReturnPyObjError( PyExc_RuntimeError, | ||
|  | 				"undefined type in getIntAttr" ); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	attr = PyInt_FromLong( param ); | ||
|  | 	 | ||
|  | 	if( attr ) | ||
|  | 		return attr; | ||
|  | 
 | ||
|  | 	return EXPP_ReturnPyObjError( PyExc_MemoryError, | ||
|  | 				"PyInt_FromLong() failed!" ); | ||
|  | } | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * set integer attributes which require clamping | ||
|  |  */ | ||
|  | 
 | ||
|  | static int setIntAttrClamp( BPy_Config *self, PyObject *value, void *type ) | ||
|  | { | ||
|  | 	void *param; | ||
|  | 	int min, max, size; | ||
|  | 
 | ||
|  | 	switch( (int)type ) { | ||
|  | 	case EXPP_CONF_ATTR_UNDOSTEPS: | ||
|  | 		min = 0; | ||
|  | 		max = 64; | ||
|  | 		size = 'h'; | ||
|  | 		param = (void *)&U.undosteps; | ||
|  | 		break; | ||
|  | 	case EXPP_CONF_ATTR_TEX_TIMEOUT: | ||
|  | 		min = 1; | ||
|  | 		max = 3600; | ||
|  | 		size = 'i'; | ||
|  | 		param = (void *)&U.textimeout; | ||
|  | 		break; | ||
|  | 	case EXPP_CONF_ATTR_TEX_COLLECT_RATE: | ||
|  | 		min = 1; | ||
|  | 		max = 3600; | ||
|  | 		size = 'i'; | ||
|  | 		param = (void *)&U.texcollectrate; | ||
|  | 		break; | ||
|  | 	case EXPP_CONF_ATTR_MEM_CACHE_LIMIT: | ||
|  | 		min = 1; | ||
|  | 		max = 1024; | ||
|  | 		size = 'i'; | ||
|  | 		param = (void *)&U.memcachelimit; | ||
|  | 		break;	 | ||
|  | 	case EXPP_CONF_ATTR_FONT_SIZE: | ||
|  | 		min = 8; | ||
|  | 		max = 16; | ||
|  | 		size = 'i'; | ||
|  | 		param = (void *)&U.fontsize; | ||
|  | 		break; | ||
|  | 		 | ||
|  | 	default: | ||
|  | 		return EXPP_ReturnIntError( PyExc_RuntimeError, | ||
|  | 				"undefined type in setIntAttrClamp"); | ||
|  | 	} | ||
|  | 	return EXPP_setIValueClamped( value, param, min, max, size ); | ||
|  | } | ||
|  | 
 | ||
|  | static PyGetSetDef Config_getseters[] = { | ||
|  | 	 | ||
|  | 	/* ints & shorts */ | ||
|  | 	{"undoSteps", | ||
|  | 	 (getter)getIntAttr, (setter)setIntAttrClamp, | ||
|  | 	 "undo steps", | ||
|  | 	 (void *)EXPP_CONF_ATTR_UNDOSTEPS}, | ||
|  | 	{"textureTimeout", | ||
|  | 	 (getter)getIntAttr, (setter)setIntAttrClamp, | ||
|  | 	 "undo steps", | ||
|  | 	 (void *)EXPP_CONF_ATTR_TEX_TIMEOUT}, | ||
|  | 	{"textureCollectRate", | ||
|  | 	 (getter)getIntAttr, (setter)setIntAttrClamp, | ||
|  | 	 "undo steps", | ||
|  | 	 (void *)EXPP_CONF_ATTR_TEX_COLLECT_RATE}, | ||
|  | 	{"sequenceMemCacheLimit", | ||
|  | 	 (getter)getIntAttr, (setter)setIntAttrClamp, | ||
|  | 	 "undo steps", | ||
|  | 	 (void *)EXPP_CONF_ATTR_MEM_CACHE_LIMIT}, | ||
|  | 	{"fontSize", | ||
|  | 	 (getter)getIntAttr, (setter)setIntAttrClamp, | ||
|  | 	 "undo steps", | ||
|  | 	 (void *)EXPP_CONF_ATTR_FONT_SIZE}, | ||
|  | 	  | ||
|  | 	/* Paths */ | ||
|  | 	{"yfExportDir", | ||
|  | 	 (getter)getStrAttr, (setter)setStrAttr, | ||
|  | 	 "yafray export path", | ||
|  | 	 (void *)EXPP_CONF_ATTR_PATH_YF_EXPORT},	  | ||
|  | 	{"fontDir", | ||
|  | 	 (getter)getStrAttr, (setter)setStrAttr, | ||
|  | 	 "default font path", | ||
|  | 	 (void *)EXPP_CONF_ATTR_PATH_FONT}, | ||
|  | 	{"renderDir", | ||
|  | 	 (getter)getStrAttr, (setter)setStrAttr, | ||
|  | 	 "default render path", | ||
|  | 	 (void *)EXPP_CONF_ATTR_PATH_RENDER}, | ||
|  | 	{"textureDir", | ||
|  | 	 (getter)getStrAttr, (setter)setStrAttr, | ||
|  | 	 "default texture path", | ||
|  | 	 (void *)EXPP_CONF_ATTR_PATH_TEXTURE}, | ||
|  | 	{"userScriptsDir", | ||
|  | 	 (getter)getStrAttr, (setter)setStrAttr, | ||
|  | 	 "user scripts path", | ||
|  | 	 (void *)EXPP_CONF_ATTR_PATH_PYTHON},  | ||
|  | 	{"texturePluginsDir", | ||
|  | 	 (getter)getStrAttr, (setter)setStrAttr, | ||
|  | 	 "default texture plugins path", | ||
|  | 	 (void *)EXPP_CONF_ATTR_PATH_TEX_PLUGIN}, | ||
|  | 	{"soundDir", | ||
|  | 	 (getter)getStrAttr, (setter)setStrAttr, | ||
|  | 	 "default sound path", | ||
|  | 	 (void *)EXPP_CONF_ATTR_PATH_SOUND}, | ||
|  | 	{"sequencePluginsDir", | ||
|  | 	 (getter)getStrAttr, (setter)setStrAttr, | ||
|  | 	 "sequencer plugins path", | ||
|  | 	 (void *)EXPP_CONF_ATTR_PATH_SEQ_PLUGIN}, | ||
|  | 	{"tempDir", | ||
|  | 	 (getter)getStrAttr, (setter)setStrAttr, | ||
|  | 	 "temporary file path", | ||
|  | 	 (void *)EXPP_CONF_ATTR_PATH_TEMP}, | ||
|  | 	 | ||
|  | 	{NULL,NULL,NULL,NULL,NULL}  /* Sentinel */ | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *  Python Config_Type structure definition | ||
|  |  */ | ||
|  | PyTypeObject Config_Type = { | ||
|  | 	PyObject_HEAD_INIT( NULL )  /* required py macro */ | ||
|  | 	0,                          /* ob_size */ | ||
|  | 	/*  For printing, in format "<module>.<name>" */ | ||
|  | 	"Blender Config",           /* char *tp_name; */ | ||
|  | 	sizeof( BPy_Config ),       /* int tp_basicsize; */ | ||
|  | 	0,                          /* tp_itemsize;  For allocation */ | ||
|  | 
 | ||
|  | 	/* Methods to implement standard operations */ | ||
|  | 
 | ||
|  | 	NULL,						/* destructor tp_dealloc; */ | ||
|  | 	NULL,                       /* printfunc tp_print; */ | ||
|  | 	NULL,                       /* getattrfunc tp_getattr; */ | ||
|  | 	NULL,                       /* setattrfunc tp_setattr; */ | ||
|  | 	NULL, /* cmpfunc tp_compare; */ | ||
|  | 	(reprfunc)Config_repr,   /* reprfunc tp_repr; */ | ||
|  | 
 | ||
|  | 	/* Method suites for standard classes */ | ||
|  | 
 | ||
|  | 	NULL,                       /* PyNumberMethods *tp_as_number; */ | ||
|  | 	NULL,	    /* PySequenceMethods *tp_as_sequence; */ | ||
|  | 	NULL,                       /* PyMappingMethods *tp_as_mapping; */ | ||
|  | 
 | ||
|  | 	/* More standard operations (here for binary compatibility) */ | ||
|  | 
 | ||
|  | 	NULL,                       /* hashfunc tp_hash; */ | ||
|  | 	NULL,                       /* ternaryfunc tp_call; */ | ||
|  | 	NULL,                       /* reprfunc tp_str; */ | ||
|  | 	NULL,                       /* getattrofunc tp_getattro; */ | ||
|  | 	NULL,                       /* setattrofunc tp_setattro; */ | ||
|  | 
 | ||
|  | 	/* Functions to access object as input/output buffer */ | ||
|  | 	NULL,                       /* PyBufferProcs *tp_as_buffer; */ | ||
|  | 
 | ||
|  |   /*** Flags to define presence of optional/expanded features ***/ | ||
|  | 	Py_TPFLAGS_DEFAULT,         /* long tp_flags; */ | ||
|  | 
 | ||
|  | 	NULL,                       /*  char *tp_doc;  Documentation string */ | ||
|  |   /*** Assigned meaning in release 2.0 ***/ | ||
|  | 	/* call function for all accessible objects */ | ||
|  | 	NULL,                       /* traverseproc tp_traverse; */ | ||
|  | 
 | ||
|  | 	/* delete references to contained objects */ | ||
|  | 	NULL,                       /* inquiry tp_clear; */ | ||
|  | 
 | ||
|  |   /***  Assigned meaning in release 2.1 ***/ | ||
|  |   /*** rich comparisons ***/ | ||
|  | 	NULL,                       /* richcmpfunc tp_richcompare; */ | ||
|  | 
 | ||
|  |   /***  weak reference enabler ***/ | ||
|  | 	0,                          /* long tp_weaklistoffset; */ | ||
|  | 
 | ||
|  |   /*** Added in release 2.2 ***/ | ||
|  | 	/*   Iterators */ | ||
|  | 	NULL, /* getiterfunc tp_iter; */ | ||
|  | 	NULL, /* iternextfunc tp_iternext; */ | ||
|  | 
 | ||
|  |   /*** Attribute descriptor and subclassing stuff ***/ | ||
|  | 	NULL,  /*BPy_Config_methods*/     /* struct PyMethodDef *tp_methods; */ | ||
|  | 	NULL,                       /* struct PyMemberDef *tp_members; */ | ||
|  | 	Config_getseters,       /* struct PyGetSetDef *tp_getset; */ | ||
|  | 	NULL,                       /* struct _typeobject *tp_base; */ | ||
|  | 	NULL,                       /* PyObject *tp_dict; */ | ||
|  | 	NULL,                       /* descrgetfunc tp_descr_get; */ | ||
|  | 	NULL,                       /* descrsetfunc tp_descr_set; */ | ||
|  | 	0,                          /* long tp_dictoffset; */ | ||
|  | 	NULL,                       /* initproc tp_init; */ | ||
|  | 	NULL,                       /* allocfunc tp_alloc; */ | ||
|  | 	NULL,                       /* newfunc tp_new; */ | ||
|  | 	/*  Low-level free-memory routine */ | ||
|  | 	NULL,                       /* freefunc tp_free;  */ | ||
|  | 	/* For PyObject_IS_GC */ | ||
|  | 	NULL,                       /* inquiry tp_is_gc;  */ | ||
|  | 	NULL,                       /* PyObject *tp_bases; */ | ||
|  | 	/* method resolution order */ | ||
|  | 	NULL,                       /* PyObject *tp_mro;  */ | ||
|  | 	NULL,                       /* PyObject *tp_cache; */ | ||
|  | 	NULL,                       /* PyObject *tp_subclasses; */ | ||
|  | 	NULL,                       /* PyObject *tp_weaklist; */ | ||
|  | 	NULL | ||
|  | }; |