namespace ARDOUR {
-static map<PBD::ID, Stateful*> registry;
-
-void Session::register_with_memento_command_factory(PBD::ID id, Stateful *ptr)
+void Session::register_with_memento_command_factory(PBD::ID id, StatefulDestructible *ptr)
{
registry[id] = ptr;
}
{
PBD::ID id;
XMLNode *before = 0, *after = 0;
+ XMLNode *child;
/* get id */
id = PBD::ID(n->property("obj_id")->value());
/* get before/after */
if (n->name() == "MementoCommand")
{
- before = n->children().front();
- after = n->children().back();
+ before = new XMLNode(*n->children().front());
+ after = new XMLNode(*n->children().back());
+ child = before;
} else if (n->name() == "MementoUndoCommand")
- before = n->children().front();
+ {
+ before = new XMLNode(*n->children().front());
+ child = before;
+ }
else if (n->name() == "MementoRedoCommand")
- after = n->children().front();
+ {
+ after = new XMLNode(*n->children().front());
+ child = after;
+ }
+
+ if (!child)
+ {
+ error << _("Tried to reconstitute a MementoCommand with no contents, failing. id=") << id.to_s() << endmsg;
+ return 0;
+ }
/* create command */
return new MementoCommand<TempoMap>(*_tempo_map, before, after);
else if (obj_T == "Playlist" || obj_T == "AudioPlaylist")
{
- if (Playlist *pl = playlist_by_name(before->property("name")->value()))
+ if (Playlist *pl = playlist_by_name(child->property("name")->value()))
return new MementoCommand<Playlist>(*pl, before, after);
}
else if (obj_T == "Route") // inlcudes AudioTrack
return new MementoCommand<Route>(*route_by_id(id), before, after);
- // For Editor and AutomationLine which are off-limits here
- else if (registry.count(id))
- return new MementoCommand<Stateful>(*registry[id], before, after);
else if (obj_T == "Curve")
{
if (curves.count(id))
if (automation_lists.count(id))
return new MementoCommand<AutomationList>(*automation_lists[id], before, after);
}
+ // For Editor and AutomationLine which are off-limits here
+ else if (registry.count(id))
+ return new MementoCommand<StatefulDestructible>(*registry[id], before, after);
+
/* we failed */
error << _("could not reconstitute MementoCommand from XMLNode. id=") << id.to_s() << endmsg;