コード例 #1
0
ファイル: memcached.c プロジェクト: AlexShiLucky/lighttpd2
static void cancel_all_requests(liMemcachedCon *con) {
	int_request *req;
	GError *err1 = NULL, *err = NULL;
	gboolean first = TRUE;

	if (con->err) {
		err1 = g_error_copy(con->err);
	} else {
		g_set_error(&err1, LI_MEMCACHED_ERROR, LI_MEMCACHED_CONNECTION, "Connection reset");
	}

	while (NULL != (req = g_queue_peek_head(&con->req_queue))) {
		if (NULL == err) {
			err = g_error_copy(err1);
		}

		if (req->req.callback) req->req.callback(&req->req, LI_MEMCACHED_RESULT_ERROR, NULL, &err);

		free_request(con, req);

		if (first) {
			if (err) err->code = LI_MEMCACHED_DISABLED; /* "silent" fail */
			if (err1) err1->code = LI_MEMCACHED_DISABLED; /* "silent" fail */
			if (con->err) con->err->code = LI_MEMCACHED_DISABLED; /* "silent" fail */

			first = FALSE;
		}
	}

	if (NULL != err) g_clear_error(&err);
	if (NULL != err1) g_clear_error(&err1);
}
コード例 #2
0
static void
do_sparql_query_async_connection_cb (GObject      *const object,
                                     GAsyncResult *const result,
                                     GTask        *const task)
{

  g_autoptr(GError) error = NULL;

  TrackerSparqlConnection *const conn = tracker_sparql_connection_get_finish (
    result,
    &error
  );

  if (error) {
    g_task_return_error (task, g_error_copy (error));
    return;
  }

  SparqlQueryWork *const work = sparql_query_work_get (task);
  work->connection = conn;

  tracker_sparql_connection_query_async (
    conn,
    work->sparql,
    g_task_get_cancellable (task),
    (GAsyncReadyCallback) do_sparql_query_async_cursor_cb,
    task
  );

}
コード例 #3
0
ファイル: session.c プロジェクト: dmp0x7c5/test-repo
static void connect_cb(GObex *obex, GError *err, GObexPacket *rsp,
							gpointer user_data)
{
	struct callback_data *callback = user_data;
	GError *gerr = NULL;
	uint8_t rsp_code;

	if (err != NULL) {
		error("connect_cb: %s", err->message);
		gerr = g_error_copy(err);
		goto done;
	}

	rsp_code = g_obex_packet_get_operation(rsp, NULL);
	if (rsp_code != G_OBEX_RSP_SUCCESS)
		gerr = g_error_new(OBEX_IO_ERROR, -EIO,
				"OBEX Connect failed with 0x%02x", rsp_code);

done:
	callback->func(callback->session, NULL, gerr, callback->data);
	if (gerr != NULL)
		g_error_free(gerr);
	obc_session_unref(callback->session);
	g_free(callback);
}
コード例 #4
0
ファイル: gsf-infile-tar.c プロジェクト: arcean/libgsf
static GsfInput *
gsf_infile_tar_dup (GsfInput *src_input, GError **err)
{
	GsfInfileTar *res, *src;
	unsigned ui;

	src = GSF_INFILE_TAR (src_input);
	if (src->err) {
		if (err)
			*err = g_error_copy (src->err);
		return NULL;
	}

	res = (GsfInfileTar *)g_object_new (GSF_INFILE_TAR_TYPE, NULL);
	gsf_infile_tar_set_source (res, src->source);

	for (ui = 0; ui < src->children->len; ui++) {
		/* This copies the structure.  */
		TarChild c = g_array_index (src->children, TarChild, ui);
		c.name = g_strdup (c.name);
		if (c.dir) g_object_ref (c.dir);
		g_array_append_val (res->children, c);
	}

	return NULL;
}
コード例 #5
0
ファイル: memcached.c プロジェクト: AlexShiLucky/lighttpd2
liMemcachedRequest* li_memcached_get(liMemcachedCon *con, GString *key, liMemcachedCB callback, gpointer cb_data, GError **err) {
	int_request* req;

	if (!li_memcached_is_key_valid(key)) {
		g_set_error(err, LI_MEMCACHED_ERROR, LI_MEMCACHED_BAD_KEY, "Invalid key: '%s'", key->str);
		return NULL;
	}

	if (-1 == con->fd) memcached_connect(con);
	if (-1 == con->fd) {
		if (NULL == con->err) {
			g_set_error(err, LI_MEMCACHED_ERROR, LI_MEMCACHED_DISABLED, "Not connected");
		} else if (err) {
			*err = g_error_copy(con->err);
		}
		return NULL;
	}

	req = g_slice_new0(int_request);
	req->req.callback = callback;
	req->req.cb_data = cb_data;

	req->type = REQ_GET;
	req->key = g_string_new_len(GSTR_LEN(key));

	if (!push_request(con, req, err)) {
		free_request(con, req);
		return NULL;
	}

	return &req->req;
}
コード例 #6
0
ファイル: lt-ext-module.c プロジェクト: pevik/liblangtag
gboolean
lt_ext_module_precheck_tag(lt_ext_module_t       *module,
			   lt_ext_module_data_t  *data,
			   const lt_tag_t        *tag,
			   GError               **error)
{
	GError *err = NULL;
	gboolean retval;

	g_return_val_if_fail (module != NULL, FALSE);
	g_return_val_if_fail (data != NULL, FALSE);
	g_return_val_if_fail (module->funcs != NULL, FALSE);
	g_return_val_if_fail (module->funcs->precheck_tag != NULL, FALSE);

	retval = module->funcs->precheck_tag(data, tag, &err);
	if (err) {
		if (error)
			*error = g_error_copy(err);
		else
			g_warning(err->message);
		g_error_free(err);
		retval = FALSE;
	}

	return retval;
}
コード例 #7
0
ファイル: gvfsdaemondbus.c プロジェクト: ondrejholy/gvfs
static void
open_connection_async_cb (GObject *source_object,
                          GAsyncResult *res,
                          gpointer user_data)
{
    GVfsDBusDaemon *proxy;
    AsyncDBusCall *async_call = user_data;
    GError *error = NULL;

    proxy = gvfs_dbus_daemon_proxy_new_finish (res, &error);
    if (proxy == NULL)
    {
        async_call->io_error = g_error_copy (error);
        g_error_free (error);
        async_call_finish (async_call);
        return;
    }

    g_dbus_proxy_set_default_timeout (G_DBUS_PROXY (proxy), G_VFS_DBUS_TIMEOUT_MSECS);

    gvfs_dbus_daemon_call_get_connection (proxy,
                                          async_call->cancellable,
                                          (GAsyncReadyCallback) async_get_connection_response,
                                          async_call);

    g_object_unref (proxy);
}
コード例 #8
0
static void
print_file_done (GObject *source,
                 GAsyncResult *result,
                 gpointer data)
{
  GtkPrintOperation *op = data;
  GtkPrintOperationPortal *op_portal = op->priv->platform_data;
  GError *error = NULL;
  GVariant *ret;

  ret = g_dbus_proxy_call_finish (op_portal->proxy,
                                  result,
                                  &error);
  if (ret == NULL)
    {
      if (op->priv->error == NULL)
        op->priv->error = g_error_copy (error);
      g_warning ("Print file failed: %s", error->message);
      g_error_free (error);
    }
  else
    g_variant_unref (ret);

  if (op_portal->loop)
    g_main_loop_quit (op_portal->loop);

  g_object_unref (op);
}
コード例 #9
0
ファイル: uca-pco-camera.c プロジェクト: MariaMatveeva/libuca
static gboolean
uca_pco_camera_initable_init (GInitable *initable,
                              GCancellable *cancellable,
                              GError **error)
{
    UcaPcoCamera *camera;
    UcaPcoCameraPrivate *priv;

    g_return_val_if_fail (UCA_IS_PCO_CAMERA (initable), FALSE);

    if (cancellable != NULL) {
        g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
                             "Cancellable initialization not supported");
        return FALSE;
    }

    camera = UCA_PCO_CAMERA (initable);
    priv = camera->priv;

    if (priv->construct_error != NULL) {
        if (error)
            *error = g_error_copy (priv->construct_error);

        return FALSE;
    }

    return TRUE;
}
コード例 #10
0
/*
 * Create a new filled #GdaRow object for the next cursor row
 *
 * Each new #GdaRow created is referenced only by imodel->priv->tmp_row (the #GdaDataSelect implementation
 * never keeps a reference to it).
 * Before a new #GdaRow gets created, the previous one, if set, is discarded.
 */
