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
);