+
+static void memstore_submit(gpointer s, BlueSkyStoreAsync *async)
+{
+ g_return_if_fail(async->status == ASYNC_NEW);
+ g_return_if_fail(async->op != STORE_OP_NONE);
+
+ switch (async->op) {
+ case STORE_OP_GET:
+ async->data = memstore_get(s, async->key);
+ break;
+
+ case STORE_OP_PUT:
+ memstore_put(s, async->key, async->data);
+ break;
+
+ default:
+ g_warning("Uknown operation type for MemStore: %d\n", async->op);
+ return;
+ }
+
+ bluesky_store_async_mark_complete(async);
+}
+
+static void memstore_cleanup(gpointer store, BlueSkyStoreAsync *async)
+{
+}
+
+static BlueSkyStoreImplementation memstore_impl = {
+ .create = memstore_create,
+ .destroy = memstore_destroy,
+ .submit = memstore_submit,
+ .cleanup = memstore_cleanup,
+};
+
+/* Store implementation which writes data as files to disk. */
+static gpointer filestore_create()
+{
+ return GINT_TO_POINTER(1);
+}
+
+static void filestore_destroy()
+{
+}
+
+static BlueSkyRCStr *filestore_get(const gchar *key)
+{
+ gchar *contents = NULL;
+ gsize length;
+ GError *error = NULL;
+
+ g_file_get_contents(key, &contents, &length, &error);
+ if (contents == NULL)
+ return NULL;
+
+ return bluesky_string_new(contents, length);
+}
+
+static void filestore_put(const gchar *key, BlueSkyRCStr *val)
+{
+ g_file_set_contents(key, val->data, val->len, NULL);
+}
+
+static void filestore_submit(gpointer s, BlueSkyStoreAsync *async)
+{
+ g_return_if_fail(async->status == ASYNC_NEW);
+ g_return_if_fail(async->op != STORE_OP_NONE);
+
+ switch (async->op) {
+ case STORE_OP_GET:
+ async->data = filestore_get(async->key);
+ break;
+
+ case STORE_OP_PUT:
+ filestore_put(async->key, async->data);
+ break;
+
+ default:
+ g_warning("Uknown operation type for FileStore: %d\n", async->op);
+ return;
+ }
+
+ bluesky_store_async_mark_complete(async);
+}
+
+static void filestore_cleanup(gpointer store, BlueSkyStoreAsync *async)
+{
+}
+
+static BlueSkyStoreImplementation filestore_impl = {
+ .create = filestore_create,
+ .destroy = filestore_destroy,
+ .submit = filestore_submit,
+ .cleanup = filestore_cleanup,
+};
+
+void bluesky_store_init()
+{
+ store_implementations = g_hash_table_new(g_str_hash, g_str_equal);
+ notifier_thread_pool = g_thread_pool_new(notifier_task, NULL, -1, FALSE,
+ NULL);
+ bluesky_store_register(&memstore_impl, "mem");
+ bluesky_store_register(&filestore_impl, "file");
+}