2
* Photos - access, organize and share your photos on GNOME
3
* Copyright Ā© 2012, 2013 Red Hat, Inc.
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.
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.
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
21
/* Based on code from:
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"
40
struct _PhotosItemManagerPrivate
42
GQueue *collection_path;
43
PhotosBaseManager *col_mngr;
44
PhotosTrackerChangeMonitor *monitor;
48
G_DEFINE_TYPE_WITH_PRIVATE (PhotosItemManager, photos_item_manager, PHOTOS_TYPE_BASE_MANAGER);
52
photos_item_manager_item_created_executed (TrackerSparqlCursor *cursor, gpointer user_data)
54
PhotosItemManager *self = PHOTOS_ITEM_MANAGER (user_data);
59
photos_item_manager_add_item (self, cursor);
62
g_object_unref (self);
67
photos_item_manager_item_created (PhotosItemManager *self, const gchar *urn)
69
PhotosSingleItemJob *job;
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,
81
photos_item_manager_changes_pending_foreach (gpointer key, gpointer value, gpointer user_data)
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;
89
change_type = photos_tracker_change_event_get_type (change_event);
90
change_urn = photos_tracker_change_event_get_urn (change_event);
92
if (change_type == PHOTOS_TRACKER_CHANGE_EVENT_CHANGED)
96
object = photos_base_manager_get_object_by_id (PHOTOS_BASE_MANAGER (self), change_urn);
98
photos_base_item_refresh (PHOTOS_BASE_ITEM (object));
100
else if (change_type == PHOTOS_TRACKER_CHANGE_EVENT_CREATED)
102
photos_item_manager_item_created (self, change_urn);
104
else if (change_type == PHOTOS_TRACKER_CHANGE_EVENT_DELETED)
108
object = photos_base_manager_get_object_by_id (PHOTOS_BASE_MANAGER (self), change_urn);
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);
121
photos_item_manager_changes_pending (PhotosTrackerChangeMonitor *monitor, GHashTable *changes, gpointer user_data)
123
PhotosItemManager *self = PHOTOS_ITEM_MANAGER (user_data);
124
g_hash_table_foreach (changes, photos_item_manager_changes_pending_foreach, self);
129
photos_item_manager_set_active_object (PhotosBaseManager *manager, GObject *object)
131
PhotosItemManager *self = PHOTOS_ITEM_MANAGER (manager);
132
PhotosItemManagerPrivate *priv = self->priv;
133
GtkRecentManager *recent;
137
g_return_val_if_fail (PHOTOS_IS_BASE_ITEM (object) || object == NULL, FALSE);
139
ret_val = PHOTOS_BASE_MANAGER_CLASS (photos_item_manager_parent_class)->set_active_object (manager, object);
147
if (photos_base_item_is_collection (PHOTOS_BASE_ITEM (object)))
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);
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);
167
photos_item_manager_constructor (GType type,
168
guint n_construct_params,
169
GObjectConstructParam *construct_params)
171
static GObject *self = NULL;
175
self = G_OBJECT_CLASS (photos_item_manager_parent_class)->constructor (type,
178
g_object_add_weak_pointer (self, (gpointer) &self);
182
return g_object_ref (self);
187
photos_item_manager_dispose (GObject *object)
189
PhotosItemManager *self = PHOTOS_ITEM_MANAGER (object);
190
PhotosItemManagerPrivate *priv = self->priv;
192
g_queue_free_full (priv->collection_path, g_object_unref);
193
priv->collection_path = NULL;
195
g_clear_object (&priv->col_mngr);
196
g_clear_object (&priv->monitor);
198
G_OBJECT_CLASS (photos_item_manager_parent_class)->dispose (object);
203
photos_item_manager_init (PhotosItemManager *self)
205
PhotosItemManagerPrivate *priv = self->priv;
207
self->priv = photos_item_manager_get_instance_private (self);
210
priv->collection_path = g_queue_new ();
211
priv->col_mngr = photos_collection_manager_dup_singleton ();
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);
219
photos_item_manager_class_init (PhotosItemManagerClass *class)
221
GObjectClass *object_class = G_OBJECT_CLASS (class);
222
PhotosBaseManagerClass *base_manager_class = PHOTOS_BASE_MANAGER_CLASS (class);
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;
231
photos_item_manager_dup_singleton (void)
233
return g_object_new (PHOTOS_TYPE_ITEM_MANAGER, NULL);
238
photos_item_manager_activate_previous_collection (PhotosItemManager *self)
240
PhotosItemManagerPrivate *priv = self->priv;
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);
250
photos_item_manager_add_item (PhotosItemManager *self, TrackerSparqlCursor *cursor)
252
PhotosBaseItem *item;
254
item = photos_item_manager_create_item (self, cursor);
255
photos_base_manager_add_object (PHOTOS_BASE_MANAGER (self), G_OBJECT (item));
257
if (photos_base_item_is_collection (item))
258
photos_base_manager_add_object (self->priv->col_mngr, G_OBJECT (item));
265
photos_item_manager_create_item (PhotosItemManager *self, TrackerSparqlCursor *cursor)
267
PhotosBaseItem *ret_val = NULL;
268
gchar *identifier = NULL;
270
identifier = g_strdup (tracker_sparql_cursor_get_string (cursor, PHOTOS_QUERY_COLUMNS_IDENTIFIER, NULL));
272
if (identifier != NULL)
274
if (g_str_has_prefix (identifier, "flickr:") || g_str_has_prefix (identifier, "photos:collection:flickr:"))
275
ret_val = photos_flickr_item_new (cursor);
279
ret_val = photos_local_item_new (cursor);