summaryrefslogtreecommitdiffstats
path: root/src/engine/events/SetMetadataEvent.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/events/SetMetadataEvent.cpp')
-rw-r--r--src/engine/events/SetMetadataEvent.cpp30
1 files changed, 18 insertions, 12 deletions
diff --git a/src/engine/events/SetMetadataEvent.cpp b/src/engine/events/SetMetadataEvent.cpp
index a41b866e..ea4e9129 100644
--- a/src/engine/events/SetMetadataEvent.cpp
+++ b/src/engine/events/SetMetadataEvent.cpp
@@ -24,6 +24,7 @@
#include "ClientBroadcaster.hpp"
#include "GraphObjectImpl.hpp"
#include "PatchImpl.hpp"
+#include "PluginImpl.hpp"
#include "EngineStore.hpp"
using namespace std;
@@ -37,14 +38,14 @@ SetMetadataEvent::SetMetadataEvent(
SharedPtr<Responder> responder,
SampleCount timestamp,
bool property,
- const Path& path,
+ const URI& subject,
const URI& key,
const Atom& value)
: QueuedEvent(engine, responder, timestamp)
, _error(NO_ERROR)
, _special_type(NONE)
, _property(property)
- , _path(path)
+ , _subject(subject)
, _key(key)
, _value(value)
, _object(NULL)
@@ -57,7 +58,11 @@ SetMetadataEvent::SetMetadataEvent(
void
SetMetadataEvent::pre_process()
{
- _object = _engine.engine_store()->find_object(_path);
+ if (_subject.scheme() == Path::scheme && Path::is_valid(_subject.str()))
+ _object = _engine.engine_store()->find_object(Path(_subject.str()));
+ else
+ _object = _engine.node_factory()->plugin(_subject);
+
if (_object == NULL) {
_error = NOT_FOUND;
QueuedEvent::pre_process();
@@ -67,10 +72,10 @@ SetMetadataEvent::pre_process()
/*cerr << "SET " << _object->path() << (_property ? " PROP " : " VAR ")
<< _key << " :: " << _value.type() << endl;*/
- if (_property)
+ if (_property || !dynamic_cast<GraphObjectImpl*>(_object))
_object->set_property(_key, _value);
else
- _object->set_variable(_key, _value);
+ dynamic_cast<GraphObjectImpl*>(_object)->set_variable(_key, _value);
_patch = dynamic_cast<PatchImpl*>(_object);
@@ -111,7 +116,8 @@ SetMetadataEvent::execute(ProcessContext& context)
if (_error != NO_ERROR)
return;
- PortImpl* port = 0;
+ PortImpl* port = 0;
+ GraphObjectImpl* object = 0;
switch (_special_type) {
case ENABLE_BROADCAST:
if ((port = dynamic_cast<PortImpl*>(_object)))
@@ -127,8 +133,9 @@ SetMetadataEvent::execute(ProcessContext& context)
}
break;
case POLYPHONIC:
- if (!_object->set_polyphonic(*_engine.maid(), _value.get_bool()))
- _error = INTERNAL;
+ if ((object = dynamic_cast<GraphObjectImpl*>(_object)))
+ if (!object->set_polyphonic(*_engine.maid(), _value.get_bool()))
+ _error = INTERNAL;
break;
case POLYPHONY:
if (!_patch->apply_internal_poly(*_engine.maid(), _value.get_int32()))
@@ -149,14 +156,13 @@ SetMetadataEvent::post_process()
case NO_ERROR:
_responder->respond_ok();
if (_property)
- _engine.broadcaster()->send_property_change(_path, _key, _value);
+ _engine.broadcaster()->send_property_change(_subject, _key, _value);
else
- _engine.broadcaster()->send_variable_change(_path, _key, _value);
+ _engine.broadcaster()->send_variable_change(_subject, _key, _value);
break;
case NOT_FOUND:
_responder->respond_error((boost::format(
- "Unable to find object '%1%' to set '%2%'")
- % _path % _key).str());
+ "Unable to find object '%1%' to set '%2%'") % _subject % _key).str());
case INTERNAL:
_responder->respond_error("Internal error");
break;