[frogr] Provide an ID to every photo set (a temporary one for local only sets)
- From: Mario Sanchez Prada <msanchez src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [frogr] Provide an ID to every photo set (a temporary one for local only sets)
- Date: Sun, 11 Nov 2012 00:06:52 +0000 (UTC)
commit e32efc4c69ccbce721f7813e4a51820c4300cfe3
Author: Mario Sanchez Prada <msanchez2 gnome org>
Date: Thu Nov 8 13:25:05 2012 +0100
Provide an ID to every photo set (a temporary one for local only sets)
src/frogr-controller.c | 18 ++++----
src/frogr-photoset.c | 109 ++++++++++++++++++++++++++++++++++++++++++++---
src/frogr-photoset.h | 6 +++
3 files changed, 116 insertions(+), 17 deletions(-)
---
diff --git a/src/frogr-controller.c b/src/frogr-controller.c
index d5982e9..c5f851d 100644
--- a/src/frogr-controller.c
+++ b/src/frogr-controller.c
@@ -1000,22 +1000,20 @@ _add_picture_to_photosets_or_create (FrogrController *self, UploadOnePictureData
{
FrogrControllerPrivate *priv = NULL;
FrogrPhotoSet *set = NULL;
- const gchar *id = NULL;
if (g_slist_length (uop_data->photosets) == 0)
return FALSE;
- set = FROGR_PHOTOSET (uop_data->photosets->data);
- id = frogr_photoset_get_id (set);
-
priv = FROGR_CONTROLLER_GET_PRIVATE (self);
priv->adding_to_set = TRUE;
uop_data->after_upload_attempts[AFTER_UPLOAD_OP_ADDING_TO_SET] = 0;
- if (id != NULL)
- _add_picture_to_photoset (self, uop_data);
- else
+
+ set = FROGR_PHOTOSET (uop_data->photosets->data);
+ if (frogr_photoset_is_local_only (set))
_create_photoset_for_picture (self, uop_data);
+ else
+ _add_picture_to_photoset (self, uop_data);
return TRUE;
}
@@ -1429,9 +1427,9 @@ _fetch_photosets_cb (GObject *object, GAsyncResult *res, gpointer data)
for (item = data_sets_list; item; item = g_slist_next (item))
{
current_data_set = FSP_DATA_PHOTO_SET (item->data);
- current_set = frogr_photoset_new (current_data_set->title,
- current_data_set->description);
- frogr_photoset_set_id (current_set, current_data_set->id);
+ current_set = frogr_photoset_new_with_id (current_data_set->id,
+ current_data_set->title,
+ current_data_set->description);
frogr_photoset_set_primary_photo_id (current_set, current_data_set->primary_photo_id);
frogr_photoset_set_n_photos (current_set, current_data_set->n_photos);
diff --git a/src/frogr-photoset.c b/src/frogr-photoset.c
index 1ad51e2..b0cea8c 100644
--- a/src/frogr-photoset.c
+++ b/src/frogr-photoset.c
@@ -16,10 +16,17 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>
*
+ * Parts of this file based on code from GConf, licensed as GPL
+ * version 2 or later (Copyright (C) 1999, 2000 Red Hat Inc)
*/
#include "frogr-photoset.h"
+#include <sys/types.h>
+#include <unistd.h>
+
+#define TEMPORARY_ID_PREFIX "localset_"
+
#define FROGR_PHOTOSET_GET_PRIVATE(object) \
(G_TYPE_INSTANCE_GET_PRIVATE ((object), \
FROGR_TYPE_PHOTOSET, \
@@ -50,9 +57,67 @@ enum {
/* Prototypes */
+static gchar *_create_temporary_id_for_photoset (void);
+
/* Private API */
+/* The following function is based in gconf_unique_key(), licensed as
+ GPL version 2 or later (Copyright (C) 1999, 2000 Red Hat Inc) */
+static gchar *
+_create_temporary_id_for_photoset (void)
+{
+ /* This function is hardly cryptographically random but should be
+ "good enough" */
+ static guint serial = 0;
+ gchar* key;
+ guint t, ut, p, u;
+ guint32 r;
+ GTimeVal tv;
+
+ g_get_current_time(&tv);
+
+ t = tv.tv_sec;
+ ut = tv.tv_usec;
+
+ p = getpid();
+ u = getuid();
+
+ /* don't bother to seed; if it's based on the time or any other
+ changing info we can get, we may as well just use that changing
+ info. since we don't seed we'll at least get a different number
+ on every call to this function in the same executable. */
+ r = g_random_int();
+
+ /* The letters may increase uniqueness by preventing "melds"
+ i.e. 01t01k01 and 0101t0k1 are not the same */
+ key = g_strdup_printf("%s%ut%uut%uu%up%ur%uk%u",
+ TEMPORARY_ID_PREFIX,
+ /* Duplicate keys must be generated
+ by two different program instances */
+ serial,
+ /* Duplicate keys must be generated
+ in the same microsecond */
+ t,
+ ut,
+ /* Duplicate keys must be generated by
+ the same user */
+ u,
+ /* Duplicate keys must be generated by
+ two programs that got the same PID */
+ p,
+ /* Duplicate keys must be generated with the
+ same random seed and the same index into
+ the series of pseudorandom values */
+ r,
+ /* Duplicate keys must result from running
+ this function at the same stack location */
+ GPOINTER_TO_UINT(&key));
+ ++serial;
+
+ return key;
+}
+
static void
_frogr_photoset_set_property (GObject *object,
guint prop_id,
@@ -90,24 +155,24 @@ _frogr_photoset_get_property (GObject *object,
GValue *value,
GParamSpec *pspec)
{
- FrogrPhotoSetPrivate *priv = FROGR_PHOTOSET_GET_PRIVATE (object);
+ FrogrPhotoSet *self = FROGR_PHOTOSET (object);
switch (prop_id)
{
case PROP_TITLE:
- g_value_set_string (value, priv->title);
+ g_value_set_string (value, frogr_photoset_get_title (self));
break;
case PROP_DESCRIPTION:
- g_value_set_string (value, priv->description);
+ g_value_set_string (value, frogr_photoset_get_description (self));
break;
case PROP_ID:
- g_value_set_string (value, priv->id);
+ g_value_set_string (value, frogr_photoset_get_id (self));
break;
case PROP_PRIMARY_PHOTO_ID:
- g_value_set_string (value, priv->primary_photo_id);
+ g_value_set_string (value, frogr_photoset_get_primary_photo_id (self));
break;
case PROP_N_PHOTOS:
- g_value_set_int (value, priv->n_photos);
+ g_value_set_int (value, frogr_photoset_get_n_photos (self));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -205,16 +270,36 @@ FrogrPhotoSet *
frogr_photoset_new (const gchar *title,
const gchar *description)
{
+ FrogrPhotoSet *new_set;
+ gchar *id;
+
+ g_return_val_if_fail (title, NULL);
+ g_return_val_if_fail (description, NULL);
+
+ /* We always need to have an id (locally created photosets) */
+ id = _create_temporary_id_for_photoset ();
+ new_set = frogr_photoset_new_with_id (id, title, description);
+ g_free (id);
+
+ return new_set;
+}
+
+FrogrPhotoSet *
+frogr_photoset_new_with_id (const gchar *id,
+ const gchar *title,
+ const gchar *description)
+{
+ g_return_val_if_fail (id, NULL);
g_return_val_if_fail (title, NULL);
g_return_val_if_fail (description, NULL);
return FROGR_PHOTOSET (g_object_new(FROGR_TYPE_PHOTOSET,
+ "id", id,
"title", title,
"description", description,
NULL));
}
-
/* Data Managing functions */
const gchar *
@@ -337,3 +422,13 @@ frogr_photoset_set_n_photos (FrogrPhotoSet *self,
priv->n_photos = n;
}
+gboolean
+frogr_photoset_is_local_only (FrogrPhotoSet *self)
+{
+ FrogrPhotoSetPrivate *priv = NULL;
+
+ g_return_val_if_fail(FROGR_IS_PHOTOSET(self), FALSE);
+
+ priv = FROGR_PHOTOSET_GET_PRIVATE (self);
+ return g_str_has_prefix (priv->id, TEMPORARY_ID_PREFIX);
+}
diff --git a/src/frogr-photoset.h b/src/frogr-photoset.h
index be4f518..f67f96a 100644
--- a/src/frogr-photoset.h
+++ b/src/frogr-photoset.h
@@ -53,6 +53,9 @@ GType frogr_photoset_get_type(void) G_GNUC_CONST;
FrogrPhotoSet *frogr_photoset_new (const gchar *title,
const gchar *description);
+FrogrPhotoSet *frogr_photoset_new_with_id (const gchar *id,
+ const gchar *title,
+ const gchar *description);
/* Data managing methods */
const gchar *frogr_photoset_get_id (FrogrPhotoSet *self);
@@ -74,6 +77,9 @@ void frogr_photoset_set_primary_photo_id (FrogrPhotoSet *self,
gint frogr_photoset_get_n_photos (FrogrPhotoSet *self);
void frogr_photoset_set_n_photos (FrogrPhotoSet *self,
gint n);
+
+gboolean frogr_photoset_is_local_only (FrogrPhotoSet *self);
+
G_END_DECLS
#endif
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]