return 0;
}
-/* get a tuple with all users in it */
static PyObject*
-emb_get_users(UNUSED_ARG(PyObject *self), PyObject *args) {
+pyobj_from_dict_t(dict_t d) {
PyObject* retval;
- size_t num_clients, n = 0;
+ size_t n = 0;
struct _tuple_dict_extra extra;
- if (!PyArg_ParseTuple(args, ""))
- return NULL;
-
- num_clients = dict_size(clients);
- retval = PyTuple_New(num_clients);
- if (retval == NULL)
+ if ((retval = PyTuple_New(dict_size(d))) == NULL)
return NULL;
extra.extra = &n;
extra.data = retval;
- if (dict_foreach(clients, _dict_iter_fill_tuple, (void*)&extra) != NULL) {
+ if (dict_foreach(d, _dict_iter_fill_tuple, (void*)&extra) != NULL) {
pyobj_release_tuple(retval, n);
return NULL;
}
return retval;
}
-/* get a tuple with all channels in it */
+/* get a tuple with all users in it */
static PyObject*
-emb_get_channels(UNUSED_ARG(PyObject* self), PyObject* args) {
- PyObject* retval;
- size_t num_channels, n = 0;
- struct _tuple_dict_extra extra;
-
+emb_get_users(UNUSED_ARG(PyObject *self), PyObject *args) {
if (!PyArg_ParseTuple(args, ""))
return NULL;
- num_channels = dict_size(channels);
- retval = PyTuple_New(num_channels);
- if (retval == NULL)
- return NULL;
-
- extra.extra = &n;
- extra.data = retval;
+ return pyobj_from_dict_t(clients);
+}
- if (dict_foreach(channels, _dict_iter_fill_tuple, (void*)&extra) != NULL) {
- pyobj_release_tuple(retval, n);
+/* get a tuple with all channels in it */
+static PyObject*
+emb_get_channels(UNUSED_ARG(PyObject* self), PyObject* args) {
+ if (!PyArg_ParseTuple(args, ""))
return NULL;
- }
- return retval;
+ return pyobj_from_dict_t(channels);
}
static PyObject*
emb_get_servers(UNUSED_ARG(PyObject* self), PyObject* args) {
- PyObject* retval;
- size_t n = 0;
- struct _tuple_dict_extra extra;
-
if (!PyArg_ParseTuple(args, ""))
return NULL;
- retval = PyTuple_New(dict_size(servers));
- if (retval == NULL)
- return NULL;
-
- extra.extra = &n;
- extra.data = retval;
-
- if (dict_foreach(servers, _dict_iter_fill_tuple, (void*)&extra) != NULL) {
- pyobj_release_tuple(retval, n);
- return NULL;
- }
-
- return retval;
+ return pyobj_from_dict_t(servers);
}
static PyObject*
emb_get_accounts(UNUSED_ARG(PyObject* self), PyObject* args) {
- PyObject* retval;
- size_t n = 0;
- struct _tuple_dict_extra extra;
-
if (!PyArg_ParseTuple(args, ""))
return NULL;
- retval = PyTuple_New(dict_size(nickserv_handle_dict));
- if (retval == NULL)
- return NULL;
-
- extra.extra = &n;
- extra.data = retval;
-
- if (dict_foreach(nickserv_handle_dict, _dict_iter_fill_tuple, (void*)&extra) != NULL) {
- pyobj_release_tuple(retval, n);
- return NULL;
- }
-
- return retval;
+ return pyobj_from_dict_t(nickserv_handle_dict);
}
static PyObject*
return pyobj_from_server(srv);
}
+static PyObject*
+pyobj_from_modelist(struct modeList* mode) {
+ size_t n;
+ PyObject* tmp;
+ PyObject* retval = PyTuple_New(mode->used);
+
+ if (retval == NULL)
+ return NULL;
+
+ for (n = 0; n < mode->used; ++n) {
+ struct modeNode* mn = mode->list[n];
+ tmp = PyString_FromString(mn->user->nick);
+ if (tmp == NULL) {
+ pyobj_release_tuple(retval, n);
+ return NULL;
+ }
+
+ if (PyTuple_SetItem(retval, n, tmp)) {
+ pyobj_release_tuple(retval, n);
+ return NULL;
+ }
+ }
+
+ return retval;
+}
+
+static PyObject*
+pyobj_from_banlist(struct banList* bans) {
+ size_t n;
+ struct banNode* bn;
+ PyObject* tmp;
+ PyObject* retval = PyTuple_New(bans->used);
+
+ if (retval == NULL)
+ return NULL;
+
+ for (n = 0; n < bans->used; ++n) {
+ bn = bans->list[n];
+
+ tmp = Py_BuildValue("{s:s,s:s,s:l}",
+ "ban", bn->ban, "who", bn->who, "set", bn->set);
+
+ if (tmp == NULL || PyTuple_SetItem(retval, n, tmp)) {
+ pyobj_release_tuple(retval, n);
+ return NULL;
+ }
+ }
+
+ return retval;
+}
+
+static PyObject*
+pyobj_from_exemptlist(struct exemptList* exmp) {
+ size_t n;
+ struct exemptNode* en;
+ PyObject* tmp;
+ PyObject* retval = PyTuple_New(exmp->used);
+
+ if (retval == NULL)
+ return NULL;
+
+ for (n = 0; n < exmp->used; ++n) {
+ en = exmp->list[n];
+
+ tmp = Py_BuildValue("{s:s,s:s,s:l}",
+ "ban", en->exempt, "who", en->who, "set", en->set);
+
+ if (tmp == NULL || PyTuple_SetItem(retval, n, tmp)) {
+ pyobj_release_tuple(retval, n);
+ return NULL;
+ }
+ }
+
+ return retval;
+}
+
static PyObject*
emb_get_channel(UNUSED_ARG(PyObject *self), PyObject *args)
{
*/
char *name;
struct chanNode *channel;
- unsigned int n;
- PyObject *pChannelMembers;
- PyObject *pChannelBans;
- PyObject *pChannelExempts;
+ PyObject *pChannelMembers = NULL;
+ PyObject *pChannelBans = NULL;
+ PyObject *pChannelExempts = NULL;
+ PyObject *retval = NULL;
if(!PyArg_ParseTuple(args, "s", &name))
}
/* build tuple of nicks in channel */
- pChannelMembers = PyTuple_New(channel->members.used);
- for(n=0;n < channel->members.used;n++) {
- struct modeNode *mn = channel->members.list[n];
- PyTuple_SetItem(pChannelMembers, n, Py_BuildValue("s", mn->user->nick));
- }
+ pChannelMembers = pyobj_from_modelist(&channel->members);
+ if (pChannelMembers == NULL)
+ goto cleanup;
/* build tuple of bans */
- pChannelBans = PyTuple_New(channel->banlist.used);
- for(n=0; n < channel->banlist.used;n++) {
- struct banNode *bn = channel->banlist.list[n];
- PyTuple_SetItem(pChannelBans, n,
- Py_BuildValue("{s:s,s:s,s:i}",
- "ban", bn->ban,
- "who", bn->who,
- "set", bn->set)
- );
- }
+ pChannelBans = pyobj_from_banlist(&channel->banlist);
+ if (pChannelBans == NULL)
+ goto cleanup;
/* build tuple of exempts */
- pChannelExempts = PyTuple_New(channel->exemptlist.used);
- for(n=0; n < channel->exemptlist.used;n++) {
- struct exemptNode *en = channel->exemptlist.list[n];
- PyTuple_SetItem(pChannelExempts, n,
- Py_BuildValue("{s:s,s:s,s:i}",
- "ban", en->exempt,
- "who", en->who,
- "set", en->set)
- );
- }
+ pChannelExempts = pyobj_from_exemptlist(&channel->exemptlist);
+ if (pChannelExempts == NULL)
+ goto cleanup;
- return Py_BuildValue("{s:s,s:s,s:s,s:i"
+ retval = Py_BuildValue("{s:s,s:s,s:s,s:i"
",s:i,s:i,s:O,s:O,s:O}",
"name", channel->name,
"bans", pChannelBans,
"exempts", pChannelExempts
);
+ if (retval == NULL)
+ goto cleanup;
+
+ return retval;
+
+cleanup:
+ Py_XDECREF(retval);
+ pyobj_release_tuple(pChannelExempts, channel->exemptlist.used);
+ pyobj_release_tuple(pChannelBans, channel->banlist.used);
+ pyobj_release_tuple(pChannelMembers, channel->members.used);
+
+ return NULL;
}
static PyObject*