summaryrefslogtreecommitdiff
path: root/items.c
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@users.sourceforge.net>2008-07-27 19:13:28 +0200
committerTomas Bzatek <tbzatek@users.sourceforge.net>2008-07-27 19:13:28 +0200
commit510fff156db65795cbf211e7910a67fb316cb404 (patch)
treedfbec486ffeab2d6886f9f51863f723a2d5cd574 /items.c
downloadcataract-510fff156db65795cbf211e7910a67fb316cb404.tar.xz
Initial commitv0.99.0
Diffstat (limited to 'items.c')
-rw-r--r--items.c203
1 files changed, 203 insertions, 0 deletions
diff --git a/items.c b/items.c
new file mode 100644
index 0000000..c1e1564
--- /dev/null
+++ b/items.c
@@ -0,0 +1,203 @@
+/* Cataract - Static web photo gallery generator
+ * Copyright (C) 2008 Tomas Bzatek <tbzatek@users.sourceforge.net>
+ *
+ * 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <libxml/xmlmemory.h>
+#include <libxml/parser.h>
+#include <libxml/xpath.h>
+#include <libxml/xpathInternals.h>
+
+#include "items.h"
+#include "xml-parser.h"
+
+
+
+/*
+ * parse_album_xml: XML parser for gallery index.xml files
+ */
+gboolean
+parse_album_xml (const char *filename, TAlbum *index)
+{
+ TXMLFile *xml;
+ char *gallery_type;
+ int count;
+ int i;
+ char *s;
+ TIndexItem *item;
+
+ xml = xml_parser_load (filename);
+ if (xml == NULL)
+ return FALSE;
+
+ /* Initialize data struct */
+ if (index == NULL)
+ index = malloc (sizeof (TAlbum));
+ memset (index, 0, sizeof (TAlbum));
+
+ index->base_dir = g_path_get_dirname (filename);
+
+ /* Retrieve gallery type */
+ gallery_type = xml_file_get_node_attribute (xml, "/gallery", "type");
+ #ifdef __DEBUG_ALL__
+ printf("gallery_type = %s\n", gallery_type);
+ #endif
+ if (strcmp (gallery_type, "index") == 0)
+ index->type = GALLERY_TYPE_INDEX;
+ else
+ if (strcmp (gallery_type, "album") == 0)
+ index->type = GALLERY_TYPE_ALBUM;
+ else {
+ printf ("Invalid gallery type (%s)\n", gallery_type);
+ free (index);
+ return FALSE;
+ }
+
+ /* Section General */
+ index->ID = xml_file_get_node_value (xml, "/gallery/general/ID/text()");
+ index->title = xml_file_get_node_value (xml, "/gallery/general/title/text()");
+ index->desc = xml_file_get_node_value (xml, "/gallery/general/description/text()");
+
+ index->quality = xml_file_get_node_attribute_long (xml, "/gallery/general/images", "quality", -1);
+ index->landscape_width = xml_file_get_node_attribute_long (xml, "/gallery/general/images", "landscape_w", 0);
+ index->landscape_height = xml_file_get_node_attribute_long (xml, "/gallery/general/images", "landscape_h", 0);
+ index->portrait_width = xml_file_get_node_attribute_long (xml, "/gallery/general/images", "portrait_w", 0);
+ index->portrait_height = xml_file_get_node_attribute_long (xml, "/gallery/general/images", "portrait_h", 0);
+
+ /* Section Items */
+ count = xml_file_node_get_children_count (xml, "/gallery/items/item");
+ index->items = g_ptr_array_new();
+
+ for (i = 0; i < count; i++)
+ {
+ item = malloc (sizeof (TIndexItem));
+ memset (item, 0, sizeof (TIndexItem));
+
+ s = g_strdup_printf ("/gallery/items/item[%d]", i + 1);
+ if (index->type == GALLERY_TYPE_INDEX)
+ item->path = xml_file_get_node_attribute (xml, s, "path");
+ else
+ item->path = xml_file_get_node_attribute (xml, s, "src");
+ item->preview = xml_file_get_node_attribute (xml, s, "preview");
+ item->quality = xml_file_get_node_attribute_long (xml, s, "quality", -1);
+ item->width = xml_file_get_node_attribute_long (xml, s, "width", 0);
+ item->height = xml_file_get_node_attribute_long (xml, s, "height", 0);
+ g_free (s);
+
+ s = g_strdup_printf ("/gallery/items/item[%d]/title/text()", i + 1);
+ item->title = xml_file_get_node_value (xml, s);
+ g_free (s);
+
+ s = g_strdup_printf ("/gallery/items/item[%d]/title_description/text()", i + 1);
+ item->title_description = xml_file_get_node_value (xml, s);
+ g_free (s);
+
+ s = g_strdup_printf ("/gallery/items/item[%d]/thumbnail", i + 1);
+ item->thumbnail = xml_file_get_node_attribute (xml, s, "src");
+ g_free (s);
+
+ s = g_strdup_printf ("/gallery/items/item[%d]/nofullsize", i + 1);
+ item->nofullsize = xml_file_get_node_present (xml, s);
+ g_free (s);
+
+ g_ptr_array_add (index->items, item);
+ }
+
+ xml_parser_close (xml);
+
+ /* Print the items */
+ #ifdef __DEBUG_ALL__
+ printf("ID = '%s'\ntitle = '%s'\ndescription = '%s'\n", index->ID, index->title, index->desc);
+ for (i = 0; i < index->items->len; i++) {
+ TIndexItem *item = g_ptr_array_index(index->items, i);
+ printf("item %d: path = '%s', title = '%s', title_description = '%s', thumbnail = '%s'\n",
+ i, item->path, item->title, item->title_description, item->thumbnail);
+ }
+ #endif
+ return TRUE;
+}
+
+
+/*
+ * free_album_data: free allocated album data
+ */
+void
+free_album_data (TAlbum *album)
+{
+ if (album) {
+ if (album->ID)
+ free (album->ID);
+ if (album->title)
+ free (album->title);
+ if (album->desc)
+ free (album->desc);
+ if (album->base_dir)
+ free (album->base_dir);
+
+ if (album->items) {
+ if (album->items->len > 0) {
+ TIndexItem *item;
+ int i;
+
+ for (i = 0; i < album->items->len; i++) {
+ item = g_ptr_array_index (album->items, i);
+ if (item != NULL) {
+ if (item->path)
+ free (item->path);
+ if (item->title)
+ free (item->title);
+ if (item->title_description)
+ free (item->title_description);
+ if (item->thumbnail)
+ free (item->thumbnail);
+ if (item->preview)
+ free (item->preview);
+ free (item);
+ }
+ }
+ }
+ g_ptr_array_free (album->items, TRUE);
+ }
+ free (album);
+ album = NULL;
+ }
+}
+
+
+/*
+ * get_gallery_objects_count: retrieve number of items in specified album
+ */
+int
+get_album_objects_count (const char *filename)
+{
+ TXMLFile *xml;
+ int count;
+
+ xml = xml_parser_load (filename);
+ if (xml == NULL)
+ return 0;
+
+ count = xml_file_node_get_children_count (xml, "/gallery/items/item");
+ xml_parser_close (xml);
+
+ #ifdef __DEBUG_ALL__
+ printf ("get_objects_count(%s) = %d\n", filename, count);
+ #endif
+ return count;
+}