+ replyString << L"201 INFO SYSTEM OK\r\n";\r
+ \r
+ boost::property_tree::wptree info;\r
+ \r
+ info.add(L"system.name", caspar::get_system_product_name());\r
+ info.add(L"system.windows.name", caspar::get_win_product_name());\r
+ info.add(L"system.windows.service-pack", caspar::get_win_sp_version());\r
+ info.add(L"system.cpu", caspar::get_cpu_info());\r
+ \r
+ BOOST_FOREACH(auto device, caspar::decklink::get_device_list())\r
+ info.add(L"system.decklink.device", device);\r
+\r
+ BOOST_FOREACH(auto device, caspar::bluefish::get_device_list())\r
+ info.add(L"system.bluefish.device", device);\r
+ \r
+ info.add(L"system.flash", caspar::flash::get_version());\r
+ //info.add(L"system.free-image", caspar::image::get_version());\r
+ info.add(L"system.ffmpeg.avcodec", caspar::ffmpeg::get_avcodec_version());\r
+ info.add(L"system.ffmpeg.avformat", caspar::ffmpeg::get_avformat_version());\r
+ info.add(L"system.ffmpeg.avfilter", caspar::ffmpeg::get_avfilter_version());\r
+ info.add(L"system.ffmpeg.avutil", caspar::ffmpeg::get_avutil_version());\r
+ info.add(L"system.ffmpeg.swscale", caspar::ffmpeg::get_swscale_version());\r
+ \r
+ boost::property_tree::write_xml(replyString, info, w);\r
+ }\r
+ else if(_parameters.size() >= 1 && _parameters[0] == L"SERVER")\r
+ {\r
+ replyString << L"201 INFO SYSTEM OK\r\n";\r
+ \r
+ boost::property_tree::wptree info;\r
+\r
+ int index = 0;\r
+ BOOST_FOREACH(auto channel, channels_)\r
+ info.add_child(L"channels.channel", channel->info())\r
+ .add(L"index", ++index);\r
+ \r
+ boost::property_tree::write_xml(replyString, info, w);\r
+ }\r
+ else // channel\r
+ { \r
+ if(_parameters.size() >= 1)\r
+ {\r
+ replyString << TEXT("201 INFO OK\r\n");\r
+ boost::property_tree::wptree info;\r
+\r
+ std::vector<std::wstring> split;\r
+ boost::split(split, _parameters[0], boost::is_any_of("-"));\r
+ \r
+ int layer = std::numeric_limits<int>::min();\r
+ int channel = boost::lexical_cast<int>(split[0]) - 1;\r
+\r
+ if(split.size() > 1)\r
+ layer = boost::lexical_cast<int>(split[1]);\r
+ \r
+ if(layer == std::numeric_limits<int>::min())\r
+ { \r
+ info.add_child(L"channel", channels_.at(channel)->info())\r
+ .add(L"index", channel);\r
+ }\r
+ else\r
+ {\r
+ if(_parameters.size() >= 2)\r
+ {\r
+ if(_parameters[1] == L"B")\r
+ info.add_child(L"producer", channels_.at(channel)->stage().background(layer).get()->info());\r
+ else\r
+ info.add_child(L"producer", channels_.at(channel)->stage().foreground(layer).get()->info());\r
+ }\r
+ else\r
+ {\r
+ info.add_child(L"layer", channels_.at(channel)->stage().info(layer).get())\r
+ .add(L"index", layer);\r
+ }\r
+ }\r
+ boost::property_tree::xml_parser::write_xml(replyString, info, w);\r
+ }\r
+ else\r
+ {\r
+ // This is needed for backwards compatibility with old clients\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
+ }\r
+\r