static gboolean
gda_sqlite_recordset_fetch_next (GdaDataSelect *model, GdaRow **prow, gint rownum, GError **error)
{
	GdaSqliteRecordset *imodel = (GdaSqliteRecordset*) model;

	if (imodel->priv->tmp_row) {
		g_object_unref (imodel->priv->tmp_row);
		imodel->priv->tmp_row = NULL;
	}
	if (imodel->priv->next_row_num != rownum) {
		GError *lerror = NULL;
		*prow = NULL;
		g_set_error (&lerror, GDA_DATA_MODEL_ERROR,
			     GDA_DATA_MODEL_ROW_NOT_FOUND_ERROR,
			     "%s", _("Can't set iterator on requested row"));
		gda_data_select_add_exception (GDA_DATA_SELECT (model), lerror);
		if (error)
			g_propagate_error (error, g_error_copy (lerror));
		return TRUE;
	}
	*prow = fetch_next_sqlite_row (imodel, FALSE, error);
	imodel->priv->tmp_row = *prow;

	return TRUE;
}
コード例 #11
0
static void
unsolicited_disable_done (MMModem *modem,
                          GError *error,
                          gpointer user_data)
{
    MMCallbackInfo *info = user_data;

    /* Handle modem removal, but ignore other errors */
    if (g_error_matches (error, MM_MODEM_ERROR, MM_MODEM_ERROR_REMOVED))
        info->error = g_error_copy (error);
    else if (!modem) {
        info->error =  g_error_new_literal (MM_MODEM_ERROR,
                                            MM_MODEM_ERROR_REMOVED,
                                            "The modem was removed.");
    }

    if (info->error) {
        mm_callback_info_schedule (info);
        return;
    }

    /* Otherwise, kill any existing connection */
    if (mm_generic_gsm_get_cid (MM_GENERIC_GSM (modem)) >= 0)
        hso_call_control (MM_MODEM_HSO (modem), FALSE, TRUE, disable_done, info);
    else
        disable_done (modem, NULL, info);
}
コード例 #12
0
static void _get_metadata_tracker_cb(GHashTable *result,
                                     GError *error,
                                     gpointer user_data)
{
        struct _metadatas_closure *mc = (struct _metadatas_closure *) user_data;

        /* Save error */
        if (error) {
               /* This error, if emitted with send_error is freed after the callback
                  chain, so we have to make a copy when we add it to the closure */
                if (!mc->common->error) {
                        mc->common->error = g_error_copy(error);
                }
        }

        /* Save result */
	if (result)
        	g_hash_table_insert(mc->common->metadatas,
                            mc->object_id,
                            g_hash_table_ref(result));
        mc->common->remaining--;

        /* If there aren't more elements, send results */
        if (mc->common->remaining == 0) {
                _emit_metadatas_results(mc->common);
        }

        /* Free closure */
        g_free(mc);
}
コード例 #13
0
ファイル: mech-egl-config.c プロジェクト: arthurfait/mechane
MechEGLConfig *
_mech_egl_config_get (gint     renderable_type,
                      GError **error)
{
  static GHashTable *egl_configs = NULL;
  MechEGLConfigPrivate *egl_config;

  if (G_UNLIKELY (!egl_configs))
    egl_configs = g_hash_table_new (NULL, NULL);

  egl_config = g_hash_table_lookup (egl_configs,
                                    GINT_TO_POINTER (renderable_type));

  if (!egl_config)
    {
      egl_config = _create_egl_config (renderable_type);
      g_hash_table_insert (egl_configs, GINT_TO_POINTER (renderable_type),
                           egl_config);
    }

  if (G_UNLIKELY (egl_config->error))
    {
      if (error)
        *error = g_error_copy (egl_config->error);

      return NULL;
    }

  return (MechEGLConfig *) egl_config;
}
コード例 #14
0
static void
cb_error (MilterErrorEmittable *emittable, GError *error, gpointer user_data)
{
    if (actual_error)
        g_error_free(actual_error);
    actual_error = g_error_copy(error);
}
コード例 #15
0
static void
ev_load_job_done (EvJob *ev_job,
                  gpointer user_data)
{
  PdfLoadJob *job = user_data;

  if (ev_job_is_failed (ev_job) || (ev_job->document == NULL)) {
    if (job->from_old_cache)
      pdf_load_job_force_refresh_cache (job);
    else
      pdf_load_job_complete_error (job, (ev_job->error != NULL) ? 
                                   g_error_copy (ev_job->error) :
                                   g_error_new_literal (G_IO_ERROR,
                                                        G_IO_ERROR_FAILED,
                                                        _("Unable to load the document")));

    g_clear_object (&ev_job);
    return;
  }

  job->document = g_object_ref (ev_job->document);
  g_object_unref (ev_job);

  pdf_load_job_complete_success (job);
}
コード例 #16
0
static void
get_nwstate_done (MMAtSerialPort *port,
                  GString *response,
                  GError *error,
                  gpointer user_data)
{
    MMCallbackInfo *info = user_data;

    /* If the modem has already been removed, return without
     * scheduling callback */
    if (mm_callback_info_check_modem_removed (info))
        return;

    if (error)
        info->error = g_error_copy (error);
    else {
        MMModemIcera *self = MM_MODEM_ICERA (info->modem);
        MMModemIceraPrivate *priv = MM_MODEM_ICERA_GET_PRIVATE (self);

        /* The unsolicited message handler will already have run and
         * removed the NWSTATE response, so we have to work around that.
         */
        mm_callback_info_set_result (info, GUINT_TO_POINTER (priv->last_act), NULL);
        priv->last_act = MM_MODEM_GSM_ACCESS_TECH_UNKNOWN;
    }

    mm_callback_info_schedule (info);
}
コード例 #17
0
static void
copy_status (McdChannel *source, McdChannel *dest)
{
    McdChannelPrivate *src_priv, *dst_priv;

    src_priv = source->priv;
    dst_priv = dest->priv;
    if (dst_priv->status != src_priv->status)
    {
        DEBUG ("source is %d, dest is %d", src_priv->status, dst_priv->status);
        if (src_priv->status == MCD_CHANNEL_STATUS_FAILED)
        {
            const GError *error;

            error = mcd_channel_get_error (source);
            /* this also takes care of setting the status */
            mcd_channel_take_error (dest, g_error_copy (error));
        }
        else
            _mcd_channel_set_status (dest, src_priv->status);
    }

    if (dst_priv->status == MCD_CHANNEL_STATUS_FAILED ||
        dst_priv->status == MCD_CHANNEL_STATUS_DISPATCHED)
    {
        /* the request is completed, we are not interested in monitor the
         * channel anymore */
        g_signal_handlers_disconnect_by_func
            (source, on_proxied_channel_status_changed, dest);
        mcd_mission_abort (MCD_MISSION (dest));
    }
}
コード例 #18
0
static void
parse_response (MMAtSerialPort *port,
                GString *response,
                GError *error,
                gpointer user_data)
{
    MMPluginBaseSupportsTask *task = MM_PLUGIN_BASE_SUPPORTS_TASK (user_data);
    MMPluginBaseSupportsTaskPrivate *task_priv = MM_PLUGIN_BASE_SUPPORTS_TASK_GET_PRIVATE (task);

    if (task_priv->probe_id)
        g_source_remove (task_priv->probe_id);
    g_free (task_priv->probe_resp);
    task_priv->probe_resp = NULL;
    g_clear_error (&(task_priv->probe_error));

    if (response && response->len)
        task_priv->probe_resp = g_strdup (response->str);
    if (error)
        task_priv->probe_error = g_error_copy (error);

    /* Schedule the response handler in an idle, since we can't emit the
     * PROBE_RESULT signal from the serial port response handler without
     * potentially destroying the serial port in the middle of its response
     * handler, which it understandably doesn't like.
     */
    task_priv->probe_id = g_idle_add (handle_probe_response, task);
}
コード例 #19
0
ファイル: gvfsdaemondbus.c プロジェクト: ondrejholy/gvfs
static void
async_get_connection_response (GVfsDBusDaemon *proxy,
                               GAsyncResult *res,
                               gpointer user_data)
{
    AsyncDBusCall *async_call = user_data;
    GError *error = NULL;
    gchar *address1 = NULL;

    if (! gvfs_dbus_daemon_call_get_connection_finish (proxy,
            &address1, NULL,
            res,
            &error))
    {
        async_call->io_error = g_error_copy (error);
        g_error_free (error);
        g_free (address1);
        async_call_finish (async_call);
        return;
    }

    g_dbus_connection_new_for_address (address1,
                                       G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
                                       NULL, /* GDBusAuthObserver */
                                       async_call->cancellable,
                                       async_got_private_connection_cb,
                                       async_call);
    g_free (address1);
}
コード例 #20
0
static void
ev_load_job_done (EvJob *ev_job,
                  gpointer user_data)
{
  PdfLoadJob *job = user_data;

  if (ev_job_is_failed (ev_job) || (ev_job->document == NULL)) {
    if (job->from_old_cache) {
      pdf_load_job_force_refresh_cache (job);
    } else if (g_error_matches (ev_job->error, EV_DOCUMENT_ERROR, EV_DOCUMENT_ERROR_ENCRYPTED)
               && job->passwd != NULL
               && !job->passwd_tried) {
      /* EvJobLoad tries using the password only after the job has
       * failed once.
       */
      ev_job_scheduler_push_job (ev_job, EV_JOB_PRIORITY_NONE);
      job->passwd_tried = TRUE;
    } else {
      pdf_load_job_complete_error (job, (ev_job->error != NULL) ? 
                                   g_error_copy (ev_job->error) :
                                   g_error_new_literal (G_IO_ERROR,
                                                        G_IO_ERROR_FAILED,
                                                        _("Unable to load the document")));
    }

    return;
  }

  job->document = g_object_ref (ev_job->document);
  pdf_load_job_complete_success (job);
}
コード例 #21
0
ファイル: cheese-camera-device.c プロジェクト: johlim/study
static gboolean
cheese_camera_device_initable_init (GInitable    *initable,
                                    GCancellable *cancellable,
                                    GError      **error)
{
  CheeseCameraDevice        *device = CHEESE_CAMERA_DEVICE (initable);
  CheeseCameraDevicePrivate *priv   = device->priv;

  g_return_val_if_fail (CHEESE_IS_CAMERA_DEVICE (initable), FALSE);

  if (cancellable != NULL)
  {
    g_set_error_literal (error,
                         CHEESE_CAMERA_DEVICE_ERROR,
                         CHEESE_CAMERA_DEVICE_ERROR_NOT_SUPPORTED,
                         _("Cancellable initialization not supported"));
    return FALSE;
  }

  if (priv->construct_error)
  {
    if (error)
      *error = g_error_copy (priv->construct_error);
    return FALSE;
  }

  return TRUE;
}
コード例 #22
0
/* Parsing functions to create GDataFreebaseTopicValues, and arrays of those */
static gchar *
reader_dup_member_string (JsonReader *reader, const gchar *member, GError **error)
{
	const GError *reader_error;
	gchar *str;

	if (error != NULL && *error != NULL)
		return NULL;

	json_reader_read_member (reader, member);
	str = g_strdup (json_reader_get_string_value (reader));
	reader_error = json_reader_get_error (reader);

	if (reader_error != NULL) {
		g_free (str);
		str = NULL;

		if (error != NULL)
			*error = g_error_copy (reader_error);
	}

	json_reader_end_member (reader);

	return str;
}
コード例 #23
0
static gint64
reader_parse_timestamp (JsonReader *reader, const gchar *member, GError **error)
{
	const GError *reader_error;
	const gchar *date_str;
	gint64 timestamp = -1;

	if (error != NULL && *error != NULL)
		return -1;

	json_reader_read_member (reader, member);
	date_str = json_reader_get_string_value (reader);
	reader_error = json_reader_get_error (reader);

	if (reader_error != NULL) {
		if (error != NULL)
			*error = g_error_copy (reader_error);
	} else if (date_str) {
		if (!gdata_parser_int64_from_iso8601 (date_str, &timestamp))
			timestamp = -1;
	}

	json_reader_end_member (reader);

	return timestamp;
}
コード例 #24
0
ファイル: rb-chunk-loader.c プロジェクト: bilboed/rhythmbox
/**
 * rb_chunk_loader_get_error:
 * @loader: a #RBChunkLoader
 *
 * If an error has occurred that prevents the loader from providing
 * any further data, this function will return a #GError, otherwise
 * NULL.
 *
 * Return value: loader error or NULL
 */
