~ubuntu-branches/ubuntu/trusty/gnome-photos/trusty

« back to all changes in this revision

Viewing changes to src/photos-item-manager.c

  • Committer: Package Import Robot
  • Author(s): Jackson Doak
  • Date: 2014-02-12 06:40:47 UTC
  • Revision ID: package-import@ubuntu.com-20140212064047-33l9kizb5e74s7db
Tags: upstream-3.10.2
ImportĀ upstreamĀ versionĀ 3.10.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Photos - access, organize and share your photos on GNOME
 
3
 * Copyright Ā© 2012, 2013 Red Hat, Inc.
 
4
 *
 
5
 * This program is free software; you can redistribute it and/or
 
6
 * modify it under the terms of the GNU General Public License
 
7
 * as published by the Free Software Foundation; either version 2
 
8
 * of the License, or (at your option) any later version.
 
9
 *
 
10
 * This program 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
 
13
 * GNU General Public License for more details.
 
14
 *
 
15
 * You should have received a copy of the GNU General Public License
 
16
 * along with this program; if not, write to the Free Software
 
17
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 
18
 * 02110-1301, USA.
 
19
 */
 
20
 
 
21
/* Based on code from:
 
22
 *   + Documents
 
23
 */
 
24
 
 
25
 
 
26
#include "config.h"
 
27
 
 
28
#include <glib.h>
 
29
 
 
30
#include "photos-collection-manager.h"
 
31
#include "photos-item-manager.h"
 
32
#include "photos-local-item.h"
 
33
#include "photos-flickr-item.h"
 
34
#include "photos-query.h"
 
35
#include "photos-single-item-job.h"
 
36
#include "photos-tracker-change-event.h"
 
37
#include "photos-tracker-change-monitor.h"
 
38
 
 
39
 
 
40
struct _PhotosItemManagerPrivate
 
41
{
 
42
  GQueue *collection_path;
 
43
  PhotosBaseManager *col_mngr;
 
44
  PhotosTrackerChangeMonitor *monitor;
 
45
};
 
46
 
 
47
 
 
48
G_DEFINE_TYPE_WITH_PRIVATE (PhotosItemManager, photos_item_manager, PHOTOS_TYPE_BASE_MANAGER);
 
49
 
 
50
 
 
51
static void
 
52
photos_item_manager_item_created_executed (TrackerSparqlCursor *cursor, gpointer user_data)
 
53
{
 
54
  PhotosItemManager *self = PHOTOS_ITEM_MANAGER (user_data);
 
55
 
 
56
  if (cursor == NULL)
 
57
    goto out;
 
58
 
 
59
  photos_item_manager_add_item (self, cursor);
 
60
 
 
61
 out:
 
62
  g_object_unref (self);
 
63
}
 
64
 
 
65
 
 
66
static void
 
67
photos_item_manager_item_created (PhotosItemManager *self, const gchar *urn)
 
68
{
 
69
  PhotosSingleItemJob *job;
 
70
 
 
71
  job = photos_single_item_job_new (urn);
 
72
  photos_single_item_job_run (job,
 
73
                              PHOTOS_QUERY_FLAGS_NONE,
 
74
                              photos_item_manager_item_created_executed,
 
75
                              g_object_ref (self));
 
76
  g_object_unref (job);
 
77
}
 
78
 
 
79
 
 
80
static void
 
81
photos_item_manager_changes_pending_foreach (gpointer key, gpointer value, gpointer user_data)
 
