static void packagetarget_end_callback(void *data, LrTransferStatus status, const char *msg) { _PackageTargetObject *self; PyObject *user_data, *result; self = (_PackageTargetObject *)data; assert(self->handle); if (!self->end_cb) return; if (self->cb_data) user_data = self->cb_data; else user_data = Py_None; EndAllowThreads(self->state); result = PyObject_CallFunction(self->end_cb, "(Ois)", user_data, status, msg); Py_XDECREF(result); BeginAllowThreads(self->state); return; }
static int packagetarget_mirrorfailure_callback(void *data, const char *msg, const char *url) { _PackageTargetObject *self; PyObject *user_data, *result; self = (_PackageTargetObject *)data; assert(self->handle); if (!self->mirrorfailure_cb) return 0; if (self->cb_data) user_data = self->cb_data; else user_data = Py_None; EndAllowThreads(self->state); result = PyObject_CallFunction(self->mirrorfailure_cb, "(Oss)", user_data, msg, url); Py_XDECREF(result); BeginAllowThreads(self->state); return 0; }
void py_debug_cb(G_GNUC_UNUSED const gchar *log_domain, G_GNUC_UNUSED GLogLevelFlags log_level, const gchar *message, G_GNUC_UNUSED gpointer user_data) { PyObject *arglist, *data, *result, *py_message; if (!debug_cb) return; // XXX: GIL Hack if (global_state) EndAllowThreads((PyThreadState **) global_state); // XXX: End of GIL Hack py_message = PyStringOrNone_FromString(message); data = (debug_cb_data) ? debug_cb_data : Py_None; arglist = Py_BuildValue("(OO)", py_message, data); result = PyObject_CallObject(debug_cb, arglist); Py_DECREF(arglist); Py_XDECREF(result); Py_DECREF(py_message); // XXX: GIL Hack if (global_state) BeginAllowThreads((PyThreadState **) global_state); // XXX: End of GIL Hack }
PyObject * py_download_url(G_GNUC_UNUSED PyObject *self, PyObject *args) { gboolean ret; PyObject *py_handle; LrHandle *handle = NULL; char *url; int fd; GError *tmp_err = NULL; PyThreadState *state = NULL; if (!PyArg_ParseTuple(args, "Osi:download_url", &py_handle, &url, &fd)) return NULL; Py_XINCREF(py_handle); if (HandleObject_Check(py_handle)) { handle = Handle_FromPyObject(py_handle); } else if (py_handle != Py_None) { PyErr_SetString(PyExc_TypeError, "Only Handle or None is supported"); return NULL; } // XXX: GIL Hack int hack_rc = gil_logger_hack_begin(&state); if (hack_rc == GIL_HACK_ERROR) return NULL; BeginAllowThreads(&state); ret = lr_download_url(handle, url, fd, &tmp_err); EndAllowThreads(&state); // XXX: GIL Hack if (!gil_logger_hack_end(hack_rc)) return NULL; assert((ret && !tmp_err) || (!ret && tmp_err)); if (ret) Py_RETURN_NONE; // All fine - Return None // Error occurred if (PyErr_Occurred()) { // Python exception occurred (in a python callback probably) return NULL; } else if(tmp_err->code == LRE_INTERRUPTED) { // Interrupted by Ctr+C g_error_free(tmp_err); PyErr_SetInterrupt(); PyErr_CheckSignals(); return NULL; } else { // Return exception created from GError RETURN_ERROR(&tmp_err, -1, NULL); } }
static int packagetarget_mirrorfailure_callback(void *data, const char *msg, const char *url) { int ret = LR_CB_OK; // Assume everything will be ok _PackageTargetObject *self; PyObject *user_data, *result; self = (_PackageTargetObject *)data; assert(self->handle); if (!self->mirrorfailure_cb) return ret; if (self->cb_data) user_data = self->cb_data; else user_data = Py_None; EndAllowThreads(self->state); result = PyObject_CallFunction(self->mirrorfailure_cb, "(Oss)", user_data, msg, url); if (!result) { // Exception raised in callback leads to the abortion // of whole downloading (it is considered fatal) ret = LR_CB_ERROR; } else { if (result == Py_None) { // Assume that None means that everything is ok ret = LR_CB_OK; #if PY_MAJOR_VERSION < 3 } else if (PyInt_Check(result)) { ret = PyInt_AS_LONG(result); #endif } else if (PyLong_Check(result)) { ret = (int) PyLong_AsLong(result); } else { // It's an error if result is None neither int PyErr_SetString(PyExc_TypeError, "Mirror failure callback must return integer number"); ret = LR_CB_ERROR; } } Py_XDECREF(result); BeginAllowThreads(self->state); return ret; }
static int packagetarget_progress_callback(void *data, double total_to_download, double now_downloaded) { _PackageTargetObject *self; PyObject *user_data, *result; self = (_PackageTargetObject *)data; assert(self->handle); if (!self->progress_cb) return 0; if (self->cb_data) user_data = self->cb_data; else user_data = Py_None; EndAllowThreads(self->state); result = PyObject_CallFunction(self->progress_cb, "(Odd)", user_data, total_to_download, now_downloaded); Py_XDECREF(result); BeginAllowThreads(self->state); return 0; }