Blame gdata/services/picasaweb/gdata-picasaweb-file.c

Packit 4b6dd7
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
Packit 4b6dd7
/*
Packit 4b6dd7
 * GData Client
Packit 4b6dd7
 * Copyright (C) Richard Schwarting 2009 <aquarichy@gmail.com>
Packit 4b6dd7
 * Copyright (C) Philip Withnall 2009–2010 <philip@tecnocode.co.uk>
Packit 4b6dd7
 *
Packit 4b6dd7
 * GData Client is free software; you can redistribute it and/or
Packit 4b6dd7
 * modify it under the terms of the GNU Lesser General Public
Packit 4b6dd7
 * License as published by the Free Software Foundation; either
Packit 4b6dd7
 * version 2.1 of the License, or (at your option) any later version.
Packit 4b6dd7
 *
Packit 4b6dd7
 * GData Client is distributed in the hope that it will be useful,
Packit 4b6dd7
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 4b6dd7
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 4b6dd7
 * Lesser General Public License for more details.
Packit 4b6dd7
 *
Packit 4b6dd7
 * You should have received a copy of the GNU Lesser General Public
Packit 4b6dd7
 * License along with GData Client.  If not, see <http://www.gnu.org/licenses/>.
Packit 4b6dd7
 */
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * SECTION:gdata-picasaweb-file
Packit 4b6dd7
 * @short_description: GData PicasaWeb file object
Packit 4b6dd7
 * @stability: Stable
Packit 4b6dd7
 * @include: gdata/services/picasaweb/gdata-picasaweb-file.h
Packit 4b6dd7
 *
Packit 4b6dd7
 * #GDataPicasaWebFile is a subclass of #GDataEntry to represent a file (photo or video) in an album on Google PicasaWeb.
Packit 4b6dd7
 *
Packit 4b6dd7
 * #GDataPicasaWebFile implements #GDataCommentable, allowing comments on files to be queried using gdata_commentable_query_comments(), new
Packit 4b6dd7
 * comments to be added to files using gdata_commentable_insert_comment() and existing comments to be deleted from files using
Packit 4b6dd7
 * gdata_commentable_delete_comment().
Packit 4b6dd7
 *
Packit 4b6dd7
 * For more details of Google PicasaWeb's GData API, see the
Packit 4b6dd7
 * <ulink type="http" url="http://code.google.com/apis/picasaweb/developers_guide_protocol.html">online documentation</ulink>.
Packit 4b6dd7
 *
Packit 4b6dd7
 * <example>
Packit 4b6dd7
 *	<title>Getting Basic Photo Data</title>
Packit 4b6dd7
 *	<programlisting>
Packit 4b6dd7
 *	GDataFeed *photo_feed;
Packit 4b6dd7
 *	GList *photo_entries;
Packit 4b6dd7
 *
Packit 4b6dd7
 *	/* Query for a feed of GDataPicasaWebFiles belonging to the given GDataPicasaWebAlbum album */
Packit 4b6dd7
 *	photo_feed = gdata_picasaweb_service_query_files (service, album, NULL, NULL, NULL, NULL, NULL);
Packit 4b6dd7
 *
Packit 4b6dd7
 *	/* Get a list of GDataPicasaWebFiles from the query's feed */
Packit 4b6dd7
 *	for (photo_entries = gdata_feed_get_entries (photo_feed); photo_entries != NULL; photo_entries = photo_entries->next) {
Packit 4b6dd7
 *		GDataPicasaWebFile *photo;
Packit 4b6dd7
 *		guint height, width;
Packit 4b6dd7
 *		gsize file_size;
Packit 4b6dd7
 *		gint64 timestamp;
Packit 4b6dd7
 *		const gchar *title, *summary;
Packit 4b6dd7
 *		GList *contents;
Packit 4b6dd7
 *
Packit 4b6dd7
 *		photo = GDATA_PICASAWEB_FILE (photo_entries->data);
Packit 4b6dd7
 *
Packit 4b6dd7
 *		/* Get various bits of information about the photo */
Packit 4b6dd7
 *		height = gdata_picasaweb_file_get_height (photo);
Packit 4b6dd7
 *		width = gdata_picasaweb_file_get_width (photo);
Packit 4b6dd7
 *		file_size = gdata_picasaweb_file_get_size (photo);
Packit 4b6dd7
 *		timestamp = gdata_picasaweb_file_get_timestamp (photo);
Packit 4b6dd7
 *		title = gdata_entry_get_title (GDATA_ENTRY (photo));
Packit 4b6dd7
 *		summary = gdata_entry_get_summary (GDATA_ENTRY (photo));
Packit 4b6dd7
 *
Packit 4b6dd7
 *		/* Obtain the image data at various sizes */
Packit 4b6dd7
 *		for (contents = gdata_picasaweb_file_get_contents (photo); contents != NULL; contents = contents->next) {
Packit 4b6dd7
 *			GDataMediaContent *content;
Packit 4b6dd7
 *			GDataDownloadStream *download_stream;
Packit 4b6dd7
 *			GFileOutputStream *file_stream;
Packit 4b6dd7
 *			GFile *new_file;
Packit 4b6dd7
 *
Packit 4b6dd7
 *			content = GDATA_MEDIA_CONTENT (contents->data);
Packit 4b6dd7
 *			/* Do something fun with the actual images, like download them to a file.
Packit 4b6dd7
 *			 * Note that this is a blocking operation. */
Packit 4b6dd7
 *			download_stream = gdata_media_content_download (content, GDATA_SERVICE (service), NULL, NULL);
Packit 4b6dd7
 *			new_file = g_file_new_for_path (file_path);
Packit 4b6dd7
 *			file_stream = g_file_create (new_file, G_FILE_CREATE_NONE, NULL, NULL);
Packit 4b6dd7
 *			g_output_stream_splice (G_OUTPUT_STREAM (file_stream), G_INPUT_STREAM (download_stream),
Packit 4b6dd7
 *			                        G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE | G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET, NULL, NULL);
Packit 4b6dd7
 *			g_object_unref (file_stream);
Packit 4b6dd7
 *			g_object_unref (download_stream);
Packit 4b6dd7
 *			/* ... */
Packit 4b6dd7
 *			g_object_unref (new_file);
Packit 4b6dd7
 *		}
Packit 4b6dd7
 *
Packit 4b6dd7
 *		/* Do something worthwhile with your image data */
Packit 4b6dd7
 *	}
Packit 4b6dd7
 *
Packit 4b6dd7
 *	g_object_unref (photo_feed);
Packit 4b6dd7
 *	</programlisting>
