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