/* 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 #include #include #include #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 (DATADIR, "/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; char *s; 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()"); s = xml_file_get_node_value (xml, "/gallery_setup/templates/template_files/text()"); if (s) { setup->template_files = g_strsplit (s, "\n", -1); free (s); } s = xml_file_get_node_attribute (xml, "/gallery_setup/templates/support_files_use_common_root", "value"); setup->support_files_use_common_root = s ? strcasecmp (s, "yes") == 0 : FALSE; /* default to FALSE */ if (s) g_free (s); setup->index_file_name = xml_file_get_node_value (xml, "/gallery_setup/templates/index_file/text()"); if (setup->index_file_name == NULL || strlen (setup->index_file_name) == 0) setup->index_file_name = strdup (DEFAULT_INDEX_FILENAME); setup->thumbnail_dir = xml_file_get_node_value (xml, "/gallery_setup/images/thumbnail_dir/text()"); if (setup->thumbnail_dir == NULL || strlen (setup->thumbnail_dir) == 0) setup->thumbnail_dir = strdup (DEFAULT_THUMBNAIL_DIR); setup->img_big_dir = xml_file_get_node_value (xml, "/gallery_setup/images/preview_dir/text()"); if (setup->img_big_dir == NULL || strlen (setup->img_big_dir) == 0) setup->img_big_dir = strdup (DEFAULT_IMG_BIG_DIR); setup->img_orig_dir = xml_file_get_node_value (xml, "/gallery_setup/images/original_dir/text()"); if (setup->img_orig_dir == NULL || strlen (setup->img_orig_dir) == 0) setup->img_orig_dir = strdup (DEFAULT_IMG_ORIG_DIR); setup->thumbnail_name_format = xml_file_get_node_value (xml, "/gallery_setup/images/thumbnail_name_format/text()"); if (setup->thumbnail_name_format == NULL || strlen (setup->thumbnail_name_format) == 0 || strstr (setup->thumbnail_name_format, "%s") == NULL) setup->thumbnail_name_format = strdup (DEFAULT_THUMBNAIL_NAME_FORMAT); 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()"); setup->border_style = xml_file_get_node_attribute (xml, "/gallery_setup/images/border", "style"); setup->meta_author = xml_file_get_node_value (xml, "/gallery_setup/meta/author/text()"); setup->meta_description = xml_file_get_node_value (xml, "/gallery_setup/meta/description/text()"); setup->meta_keywords = xml_file_get_node_value (xml, "/gallery_setup/meta/keywords/text()"); s = xml_file_get_node_attribute (xml, "/gallery_setup/images/preload", "value"); setup->preload = s ? strcasecmp (s, "yes") == 0 : TRUE; /* default to TRUE */ if (s) g_free (s); s = xml_file_get_node_attribute (xml, "/gallery_setup/images/use_iptc_exif", "value"); setup->use_iptc_exif = s ? strcasecmp (s, "yes") == 0 : FALSE; /* default to FALSE */ if (s) g_free (s); s = xml_file_get_node_attribute (xml, "/gallery_setup/images/erase_embed_thumbnail", "value"); setup->erase_exif_thumbnail = s ? strcasecmp (s, "yes") == 0 : FALSE; /* default to FALSE */ if (s) g_free (s); s = xml_file_get_node_attribute (xml, "/gallery_setup/meta/use_title_as_meta", "value"); setup->use_title_as_meta = s ? strcasecmp (s, "yes") == 0 : TRUE; /* default to TRUE */ if (s) g_free (s); setup->site_title = xml_file_get_node_attribute (xml, "/gallery_setup/meta/site", "title"); setup->add_copyright = xml_file_get_node_value (xml, "/gallery_setup/meta/add_copyright/text()"); s = xml_file_get_node_attribute (xml, "/gallery_setup/navigation/use_inpage_links", "value"); setup->use_inpage_links = s ? strcasecmp (s, "yes") == 0 : TRUE; /* default to TRUE */ if (s) g_free (s); s = xml_file_get_node_attribute (xml, "/gallery_setup/navigation/show_go_up", "value"); setup->show_go_up = s ? strcasecmp (s, "yes") == 0 : TRUE; /* default to TRUE */ if (s) g_free (s); s = xml_file_get_node_attribute (xml, "/gallery_setup/navigation/show_exif_table", "value"); setup->show_exif_table = s ? strcasecmp (s, "yes") == 0 : TRUE; /* default to TRUE */ if (s) g_free (s); setup->nofullsize = xml_file_get_node_present (xml, "/gallery_setup/images/nofullsize"); setup->favicon_file = xml_file_get_node_value (xml, "/gallery_setup/meta/favicon/text()"); setup->favicon_type = xml_file_get_node_attribute (xml, "/gallery_setup/meta/favicon", "type"); 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: 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); printf("setup: border_style = '%s'\n", setup->border_style); printf("setup: meta_author = '%s'\n", setup->meta_author); printf("setup: meta_description = '%s'\n", setup->meta_description); printf("setup: meta_keywords = '%s'\n", setup->meta_keywords); printf("setup: preload = %d\n", setup->preload); printf("setup: use_iptc_exif = %d\n", setup->use_iptc_exif); printf("setup: erase_exif_thumbnail = %d\n", setup->erase_exif_thumbnail); #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); } /* * 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; } log_error ("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->template_files) g_strfreev (setup->template_files); if (setup->index_file_name) free (setup->index_file_name); if (setup->footer) free (setup->footer); if (setup->meta_author) free (setup->meta_author); if (setup->border_style) free (setup->border_style); if (setup->site_title) free (setup->site_title); if (setup->add_copyright) free (setup->add_copyright); if (setup->favicon_file) free (setup->favicon_file); if (setup->favicon_type) free (setup->favicon_type); if (setup->thumbnail_dir) free (setup->thumbnail_dir); if (setup->img_big_dir) free (setup->img_big_dir); if (setup->img_orig_dir) free (setup->img_orig_dir); if (setup->thumbnail_name_format) free (setup->thumbnail_name_format); free (setup); setup = NULL; } }