/* OpenIDA - Outil d'analyse de fichiers binaires * py_log.c - intermédiaire du panneau de messages pour Python * * Copyright (C) 2009-2012 Cyrille Bagard * * This file is part of OpenIDA. * * OpenIDA 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. * * OpenIDA 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 */ #include "py_log.h" #include #include "../../src/gui/panels/log.h" typedef struct { PyObject_HEAD PyObject *first; PyObject *last; int number; } pylog; #define _(str) str /* Définit les constantes pour les types de message. */ bool pylog_define_constants(PyObject *); /* Affiche un message dans le journal des messages système. */ PyObject *pylog_simple_message(PyObject *, PyObject *); /****************************************************************************** * * * Paramètres : dict = dictionnaire à compléter. * * * * Description : Définit les constantes pour les types de message. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ bool pylog_define_constants(PyObject *dict) { int ret; /* Bilan d'un ajout */ ret = PyDict_SetItemString(dict, "LMT_INFO", PyInt_FromLong(LMT_INFO)); if (ret == -1) return false; ret = PyDict_SetItemString(dict, "LMT_BAD_BINARY", PyInt_FromLong(LMT_BAD_BINARY)); if (ret == -1) return false; ret = PyDict_SetItemString(dict, "LMT_PROCESS", PyInt_FromLong(LMT_PROCESS)); if (ret == -1) return false; return true; } /****************************************************************************** * * * Paramètres : self = classe assurant le lien avec l'éditeur de messages. * * args = arguments fournis à l'appel. * * * * Description : Affiche un message dans le journal des messages système. * * * * Retour : Rien en équivalent Python. * * * * Remarques : - * * * ******************************************************************************/ PyObject *pylog_simple_message(PyObject *self, PyObject *args) { PyObject *result; /* Bilan à retourner */ LogMessageType type; /* Espèce du message */ const char *msg; /* Contenu du message */ if (!PyArg_ParseTuple(args, "is", &type, &msg)) return NULL; switch (type) { case LMT_INFO: case LMT_BAD_BINARY: case LMT_PROCESS: log_simple_message(type, msg); result = Py_None; break; default: PyErr_SetString(PyExc_ValueError, _("Invalid type of message")); result = NULL; break; } return result; } static void pylog_dealloc(pylog* self) { Py_XDECREF(self->first); Py_XDECREF(self->last); //printf("dealloc\n"); #if PY_VERSION_HEX < 0x03000000 self->ob_type->tp_free((PyObject*)self); #else Py_TYPE(self)->tp_free((PyObject*)self); #endif //printf("dealloc::end\n"); } static PyObject * pylog_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { pylog *self; self = (pylog *)type->tp_alloc(type, 0); if (self != NULL) { self->first = PyString_FromString("");//PyUnicode_FromString(""); if (self->first == NULL) { Py_DECREF(self); return NULL; } self->last = PyString_FromString("");//PyUnicode_FromString(""); if (self->last == NULL) { Py_DECREF(self); return NULL; } self->number = 0; } return (PyObject *)self; } static int pylog_init(pylog *self, PyObject *args, PyObject *kwds) { PyObject *first=NULL, *last=NULL, *tmp; static char *kwlist[] = {"first", "last", "number", NULL}; printf("pylog_init\n"); if (! PyArg_ParseTupleAndKeywords(args, kwds, "|SSi", kwlist, &first, &last, &self->number)) return -1; if (first) { tmp = self->first; Py_INCREF(first); self->first = first; Py_DECREF(tmp); } if (last) { tmp = self->last; Py_INCREF(last); self->last = last; Py_DECREF(tmp); } return 0; } static PyMemberDef pylog_members[] = { {"number", T_INT, offsetof(pylog, number), 0, "noddy number"}, {NULL} /* Sentinel */ }; static PyObject * pylog_name(pylog* self) { static PyObject *format = NULL; PyObject *args, *result; if (format == NULL) { format = PyString_FromString("%s %s");//PyUnicode_FromString("%s %s"); if (format == NULL) return NULL; } args = Py_BuildValue("OO", self->first, self->last); if (args == NULL) return NULL; result = PyUnicode_Format(format, args); Py_DECREF(args); return result; } static PyMethodDef pylog_methods[] = { {"name", (PyCFunction)pylog_name, METH_NOARGS, "Return the name, combining the first and last name" }, { "log_simple_message", (PyCFunction)pylog_simple_message, METH_VARARGS | METH_STATIC, "Return the name, combining the first and last name" }, {NULL} /* Sentinel */ }; static PyTypeObject pylog_type = { PyObject_HEAD_INIT(NULL) #if PY_VERSION_HEX < 0x03000000 0, /*ob_size*/ #endif "noddy.pylog", /* tp_name */ sizeof(pylog), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)pylog_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_reserved / tp_compare */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ "pylog objects", /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ pylog_methods, /* tp_methods */ pylog_members, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc)pylog_init, /* tp_init */ 0, /* tp_alloc */ pylog_new, /* tp_new */ }; /****************************************************************************** * * * Paramètres : module = module dont la définition est à compléter. * * * * Description : Ajoute l'objet 'log' au module Python. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ bool add_log_to_python_module(PyObject *module) { int ret; /* Bilan d'un appel */ if (PyType_Ready(&pylog_type) < 0) return; printf("Adding log type\n"); pylog_define_constants(pylog_type.tp_dict); Py_INCREF(&pylog_type); PyModule_AddObject(module, "logger", (PyObject *)&pylog_type); return true; /* FIXME */ }