82
{
 
83
  PhotosItemManager *self = PHOTOS_ITEM_MANAGER (user_data);
 
84
  PhotosItemManagerPrivate *priv = self->priv;
 
85
  PhotosTrackerChangeEvent *change_event = (PhotosTrackerChangeEvent *) value;
 
86
  PhotosTrackerChangeEventType change_type;
 
87
  const gchar *change_urn;
 
88
 
 
89
  change_type = photos_tracker_change_event_get_type (change_event);
 
90
  change_urn = photos_tracker_change_event_get_urn (change_event);
 
91
 
 
92
  if (change_type == PHOTOS_TRACKER_CHANGE_EVENT_CHANGED)
 
93
    {
 
94
      GObject *object;
 
95
 
 
96
      object = photos_base_manager_get_object_by_id (PHOTOS_BASE_MANAGER (self), change_urn);
 
97
      if (object != NULL)
 
98
        photos_base_item_refresh (PHOTOS_BASE_ITEM (object));
 
99
    }
 
100
  else if (change_type == PHOTOS_TRACKER_CHANGE_EVENT_CREATED)
 
101
    {
 
102
      photos_item_manager_item_created (self, change_urn);
 
103
    }
 
104
  else if (change_type == PHOTOS_TRACKER_CHANGE_EVENT_DELETED)
 
105
    {
 
106
      GObject *object;
 
107
 
 
108
      object = photos_base_manager_get_object_by_id (PHOTOS_BASE_MANAGER (self), change_urn);
 
109
      if (object != NULL)
 
110
        {
 
111
          photos_base_item_destroy (PHOTOS_BASE_ITEM (object));
 
112
          photos_base_manager_remove_object_by_id (PHOTOS_BASE_MANAGER (self), change_urn);
 
113
          if (photos_base_item_is_collection (PHOTOS_BASE_ITEM (object)))
 
114
            photos_base_manager_remove_object_by_id (priv->col_mngr, change_urn);
 
115
        }
 
116
    }
 
117
}
 
118
 
 
119
 
 
120
static void
 
121
photos_item_manager_changes_pending (PhotosTrackerChangeMonitor *monitor, GHashTable *changes, gpointer user_data)
 
122
{
 
123
  PhotosItemManager *self = PHOTOS_ITEM_MANAGER (user_data);
 
124
  g_hash_table_foreach (changes, photos_item_manager_changes_pending_foreach, self);
 
125
}
 
126
 
 
127
 
 
128
static gboolean
 
129
photos_item_manager_set_active_object (PhotosBaseManager *manager, GObject *object)
 
130
{
 
131
  PhotosItemManager *self = PHOTOS_ITEM_MANAGER (manager);
 
132
  PhotosItemManagerPrivate *priv = self->priv;
 
133
  GtkRecentManager *recent;
 
134
  gboolean ret_val;
 
135
  const gchar *uri;
 
136
 
 
137
  g_return_val_if_fail (PHOTOS_IS_BASE_ITEM (object) || object == NULL, FALSE);
 
138
 
 
139
  ret_val = PHOTOS_BASE_MANAGER_CLASS (photos_item_manager_parent_class)->set_active_object (manager, object);
 
140
 
 
141
  if (!ret_val)
 
142
    goto out;
 
143
 
 
144
  if (object == NULL)
 
145
    goto out;
 
146
 
 
147
  if (photos_base_item_is_collection (PHOTOS_BASE_ITEM (object)))
 
148
    {
 
149
      GObject *collection;
 
150
 
 
151
      collection = photos_base_manager_get_active_object (priv->col_mngr);
 
152
      g_queue_push_head (priv->collection_path, (collection != NULL) ? g_object_ref (collection) : NULL);
 
153
      photos_base_manager_set_active_object (priv->col_mngr, object);
 
154
      goto out;
 
155
    }
 
156
 
 
157
  recent = gtk_recent_manager_get_default ();
 
158
  uri = photos_base_item_get_uri (PHOTOS_BASE_ITEM (object));
 
159
  gtk_recent_manager_add_item (recent, uri);
 
160
 
 
161
 out:
 
162
  return ret_val;
 
163
}
 
164
 
 
165
 
 
166
static GObject *
 
167
photos_item_manager_constructor (GType                  type,
 
168
                                 guint                  n_construct_params,
 
169
                                 GObjectConstructParam *construct_params)
 
170
{
 
171
  static GObject *self = NULL;
 
172
 
 
173
  if (self == NULL)
 
174
    {
 
175
      self = G_OBJECT_CLASS (photos_item_manager_parent_class)->constructor (type,
 
176
                                                                             n_construct_params,
 
177
                                                                             construct_params);
 
178
      g_object_add_weak_pointer (self, (gpointer) &self);
 
179
      return self;
 
180
    }
 
181
 
 
182
  return g_object_ref (self);
 
183
}
 
184
 
 
185
 
 
186
static void
 
187
photos_item_manager_dispose (GObject *object)
 
