summaryrefslogtreecommitdiffstats
path: root/objects/base-objects.h
diff options
context:
space:
mode:
Diffstat (limited to 'objects/base-objects.h')
-rw-r--r--objects/base-objects.h96
1 files changed, 96 insertions, 0 deletions
diff --git a/objects/base-objects.h b/objects/base-objects.h
new file mode 100644
index 0000000..d2f6acb
--- /dev/null
+++ b/objects/base-objects.h
@@ -0,0 +1,96 @@
+#ifndef _BASE_OBJECTS_H_
+#define _BASE_OBJECTS_H_
+
+#include <Python.h>
+
+/* data is a pointer to the underlying Irssi record */
+/* base_name is the type name of the object returned from the type member
+ it can be SERVER, CHANNEL, QUERY, etc. Note: base_name isn't freed, so
+ it cannot point to heap memory */
+/* cleanup_installed: 1 = a cleanup signal handler is installed, 0 = not installed */
+#define PyIrssi_HEAD(type) \
+ PyObject_HEAD \
+ type *data; \
+ const char *base_name; \
+ int cleanup_installed;
+
+/* for uninheritable objects without a type id (Ban, Log, etc) */
+#define PyIrssiFinal_HEAD(type) \
+ PyObject_HEAD \
+ type *data; \
+ int cleanup_installed;
+
+/* base for classes with a type */
+typedef struct
+{
+ int type;
+} IRSSI_BASE_REC;
+
+typedef struct
+{
+ PyIrssi_HEAD(IRSSI_BASE_REC)
+} PyIrssiBase;
+
+
+/* base for classes with type and a chat type */
+typedef struct
+{
+ int type;
+ int chat_type;
+} IRSSI_CHAT_REC;
+
+typedef struct
+{
+ PyIrssi_HEAD(IRSSI_CHAT_REC)
+} PyIrssiChatBase;
+
+extern PyTypeObject PyIrssiBaseType;
+extern PyTypeObject PyIrssiChatBaseType;
+
+#define pybase_check(op) PyObject_TypeCheck(op, &PyIrssiBaseType)
+#define pychatbase_check(op) PyObject_TypeCheck(op, &PyIrssiChatBaseType)
+#define py_instp(tp, to) ((tp *) (to)->tp_alloc(to, 0))
+#define py_inst(tp, to) py_instp(tp, &to)
+
+int base_objects_init(void);
+
+#define RET_NULL_IF_INVALID(data) \
+ if (data == NULL) \
+ return PyErr_Format(PyExc_RuntimeError, "wrapped object is invalid")
+
+#define RET_N1_IF_INVALID(data) \
+do { \
+ if (data == NULL) \
+ { \
+ PyErr_Format(PyExc_RuntimeError, "wrapped object is invalid"); \
+ return -1; \
+ } \
+} while (0)
+
+#define RET_AS_STRING_OR_NONE(str) \
+do { \
+ if (str) \
+ return PyString_FromString(str); \
+ else \
+ { \
+ Py_INCREF(Py_None); \
+ return Py_None; \
+ } \
+} while (0)
+
+
+#define RET_AS_STRING_OR_EMPTY(str) return PyString_FromString(str? str : "")
+
+#define RET_AS_OBJ_OR_NONE(obj) \
+do { \
+ PyObject *tmp = obj; \
+ if (!tmp) \
+ tmp = Py_None; \
+ Py_INCREF(tmp); \
+ return tmp; \
+} while (0)
+
+#define INVALID_MEMBER(member) \
+ return PyErr_Format(PyExc_RuntimeError, "invalid member id, %d", member)
+
+#endif