summaryrefslogtreecommitdiff
path: root/src/setup.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/setup.c')
-rw-r--r--src/setup.c268
1 files changed, 268 insertions, 0 deletions
diff --git a/src/setup.c b/src/setup.c
new file mode 100644
index 0000000..aafd218
--- /dev/null
+++ b/src/setup.c
@@ -0,0 +1,268 @@
+/* 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 "cgg-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;
+ 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()");
+ 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()");
+ 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);
+
+ setup->nofullsize = xml_file_get_node_present (xml, "/gallery_setup/images/nofullsize");
+
+ 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);
+ 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) | 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);
+ 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);
+ free (setup);
+ setup = NULL;
+ }
+}