188
{
 
189
  PhotosItemManager *self = PHOTOS_ITEM_MANAGER (object);
 
190
  PhotosItemManagerPrivate *priv = self->priv;
 
191
 
 
192
  g_queue_free_full (priv->collection_path, g_object_unref);
 
193
  priv->collection_path = NULL;
 
194
 
 
195
  g_clear_object (&priv->col_mngr);
 
196
  g_clear_object (&priv->monitor);
 
197
 
 
198
  G_OBJECT_CLASS (photos_item_manager_parent_class)->dispose (object);
 
199
}
 
200
 
 
201
 
 
202
static void
 
203
photos_item_manager_init (PhotosItemManager *self)
 
204
{
 
205
  PhotosItemManagerPrivate *priv = self->priv;
 
206
 
 
207
  self->priv = photos_item_manager_get_instance_private (self);
 
208
  priv = self->priv;
 
209
 
 
210
  priv->collection_path = g_queue_new ();
 
211
  priv->col_mngr = photos_collection_manager_dup_singleton ();
 
212
 
 
213
  priv->monitor = photos_tracker_change_monitor_dup_singleton ();
 
214
  g_signal_connect (priv->monitor, "changes-pending", G_CALLBACK (photos_item_manager_changes_pending), self);
 
215
}
 
216
 
 
217
 
 
218
static void
 
219
photos_item_manager_class_init (PhotosItemManagerClass *class)
 
220
{
 
221
  GObjectClass *object_class = G_OBJECT_CLASS (class);
 
222
  PhotosBaseManagerClass *base_manager_class = PHOTOS_BASE_MANAGER_CLASS (class);
 
223
 
 
224
  object_class->constructor = photos_item_manager_constructor;
 
225
  object_class->dispose = photos_item_manager_dispose;
 
226
  base_manager_class->set_active_object = photos_item_manager_set_active_object;
 
227
}
 
228
 
 
229
 
 
230
PhotosBaseManager *
 
231
photos_item_manager_dup_singleton (void)
 
232
{
 
233
  return g_object_new (PHOTOS_TYPE_ITEM_MANAGER, NULL);
 
234
}
 
235
 
 
236
 
 
237
void
 
238
photos_item_manager_activate_previous_collection (PhotosItemManager *self)
 
239
{
 
240
  PhotosItemManagerPrivate *priv = self->priv;
 
241
  GObject *collection;
 
242
 
 
243
  collection = G_OBJECT (g_queue_pop_head (priv->collection_path));
 
244
  photos_base_manager_set_active_object (priv->col_mngr, collection);
 
245
  g_object_unref (collection);
 
246
}
 
247
 
 
248
 
 
249
PhotosBaseItem *
 
250
photos_item_manager_add_item (PhotosItemManager *self, TrackerSparqlCursor *cursor)
 
251
{
 
252
  PhotosBaseItem *item;
 
253
 
 
254
  item = photos_item_manager_create_item (self, cursor);
 
255
  photos_base_manager_add_object (PHOTOS_BASE_MANAGER (self), G_OBJECT (item));
 
256
 
 
257
  if (photos_base_item_is_collection (item))
 
258
    photos_base_manager_add_object (self->priv->col_mngr, G_OBJECT (item));
 
259
 
 
260
  return item;
 
261
}
 
262
 
 
263
 
 
264
PhotosBaseItem *
 
265
photos_item_manager_create_item (PhotosItemManager *self, TrackerSparqlCursor *cursor)
 
266
{
 
267
  PhotosBaseItem *ret_val = NULL;
 
268
  gchar *identifier = NULL;
 
269
 
 
270
  identifier = g_strdup (tracker_sparql_cursor_get_string (cursor, PHOTOS_QUERY_COLUMNS_IDENTIFIER, NULL));
 
271
 
 
272
  if (identifier != NULL)
 
273
    {
 
274
      if (g_str_has_prefix (identifier, "flickr:") || g_str_has_prefix (identifier, "photos:collection:flickr:"))
 
275
        ret_val = photos_flickr_item_new (cursor);
 
276
    }
 
277
 
 
278
  if (ret_val == NULL)
 
279
    ret_val = photos_local_item_new (cursor);
 
280
 
 
281
  g_free (identifier);
 
282
  return ret_val;
 
283
}