summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/ingen/Resource.hpp34
-rw-r--r--src/client/OSCClientReceiver.cpp8
-rw-r--r--src/client/OSCEngineSender.cpp1
-rw-r--r--src/server/OSCClientSender.cpp1
-rw-r--r--src/server/OSCEngineReceiver.cpp9
5 files changed, 47 insertions, 6 deletions
diff --git a/include/ingen/Resource.hpp b/include/ingen/Resource.hpp
index 09879501..136c2df8 100644
--- a/include/ingen/Resource.hpp
+++ b/include/ingen/Resource.hpp
@@ -23,6 +23,9 @@
#include "raul/Atom.hpp"
#include "raul/URI.hpp"
+#include "raul/log.hpp"
+
+#define NS_INGEN "http://drobilla.net/software/ingen#"
namespace Ingen {
@@ -35,6 +38,37 @@ public:
INTERNAL
};
+ static Raul::URI graph_to_uri(Graph g) {
+ switch (g) {
+ default:
+ case DEFAULT:
+ return "http://drobilla.net/software/ingen#defaultContext";
+ case EXTERNAL:
+ return "http://drobilla.net/software/ingen#externalContext";
+ case INTERNAL:
+ return "http://drobilla.net/software/ingen#internalContext";
+ }
+ }
+
+ static Graph uri_to_graph(const char* uri) {
+ const size_t prefix_len = strlen("http://drobilla.net/software/ingen#");
+ if (strncmp(uri, NS_INGEN, sizeof(NS_INGEN) - 1)) {
+ return DEFAULT;
+ }
+
+ const char* suffix = uri + prefix_len;
+ if (!strcmp(suffix, "defaultContext")) {
+ return DEFAULT;
+ } else if (!strcmp(suffix, "externalContext")) {
+ return EXTERNAL;
+ } else if (!strcmp(suffix, "internalContext")) {
+ return INTERNAL;
+ }
+
+ Raul::error << "Unknown context URI " << uri << std::endl;
+ return DEFAULT;
+ }
+
class Property : public Raul::Atom {
public:
Property(const Raul::Atom& atom, Graph ctx=DEFAULT)
diff --git a/src/client/OSCClientReceiver.cpp b/src/client/OSCClientReceiver.cpp
index f854b3fb..33e2d050 100644
--- a/src/client/OSCClientReceiver.cpp
+++ b/src/client/OSCClientReceiver.cpp
@@ -173,10 +173,12 @@ int
OSCClientReceiver::_put_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
{
const char* obj_path = &argv[0]->s;
+ const char* ctx = &argv[1]->s;
Resource::Properties prop;
- for (int i = 1; i < argc-1; i += 2)
- prop.insert(make_pair(&argv[i]->s, AtomLiblo::lo_arg_to_atom(types[i+1], argv[i+1])));
- _target->put(obj_path, prop);
+ for (int i = 2; i < argc-1; i += 2)
+ prop.insert(make_pair(&argv[i]->s,
+ AtomLiblo::lo_arg_to_atom(types[i+1], argv[i+1])));
+ _target->put(obj_path, prop, Resource::uri_to_graph(ctx));
return 0;
}
diff --git a/src/client/OSCEngineSender.cpp b/src/client/OSCEngineSender.cpp
index 49b20df1..4147c831 100644
--- a/src/client/OSCEngineSender.cpp
+++ b/src/client/OSCEngineSender.cpp
@@ -109,6 +109,7 @@ OSCEngineSender::put(const Raul::URI& path,
lo_message m = lo_message_new();
lo_message_add_int32(m, next_id());
lo_message_add_string(m, path.c_str());
+ lo_message_add_string(m, Resource::graph_to_uri(ctx).c_str());
for (iterator i = properties.begin(); i != properties.end(); ++i) {
lo_message_add_string(m, i->first.c_str());
Raul::AtomLiblo::lo_message_add_atom(m, i->second);
diff --git a/src/server/OSCClientSender.cpp b/src/server/OSCClientSender.cpp
index 5095eeef..ad2e179c 100644
--- a/src/server/OSCClientSender.cpp
+++ b/src/server/OSCClientSender.cpp
@@ -118,6 +118,7 @@ OSCClientSender::put(const Raul::URI& path,
typedef Resource::Properties::const_iterator iterator;
lo_message m = lo_message_new();
lo_message_add_string(m, path.c_str());
+ lo_message_add_string(m, Resource::graph_to_uri(ctx).c_str());
for (iterator i = properties.begin(); i != properties.end(); ++i) {
lo_message_add_string(m, i->first.c_str());
Raul::AtomLiblo::lo_message_add_atom(m, i->second);
diff --git a/src/server/OSCEngineReceiver.cpp b/src/server/OSCEngineReceiver.cpp
index 08f8074e..d7f2e46b 100644
--- a/src/server/OSCEngineReceiver.cpp
+++ b/src/server/OSCEngineReceiver.cpp
@@ -332,6 +332,7 @@ OSCEngineReceiver::_get_cb(const char* path, const char* types, lo_arg** argv, i
* <h2>/put</h2>
* @arg @p response-id :: Integer
* @arg @p path :: String
+ * @arg @p context :: URI String
* @arg @p predicate :: URI String
* @arg @p value
* @arg @p ...
@@ -343,10 +344,12 @@ int
OSCEngineReceiver::_put_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
{
const char* obj_path = &argv[1]->s;
+ const char* ctx = &argv[2]->s;
Resource::Properties prop;
- for (int i = 2; i < argc-1; i += 2)
- prop.insert(make_pair(&argv[i]->s, AtomLiblo::lo_arg_to_atom(types[i+1], argv[i+1])));
- put(obj_path, prop);
+ for (int i = 3; i < argc-1; i += 2)
+ prop.insert(make_pair(&argv[i]->s,
+ AtomLiblo::lo_arg_to_atom(types[i+1], argv[i+1])));
+ put(obj_path, prop, Resource::uri_to_graph(ctx));
return 0;
}