1
/* -*- Mode: C; c-basic-offset: 4 -*- */
6
#define NO_IMPORT_PYGOBJECT
11
typedef struct _Search_Handler_User_Data {
14
} Search_Handler_User_Data;
17
hits_as_python_object (GList *hits)
22
if ((result = PyList_New (g_list_length (hits))) == NULL)
26
for (; hits != NULL; hits = hits->next) {
27
Hit *hit = (Hit *) hits->data;
28
PyObject *t = PyTuple_New (3);
29
if (hit->text == NULL) {
31
PyTuple_SET_ITEM (t, 0, Py_None);
33
PyTuple_SET_ITEM (t, 0, PyString_FromString(hit->text));
36
if (hit->email == NULL) {
38
PyTuple_SET_ITEM (t, 1, Py_None);
40
PyTuple_SET_ITEM (t, 1, PyString_FromString(hit->email));
43
if (hit->pixbuf == NULL) {
45
PyTuple_SET_ITEM (t, 2, Py_None);
47
PyTuple_SET_ITEM (t, 2, pygobject_new ((GObject*) hit->pixbuf));
50
PyList_SET_ITEM (result, i, t);
57
handler_c_func (GList *hits, gpointer user_data)
60
PyObject *hits_and_args;
63
PyGILState_STATE gstate;
64
Search_Handler_User_Data *ud = (Search_Handler_User_Data *) user_data;
66
gstate = PyGILState_Ensure();
68
hits_apo = hits_as_python_object (hits);
70
args_length = PyTuple_Size (ud->args);
71
hits_and_args = PyTuple_New (1 + args_length);
72
PyTuple_SET_ITEM (hits_and_args, 0, hits_apo);
73
g_list_foreach (hits, (GFunc) free_hit, NULL);
76
for (i = 0; i < args_length; i++) {
77
PyObject *element = PyTuple_GET_ITEM (ud->args, i);
78
PyTuple_SET_ITEM (hits_and_args, 1 + i, element);
80
Py_XDECREF (ud->args);
82
PyObject *result = PyEval_CallObject (ud->handler, hits_and_args);
84
if (PyErr_Occurred ()) {
90
Py_XDECREF (hits_apo);
91
Py_XDECREF (hits_and_args);
92
Py_XDECREF (ud->handler);
94
PyGILState_Release(gstate);
106
override search_async kwargs
108
_wrap_search_async (PyGObject *self, PyObject *args, PyObject *kwargs)
115
PyObject *extra_args;
116
Search_Handler_User_Data *user_data;
118
len = PyTuple_Size (args);
120
PyErr_SetString (PyExc_TypeError, "search_async requires at least 3 arguments");
123
first = PySequence_GetSlice (args, 0, 3);
124
if (!PyArg_ParseTuple (first, "Osi:search_async", &handler, &query, &max_results)) {
130
if (!PyCallable_Check (handler)) {
131
PyErr_SetString (PyExc_TypeError, "search_async: 1st argument must be callable");
135
extra_args = PySequence_GetSlice (args, 1, len);
136
if (extra_args == NULL) {
140
user_data = g_new (Search_Handler_User_Data, 1);
141
user_data->handler = handler;
142
user_data->args = extra_args;
143
Py_XINCREF (handler);
144
Py_XINCREF (extra_args);
145
search_async (query, max_results, &handler_c_func, user_data);
151
override search_sync kwargs
153
_wrap_search_sync (PyGObject *self, PyObject *args, PyObject *kwargs)
160
if (!PyArg_ParseTuple (args, "si:search_sync", &query, &max_results)) {
164
hits = search_sync (query, max_results);
165
hits_apo = hits_as_python_object (hits);
166
g_list_foreach (hits, (GFunc) free_hit, NULL);