]> Pileus Git - grits/blob - src/data.c
site changing works
[grits] / src / data.c
1 #include <config.h>
2 #include <glib.h>
3 #include <gio/gio.h>
4
5 #include "data.h"
6
7 typedef struct {
8         AWeatherCacheDoneCallback callback;
9         gchar *src;
10         gchar *dst;
11         gchar *user_data;
12 } cache_file_end_t;
13
14 static void cache_file_cb(GObject *source_object, GAsyncResult *res, gpointer _info)
15 {
16         cache_file_end_t *info = _info;
17         GError *error = NULL;
18         g_file_copy_finish(G_FILE(source_object), res, &error);
19         if (error) {
20                 g_message("error copying file ([%s]->[%s]): %s",
21                         info->src, info->dst, error->message);
22         } else {
23                 info->callback(info->dst, info->user_data);
24         }
25         g_free(info->src);
26         g_free(info->dst);
27         g_free(info);
28 }
29
30 /**
31  * Cache a image from Ridge to the local disk
32  * \param  path  Path to the Ridge file, starting after /ridge/
33  * \return The local path to the cached image
34  */
35 void cache_file(char *base, char *path, AWeatherCacheDoneCallback callback, gpointer user_data)
36 {
37         gchar *url   = g_strconcat(base, path, NULL);
38         gchar *local = g_build_filename(g_get_user_cache_dir(), PACKAGE, path, NULL);
39         if (g_file_test(local, G_FILE_TEST_EXISTS)) {
40                 callback(local, user_data);
41         } else {
42                 if (!g_file_test(g_path_get_dirname(local), G_FILE_TEST_IS_DIR))
43                         g_mkdir_with_parents(g_path_get_dirname(local), 0755);
44                 cache_file_end_t *info = g_malloc0(sizeof(cache_file_end_t));
45                 info->callback  = callback;
46                 info->src       = url;
47                 info->dst       = local;
48                 info->user_data = user_data;
49                 GFile *src = g_file_new_for_uri(url);
50                 GFile *dst = g_file_new_for_path(local);
51                 g_file_copy_async(src, dst,
52                         G_FILE_COPY_OVERWRITE, // GFileCopyFlags flags,
53                         0,                     // int io_priority,
54                         NULL,                  // GCancellable *cancellable,
55                         NULL,                  // GFileProgressCallback progress_callback,
56                         NULL,                  // gpointer progress_callback_data,
57                         cache_file_cb,         // GAsyncReadyCallback callback,
58                         info);                 // gpointer user_data
59         }
60 }