From 2cc45edfbdfddb485731db57ef3ecf8b0f18bde0 Mon Sep 17 00:00:00 2001 From: brunoherbelin Date: Sat, 23 May 2020 15:27:56 +0200 Subject: [PATCH] Saving and loading of Clone Sources. --- SessionCreator.cpp | 32 ++++++++++++++++++++++++++------ SessionCreator.h | 1 - SessionVisitor.cpp | 10 ++++++++++ SessionVisitor.h | 1 + Source.h | 3 ++- 5 files changed, 39 insertions(+), 8 deletions(-) diff --git a/SessionCreator.cpp b/SessionCreator.cpp index c69c6d3..72b227a 100644 --- a/SessionCreator.cpp +++ b/SessionCreator.cpp @@ -88,6 +88,32 @@ void SessionCreator::loadSession(XMLElement *sessionNode) // TODO : create other types of source } + + // create clones after all sources to potentially clone have been created + sourceNode = sessionNode->FirstChildElement("Source"); + for( ; sourceNode ; sourceNode = sourceNode->NextSiblingElement()) + { + xmlCurrent_ = sourceNode; + counter++; + + const char *pType = xmlCurrent_->Attribute("type"); + if (!pType) + continue; + + if ( std::string(pType) == "CloneSource") { + XMLElement* originNode = xmlCurrent_->FirstChildElement("origin"); + if (originNode) { + std::string sourcename = std::string ( originNode->GetText() ); + SourceList::iterator origin = session_->find(sourcename); + if (origin != session_->end()) { + CloneSource *new_clone_source = (*origin)->clone(); + new_clone_source->accept(*this); + session_->addSource(new_clone_source); + } + } + } + } + } else Log::Warning("Session seems empty."); @@ -244,11 +270,5 @@ void SessionCreator::visit (SessionSource& s) } -void SessionCreator::visit (RenderSource& s) -{ - -} - - diff --git a/SessionCreator.h b/SessionCreator.h index e9825a0..adbb2ac 100644 --- a/SessionCreator.h +++ b/SessionCreator.h @@ -47,7 +47,6 @@ public: void visit (Source& s) override; void visit (MediaSource& s) override; void visit (SessionSource& s) override; - void visit (RenderSource& s) override; static void XMLToNode(tinyxml2::XMLElement *xml, Node &n); }; diff --git a/SessionVisitor.cpp b/SessionVisitor.cpp index c2f52f4..e6fcb4b 100644 --- a/SessionVisitor.cpp +++ b/SessionVisitor.cpp @@ -354,3 +354,13 @@ void SessionVisitor::visit (RenderSource& s) { xmlCurrent_->SetAttribute("type", "RenderSource"); } + +void SessionVisitor::visit (CloneSource& s) +{ + xmlCurrent_->SetAttribute("type", "CloneSource"); + + XMLElement *origin = xmlDoc_->NewElement("origin"); + xmlCurrent_->InsertEndChild(origin); + XMLText *text = xmlDoc_->NewText( s.origin()->name().c_str() ); + origin->InsertEndChild( text ); +} diff --git a/SessionVisitor.h b/SessionVisitor.h index af2e103..646c94e 100644 --- a/SessionVisitor.h +++ b/SessionVisitor.h @@ -44,6 +44,7 @@ public: void visit (MediaSource& s) override; void visit (SessionSource& s) override; void visit (RenderSource& s) override; + void visit (CloneSource& s) override; static tinyxml2::XMLElement *NodeToXML(Node &n, tinyxml2::XMLDocument *doc); }; diff --git a/Source.h b/Source.h index c99c02a..4852d3c 100644 --- a/Source.h +++ b/Source.h @@ -138,7 +138,6 @@ class CloneSource : public Source friend class Source; public: - CloneSource(Source *origin); ~CloneSource(); // implementation of source API @@ -151,6 +150,8 @@ public: inline Source *origin() const { return origin_; } protected: + // only Source class can create new CloneSource via clone(); + CloneSource(Source *origin); void init() override; Surface *clonesurface_;