Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/bpython/intern/b_import.c')
-rw-r--r--source/blender/bpython/intern/b_import.c191
1 files changed, 191 insertions, 0 deletions
diff --git a/source/blender/bpython/intern/b_import.c b/source/blender/bpython/intern/b_import.c
new file mode 100644
index 00000000000..e490ee82338
--- /dev/null
+++ b/source/blender/bpython/intern/b_import.c
@@ -0,0 +1,191 @@
+/* $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.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+
+ Customized Blender import module, Sandbox model (TODO)
+
+ TODO for Sandbox:
+ - only allow builtin modules to be imported
+ - only allow file read/write from certain directories
+ - alternative: override file read/write with popup requester
+
+ main routine:
+ init_ourImport();
+
+*/
+
+
+
+#include "DNA_text_types.h"
+#include "Python.h"
+#include "import.h"
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BKE_library.h"
+#include "BKE_text.h"
+
+#include "BLI_blenlib.h" // mallocs
+
+#include "BPY_macros.h"
+#include "BPY_main.h"
+
+#include "b_import.h"
+
+
+/* ---------------------------------------------------------------------------- */
+
+PyObject *importText(char *name)
+{
+ Text *text;
+ char txtname[IDNAME];
+ char *buf = NULL;
+
+
+ // TODO debug for too long names !
+
+ strncpy(txtname, name, IDNAME-4);
+ strcat(txtname, ".py");
+
+ text = (Text*) getGlobal()->main->text.first;
+ while(text)
+ {
+ if (STREQ(getName(text), txtname))
+ break;
+ text = text->id.next;
+ }
+ if (!text) {
+ return NULL;
+ }
+
+ if (!text->compiled) {
+ buf = txt_to_buf(text);
+ text->compiled = Py_CompileString(buf, getName(text), Py_file_input);
+ MEM_freeN(buf);
+ if (PyErr_Occurred())
+ {
+ PyErr_Print();
+ BPY_free_compiled_text(text);
+ return NULL;
+ }
+ }
+ BPY_debug(("import from TextBuffer: %s\n", txtname));
+ return PyImport_ExecCodeModule(name, text->compiled);
+}
+
+PyObject *blender_import(PyObject *self, PyObject *args)
+{
+ PyObject *exception, *err, *tb;
+ char *name;
+ PyObject *globals = NULL, *locals = NULL, *fromlist = NULL;
+ PyObject *m;
+#ifdef PY_SANDBOXTEST
+ PyObject *l, *n;
+#endif
+
+ if (!PyArg_ParseTuple(args, "s|OOO:bimport",
+ &name, &globals, &locals, &fromlist))
+ return NULL;
+
+#ifdef PY_SANDBOXTEST
+ /* check for builtin modules */
+ m = PyImport_AddModule("sys");
+ l = PyObject_GetAttrString(m, "builtin_module_names");
+ n = PyString_FromString(name);
+
+ if (PySequence_Contains(l, n)) {
+ Py_DECREF(l);
+ m = PyImport_ImportModuleEx(name, globals, locals, fromlist);
+ return m;
+ } else {
+ /* TODO check for external python toolbox modules */
+
+ PyErr_Format(PyExc_ImportError,
+ "Import of external Module %.40s not allowed.\n\
+Please disable security in the UserButtons", name);
+ Py_DECREF(l);
+ return NULL;
+ }
+
+#else
+ m = PyImport_ImportModuleEx(name, globals, locals, fromlist);
+ if (m)
+ return m;
+ else
+ PyErr_Fetch(&exception, &err, &tb); // restore exception for probable later use
+
+ m = importText(name);
+ if (m) { // found module, ignore above exception
+ PyErr_Clear();
+ Py_XDECREF(exception); Py_XDECREF(err); Py_XDECREF(tb);
+ printf("imported from text buffer..\n");
+ } else {
+ PyErr_Restore(exception, err, tb);
+ }
+ return m;
+#endif
+}
+static PyMethodDef bimport[] = {
+ { "blimport", blender_import, METH_VARARGS,
+ "our own import"}
+};
+
+
+/*
+PyObject *override_method(PyObject *module, char *methname, PyMethodDef *newcfunc)
+{
+ PyObject *d;
+ PyObject *old;
+ PyObject *pycfunc;
+
+
+ d = PyModule_GetDict(module);
+ old = PyDict_GetItemString(module, methname);
+ if (!old)
+ return NULL;
+
+ pycfunc = PyCFunction_New(newcfunc, NULL);
+ PyDict_SetItemString(d, methname, pycfunc);
+
+ return old;
+}
+*/
+
+
+/* this overrides the built in __import__ function
+with our customized importer */
+void init_ourImport(void)
+{
+ PyObject *m, *d;
+ PyObject *import = PyCFunction_New(bimport, NULL);
+
+ m = PyImport_AddModule("__builtin__");
+ d = PyModule_GetDict(m);
+ PyDict_SetItemString(d, "__import__", import);
+}
+