]> git.0d.be Git - empathy.git/blob - libempathy-gtk/empathy-roster-model-aggregator.c
Connected the aggregator to individuals-changed signal
[empathy.git] / libempathy-gtk / empathy-roster-model-aggregator.c
1 /*
2  * empathy-roster-model-aggregator.c
3  *
4  * Implementation of EmpathyRosterModel using FolksIndividualAggregator as
5  * source.
6  *
7  * Copyright (C) 2012 Collabora Ltd. <http://www.collabora.co.uk/>
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
22  */
23
24
25 #include "config.h"
26
27 #include <folks/folks.h>
28 #include <folks/folks-telepathy.h>
29
30 #include "empathy-roster-model-aggregator.h"
31
32 #include "empathy-roster-model.h"
33
34 /**
35  * SECTION: empathy-roster-model-aggregator
36  * @title: EmpathyRosterModelAggregator
37  * @short_description: TODO
38  *
39  * TODO
40  */
41
42 /**
43  * EmpathyRosterModelAggregator:
44  *
45  * Data structure representing a #EmpathyRosterModelAggregator.
46  *
47  * Since: UNRELEASED
48  */
49
50 /**
51  * EmpathyRosterModelAggregatorClass:
52  *
53  * The class of a #EmpathyRosterModelAggregator.
54  *
55  * Since: UNRELEASED
56  */
57
58 static void roster_model_iface_init (EmpathyRosterModelInterface *iface);
59
60 G_DEFINE_TYPE_WITH_CODE (EmpathyRosterModelAggregator,
61     empathy_roster_model_aggregator,
62     G_TYPE_OBJECT,
63     G_IMPLEMENT_INTERFACE (EMPATHY_TYPE_ROSTER_MODEL, roster_model_iface_init))
64
65 enum
66 {
67   PROP_AGGREGATOR = 1,
68   N_PROPS
69 };
70
71 /*
72 enum
73 {
74   LAST_SIGNAL
75 };
76
77 static guint signals[LAST_SIGNAL];
78 */
79
80 struct _EmpathyRosterModelAggregatorPriv
81 {
82   FolksIndividualAggregator *aggregator;
83 };
84
85 static void
86 aggregator_individuals_changed_cb (FolksIndividualAggregator *aggregator,
87     GeeSet *added,
88     GeeSet *removed,
89     gchar *message,
90     FolksPersona *actor,
91     FolksGroupDetailsChangeReason reason,
92     EmpathyRosterModelAggregator *self)
93 {
94   if (gee_collection_get_size (GEE_COLLECTION (added)) > 0)
95     {
96       GeeIterator *iter = gee_iterable_iterator (GEE_ITERABLE (added));
97
98       while (iter != NULL && gee_iterator_next (iter))
99         {
100           empathy_roster_model_fire_individual_added (
101               EMPATHY_ROSTER_MODEL (self), gee_iterator_get (iter));
102         }
103       g_clear_object (&iter);
104     }
105
106   if (gee_collection_get_size (GEE_COLLECTION (removed)) > 0)
107     {
108       GeeIterator *iter = gee_iterable_iterator (GEE_ITERABLE (removed));
109
110       while (iter != NULL && gee_iterator_next (iter))
111         {
112           empathy_roster_model_fire_individual_removed (
113               EMPATHY_ROSTER_MODEL (self), gee_iterator_get (iter));
114         }
115       g_clear_object (&iter);
116     }
117 }
118
119 static void
120 empathy_roster_model_aggregator_get_property (GObject *object,
121     guint property_id,
122     GValue *value,
123     GParamSpec *pspec)
124 {
125   EmpathyRosterModelAggregator *self = EMPATHY_ROSTER_MODEL_AGGREGATOR (object);
126
127   switch (property_id)
128     {
129       case PROP_AGGREGATOR:
130         g_value_set_object (value, self->priv->aggregator);
131         break;
132       default:
133         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
134         break;
135     }
136 }
137
138 static void
139 empathy_roster_model_aggregator_set_property (GObject *object,
140     guint property_id,
141     const GValue *value,
142     GParamSpec *pspec)
143 {
144   EmpathyRosterModelAggregator *self = EMPATHY_ROSTER_MODEL_AGGREGATOR (object);
145
146   switch (property_id)
147     {
148       case PROP_AGGREGATOR:
149         g_assert (self->priv->aggregator == NULL); /* construct only */
150         self->priv->aggregator = g_value_dup_object (value);
151         break;
152       default:
153         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
154         break;
155     }
156 }
157
158 static void
159 empathy_roster_model_aggregator_constructed (GObject *object)
160 {
161   EmpathyRosterModelAggregator *self = EMPATHY_ROSTER_MODEL_AGGREGATOR (object);
162   void (*chain_up) (GObject *) =
163       ((GObjectClass *) empathy_roster_model_aggregator_parent_class)->constructed;
164
165   if (chain_up != NULL)
166     chain_up (object);
167
168   if (self->priv->aggregator == NULL)
169     self->priv->aggregator = folks_individual_aggregator_new ();
170
171   tp_g_signal_connect_object (self->priv->aggregator, "individuals-changed",
172       G_CALLBACK (aggregator_individuals_changed_cb), self, 0);
173
174   folks_individual_aggregator_prepare (self->priv->aggregator, NULL, NULL);
175
176   g_assert (FOLKS_IS_INDIVIDUAL_AGGREGATOR (self->priv->aggregator));
177 }
178
179 static void
180 empathy_roster_model_aggregator_dispose (GObject *object)
181 {
182   EmpathyRosterModelAggregator *self = EMPATHY_ROSTER_MODEL_AGGREGATOR (object);
183   void (*chain_up) (GObject *) =
184       ((GObjectClass *) empathy_roster_model_aggregator_parent_class)->dispose;
185
186   g_clear_object (&self->priv->aggregator);
187
188   if (chain_up != NULL)
189     chain_up (object);
190 }
191
192 static void
193 empathy_roster_model_aggregator_finalize (GObject *object)
194 {
195   //EmpathyRosterModelAggregator *self = EMPATHY_ROSTER_MODEL_AGGREGATOR (object);
196   void (*chain_up) (GObject *) =
197       ((GObjectClass *) empathy_roster_model_aggregator_parent_class)->finalize;
198
199   if (chain_up != NULL)
200     chain_up (object);
201 }
202
203 static void
204 empathy_roster_model_aggregator_class_init (
205     EmpathyRosterModelAggregatorClass *klass)
206 {
207   GObjectClass *oclass = G_OBJECT_CLASS (klass);
208   GParamSpec *spec;
209
210   oclass->get_property = empathy_roster_model_aggregator_get_property;
211   oclass->set_property = empathy_roster_model_aggregator_set_property;
212   oclass->constructed = empathy_roster_model_aggregator_constructed;
213   oclass->dispose = empathy_roster_model_aggregator_dispose;
214   oclass->finalize = empathy_roster_model_aggregator_finalize;
215
216   spec = g_param_spec_object ("aggregator", "Aggregator",
217       "FolksIndividualAggregator",
218       FOLKS_TYPE_INDIVIDUAL_AGGREGATOR,
219       G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
220   g_object_class_install_property (oclass, PROP_AGGREGATOR, spec);
221
222   g_type_class_add_private (klass, sizeof (EmpathyRosterModelAggregatorPriv));
223 }
224
225 static void
226 empathy_roster_model_aggregator_init (EmpathyRosterModelAggregator *self)
227 {
228   self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
229       EMPATHY_TYPE_ROSTER_MODEL_AGGREGATOR, EmpathyRosterModelAggregatorPriv);
230 }
231
232 EmpathyRosterModelAggregator *
233 empathy_roster_model_aggregator_new (void)
234 {
235   return g_object_new (EMPATHY_TYPE_ROSTER_MODEL_AGGREGATOR,
236       NULL);
237 }
238
239 EmpathyRosterModelAggregator *
240 empathy_roster_model_aggregator_new_with_aggregator (
241     FolksIndividualAggregator *aggregator)
242 {
243   g_return_val_if_fail (FOLKS_IS_INDIVIDUAL_AGGREGATOR (aggregator), NULL);
244
245   return g_object_new (EMPATHY_TYPE_ROSTER_MODEL_AGGREGATOR,
246       "aggregator", aggregator,
247       NULL);
248 }
249
250 static void
251 roster_model_iface_init (EmpathyRosterModelInterface *iface)
252 {
253
254 }