From 510fff156db65795cbf211e7910a67fb316cb404 Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sun, 27 Jul 2008 19:13:28 +0200 Subject: Initial commit --- items.c | 203 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 items.c (limited to 'items.c') 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 + * + * 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 +#include +#include + +#include +#include +#include +#include + +#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; +} -- cgit v1.2.3