From ec87d1d4538f24911b73fa41287623c3dc2f08fc Mon Sep 17 00:00:00 2001
From: David Robillard <d@drobilla.net>
Date: Wed, 21 Dec 2011 21:00:56 +0000
Subject: Merge preset and state saving.

git-svn-id: http://svn.drobilla.net/lad/trunk/jalv@3897 a436a847-0d15-0410-975c-d299462d15a1
---
 src/state.c | 87 +++++++++++++++++++++----------------------------------------
 1 file changed, 29 insertions(+), 58 deletions(-)

(limited to 'src')

diff --git a/src/state.c b/src/state.c
index a87cdb3..7d8da52 100644
--- a/src/state.c
+++ b/src/state.c
@@ -182,11 +182,15 @@ file_sink(const void* buf, size_t len, void* stream)
 	return fwrite(buf, 1, len, file);
 }
 
-void
-jalv_save(Jalv* jalv, const char* dir)
+int
+write_preset(Jalv* jalv, const char* path)
 {
-	char* const path   = strjoin(dir, "/state.ttl");
-	FILE*       out_fd = fopen(path, "w");
+	FILE* fd = fopen(path, "w");
+	if (!fd) {
+		fprintf(stderr, "error: Failed to open %s (%s)\n",
+		        path, strerror(errno));
+		return 1;
+	}
 
 	SerdEnv* env = serd_env_new(NULL);
 	serd_env_set_prefix_from_strings(env, USTR("atom"),  USTR(NS_ATOM));
@@ -210,7 +214,7 @@ jalv_save(Jalv* jalv, const char* dir)
 		env,
 		&SERD_URI_NULL,
 		file_sink,
-		out_fd);
+		fd);
 
 	serd_env_foreach(env, (SerdPrefixSink)serd_writer_set_prefix, writer);
 
@@ -254,9 +258,17 @@ jalv_save(Jalv* jalv, const char* dir)
 
 	// Close state file and clean up Serd
 	serd_writer_free(writer);
-	fclose(out_fd);
+	fclose(fd);
 	serd_env_free(env);
 
+	return 0;
+}
+
+void
+jalv_save(Jalv* jalv, const char* dir)
+{
+	char* const path = strjoin(dir, "/state.ttl");
+	write_preset(jalv, path);
 	free(path);
 }
 
@@ -551,8 +563,7 @@ jalv_save_port_values(Jalv*           jalv,
 }
 
 static int
-add_preset_to_manifest(SerdEnv*          env,
-                       const LilvPlugin* plugin,
+add_preset_to_manifest(const LilvPlugin* plugin,
                        const char*       manifest_path,
                        const char*       preset_uri,
                        const char*       preset_file);
@@ -585,56 +596,11 @@ jalv_save_preset(Jalv* jalv, const char* label)
 		goto done;
 	}
 
-	// Open preset file
-	FILE* fd = fopen((char*)path, "w");
-	if (!fd) {
-		fprintf(stderr, "error: Failed to open %s (%s)\n",
-		        path, strerror(errno));
-		ret = 3;
-		goto done;
-	}
-
-	SerdURI  base_uri;
-	SerdNode base = serd_node_new_uri_from_string((const uint8_t*)uri,
-	                                              NULL, &base_uri);
-
-	SerdEnv* env = serd_env_new(&base);
-	serd_env_set_prefix_from_strings(env, USTR("lv2"),  USTR(NS_LV2));
-	serd_env_set_prefix_from_strings(env, USTR("pset"), USTR(NS_PSET));
-	serd_env_set_prefix_from_strings(env, USTR("rdfs"), USTR(NS_RDFS));
-
 	// Write preset file
+	write_preset(jalv, path);
 
-	SerdWriter* writer = serd_writer_new(
-		SERD_TURTLE, SERD_STYLE_ABBREVIATED|SERD_STYLE_CURIED,
-		env, &base_uri,
-		file_sink,
-		fd);
-
-	serd_env_foreach(env, (SerdPrefixSink)serd_writer_set_prefix, writer);
-
-	// <> a pset:Preset
-	SerdNode s = serd_node_from_string(SERD_URI, USTR(""));
-	SerdNode p = serd_node_from_string(SERD_URI, USTR(NS_RDF "type"));
-	SerdNode o = serd_node_from_string(SERD_CURIE, USTR("pset:Preset"));
-	serd_writer_write_statement(writer, 0, NULL, &s, &p, &o, NULL, NULL);
-
-	// <> rdfs:label label
-	p = serd_node_from_string(SERD_URI, USTR(NS_RDFS "label"));
-	o = serd_node_from_string(SERD_LITERAL, USTR(label));
-	serd_writer_write_statement(writer, 0,
-	                            NULL, &s, &p, &o, NULL, NULL);
-
-	jalv_save_port_values(jalv, writer, &s);
-
-	serd_writer_free(writer);
-	serd_node_free(&base);
-
-	fclose(fd);
-	add_preset_to_manifest(env, jalv->plugin,
-	                       manifest_path, filename, filename);
-
-	serd_env_free(env);
+	// Add entry to manifest
+	add_preset_to_manifest(jalv->plugin, manifest_path, filename, filename);
 
 done:
 	free(manifest_path);
@@ -648,8 +614,7 @@ done:
 }
 
 static int
-add_preset_to_manifest(SerdEnv*          env,
-                       const LilvPlugin* plugin,
+add_preset_to_manifest(const LilvPlugin* plugin,
                        const char*       manifest_path,
                        const char*       preset_uri,
                        const char*       preset_file)
@@ -661,6 +626,11 @@ add_preset_to_manifest(SerdEnv*          env,
 		return 4;
 	}
 
+	SerdEnv* env = serd_env_new(NULL);
+	serd_env_set_prefix_from_strings(env, USTR("lv2"),   USTR(NS_LV2));
+	serd_env_set_prefix_from_strings(env, USTR("pset"),  USTR(NS_PSET));
+	serd_env_set_prefix_from_strings(env, USTR("rdfs"),  USTR(NS_RDFS));
+
 #ifdef HAVE_LOCKF
 	lockf(fileno(fd), F_LOCK, 0);
 #endif
@@ -708,6 +678,7 @@ add_preset_to_manifest(SerdEnv*          env,
 
 	fclose(fd);
 	free(manifest_uri);
+	serd_env_free(env);
 
 	return 0;
 }
-- 
cgit v1.2.1