gthumb r2244 - in trunk: . libgthumb src



Author: mjc
Date: Sat Feb  2 20:33:17 2008
New Revision: 2244
URL: http://svn.gnome.org/viewvc/gthumb?rev=2244&view=rev

Log:
2008-02-02  Michael J. Chudobiak  <mjc svn gnome org>

        * libgthumb/file-data.c: (fd_free_metadata), (file_data_new),
        (file_data_unref), (file_data_update), (file_data_update_info):
        * libgthumb/gth-exif-utils.c: (free_metadata_entry),
        (free_metadata), (simple_add_metadata),
        (update_and_save_metadatum), (update_and_save_metadata),
        (write_orientation_field):
        * libgthumb/gth-exif-utils.h:
        * libgthumb/gth-exiv2-utils.cpp:
        * libgthumb/gth-exiv2-utils.hpp:
        * src/catalog-web-exporter.c:
        (copy_exif_from_orig_and_reset_orientation):
        * src/dlg-change-date.c: (ok_clicked):
        Changed code to permit the updating of more than one metadata tags
        at a time (i.e., one file write operation).

        * libgthumb/gth-gstreamer-utils.c: (tag_iterate):
        Fixed compiler warning.



Modified:
   trunk/ChangeLog
   trunk/libgthumb/file-data.c
   trunk/libgthumb/gth-exif-utils.c
   trunk/libgthumb/gth-exif-utils.h
   trunk/libgthumb/gth-exiv2-utils.cpp
   trunk/libgthumb/gth-exiv2-utils.hpp
   trunk/libgthumb/gth-gstreamer-utils.c
   trunk/src/catalog-web-exporter.c
   trunk/src/dlg-change-date.c

Modified: trunk/libgthumb/file-data.c
==============================================================================
--- trunk/libgthumb/file-data.c	(original)
+++ trunk/libgthumb/file-data.c	Sat Feb  2 20:33:17 2008
@@ -37,28 +37,12 @@
 
 
 static void
-free_metadata_entry (GthMetadata *entry)
+fd_free_metadata (FileData *fd)
 {
-        if (entry != NULL) {
-                g_free (entry->full_name);
-                g_free (entry->display_name);
-                g_free (entry->formatted_value);
-		g_free (entry->raw_value);
-                g_free (entry);
-        }
-}
-
-static void
-free_metadata (FileData *fd)
-{
-        if (fd->metadata != NULL) {
-                g_list_foreach (fd->metadata, (GFunc) free_metadata_entry, NULL);
-                g_list_free (fd->metadata);
-                fd->metadata = NULL;
-        }
-
+	free_metadata (fd->metadata);
+	fd->metadata = NULL;
         fd->exif_data_loaded = FALSE;
-        fd->exif_time = (time_t) 0;
+	fd->exif_time = (time_t) 0;
 }
 
 
@@ -106,7 +90,7 @@
 	   DateTime sorts. The tag in memory is refreshed if the file mtime has
 	   changed, so it is recorded as well. */
 
-	free_metadata (fd);
+	fd_free_metadata (fd);
 
 	fd->error = FALSE;
 	fd->thumb_loaded = FALSE;
@@ -185,7 +169,7 @@
 		if (fd->comment_data != NULL)
 			comment_data_free (fd->comment_data);
 		g_free (fd->comment);
-		free_metadata (fd);
+		fd_free_metadata (fd);
 		g_free (fd);
 	}
 }
@@ -232,7 +216,7 @@
 	fd->mtime = info->mtime;
 	fd->ctime = info->ctime;
 
-	free_metadata (fd);
+	fd_free_metadata (fd);
 
 	gnome_vfs_file_info_unref (info);
 }
@@ -279,7 +263,7 @@
 	fd->mtime = info->mtime;
 	fd->ctime = info->ctime;
 
-        free_metadata (fd);
+        fd_free_metadata (fd);
 
 	gnome_vfs_file_info_unref (info);
 }

