summaryrefslogtreecommitdiffstats
path: root/src/objects/base-objects.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/objects/base-objects.c')
-rw-r--r--src/objects/base-objects.c235
1 files changed, 235 insertions, 0 deletions
diff --git a/src/objects/base-objects.c b/src/objects/base-objects.c
new file mode 100644
index 0000000..42f5cac
--- /dev/null
+++ b/src/objects/base-objects.c
@@ -0,0 +1,235 @@
+#include <Python.h>
+#include "structmember.h"
+#include "pymodule.h"
+#include "base-objects.h"
+#include "pyirssi.h"
+
+/* This is the base type for Irssi objects with a type id. The user can find
+ * the type name, type id, and check if the object is wrapping a valid Irssi
+ * record.
+ */
+
+static void PyIrssiBase_dealloc(PyIrssiBase *self)
+{
+ self->ob_type->tp_free((PyObject*)self);
+}
+
+static PyObject *PyIrssiBase_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ PyIrssiBase *self;
+
+ self = (PyIrssiBase *)type->tp_alloc(type, 0);
+ if (!self)
+ return NULL;
+
+ return (PyObject *)self;
+}
+
+/* Getters */
+PyDoc_STRVAR(PyIrssiBase_type_id_doc,
+ "Irssi's type id for object"
+);
+static PyObject *PyIrssiBase_type_id_get(PyIrssiBase *self, void *closure)
+{
+ RET_NULL_IF_INVALID(self->data);
+ return PyInt_FromLong(self->data->type);
+}
+
+PyDoc_STRVAR(PyIrssiBase_type_doc,
+ "Irssi's name for object"
+);
+static PyObject *PyIrssiBase_type_get(PyIrssiBase *self, void *closure)
+{
+ RET_NULL_IF_INVALID(self->data);
+ RET_AS_STRING_OR_NONE(self->base_name);
+}
+
+PyDoc_STRVAR(PyIrssiBase_valid_doc,
+ "True if the object is valid"
+);
+static PyObject *PyIrssiBase_valid_get(PyIrssiBase *self, void *closure)
+{
+ if (self->data != NULL)
+ Py_RETURN_TRUE;
+
+ Py_RETURN_FALSE;
+}
+
+/* specialized getters/setters */
+static PyGetSetDef PyIrssiBase_getseters[] = {
+ {"type_id", (getter)PyIrssiBase_type_id_get, NULL,
+ PyIrssiBase_type_id_doc, NULL},
+ {"type", (getter)PyIrssiBase_type_get, NULL,
+ PyIrssiBase_type_doc, NULL},
+ {"valid", (getter)PyIrssiBase_valid_get, NULL,
+ PyIrssiBase_valid_doc, NULL},
+ {NULL}
+};
+
+/* Methods for object */
+static PyMethodDef PyIrssiBase_methods[] = {
+ {NULL}
+};
+
+PyTypeObject PyIrssiBaseType = {
+ PyObject_HEAD_INIT(NULL)
+ 0, /*ob_size*/
+ "IrssiBase", /*tp_name*/
+ sizeof(PyIrssiBase), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ (destructor)PyIrssiBase_dealloc, /*tp_dealloc*/
+ 0, /*tp_print*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ 0, /*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*/
+ "PyIrssiBase objects", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ PyIrssiBase_methods, /* tp_methods */
+ 0, /* tp_members */
+ PyIrssiBase_getseters, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ PyIrssiBase_new, /* tp_new */
+};
+
+
+/* IrssiChatBase is a base type for any object with a chat type. The user
+ can find the chat type string name with the chat_type member or
+ the type id with the chat_type_id member. It inherits from IrssiBase
+ so the type, valid, and type_id members are visible to the user, too */
+
+static void PyIrssiChatBase_dealloc(PyIrssiChatBase *self)
+{
+ self->ob_type->tp_free((PyObject*)self);
+}
+
+static PyObject *PyIrssiChatBase_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ PyIrssiChatBase *self;
+
+ self = (PyIrssiChatBase *)type->tp_alloc(type, 0);
+ if (!self)
+ return NULL;
+
+ return (PyObject *)self;
+}
+
+/* Getters */
+PyDoc_STRVAR(PyIrssiChatBase_chat_type_id_doc,
+ "Chat Type id (int)"
+);
+static PyObject *PyIrssiChatBase_chat_type_id_get(PyIrssiChatBase *self, void *closure)
+{
+ RET_NULL_IF_INVALID(self->data);
+ return PyInt_FromLong(self->data->chat_type);
+}
+
+PyDoc_STRVAR(PyIrssiChatBase_chat_type_doc,
+ "Chat name (str)"
+);
+static PyObject *PyIrssiChatBase_chat_type_get(PyIrssiChatBase *self, void *closure)
+{
+ CHAT_PROTOCOL_REC *rec;
+
+ RET_NULL_IF_INVALID(self->data);
+
+ rec = chat_protocol_find_id(self->data->chat_type);
+ if (rec)
+ RET_AS_STRING_OR_NONE(rec->name);
+ else
+ Py_RETURN_NONE;
+}
+
+/* specialized getters/setters */
+static PyGetSetDef PyIrssiChatBase_getseters[] = {
+ {"chat_type_id", (getter)PyIrssiChatBase_chat_type_id_get, NULL,
+ PyIrssiChatBase_chat_type_id_doc, NULL},
+ {"chat_type", (getter)PyIrssiChatBase_chat_type_get, NULL,
+ PyIrssiChatBase_chat_type_doc, NULL},
+ {NULL}
+};
+
+/* Methods */
+static PyMethodDef PyIrssiChatBase_methods[] = {
+ {NULL}
+};
+
+PyTypeObject PyIrssiChatBaseType = {
+ PyObject_HEAD_INIT(NULL)
+ 0, /*ob_size*/
+ "IrssiChatBase", /*tp_name*/
+ sizeof(PyIrssiChatBase), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ (destructor)PyIrssiChatBase_dealloc, /*tp_dealloc*/
+ 0, /*tp_print*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ 0, /*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*/
+ "PyIrssiChatBase objects", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ PyIrssiChatBase_methods, /* tp_methods */
+ 0, /* tp_members */
+ PyIrssiChatBase_getseters, /* tp_getset */
+ &PyIrssiBaseType, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ PyIrssiChatBase_new, /* tp_new */
+};
+
+int base_objects_init(void)
+{
+ g_return_val_if_fail(py_module != NULL, 0);
+
+ if (PyType_Ready(&PyIrssiBaseType) < 0)
+ return 0;
+ if (PyType_Ready(&PyIrssiChatBaseType) < 0)
+ return 0;
+
+ Py_INCREF(&PyIrssiBaseType);
+ Py_INCREF(&PyIrssiChatBaseType);
+ PyModule_AddObject(py_module, "IrssiBase", (PyObject *)&PyIrssiBaseType);
+ PyModule_AddObject(py_module, "IrssiChatBase", (PyObject *)&PyIrssiChatBaseType);
+
+ return 1;
+}