2
* salut-olpc-activity-manager.c - Source for SalutOlpcActivityManager
3
* Copyright (C) 2008 Collabora Ltd.
5
* This library is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU Lesser General Public
7
* License as published by the Free Software Foundation; either
8
* version 2.1 of the License, or (at your option) any later version.
10
* This library is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
* Lesser General Public License for more details.
15
* You should have received a copy of the GNU Lesser General Public
16
* License along with this library; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
#include <dbus/dbus-glib.h>
25
#include "salut-olpc-activity-manager.h"
27
#include "salut-connection.h"
28
#include "signals-marshal.h"
30
#define DEBUG_FLAG DEBUG_OLPC_ACTIVITY
33
G_DEFINE_TYPE (SalutOlpcActivityManager, salut_olpc_activity_manager,
49
static guint signals[LAST_SIGNAL] = {0};
51
/* private structure */
52
typedef struct _SalutOlpcActivityManagerPrivate SalutOlpcActivityManagerPrivate;
54
struct _SalutOlpcActivityManagerPrivate
56
/* TpHandle (owned by the activity) => SalutOlpcActivity */
57
GHashTable *activities_by_room;
59
gboolean dispose_has_run;
62
#define SALUT_OLPC_ACTIVITY_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SALUT_TYPE_OLPC_ACTIVITY_MANAGER, SalutOlpcActivityManagerPrivate))
65
salut_olpc_activity_manager_init (SalutOlpcActivityManager *self)
67
SalutOlpcActivityManagerPrivate *priv =
68
SALUT_OLPC_ACTIVITY_MANAGER_GET_PRIVATE (self);
69
/* We just keep a weak reference on the activity object so we'll remove
70
* it from the hash when no one is using anymore */
71
priv->activities_by_room = g_hash_table_new_full (g_direct_hash,
72
g_direct_equal, NULL, NULL);
76
salut_olpc_activity_manager_get_property (GObject *object,
81
SalutOlpcActivityManager *self = SALUT_OLPC_ACTIVITY_MANAGER (object);
86
g_value_set_object (value, self->connection);
89
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
95
salut_olpc_activity_manager_set_property (GObject *object,
100
SalutOlpcActivityManager *self = SALUT_OLPC_ACTIVITY_MANAGER (object);
104
case PROP_CONNECTION:
105
self->connection = g_value_get_object (value);
108
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
113
static void salut_olpc_activity_manager_dispose (GObject *object);
114
static void salut_olpc_activity_manager_finalize (GObject *object);
117
salut_olpc_activity_manager_class_init (SalutOlpcActivityManagerClass *salut_olpc_activity_manager_class)
119
GObjectClass *object_class = G_OBJECT_CLASS (salut_olpc_activity_manager_class);
120
GParamSpec *param_spec;
122
g_type_class_add_private (salut_olpc_activity_manager_class,
123
sizeof (SalutOlpcActivityManagerPrivate));
125
object_class->get_property = salut_olpc_activity_manager_get_property;
126
object_class->set_property = salut_olpc_activity_manager_set_property;
128
object_class->dispose = salut_olpc_activity_manager_dispose;
129
object_class->finalize = salut_olpc_activity_manager_finalize;
131
param_spec = g_param_spec_object (
133
"SalutConnection object",
134
"The Salut Connection associated with this muc manager",
135
SALUT_TYPE_CONNECTION,
136
G_PARAM_CONSTRUCT_ONLY |
138
G_PARAM_STATIC_NAME |
139
G_PARAM_STATIC_NICK |
140
G_PARAM_STATIC_BLURB);
141
g_object_class_install_property (object_class, PROP_CONNECTION,
144
signals[ACTIVITY_MODIFIED] = g_signal_new ("activity-modified",
145
G_OBJECT_CLASS_TYPE (salut_olpc_activity_manager_class),
146
G_SIGNAL_RUN_LAST, 0, NULL, NULL,
147
salut_signals_marshal_VOID__OBJECT,
148
G_TYPE_NONE, 1, SALUT_TYPE_OLPC_ACTIVITY);
152
remove_activity_foreach (gpointer room,
156
return act == activity;
160
activity_finalized_cb (gpointer data,
163
SalutOlpcActivityManager *self = SALUT_OLPC_ACTIVITY_MANAGER (data);
164
SalutOlpcActivityManagerPrivate *priv =
165
SALUT_OLPC_ACTIVITY_MANAGER_GET_PRIVATE (self);
167
g_hash_table_foreach_remove (priv->activities_by_room,
168
remove_activity_foreach, activity);
172
dispose_activity_foreach (gpointer room,
176
SalutOlpcActivityManager *self = SALUT_OLPC_ACTIVITY_MANAGER (user_data);
178
g_object_weak_unref (G_OBJECT (activity), activity_finalized_cb, self);
179
g_signal_handlers_disconnect_matched (activity, G_SIGNAL_MATCH_DATA,
180
0, 0, NULL, NULL, self);
186
salut_olpc_activity_manager_dispose (GObject *object)
188
SalutOlpcActivityManager *self = SALUT_OLPC_ACTIVITY_MANAGER (object);
189
SalutOlpcActivityManagerPrivate *priv = SALUT_OLPC_ACTIVITY_MANAGER_GET_PRIVATE (self);
191
if (priv->dispose_has_run)
194
priv->dispose_has_run = TRUE;
196
if (priv->activities_by_room != NULL)
198
g_hash_table_foreach_remove (priv->activities_by_room,
199
dispose_activity_foreach, self);
200
g_hash_table_destroy (priv->activities_by_room);
201
priv->activities_by_room = NULL;
204
if (G_OBJECT_CLASS (salut_olpc_activity_manager_parent_class)->dispose)
205
G_OBJECT_CLASS (salut_olpc_activity_manager_parent_class)->dispose (object);
209
salut_olpc_activity_manager_finalize (GObject *object)
211
//SalutOlpcActivityManager *self = SALUT_OLPC_ACTIVITY_MANAGER (object);
213
G_OBJECT_CLASS (salut_olpc_activity_manager_parent_class)->finalize (object);
217
salut_olpc_activity_manager_start (SalutOlpcActivityManager *self,
220
return SALUT_OLPC_ACTIVITY_MANAGER_GET_CLASS (self)->start (self, error);
224
salut_olpc_activity_manager_get_activity_by_room (SalutOlpcActivityManager *self,
227
SalutOlpcActivityManagerPrivate *priv =
228
SALUT_OLPC_ACTIVITY_MANAGER_GET_PRIVATE (self);
229
return g_hash_table_lookup (priv->activities_by_room,
230
GUINT_TO_POINTER (room));
234
salut_olpc_activity_manager_ensure_activity_by_room (
235
SalutOlpcActivityManager *self,
238
SalutOlpcActivity *activity;
239
SalutOlpcActivityManagerPrivate *priv =
240
SALUT_OLPC_ACTIVITY_MANAGER_GET_PRIVATE (self);
242
activity = g_hash_table_lookup (priv->activities_by_room,
243
GUINT_TO_POINTER (room));
245
if (activity != NULL)
247
return g_object_ref (activity);
251
activity = salut_olpc_activity_manager_create_activity (self, room);
257
activity_modified_cb (SalutOlpcActivity *activity,
258
SalutOlpcActivityManager *self)
260
g_signal_emit (self, signals[ACTIVITY_MODIFIED], 0, activity);
264
salut_olpc_activity_manager_create_activity (SalutOlpcActivityManager *self,
267
SalutOlpcActivity *activity;
268
SalutOlpcActivityManagerPrivate *priv =
269
SALUT_OLPC_ACTIVITY_MANAGER_GET_PRIVATE (self);
271
g_assert (room != 0);
272
g_assert (g_hash_table_lookup (priv->activities_by_room, GUINT_TO_POINTER (
275
activity = SALUT_OLPC_ACTIVITY_MANAGER_GET_CLASS (self)->create_activity (
277
salut_olpc_activity_update (activity, room, NULL, NULL, NULL, NULL, NULL,
280
g_hash_table_insert (priv->activities_by_room, GUINT_TO_POINTER (room),
283
g_signal_connect (activity, "modified", G_CALLBACK (activity_modified_cb),
285
g_object_weak_ref (G_OBJECT (activity), activity_finalized_cb , self);
291
salut_olpc_activity_manager_got_invitation (SalutOlpcActivityManager *self,
293
SalutContact *inviter,
300
SalutOlpcActivity *activity;
302
activity = salut_olpc_activity_manager_ensure_activity_by_room (self, room);
304
salut_olpc_activity_update (activity, room, id, name, type, color, tags,
305
activity->is_private);
307
/* FIXME: we shouldn't add it if the local user is already in the activity
308
* as, for now, we don't manage private activity membership (it's PS job) */
310
/* add the inviter to the activity */
311
salut_contact_joined_activity (inviter, activity);
313
/* contact reffed the activity if it didn't hold a ref on it yet */
314
g_object_unref (activity);
320
salut_olpc_activity_manager_contact_joined (SalutOlpcActivityManager *self,
321
SalutContact *contact,
322
SalutOlpcActivity *activity)
324
salut_contact_joined_activity (contact, activity);
328
salut_olpc_activity_manager_contact_left (SalutOlpcActivityManager *mgr,
329
SalutContact *contact,
330
SalutOlpcActivity *activity)
332
salut_contact_left_activity (contact, activity);