Packit 4b6dd7
 * </example>
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
Packit 4b6dd7
#include <config.h>
Packit 4b6dd7
#include <glib.h>
Packit 4b6dd7
#include <glib/gi18n-lib.h>
Packit 4b6dd7
#include <libxml/parser.h>
Packit 4b6dd7
#include <string.h>
Packit 4b6dd7
Packit 4b6dd7
#include "gdata-picasaweb-file.h"
Packit 4b6dd7
#include "gdata-private.h"
Packit 4b6dd7
#include "gdata-service.h"
Packit 4b6dd7
#include "gdata-parser.h"
Packit 4b6dd7
#include "gdata-types.h"
Packit 4b6dd7
#include "media/gdata-media-group.h"
Packit 4b6dd7
#include "exif/gdata-exif-tags.h"
Packit 4b6dd7
#include "georss/gdata-georss-where.h"
Packit 4b6dd7
#include "gd/gdata-gd-feed-link.h"
Packit 4b6dd7
#include "gdata-commentable.h"
Packit 4b6dd7
#include "gdata-picasaweb-comment.h"
Packit 4b6dd7
#include "gdata-picasaweb-service.h"
Packit 4b6dd7
Packit 4b6dd7
static GObject *gdata_picasaweb_file_constructor (GType type, guint n_construct_params, GObjectConstructParam *construct_params);
Packit 4b6dd7
static void gdata_picasaweb_file_dispose (GObject *object);
Packit 4b6dd7
static void gdata_picasaweb_file_finalize (GObject *object);
Packit 4b6dd7
static void gdata_picasaweb_file_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec);
Packit 4b6dd7
static void gdata_picasaweb_file_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec);
Packit 4b6dd7
static void get_xml (GDataParsable *parsable, GString *xml_string);
Packit 4b6dd7
static gboolean parse_xml (GDataParsable *parsable, xmlDoc *doc, xmlNode *node, gpointer user_data, GError **error);
Packit 4b6dd7
static void get_namespaces (GDataParsable *parsable, GHashTable *namespaces);
Packit 4b6dd7
static gchar *get_entry_uri (const gchar *id) G_GNUC_WARN_UNUSED_RESULT;
Packit 4b6dd7
GDataAuthorizationDomain *get_authorization_domain (GDataCommentable *self) G_GNUC_CONST;
Packit 4b6dd7
static gchar *get_query_comments_uri (GDataCommentable *self) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
Packit 4b6dd7
static gchar *get_insert_comment_uri (GDataCommentable *self, GDataComment *comment_) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
Packit 4b6dd7
static gboolean is_comment_deletable (GDataCommentable *self, GDataComment *comment_);
Packit 4b6dd7
static void gdata_picasaweb_file_commentable_init (GDataCommentableInterface *iface);
Packit 4b6dd7
Packit 4b6dd7
struct _GDataPicasaWebFilePrivate {
Packit 4b6dd7
	gchar *file_id;
Packit 4b6dd7
	gint64 edited;
Packit 4b6dd7
	gchar *version;
Packit 4b6dd7
	gchar *album_id;
Packit 4b6dd7
	guint width;
Packit 4b6dd7
	guint height;
Packit 4b6dd7
	gsize size;
Packit 4b6dd7
	gchar *checksum;
Packit 4b6dd7
	gint64 timestamp; /* in milliseconds! */
Packit 4b6dd7
	gboolean is_commenting_enabled;
Packit 4b6dd7
	guint comment_count;
Packit 4b6dd7
	guint rotation;
Packit 4b6dd7
	gchar *video_status;
Packit 4b6dd7
Packit 4b6dd7
	/* media:group */
Packit 4b6dd7
	GDataMediaGroup *media_group;
Packit 4b6dd7
	/* exif:tags */
Packit 4b6dd7
	GDataExifTags *exif_tags;
Packit 4b6dd7
	/* georss:where */
Packit 4b6dd7
	GDataGeoRSSWhere *georss_where;
Packit 4b6dd7
};
Packit 4b6dd7
Packit 4b6dd7
enum {
Packit 4b6dd7
	PROP_EDITED = 1,
Packit 4b6dd7
	PROP_VERSION,
Packit 4b6dd7
	PROP_ALBUM_ID,
Packit 4b6dd7
	PROP_WIDTH,
Packit 4b6dd7
	PROP_HEIGHT,
Packit 4b6dd7
	PROP_SIZE,
Packit 4b6dd7
	PROP_CHECKSUM,
Packit 4b6dd7
	PROP_TIMESTAMP,
Packit 4b6dd7
	PROP_IS_COMMENTING_ENABLED,
Packit 4b6dd7
	PROP_COMMENT_COUNT,
Packit 4b6dd7
	PROP_ROTATION,
Packit 4b6dd7
	PROP_VIDEO_STATUS,
Packit 4b6dd7
	PROP_CREDIT,
Packit 4b6dd7
	PROP_CAPTION,
Packit 4b6dd7
	PROP_TAGS,
Packit 4b6dd7
	PROP_DISTANCE,
Packit 4b6dd7
	PROP_EXPOSURE,
Packit 4b6dd7
	PROP_FLASH,
Packit 4b6dd7
	PROP_FOCAL_LENGTH,
Packit 4b6dd7
	PROP_FSTOP,
Packit 4b6dd7
	PROP_IMAGE_UNIQUE_ID,
Packit 4b6dd7
	PROP_ISO,
Packit 4b6dd7
	PROP_MAKE,
Packit 4b6dd7
	PROP_MODEL,
Packit 4b6dd7
	PROP_LATITUDE,
Packit 4b6dd7
	PROP_LONGITUDE,
Packit 4b6dd7
	PROP_FILE_ID
Packit 4b6dd7
};
Packit 4b6dd7
Packit 4b6dd7
G_DEFINE_TYPE_WITH_CODE (GDataPicasaWebFile, gdata_picasaweb_file, GDATA_TYPE_ENTRY,
Packit 4b6dd7
                         G_IMPLEMENT_INTERFACE (GDATA_TYPE_COMMENTABLE, gdata_picasaweb_file_commentable_init))
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
gdata_picasaweb_file_class_init (GDataPicasaWebFileClass *klass)
Packit 4b6dd7
{
Packit 4b6dd7
	GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
Packit 4b6dd7
	GDataParsableClass *parsable_class = GDATA_PARSABLE_CLASS (klass);
Packit 4b6dd7
	GDataEntryClass *entry_class = GDATA_ENTRY_CLASS (klass);
Packit 4b6dd7
Packit 4b6dd7
	g_type_class_add_private (klass, sizeof (GDataPicasaWebFilePrivate));
Packit 4b6dd7
Packit 4b6dd7
	gobject_class->constructor = gdata_picasaweb_file_constructor;
Packit 4b6dd7
	gobject_class->get_property = gdata_picasaweb_file_get_property;
Packit 4b6dd7
	gobject_class->set_property = gdata_picasaweb_file_set_property;
Packit 4b6dd7
	gobject_class->dispose = gdata_picasaweb_file_dispose;
Packit 4b6dd7
	gobject_class->finalize = gdata_picasaweb_file_finalize;
Packit 4b6dd7
Packit 4b6dd7
	parsable_class->get_xml = get_xml;
Packit 4b6dd7
	parsable_class->parse_xml = parse_xml;
Packit 4b6dd7
	parsable_class->get_namespaces = get_namespaces;
Packit 4b6dd7
Packit 4b6dd7
	entry_class->get_entry_uri = get_entry_uri;
Packit 4b6dd7
	entry_class->kind_term = "http://schemas.google.com/photos/2007#photo";
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:file-id:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The ID of the file. This is a substring of the ID returned by gdata_entry_get_id() for #GDataPicasaWebFiles; for example,
Packit 4b6dd7
	 * if gdata_entry_get_id() returned
Packit 4b6dd7
	 * "http://picasaweb.google.com/data/entry/user/libgdata.picasaweb/albumid/5328889949261497249/photoid/5328890138794566386" for a
Packit 4b6dd7
	 * particular #GDataPicasaWebFile, the #GDataPicasaWebFile:file-id property would be "5328890138794566386".
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#gphoto_id">
Packit 4b6dd7
	 * gphoto specification</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.7.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_FILE_ID,
Packit 4b6dd7
	                                 g_param_spec_string ("file-id",
Packit 4b6dd7
	                                                      "File ID", "The ID of the file.",
Packit 4b6dd7
	                                                      NULL,
Packit 4b6dd7
	                                                      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:version:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The version number of the file. Version numbers are based on modification time, so they don't increment linearly.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#gphoto_version">
Packit 4b6dd7
	 * gphoto specification</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.4.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_VERSION,
Packit 4b6dd7
	                                 g_param_spec_string ("version",
Packit 4b6dd7
	                                                      "Version", "The version number of the file.",
Packit 4b6dd7
	                                                      NULL,
Packit 4b6dd7
	                                                      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:album-id:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The ID for the file's album. This is in the same form as returned by gdata_picasaweb_album_get_id().
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#gphoto_albumid">
Packit 4b6dd7
	 * gphoto specification</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.4.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_ALBUM_ID,
Packit 4b6dd7
	                                 g_param_spec_string ("album-id",
Packit 4b6dd7
	                                                      "Album ID", "The ID for the file's album.",
Packit 4b6dd7
	                                                      NULL,
Packit 4b6dd7
	                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:checksum:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * A checksum of the file, useful for duplicate detection.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#gphoto_checksum">
Packit 4b6dd7
	 * gphoto specification</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.4.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_CHECKSUM,
Packit 4b6dd7
	                                 g_param_spec_string ("checksum",
Packit 4b6dd7
	                                                      "Checksum", "A checksum of the file, useful for duplicate detection.",
Packit 4b6dd7
	                                                      NULL,
Packit 4b6dd7
	                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:video-status:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The status of the file, if it is a video. For example: %GDATA_PICASAWEB_VIDEO_STATUS_PENDING or %GDATA_PICASAWEB_VIDEO_STATUS_FAILED.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#gphoto_videostatus">
Packit 4b6dd7
	 * gphoto specification</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.4.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_VIDEO_STATUS,
Packit 4b6dd7
	                                 g_param_spec_string ("video-status",
Packit 4b6dd7
	                                                      "Video Status", "The status of the file, if it is a video.",
Packit 4b6dd7
	                                                      NULL,
Packit 4b6dd7
	                                                      G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:width:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The width of the photo or video, in pixels.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#gphoto_width">
Packit 4b6dd7
	 * gphoto specification</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.4.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_WIDTH,
Packit 4b6dd7
	                                 g_param_spec_uint ("width",
Packit 4b6dd7
	                                                    "Width", "The width of the photo or video, in pixels.",
Packit 4b6dd7
	                                                    0, G_MAXUINT, 0,
Packit 4b6dd7
	                                                    G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:height:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The height of the photo or video, in pixels.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#gphoto_height">
Packit 4b6dd7
	 * gphoto specification</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.4.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_HEIGHT,
Packit 4b6dd7
	                                 g_param_spec_uint ("height",
Packit 4b6dd7
	                                                    "Height", "The height of the photo or video, in pixels.",
Packit 4b6dd7
	                                                    0, G_MAXUINT, 0,
Packit 4b6dd7
	                                                    G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:size:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The size of the file, in bytes.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#gphoto_size">
Packit 4b6dd7
	 * gphoto specification</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.4.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_SIZE,
Packit 4b6dd7
	                                 g_param_spec_ulong ("size",
Packit 4b6dd7
	                                                     "Size", "The size of the file, in bytes.",
Packit 4b6dd7
	                                                     0, G_MAXULONG, 0,
Packit 4b6dd7
	                                                     G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:edited:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The time this file was last edited. If the file has not been edited yet, the content indicates the time it was created.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://www.atomenabled.org/developers/protocol/#appEdited">
Packit 4b6dd7
	 * Atom Publishing Protocol specification</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.4.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_EDITED,
Packit 4b6dd7
	                                 g_param_spec_int64 ("edited",
Packit 4b6dd7
	                                                     "Edited", "The time this file was last edited.",
Packit 4b6dd7
	                                                     -1, G_MAXINT64, -1,
Packit 4b6dd7
	                                                     G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:timestamp:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The time the file was purportedly taken. This a UNIX timestamp in milliseconds (not seconds) since the epoch.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#gphoto_timestamp">
Packit 4b6dd7
	 * gphoto specification</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.4.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_TIMESTAMP,
Packit 4b6dd7
	                                 g_param_spec_int64 ("timestamp",
Packit 4b6dd7
	                                                     "Timestamp", "The time the file was purportedly taken.",
Packit 4b6dd7
	                                                     -1, G_MAXINT64, -1,
Packit 4b6dd7
	                                                     G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:comment-count:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The number of comments on the file.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#gphoto_commentCount">
Packit 4b6dd7
	 * gphoto specification</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.4.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_COMMENT_COUNT,
Packit 4b6dd7
	                                 g_param_spec_uint ("comment-count",
Packit 4b6dd7
	                                                    "Comment Count", "The number of comments on the file.",
Packit 4b6dd7
	                                                    0, G_MAXUINT, 0,
Packit 4b6dd7
	                                                    G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:rotation:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The rotation of the photo, in degrees. This will only be non-zero for files which are pending rotation, and haven't yet been
Packit 4b6dd7
	 * permanently modified. For files which have already been rotated, this will be 0.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#gphoto_rotation">
Packit 4b6dd7
	 * gphoto specification</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.4.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_ROTATION,
Packit 4b6dd7
	                                 g_param_spec_uint ("rotation",
Packit 4b6dd7
	                                                    "Rotation", "The rotation of the photo, in degrees.",
Packit 4b6dd7
	                                                    0, 359, 0,
Packit 4b6dd7
	                                                    G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:is-commenting-enabled:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Whether commenting is enabled for this file.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.4.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_IS_COMMENTING_ENABLED,
Packit 4b6dd7
	                                 g_param_spec_boolean ("is-commenting-enabled",
Packit 4b6dd7
	                                                       "Commenting enabled?", "Indicates whether comments are enabled.",
Packit 4b6dd7
	                                                       TRUE,
Packit 4b6dd7
	                                                       G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:credit:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The nickname of the user credited with this file.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#media_credit">Media RSS
Packit 4b6dd7
	 * specification</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.4.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_CREDIT,
Packit 4b6dd7
	                                 g_param_spec_string ("credit",
Packit 4b6dd7
	                                                      "Credit", "The nickname of the user credited with this file.",
Packit 4b6dd7
	                                                      NULL,
Packit 4b6dd7
	                                                      G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:caption:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The file's descriptive caption.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.4.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_CAPTION,
Packit 4b6dd7
	                                 g_param_spec_string ("caption",
Packit 4b6dd7
	                                                      "Caption", "The file's descriptive caption.",
Packit 4b6dd7
	                                                      NULL,
Packit 4b6dd7
	                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:tags:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * A %NULL-terminated array of tags associated with the file.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#media_keywords">
Packit 4b6dd7
	 * Media RSS specification</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.4.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_TAGS,
Packit 4b6dd7
	                                 g_param_spec_boxed ("tags",
Packit 4b6dd7
	                                                     "Tags", "A NULL-terminated array of tags associated with the file.",
Packit 4b6dd7
	                                                     G_TYPE_STRV,
Packit 4b6dd7
	                                                     G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:distance:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The distance to the subject reported in the image's EXIF.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#exif_reference">
Packit 4b6dd7
	 * EXIF element reference</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.5.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_DISTANCE,
Packit 4b6dd7
	                                 g_param_spec_double ("distance",
Packit 4b6dd7
	                                                      "Distance", "The distance to the subject.",
Packit 4b6dd7
	                                                      -1.0, G_MAXDOUBLE, -1.0,
Packit 4b6dd7
	                                                      G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:exposure:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The exposure time.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#exif_reference">
Packit 4b6dd7
	 * EXIF element reference</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.5.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_EXPOSURE,
Packit 4b6dd7
	                                 g_param_spec_double ("exposure",
Packit 4b6dd7
	                                                      "Exposure", "The exposure time.",
Packit 4b6dd7
	                                                      0.0, G_MAXDOUBLE, 0.0,
Packit 4b6dd7
	                                                      G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:flash:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Indicates whether the flash was used.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#exif_reference">
Packit 4b6dd7
	 * EXIF element reference</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.5.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_FLASH,
Packit 4b6dd7
	                                 g_param_spec_boolean ("flash",
Packit 4b6dd7
	                                                       "Flash", "Indicates whether the flash was used.",
Packit 4b6dd7
	                                                       FALSE,
Packit 4b6dd7
	                                                       G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:focal-length:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The focal length for the shot.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#exif_reference">
Packit 4b6dd7
	 * EXIF element reference</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.5.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_FOCAL_LENGTH,
Packit 4b6dd7
	                                 g_param_spec_double ("focal-length",
Packit 4b6dd7
	                                                      "Focal Length", "The focal length used in the shot.",
Packit 4b6dd7
	                                                      -1.0, G_MAXDOUBLE, -1.0,
Packit 4b6dd7
	                                                      G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/* TODO: Rename to f-stop */
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:fstop:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The F-stop value.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#exif_reference">
Packit 4b6dd7
	 * EXIF element reference</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.5.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_FSTOP,
Packit 4b6dd7
	                                 g_param_spec_double ("fstop",
Packit 4b6dd7
	                                                      "F-stop", "The F-stop used.",
Packit 4b6dd7
	                                                      0.0, G_MAXDOUBLE, 0.0,
Packit 4b6dd7
	                                                      G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:image-unique-id:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * An unique ID for the image found in the EXIF.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#exif_reference">
Packit 4b6dd7
	 * EXIF element reference</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.5.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_IMAGE_UNIQUE_ID,
Packit 4b6dd7
	                                 g_param_spec_string ("image-unique-id",
Packit 4b6dd7
	                                                      "Image Unique ID", "An unique ID for the image.",
Packit 4b6dd7
	                                                      NULL,
Packit 4b6dd7
	                                                      G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:iso:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The ISO speed.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#exif_reference">
Packit 4b6dd7
	 * EXIF element reference</ulink> and ISO 5800:1987.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.5.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_ISO,
Packit 4b6dd7
	                                 g_param_spec_long ("iso",
Packit 4b6dd7
	                                                    "ISO", "The ISO speed.",
Packit 4b6dd7
	                                                    -1, G_MAXLONG, -1,
Packit 4b6dd7
	                                                    G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:make:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The name of the manufacturer of the camera.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#exif_reference">
Packit 4b6dd7
	 * EXIF element reference</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.5.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_MAKE,
Packit 4b6dd7
	                                 g_param_spec_string ("make",
Packit 4b6dd7
	                                                      "Make", "The name of the manufacturer.",
Packit 4b6dd7
	                                                      NULL,
Packit 4b6dd7
	                                                      G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:model:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The model of the camera.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/reference.html#exif_reference">
Packit 4b6dd7
	 * EXIF element reference</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.5.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_MODEL,
Packit 4b6dd7
	                                 g_param_spec_string ("model",
Packit 4b6dd7
	                                                      "Model", "The model of the camera.",
Packit 4b6dd7
	                                                      NULL,
Packit 4b6dd7
	                                                      G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:latitude:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The location as a latitude coordinate associated with this file. Valid latitudes range from -90.0
Packit 4b6dd7
	 * to 90.0 inclusive.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/docs/2.0/reference.html#georss_where">
Packit 4b6dd7
	 * GeoRSS specification</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.5.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_LATITUDE,
Packit 4b6dd7
	                                 g_param_spec_double ("latitude",
Packit 4b6dd7
	                                                      "Latitude", "The location as a latitude coordinate associated with this file.",
Packit 4b6dd7
	                                                      -90.0, 90.0, 0.0,
Packit 4b6dd7
	                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
Packit 4b6dd7
	/**
Packit 4b6dd7
	 * GDataPicasaWebFile:longitude:
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * The location as a longitude coordinate associated with this file. Valid longitudes range from -180.0
Packit 4b6dd7
	 * to 180.0 inclusive.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * For more information, see the <ulink type="http" url="http://code.google.com/apis/picasaweb/docs/2.0/reference.html#georss_where">
Packit 4b6dd7
	 * GeoRSS specification</ulink>.
Packit 4b6dd7
	 *
Packit 4b6dd7
	 * Since: 0.5.0
Packit 4b6dd7
	 */
Packit 4b6dd7
	g_object_class_install_property (gobject_class, PROP_LONGITUDE,
Packit 4b6dd7
	                                 g_param_spec_double ("longitude",
Packit 4b6dd7
	                                                      "Longitude", "The location as a longitude coordinate associated with this file.",
Packit 4b6dd7
	                                                      -180.0, 180.0, 0.0,
Packit 4b6dd7
	                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
gdata_picasaweb_file_commentable_init (GDataCommentableInterface *iface)
Packit 4b6dd7
{
Packit 4b6dd7
	iface->comment_type = GDATA_TYPE_PICASAWEB_COMMENT;
Packit 4b6dd7
	iface->get_authorization_domain = get_authorization_domain;
Packit 4b6dd7
	iface->get_query_comments_uri = get_query_comments_uri;
Packit 4b6dd7
	iface->get_insert_comment_uri = get_insert_comment_uri;
Packit 4b6dd7
	iface->is_comment_deletable = is_comment_deletable;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
notify_title_cb (GDataPicasaWebFile *self, GParamSpec *pspec, gpointer user_data)
Packit 4b6dd7
{
Packit 4b6dd7
	/* Keep the atom:title and media:group/media:title in sync */
Packit 4b6dd7
	if (self->priv->media_group != NULL)
Packit 4b6dd7
		gdata_media_group_set_title (self->priv->media_group, gdata_entry_get_title (GDATA_ENTRY (self)));
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
notify_summary_cb (GDataPicasaWebFile *self, GParamSpec *pspec, gpointer user_data)
Packit 4b6dd7
{
Packit 4b6dd7
	/* Keep the atom:summary and media:group/media:description in sync */
Packit 4b6dd7
	if (self->priv->media_group != NULL)
Packit 4b6dd7
		gdata_media_group_set_description (self->priv->media_group, gdata_entry_get_summary (GDATA_ENTRY (self)));
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
gdata_picasaweb_file_init (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GDATA_TYPE_PICASAWEB_FILE, GDataPicasaWebFilePrivate);
Packit 4b6dd7
	self->priv->media_group = g_object_new (GDATA_TYPE_MEDIA_GROUP, NULL);
Packit 4b6dd7
	self->priv->exif_tags = g_object_new (GDATA_TYPE_EXIF_TAGS, NULL);
Packit 4b6dd7
	self->priv->georss_where = g_object_new (GDATA_TYPE_GEORSS_WHERE, NULL);
Packit 4b6dd7
	self->priv->is_commenting_enabled = TRUE;
Packit 4b6dd7
	self->priv->edited = -1;
Packit 4b6dd7
	self->priv->timestamp = -1;
Packit 4b6dd7
Packit 4b6dd7
	/* We need to keep atom:title (the canonical title for the file) in sync with media:group/media:title */
Packit 4b6dd7
	g_signal_connect (self, "notify::title", G_CALLBACK (notify_title_cb), NULL);
Packit 4b6dd7
	/* atom:summary (the canonical summary/caption for the file) in sync with media:group/media:description */
Packit 4b6dd7
	g_signal_connect (self, "notify::summary", G_CALLBACK (notify_summary_cb), NULL);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static GObject *
Packit 4b6dd7
gdata_picasaweb_file_constructor (GType type, guint n_construct_params, GObjectConstructParam *construct_params)
Packit 4b6dd7
{
Packit 4b6dd7
	GObject *object;
Packit 4b6dd7
Packit 4b6dd7
	/* Chain up to the parent class */
Packit 4b6dd7
	object = G_OBJECT_CLASS (gdata_picasaweb_file_parent_class)->constructor (type, n_construct_params, construct_params);
Packit 4b6dd7
Packit 4b6dd7
	if (_gdata_parsable_is_constructed_from_xml (GDATA_PARSABLE (object)) == FALSE) {
Packit 4b6dd7
		GDataPicasaWebFilePrivate *priv = GDATA_PICASAWEB_FILE (object)->priv;
Packit 4b6dd7
		GTimeVal time_val;
Packit 4b6dd7
Packit 4b6dd7
		/* Set the edited and timestamp properties to the current time (creation time). bgo#599140
Packit 4b6dd7
		 * We don't do this in *_init() since that would cause setting it from parse_xml() to fail (duplicate element). */
Packit 4b6dd7
		g_get_current_time (&time_val);
Packit 4b6dd7
		priv->timestamp = (gint64) time_val.tv_sec * 1000;
Packit 4b6dd7
		priv->edited = time_val.tv_sec;
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	return object;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
gdata_picasaweb_file_dispose (GObject *object)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataPicasaWebFilePrivate *priv = GDATA_PICASAWEB_FILE (object)->priv;
Packit 4b6dd7
Packit 4b6dd7
	if (priv->media_group != NULL)
Packit 4b6dd7
		g_object_unref (priv->media_group);
Packit 4b6dd7
	priv->media_group = NULL;
Packit 4b6dd7
Packit 4b6dd7
	if (priv->exif_tags != NULL)
Packit 4b6dd7
		g_object_unref (priv->exif_tags);
Packit 4b6dd7
	priv->exif_tags = NULL;
Packit 4b6dd7
Packit 4b6dd7
	if (priv->georss_where != NULL)
Packit 4b6dd7
		g_object_unref (priv->georss_where);
Packit 4b6dd7
	priv->georss_where = NULL;
Packit 4b6dd7
Packit 4b6dd7
	/* Chain up to the parent class */
Packit 4b6dd7
	G_OBJECT_CLASS (gdata_picasaweb_file_parent_class)->dispose (object);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
gdata_picasaweb_file_finalize (GObject *object)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataPicasaWebFilePrivate *priv = GDATA_PICASAWEB_FILE (object)->priv;
Packit 4b6dd7
Packit 4b6dd7
	g_free (priv->file_id);
Packit 4b6dd7
	g_free (priv->version);
Packit 4b6dd7
	g_free (priv->album_id);
Packit 4b6dd7
	g_free (priv->checksum);
Packit 4b6dd7
	g_free (priv->video_status);
Packit 4b6dd7
Packit 4b6dd7
	/* Chain up to the parent class */
Packit 4b6dd7
	G_OBJECT_CLASS (gdata_picasaweb_file_parent_class)->finalize (object);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
gdata_picasaweb_file_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataPicasaWebFilePrivate *priv = GDATA_PICASAWEB_FILE (object)->priv;
Packit 4b6dd7
Packit 4b6dd7
	switch (property_id) {
Packit 4b6dd7
		case PROP_FILE_ID:
Packit 4b6dd7
			g_value_set_string (value, priv->file_id);
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_EDITED:
Packit 4b6dd7
			g_value_set_int64 (value, priv->edited);
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_VERSION:
Packit 4b6dd7
			g_value_set_string (value, priv->version);
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_ALBUM_ID:
Packit 4b6dd7
			g_value_set_string (value, priv->album_id);
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_WIDTH:
Packit 4b6dd7
			g_value_set_uint (value, priv->width);
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_HEIGHT:
Packit 4b6dd7
			g_value_set_uint (value, priv->height);
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_SIZE:
Packit 4b6dd7
			g_value_set_ulong (value, priv->size);
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_CHECKSUM:
Packit 4b6dd7
			g_value_set_string (value, priv->checksum);
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_TIMESTAMP:
Packit 4b6dd7
			g_value_set_int64 (value, priv->timestamp);
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_IS_COMMENTING_ENABLED:
Packit 4b6dd7
			g_value_set_boolean (value, priv->is_commenting_enabled);
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_COMMENT_COUNT:
Packit 4b6dd7
			g_value_set_uint (value, priv->comment_count);
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_ROTATION:
Packit 4b6dd7
			g_value_set_uint (value, priv->rotation);
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_VIDEO_STATUS:
Packit 4b6dd7
			g_value_set_string (value, priv->video_status);
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_CREDIT: {
Packit 4b6dd7
			GDataMediaCredit *credit = gdata_media_group_get_credit (priv->media_group);
Packit 4b6dd7
			g_value_set_string (value, gdata_media_credit_get_credit (credit));
Packit 4b6dd7
			break; }
Packit 4b6dd7
		case PROP_CAPTION:
Packit 4b6dd7
			g_value_set_string (value, gdata_entry_get_summary (GDATA_ENTRY (object)));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_TAGS:
Packit 4b6dd7
			g_value_set_boxed (value, gdata_media_group_get_keywords (priv->media_group));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_DISTANCE:
Packit 4b6dd7
			g_value_set_double (value, gdata_exif_tags_get_distance (priv->exif_tags));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_EXPOSURE:
Packit 4b6dd7
			g_value_set_double (value, gdata_exif_tags_get_exposure (priv->exif_tags));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_FLASH:
Packit 4b6dd7
			g_value_set_boolean (value, gdata_exif_tags_get_flash (priv->exif_tags));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_FOCAL_LENGTH:
Packit 4b6dd7
			g_value_set_double (value, gdata_exif_tags_get_focal_length (priv->exif_tags));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_FSTOP:
Packit 4b6dd7
			g_value_set_double (value, gdata_exif_tags_get_fstop (priv->exif_tags));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_IMAGE_UNIQUE_ID:
Packit 4b6dd7
			g_value_set_string (value, gdata_exif_tags_get_image_unique_id (priv->exif_tags));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_ISO:
Packit 4b6dd7
			g_value_set_long (value, gdata_exif_tags_get_iso (priv->exif_tags));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_MAKE:
Packit 4b6dd7
			g_value_set_string (value, gdata_exif_tags_get_make (priv->exif_tags));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_MODEL:
Packit 4b6dd7
			g_value_set_string (value, gdata_exif_tags_get_model (priv->exif_tags));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_LATITUDE:
Packit 4b6dd7
			g_value_set_double (value, gdata_georss_where_get_latitude (priv->georss_where));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_LONGITUDE:
Packit 4b6dd7
			g_value_set_double (value, gdata_georss_where_get_longitude (priv->georss_where));
Packit 4b6dd7
			break;
Packit 4b6dd7
		default:
Packit 4b6dd7
			/* We don't have any other property... */
Packit 4b6dd7
			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
Packit 4b6dd7
			break;
Packit 4b6dd7
	}
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
gdata_picasaweb_file_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataPicasaWebFile *self = GDATA_PICASAWEB_FILE (object);
Packit 4b6dd7
Packit 4b6dd7
	switch (property_id) {
Packit 4b6dd7
		case PROP_FILE_ID:
Packit 4b6dd7
			/* Construct only */
Packit 4b6dd7
			g_free (self->priv->file_id);
Packit 4b6dd7
			self->priv->file_id = g_value_dup_string (value);
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_VERSION:
Packit 4b6dd7
			/* Construct only */
Packit 4b6dd7
			g_free (self->priv->version);
Packit 4b6dd7
			self->priv->version = g_value_dup_string (value);
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_ALBUM_ID:
Packit 4b6dd7
			/* TODO: do we allow this to change albums? I think that's how pictures are moved. */
Packit 4b6dd7
			gdata_picasaweb_file_set_album_id (self, g_value_get_string (value));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_CHECKSUM:
Packit 4b6dd7
			gdata_picasaweb_file_set_checksum (self, g_value_get_string (value));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_TIMESTAMP:
Packit 4b6dd7
			gdata_picasaweb_file_set_timestamp (self, g_value_get_int64 (value));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_IS_COMMENTING_ENABLED: /* TODO I don't think we can change this on a per file basis */
Packit 4b6dd7
			gdata_picasaweb_file_set_is_commenting_enabled (self, g_value_get_boolean (value));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_ROTATION:
Packit 4b6dd7
			gdata_picasaweb_file_set_rotation (self, g_value_get_uint (value));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_CAPTION:
Packit 4b6dd7
			gdata_picasaweb_file_set_caption (self, g_value_get_string (value));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_TAGS:
Packit 4b6dd7
			gdata_picasaweb_file_set_tags (self, g_value_get_boxed (value));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_LATITUDE:
Packit 4b6dd7
			gdata_picasaweb_file_set_coordinates (self, g_value_get_double (value),
Packit 4b6dd7
			                                      gdata_georss_where_get_longitude (self->priv->georss_where));
Packit 4b6dd7
			break;
Packit 4b6dd7
		case PROP_LONGITUDE:
Packit 4b6dd7
			gdata_picasaweb_file_set_coordinates (self, gdata_georss_where_get_latitude (self->priv->georss_where),
Packit 4b6dd7
			                                      g_value_get_double (value));
Packit 4b6dd7
			break;
Packit 4b6dd7
		default:
Packit 4b6dd7
			/* We don't have any other property... */
Packit 4b6dd7
			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
Packit 4b6dd7
			break;
Packit 4b6dd7
	}
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static gboolean
Packit 4b6dd7
parse_xml (GDataParsable *parsable, xmlDoc *doc, xmlNode *node, gpointer user_data, GError **error)
Packit 4b6dd7
{
Packit 4b6dd7
	gboolean success;
Packit 4b6dd7
	GDataPicasaWebFile *self = GDATA_PICASAWEB_FILE (parsable);
Packit 4b6dd7
Packit 4b6dd7
	/* TODO: media:group should also be P_NO_DUPES, but we can't, as priv->media_group has to be pre-populated
Packit 4b6dd7
	 * in order for things like gdata_picasaweb_file_set_description() to work. */
Packit 4b6dd7
	if (gdata_parser_is_namespace (node, "http://www.w3.org/2007/app") == TRUE &&
Packit 4b6dd7
	    gdata_parser_int64_time_from_element (node, "edited", P_REQUIRED | P_NO_DUPES, &(self->priv->edited), &success, error) == TRUE) {
Packit 4b6dd7
		return success;
Packit 4b6dd7
	} else if (gdata_parser_is_namespace (node, "http://search.yahoo.com/mrss/") == TRUE &&
Packit 4b6dd7
	           gdata_parser_object_from_element (node, "group", P_REQUIRED, GDATA_TYPE_MEDIA_GROUP,
Packit 4b6dd7
	                                             &(self->priv->media_group), &success, error) == TRUE) {
Packit 4b6dd7
		return success;
Packit 4b6dd7
	} else if (gdata_parser_is_namespace (node, "http://www.georss.org/georss") == TRUE &&
Packit 4b6dd7
	          gdata_parser_object_from_element (node, "where", P_REQUIRED, GDATA_TYPE_GEORSS_WHERE,
Packit 4b6dd7
	                                            &(self->priv->georss_where), &success, error) == TRUE) {
Packit 4b6dd7
		return success;
Packit 4b6dd7
	} else if (gdata_parser_is_namespace (node, "http://schemas.google.com/photos/exif/2007") == TRUE &&
Packit 4b6dd7
	           gdata_parser_object_from_element (node, "tags", P_REQUIRED, GDATA_TYPE_EXIF_TAGS,
Packit 4b6dd7
	                                             &(self->priv->exif_tags), &success, error) == TRUE) {
Packit 4b6dd7
		return success;
Packit 4b6dd7
	} else if (gdata_parser_is_namespace (node, "http://schemas.google.com/photos/2007") == TRUE) {
Packit 4b6dd7
		if (gdata_parser_string_from_element (node, "videostatus", P_NO_DUPES, &(self->priv->video_status), &success, error) == TRUE ||
Packit 4b6dd7
		    gdata_parser_string_from_element (node, "imageVersion", P_NONE, &(self->priv->version), &success, error) == TRUE ||
Packit 4b6dd7
		    gdata_parser_string_from_element (node, "albumid", P_NONE, &(self->priv->album_id), &success, error) == TRUE ||
Packit 4b6dd7
		    gdata_parser_string_from_element (node, "checksum", P_NONE, &(self->priv->checksum), &success, error) == TRUE ||
Packit 4b6dd7
		    gdata_parser_string_from_element (node, "id", P_REQUIRED | P_NON_EMPTY | P_NO_DUPES,
Packit 4b6dd7
		                                      &(self->priv->file_id), &success, error) == TRUE) {
Packit 4b6dd7
			return success;
Packit 4b6dd7
		} else if (xmlStrcmp (node->name, (xmlChar*) "width") == 0) {
Packit 4b6dd7
			/* gphoto:width */
Packit 4b6dd7
			xmlChar *width = xmlNodeListGetString (doc, node->children, TRUE);
Packit 4b6dd7
			self->priv->width = g_ascii_strtoull ((gchar*) width, NULL, 10);
Packit 4b6dd7
			xmlFree (width);
Packit 4b6dd7
		} else if (xmlStrcmp (node->name, (xmlChar*) "height") == 0) {
Packit 4b6dd7
			/* gphoto:height */
Packit 4b6dd7
			xmlChar *height = xmlNodeListGetString (doc, node->children, TRUE);
Packit 4b6dd7
			self->priv->height = g_ascii_strtoull ((gchar*) height, NULL, 10);
Packit 4b6dd7
			xmlFree (height);
Packit 4b6dd7
		} else if (xmlStrcmp (node->name, (xmlChar*) "size") == 0) {
Packit 4b6dd7
			/* gphoto:size */
Packit 4b6dd7
			xmlChar *size = xmlNodeListGetString (doc, node->children, TRUE);
Packit 4b6dd7
			self->priv->size = g_ascii_strtoull ((gchar*) size, NULL, 10);
Packit 4b6dd7
			xmlFree (size);
Packit 4b6dd7
		} else if (xmlStrcmp (node->name, (xmlChar*) "timestamp") == 0) {
Packit 4b6dd7
			/* gphoto:timestamp */
Packit 4b6dd7
			xmlChar *timestamp_str;
Packit 4b6dd7
			guint64 milliseconds;
Packit 4b6dd7
Packit 4b6dd7
			timestamp_str = xmlNodeListGetString (doc, node->children, TRUE);
Packit 4b6dd7
			milliseconds = g_ascii_strtoull ((gchar*) timestamp_str, NULL, 10);
Packit 4b6dd7
			xmlFree (timestamp_str);
Packit 4b6dd7
Packit 4b6dd7
			gdata_picasaweb_file_set_timestamp (self, (gint64) milliseconds);
Packit 4b6dd7
		} else if (xmlStrcmp (node->name, (xmlChar*) "commentingEnabled") == 0) {
Packit 4b6dd7
			/* gphoto:commentingEnabled */
Packit 4b6dd7
			xmlChar *is_commenting_enabled = xmlNodeListGetString (doc, node->children, TRUE);
Packit 4b6dd7
			if (is_commenting_enabled == NULL)
Packit 4b6dd7
				return gdata_parser_error_required_content_missing (node, error);
Packit 4b6dd7
			self->priv->is_commenting_enabled = (xmlStrcmp (is_commenting_enabled, (xmlChar*) "true") == 0 ? TRUE : FALSE);
Packit 4b6dd7
			xmlFree (is_commenting_enabled);
Packit 4b6dd7
		} else if (xmlStrcmp (node->name, (xmlChar*) "commentCount") == 0) {
Packit 4b6dd7
			/* gphoto:commentCount */
Packit 4b6dd7
			xmlChar *comment_count = xmlNodeListGetString (doc, node->children, TRUE);
Packit 4b6dd7
			self->priv->comment_count = g_ascii_strtoull ((gchar*) comment_count, NULL, 10);
Packit 4b6dd7
			xmlFree (comment_count);
Packit 4b6dd7
		} else if (xmlStrcmp (node->name, (xmlChar*) "access") == 0) {
Packit 4b6dd7
			/* gphoto:access */
Packit 4b6dd7
			/* Visibility is already obtained through the album. When PicasaWeb supports per-file access restrictions,
Packit 4b6dd7
			 * we'll expose this property. Until then, we'll catch this to suppress the Unhandled XML warning.
Packit 4b6dd7
			 * See https://bugzilla.gnome.org/show_bug.cgi?id=589858 */
Packit 4b6dd7
		} else if (xmlStrcmp (node->name, (xmlChar*) "rotation") == 0) {
Packit 4b6dd7
			/* gphoto:rotation */
Packit 4b6dd7
			xmlChar *rotation = xmlNodeListGetString (doc, node->children, TRUE);
Packit 4b6dd7
			gdata_picasaweb_file_set_rotation (self, g_ascii_strtoull ((gchar*) rotation, NULL, 10));
Packit 4b6dd7
			xmlFree (rotation);
Packit 4b6dd7
		} else {
Packit 4b6dd7
			return GDATA_PARSABLE_CLASS (gdata_picasaweb_file_parent_class)->parse_xml (parsable, doc, node, user_data, error);
Packit 4b6dd7
		}
Packit 4b6dd7
	} else {
Packit 4b6dd7
		return GDATA_PARSABLE_CLASS (gdata_picasaweb_file_parent_class)->parse_xml (parsable, doc, node, user_data, error);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	return TRUE;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
get_xml (GDataParsable *parsable, GString *xml_string)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataPicasaWebFilePrivate *priv = GDATA_PICASAWEB_FILE (parsable)->priv;
Packit 4b6dd7
Packit 4b6dd7
	/* Chain up to the parent class */
Packit 4b6dd7
	GDATA_PARSABLE_CLASS (gdata_picasaweb_file_parent_class)->get_xml (parsable, xml_string);
Packit 4b6dd7
Packit 4b6dd7
	/* Add all the PicasaWeb-specific XML */
Packit 4b6dd7
	if (priv->file_id != NULL)
Packit 4b6dd7
		gdata_parser_string_append_escaped (xml_string, "<gphoto:id>", priv->file_id, "</gphoto:id>");
Packit 4b6dd7
Packit 4b6dd7
	if (priv->version != NULL)
Packit 4b6dd7
		gdata_parser_string_append_escaped (xml_string, "<gphoto:imageVersion>", priv->version, "</gphoto:imageVersion>");
Packit 4b6dd7
Packit 4b6dd7
	if (priv->album_id != NULL)
Packit 4b6dd7
		gdata_parser_string_append_escaped (xml_string, "<gphoto:albumid>", priv->album_id, "</gphoto:albumid>");
Packit 4b6dd7
Packit 4b6dd7
	if (priv->checksum != NULL)
Packit 4b6dd7
		gdata_parser_string_append_escaped (xml_string, "<gphoto:checksum>", priv->checksum, "</gphoto:checksum>");
Packit 4b6dd7
Packit 4b6dd7
	if (priv->timestamp != -1) {
Packit 4b6dd7
		/* timestamp is in milliseconds */
Packit 4b6dd7
		g_string_append_printf (xml_string, "<gphoto:timestamp>%" G_GINT64_FORMAT "</gphoto:timestamp>", priv->timestamp);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	if (priv->is_commenting_enabled == TRUE)
Packit 4b6dd7
		g_string_append (xml_string, "<gphoto:commentingEnabled>true</gphoto:commentingEnabled>");
Packit 4b6dd7
	else
Packit 4b6dd7
		g_string_append (xml_string, "<gphoto:commentingEnabled>false</gphoto:commentingEnabled>");
Packit 4b6dd7
Packit 4b6dd7
	if (priv->rotation > 0)
Packit 4b6dd7
		g_string_append_printf (xml_string, "<gphoto:rotation>%u</gphoto:rotation>", priv->rotation);
Packit 4b6dd7
Packit 4b6dd7
	/* media:group */
Packit 4b6dd7
	_gdata_parsable_get_xml (GDATA_PARSABLE (priv->media_group), xml_string, FALSE);
Packit 4b6dd7
Packit 4b6dd7
	/* georss:where */
Packit 4b6dd7
	if (priv->georss_where != NULL && gdata_georss_where_get_latitude (priv->georss_where) != G_MAXDOUBLE &&
Packit 4b6dd7
	    gdata_georss_where_get_longitude (priv->georss_where) != G_MAXDOUBLE) {
Packit 4b6dd7
		_gdata_parsable_get_xml (GDATA_PARSABLE (priv->georss_where), xml_string, FALSE);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* TODO:
Packit 4b6dd7
	 * - Finish supporting all tags
Packit 4b6dd7
	 * - Check all tags here are valid for insertions and updates
Packit 4b6dd7
	 */
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
get_namespaces (GDataParsable *parsable, GHashTable *namespaces)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataPicasaWebFilePrivate *priv = GDATA_PICASAWEB_FILE (parsable)->priv;
Packit 4b6dd7
Packit 4b6dd7
	/* Chain up to the parent class */
Packit 4b6dd7
	GDATA_PARSABLE_CLASS (gdata_picasaweb_file_parent_class)->get_namespaces (parsable, namespaces);
Packit 4b6dd7
Packit 4b6dd7
	g_hash_table_insert (namespaces, (gchar*) "gphoto", (gchar*) "http://schemas.google.com/photos/2007");
Packit 4b6dd7
	g_hash_table_insert (namespaces, (gchar*) "app", (gchar*) "http://www.w3.org/2007/app");
Packit 4b6dd7
Packit 4b6dd7
	/* Add the media:group namespaces */
Packit 4b6dd7
	GDATA_PARSABLE_GET_CLASS (priv->media_group)->get_namespaces (GDATA_PARSABLE (priv->media_group), namespaces);
Packit 4b6dd7
	/* Add the exif:tags namespaces */
Packit 4b6dd7
	GDATA_PARSABLE_GET_CLASS (priv->exif_tags)->get_namespaces (GDATA_PARSABLE (priv->exif_tags), namespaces);
Packit 4b6dd7
	/* Add the georss:where namespaces */
Packit 4b6dd7
	GDATA_PARSABLE_GET_CLASS (priv->georss_where)->get_namespaces (GDATA_PARSABLE (priv->georss_where), namespaces);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static gchar *
Packit 4b6dd7
get_entry_uri (const gchar *id)
Packit 4b6dd7
{
Packit 4b6dd7
	/* For files, the ID is of the form: "http://picasaweb.google.com/data/entry/user/liz/albumid/albumID/photoid/photoID"
Packit 4b6dd7
	 *   whereas the URI is of the form: "http://picasaweb.google.com/data/entry/api/user/liz/albumid/albumID/photoid/photoID" */
Packit 4b6dd7
	gchar **parts, *uri;
Packit 4b6dd7
Packit 4b6dd7
	parts = g_strsplit (id, "/entry/user/", 2);
Packit 4b6dd7
	g_assert (parts[0] != NULL && parts[1] != NULL && parts[2] == NULL);
Packit 4b6dd7
	uri = g_strconcat (parts[0], "/entry/api/user/", parts[1], NULL);
Packit 4b6dd7
	g_strfreev (parts);
Packit 4b6dd7
Packit 4b6dd7
	return uri;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
GDataAuthorizationDomain *
Packit 4b6dd7
get_authorization_domain (GDataCommentable *self)
Packit 4b6dd7
{
Packit 4b6dd7
	return gdata_picasaweb_service_get_primary_authorization_domain ();
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static gchar *
Packit 4b6dd7
get_query_comments_uri (GDataCommentable *self)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataLink *_link;
Packit 4b6dd7
	SoupURI *uri;
Packit 4b6dd7
	GHashTable *query;
Packit 4b6dd7
	gchar *output_uri;
Packit 4b6dd7
Packit 4b6dd7
	/* Get the feed link of the form: https://picasaweb.google.com/data/feed/api/user/[userID]/albumid/[albumID]/photoid/[photoID] */
Packit 4b6dd7
	_link = gdata_entry_look_up_link (GDATA_ENTRY (self), "http://schemas.google.com/g/2005#feed");
Packit 4b6dd7
	g_assert (_link != NULL);
Packit 4b6dd7
Packit 4b6dd7
	/* We're going to query the comments belonging to the photo, so add the comment kind. This link isn't available as a normal <link> on
Packit 4b6dd7
	 * photos. It's of the form: https://picasaweb.google.com/data/feed/api/user/[userID]/albumid/[albumID]/photoid/[photoID]?kind=comment */
Packit 4b6dd7
	uri = soup_uri_new (gdata_link_get_uri (_link));
Packit 4b6dd7
	query = soup_form_decode (uri->query);
Packit 4b6dd7
Packit 4b6dd7
	g_hash_table_replace (query, g_strdup ("kind"), (gchar*) "comment"); /* libsoup only specifies a destruction function for the key */
Packit 4b6dd7
	soup_uri_set_query_from_form (uri, query);
Packit 4b6dd7
	output_uri = soup_uri_to_string (uri, FALSE);
Packit 4b6dd7
Packit 4b6dd7
	g_hash_table_destroy (query);
Packit 4b6dd7
	soup_uri_free (uri);
Packit 4b6dd7
Packit 4b6dd7
	return output_uri;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static gchar *
Packit 4b6dd7
get_insert_comment_uri (GDataCommentable *self, GDataComment *comment_)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataLink *_link;
Packit 4b6dd7
Packit 4b6dd7
	_link = gdata_entry_look_up_link (GDATA_ENTRY (self), "http://schemas.google.com/g/2005#feed");
Packit 4b6dd7
	g_assert (_link != NULL);
Packit 4b6dd7
Packit 4b6dd7
	return g_strdup (gdata_link_get_uri (_link));
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static gboolean
Packit 4b6dd7
is_comment_deletable (GDataCommentable *self, GDataComment *comment_)
Packit 4b6dd7
{
Packit 4b6dd7
	return (gdata_entry_look_up_link (GDATA_ENTRY (comment_), GDATA_LINK_EDIT) != NULL) ? TRUE : FALSE;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_new:
Packit 4b6dd7
 * @id: (allow-none): the file's ID, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Creates a new #GDataPicasaWebFile with the given ID and default properties.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: a new #GDataPicasaWebFile; unref with g_object_unref()
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
GDataPicasaWebFile *
Packit 4b6dd7
gdata_picasaweb_file_new (const gchar *id)
Packit 4b6dd7
{
Packit 4b6dd7
	const gchar *file_id = NULL, *i;
Packit 4b6dd7
Packit 4b6dd7
	if (id != NULL) {
Packit 4b6dd7
		file_id = g_strrstr (id, "/");
Packit 4b6dd7
		if (file_id == NULL)
Packit 4b6dd7
			return NULL;
Packit 4b6dd7
		file_id++; /* skip the slash */
Packit 4b6dd7
Packit 4b6dd7
		/* Ensure the @file_id is entirely numeric */
Packit 4b6dd7
		for (i = file_id; *i != '\0'; i = g_utf8_next_char (i)) {
Packit 4b6dd7
			if (g_unichar_isdigit (g_utf8_get_char (i)) == FALSE)
Packit 4b6dd7
				return NULL;
Packit 4b6dd7
		}
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	return GDATA_PICASAWEB_FILE (g_object_new (GDATA_TYPE_PICASAWEB_FILE, "id", id, "file-id", file_id, NULL));
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_id:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:file-id property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the file's ID
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.7.0
Packit 4b6dd7
 */
Packit 4b6dd7
const gchar *
Packit 4b6dd7
gdata_picasaweb_file_get_id (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), NULL);
Packit 4b6dd7
	return self->priv->file_id;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_edited:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:edited property. If the property is unset, -1 will be returned.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the UNIX timestamp for the time the file was last edited, or -1
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
gint64
Packit 4b6dd7
gdata_picasaweb_file_get_edited (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), -1);
Packit 4b6dd7
	return self->priv->edited;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_version:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:version property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the file's version number, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
const gchar *
Packit 4b6dd7
gdata_picasaweb_file_get_version (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), NULL);
Packit 4b6dd7
	return self->priv->version;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_album_id:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:album-id property. This is in the same form as returned by gdata_picasaweb_album_get_id().
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the ID of the album containing the #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
const gchar *
Packit 4b6dd7
gdata_picasaweb_file_get_album_id (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), NULL);
Packit 4b6dd7
	return self->priv->album_id;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_set_album_id:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 * @album_id: the ID of the new album for this file
Packit 4b6dd7
 *
Packit 4b6dd7
 * Sets the #GDataPicasaWebFile:album-id property, effectively moving the file to the album.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
void
Packit 4b6dd7
gdata_picasaweb_file_set_album_id (GDataPicasaWebFile *self, const gchar *album_id)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_PICASAWEB_FILE (self));
Packit 4b6dd7
	g_return_if_fail (album_id != NULL && *album_id != '\0');
Packit 4b6dd7
Packit 4b6dd7
	g_free (self->priv->album_id);
Packit 4b6dd7
	self->priv->album_id = g_strdup (album_id);
Packit 4b6dd7
	g_object_notify (G_OBJECT (self), "album-id");
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_width:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:width property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the width of the image or video, in pixels
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
guint
Packit 4b6dd7
gdata_picasaweb_file_get_width (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), 0);
Packit 4b6dd7
	return self->priv->width;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_height:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:height property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the height of the image or video, in pixels
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
guint
Packit 4b6dd7
gdata_picasaweb_file_get_height (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), 0);
Packit 4b6dd7
	return self->priv->height;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_size:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:size property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the size of the file, in bytes
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
gsize
Packit 4b6dd7
gdata_picasaweb_file_get_size (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), 0);
Packit 4b6dd7
	return self->priv->size;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_checksum:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:checksum property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the checksum assigned to this file, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
const gchar *
Packit 4b6dd7
gdata_picasaweb_file_get_checksum (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), NULL);
Packit 4b6dd7
	return self->priv->checksum;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_set_checksum:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 * @checksum: (allow-none): the new checksum for this file, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Sets the #GDataPicasaWebFile:checksum property to @checksum.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Set @checksum to %NULL to unset the property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
void
Packit 4b6dd7
gdata_picasaweb_file_set_checksum (GDataPicasaWebFile *self, const gchar *checksum)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_PICASAWEB_FILE (self));
Packit 4b6dd7
Packit 4b6dd7
	g_free (self->priv->checksum);
Packit 4b6dd7
	self->priv->checksum = g_strdup (checksum);
Packit 4b6dd7
	g_object_notify (G_OBJECT (self), "checksum");
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_timestamp:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:timestamp property. It's a UNIX timestamp in milliseconds (not seconds) since the epoch. If the property is unset,
Packit 4b6dd7
 * -1 will be returned.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the UNIX timestamp for the timestamp property in milliseconds, or -1
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
gint64
Packit 4b6dd7
gdata_picasaweb_file_get_timestamp (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), -1);
Packit 4b6dd7
	return self->priv->timestamp;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_set_timestamp:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 * @timestamp: a UNIX timestamp, or -1
Packit 4b6dd7
 *
Packit 4b6dd7
 * Sets the #GDataPicasaWebFile:timestamp property from @timestamp. This should be a UNIX timestamp in milliseconds (not seconds) since the epoch. If
Packit 4b6dd7
 * @timestamp is -1, the property will be unset.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
void
Packit 4b6dd7
gdata_picasaweb_file_set_timestamp (GDataPicasaWebFile *self, gint64 timestamp)
Packit 4b6dd7
{
Packit 4b6dd7
	/* RHSTODO: I think the timestamp value is just being
Packit 4b6dd7
	   over-ridden by the file's actual EXIF time value; unless
Packit 4b6dd7
	   we're setting this incorrectly here or in get_xml(); test that */
Packit 4b6dd7
	/* RHSTODO: improve testing of setters in tests/picasa.c */
Packit 4b6dd7
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_PICASAWEB_FILE (self));
Packit 4b6dd7
	g_return_if_fail (timestamp >= -1);
Packit 4b6dd7
Packit 4b6dd7
	self->priv->timestamp = timestamp;
Packit 4b6dd7
	g_object_notify (G_OBJECT (self), "timestamp");
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_is_commenting_enabled:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:is-commenting-enabled property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: %TRUE if commenting is enabled, %FALSE otherwise
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
gboolean
Packit 4b6dd7
gdata_picasaweb_file_is_commenting_enabled (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), FALSE);
Packit 4b6dd7
	return self->priv->is_commenting_enabled;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_set_is_commenting_enabled:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 * @is_commenting_enabled: %TRUE if commenting should be enabled for the file, %FALSE otherwise
Packit 4b6dd7
 *
Packit 4b6dd7
 * Sets the #GDataPicasaWebFile:is-commenting-enabled property to @is_commenting_enabled.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
void
Packit 4b6dd7
gdata_picasaweb_file_set_is_commenting_enabled (GDataPicasaWebFile *self, gboolean is_commenting_enabled)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_PICASAWEB_FILE (self));
Packit 4b6dd7
	self->priv->is_commenting_enabled = is_commenting_enabled;
Packit 4b6dd7
	g_object_notify (G_OBJECT (self), "is-commenting-enabled");
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_comment_count:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:comment-count property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the number of comments on the file
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
guint
Packit 4b6dd7
gdata_picasaweb_file_get_comment_count (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), 0);
Packit 4b6dd7
	return self->priv->comment_count;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_rotation:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:rotation property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the image's rotation, in degrees
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
guint
Packit 4b6dd7
gdata_picasaweb_file_get_rotation (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), 0);
Packit 4b6dd7
	return self->priv->rotation;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_set_rotation:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 * @rotation: the new rotation for the image, in degrees
Packit 4b6dd7
 *
Packit 4b6dd7
 * Sets the #GDataPicasaWebFile:rotation property to @rotation.
Packit 4b6dd7
 *
Packit 4b6dd7
 * The rotation is absolute, rather than cumulative, through successive calls to gdata_picasaweb_file_set_rotation(),
Packit 4b6dd7
 * so calling it with 90° then 20° will result in a final rotation of 20°.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
void
Packit 4b6dd7
gdata_picasaweb_file_set_rotation (GDataPicasaWebFile *self, guint rotation)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_PICASAWEB_FILE (self));
Packit 4b6dd7
	self->priv->rotation = rotation % 360;
Packit 4b6dd7
	g_object_notify (G_OBJECT (self), "rotation");
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_video_status:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:video-status property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the status of this video ("pending", "ready", "final" or "failed"), or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
const gchar *
Packit 4b6dd7
gdata_picasaweb_file_get_video_status (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), NULL);
Packit 4b6dd7
	return self->priv->video_status;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_tags:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:tags property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: (array zero-terminated=1) (transfer none): a %NULL-terminated array of tags associated with the file, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
const gchar * const *
Packit 4b6dd7
gdata_picasaweb_file_get_tags (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), NULL);
Packit 4b6dd7
	return gdata_media_group_get_keywords (self->priv->media_group);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_set_tags:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 * @tags: (array zero-terminated=1) (allow-none): a new %NULL-terminated array of tags, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Sets the #GDataPicasaWebFile:tags property to @tags.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Set @tags to %NULL to unset the property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
void
Packit 4b6dd7
gdata_picasaweb_file_set_tags (GDataPicasaWebFile *self, const gchar * const *tags)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_PICASAWEB_FILE (self));
Packit 4b6dd7
Packit 4b6dd7
	gdata_media_group_set_keywords (self->priv->media_group, tags);
Packit 4b6dd7
	g_object_notify (G_OBJECT (self), "tags");
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_credit:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:credit property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the nickname of the user credited with this file
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
const gchar *
Packit 4b6dd7
gdata_picasaweb_file_get_credit (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataMediaCredit *credit;
Packit 4b6dd7
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), NULL);
Packit 4b6dd7
Packit 4b6dd7
	credit = gdata_media_group_get_credit (self->priv->media_group);
Packit 4b6dd7
	return (credit == NULL) ? NULL : gdata_media_credit_get_credit (credit);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_caption:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:caption property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the file's descriptive caption, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
const gchar *
Packit 4b6dd7
gdata_picasaweb_file_get_caption (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), NULL);
Packit 4b6dd7
	return gdata_entry_get_summary (GDATA_ENTRY (self));
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_set_caption:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 * @caption: (allow-none): the file's new caption, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Sets the #GDataPicasaWebFile:caption property to @caption.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Set @caption to %NULL to unset the file's caption.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
void
Packit 4b6dd7
gdata_picasaweb_file_set_caption (GDataPicasaWebFile *self, const gchar *caption)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_PICASAWEB_FILE (self));
Packit 4b6dd7
Packit 4b6dd7
	gdata_entry_set_summary (GDATA_ENTRY (self), caption);
Packit 4b6dd7
	gdata_media_group_set_description (self->priv->media_group, caption);
Packit 4b6dd7
	g_object_notify (G_OBJECT (self), "caption");
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_contents:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Returns a list of media content, e.g. the actual photo or video.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: (element-type GData.MediaContent) (transfer none): a #GList of #GDataMediaContent items
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
GList *
Packit 4b6dd7
gdata_picasaweb_file_get_contents (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), NULL);
Packit 4b6dd7
	return gdata_media_group_get_contents (self->priv->media_group);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_thumbnails:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Returns a list of thumbnails, often at different sizes, for this
Packit 4b6dd7
 * file.  Currently, PicasaWeb usually returns three thumbnails, with
Packit 4b6dd7
 * widths in pixels of 72, 144, and 288.  However, the thumbnail will
Packit 4b6dd7
 * not be larger than the actual image, so thumbnails may be smaller
Packit 4b6dd7
 * than the widths listed above.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: (element-type GData.MediaThumbnail) (transfer none): a #GList of #GDataMediaThumbnails, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
GList *
Packit 4b6dd7
gdata_picasaweb_file_get_thumbnails (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), NULL);
Packit 4b6dd7
	return gdata_media_group_get_thumbnails (self->priv->media_group);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_distance:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:distance property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the distance recorded in the photo's EXIF, or -1 if unknown
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.5.0
Packit 4b6dd7
 */
Packit 4b6dd7
gdouble
Packit 4b6dd7
gdata_picasaweb_file_get_distance (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), -1);
Packit 4b6dd7
	return gdata_exif_tags_get_distance (self->priv->exif_tags);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_exposure:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:exposure property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the exposure value, or 0 if unknown
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.5.0
Packit 4b6dd7
 */
Packit 4b6dd7
gdouble
Packit 4b6dd7
gdata_picasaweb_file_get_exposure (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), 0);
Packit 4b6dd7
	return gdata_exif_tags_get_exposure (self->priv->exif_tags);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_flash:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:flash property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: %TRUE if flash was used, %FALSE otherwise
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.5.0
Packit 4b6dd7
 */
Packit 4b6dd7
gboolean
Packit 4b6dd7
gdata_picasaweb_file_get_flash (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), FALSE);
Packit 4b6dd7
	return gdata_exif_tags_get_flash (self->priv->exif_tags);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_focal_length:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:focal-length property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the focal-length value, or -1 if unknown
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.5.0
Packit 4b6dd7
 */
Packit 4b6dd7
gdouble
Packit 4b6dd7
gdata_picasaweb_file_get_focal_length (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), -1);
Packit 4b6dd7
	return gdata_exif_tags_get_focal_length (self->priv->exif_tags);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_fstop:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:fstop property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the F-stop value, or 0 if unknown
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.5.0
Packit 4b6dd7
 */
Packit 4b6dd7
gdouble
Packit 4b6dd7
gdata_picasaweb_file_get_fstop (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), 0);
Packit 4b6dd7
	return gdata_exif_tags_get_fstop (self->priv->exif_tags);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_image_unique_id:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:image-unique-id property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the photo's unique EXIF identifier, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.5.0
Packit 4b6dd7
 */
Packit 4b6dd7
const gchar *
Packit 4b6dd7
gdata_picasaweb_file_get_image_unique_id (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), NULL);
Packit 4b6dd7
	return gdata_exif_tags_get_image_unique_id (self->priv->exif_tags);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_iso:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:iso property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the ISO speed, or -1 if unknown
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.5.0
Packit 4b6dd7
 */
Packit 4b6dd7
gint
Packit 4b6dd7
gdata_picasaweb_file_get_iso (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), -1);
Packit 4b6dd7
	return gdata_exif_tags_get_iso (self->priv->exif_tags);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_make:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:make property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the name of the manufacturer of the camera, or %NULL if unknown
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.5.0
Packit 4b6dd7
 */
Packit 4b6dd7
const gchar *
Packit 4b6dd7
gdata_picasaweb_file_get_make (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), NULL);
Packit 4b6dd7
	return gdata_exif_tags_get_make (self->priv->exif_tags);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_model:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:model property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the model name of the camera, or %NULL if unknown
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.5.0
Packit 4b6dd7
 */
Packit 4b6dd7
const gchar *
Packit 4b6dd7
gdata_picasaweb_file_get_model (GDataPicasaWebFile *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_PICASAWEB_FILE (self), NULL);
Packit 4b6dd7
	return gdata_exif_tags_get_model (self->priv->exif_tags);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_get_coordinates:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 * @latitude: (out caller-allocates) (allow-none): return location for the latitude, or %NULL
Packit 4b6dd7
 * @longitude: (out caller-allocates) (allow-none): return location for the longitude, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataPicasaWebFile:latitude and #GDataPicasaWebFile:longitude properties, setting the out parameters to them.
Packit 4b6dd7
 * If either latitude or longitude is %NULL, that parameter will not be set. If the coordinates are unset,
Packit 4b6dd7
 * @latitude and @longitude will be set to %G_MAXDOUBLE.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.5.0
Packit 4b6dd7
 */
Packit 4b6dd7
void
Packit 4b6dd7
gdata_picasaweb_file_get_coordinates (GDataPicasaWebFile *self, gdouble *latitude, gdouble *longitude)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_PICASAWEB_FILE (self));
Packit 4b6dd7
Packit 4b6dd7
	if (latitude != NULL)
Packit 4b6dd7
		*latitude = gdata_georss_where_get_latitude (self->priv->georss_where);
Packit 4b6dd7
	if (longitude != NULL)
Packit 4b6dd7
		*longitude = gdata_georss_where_get_longitude (self->priv->georss_where);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_picasaweb_file_set_coordinates:
Packit 4b6dd7
 * @self: a #GDataPicasaWebFile
Packit 4b6dd7
 * @latitude: the file's new latitude coordinate, or %G_MAXDOUBLE
Packit 4b6dd7
 * @longitude: the file's new longitude coordinate, or %G_MAXDOUBLE
Packit 4b6dd7
 *
Packit 4b6dd7
 * Sets the #GDataPicasaWebFile:latitude and #GDataPicasaWebFile:longitude properties to
Packit 4b6dd7
 * @latitude and @longitude respectively.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.5.0
Packit 4b6dd7
 */
Packit 4b6dd7
void
Packit 4b6dd7
gdata_picasaweb_file_set_coordinates (GDataPicasaWebFile *self, gdouble latitude, gdouble longitude)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_PICASAWEB_FILE (self));
Packit 4b6dd7
Packit 4b6dd7
	gdata_georss_where_set_latitude (self->priv->georss_where, latitude);
Packit 4b6dd7
	gdata_georss_where_set_longitude (self->priv->georss_where, longitude);
Packit 4b6dd7
Packit 4b6dd7
	g_object_freeze_notify (G_OBJECT (self));
Packit 4b6dd7
	g_object_notify (G_OBJECT (self), "latitude");
Packit 4b6dd7
	g_object_notify (G_OBJECT (self), "longitude");
Packit 4b6dd7
	g_object_thaw_notify (G_OBJECT (self));
Packit 4b6dd7
}