void search_complete(sp_search * search, Callback * st) { PyObject *res, *results; PyGILState_STATE gstate; gstate = PyGILState_Ensure(); results = Results_FromSpotify(search); res = PyObject_CallFunctionObjArgs(st->callback, results, st->userdata, NULL); if (!res) PyErr_WriteUnraisable(st->callback); delete_trampoline(st); Py_XDECREF(res); Py_DECREF(results); PyGILState_Release(gstate); }
static PyObject * Session_search(PyObject *self, PyObject *args, PyObject *kwds) { PyObject *callback, *userdata = NULL; Callback *trampoline; char *query; sp_search *search; sp_search_type search_type = SP_SEARCH_STANDARD; int track_offset = 0, track_count = 32, album_offset = 0, album_count = 32, artist_offset = 0, artist_count = 32, playlist_offset = 0, playlist_count = 32; static char *kwlist[] = { "query", "callback", "track_offset", "track_count", "album_offset", "album_count", "artist_offset", "artist_count", "playlist_offset", "playlist_count", "search_type", "userdata", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwds, "esO|iiiiiiiiO&O", kwlist, ENCODING, &query, &callback, &track_offset, &track_count, &album_offset, &album_count, &artist_offset, &artist_count, &playlist_offset, &playlist_count, &sp_search_type_converter, (void *)&search_type, &userdata)) return NULL; trampoline = create_trampoline(callback, userdata); Py_BEGIN_ALLOW_THREADS; search = sp_search_create(Session_SP_SESSION(self), query, track_offset, track_count, album_offset, album_count, artist_offset, artist_count, playlist_offset, playlist_count, search_type, Session_search_complete, (void *)trampoline); Py_END_ALLOW_THREADS; PyMem_Free(query); return Results_FromSpotify(search, 0 /* add_ref */); }
static PyObject * Session_search(Session * self, PyObject *args, PyObject *kwds) { char *query; sp_search *search; PyObject *callback, *userdata = NULL; int track_offset = 0, track_count = 32, album_offset = 0, album_count = 32, artist_offset = 0, artist_count = 32; Callback *st; PyObject *results; static char *kwlist[] = { "query", "callback", "track_offset", "track_count", "album_offset", "album_count", "artist_offset", "artist_count", "userdata", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwds, "esO|iiiiiiO", kwlist, ENCODING, &query, &callback, &track_offset, &track_count, &album_offset, &album_count, &artist_offset, &artist_count, &userdata)) return NULL; if (!userdata) userdata = Py_None; st = create_trampoline(callback, NULL, userdata); Py_BEGIN_ALLOW_THREADS; search = sp_search_create(self->_session, query, track_offset, track_count, album_offset, album_count, artist_offset, artist_count, (search_complete_cb *) search_complete, (void *)st); Py_END_ALLOW_THREADS; results = Results_FromSpotify(search); return results; }
void Session_search_complete(sp_search *search, void *data) { Callback *trampoline = (Callback *)data; debug_printf(">> search complete (%p, %p)", search, trampoline); if (trampoline == NULL) return; PyObject *result, *search_results; PyGILState_STATE gstate = PyGILState_Ensure(); search_results = Results_FromSpotify(search, 1 /* add_ref */); result = PyObject_CallFunction(trampoline->callback, "NO", search_results, trampoline->userdata); if (result != NULL) Py_DECREF(result); else PyErr_WriteUnraisable(trampoline->callback); delete_trampoline(trampoline); PyGILState_Release(gstate); }