]> git.sesse.net Git - casparcg/blobdiff - protocol/cii/CIIProtocolStrategy.cpp
* Enabled modules like flash and html (will be merged soon) to hook in CG functionali...
[casparcg] / protocol / cii / CIIProtocolStrategy.cpp
index 34a28f723bfd3ceee93f5050f4289a0b4d46e505..cd0b79bd47af22f65384ee0a0211db6aba75bfb8 100644 (file)
 #include <sstream>
 #include <algorithm>
 #include "CIIProtocolStrategy.h"
-#include "CIICommandsimpl.h"
-#include <modules/flash/producer/flash_producer.h>
+#include "CIICommandsImpl.h"
 #include <core/producer/transition/transition_producer.h>
 #include <core/mixer/mixer.h>
+#include <core/diagnostics/call_context.h>
 #include <common/env.h>
 
 #include <boost/algorithm/string/replace.hpp>
@@ -45,7 +45,12 @@ using namespace core;
 const std::wstring CIIProtocolStrategy::MessageDelimiter = L"\r\n";
 const wchar_t CIIProtocolStrategy::TokenDelimiter = L'\\';
 
-CIIProtocolStrategy::CIIProtocolStrategy(const std::vector<spl::shared_ptr<core::video_channel>>& channels) : pChannel_(channels.at(0)), executor_(L"CIIProtocolStrategy")
+CIIProtocolStrategy::CIIProtocolStrategy(
+               const std::vector<spl::shared_ptr<core::video_channel>>& channels, 
+               const spl::shared_ptr<core::cg_producer_registry>& cg_registry)
+       : executor_(L"CIIProtocolStrategy")
+       , pChannel_(channels.at(0))
+       , cg_registry_(cg_registry)
 {
 }
 
@@ -85,16 +90,16 @@ int CIIProtocolStrategy::TokenizeMessage(const std::wstring& message, std::vecto
                if(message[charIndex] == TokenDelimiter) 
                {
                        pTokenVector->push_back(currentToken.str());
-                       currentToken.str(TEXT(""));
+                       currentToken.str(L"");
                        continue;
                }
 
-               if(message[charIndex] == TEXT('\"')) 
-                       currentToken << TEXT("&quot;");         
-               else if(message[charIndex] == TEXT('<')) 
-                       currentToken << TEXT("&lt;");           
-               else if(message[charIndex] == TEXT('>')) 
-                       currentToken << TEXT("&gt;");           
+               if(message[charIndex] == L'\"')
+                       currentToken << L"&quot;";
+               else if(message[charIndex] == L'<')
+                       currentToken << L"&lt;";
+               else if(message[charIndex] == L'>')
+                       currentToken << L"&gt;";
                else 
                        currentToken << message[charIndex];
        }
