[gthumb: 14/22] [picasaweb] added list_photos to picasa_web_service
- From: Paolo Bacchilega <paobac src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gthumb: 14/22] [picasaweb] added list_photos to picasa_web_service
- Date: Sat, 30 Jan 2010 23:20:26 +0000 (UTC)
commit 1a618eb31b5466344916d7148c629c8234decce0
Author: Paolo Bacchilega <paobac src gnome org>
Date: Thu Jan 28 18:23:36 2010 +0100
[picasaweb] added list_photos to picasa_web_service
extensions/picasaweb/Makefile.am | 3 +
extensions/picasaweb/picasa-web-album.h | 8 +-
extensions/picasaweb/picasa-web-photo.c | 320 +++++++++++++++++++++++++++++
extensions/picasaweb/picasa-web-photo.h | 82 ++++++++
extensions/picasaweb/picasa-web-service.c | 118 +++++++++++
extensions/picasaweb/picasa-web-service.h | 8 +
extensions/picasaweb/picasa-web-types.h | 33 +++
7 files changed, 565 insertions(+), 7 deletions(-)
---
diff --git a/extensions/picasaweb/Makefile.am b/extensions/picasaweb/Makefile.am
index 0a0532d..e6f5c68 100644
--- a/extensions/picasaweb/Makefile.am
+++ b/extensions/picasaweb/Makefile.am
@@ -25,8 +25,11 @@ libpicasaweb_la_SOURCES = \
picasa-album-properties-dialog.h \
picasa-web-album.c \
picasa-web-album.h \
+ picasa-web-photo.c \
+ picasa-web-photo.h \
picasa-web-service.c \
picasa-web-service.h \
+ picasa-web-types.h \
picasa-web-user.c \
picasa-web-user.h \
preferences.h
diff --git a/extensions/picasaweb/picasa-web-album.h b/extensions/picasaweb/picasa-web-album.h
index 16e714e..993a852 100644
--- a/extensions/picasaweb/picasa-web-album.h
+++ b/extensions/picasaweb/picasa-web-album.h
@@ -25,6 +25,7 @@
#include <glib.h>
#include <glib-object.h>
+#include "picasa-web-types.h"
G_BEGIN_DECLS
@@ -39,13 +40,6 @@ typedef struct _PicasaWebAlbum PicasaWebAlbum;
typedef struct _PicasaWebAlbumClass PicasaWebAlbumClass;
typedef struct _PicasaWebAlbumPrivate PicasaWebAlbumPrivate;
-typedef enum {
- PICASA_WEB_ACCESS_ALL,
- PICASA_WEB_ACCESS_PRIVATE,
- PICASA_WEB_ACCESS_PUBLIC,
- PICASA_WEB_ACCESS_VISIBLE
-} PicasaWebAccess;
-
struct _PicasaWebAlbum {
GObject parent_instance;
PicasaWebAlbumPrivate *priv;
diff --git a/extensions/picasaweb/picasa-web-photo.c b/extensions/picasaweb/picasa-web-photo.c
new file mode 100644
index 0000000..52d324f
--- /dev/null
+++ b/extensions/picasaweb/picasa-web-photo.c
@@ -0,0 +1,320 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * GThumb
+ *
+ * Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gthumb.h>
+#include "picasa-web-photo.h"
+
+
+static gpointer picasa_web_photo_parent_class = NULL;
+
+
+static void
+picasa_web_photo_finalize (GObject *obj)
+{
+ PicasaWebPhoto *self;
+
+ self = PICASA_WEB_PHOTO (obj);
+
+ g_free (self->etag);
+ g_free (self->id);
+ g_free (self->album_id);
+ g_free (self->title);
+ g_free (self->summary);
+ g_free (self->uri);
+ g_free (self->keywords);
+
+ G_OBJECT_CLASS (picasa_web_photo_parent_class)->finalize (obj);
+}
+
+
+static void
+picasa_web_photo_class_init (PicasaWebPhotoClass *klass)
+{
+ picasa_web_photo_parent_class = g_type_class_peek_parent (klass);
+ G_OBJECT_CLASS (klass)->finalize = picasa_web_photo_finalize;
+}
+
+
+static DomElement*
+picasa_web_photo_create_element (DomDomizable *base,
+ DomDocument *doc)
+{
+ PicasaWebPhoto *self;
+ DomElement *element;
+ char *value;
+
+ self = PICASA_WEB_PHOTO (base);
+
+ element = dom_document_create_element (doc, "entry",
+ "xmlns", "http://www.w3.org/2005/Atom";,
+ "xmlns:media", "http://search.yahoo.com/mrss/";,
+ "xmlns:gphoto", "http://schemas.google.com/photos/2007";,
+ NULL);
+ if (self->id != NULL)
+ dom_element_append_child (element, dom_document_create_element_with_text (doc, self->id, "gphoto:id", NULL));
+ if (self->album_id != NULL)
+ dom_element_append_child (element, dom_document_create_element_with_text (doc, self->id, "gphoto:albumid", NULL));
+ if (self->title != NULL)
+ dom_element_append_child (element, dom_document_create_element_with_text (doc, self->id, "title", NULL));
+ if (self->summary != NULL)
+ dom_element_append_child (element, dom_document_create_element_with_text (doc, self->id, "summary", NULL));
+ if (self->uri != NULL)
+ dom_element_append_child (element, dom_document_create_element (doc, "content", "src", self->uri, NULL));
+
+ switch (self->access) {
+ case PICASA_WEB_ACCESS_ALL:
+ value = "all";
+ break;
+ case PICASA_WEB_ACCESS_PRIVATE:
+ value = "private";
+ break;
+ case PICASA_WEB_ACCESS_PUBLIC:
+ value = "public";
+ break;
+ case PICASA_WEB_ACCESS_VISIBLE:
+ value = "visible";
+ break;
+ }
+ dom_element_append_child (element, dom_document_create_element_with_text (doc, value, "gphoto:access", NULL));
+
+ if (self->keywords != NULL) {
+ DomElement *group;
+
+ group = dom_document_create_element (doc, "media:group", NULL);
+ dom_element_append_child (group, dom_document_create_element_with_text (doc, self->keywords, "media:keywords", NULL));
+ dom_element_append_child (element, group);
+ }
+
+ dom_element_append_child (element,
+ dom_document_create_element (doc, "category",
+ "scheme", "http://schemas.google.com/g/2005#kind";,
+ "term", "http://schemas.google.com/photos/2007#photo";,
+ NULL));
+
+ return element;
+}
+
+
+static void
+picasa_web_photo_load_from_element (DomDomizable *base,
+ DomElement *element)
+{
+ PicasaWebPhoto *self;
+ DomElement *node;
+
+ self = PICASA_WEB_PHOTO (base);
+
+ picasa_web_photo_set_id (self, NULL);
+ picasa_web_photo_set_album_id (self, NULL);
+ picasa_web_photo_set_title (self, NULL);
+ picasa_web_photo_set_summary (self, NULL);
+ picasa_web_photo_set_uri (self, NULL);
+ picasa_web_photo_set_access (self, NULL);
+ picasa_web_photo_set_keywords (self, NULL);
+
+ picasa_web_photo_set_etag (self, dom_element_get_attribute (element, "gd:etag"));
+ for (node = element->first_child; node; node = node->next_sibling) {
+ if (g_strcmp0 (node->tag_name, "gphoto:id") == 0) {
+ picasa_web_photo_set_id (self, dom_element_get_inner_text (node));
+ }
+ else if (g_strcmp0 (node->tag_name, "gphoto:albumid") == 0) {
+ picasa_web_photo_set_album_id (self, dom_element_get_inner_text (node));
+ }
+ else if (g_strcmp0 (node->tag_name, "title") == 0) {
+ picasa_web_photo_set_title (self, dom_element_get_inner_text (node));
+ }
+ else if (g_strcmp0 (node->tag_name, "summary") == 0) {
+ picasa_web_photo_set_summary (self, dom_element_get_inner_text (node));
+ }
+ else if (g_strcmp0 (node->tag_name, "content") == 0) {
+ picasa_web_photo_set_uri (self, dom_element_get_attribute (node, "src"));
+ }
+ else if (g_strcmp0 (node->tag_name, "gphoto:access") == 0) {
+ picasa_web_photo_set_access (self, dom_element_get_inner_text (node));
+ }
+ else if (g_strcmp0 (node->tag_name, "media:group") == 0) {
+ DomElement *child;
+
+ for (child = node->first_child; child; child = child->next_sibling) {
+ if (g_strcmp0 (child->tag_name, "media:keywords") == 0) {
+ picasa_web_photo_set_keywords (self, dom_element_get_inner_text (child));
+ break;
+ }
+ }
+ }
+ }
+}
+
+
+static void
+picasa_web_photo_dom_domizable_interface_init (DomDomizableIface *iface)
+{
+ iface->create_element = picasa_web_photo_create_element;
+ iface->load_from_element = picasa_web_photo_load_from_element;
+}
+
+
+static void
+picasa_web_photo_instance_init (PicasaWebPhoto *self)
+{
+}
+
+
+GType
+picasa_web_photo_get_type (void)
+{
+ static GType picasa_web_photo_type_id = 0;
+
+ if (picasa_web_photo_type_id == 0) {
+ static const GTypeInfo g_define_type_info = {
+ sizeof (PicasaWebPhotoClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) picasa_web_photo_class_init,
+ (GClassFinalizeFunc) NULL,
+ NULL,
+ sizeof (PicasaWebPhoto),
+ 0,
+ (GInstanceInitFunc) picasa_web_photo_instance_init,
+ NULL
+ };
+ static const GInterfaceInfo dom_domizable_info = {
+ (GInterfaceInitFunc) picasa_web_photo_dom_domizable_interface_init,
+ (GInterfaceFinalizeFunc) NULL,
+ NULL
+ };
+
+ picasa_web_photo_type_id = g_type_register_static (G_TYPE_OBJECT,
+ "PicasaWebPhoto",
+ &g_define_type_info,
+ 0);
+ g_type_add_interface_static (picasa_web_photo_type_id, DOM_TYPE_DOMIZABLE, &dom_domizable_info);
+ }
+
+ return picasa_web_photo_type_id;
+}
+
+
+PicasaWebPhoto *
+picasa_web_photo_new (void)
+{
+ return g_object_new (PICASA_WEB_TYPE_PHOTO, NULL);
+}
+
+
+void
+picasa_web_photo_set_etag (PicasaWebPhoto *self,
+ const char *value)
+{
+ g_free (self->etag);
+ self->etag = NULL;
+ if (value != NULL)
+ self->etag = g_strdup (value);
+}
+
+
+void
+picasa_web_photo_set_id (PicasaWebPhoto *self,
+ const char *value)
+{
+ g_free (self->id);
+ self->id = NULL;
+ if (value != NULL)
+ self->id = g_strdup (value);
+}
+
+
+void
+picasa_web_photo_set_album_id (PicasaWebPhoto *self,
+ const char *value)
+{
+ g_free (self->album_id);
+ self->album_id = NULL;
+ if (value != NULL)
+ self->album_id = g_strdup (value);
+}
+
+
+void
+picasa_web_photo_set_title (PicasaWebPhoto *self,
+ const char *value)
+{
+ g_free (self->title);
+ self->title = NULL;
+ if (value != NULL)
+ self->title = g_strdup (value);
+}
+
+
+void
+picasa_web_photo_set_summary (PicasaWebPhoto *self,
+ const char *value)
+{
+ g_free (self->summary);
+ self->summary = NULL;
+ if (value != NULL)
+ self->summary = g_strdup (value);
+}
+
+
+void
+picasa_web_photo_set_uri (PicasaWebPhoto *self,
+ const char *value)
+{
+ g_free (self->uri);
+ self->uri = NULL;
+ if (value != NULL)
+ self->uri = g_strdup (value);
+}
+
+
+void
+picasa_web_photo_set_access (PicasaWebPhoto *self,
+ const char *value)
+{
+ if (value == NULL)
+ self->access = PICASA_WEB_ACCESS_PRIVATE;
+ else if (strcmp (value, "all") == 0)
+ self->access = PICASA_WEB_ACCESS_ALL;
+ else if (strcmp (value, "private") == 0)
+ self->access = PICASA_WEB_ACCESS_PRIVATE;
+ else if (strcmp (value, "public") == 0)
+ self->access = PICASA_WEB_ACCESS_PUBLIC;
+ else if (strcmp (value, "visible") == 0)
+ self->access = PICASA_WEB_ACCESS_VISIBLE;
+ else
+ self->access = PICASA_WEB_ACCESS_PRIVATE;
+}
+
+
+void
+picasa_web_photo_set_keywords (PicasaWebPhoto *self,
+ const char *value)
+{
+ g_free (self->keywords);
+ self->keywords = NULL;
+ if (value != NULL)
+ self->keywords = g_strdup (value);
+}
diff --git a/extensions/picasaweb/picasa-web-photo.h b/extensions/picasaweb/picasa-web-photo.h
new file mode 100644
index 0000000..007c002
--- /dev/null
+++ b/extensions/picasaweb/picasa-web-photo.h
@@ -0,0 +1,82 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * GThumb
+ *
+ * Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef PICASA_WEB_PHOTO_H
+#define PICASA_WEB_PHOTO_H
+
+#include <glib.h>
+#include <glib-object.h>
+#include "picasa-web-types.h"
+
+G_BEGIN_DECLS
+
+#define PICASA_WEB_TYPE_PHOTO (picasa_web_photo_get_type ())
+#define PICASA_WEB_PHOTO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PICASA_WEB_TYPE_PHOTO, PicasaWebPhoto))
+#define PICASA_WEB_PHOTO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PICASA_WEB_TYPE_PHOTO, PicasaWebPhotoClass))
+#define PICASA_WEB_IS_PHOTO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PICASA_WEB_TYPE_PHOTO))
+#define PICASA_WEB_IS_PHOTO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PICASA_WEB_TYPE_PHOTO))
+#define PICASA_WEB_PHOTO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PICASA_WEB_TYPE_PHOTO, PicasaWebPhotoClass))
+
+typedef struct _PicasaWebPhoto PicasaWebPhoto;
+typedef struct _PicasaWebPhotoClass PicasaWebPhotoClass;
+typedef struct _PicasaWebPhotoPrivate PicasaWebPhotoPrivate;
+
+struct _PicasaWebPhoto {
+ GObject parent_instance;
+ PicasaWebPhotoPrivate *priv;
+
+ char *etag;
+ char *id;
+ char *album_id;
+ char *title;
+ char *summary;
+ char *uri;
+ PicasaWebAccess access;
+ char *keywords;
+};
+
+struct _PicasaWebPhotoClass {
+ GObjectClass parent_class;
+};
+
+GType picasa_web_photo_get_type (void);
+PicasaWebPhoto * picasa_web_photo_new (void);
+void picasa_web_photo_set_etag (PicasaWebPhoto *self,
+ const char *value);
+void picasa_web_photo_set_id (PicasaWebPhoto *self,
+ const char *value);
+void picasa_web_photo_set_album_id (PicasaWebPhoto *self,
+ const char *value);
+void picasa_web_photo_set_title (PicasaWebPhoto *self,
+ const char *value);
+void picasa_web_photo_set_summary (PicasaWebPhoto *self,
+ const char *value);
+void picasa_web_photo_set_uri (PicasaWebPhoto *self,
+ const char *value);
+void picasa_web_photo_set_access (PicasaWebPhoto *self,
+ const char *value);
+void picasa_web_photo_set_keywords (PicasaWebPhoto *self,
+ const char *value);
+
+G_END_DECLS
+
+#endif /* PICASA_WEB_PHOTO_H */
diff --git a/extensions/picasaweb/picasa-web-service.c b/extensions/picasaweb/picasa-web-service.c
index 5e8ef91..bf2fefa 100644
--- a/extensions/picasaweb/picasa-web-service.c
+++ b/extensions/picasaweb/picasa-web-service.c
@@ -25,6 +25,7 @@
#include <glib/gi18n.h>
#include <gthumb.h>
#include "picasa-web-album.h"
+#include "picasa-web-photo.h"
#include "picasa-web-service.h"
@@ -618,6 +619,123 @@ picasa_web_service_post_photos_finish (PicasaWebService *self,
}
+/* -- picasa_web_service_list_photos -- */
+
+
+static void
+list_photos_ready_cb (SoupSession *session,
+ SoupMessage *msg,
+ gpointer user_data)
+{
+ PicasaWebService *self = user_data;
+ GSimpleAsyncResult *result;
+ SoupBuffer *body;
+ DomDocument *doc;
+ GError *error = NULL;
+
+ result = google_connection_get_result (self->priv->conn);
+
+ if (msg->status_code != 200) {
+ g_simple_async_result_set_error (result,
+ SOUP_HTTP_ERROR,
+ msg->status_code,
+ "%s",
+ soup_status_get_phrase (msg->status_code));
+ g_simple_async_result_complete_in_idle (result);
+ return;
+ }
+
+ body = soup_message_body_flatten (msg->response_body);
+ doc = dom_document_new ();
+ if (dom_document_load (doc, body->data, body->length, &error)) {
+ DomElement *feed_node;
+ GList *photos = NULL;
+
+ feed_node = DOM_ELEMENT (doc)->first_child;
+ while ((feed_node != NULL) && g_strcmp0 (feed_node->tag_name, "feed") != 0)
+ feed_node = feed_node->next_sibling;
+
+ if (feed_node != NULL) {
+ DomElement *node;
+ PicasaWebPhoto *photo;
+
+ self->priv->user = picasa_web_user_new ();
+ dom_domizable_load_from_element (DOM_DOMIZABLE (self->priv->user), feed_node);
+
+ photo = NULL;
+ for (node = feed_node->first_child;
+ node != NULL;
+ node = node->next_sibling)
+ {
+ if (g_strcmp0 (node->tag_name, "entry") == 0) { /* read the photo data */
+ if (photo != NULL)
+ photos = g_list_prepend (photos, photo);
+ photo = picasa_web_photo_new ();
+ dom_domizable_load_from_element (DOM_DOMIZABLE (photo), node);
+ }
+ }
+ if (photo != NULL)
+ photos = g_list_prepend (photos, photo);
+ }
+ photos = g_list_reverse (photos);
+ g_simple_async_result_set_op_res_gpointer (result, photos, (GDestroyNotify) _g_object_list_unref);
+ }
+ else {
+ g_simple_async_result_set_from_error (result, error);
+ g_error_free (error);
+ }
+ g_simple_async_result_complete_in_idle (result);
+
+ g_object_unref (doc);
+ soup_buffer_free (body);
+}
+
+
+void
+picasa_web_service_list_photos (PicasaWebService *self,
+ PicasaWebAlbum *album,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ char *url;
+ SoupMessage *msg;
+
+ g_return_if_fail (album != NULL);
+
+ gth_task_progress (GTH_TASK (self->priv->conn), _("Getting the photo list"), NULL, TRUE, 0.0);
+
+ url = g_strconcat ("http://picasaweb.google.com/data/feed/api/user/";,
+ self->priv->user->id,
+ "/albumid/",
+ album->id,
+ NULL);
+ msg = soup_message_new ("GET", url);
+ google_connection_send_message (self->priv->conn,
+ msg,
+ cancellable,
+ callback,
+ user_data,
+ picasa_web_service_list_photos,
+ list_photos_ready_cb,
+ self);
+
+ g_free (url);
+}
+
+
+GList *
+picasa_web_service_list_photos_finish (PicasaWebService *self,
+ GAsyncResult *result,
+ GError **error)
+{
+ if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
+ return NULL;
+ else
+ return _g_object_list_ref (g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result)));
+}
+
+
/* utilities */
diff --git a/extensions/picasaweb/picasa-web-service.h b/extensions/picasaweb/picasa-web-service.h
index 231fb94..4e61053 100644
--- a/extensions/picasaweb/picasa-web-service.h
+++ b/extensions/picasaweb/picasa-web-service.h
@@ -78,6 +78,14 @@ void picasa_web_service_post_photos (PicasaWebService
gboolean picasa_web_service_post_photos_finish (PicasaWebService *self,
GAsyncResult *result,
GError **error);
+void picasa_web_service_list_photos (PicasaWebService *self,
+ PicasaWebAlbum *album,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+GList * picasa_web_service_list_photos_finish (PicasaWebService *self,
+ GAsyncResult *result,
+ GError **error);
/* utilities */
diff --git a/extensions/picasaweb/picasa-web-types.h b/extensions/picasaweb/picasa-web-types.h
new file mode 100644
index 0000000..fe2f030
--- /dev/null
+++ b/extensions/picasaweb/picasa-web-types.h
@@ -0,0 +1,33 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * GThumb
+ *
+ * Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef PICASA_WEB_TYPES_H
+#define PICASA_WEB_TYPES_H
+
+typedef enum {
+ PICASA_WEB_ACCESS_ALL,
+ PICASA_WEB_ACCESS_PRIVATE,
+ PICASA_WEB_ACCESS_PUBLIC,
+ PICASA_WEB_ACCESS_VISIBLE
+} PicasaWebAccess;
+
+#endif /* PICASA_WEB_TYPES_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]