Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <libaudcore/vfs_async.h>
00022
00023 typedef struct {
00024 gchar *filename;
00025 void *buf;
00026 gint64 size;
00027 GThread *thread;
00028 gpointer userdata;
00029
00030 VFSConsumer cons_f;
00031 } VFSAsyncTrampoline;
00032
00033 gboolean
00034 vfs_async_file_get_contents_trampoline(gpointer data)
00035 {
00036 VFSAsyncTrampoline *tr = data;
00037
00038 tr->cons_f(tr->buf, tr->size, tr->userdata);
00039 g_slice_free(VFSAsyncTrampoline, tr);
00040
00041 return FALSE;
00042 }
00043
00044 gpointer
00045 vfs_async_file_get_contents_worker(gpointer data)
00046 {
00047 VFSAsyncTrampoline *tr = data;
00048
00049 vfs_file_get_contents(tr->filename, &tr->buf, &tr->size);
00050
00051 g_idle_add_full(G_PRIORITY_HIGH_IDLE, vfs_async_file_get_contents_trampoline, tr, NULL);
00052 g_thread_exit(NULL);
00053 return NULL;
00054 }
00055
00056 void
00057 vfs_async_file_get_contents(const gchar *filename, VFSConsumer cons_f, gpointer userdata)
00058 {
00059 VFSAsyncTrampoline *tr;
00060
00061 tr = g_slice_new0(VFSAsyncTrampoline);
00062 tr->filename = g_strdup(filename);
00063 tr->cons_f = cons_f;
00064 tr->userdata = userdata;
00065 tr->thread = g_thread_create(vfs_async_file_get_contents_worker, tr, FALSE, NULL);
00066 }