[frogr] Provide an ID to every photo set (a temporary one for local only sets)



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]