2
* @file item_loader.c Asynchronously loading items
4
* Copyright (C) 2011 Lars Lindner <lars.lindner@gmail.com>
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
#include "item_loader.h"
23
#define ITEM_LOADER_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), ITEM_LOADER_TYPE, ItemLoaderPrivate))
25
struct ItemLoaderPrivate {
26
fetchCallbackPtr fetchCallback; /**< the function to call after each item fetch */
27
gpointer fetchCallbackData; /**< user data for the fetch callback */
29
nodePtr node; /**< the node we are loading items for */
31
guint idleId; /**< fetch callback source id */
40
static guint item_loader_signals[LAST_SIGNAL] = { 0 };
42
static GObjectClass *parent_class = NULL;
44
G_DEFINE_TYPE (ItemLoader, item_loader, G_TYPE_OBJECT);
47
item_loader_finalize (GObject *object)
49
ItemLoader *il = ITEM_LOADER (object);
52
g_source_remove (il->priv->idleId);
54
G_OBJECT_CLASS (parent_class)->finalize (object);
58
item_loader_class_init (ItemLoaderClass *klass)
60
GObjectClass *object_class = G_OBJECT_CLASS (klass);
62
parent_class = g_type_class_peek_parent (klass);
64
object_class->finalize = item_loader_finalize;
66
item_loader_signals[ITEM_BATCH_FETCHED] =
67
g_signal_new ("item-batch-fetched",
68
G_OBJECT_CLASS_TYPE (object_class),
69
(GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
73
g_cclosure_marshal_VOID__POINTER,
78
item_loader_signals[FINISHED] =
79
g_signal_new ("finished",
80
G_OBJECT_CLASS_TYPE (object_class),
81
(GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
85
g_cclosure_marshal_VOID__VOID,
89
g_type_class_add_private (object_class, sizeof(ItemLoaderPrivate));
93
item_loader_init (ItemLoader *il)
95
il->priv = ITEM_LOADER_GET_PRIVATE (il);
99
item_loader_get_node (ItemLoader *il)
101
return il->priv->node;
105
item_loader_fetch (gpointer user_data)
107
ItemLoader *il = ITEM_LOADER (user_data);
108
GSList *resultItems = NULL;
111
result = (*il->priv->fetchCallback)(il->priv->fetchCallbackData, &resultItems);
113
g_signal_emit_by_name (il, "item-batch-fetched", resultItems);
115
g_signal_emit_by_name (il, "finished");
121
item_loader_start (ItemLoader *il)
123
il->priv->idleId = g_idle_add (item_loader_fetch, il);
127
item_loader_new (fetchCallbackPtr fetchCallback, nodePtr node, gpointer fetchCallbackData)
131
il = ITEM_LOADER (g_object_new (ITEM_LOADER_TYPE, NULL));
132
il->priv->node = node;
133
il->priv->fetchCallback = fetchCallback;
134
il->priv->fetchCallbackData = fetchCallbackData;