]> git.sesse.net Git - casparcg/blobdiff - protocol/amcp/AMCPCommandsImpl.cpp
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
[casparcg] / protocol / amcp / AMCPCommandsImpl.cpp
index b6069929f120a37897b8230ac8e952df51f450da..e7f538f0a038b57d853a4362679013e2215443cb 100644 (file)
@@ -42,6 +42,7 @@
 #include <core/consumer/output.h>\r
 \r
 #include <modules/flash/flash.h>\r
+#include <modules/flash/util/swf.h>\r
 #include <modules/flash/producer/flash_producer.h>\r
 #include <modules/flash/producer/cg_producer.h>\r
 \r
@@ -225,7 +226,7 @@ bool CallCommand::DoExecute()
                for(auto it = std::begin(_parameters2)+2; it != std::end(_parameters2); ++it)\r
                        param += L" " + *it;\r
                \r
-               std::wstring result;\r
+               boost::unique_future<std::wstring> result;\r
                if(what == L"B")\r
                        result = GetChannel()->stage()->call(GetLayerIndex(), false, param);\r
                else if(what == L"F")\r
@@ -233,10 +234,13 @@ bool CallCommand::DoExecute()
                else\r
                        result = GetChannel()->stage()->call(GetLayerIndex(), true, _parameters.at(0) + L" " + param);\r
        \r
+               if(!result.timed_wait(boost::posix_time::seconds(2)))\r
+                       BOOST_THROW_EXCEPTION(timed_out());\r
+\r
                CASPAR_LOG(info) << "Executed call: " <<  _parameters[0] << TEXT(" successfully");\r
                \r
                std::wstringstream replyString;\r
-               replyString << TEXT("201 CALL OK\r\n") << result << L"\r\n";\r
+               replyString << TEXT("201 CALL OK\r\n") << result.get() << L"\r\n";\r
                \r
                SetReplyString(replyString.str());\r
 \r
@@ -805,12 +809,14 @@ bool StatusCommand::DoExecute()
                status_text\r
                        << L"201 STATUS OK\r\n"\r
                        << L"<layer>"\r
-                       << L"\n\t<index>"                       << GetLayerIndex() << L"</index>"\r
-                       << L"\n\t<foreground>"          << status.foreground << L"</foreground>"\r
-                       << L"\n\t<background>"          << status.background << L"</background>"\r
-                       << L"\n\t<status>"                      << (status.is_paused ? L"paused" : L"playing") << L"</status>"\r
-                       << L"\n\t<total-frames>"        << (status.total_frames == std::numeric_limits<int64_t>::max() ? 0 : status.total_frames) << L"</total-frames>"\r
-                       << L"\n\t<current-frame>"       << status.current_frame << L"</current-frame>"\r
+                       << L"\n\t<index>"                               << GetLayerIndex() << L"</index>"\r
+                       << L"\n\t<foreground>"                  << status.foreground << L"</foreground>"\r
+                       << L"\n\t<background>"                  << status.background << L"</background>"\r
+                       << L"\n\t<status>"                              << (status.is_paused ? L"paused" : L"playing") << L"</status>"\r
+                       << L"\n\t<nb-frames>"                   << (status.nb_frames == std::numeric_limits<int64_t>::max() ? 0 : status.nb_frames) << L"</nb-frames>"\r
+                       << L"\n\t<frame-number>"                << status.frame_number << L"</frame-number>"\r
+                       << L"\n\t<file-nb-frames>"              << (status.file_nb_frames == std::numeric_limits<int64_t>::max() ? 0 : status.file_nb_frames) << L"</file-nb-frames>"\r
+                       << L"\n\t<file-frame-number>"   << status.file_frame_number << L"</file-frame-number>"\r
                        << L"\n</layer>"\r
                        << L"\r\n";\r
 \r
@@ -1311,31 +1317,54 @@ void GenerateChannelInfo(int index, const safe_ptr<core::video_channel>& pChanne
 \r
 bool InfoCommand::DoExecute()\r
 {\r
-       try\r
-       {\r
-               std::wstringstream replyString;\r
-               if(_parameters.size() >= 1)\r
+       if(_parameters.size() >= 1 && _parameters[0] == L"TEMPLATE")\r
+       {               \r
+               try\r
                {\r
-                       int channelIndex = _ttoi(_parameters.at(0).c_str())-1;\r
-                       replyString << TEXT("201 INFO OK\r\n");\r
-                       GenerateChannelInfo(channelIndex, channels_.at(channelIndex), replyString);\r
+                       // Needs to be extended for any file, not just flash.\r
+\r
+                       auto filename = flash::find_template(env::template_folder() + _parameters.at(1));\r
+\r
+                       std::wstringstream ss;\r
+                       ss << L"201 INFO OK\r\n";\r
+                       ss << flash::read_template_meta_info(filename) << L"\r\n";\r
+\r
+                       SetReplyString(ss.str());\r
+                       return true;\r
                }\r
-               else\r
+               catch(...)\r
                {\r
-                       replyString << TEXT("200 INFO OK\r\n");\r
-                       for(size_t n = 0; n < channels_.size(); ++n)\r
-                               GenerateChannelInfo(n, channels_[n], replyString);\r
-                       replyString << TEXT("\r\n");\r
+                       SetReplyString(TEXT("403 INFO ERROR\r\n"));\r
+                       return false;\r
                }\r
-               SetReplyString(replyString.str());\r
        }\r
-       catch(...)\r
+       else // channel\r
        {\r
-               SetReplyString(TEXT("401 INFO ERROR\r\n"));\r
-               return false;\r
+               try\r
+               {\r
+                       std::wstringstream replyString;\r
+                       if(_parameters.size() >= 1)\r
+                       {\r
+                               int channelIndex = boost::lexical_cast<int>(_parameters.at(0).c_str())-1;\r
+                               replyString << TEXT("201 INFO OK\r\n");\r
+                               GenerateChannelInfo(channelIndex, channels_.at(channelIndex), replyString);\r
+                       }\r
+                       else\r
+                       {\r
+                               replyString << TEXT("200 INFO OK\r\n");\r
+                               for(size_t n = 0; n < channels_.size(); ++n)\r
+                                       GenerateChannelInfo(n, channels_[n], replyString);\r
+                               replyString << TEXT("\r\n");\r
+                       }\r
+                       SetReplyString(replyString.str());\r
+                       return true;\r
+               }\r
+               catch(...)\r
+               {\r
+                       SetReplyString(TEXT("403 INFO ERROR\r\n"));\r
+                       return false;\r
+               }\r
        }\r
-\r
-       return true;\r
 }\r
 \r
 bool ClsCommand::DoExecute()\r