root/trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model-iterator.c

Revision 3666 (checked in by jdapena, 7 months ago)

* Use GOnce registering all types in tinymail to make

registering thread-safe.

Line 
1 /* libtinymail - The Tiny Mail base library
2  * Copyright (C) 2006-2007 Philip Van Hoof <pvanhoof@gnome.org>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with self library; if not, write to the
16  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #include <config.h>
21
22 #include <tny-gtk-folder-store-tree-model.h>
23
24 static GObjectClass *parent_class = NULL;
25
26 #include "tny-gtk-folder-store-tree-model-iterator-priv.h"
27
28 GType _tny_gtk_folder_store_tree_model_iterator_get_type (void);
29
30
31 void 
32 _tny_gtk_folder_store_tree_model_iterator_set_model (TnyGtkFolderStoreTreeModelIterator *self, TnyGtkFolderStoreTreeModel *model)
33 {
34         if (self->model)
35                 g_object_unref (self->model);
36
37         self->model = g_object_ref (model);
38         self->current = model->first;
39
40         return;
41 }
42
43
44
45 TnyGtkFolderStoreTreeModelIterator*
46 _tny_gtk_folder_store_tree_model_iterator_new (TnyGtkFolderStoreTreeModel *model)
47 {
48         TnyGtkFolderStoreTreeModelIterator *self = g_object_new (TNY_TYPE_GTK_FOLDER_STORE_TREE_MODEL_ITERATOR, NULL);
49
50         _tny_gtk_folder_store_tree_model_iterator_set_model (self, model);
51
52         return self;
53 }
54
55 static void
56 tny_gtk_folder_store_tree_model_iterator_instance_init (GTypeInstance *instance, gpointer g_class)
57 {
58         TnyGtkFolderStoreTreeModelIterator *self = (TnyGtkFolderStoreTreeModelIterator *)instance;
59
60         self->model = NULL;
61         self->current = NULL;
62
63         return;
64 }
65
66 static void
67 tny_gtk_folder_store_tree_model_iterator_finalize (GObject *object)
68 {
69         TnyGtkFolderStoreTreeModelIterator *self = (TnyGtkFolderStoreTreeModelIterator *) object;
70
71         if (self->model)
72                 g_object_unref (self->model);
73
74         (*parent_class->finalize) (object);
75
76         return;
77 }
78
79
80 static void
81 tny_gtk_folder_store_tree_model_iterator_next (TnyIterator *self)
82 {
83         TnyGtkFolderStoreTreeModelIterator *me = (TnyGtkFolderStoreTreeModelIterator*) self;
84
85         if (G_UNLIKELY (!me || !me->current || !me->model))
86                 return;
87
88         /* Move the iterator to the next node */
89
90         g_mutex_lock (me->model->iterator_lock);
91         me->current = g_list_next (me->current);
92         g_mutex_unlock (me->model->iterator_lock);
93
94         return;
95 }
96
97 static void
98 tny_gtk_folder_store_tree_model_iterator_prev (TnyIterator *self)
99 {
100         TnyGtkFolderStoreTreeModelIterator *me = (TnyGtkFolderStoreTreeModelIterator*) self;
101
102         if (G_UNLIKELY (!me || !me->current || !me->model))
103                 return;
104
105         /* Move the iterator to the previous node */
106
107         g_mutex_lock (me->model->iterator_lock);
108         me->current = g_list_previous (me->current);
109         g_mutex_unlock (me->model->iterator_lock);
110
111         return;
112 }
113
114
115 static gboolean
116 tny_gtk_folder_store_tree_model_iterator_is_done (TnyIterator *self)
117 {
118         TnyGtkFolderStoreTreeModelIterator *me = (TnyGtkFolderStoreTreeModelIterator*) self;
119        
120         if (G_UNLIKELY (!me || !me->model))
121                 return TRUE;
122
123         return me->current == NULL;
124 }
125
126
127
128 static void
129 tny_gtk_folder_store_tree_model_iterator_first (TnyIterator *self)
130 {
131         TnyGtkFolderStoreTreeModelIterator *me = (TnyGtkFolderStoreTreeModelIterator*) self;
132
133         if (G_UNLIKELY (!me || !me->current || !me->model))
134                 return;
135
136         /* Move the iterator to the first node. We know that model always
137            keeps a reference to the first node, there's nothing wrong with
138            using that one. */
139
140         g_mutex_lock (me->model->iterator_lock);
141         me->current = me->model->first;
142         g_mutex_unlock (me->model->iterator_lock);
143
144         return;
145 }
146
147
148 static void
149 tny_gtk_folder_store_tree_model_iterator_nth (TnyIterator *self, guint nth)
150 {
151         TnyGtkFolderStoreTreeModelIterator *me = (TnyGtkFolderStoreTreeModelIterator*) self;
152
153         if (G_UNLIKELY (!me || !me->current || !me->model))
154                 return;
155
156         /* Move the iterator to the nth node. We'll count from zero,
157            so we start with the first node of which we know the model
158            stored a reference. */
159
160         g_mutex_lock (me->model->iterator_lock);
161         me->current = g_list_nth (me->model->first, nth);
162         g_mutex_unlock (me->model->iterator_lock);
163
164         return;
165 }
166
167
168 static GObject*
169 tny_gtk_folder_store_tree_model_iterator_get_current (TnyIterator *self)
170 {
171         TnyGtkFolderStoreTreeModelIterator *me = (TnyGtkFolderStoreTreeModelIterator*) self;
172         gpointer ptr;
173
174         if (G_UNLIKELY (!me || !me->model))
175                 return NULL;
176
177         /* Give the data of the current node */
178
179         g_mutex_lock (me->model->iterator_lock);
180         ptr = (G_UNLIKELY (me->current)) ? me->current->data : NULL;
181         g_mutex_unlock (me->model->iterator_lock);
182
183         if (ptr)
184                 g_object_ref (G_OBJECT(ptr));
185        
186         return G_OBJECT(ptr);
187 }
188
189
190 static TnyList*
191 tny_gtk_folder_store_tree_model_iterator_get_list (TnyIterator *self)
192 {
193         TnyGtkFolderStoreTreeModelIterator *me = (TnyGtkFolderStoreTreeModelIterator*) self;
194
195         /* Return the list */
196
197         if (G_UNLIKELY (!me || !me->model))
198                 return NULL;
199    
200         g_object_ref (G_OBJECT (me->model));
201
202         return TNY_LIST (me->model);
203 }
204
205 static void
206 tny_iterator_init (TnyIteratorIface *klass)
207 {
208         klass->next= tny_gtk_folder_store_tree_model_iterator_next;
209         klass->prev= tny_gtk_folder_store_tree_model_iterator_prev;
210         klass->first= tny_gtk_folder_store_tree_model_iterator_first;
211         klass->nth= tny_gtk_folder_store_tree_model_iterator_nth;
212         klass->get_current= tny_gtk_folder_store_tree_model_iterator_get_current;
213         klass->get_list= tny_gtk_folder_store_tree_model_iterator_get_list;
214         klass->is_done  = tny_gtk_folder_store_tree_model_iterator_is_done;
215        
216         return;
217 }
218
219 static void
220 tny_gtk_folder_store_tree_model_iterator_class_init (TnyGtkFolderStoreTreeModelIteratorClass *klass)
221 {
222         GObjectClass *object_class;
223
224         parent_class = g_type_class_peek_parent (klass);
225         object_class = (GObjectClass*) klass;
226
227         object_class->finalize = tny_gtk_folder_store_tree_model_iterator_finalize;
228
229         return;
230 }
231
232 static gpointer
233 _tny_gtk_folder_store_tree_model_iterator_register_type (gpointer notused)
234 {
235         GType type = 0;
236
237         static const GTypeInfo info =
238                 {
239                   sizeof (TnyGtkFolderStoreTreeModelIteratorClass),
240                   NULL,   /* base_init */
241                   NULL,   /* base_finalize */
242                   (GClassInitFunc) tny_gtk_folder_store_tree_model_iterator_class_init,   /* class_init */
243                   NULL,   /* class_finalize */
244                   NULL,   /* class_data */
245                   sizeof (TnyGtkFolderStoreTreeModelIterator),
246                   0,      /* n_preallocs */
247                   tny_gtk_folder_store_tree_model_iterator_instance_init,    /* instance_init */
248                   NULL
249                 };
250
251         static const GInterfaceInfo tny_iterator_info =
252                 {
253                   (GInterfaceInitFunc) tny_iterator_init, /* interface_init */
254                   NULL,         /* interface_finalize */
255                   NULL          /* interface_data */
256                 };
257
258         type = g_type_register_static (G_TYPE_OBJECT,
259                                        "TnyGtkFolderStoreTreeModelIterator",
260                                        &info, 0);
261
262         g_type_add_interface_static (type, TNY_TYPE_ITERATOR,
263                                      &tny_iterator_info);
264
265         return GUINT_TO_POINTER (type);
266 }
267
268 GType
269 _tny_gtk_folder_store_tree_model_iterator_get_type (void)
270 {
271         static GOnce once = G_ONCE_INIT;
272         g_once (&once, _tny_gtk_folder_store_tree_model_iterator_register_type, NULL);
273         return GPOINTER_TO_UINT (once.retval);
274 }
Note: See TracBrowser for help on using the browser.