13781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/* GIO - GLib Input, Output and Streaming Library
23781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
33781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Copyright (C) 2006-2007 Red Hat, Inc.
43781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
53781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * This library is free software; you can redistribute it and/or
63781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * modify it under the terms of the GNU Lesser General Public
73781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * License as published by the Free Software Foundation; either
83781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * version 2 of the License, or (at your option) any later version.
93781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
103781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * This library is distributed in the hope that it will be useful,
113781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * but WITHOUT ANY WARRANTY; without even the implied warranty of
123781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
133781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Lesser General Public License for more details.
143781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
153781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * You should have received a copy of the GNU Lesser General
163781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Public License along with this library; if not, write to the
173781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
183781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Boston, MA 02111-1307, USA.
193781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
203781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Author: Alexander Larsson <alexl@redhat.com>
213781343738de4abddf56982325a77bd70a98cd26Alexander Larsson */
223781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
23761424465aaad736916b029383483b6ac419d831Johan Dahlin#include "config.h"
243d93bf6968884d75dd2706ef85e2014305eb92f2Cody Russell#include "gasyncresult.h"
253781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include "gsimpleasyncresult.h"
263d93bf6968884d75dd2706ef85e2014305eb92f2Cody Russell#include "gicon.h"
273781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include "gloadableicon.h"
283781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include "glibintl.h"
293781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
307f3280230bc9448a5750fc17a6eabef691ba25f4Alexander Larsson#include "gioalias.h"
317f3280230bc9448a5750fc17a6eabef691ba25f4Alexander Larsson
325247f12f3649726471080440de0d37b78c1cec33Andrew Walton/**
335247f12f3649726471080440de0d37b78c1cec33Andrew Walton * SECTION:gloadableicon
345247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @short_description: Loadable Icons
35f3144c7efe8c84f7a00bff9b796d5e73efc151cfMatthias Clasen * @include: gio/gio.h
365247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @see_also: #GIcon, #GThemedIcon
375247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
380debd52858ffb4f468e55cd2f3c7e4dec5455b94Matthias Clasen * Extends the #GIcon interface and adds the ability to
390debd52858ffb4f468e55cd2f3c7e4dec5455b94Matthias Clasen * load icons from streams.
405247f12f3649726471080440de0d37b78c1cec33Andrew Walton **/
415247f12f3649726471080440de0d37b78c1cec33Andrew Walton
423781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic void          g_loadable_icon_real_load_async  (GLoadableIcon        *icon,
433781343738de4abddf56982325a77bd70a98cd26Alexander Larsson						       int                   size,
443781343738de4abddf56982325a77bd70a98cd26Alexander Larsson						       GCancellable         *cancellable,
453781343738de4abddf56982325a77bd70a98cd26Alexander Larsson						       GAsyncReadyCallback   callback,
463781343738de4abddf56982325a77bd70a98cd26Alexander Larsson						       gpointer              user_data);
473781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic GInputStream *g_loadable_icon_real_load_finish (GLoadableIcon        *icon,
483781343738de4abddf56982325a77bd70a98cd26Alexander Larsson						       GAsyncResult         *res,
493781343738de4abddf56982325a77bd70a98cd26Alexander Larsson						       char                **type,
503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson						       GError              **error);
513781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic void          g_loadable_icon_base_init        (gpointer              g_class);
523781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic void          g_loadable_icon_class_init       (gpointer              g_class,
533781343738de4abddf56982325a77bd70a98cd26Alexander Larsson						       gpointer              class_data);
543781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
553781343738de4abddf56982325a77bd70a98cd26Alexander LarssonGType
563781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_loadable_icon_get_type (void)
573781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
58acb7f6449a8c553e4e4564cc24ed9916168b7e5fMatthias Clasen  static volatile gsize g_define_type_id__volatile = 0;
593781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
60acb7f6449a8c553e4e4564cc24ed9916168b7e5fMatthias Clasen  if (g_once_init_enter (&g_define_type_id__volatile))
613781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
62acb7f6449a8c553e4e4564cc24ed9916168b7e5fMatthias Clasen      const GTypeInfo loadable_icon_info =
633781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	{
643781343738de4abddf56982325a77bd70a98cd26Alexander Larsson        sizeof (GLoadableIconIface), /* class_size */
653781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	g_loadable_icon_base_init,   /* base_init */
663781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	NULL,		/* base_finalize */
673781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	g_loadable_icon_class_init,
683781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	NULL,		/* class_finalize */
693781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	NULL,		/* class_data */
703781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	0,
713781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	0,              /* n_preallocs */
723781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	NULL
733781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      };
74acb7f6449a8c553e4e4564cc24ed9916168b7e5fMatthias Clasen      GType g_define_type_id =
753781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	g_type_register_static (G_TYPE_INTERFACE, I_("GLoadableIcon"),
763781343738de4abddf56982325a77bd70a98cd26Alexander Larsson				&loadable_icon_info, 0);
773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
78acb7f6449a8c553e4e4564cc24ed9916168b7e5fMatthias Clasen      g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_ICON);
79acb7f6449a8c553e4e4564cc24ed9916168b7e5fMatthias Clasen
80acb7f6449a8c553e4e4564cc24ed9916168b7e5fMatthias Clasen      g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
813781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
823781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
83acb7f6449a8c553e4e4564cc24ed9916168b7e5fMatthias Clasen  return g_define_type_id__volatile;
843781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
853781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
863781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic void
873781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_loadable_icon_class_init (gpointer g_class,
883781343738de4abddf56982325a77bd70a98cd26Alexander Larsson			    gpointer class_data)
893781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
903781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GLoadableIconIface *iface = g_class;
913781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
923781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  iface->load_async = g_loadable_icon_real_load_async;
933781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  iface->load_finish = g_loadable_icon_real_load_finish;
943781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
953781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
963781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic void
973781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_loadable_icon_base_init (gpointer g_class)
983781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
993781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
1003781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1013781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
1023781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_loadable_icon_load:
1035247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @icon: a #GLoadableIcon.
1045247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @size: an integer.
105ab69ee2945af25672ad4bb48ae6ab5b87f0e06e2A. Walton * @type:  a location to store the type of the loaded icon, %NULL to ignore.
1063781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * @cancellable: optional #GCancellable object, %NULL to ignore.
1073781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * @error: a #GError location to store the error occuring, or %NULL to
1083781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * ignore.
1095247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
1105247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Loads a loadable icon. For the asynchronous version of this function,
1115247f12f3649726471080440de0d37b78c1cec33Andrew Walton * see g_loadable_icon_load_async().
1125247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
1135247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Returns: a #GInputStream to read the icon from.
1143781343738de4abddf56982325a77bd70a98cd26Alexander Larsson **/
1153781343738de4abddf56982325a77bd70a98cd26Alexander LarssonGInputStream *
11609471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Claseng_loadable_icon_load (GLoadableIcon  *icon,
11709471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Clasen		      int             size,
11809471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Clasen		      char          **type,
11909471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Clasen		      GCancellable   *cancellable,
12009471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Clasen		      GError        **error)
1213781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
1223781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GLoadableIconIface *iface;
1233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1243781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (G_IS_LOADABLE_ICON (icon), NULL);
1253781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1263781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  iface = G_LOADABLE_ICON_GET_IFACE (icon);
1273781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1283781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return (* iface->load) (icon, size, type, cancellable, error);
1293781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
1303781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1313781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
1323781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_loadable_icon_load_async:
1335247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @icon: a #GLoadableIcon.
1345247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @size: an integer.
1355247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @cancellable: optional #GCancellable object, %NULL to ignore.
1365247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @callback: a #GAsyncReadyCallback to call when the request is satisfied
1375247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @user_data: the data to pass to callback function
1383781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *
1395247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Loads an icon asynchronously. To finish this function, see
1405247f12f3649726471080440de0d37b78c1cec33Andrew Walton * g_loadable_icon_load_finish(). For the synchronous, blocking
1415247f12f3649726471080440de0d37b78c1cec33Andrew Walton * version of this function, see g_loadable_icon_load().
1423781343738de4abddf56982325a77bd70a98cd26Alexander Larsson **/
1433781343738de4abddf56982325a77bd70a98cd26Alexander Larssonvoid
14409471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Claseng_loadable_icon_load_async (GLoadableIcon       *icon,
14509471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Clasen                            int                  size,
14609471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Clasen                            GCancellable        *cancellable,
14709471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Clasen                            GAsyncReadyCallback  callback,
14809471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Clasen                            gpointer             user_data)
1493781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
1503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GLoadableIconIface *iface;
1513781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1523781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_if_fail (G_IS_LOADABLE_ICON (icon));
1533781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1543781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  iface = G_LOADABLE_ICON_GET_IFACE (icon);
1553781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1563781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  (* iface->load_async) (icon, size, cancellable, callback, user_data);
1573781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
1583781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1593781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/**
1603781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * g_loadable_icon_load_finish:
1615247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @icon: a #GLoadableIcon.
1625247f12f3649726471080440de0d37b78c1cec33Andrew Walton * @res: a #GAsyncResult.
163ab69ee2945af25672ad4bb48ae6ab5b87f0e06e2A. Walton * @type: a location to store the type of the loaded icon, %NULL to ignore.
1643781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * @error: a #GError location to store the error occuring, or %NULL to
1653781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * ignore.
1665247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
1675247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Finishes an asynchronous icon load started in g_loadable_icon_load_async().
1685247f12f3649726471080440de0d37b78c1cec33Andrew Walton *
1695247f12f3649726471080440de0d37b78c1cec33Andrew Walton * Returns: a #GInputStream to read the icon from.
1703781343738de4abddf56982325a77bd70a98cd26Alexander Larsson **/
1713781343738de4abddf56982325a77bd70a98cd26Alexander LarssonGInputStream *
17209471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Claseng_loadable_icon_load_finish (GLoadableIcon  *icon,
17309471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Clasen			     GAsyncResult   *res,
17409471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Clasen			     char          **type,
17509471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Clasen			     GError        **error)
1763781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
1773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GLoadableIconIface *iface;
1783781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1793781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (G_IS_LOADABLE_ICON (icon), NULL);
1803781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL);
1813781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1823781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (G_IS_SIMPLE_ASYNC_RESULT (res))
1833781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
1843781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
1853781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      if (g_simple_async_result_propagate_error (simple, error))
1863781343738de4abddf56982325a77bd70a98cd26Alexander Larsson	return NULL;
1873781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
1883781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1893781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  iface = G_LOADABLE_ICON_GET_IFACE (icon);
1903781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1913781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return (* iface->load_finish) (icon, res, type, error);
1923781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
1933781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1943781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/********************************************
1953781343738de4abddf56982325a77bd70a98cd26Alexander Larsson *   Default implementation of async load   *
1963781343738de4abddf56982325a77bd70a98cd26Alexander Larsson ********************************************/
1973781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
1983781343738de4abddf56982325a77bd70a98cd26Alexander Larssontypedef struct {
1993781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  int size;
2003781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  char *type;
2013781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GInputStream *stream;
2023781343738de4abddf56982325a77bd70a98cd26Alexander Larsson} LoadData;
2033781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
2043781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic void
2053781343738de4abddf56982325a77bd70a98cd26Alexander Larssonload_data_free (LoadData *data)
2063781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
2073781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (data->stream)
2083781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    g_object_unref (data->stream);
2093781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_free (data->type);
2103781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_free (data);
2113781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
2123781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
2133781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic void
2143781343738de4abddf56982325a77bd70a98cd26Alexander Larssonload_async_thread (GSimpleAsyncResult *res,
21509471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Clasen		   GObject            *object,
21609471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Clasen		   GCancellable       *cancellable)
2173781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
2183781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GLoadableIconIface *iface;
2193781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GInputStream *stream;
2203781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  LoadData *data;
2213781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GError *error = NULL;
2223781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  char *type = NULL;
2233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
2243781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  data = g_simple_async_result_get_op_res_gpointer (res);
2253781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
2263781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  iface = G_LOADABLE_ICON_GET_IFACE (object);
2273781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  stream = iface->load (G_LOADABLE_ICON (object), data->size, &type, cancellable, &error);
2283781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
2293781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (stream == NULL)
2303781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
2313781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      g_simple_async_result_set_from_error (res, error);
2323781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      g_error_free (error);
2333781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
2343781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  else
2353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
2363781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      data->stream = stream;
2373781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      data->type = type;
2383781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
2393781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
2403781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
2413781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
2423781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
2433781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic void
24409471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Claseng_loadable_icon_real_load_async (GLoadableIcon       *icon,
24509471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Clasen				 int                  size,
24609471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Clasen				 GCancellable        *cancellable,
24709471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Clasen				 GAsyncReadyCallback  callback,
24809471fec46619a62fbe9b6e7a7b67c9a421f919eMatthias Clasen				 gpointer             user_data)
2493781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
2503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GSimpleAsyncResult *res;
2513781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  LoadData *data;
2523781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
2533781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  res = g_simple_async_result_new (G_OBJECT (icon), callback, user_data, g_loadable_icon_real_load_async);
2543781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  data = g_new0 (LoadData, 1);
2553781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify) load_data_free);
2563781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_simple_async_result_run_in_thread (res, load_async_thread, 0, cancellable);
2573781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  g_object_unref (res);
2583781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
2593781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
2603781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic GInputStream *
2613781343738de4abddf56982325a77bd70a98cd26Alexander Larssong_loadable_icon_real_load_finish (GLoadableIcon        *icon,
2623781343738de4abddf56982325a77bd70a98cd26Alexander Larsson				  GAsyncResult         *res,
2633781343738de4abddf56982325a77bd70a98cd26Alexander Larsson				  char                **type,
2643781343738de4abddf56982325a77bd70a98cd26Alexander Larsson				  GError              **error)
2653781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{
2663781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
2673781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  LoadData *data;
2683781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
269cc3de68e2151cf3341115212c56c17714ca03bb2g_simple_async_result_get_source_tag (simple) == g_loadable_icon_real_load_async);  g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_loadable_icon_real_load_async);
2703781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
2713781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  data = g_simple_async_result_get_op_res_gpointer (simple);
2723781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
2733781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  if (type)
2743781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    {
2753781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      *type = data->type;
2763781343738de4abddf56982325a77bd70a98cd26Alexander Larsson      data->type = NULL;
2773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson    }
2783781343738de4abddf56982325a77bd70a98cd26Alexander Larsson
2793781343738de4abddf56982325a77bd70a98cd26Alexander Larsson  return g_object_ref (data->stream);
2803781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}
2817f3280230bc9448a5750fc17a6eabef691ba25f4Alexander Larsson
2827f3280230bc9448a5750fc17a6eabef691ba25f4Alexander Larsson#define __G_LOADABLE_ICON_C__
2837f3280230bc9448a5750fc17a6eabef691ba25f4Alexander Larsson#include "gioaliasdef.c"
284