@@ -108,68 +113,64 @@ int CIIProtocolStrategy::TokenizeMessage(const std::wstring& message, std::vecto
 /************
 // Examples (<X> = ASCIICHAR X)
 
-I\25\3\VII\\                                                                   sätter outputtype till 'vii'
+I\25\3\VII\\                                                                   stter outputtype till 'vii'
 I\25\4\1\\                                                                             enablar framebuffer (ignore this)
 
-M\C/SVTNEWS\\                                                                  pekar ut vilken grafisk profil som skall användas
+M\C/SVTNEWS\\                                                                  pekar ut vilken grafisk profil som skall anvndas
 
-W\4009\4067\Jonas Björkman\\                                   Skriver "Jonas Björkman" till första textfältet i template 4067 och sparar den färdiga skylten som 4009
+W\4009\4067\Jonas Bj�rkman\\                                 Skriver "Jonas Bj�rkman" till f�rsta textf�ltet i template 4067 och sparar den f�rdiga skylten som 4009
 
-T\7\4009.VII\A\\                                                               lägger ut skylt 4009
+T\7\4009.VII\A\\                                                               lgger ut skylt 4009
 
-Y\<205><247><202><196><192><192><200><248>\\   lägger ut skylten 4008 (<205><247><202><196><192><192><200><248> = "=g:4008h" om man drar bort 144 från varje asciivärde)
+Y\<205><247><202><196><192><192><200><248>\\   l�gger ut skylten 4008 (<205><247><202><196><192><192><200><248> = "=g:4008h" om man drar bort 144 fr�n varje asciiv�rde)
 
-V\5\3\1\1\namn.tga\1\\                                                 lägger ut bilden namn.tga
-V\0\1\D\C\10\0\0\0\\                                                   gör någon inställning som har med föregående kommando att göra.
+V\5\3\1\1\namn.tga\1\\                                                 lgger ut bilden namn.tga
+V\0\1\D\C\10\0\0\0\\                                                   g�r n�gon inst�llning som har med f�reg�ende kommando att g�ra.
 
 *************/
 
 /**********************
 New Commands to support the Netupe automation system
-V\5\13\1\1\Template\0\TabField1\TabField2...\\         Build. Ettan före Template indikerar vilket lager den nya templaten skall laddas in i. OBS. Skall inte visas efter det här steget
-Y\<27>\\                                                                                       Stop. Här kommer ett lagerID också att skickas med (<27> = ESC)
-Y\<254>\\                                                                                      Clear Canvas. Här kommer ett lagerID också att skickas med, utan det skall allt tömmas
-Y\<213><243>\\                                                                         Play. Här kommer ett lagerID också att skickas med
+V\5\13\1\1\Template\0\TabField1\TabField2...\\         Build. Ettan f�re Template indikerar vilket lager den nya templaten skall laddas in i. OBS. Skall inte visas efter det h�r steget
+Y\<27>\\                                                                                       Stop. H�r kommer ett lagerID ocks� att skickas med (<27> = ESC)
+Y\<254>\\                                                                                      Clear Canvas. H�r kommer ett lagerID ocks� att skickas med, utan det skall allt t�mmas
+Y\<213><243>\\                                                                         Play. H�r kommer ett lagerID ocks� att skickas med
 
 **********************/
 CIICommandPtr CIIProtocolStrategy::Create(const std::wstring& name)
 {
        switch(name[0])
        {
-               case TEXT('M'): return std::make_shared<MediaCommand>(this);
-               case TEXT('W'): return std::make_shared<WriteCommand>(this);
-               case TEXT('T'): return std::make_shared<ImagestoreCommand>(this);
-               case TEXT('V'): return std::make_shared<MiscellaneousCommand>(this);
-               case TEXT('Y'): return std::make_shared<KeydataCommand>(this);
+               case L'M': return std::make_shared<MediaCommand>(this);
+               case L'W': return std::make_shared<WriteCommand>(this);
+               case L'T': return std::make_shared<ImagestoreCommand>(this);
+               case L'V': return std::make_shared<MiscellaneousCommand>(this);
+               case L'Y': return std::make_shared<KeydataCommand>(this);
                default:                return nullptr;
        }
 }
 
 void CIIProtocolStrategy::WriteTemplateData(const std::wstring& templateName, const std::wstring& titleName, const std::wstring& xmlData) 
 {
-       std::wstring fullTemplateFilename = env::template_folder();
-       if(currentProfile_.size() > 0)
-       {
-               fullTemplateFilename += currentProfile_;
-               fullTemplateFilename += TEXT("\\");
-       }
-       fullTemplateFilename += templateName;
-       fullTemplateFilename = flash::find_template(fullTemplateFilename);
-       if(fullTemplateFilename.empty())
+       std::wstring fullTemplateFilename = templateName;
+
+       if (!currentProfile_.empty())
+               fullTemplateFilename = currentProfile_ + L"/" + templateName;
+
+       core::diagnostics::scoped_call_context save;
+       core::diagnostics::call_context::for_thread().video_channel = 1;
+       core::diagnostics::call_context::for_thread().layer = 0;
+       auto producer = cg_registry_->create_producer(GetChannel(), fullTemplateFilename);
+
+       if (producer == core::frame_producer::empty())
        {
-               CASPAR_LOG(error) << "Failed to save instance of " << templateName << TEXT(" as ") << titleName << TEXT(", template ") << fullTemplateFilename << " not found";
+               CASPAR_LOG(error) << "Failed to save instance of " << templateName << L" as " << titleName << L", template " << fullTemplateFilename << L"not found";
                return;
        }
-       
-       auto producer = flash::create_producer(this->GetChannel()->frame_factory(), this->GetChannel()->video_format_desc(), { env::template_folder() + TEXT("CG.fth") });
 
-       std::wstringstream flashParam;
-       flashParam << TEXT("<invoke name=\"Add\" returntype=\"xml\"><arguments><number>1</number><string>") << currentProfile_ << '/' <<  templateName << TEXT("</string><number>0</number><true/><string> </string><string><![CDATA[ ") << xmlData << TEXT(" ]]></string></arguments></invoke>");
-       std::vector<std::wstring> params;
-       params.push_back(flashParam.str());
-       producer->call(std::move(params));
+       cg_registry_->get_proxy(producer)->add(1, fullTemplateFilename, true, L"", xmlData);
 
-       CASPAR_LOG(info) << "Saved an instance of " << templateName << TEXT(" as ") << titleName ;
+       CASPAR_LOG(info) << "Saved an instance of " << templateName << L" as " << titleName ;
 
        PutPreparedTemplate(titleName, spl::shared_ptr<core::frame_producer>(std::move(producer)));
        
@@ -196,6 +197,10 @@ void CIIProtocolStrategy::DisplayMediaFile(const std::wstring& filename)
        transition.type = transition_type::mix;
        transition.duration = 12;
 
+       core::diagnostics::scoped_call_context save;
+       core::diagnostics::call_context::for_thread().video_channel = 1;
+       core::diagnostics::call_context::for_thread().layer = 0;
+
        auto pFP = create_producer(GetChannel()->frame_factory(), GetChannel()->video_format_desc(), filename);
        auto pTransition = create_transition_producer(GetChannel()->video_format_desc().field_mode, pFP, transition);
 
@@ -230,7 +235,7 @@ spl::shared_ptr<core::frame_producer> CIIProtocolStrategy::GetPreparedTemplate(c
        return result;
 }
 
-void CIIProtocolStrategy::PutPreparedTemplate(const std::wstring& titleName, spl::shared_ptr<core::frame_producer>& pFP)
+void CIIProtocolStrategy::PutPreparedTemplate(const std::wstring& titleName, const spl::shared_ptr<core::frame_producer>& pFP)
 {
        CASPAR_LOG(debug) << L"Saved title with name " << titleName;