diff options
Diffstat (limited to 'setup.c')
| -rw-r--r-- | setup.c | 225 |
1 files changed, 225 insertions, 0 deletions
@@ -0,0 +1,225 @@ +/* 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 <errno.h> +#include <unistd.h> + +#include <libxml/xmlmemory.h> +#include <libxml/parser.h> +#include <libxml/xpath.h> +#include <libxml/xpathInternals.h> + +#include <glib.h> + +#include "config.h" +#include "gallery-utils.h" +#include "setup.h" +#include "xml-parser.h" + + + +/* + * find_setup_xml: try to find setup.xml in standard paths + */ +gboolean +find_setup_xml (TGallerySetup *setup) +{ + #define BUFFER_SIZE 65536 + + char *pth; + char *cwd; + gboolean b; + + cwd = malloc (BUFFER_SIZE); + cwd = getcwd (cwd, BUFFER_SIZE); + pth = g_strconcat (cwd, "/", SETUP_XML, NULL); + free (cwd); + + b = parse_setup_xml (pth, setup); + g_free (pth); + if (b) return TRUE; + + pth = g_strconcat (getenv ("HOME"), "/.cgg/", SETUP_XML, NULL); + b = parse_setup_xml (pth, setup); + g_free (pth); + if (b) return TRUE; + + pth = g_strconcat("/usr/share/cgg/", SETUP_XML, NULL); + b = parse_setup_xml (pth, setup); + g_free (pth); + if (b) return TRUE; + + pth = g_strconcat("/usr/local/share/cgg/", SETUP_XML, NULL); + b = parse_setup_xml (pth, setup); + g_free (pth); + return b; +} + + +/* + * parse_setup_xml: XML parser for setup.xml file + */ +gboolean +parse_setup_xml (const char *filename, TGallerySetup *setup) +{ + TXMLFile *xml; + + xml = xml_parser_load (filename); + if (xml == NULL) + return FALSE; + + /* initialize data struct */ + if (setup == NULL) + return FALSE; + memset (setup, 0, sizeof (TGallerySetup)); + setup->setup_xml_path = strdup (filename); + + setup->templates_path = xml_file_get_node_value (xml, "/gallery_setup/templates/path/text()"); + setup->template_index = xml_file_get_node_value (xml, "/gallery_setup/templates/index/text()"); + setup->template_album = xml_file_get_node_value (xml, "/gallery_setup/templates/album/text()"); + setup->template_photo = xml_file_get_node_value (xml, "/gallery_setup/templates/photo/text()"); + setup->styles = xml_file_get_node_value (xml, "/gallery_setup/templates/styles/text()"); + setup->scripts = xml_file_get_node_value (xml, "/gallery_setup/templates/scripts/text()"); + setup->thumbnail_landscape_width = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/thumbnail", "landscape_w", 0); + setup->thumbnail_landscape_height = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/thumbnail", "landscape_h", 0); + setup->thumbnail_portrait_width = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/thumbnail", "portrait_w", 0); + setup->thumbnail_portrait_height = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/thumbnail", "portrait_h", 0); + setup->thumbnail_quality = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/thumbnail", "quality", -1); + setup->preview_landscape_width = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/preview", "landscape_w", 0); + setup->preview_landscape_height = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/preview", "landscape_h", 0); + setup->preview_portrait_width = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/preview", "portrait_w", 0); + setup->preview_portrait_height = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/preview", "portrait_h", 0); + setup->preview_quality = xml_file_get_node_attribute_long (xml, "/gallery_setup/images/preview", "quality", -1); + setup->footer = xml_file_get_node_value (xml, "/gallery_setup/footer/text()"); + + xml_parser_close (xml); + + #ifdef __DEBUG_ALL__ + printf("setup: templates_path = '%s'\n", setup->templates_path); + printf("setup: template_index = '%s'\n", setup->template_index); + printf("setup: template_album = '%s'\n", setup->template_album); + printf("setup: template_photo = '%s'\n", setup->template_photo); + printf("setup: styles = '%s'\n", setup->styles); + printf("setup: scripts = '%s'\n", setup->scripts); + printf("setup: thumbnail_quality = %d\n", setup->thumbnail_quality); + printf("setup: thumbnail_landscape_width = %ld\n", setup->thumbnail_landscape_width); + printf("setup: thumbnail_landscape_height = %ld\n", setup->thumbnail_landscape_height); + printf("setup: thumbnail_portrait_width = %ld\n", setup->thumbnail_portrait_width); + printf("setup: thumbnail_portrait_height = %ld\n", setup->thumbnail_portrait_height); + printf("setup: preview_quality = %d\n", setup->preview_quality); + printf("setup: preview_landscape_width = %ld\n", setup->preview_landscape_width); + printf("setup: preview_landscape_height = %ld\n", setup->preview_landscape_height); + printf("setup: preview_portrait_width = %ld\n", setup->preview_portrait_width); + printf("setup: preview_portrait_height = %ld\n", setup->preview_portrait_height); + printf("setup: footer = '%s'\n", setup->footer); + #endif + + return TRUE; +} + + + +int +test_tmpl_access (const char *dir, const char *path) +{ + char *s; + int b; + + s = g_strconcat (dir, "/", path, NULL); + b = access (s, R_OK); + g_free (s); + return b; +} + +int +test_tmpl_files (const char *dir, TGallerySetup *setup) +{ + return test_tmpl_access (dir, setup->template_album) | test_tmpl_access (dir, setup->template_photo) | + test_tmpl_access (dir, setup->template_index) | test_tmpl_access (dir, setup->styles) | + test_tmpl_access (dir, setup->scripts); +} + +/* + * find_templates_directory: absolute/relative path checks, trying to find templates directory + * - returned string should be freed + */ +char * +find_templates_directory (TGallerySetup *setup) +{ + char *base_dir; + char *pth; + + if (IS_DIR_SEP (*setup->templates_path)) + { + #ifdef __DEBUG_ALL__ + printf("Warning: using absolute paths to templates\n"); + #endif + + if (! test_tmpl_files (setup->templates_path, setup)) + return strdup (setup->templates_path); + } + else + { + base_dir = g_path_get_dirname (setup->setup_xml_path); + pth = g_strconcat (base_dir, "/", setup->templates_path, NULL); + g_free (base_dir); + + #ifdef __DEBUG_ALL__ + printf("Warning: using relative paths to templates\n"); + #endif + + if (! test_tmpl_files (pth, setup)) + return pth; + } + + fprintf (stderr, "Couldn't find proper templates directory (tried '%s')\n", setup->templates_path); + return NULL; +} + + +/* + * free_setup_data: free allocated setup data + */ +void +free_setup_data (TGallerySetup *setup) +{ + if (setup) { + if (setup->real_templates_dir) + free (setup->real_templates_dir); + if (setup->setup_xml_path) + free (setup->setup_xml_path); + if (setup->templates_path) + free (setup->templates_path); + if (setup->template_index) + free (setup->template_index); + if (setup->template_album) + free (setup->template_album); + if (setup->template_photo) + free (setup->template_photo); + if (setup->styles) + free (setup->styles); + if (setup->scripts) + free (setup->scripts); + if (setup->footer) + free (setup->footer); + free (setup); + setup = NULL; + } +} |
