diff options
| author | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2014-03-20 21:16:59 +0100 |
|---|---|---|
| committer | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2014-03-21 10:08:16 +0100 |
| commit | d3d5bb1dfc21ac30b77fc4484ff942d0a9100275 (patch) | |
| tree | d6398d9f762a53aea52e8685916f80ec05f8220b /src/setup.c | |
| parent | 050e064c40dafe1e90307870e02ad29815fe9f74 (diff) | |
| download | cataract-d3d5bb1dfc21ac30b77fc4484ff942d0a9100275.tar.xz | |
Make setup files versioned and add fallback for old versions
This commit makes setup files (setup.xml and referenced design
setup xml file) versioned and adds checks for correct versions.
If a newer versioned file is detected, warning is printed out
in assumption that a stray cgg version is used.
If the version information is missing or is lower than expected
version, files are read in legacy mode. Some values are left
on defaults and missing mandatory values are either read from
renamed keys or made up to suit current requirements.
This essentially brings back compatibility with old setup.xml
files that are usually part of galleries.
However, some values are hardcoded and should be kept in mind
to update and test the legacy mode along with future enhancements.
Diffstat (limited to 'src/setup.c')
| -rw-r--r-- | src/setup.c | 110 |
1 files changed, 108 insertions, 2 deletions
diff --git a/src/setup.c b/src/setup.c index 21ee839..bb69993 100644 --- a/src/setup.c +++ b/src/setup.c @@ -20,6 +20,7 @@ #include <stdlib.h> #include <errno.h> #include <unistd.h> +#include <math.h> #include <glib.h> #include <glib/gstdio.h> @@ -85,6 +86,7 @@ parse_setup_xml (const gchar *filename) setup = g_malloc0 (sizeof (TGallerySetup)); setup->setup_xml_path = g_strdup (filename); + setup->version = nearbyint (xml_file_get_node_attribute_double (xml, "/gallery_setup", "version", -1) * 100); /* design section */ setup->design_setup_file = xml_file_get_node_value (xml, "/gallery_setup/design/setup_file/text()"); @@ -132,6 +134,13 @@ parse_setup_xml (const gchar *filename) /* footer section */ setup->footer = xml_file_get_node_value (xml, "/gallery_setup/footer/text()"); + /* legacy mode */ + if (SETUP_IS_LEGACY (setup)) { + setup->design_setup_file = xml_file_get_node_value (xml, "/gallery_setup/templates/path/text()"); + setup->supplemental_files_use_common_root = xml_file_get_node_attribute_boolean (xml, "/gallery_setup/templates/support_files_use_common_root", "value", FALSE); + setup->location_base_url = xml_file_get_node_value (xml, "/gallery_setup/feed/base_url/text()"); + } + xml_parser_free (xml); return setup; } @@ -158,6 +167,7 @@ parse_design_setup_xml (const gchar *filename) return NULL; design = g_malloc0 (sizeof (TGalleryDesign)); + design->version = nearbyint (xml_file_get_node_attribute_double (xml, "/design_setup", "version", -1) * 100); s2 = xml_file_get_node_value (xml, "/design_setup/supplemental_files/text()"); if (s2) { @@ -266,6 +276,90 @@ parse_design_setup_xml (const gchar *filename) return design; } +/* + * makeup_legacy_design: create design using legacy setup.xml file + */ +TGalleryDesign * +makeup_legacy_design (const gchar *filename) +{ + TXMLFile *xml; + gchar *s; + TGalleryDesign *design; + TImageSize *image_size; + TGalleryDesignTheme *theme; + int i; + const gchar * image_sizes[3] = { "thumbnail", "preview", "original" }; + + xml = xml_parser_load (filename); + if (xml == NULL) + return NULL; + + design = g_malloc0 (sizeof (TGalleryDesign)); + + s = xml_file_get_node_value (xml, "/gallery_setup/templates/template_files/text()"); + if (s) { + design->supplemental_files = g_strsplit (s, "\n", -1); + g_free (s); + } + + /* image_sizes section */ + for (i = 0; i < G_N_ELEMENTS (image_sizes); i++) { + image_size = g_malloc0 (sizeof (TImageSize)); + image_size->name = g_strdup (image_sizes[i]); + s = g_strdup_printf ("/gallery_setup/images/%s", image_sizes[i]); + image_size->landscape_width = xml_file_get_node_attribute_long (xml, s, "landscape_w", 0); + image_size->landscape_height = xml_file_get_node_attribute_long (xml, s, "landscape_h", 0); + image_size->portrait_width = xml_file_get_node_attribute_long (xml, s, "portrait_w", 0); + image_size->portrait_height = xml_file_get_node_attribute_long (xml, s, "portrait_h", 0); + image_size->square_size = xml_file_get_node_attribute_long (xml, s, "square", 0); + image_size->quality = xml_file_get_node_attribute_long (xml, s, "quality", -1); + image_size->no_resize = (i == G_N_ELEMENTS (image_sizes) - 1); + g_free (s); + design->image_sizes = g_list_append (design->image_sizes, image_size); + } + + /* theme section */ + theme = g_malloc0 (sizeof (TGalleryDesignTheme)); + theme->enabled = TRUE; + + theme->index_template = xml_file_get_node_value (xml, "/gallery_setup/templates/index/text()"); + if (g_strcmp0 (theme->index_template, "template-index.tmpl") == 0) { + g_free (theme->index_template); + theme->index_template = g_strdup ("template_index.html"); + } + theme->index_filename = xml_file_get_node_value_with_default (xml, "/gallery_setup/templates/index_file/text()", DEFAULT_INDEX_FILENAME); + + theme->album_template = xml_file_get_node_value (xml, "/gallery_setup/templates/album/text()"); + if (g_strcmp0 (theme->album_template, "template-album.tmpl") == 0) { + g_free (theme->album_template); + theme->album_template = g_strdup ("template_album.html"); + } + theme->album_filename = xml_file_get_node_value_with_default (xml, "/gallery_setup/templates/index_file/text()", DEFAULT_INDEX_FILENAME); + theme->album_image_size = g_strdup (image_sizes[1]); + theme->album_protected_thumbnail = NULL; + + theme->picture_template = xml_file_get_node_value (xml, "/gallery_setup/templates/photo/text()"); + if (g_strcmp0 (theme->picture_template, "template-view_photo.tmpl") == 0) { + g_free (theme->picture_template); + theme->picture_template = g_strdup ("template_picture.html"); + } + theme->picture_filename = g_strdup ("%s.html"); + theme->picture_image_size = g_strdup (image_sizes[1]); + + theme->defines = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + if (xml_file_get_node_attribute_boolean (xml, "/gallery_setup/navigation/show_go_up", "value", TRUE)) + g_hash_table_replace (theme->defines, g_strdup ("SHOW_GO_UP"), g_strdup ("")); + if (xml_file_get_node_attribute_boolean (xml, "/gallery_setup/navigation/show_exif_table", "value", TRUE)) + g_hash_table_replace (theme->defines, g_strdup ("SHOW_EXIF_TABLE"), g_strdup ("")); + s = xml_file_get_node_attribute (xml, "/gallery_setup/images/border", "style"); + g_hash_table_replace (theme->defines, g_strdup ("BORDER_STYLE"), s ? s : g_strdup ("border_single")); + + design->themes = g_list_append (design->themes, theme); + + xml_parser_free (xml); + return design; +} + static gboolean lookup_image_size (TGalleryDesign *design, const gchar *image_size_name) @@ -304,6 +398,12 @@ validate_design_setup (TGalleryDesign *design) GList *l; TGalleryDesignTheme *theme; + /* check for version match */ + if (! SETUP_IS_NATIVE (design)) { + fprintf (stderr, "design validation error: version mismatch\n"); + return FALSE; + } + /* validate sizes */ if (g_list_length (design->image_sizes) == 0) { fprintf (stderr, "design validation error: no image size defined\n"); @@ -348,12 +448,18 @@ find_design_directory (TGallerySetup *setup) gchar *pth = NULL; if (IS_DIR_SEP (*setup->design_setup_file)) { - pth = g_path_get_dirname (setup->design_setup_file); + if (SETUP_IS_LEGACY (setup)) + pth = g_strdup (setup->design_setup_file); + else + pth = g_path_get_dirname (setup->design_setup_file); if (g_access (pth, R_OK) == 0) return pth; } else { base_dir = g_path_get_dirname (setup->setup_xml_path); - base_design_dir = g_path_get_dirname (setup->design_setup_file); + if (SETUP_IS_LEGACY (setup)) + base_design_dir = g_strdup (setup->design_setup_file); + else + base_design_dir = g_path_get_dirname (setup->design_setup_file); pth = g_build_path (G_DIR_SEPARATOR_S, base_dir, base_design_dir, NULL); g_free (base_dir); g_free (base_design_dir); |