GError *
rb_chunk_loader_get_error (RBChunkLoader *loader)
{
	if (loader->priv->error)
		return g_error_copy (loader->priv->error);
	return NULL;
}
コード例 #25
0
/**
 * rb_async_copy_get_error:
 * @copy: a #RBAsyncCopy
 *
 * If an error has occurred that prevents the copy from proceeding,
 * this function will return a #GError, otherwise NULL.
 *
 * Return value: copy error or NULL
 */
GError *
rb_async_copy_get_error (RBAsyncCopy *copy)
{
	if (copy->priv->error)
		return g_error_copy (copy->priv->error);
	return NULL;
}
コード例 #26
0
static void
handshake_thread_completed (GObject      *object,
			    GAsyncResult *result,
			    gpointer      user_data)
{
  GTask *caller_task = user_data;
  GTlsConnectionBase *tls = g_task_get_source_object (caller_task);
  GError *error = NULL;
  gboolean need_finish_handshake, success;

  g_mutex_lock (&tls->op_mutex);
  if (tls->need_finish_handshake)
    {
      need_finish_handshake = TRUE;
      tls->need_finish_handshake = FALSE;
    }
  else
    need_finish_handshake = FALSE;
  g_mutex_unlock (&tls->op_mutex);

  if (need_finish_handshake)
    {
      success = finish_handshake (tls, G_TASK (result), &error);
      if (success)
	g_task_return_boolean (caller_task, TRUE);
      else
	g_task_return_error (caller_task, error);
    }
  else if (tls->handshake_error)
    g_task_return_error (caller_task, g_error_copy (tls->handshake_error));
  else
    g_task_return_boolean (caller_task, TRUE);

  g_object_unref (caller_task);
}
コード例 #27
0
void
seahorse_operation_copy_error  (SeahorseOperation *op, GError **err)
{
    g_return_if_fail (err == NULL || *err == NULL);
    if (err)
        *err = op->error ? g_error_copy (op->error) : NULL;
}
コード例 #28
0
ファイル: gfal_srm_rm.c プロジェクト: adevress/gfal2
/**
 *
 * bindings of the unlink plugin call
 */
