1 /* ctrlproxy: A modular IRC proxy
2 * (c) 2002-2009 Jelmer Vernooij <jelmer@nl.linux.org>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "ctrlproxy.h"
23 #include "libirc/python/irc.h"
25 static int py_transport_dealloc(PyTransportObject *self)
27 if (self->parent != NULL)
28 Py_DECREF(self->parent);
30 free_irc_transport(self->transport);
31 PyObject_Del((PyObject *)self);
35 static gboolean py_transport_is_connected(void *data)
37 PyObject *obj = (PyObject *)data, *ret;
40 ret = PyObject_CallMethod(obj, "is_connected", "");
45 if (!PyBool_Check(ret)) {
46 PyErr_SetString(PyExc_TypeError, "is_connected didn't return a boolean");
51 boolret = (ret == Py_True);
57 static void py_transport_disconnect(void *data)
59 PyObject *obj = (PyObject *)data, *ret;
61 ret = PyObject_CallMethod(obj, "disconnect", "");
69 static gboolean py_transport_send_line(struct irc_transport *transport, const struct irc_line *l, GError **error)
72 PyLineObject *py_line;
74 py_line = (PyLineObject *)PyObject_New(PyLineObject, &PyLineType);
75 py_line->line = linedup(l);
77 ret = PyObject_CallMethod(transport->backend_data, "send_line", "O", py_line);
81 g_error_set_python(error);
90 static char *py_transport_get_peer_name(void *data)
92 PyObject *obj = (PyObject *)data, *ret;
95 ret = PyObject_Str(obj);
99 if (!PyString_Check(ret)) {
100 PyErr_SetNone(PyExc_TypeError);
104 strret = g_strdup(PyString_AsString(ret));
110 static void py_transport_activate(struct irc_transport *transport)
112 PyObject *obj = (PyObject *)transport->backend_data, *ret;
114 ret = PyObject_CallMethod(obj, "activate", "");
118 static gboolean py_transport_set_charset(struct irc_transport *transport, const char *charsetname)
120 PyObject *obj = (PyObject *)transport->backend_data, *ret;
122 ret = PyObject_CallMethod(obj, "set_charset", "s", charsetname);
132 struct irc_transport_ops py_transport_ops = {
133 .free_data = (void (*) (void *))Py_DecRef,
134 .is_connected = py_transport_is_connected,
135 .disconnect = py_transport_disconnect,
136 .send_line = py_transport_send_line,
137 .get_peer_name = py_transport_get_peer_name,
138 .activate = py_transport_activate,
139 .set_charset = py_transport_set_charset,
142 static PyObject *py_transport_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
144 char *kwnames[] = { NULL };
145 PyTransportObject *self;
146 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "", kwnames))
149 self = (PyTransportObject *)type->tp_alloc(type, 0);
156 self->transport = g_new0(struct irc_transport, 1);
157 self->transport->backend_data = self;
158 self->transport->backend_ops = &py_transport_ops;
160 return (PyObject *)self;
163 struct irc_transport *wrap_py_transport(PyObject *obj)
165 struct irc_transport *transport;
167 transport = g_new0(struct irc_transport, 1);
169 transport->backend_data = obj;
170 transport->backend_ops = &py_transport_ops;
175 static PyObject *py_transport_inject_line(PyTransportObject *self, PyObject *line)
180 if (self->transport->callbacks == NULL || self->transport->callbacks->recv == NULL) {
181 PyErr_SetNone(PyExc_AttributeError);
185 l = PyObject_AsLine(line);
190 ret = self->transport->callbacks->recv(self->transport, l);
193 return PyBool_FromLong(ret);
196 static PyMethodDef py_transport_methods[] = {
197 { "inject_line", (PyCFunction)py_transport_inject_line,
198 METH_O, "Inject line" },
202 PyTypeObject PyTransportType = {
203 .tp_name = "Transport",
204 .tp_flags = Py_TPFLAGS_DEFAULT,
205 .tp_new = py_transport_new,
206 .tp_methods = py_transport_methods,
207 .tp_basicsize = sizeof(PyTransportObject),
208 .tp_dealloc = (destructor)py_transport_dealloc,