diff options
Diffstat (limited to 'src/job-manager.c')
| -rw-r--r-- | src/job-manager.c | 178 |
1 files changed, 95 insertions, 83 deletions
diff --git a/src/job-manager.c b/src/job-manager.c index c2188a9..bf3b0df 100644 --- a/src/job-manager.c +++ b/src/job-manager.c @@ -114,9 +114,10 @@ thread_func (gpointer data) gchar *imgname; gchar *s1, *s2, *s3; TJob *job = data; - gboolean updated; + gboolean needs_update; GList *l; TJobItem *job_item; + TGalleryDesignTheme *theme; do { item = NULL; @@ -137,24 +138,34 @@ thread_func (gpointer data) /* actually do some work */ if (item != NULL && job_item != NULL) { - imgname = g_path_get_basename ((item->path == NULL && item->preview) ? item->preview : item->path); - updated = generate_image (job->setup, job->items, item, job_item->real_index, job->path_info, ! job->force_update); + imgname = GET_ITEM_TARGET_FILENAME (item); + /* Two-pass check whether images need to be updated. First check does no I/O except of stat() calls. */ + needs_update = job->force_update; + if (! needs_update) + needs_update = generate_image (job->setup, job->items, item, job_item->real_index, job->path_info, TRUE); + if (needs_update) + generate_image (job->setup, job->items, item, job_item->real_index, job->path_info, FALSE); - if (updated && job->setup->verbose) { + if (needs_update && job->setup->verbose) { G_LOCK (items_print); g_print (" [%d/%d] Processing item \"%s\"\n", job_item->index, job->total_items, imgname); G_UNLOCK (items_print); } - if (updated && job->items->type == GALLERY_TYPE_ALBUM) { - s1 = g_build_filename (job->setup->real_templates_dir, job->setup->template_photo, NULL); - s2 = g_strconcat (imgname, GET_EXT (job->setup->index_file_name), NULL); - s3 = g_build_filename (job->path_info->dest_dir, s2, NULL); - write_html_image (job->setup, job->path_info, s1, s3, item, job->items); - g_free (s1); - g_free (s2); - g_free (s3); - } + if (needs_update && job->items->type == GALLERY_TYPE_ALBUM) + for (l = g_list_first (job->setup->design->themes); l; l = g_list_next (l)) { + theme = l->data; + /* Do not generate particular image pages when theme doesn't define it */ + if (theme->enabled && theme->picture_template && theme->picture_filename) { + s1 = g_build_filename (job->path_info->templates_root, theme->picture_template, NULL); + s2 = g_strdup_printf (theme->picture_filename, imgname); + s3 = g_build_filename (job->path_info->dest_dir, s2, NULL); + write_html_image (job->setup, job->path_info, theme, s1, s3, item, job->items); + g_free (s1); + g_free (s2); + g_free (s3); + } + } g_free (imgname); } @@ -182,13 +193,7 @@ build_tree (TGallerySetup *setup, gchar *idx_file; TAlbum *items; TIndexItem *item; - gchar *s1, *s2, *s3; - gchar *thumb_dir; - gchar *img_big_dir; - gchar *img_orig_dir; - const gchar *template; - gchar *dst_album_file; - gboolean res; + gchar *s1, *s2, *s3, *s4; int i; TJob *job; GError *error; @@ -199,6 +204,9 @@ build_tree (TGallerySetup *setup, GList *job_items; GList *l; TPathInfo *child_path_info; + TGalleryDesignTheme *theme; + TImageSize *image_size; + printf ("Processing directory \"%s\"\n", path_info->src_dir); stats_dirs_inc (); @@ -233,15 +241,17 @@ build_tree (TGallerySetup *setup, items->parent_index = parent_index; items->parent_item_index = parent_item_index; - /* Check if update is necessary */ - dst_album_file = g_build_filename (path_info->dest_dir, setup->index_file_name, NULL); - force_update = (! setup->update_mode || needs_update (idx_file, dst_album_file)); - g_free (idx_file); - /* Copy support files */ - if (! setup->support_files_use_common_root || parent_index == NULL) { + if (! setup->supplemental_files_use_common_root || parent_index == NULL) { /* copy only if we're in root level or old-style is active */ - mirror_files (setup, setup->template_files, setup->real_templates_dir, path_info->dest_dir, " Copying template files: "); + mirror_files (setup, setup->design->supplemental_files, path_info->templates_root, path_info->dest_dir, " Copying global theme supplemental files: "); + + for (l = g_list_first (setup->design->themes); l; l = g_list_next (l)) { + theme = l->data; + g_assert (theme != NULL); + if (theme->enabled) + mirror_files (setup, theme->supplemental_files, path_info->templates_root, path_info->dest_dir, " Copying theme supplemental files: "); + } /* favicon */ if (setup->favicon_file && strlen (setup->favicon_file) > 0) { @@ -258,41 +268,45 @@ build_tree (TGallerySetup *setup, } } - /* Prepare target thumbnail directory */ - thumb_dir = g_build_path (G_DIR_SEPARATOR_S, path_info->dest_dir, setup->thumbnail_dir, NULL); - if (access (thumb_dir, R_OK | W_OK | X_OK)) - if (g_mkdir_with_parents (thumb_dir, DEFAULT_DATA_DIR_MODE)) { - log_error ("error making target thumbnail directory: %s\n", strerror (errno)); - g_free (thumb_dir); - g_free (dst_album_file); - free_album_data (items); - return FALSE; + /* Copy extra files */ + mirror_files (setup, items->extra_files, path_info->src_dir, path_info->dest_dir, " Copying extra files: "); + + /* Prepare target image directories */ + for (l = g_list_first (setup->design->image_sizes); l; l = g_list_next (l)) { + image_size = l->data; + g_assert (image_size != NULL); + /* We don't allow having single pictures in index pages at the moment, might change in the future */ + if (items->type != GALLERY_TYPE_INDEX || g_ascii_strcasecmp (image_size->name, "thumbnail") == 0) { + s1 = g_strdup_printf ("%s%s", TARGET_IMAGE_DIR_PREFIX, image_size->name); + s2 = g_build_path (G_DIR_SEPARATOR_S, path_info->dest_dir, s1, NULL); + g_free (s1); + if (access (s2, R_OK | W_OK | X_OK)) + if (g_mkdir_with_parents (s2, DEFAULT_DATA_DIR_MODE)) { + log_error ("error making target image directory '%s': %s\n", s2, strerror (errno)); + g_free (s2); + free_album_data (items); + return FALSE; + } + g_free (s2); } - g_free (thumb_dir); - - /* Prepare target preview and orig directories */ - if (items->type == GALLERY_TYPE_ALBUM) { - res = TRUE; - img_big_dir = g_build_path (G_DIR_SEPARATOR_S, path_info->dest_dir, setup->img_big_dir, NULL); - img_orig_dir = g_build_path (G_DIR_SEPARATOR_S, path_info->dest_dir, setup->img_orig_dir, NULL); - if (access (img_big_dir, R_OK | W_OK | X_OK)) - if (g_mkdir_with_parents (img_big_dir, DEFAULT_DATA_DIR_MODE)) { - log_error ("error making target preview directory: %s\n", strerror (errno)); - res = FALSE; - } - if (access (img_orig_dir, R_OK | W_OK | X_OK)) - if (g_mkdir_with_parents (img_orig_dir, DEFAULT_DATA_DIR_MODE)) { - log_error ("error making target full size directory: %s\n", strerror (errno)); - res = FALSE; + } + + /* Check if update of whole album/index is necessary */ + force_update = ! setup->update_mode; + if (! force_update) + for (l = g_list_first (setup->design->themes); l; l = g_list_next (l)) { + theme = l->data; + g_assert (theme != NULL); + if (theme->enabled) { + s1 = (items->type == GALLERY_TYPE_ALBUM || ! theme->index_filename) ? theme->album_filename : theme->index_filename; + s2 = g_build_filename (path_info->dest_dir, s1, NULL); + force_update = needs_update (idx_file, s2); + g_free (s2); } - g_free (img_big_dir); - g_free (img_orig_dir); - if (! res) { - g_free (dst_album_file); - free_album_data (items); - return FALSE; + if (force_update) + break; } - } + g_free (idx_file); /* Prepare job manager structures */ job = g_malloc0 (sizeof (TJob)); @@ -356,28 +370,28 @@ build_tree (TGallerySetup *setup, g_list_free (job_items); /* Generate album page */ - if (force_update) { - if (items->type == GALLERY_TYPE_INDEX) - template = setup->template_index; - else - if (items->type == GALLERY_TYPE_ALBUM) - template = setup->template_album; - else - /* default to album */ - template = setup->template_album; - - if (setup->verbose) printf (" Writing %s\n", setup->index_file_name); - s1 = g_build_filename (setup->real_templates_dir, template, NULL); - res = write_html_album (setup, path_info, s1, dst_album_file, items); - g_free (s1); - if (! res) { - log_error ("error generating target index file\n"); - free_album_data (items); - return FALSE; + if (force_update) + for (l = g_list_first (setup->design->themes); l; l = g_list_next (l)) { + theme = l->data; + g_assert (theme != NULL); + if (theme->enabled) { + if (items->type == GALLERY_TYPE_ALBUM || ! theme->index_template) { + s1 = theme->album_template; + s2 = theme->album_filename; + } else { + s1 = theme->index_template; + s2 = theme->index_filename; + } + if (setup->verbose) + printf (" Writing %s\n", s2); + s3 = g_build_filename (path_info->templates_root, s1, NULL); + s4 = g_build_filename (path_info->dest_dir, s2, NULL); + if (! write_html_album (setup, path_info, theme, s3, s4, items)) + log_error ("error generating target index file\n"); + g_free (s3); + g_free (s4); + } } - } - g_free (dst_album_file); - /* Recurse to sub-albums (in case of album index) */ if (items->type == GALLERY_TYPE_INDEX) { @@ -390,6 +404,7 @@ build_tree (TGallerySetup *setup, } if (item->type == INDEX_ITEM_TYPE_PICTURE) { child_path_info = g_malloc0 (sizeof (TPathInfo)); + child_path_info->templates_root = g_strdup (path_info->templates_root); child_path_info->source_root = g_strdup (path_info->source_root); child_path_info->dest_root = g_strdup (path_info->dest_root); child_path_info->src_dir = g_build_path (G_DIR_SEPARATOR_S, path_info->src_dir, item->path, NULL); @@ -402,9 +417,6 @@ build_tree (TGallerySetup *setup, } } - /* Copy extra files */ - mirror_files (setup, items->extra_files, path_info->src_dir, path_info->dest_dir, " Copying extra files: "); - free_album_data (items); return TRUE; } |