int gfal_srm_unlink_listG(plugin_handle ch, int nbfiles, const char* const* paths, GError** err)
{
    GError *tmp_err = NULL;
    int ret = -1, i;

    if (!err)
        return -1;

    if (!ch || nbfiles < 0 || paths == NULL || *paths == NULL) {
        gfal2_set_error(&tmp_err, gfal2_get_plugin_srm_quark(), EINVAL, __func__, "incorrect args");
    }
    else {
        gfal_srmv2_opt* opts = (gfal_srmv2_opt*) ch;
        srm_context_t context = gfal_srm_ifce_easy_context(opts, paths[0], &tmp_err);
        if (context) {
            for(i = 0; i < nbfiles; ++i)
                gfal_srm_cache_stat_remove(ch, paths[i]);

            ret = gfal_srm_rm_srmv2_internal(context, nbfiles, paths, err);
        }
    }

    if (tmp_err) {
        for (i = 1; i < nbfiles; ++i)
            err[i] = g_error_copy(err[0]);
    }
    return ret;
}
コード例 #29
0
ファイル: egg-task-cache.c プロジェクト: MaX121/gnome-builder
static void
egg_task_cache_propagate_error (EggTaskCache  *self,
                                gconstpointer  key,
                                const GError  *error)
{
  GPtrArray *queued;

  g_assert (EGG_IS_TASK_CACHE (self));
  g_assert (error != NULL);

  if ((queued = g_hash_table_lookup (self->queued, key)))
    {
      gint64 count = queued->len;
      gsize i;

      /* we can't use steal because we want the key freed */
      g_ptr_array_ref (queued);
      g_hash_table_remove (self->queued, key);

      for (i = 0; i < queued->len; i++)
        {
          GTask *task;

          task = g_ptr_array_index (queued, i);
          g_task_return_error (task, g_error_copy (error));
        }

      g_ptr_array_unref (queued);

      EGG_COUNTER_SUB (queued, count);
    }
}
コード例 #30
0
static void
do_sparql_query_async_cursor_cb (GObject      *const object,
                                 GAsyncResult *const result,
                                 GTask        *const task)
{

  g_autoptr(GError) error = NULL;

  SparqlQueryWork *const work = sparql_query_work_get (task);
  TrackerSparqlConnection *const conn = work->connection;

  TrackerSparqlCursor *const cur = tracker_sparql_connection_query_finish (
    conn,
    result,
    &error
  );

  if (error) {
    g_task_return_error (task, g_error_copy (error));
    return;
  }

  g_task_return_pointer (task, cur, g_object_unref);

}