summaryrefslogtreecommitdiffstats
path: root/objects/reconnect-object.c
diff options
context:
space:
mode:
Diffstat (limited to 'objects/reconnect-object.c')
-rw-r--r--objects/reconnect-object.c152
1 files changed, 152 insertions, 0 deletions
diff --git a/objects/reconnect-object.c b/objects/reconnect-object.c
new file mode 100644
index 0000000..4e60599
--- /dev/null
+++ b/objects/reconnect-object.c
@@ -0,0 +1,152 @@
+#include <Python.h>
+#include "pyirssi.h"
+#include "pymodule.h"
+#include "pycore.h"
+#include "factory.h"
+#include "reconnect-object.h"
+
+/*XXX: no Reconnect cleanup/destroy sig. Maybe value copy the two members? */
+
+static void PyReconnect_dealloc(PyReconnect *self)
+{
+ Py_XDECREF(self->connect);
+ self->ob_type->tp_free((PyObject*)self);
+}
+
+static PyObject *PyReconnect_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ PyReconnect *self;
+
+ self = (PyReconnect *)type->tp_alloc(type, 0);
+ if (!self)
+ return NULL;
+
+ return (PyObject *)self;
+}
+
+/* Getters */
+
+PyDoc_STRVAR(PyReconnect_tag_doc,
+ "Unique numeric tag"
+);
+static PyObject *PyReconnect_tag_get(PyReconnect *self, void *closure)
+{
+ RECONNECT_REC *data = self->data;
+ RET_NULL_IF_INVALID(self->data);
+
+ return PyInt_FromLong(data->tag);
+}
+
+PyDoc_STRVAR(PyReconnect_next_connect_doc,
+ "Unix time stamp when the next connection occurs"
+);
+static PyObject *PyReconnect_next_connect_get(PyReconnect *self, void *closure)
+{
+ RECONNECT_REC *data = self->data;
+ RET_NULL_IF_INVALID(self->data);
+
+ return PyLong_FromUnsignedLong(data->next_connect);
+}
+
+PyDoc_STRVAR(PyReconnect_connect_doc,
+ "Connection object"
+);
+static PyObject *PyReconnect_connect_get(PyReconnect *self, void *closure)
+{
+ RET_NULL_IF_INVALID(self->data);
+ RET_AS_OBJ_OR_NONE(self->connect);
+}
+
+/* specialized getters/setters */
+static PyGetSetDef PyReconnect_getseters[] = {
+ {"tag", (getter)PyReconnect_tag_get, NULL,
+ PyReconnect_tag_doc, NULL},
+ {"next_connect", (getter)PyReconnect_next_connect_get, NULL,
+ PyReconnect_next_connect_doc, NULL},
+ {"connect", (getter)PyReconnect_connect_get, NULL,
+ PyReconnect_connect_doc, NULL},
+ {NULL}
+};
+
+/* Methods for object */
+static PyMethodDef PyReconnect_methods[] = {
+ {NULL} /* Sentinel */
+};
+
+PyTypeObject PyReconnectType = {
+ PyObject_HEAD_INIT(NULL)
+ 0, /*ob_size*/
+ "Reconnect", /*tp_name*/
+ sizeof(PyReconnect), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ (destructor)PyReconnect_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*/
+ "PyReconnect objects", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ PyReconnect_methods, /* tp_methods */
+ 0, /* tp_members */
+ PyReconnect_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 */
+ PyReconnect_new, /* tp_new */
+};
+
+
+/* window item wrapper factory function */
+PyObject *pyreconnect_new(void *recon)
+{
+ RECONNECT_REC *rec = recon;
+ PyObject *connect;
+ PyReconnect *pyrecon;
+
+ /* XXX: get a managed connect because there's no signals to manage reconnect */
+ connect = py_irssi_chat_new(rec->conn, 1);
+ if (!connect)
+ return NULL;
+
+ pyrecon = py_inst(PyReconnect, PyReconnectType);
+ if (!pyrecon)
+ return NULL;
+
+ pyrecon->data = recon;
+ pyrecon->connect = connect;
+
+ return (PyObject *)pyrecon;
+}
+
+int reconnect_object_init(void)
+{
+ g_return_val_if_fail(py_module != NULL, 0);
+
+ if (PyType_Ready(&PyReconnectType) < 0)
+ return 0;
+
+ Py_INCREF(&PyReconnectType);
+ PyModule_AddObject(py_module, "Reconnect", (PyObject *)&PyReconnectType);
+
+ return 1;
+}