示例#1
0
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;
}
示例#2
0
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;
}
示例#3
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
}
示例#4
0
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);
    }
}
示例#5
0
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;
}
示例#6
0
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;
}