]> git.0d.be Git - empathy.git/blob - libempathy-gtk/empathy-roster-model-manager.c
empathy-roster-model-manager: deal with members-changed signals empathy-roster-view...
[empathy.git] / libempathy-gtk / empathy-roster-model-manager.c
1 /*
2  * empathy-roster-model-manager.c
3  *
4  * Implementation of EmpathyRosterModel using EmpathyIndividualManager 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 #include "config.h"
25
26 #include "empathy-roster-model-manager.h"
27
28 #include "empathy-roster-model.h"
29
30 static void roster_model_iface_init (EmpathyRosterModelInterface *iface);
31
32 G_DEFINE_TYPE_WITH_CODE (EmpathyRosterModelManager,
33     empathy_roster_model_manager,
34     G_TYPE_OBJECT,
35     G_IMPLEMENT_INTERFACE (EMPATHY_TYPE_ROSTER_MODEL, roster_model_iface_init))
36
37 enum
38 {
39   PROP_MANAGER = 1,
40   N_PROPS
41 };
42
43 /*
44 enum
45 {
46   LAST_SIGNAL
47 };
48
49 static guint signals[LAST_SIGNAL];
50 */
51
52 struct _EmpathyRosterModelManagerPriv
53 {
54   EmpathyIndividualManager *manager;
55 };
56
57 static void
58 members_changed_cb (EmpathyIndividualManager *manager,
59     const gchar *message,
60     GList *added,
61     GList *removed,
62     TpChannelGroupChangeReason reason,
63     EmpathyRosterModelManager *self)
64 {
65   GList *l;
66
67   for (l = added; l != NULL; l = g_list_next (l))
68     {
69       empathy_roster_model_fire_individual_added (EMPATHY_ROSTER_MODEL (self),
70           l->data);
71     }
72
73   for (l = removed; l != NULL; l = g_list_next (l))
74     {
75       empathy_roster_model_fire_individual_removed (EMPATHY_ROSTER_MODEL (self),
76           l->data);
77     }
78 }
79
80 static void
81 empathy_roster_model_manager_get_property (GObject *object,
82     guint property_id,
83     GValue *value,
84     GParamSpec *pspec)
85 {
86   EmpathyRosterModelManager *self = EMPATHY_ROSTER_MODEL_MANAGER (object);
87
88   switch (property_id)
89     {
90       case PROP_MANAGER:
91         g_value_set_object (value, self->priv->manager);
92         break;
93       default:
94         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
95         break;
96     }
97 }
98
99 static void
100 empathy_roster_model_manager_set_property (GObject *object,
101     guint property_id,
102     const GValue *value,
103     GParamSpec *pspec)
104 {
105   EmpathyRosterModelManager *self = EMPATHY_ROSTER_MODEL_MANAGER (object);
106
107   switch (property_id)
108     {
109       case PROP_MANAGER:
110         g_assert (self->priv->manager == NULL); /* construct only */
111         self->priv->manager = g_value_dup_object (value);
112         break;
113       default:
114         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
115         break;
116     }
117 }
118
119 static void
120 empathy_roster_model_manager_constructed (GObject *object)
121 {
122   EmpathyRosterModelManager *self = EMPATHY_ROSTER_MODEL_MANAGER (object);
123   void (*chain_up) (GObject *) =
124       ((GObjectClass *) empathy_roster_model_manager_parent_class)->constructed;
125
126   if (chain_up != NULL)
127     chain_up (object);
128
129   g_assert (EMPATHY_IS_INDIVIDUAL_MANAGER (self->priv->manager));
130
131   tp_g_signal_connect_object (self->priv->manager, "members-changed",
132       G_CALLBACK (members_changed_cb), self, 0);
133 }
134
135 static void
136 empathy_roster_model_manager_dispose (GObject *object)
137 {
138   EmpathyRosterModelManager *self = EMPATHY_ROSTER_MODEL_MANAGER (object);
139   void (*chain_up) (GObject *) =
140       ((GObjectClass *) empathy_roster_model_manager_parent_class)->dispose;
141
142   g_clear_object (&self->priv->manager);
143
144   if (chain_up != NULL)
145     chain_up (object);
146 }
147
148 static void
149 empathy_roster_model_manager_finalize (GObject *object)
150 {
151   //EmpathyRosterModelManager *self = EMPATHY_ROSTER_MODEL_MANAGER (object);
152   void (*chain_up) (GObject *) =
153       ((GObjectClass *) empathy_roster_model_manager_parent_class)->finalize;
154
155   if (chain_up != NULL)
156     chain_up (object);
157 }
158
159 static void
160 empathy_roster_model_manager_class_init (
161     EmpathyRosterModelManagerClass *klass)
162 {
163   GObjectClass *oclass = G_OBJECT_CLASS (klass);
164   GParamSpec *spec;
165
166   oclass->get_property = empathy_roster_model_manager_get_property;
167   oclass->set_property = empathy_roster_model_manager_set_property;
168   oclass->constructed = empathy_roster_model_manager_constructed;
169   oclass->dispose = empathy_roster_model_manager_dispose;
170   oclass->finalize = empathy_roster_model_manager_finalize;
171
172   spec = g_param_spec_object ("manager", "Manager",
173       "EmpathyIndividualManager",
174       EMPATHY_TYPE_INDIVIDUAL_MANAGER,
175       G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
176   g_object_class_install_property (oclass, PROP_MANAGER, spec);
177
178   g_type_class_add_private (klass, sizeof (EmpathyRosterModelManagerPriv));
179 }
180
181 static void
182 empathy_roster_model_manager_init (EmpathyRosterModelManager *self)
183 {
184   self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
185       EMPATHY_TYPE_ROSTER_MODEL_MANAGER, EmpathyRosterModelManagerPriv);
186 }
187
188 EmpathyRosterModelManager *
189 empathy_roster_model_manager_new (EmpathyIndividualManager *manager)
190 {
191   g_return_val_if_fail (EMPATHY_IS_INDIVIDUAL_MANAGER (manager), NULL);
192
193   return g_object_new (EMPATHY_TYPE_ROSTER_MODEL_MANAGER,
194       "manager", manager,
195       NULL);
196 }
197
198 static GList *
199 empathy_roster_model_manager_get_individuals (EmpathyRosterModel *model)
200 {
201   EmpathyRosterModelManager *self = EMPATHY_ROSTER_MODEL_MANAGER (model);
202
203   return empathy_individual_manager_get_members (self->priv->manager);
204 }
205
206 static void
207 roster_model_iface_init (EmpathyRosterModelInterface *iface)
208 {
209   iface->get_individuals = empathy_roster_model_manager_get_individuals;
210 }