2 * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 2014-2015 Ricardo Mones and the Claws Mail Team
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "libravatar_cache.h"
24 #include "file-utils.h"
27 gchar *libravatar_cache_init(const char *dirs[], gint start, gint end)
29 gchar *subdir, *rootdir;
32 rootdir = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
33 LIBRAVATAR_CACHE_DIR, G_DIR_SEPARATOR_S,
35 if (!is_dir_exist(rootdir)) {
36 if (make_dir(rootdir) < 0) {
37 g_warning("cannot create root directory '%s'", rootdir);
42 for (i = start; i <= end; ++i) {
43 subdir = g_strconcat(rootdir, dirs[i], NULL);
44 if (!is_dir_exist(subdir)) {
45 if (make_dir(subdir) < 0) {
46 g_warning("cannot create directory '%s'", subdir);
58 static void cache_stat_item(gpointer filename, gpointer data)
61 const gchar *fname = (const gchar *) filename;
62 AvatarCacheStats *stats = (AvatarCacheStats *) data;
64 if (0 == g_stat(fname, &s)) {
65 if (S_ISDIR(s.st_mode) != 0) {
68 else if (S_ISREG(s.st_mode) != 0) {
70 stats->bytes += s.st_size;
77 g_warning("cannot stat '%s'", fname);
82 static void cache_items_deep_first(const gchar *dir, GSList **items, guint *failed)
88 cm_return_if_fail(dir != NULL);
90 if ((dp = g_dir_open(dir, 0, &error)) == NULL) {
91 g_warning("cannot open directory '%s': %s (%d)",
92 dir, error->message, error->code);
97 while ((d = g_dir_read_name(dp)) != NULL) {
98 if (strcmp(d, ".") == 0 || strcmp(d, "..") == 0) {
102 const gchar *fname = g_strconcat(dir, G_DIR_SEPARATOR_S, d, NULL);
103 if (is_dir_exist(fname))
104 cache_items_deep_first(fname, items, failed);
105 *items = g_slist_append(*items, (gpointer) fname);
111 AvatarCacheStats *libravatar_cache_stats()
114 AvatarCacheStats *stats;
115 GSList *items = NULL;
118 stats = g_new0(AvatarCacheStats, 1);
119 cm_return_val_if_fail(stats != NULL, NULL);
121 rootdir = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
122 LIBRAVATAR_CACHE_DIR, G_DIR_SEPARATOR_S,
124 cache_items_deep_first(rootdir, &items, &errors);
125 stats->errors += errors;
126 g_slist_foreach(items, (GFunc) cache_stat_item, (gpointer) stats);
127 slist_free_strings_full(items);
133 static void cache_delete_item(gpointer filename, gpointer errors)
135 const gchar *fname = (const gchar *) filename;
136 AvatarCleanupResult *acr = (AvatarCleanupResult *) errors;
138 if (!is_dir_exist(fname)) {
139 if (claws_unlink(fname) < 0) {
140 g_warning("couldn't delete file '%s'", fname);
149 AvatarCleanupResult *libravatar_cache_clean()
152 AvatarCleanupResult *acr;
153 GSList *items = NULL;
156 acr = g_new0(AvatarCleanupResult, 1);
157 cm_return_val_if_fail(acr != NULL, NULL);
159 rootdir = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
160 LIBRAVATAR_CACHE_DIR, G_DIR_SEPARATOR_S,
162 cache_items_deep_first(rootdir, &items, &errors);
163 acr->e_stat = (gint) errors;
165 g_slist_foreach(items, (GFunc) cache_delete_item, (gpointer) acr);
167 slist_free_strings_full(items);