]> git.sesse.net Git - casparcg/blob - server/cii/CIICommandsImpl.cpp
1.8.1:
[casparcg] / server / cii / CIICommandsImpl.cpp
1 /*\r
2 * copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
3 *\r
4 *  This file is part of CasparCG.\r
5 *\r
6 *    CasparCG is free software: you can redistribute it and/or modify\r
7 *    it under the terms of the GNU General Public License as published by\r
8 *    the Free Software Foundation, either version 3 of the License, or\r
9 *    (at your option) any later version.\r
10 *\r
11 *    CasparCG is distributed in the hope that it will be useful,\r
12 *    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14 *    GNU General Public License for more details.\r
15 \r
16 *    You should have received a copy of the GNU General Public License\r
17 *    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
18 *\r
19 */\r
20  \r
21 #include "..\StdAfx.h"\r
22 \r
23 #include "CIIProtocolStrategy.h"\r
24 #include "..\channel.h"\r
25 #include "..\cg\cgcontrol.h"\r
26 #include "CIICommandsImpl.h"\r
27 #include <sstream>\r
28 #include <algorithm>\r
29 \r
30 namespace caspar {\r
31 namespace cii {\r
32 \r
33 /////////////////\r
34 // MediaCommand\r
35 void MediaCommand::Setup(const std::vector<tstring>& parameters) {\r
36         graphicProfile_ = parameters[1].substr(2);\r
37 }\r
38 \r
39 void MediaCommand::Execute() {\r
40         pCIIStrategy_->SetProfile(graphicProfile_);\r
41 }\r
42 \r
43 \r
44 /////////////////\r
45 // WriteCommand\r
46 void WriteCommand::Setup(const std::vector<tstring>& parameters) {\r
47         try {\r
48                 if(parameters.size()>2) {\r
49                         targetName_ = parameters[1];\r
50                         templateName_ = parameters[2];\r
51 \r
52                         tstringstream dataStream;\r
53 \r
54                         dataStream << TEXT("<templateData>");\r
55 \r
56                         std::vector<tstring>::size_type end = parameters.size();\r
57                         for(std::vector<tstring>::size_type i = 3; i < end; ++i) {\r
58                                 dataStream << TEXT("<componentData id=\"field") << i-2 << TEXT("\"><data id=\"text\" value=\"") << parameters[i] << TEXT("\" /></componentData>"); \r
59                         }\r
60 \r
61                         dataStream << TEXT("</templateData>");\r
62                         xmlData_ = dataStream.str();\r
63                 }\r
64         }\r
65         catch(std::exception) {\r
66         }\r
67 }\r
68 \r
69 void WriteCommand::Execute() {\r
70         pCIIStrategy_->WriteTemplateData(templateName_, targetName_, xmlData_);\r
71 }\r
72 \r
73 \r
74 //////////////////////\r
75 // ImagestoreCommand\r
76 void ImagestoreCommand::Setup(const std::vector<tstring>& parameters) {\r
77         if(parameters[1] == TEXT("7") && parameters.size() > 2) {\r
78                 titleName_ = parameters[2].substr(0, 4);\r
79         }\r
80 }\r
81 \r
82 void ImagestoreCommand::Execute() {\r
83         pCIIStrategy_->DisplayTemplate(titleName_);\r
84 }\r
85 \r
86 \r
87 //////////////////////\r
88 // MiscellaneousCommand\r
89 void MiscellaneousCommand::Setup(const std::vector<tstring>& parameters) {\r
90         //HAWRYS:       V\5\3\1\1\namn.tga\1\r
91         //                      Display still\r
92         if((parameters.size() > 5) && parameters[1] == TEXT("5") && parameters[2] == TEXT("3")) {\r
93                 filename_ = parameters[5];\r
94                 filename_ = filename_.substr(0, filename_.find_last_of(TEXT('.')));\r
95                 state_ = 0;\r
96                 return;\r
97         }\r
98         \r
99         //NEPTUNE:      V\5\13\1\X\Template\0\TabField1\TabField2...\r
100         //                      Add Template to layer X in the active templatehost\r
101         if((parameters.size() > 5) && parameters[1] == TEXT("5") && parameters[2] == TEXT("13"))\r
102         {\r
103                 layer_ = _ttoi(parameters[4].c_str());\r
104                 filename_ = parameters[5];\r
105                 state_ = 1;\r
106                 if(parameters.size() > 7) {\r
107                         tstringstream dataStream;\r
108 \r
109                         dataStream << TEXT("<templateData>");\r
110                         std::vector<tstring>::size_type end = parameters.size();\r
111                         for(std::vector<tstring>::size_type i = 7; i < end; ++i) {\r
112                                 dataStream << TEXT("<componentData id=\"f") << i-7 << TEXT("\"><data id=\"text\" value=\"") << parameters[i] << TEXT("\" /></componentData>"); \r
113                         }\r
114                         dataStream << TEXT("</templateData>");\r
115 \r
116                         xmlData_ = dataStream.str();\r
117                 }\r
118         }\r
119 \r
120         // VIDEO MODE V\5\14\MODE\r
121         if((parameters.size() > 3) && parameters[1] == TEXT("5") && parameters[2] == TEXT("14"))\r
122         {\r
123                 tstring value = parameters[3];\r
124                 std::transform(value.begin(), value.end(), value.begin(), toupper);\r
125 \r
126                 this->pCIIStrategy_->GetChannel()->SetVideoFormat(value);\r
127         }\r
128 }\r
129 \r
130 void MiscellaneousCommand::Execute() {\r
131         if(state_ == 0)\r
132         {\r
133                 pCIIStrategy_->DisplayMediaFile(filename_);\r
134         }\r
135 \r
136         //TODO: Need to be checked for validity\r
137         else if(state_ == 1)\r
138                 pCIIStrategy_->GetCGControl()->Add(layer_, filename_, false, TEXT(""), xmlData_);\r
139 }\r
140 \r
141 \r
142 ///////////////////\r
143 // KeydataCommand\r
144 void KeydataCommand::Execute() {\r
145         if(state_ == 0)\r
146         {\r
147                 pCIIStrategy_->DisplayTemplate(titleName_);\r
148         }\r
149 \r
150         //TODO: Need to be checked for validity\r
151         else if(state_ == 1)\r
152                 pCIIStrategy_->GetCGControl()->Stop(layer_, 0);\r
153         else if(state_ == 2)\r
154                 pCIIStrategy_->GetCGControl()->Clear();\r
155         else if(state_ == 3)\r
156                 pCIIStrategy_->GetCGControl()->Play(layer_);\r
157 }\r
158 \r
159 void KeydataCommand::Setup(const std::vector<tstring>& parameters) {\r
160         //HAWRYS:       Y\<205><247><202><196><192><192><200><248>\r
161         //parameter[1] looks like this: "=g:XXXXh" where XXXX is the name that we want\r
162         if(parameters[1].size() > 6) {\r
163                 titleName_.resize(4);\r
164                 for(int i=0;i<4;++i) {\r
165                         if(parameters[1][i+3] < 176) {\r
166                                 titleName_ = TEXT("");\r
167                                 break;\r
168                         }\r
169                         titleName_[i] = parameters[1][i+3]-144;\r
170                 }\r
171                 state_ = 0;\r
172         }\r
173 \r
174         if(parameters.size() > 2)\r
175         {\r
176                 layer_ = _ttoi(parameters[2].c_str());\r
177         }\r
178 \r
179         if(parameters[1].at(0) == 27)   //NEPTUNE:      Y\<27>\X                        Stop layer X.\r
180                 state_ = 1;\r
181         else if(static_cast<unsigned char>(parameters[1].at(0)) == 254) //NEPTUNE:      Y\<254>                 Clear Canvas. \r
182                 state_ = 2;\r
183         else if(static_cast<unsigned char>(parameters[1].at(0)) == 213) //NEPTUNE:      Y\<213><243>\X  Play layer X. \r
184                 state_ = 3;\r
185 }\r
186 \r
187 }       //namespace cii\r
188 }       //namespace caspar