Modified: trunk/libgthumb/gth-exif-utils.c
==============================================================================
--- trunk/libgthumb/gth-exif-utils.c	(original)
+++ trunk/libgthumb/gth-exif-utils.c	Sat Feb  2 20:33:17 2008
@@ -124,7 +124,30 @@
 
 GList * read_exiv2_file (const char *uri, GList *metadata);
 GList * read_exiv2_sidecar (const char *uri, GList *metadata);
-void    write_metadata (const char *from_file, const char *to_file, const char *key, const char *value);
+void    write_metadata (const char *from_file, const char *to_file, GList *metadata);
+
+
+static void
+free_metadata_entry (GthMetadata *entry)
+{
+        if (entry != NULL) {
+                g_free (entry->full_name);
+                g_free (entry->display_name);
+                g_free (entry->formatted_value);
+                g_free (entry->raw_value);
+                g_free (entry);
+        }
+}
+
+
+void
+free_metadata (GList *metadata)
+{
+        if (metadata != NULL) {
+                g_list_foreach (metadata, (GFunc) free_metadata_entry, NULL);
+                g_list_free (metadata);
+        }
+}
 
 
 time_t
@@ -251,7 +274,7 @@
 
 	update_metadata (fd);
 
-	for (i = 0; (tagnames[i] != NULL) && (string == NULL); i++) {
+	for (i = 0; (tagnames[i] != NULL) && (string == NULL); i++) {		
 		GList *search_result = g_list_find_custom (fd->metadata, tagnames[i], (GCompareFunc) metadata_search);
 		if (search_result != NULL) {
 			GthMetadata *md_entry = search_result->data;
@@ -264,11 +287,53 @@
 }
 
 
+GList *
+simple_add_metadata (GList       *metadata,
+                     const gchar *key,
+                     const gchar *value)
+{
+	/* This function is only used when we want to pack several
+	   metadata items into a single structure, to supply to
+	   update_and_save_metadata. */
+
+        GthMetadata *new_entry;
+
+        if (value != NULL) {
+                new_entry = g_new (GthMetadata, 1);
+                new_entry->category = GTH_METADATA_CATEGORY_OTHER;
+                new_entry->full_name = g_strdup (key);
+                new_entry->display_name = g_strdup (key);
+                new_entry->formatted_value = g_strdup (value);
+                new_entry->raw_value = g_strdup (value);
+                new_entry->position = 0;
+                new_entry->writeable = TRUE;
+                metadata = g_list_prepend (metadata, new_entry);
+        }
+
+        return metadata;
+}
+
+
+void 
+update_and_save_metadatum (const char *uri_src,
+                           const char *uri_dest,
+                           char       *tag_name,
+                           char       *tag_value)
+{
+	/* This is a convenience function, to simplify the API */
+	GList *metadata = NULL;
+	
+	metadata = simple_add_metadata (metadata, tag_name, tag_value);
+	update_and_save_metadata (uri_src, uri_dest, metadata);
+
+	free_metadata (metadata);
+}
+
+
 void 
 update_and_save_metadata (const char *uri_src,
 			  const char *uri_dest,
-			  const char *tag_name,
-			  const char *tag_value)
+			  GList      *metadata)
 {
 	char             *from_local_file;
 	char             *to_local_file;
@@ -299,7 +364,7 @@
 		       		 to_info,
 				 GNOME_VFS_FILE_INFO_GET_ACCESS_RIGHTS|GNOME_VFS_FILE_INFO_FOLLOW_LINKS);
 
-	write_metadata (from_local_file, to_local_file, tag_name, tag_value);
+	write_metadata (from_local_file, to_local_file, metadata);
 
 	if (!to_is_local) {
 		remote_copy_ok = copy_cache_file_to_remote_uri (to_local_file, uri_dest);
@@ -331,7 +396,7 @@
 		tf = 1;
 	string_tf = g_strdup_printf ("%d", tf);
 
-	update_and_save_metadata (local_file, local_file, "Exif.Image.Orientation", string_tf);
+	update_and_save_metadatum (local_file, local_file, "Exif.Image.Orientation", string_tf);
 
 	g_free (string_tf);
 }

Modified: trunk/libgthumb/gth-exif-utils.h
==============================================================================
--- trunk/libgthumb/gth-exif-utils.h	(original)
+++ trunk/libgthumb/gth-exif-utils.h	Sat Feb  2 20:33:17 2008
@@ -75,6 +75,7 @@
 };
 
 
+void	      free_metadata               (GList        *metadata);
 GthTransform  get_orientation_from_fd     (FileData     *fd);
 time_t        get_exif_time               (FileData     *fd);
 time_t        get_exif_time_or_mtime      (FileData     *fd);
@@ -84,10 +85,16 @@
 					   GList        *md);
 char *	      get_metadata_string_from_fd (FileData	*fd,
 					   const char   *tagnames[]);
+GList *       simple_add_metadata         (GList        *metadata,
+			                   const gchar  *key,
+					   const gchar  *value);
+void          update_and_save_metadatum   (const char   *uri_src,
+                                           const char   *uri_dest,
+                                           char         *tag_name,
+                                           char         *tag_value);
 void          update_and_save_metadata    (const char   *uri_src,
                                            const char   *uri_dest,
-                                           const char   *tag_name,
-                                           const char   *tag_value);
+                                           GList        *metdata);
 void	      write_orientation_field     (const char   *filename, 
 				  	   GthTransform  transform);
 GList *       gth_read_exiv2		  (const char   *filename,

Modified: trunk/libgthumb/gth-exiv2-utils.cpp
==============================================================================
--- trunk/libgthumb/gth-exiv2-utils.cpp	(original)
+++ trunk/libgthumb/gth-exiv2-utils.cpp	Sat Feb  2 20:33:17 2008
@@ -36,6 +36,9 @@
 #include <exiv2/xmp.hpp>
 #endif
 
+#include <glib.h>
+
+
 using namespace std;
 
 #define MAX_TAGS_PER_CATEGORY 50
@@ -530,11 +533,12 @@
 extern "C"
 void
 write_metadata (const char *from_file,
-                const char *to_file,
-                const char *key,
-                const char *value)
+		const char *to_file,
+		GList      *metadata_in)
 {
 	try {
+		GList *scan;
+
 		//Open first image
 		Exiv2::Image::AutoPtr image1 = Exiv2::ImageFactory::open (from_file);
 		g_assert (image1.get() != 0);
@@ -542,27 +546,27 @@
 		// Load existing metadata
 		image1->readMetadata();
 
-		// TODO: accept a GthMetadata structure instead of a single
-		//       key/value pair.
-
-		// Update the requested tag
-		if (key != NULL) {
-			if (g_str_has_prefix (key, "Exif")) {
-				Exiv2::ExifData &md = image1->exifData();
-				md[key] = value;
+		for (scan = metadata_in; scan; scan = scan->next) {
+			// Update the requested tag
+			GthMetadata *metadatum = (GthMetadata *) scan->data;
+			if (metadatum->full_name != NULL) {
+				if (g_str_has_prefix (metadatum->full_name, "Exif")) {
+					Exiv2::ExifData &md = image1->exifData();
+					md[metadatum->full_name] = metadatum->raw_value;
 				
-				// TODO: update PixelX/YDimension tags
-		
-				// TODO: add any missing mandatory tags
+					// TODO: update PixelX/YDimension tags
+			
+					// TODO: add any missing mandatory tags
+				}
+				else if (g_str_has_prefix (metadatum->full_name, "Iptc")) {
+		        	        Exiv2::IptcData &md = image1->iptcData();
+					md[metadatum->full_name] = metadatum->raw_value;
+		        	}
+					else if (g_str_has_prefix (metadatum->full_name, "Xmp")) {
+	        		        Exiv2::XmpData &md = image1->xmpData();
+					md[metadatum->full_name] = metadatum->raw_value;
+		        	}
 			}
-			else if (g_str_has_prefix (key, "Iptc")) {
-	        	        Exiv2::IptcData &md = image1->iptcData();
-				md[key] = value;
-		        }
-			else if (g_str_has_prefix (key, "Xmp")) {
-	        	        Exiv2::XmpData &md = image1->xmpData();
-				md[key] = value;
-	        	}
 		}
 
 		// Delete thumbnail and IFD1 tags, because the main image may

Modified: trunk/libgthumb/gth-exiv2-utils.hpp
==============================================================================
--- trunk/libgthumb/gth-exiv2-utils.hpp	(original)
+++ trunk/libgthumb/gth-exiv2-utils.hpp	Sat Feb  2 20:33:17 2008
@@ -35,8 +35,7 @@
 
 extern "C" void
 write_metadata 		(const char  *from_file,
-                         const char  *to_file,
-	                 const char  *key,
-         	         const char  *value);
+			 const char  *to_file,
+			 GList       *metadata);
 #endif
 

Modified: trunk/libgthumb/gth-gstreamer-utils.c
==============================================================================
--- trunk/libgthumb/gth-gstreamer-utils.c	(original)
+++ trunk/libgthumb/gth-gstreamer-utils.c	Sat Feb  2 20:33:17 2008
@@ -463,7 +463,7 @@
         if (tag_type == G_TYPE_ULONG) {
                 gulong ret = 0;
                 if (gst_tag_list_get_ulong (list, tag, &ret))
-                        *metadata = add_metadata (*metadata, tag_name, g_strdup_printf ("%u", ret));
+                        *metadata = add_metadata (*metadata, tag_name, g_strdup_printf ("%lu", ret));
                 else
                         g_free (tag_name);
         }
@@ -473,7 +473,7 @@
         if (tag_type == G_TYPE_LONG) {
                 glong ret = 0;
                 if (gst_tag_list_get_long (list, tag, &ret))
-                        *metadata = add_metadata (*metadata, tag_name, g_strdup_printf ("%d", ret));
+                        *metadata = add_metadata (*metadata, tag_name, g_strdup_printf ("%ld", ret));
                 else
                         g_free (tag_name);
         }

Modified: trunk/src/catalog-web-exporter.c
==============================================================================
--- trunk/src/catalog-web-exporter.c	(original)
+++ trunk/src/catalog-web-exporter.c	Sat Feb  2 20:33:17 2008
@@ -2090,7 +2090,7 @@
 copy_exif_from_orig_and_reset_orientation (FileData   *file,
 		     			   const char *dest_uri)
 {
-	update_and_save_metadata (file->path, dest_uri, "Exif.Image.Orientation", "1");
+	update_and_save_metadatum (file->path, dest_uri, "Exif.Image.Orientation", "1");
 }
 
 

Modified: trunk/src/dlg-change-date.c
==============================================================================
--- trunk/src/dlg-change-date.c	(original)
+++ trunk/src/dlg-change-date.c	Sat Feb  2 20:33:17 2008
@@ -165,6 +165,7 @@
 		    is_active (data->cd_exif_dig_checkbutton)) {
 			char      *buf;
 			struct tm  tm;
+			GList	  *add_metadata = NULL;
 
 			localtime_r (&mtime, &tm);
 			buf = g_strdup_printf ("%04d:%02d:%02d %02d:%02d:%02d ", 
@@ -176,14 +177,17 @@
 			       		       tm.tm_sec );
 
 			if (is_active (data->cd_exif_checkbutton))
-				update_and_save_metadata (fdata->path, fdata->path, "Exif.Image.DateTime", buf);
+				add_metadata = simple_add_metadata (add_metadata, "Exif.Image.DateTime", buf);
 
 			if (is_active (data->cd_exif_orig_checkbutton))
-				update_and_save_metadata (fdata->path, fdata->path, "Exif.Photo.DateTimeOriginal", buf);
+				add_metadata = simple_add_metadata (add_metadata, "Exif.Photo.DateTimeOriginal", buf);
 
 			if (is_active (data->cd_exif_dig_checkbutton))
-                                update_and_save_metadata (fdata->path, fdata->path, "Exif.Photo.DateTimeDigitized", buf);
+				add_metadata = simple_add_metadata (add_metadata, "Exif.Photo.DateTimeDigitized", buf);
 
+                        update_and_save_metadata (fdata->path, fdata->path, add_metadata);
+
+			free_metadata (add_metadata);
 			g_free (buf);
 		}
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]