]> git.sesse.net Git - casparcg/commitdiff
Some refactoring based on the new parameters class
authorHelge Norberg <helge.norberg@gmail.com>
Fri, 31 May 2013 15:12:58 +0000 (17:12 +0200)
committerHelge Norberg <helge.norberg@gmail.com>
Fri, 31 May 2013 15:12:58 +0000 (17:12 +0200)
14 files changed:
common/common.vcxproj
common/common.vcxproj.filters
core/parameters/parameters.cpp
core/parameters/parameters.h
core/producer/frame_producer.cpp
modules/ffmpeg/consumer/ffmpeg_consumer.cpp
modules/ffmpeg/producer/ffmpeg_producer.cpp
modules/flash/producer/cg_producer.cpp
modules/image/producer/image_producer.cpp
modules/image/producer/image_scroll_producer.cpp
modules/ogl/consumer/ogl_consumer.cpp
protocol/amcp/AMCPCommand.h
protocol/amcp/AMCPCommandsImpl.cpp
shell/server.cpp

index 4a558139e8027b4bda531d34867ade1f26459a96..048f17d5216ac03d3dc1edf4e3058c10a63e7a59 100644 (file)
     <ClInclude Include="utility\base64.h" />\r
     <ClInclude Include="utility\iterator.h" />\r
     <ClInclude Include="utility\move_on_copy.h" />\r
-    <ClInclude Include="utility\param.h" />\r
     <ClInclude Include="utility\string.h" />\r
     <ClInclude Include="utility\timer.h" />\r
     <ClInclude Include="utility\tweener.h" />\r
index 838ecf6dc32721536f42bffe6423ffbfd0ee0aeb..6addb35d3d82c11d985d56760bafef6723e06bf1 100644 (file)
     <ClInclude Include="concurrency\target.h">\r
       <Filter>source\concurrency</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="utility\param.h">\r
-      <Filter>source\utility</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="utility\utf8conv.h">\r
       <Filter>source\utility</Filter>\r
     </ClInclude>\r
index 918027ec243048ab4bf6f19f7e8b8520d7f5eef4..4aaaf53c6a16feab184541718bdcb63e1fb29d29 100644 (file)
@@ -55,6 +55,21 @@ bool parameters::has(std::wstring const& parameter) const
        return boost::range::find(params_, parameter) != params_.end();
 }
 
+bool parameters::remove_if_exists(std::wstring const& key)
+{
+       auto iter = boost::range::find(params_, key);
+
+       if (iter == params_.end())
+               return false;
+
+       auto index = iter - params_.begin();
+
+       params_.erase(iter);
+       params_original_.erase(params_original_.begin() + index);
+
+       return true;
+}
+
 std::vector<std::wstring> parameters::protocol_split(std::wstring const& s)
 {
        std::vector<std::wstring> result;
@@ -79,7 +94,7 @@ std::wstring parameters::get(std::wstring const& key, std::wstring const& defaul
        return *it;
 }
 
-std::wstring parameters::get_original() const
+std::wstring parameters::get_original_string() const
 {
        std::wstring str;
        BOOST_FOREACH(auto& param, params_)
index aca91abcfd46f8821fc4fe1e5922aafecc46eb7f..05e11f8fadfbb34692c31e01e3aeb99c049f6fee 100644 (file)
@@ -25,9 +25,7 @@
 #include <vector>
 #include <stdint.h>
 
-namespace caspar { 
-       
-namespace core {
+namespace caspar { namespace core {
 
 class parameters
 {
@@ -37,7 +35,7 @@ class parameters
 public:
        parameters() {}
 
-       parameters(std::vector<std::wstring> const& params);
+       explicit parameters(std::vector<std::wstring> const& params);
 
        std::vector<std::wstring> const& get_params() const {
                return params_;
@@ -48,6 +46,7 @@ public:
        void to_upper();
        
        bool has(std::wstring const& key) const;
+       bool remove_if_exists(std::wstring const& key);
 
        template<typename C>
        typename std::enable_if<!std::is_convertible<C, std::wstring>::value, typename std::decay<C>::type>::type get(std::wstring const& key, C default_value = C()) const
@@ -68,16 +67,15 @@ public:
 
        std::wstring get(std::wstring const& key, std::wstring const& default_value = L"") const;
 
-       std::wstring get_original() const;
+       std::wstring get_original_string() const;
 
        std::wstring at_original(size_t i) const;
 
        void set(size_t index, std::wstring const& value);
 
-       // Type conversion operator for compatibiltiy with existing code not yet updated.
-       operator std::vector<std::wstring> const& () const
+       const std::vector<std::wstring>& get_original() const
        {
-               return params_;
+               return params_original_;
        }
 
        // Compatibility method though likely to be useful
@@ -127,10 +125,9 @@ public:
        }
 
        // Compatibility method
-       // Used for the upper casing
-       //std::wstring& operator [] (size_t i) {
-       //      return params_[i];
-       //}
+       std::wstring& operator [] (size_t i) {
+               return params_[i];
+       }
 
        // Compatibility method
        std::vector<std::wstring>::const_iterator begin() const
index 194080ddb9a8e8771d37fa28af5e9cf11da00efb..7d909e1e23a9faa962570128f2b8e7e3a03c20df 100644 (file)
@@ -306,7 +306,7 @@ safe_ptr<core::frame_producer> create_producer(const safe_ptr<frame_factory>& my
        \r
        if(producer == frame_producer::empty())\r
        {\r
-               std::wstring str = params.get_original();\r
+               std::wstring str = params.get_original_string();\r
                BOOST_THROW_EXCEPTION(file_not_found() << msg_info("No match found for supplied commands. Check syntax.") << arg_value_info(narrow(str)));\r
        }\r
 \r
@@ -315,7 +315,7 @@ safe_ptr<core::frame_producer> create_producer(const safe_ptr<frame_factory>& my
 \r
 safe_ptr<core::frame_producer> create_thumbnail_producer(const safe_ptr<frame_factory>& my_frame_factory, const std::wstring& media_file)\r
 {\r
-       std::vector<std::wstring> params;\r
+       core::parameters params;\r
        params.push_back(media_file);\r
 \r
        auto producer = do_create_producer(my_frame_factory, params, g_thumbnail_factories, true);\r
index 8d093cc3fe4fcc10445ebe6d1909fb969d222e00..746ce87d50b757a9193f6f7e48ccb18f0e75722b 100644 (file)
@@ -749,30 +749,27 @@ safe_ptr<core::frame_consumer> create_consumer(const core::parameters& params)
        if(params.size() < 1 || params[0] != L"FILE")\r
                return core::frame_consumer::empty();\r
 \r
-       std::vector<std::wstring> params2 = params;\r
+       auto params2 = params;\r
        \r
        auto filename   = (params2.size() > 1 ? params2[1] : L"");\r
-       auto separate_key_it = std::find(params2.begin(), params2.end(), L"SEPARATE_KEY");\r
-       bool separate_key = false;\r
+       bool separate_key = params2.remove_if_exists(L"SEPARATE_KEY");\r
 \r
-       if (separate_key_it != params2.end())\r
-       {\r
-               separate_key = true;\r
-               params2.erase(separate_key_it);\r
-       }\r
-                       \r
        std::vector<option> options;\r
        \r
-       if(params2.size() >= 3)\r
+       if (params2.size() >= 3)\r
        {\r
-               for(auto opt_it = params2.begin()+2; opt_it != params2.end();)\r
+               for (auto opt_it = params2.begin() + 2; opt_it != params2.end();)\r
                {\r
                        auto name  = narrow(boost::trim_copy(boost::to_lower_copy(*opt_it++))).substr(1);\r
+\r
+                       if (opt_it == params2.end())\r
+                               break;\r
+\r
                        auto value = narrow(boost::trim_copy(boost::to_lower_copy(*opt_it++)));\r
                                \r
-                       if(value == "h264")\r
+                       if (value == "h264")\r
                                value = "libx264";\r
-                       else if(value == "dvcpro")\r
+                       else if (value == "dvcpro")\r
                                value = "dvvideo";\r
 \r
                        options.push_back(option(name, value));\r
index c6b810a7e38136362743d083e24390628b8f7855..7e4f702c8610da1e0603efba11d00fa8b503b847 100644 (file)
@@ -522,7 +522,7 @@ safe_ptr<core::frame_producer> create_thumbnail_producer(
        static const std::vector<std::wstring> invalid_exts = boost::assign::list_of\r
                        (L".png")(L".tga")(L".bmp")(L".jpg")(L".jpeg")(L".gif")(L".tiff")(L".tif")(L".jp2")(L".jpx")(L".j2k")(L".j2c")(L".swf")(L".ct")\r
                        (L".wav")(L".mp3"); // audio shall not have thumbnails\r
-       auto filename = probe_stem(env::media_folder() + L"\\" + params.at(0), invalid_exts);\r
+       auto filename = probe_stem(env::media_folder() + L"\\" + params.at_original(0), invalid_exts);\r
 \r
        if(filename.empty())\r
                return core::frame_producer::empty();\r
index 14cd5fa22663e868dc70e2ba6fc206262b13aa1a..f132de9c4a4886c4c57798cba76b1245bcd3b9e1 100644 (file)
@@ -223,7 +223,7 @@ safe_ptr<cg_producer> get_default_cg_producer(const safe_ptr<core::video_channel
 \r
 safe_ptr<core::frame_producer> create_cg_producer_and_autoplay_file(\r
                const safe_ptr<core::frame_factory>& frame_factory, \r
-               const std::vector<std::wstring>& params,\r
+               const core::parameters& params,\r
                const std::wstring& filename) \r
 {\r
        if(!boost::filesystem::exists(filename))\r
@@ -244,7 +244,7 @@ safe_ptr<core::frame_producer> create_ct_producer(
                const safe_ptr<core::frame_factory>& frame_factory,\r
                const core::parameters& params) \r
 {\r
-       return create_cg_producer_and_autoplay_file(frame_factory, params, env::media_folder() + L"\\" + params[0] + L".ct");\r
+       return create_cg_producer_and_autoplay_file(frame_factory, params, env::media_folder() + L"\\" + params.at_original(0) + L".ct");\r
 }\r
 \r
 safe_ptr<core::frame_producer> create_cg_producer(\r
index 6ca5d4cd1dcfda090bfd9b2c241617ab2c6fdf3a..8942d17cc9b6dd124c790873740081c9d0e244ed 100644 (file)
@@ -135,7 +135,7 @@ safe_ptr<core::frame_producer> create_raw_producer(
        }\r
 \r
        static const std::vector<std::wstring> extensions = list_of(L"png")(L"tga")(L"bmp")(L"jpg")(L"jpeg")(L"gif")(L"tiff")(L"tif")(L"jp2")(L"jpx")(L"j2k")(L"j2c");\r
-       std::wstring filename = env::media_folder() + params[0];\r
+       std::wstring filename = env::media_folder() + params.at_original(0);\r
        \r
        auto ext = std::find_if(extensions.begin(), extensions.end(), [&](const std::wstring& ex) -> bool\r
                {                                       \r
index 006bb42b1fcb99e1ec6dcc8e8a3d3f506f739b15..e45ed80644c2d78a3c7c0179e703404359af53e1 100644 (file)
@@ -395,57 +395,42 @@ safe_ptr<core::frame_producer> create_scroll_producer(
                const safe_ptr<core::frame_factory>& frame_factory,\r
                const core::parameters& params)\r
 {\r
-       static const std::vector<std::wstring> extensions = list_of(L"png")(L"tga")(L"bmp")(L"jpg")(L"jpeg")(L"gif")(L"tiff")(L"tif")(L"jp2")(L"jpx")(L"j2k")(L"j2c");\r
-       std::wstring filename = env::media_folder() + L"\\" + params[0];\r
+       static const std::vector<std::wstring> extensions = list_of\r
+                       (L"png")(L"tga")(L"bmp")(L"jpg")(L"jpeg")(L"gif")(L"tiff")(L"tif")\r
+                       (L"jp2")(L"jpx")(L"j2k")(L"j2c");\r
+       std::wstring filename = env::media_folder() + L"\\" + params.at_original(0);\r
        \r
-       auto ext = std::find_if(extensions.begin(), extensions.end(), [&](const std::wstring& ex) -> bool\r
-               {                                       \r
-                       return boost::filesystem::is_regular_file(boost::filesystem::wpath(filename).replace_extension(ex));\r
-               });\r
+       auto ext = std::find_if(\r
+                       extensions.begin(),\r
+                       extensions.end(),\r
+                       [&](const std::wstring& ex) -> bool\r
+                       {                                       \r
+                               return boost::filesystem::is_regular_file(\r
+                                               boost::filesystem::wpath(filename)\r
+                                                               .replace_extension(ex));\r
+                       });\r
 \r
        if(ext == extensions.end())\r
                return core::frame_producer::empty();\r
        \r
-       double speed = 0.0;\r
-       double duration = 0.0;\r
-       auto speed_it = std::find(params.begin(), params.end(), L"SPEED");\r
-       if(speed_it != params.end())\r
-       {\r
-               if(++speed_it != params.end())\r
-                       speed = boost::lexical_cast<double>(*speed_it);\r
-       }\r
-\r
-       if (speed == 0)\r
-       {\r
-               auto duration_it = std::find(params.begin(), params.end(), L"DURATION");\r
-\r
-               if (duration_it != params.end() && ++duration_it != params.end())\r
-               {\r
-                       duration = boost::lexical_cast<double>(*duration_it);\r
-               }\r
-       }\r
+       double speed = params.get(L"SPEED", 0.0);\r
+       double duration = params.get(L"DURATION", 0.0);\r
 \r
        if(speed == 0 && duration == 0)\r
                return core::frame_producer::empty();\r
 \r
-       int motion_blur_px = 0;\r
-       auto blur_it = std::find(params.begin(), params.end(), L"BLUR");\r
-       if (blur_it != params.end() && ++blur_it != params.end())\r
-       {\r
-               motion_blur_px = boost::lexical_cast<int>(*blur_it);\r
-       }\r
-\r
-       bool premultiply_with_alpha = std::find(params.begin(), params.end(), L"PREMULTIPLY") != params.end();\r
-       bool progressive = std::find(params.begin(), params.end(), L"PROGRESSIVE") != params.end();\r
+       int motion_blur_px = params.get(L"BLUR", 0);\r
+       bool premultiply_with_alpha = params.has(L"PREMULTIPLY");\r
+       bool progressive = params.has(L"PROGRESSIVE");\r
 \r
        return create_producer_print_proxy(make_safe<image_scroll_producer>(\r
-               frame_factory, \r
-               filename + L"." + *ext, \r
-               -speed, \r
-               -duration, \r
-               motion_blur_px, \r
-               premultiply_with_alpha,\r
-               progressive));\r
+                       frame_factory, \r
+                       filename + L"." + *ext, \r
+                       -speed, \r
+                       -duration, \r
+                       motion_blur_px, \r
+                       premultiply_with_alpha,\r
+                       progressive));\r
 }\r
 \r
 }}
\ No newline at end of file
index ff5d0266addc356eae674305588f8ff536830e24..c30cbac5ed3a8a4e935ee65626263a033e30e610 100644 (file)
@@ -586,18 +586,13 @@ safe_ptr<core::frame_consumer> create_consumer(const core::parameters& params)
        configuration config;\r
                \r
        if(params.size() > 1)\r
-               config.screen_index = lexical_cast_or_default<int>(params[1], config.screen_index);\r
+               config.screen_index =\r
+                               lexical_cast_or_default<int>(params[1], config.screen_index);\r
 \r
-       auto device_it = std::find(params.begin(), params.end(), L"DEVICE");\r
-       if(device_it != params.end() && ++device_it != params.end())\r
-               config.screen_index = boost::lexical_cast<int>(*device_it);\r
-               \r
-       config.windowed = std::find(params.begin(), params.end(), L"FULLSCREEN") == params.end();\r
-       config.key_only = std::find(params.begin(), params.end(), L"KEY_ONLY") != params.end();\r
-\r
-       auto name_it    = std::find(params.begin(), params.end(), L"NAME");\r
-       if(name_it != params.end() && ++name_it != params.end())\r
-               config.name = *name_it;\r
+       config.screen_index = params.get(L"DEVICE", config.screen_index);\r
+       config.windowed = !params.has(L"FULLSCREEN");\r
+       config.key_only = params.has(L"KEY_ONLY");\r
+       config.name = params.get(L"NAME", config.name);\r
 \r
        return make_safe<ogl_consumer_proxy>(config);\r
 }\r
index 9bc3de88cf8b6a16c173703d51dabc0543296d14..8c50a8cef3c3fc10dd992f7918c7fc0d8f74fc20 100644 (file)
@@ -30,9 +30,7 @@
 \r
 #include <boost/algorithm/string.hpp>\r
 \r
-namespace caspar {\r
-namespace protocol {\r
-namespace amcp {\r
+namespace caspar { namespace protocol { namespace amcp {\r
 \r
        enum AMCPCommandScheduling\r
        {\r
@@ -97,7 +95,6 @@ namespace amcp {
 \r
        protected:\r
                core::parameters _parameters;\r
-               std::vector<std::wstring> _parameters2; // TODO this can be deprecated with a small amount of coding CP 2013-01\r
 \r
        private:\r
                unsigned int channelIndex_;\r
@@ -119,7 +116,6 @@ namespace amcp {
        public:\r
                virtual bool Execute()\r
                {\r
-                       _parameters2 = _parameters; // TODO Refactor this in terms of the new parameters class CP 2013-01\r
                        _parameters.to_upper();\r
                        return (TNeedChannel && !GetChannel()) || _parameters.size() < TMinParameters ? false : DoExecute();\r
                }\r
index 900201ba4f6abccaeae542b960be834fa3ec287d..ec8367abe3055ef991a6f9606b7c24fda9ccd867 100644 (file)
@@ -333,7 +333,7 @@ bool ChannelGridCommand::DoExecute()
        int index = 1;\r
        auto self = GetChannels().back();\r
        \r
-       std::vector<std::wstring> params;\r
+       core::parameters params;\r
        params.push_back(L"SCREEN");\r
        params.push_back(L"NAME");\r
        params.push_back(L"Channel Grid Window");\r
@@ -386,17 +386,18 @@ bool CallCommand::DoExecute()
                auto what = _parameters.at(0);\r
                                \r
                boost::unique_future<std::wstring> result;\r
+               auto& params_orig = _parameters.get_original();\r
                if(what == L"B" || what == L"F")\r
                {\r
                        std::wstring param;\r
-                       for(auto it = std::begin(_parameters2)+1; it != std::end(_parameters2); ++it, param += L" ")\r
+                       for(auto it = std::begin(params_orig)+1; it != std::end(params_orig); ++it, param += L" ")\r
                                param += *it;\r
                        result = GetChannel()->stage()->call(GetLayerIndex(), what == L"F", boost::trim_copy(param));\r
                }\r
                else\r
                {\r
                        std::wstring param;\r
-                       for(auto it = std::begin(_parameters2); it != std::end(_parameters2); ++it, param += L" ")\r
+                       for(auto it = std::begin(params_orig); it != std::end(params_orig); ++it, param += L" ")\r
                                param += *it;\r
                        result = GetChannel()->stage()->call(GetLayerIndex(), true, boost::trim_copy(param));\r
                }\r
@@ -763,7 +764,6 @@ bool LoadCommand::DoExecute()
        //Perform loading of the clip\r
        try\r
        {\r
-               //_parameters[0] = _parameters[0]; // REVIEW: Why is this assignment done? CP 2013-01\r
                auto pFP = create_producer(GetChannel()->mixer(), _parameters);         \r
                GetChannel()->stage()->load(GetLayerIndex(), pFP, true);\r
        \r
@@ -869,7 +869,6 @@ bool LoadbgCommand::DoExecute()
        //Perform loading of the clip\r
        try\r
        {\r
-               //_parameters[0] = _parameters[0]; // REVIEW: Why is this assignment done? CP 2013-01\r
                auto pFP = create_producer(GetChannel()->mixer(), _parameters);\r
                if(pFP == frame_producer::empty())\r
                        BOOST_THROW_EXCEPTION(file_not_found() << msg_info(_parameters.size() > 0 ? narrow(_parameters[0]) : ""));\r
@@ -885,10 +884,7 @@ bool LoadbgCommand::DoExecute()
        }\r
        catch(file_not_found&)\r
        {               \r
-               std::wstring params2;\r
-               for(auto it = _parameters2.begin(); it != _parameters2.end(); ++it)\r
-                       params2 += L" " + *it;\r
-               CASPAR_LOG(error) << L"File not found. No match found for parameters. Check syntax:" << params2;\r
+               CASPAR_LOG(error) << L"File not found. No match found for parameters. Check syntax:" << _parameters.get_original_string();\r
                SetReplyString(TEXT("404 LOADBG ERROR\r\n"));\r
                return false;\r
        }\r
@@ -976,9 +972,9 @@ bool ClearCommand::DoExecute()
 \r
 bool PrintCommand::DoExecute()\r
 {\r
-       parameters params;
-       params.push_back(L"IMAGE");
-       GetChannel()->output()->add(create_consumer(params));
+       parameters params;\r
+       params.push_back(L"IMAGE");\r
+       GetChannel()->output()->add(create_consumer(params));\r
                \r
        SetReplyString(TEXT("202 PRINT OK\r\n"));\r
 \r
@@ -1065,7 +1061,7 @@ bool CGCommand::DoExecuteAdd() {
 \r
        if(_parameters[3].length() > 1) \r
        {       //read label\r
-               label = _parameters2[3];\r
+               label = _parameters.at_original(3);\r
                ++dataIndex;\r
 \r
                if(_parameters.size() > 4 && _parameters[4].length() > 0)       //read play-on-load-flag\r
@@ -1090,7 +1086,7 @@ bool CGCommand::DoExecuteAdd() {
        std::wstring dataFromFile;\r
        if(_parameters.size() > dataIndex) \r
        {       //read data\r
-               const std::wstring& dataString = _parameters2[dataIndex];\r
+               const std::wstring& dataString = _parameters.at_original(dataIndex);\r
 \r
                if(dataString[0] == TEXT('<')) //the data is an XML-string\r
                        pDataString = dataString.c_str();\r
@@ -1231,7 +1227,7 @@ bool CGCommand::DoExecuteUpdate()
                        return false;\r
                }\r
                                                \r
-               std::wstring dataString = _parameters2.at(2);                           \r
+               std::wstring dataString = _parameters.at_original(2);\r
                if(dataString.at(0) != TEXT('<'))\r
                {\r
                        //The data is not an XML-string, it must be a filename\r
@@ -1268,7 +1264,7 @@ bool CGCommand::DoExecuteInvoke()
                        return false;\r
                }\r
                int layer = _ttoi(_parameters[1].c_str());\r
-               auto result = flash::get_default_cg_producer(safe_ptr<core::video_channel>(GetChannel()), GetLayerIndex(flash::cg_producer::DEFAULT_LAYER))->invoke(layer, _parameters2[2]);\r
+               auto result = flash::get_default_cg_producer(safe_ptr<core::video_channel>(GetChannel()), GetLayerIndex(flash::cg_producer::DEFAULT_LAYER))->invoke(layer, _parameters.at_original(2));\r
                replyString << result << TEXT("\r\n"); \r
        }\r
        else \r
@@ -1352,7 +1348,7 @@ bool DataCommand::DoExecuteStore()
        }\r
 \r
        datafile << static_cast<wchar_t>(65279); // UTF-8 BOM character\r
-       datafile << _parameters2[2] << std::flush;\r
+       datafile << _parameters.at_original(2) << std::flush;\r
        datafile.close();\r
 \r
        std::wstring replyString = TEXT("202 DATA STORE OK\r\n");\r
index a7a0e9196b4e1cc9957083d2e4d13a4dae51ed24..87000acb8a6baa67f8f3ccdf4a2f458a72a29d6f 100644 (file)
@@ -201,13 +201,14 @@ struct server::implementation : boost::noncopyable
                        try\r
                        {\r
                                auto name = xml_consumer.first;\r
+\r
                                if (name == L"screen")\r
                                        on_consumer(ogl::create_consumer(xml_consumer.second));\r
                                else if (name == L"bluefish")                                   \r
                                        on_consumer(bluefish::create_consumer(xml_consumer.second));                                    \r
                                else if (name == L"decklink")                                   \r
                                        on_consumer(decklink::create_consumer(xml_consumer.second));                            \r
-                                       else if (name == L"file" || name ==L"stream")                                   \r
+                               else if (name == L"file" || name == L"stream")                                  \r
                                        on_consumer(ffmpeg::create_consumer(xml_consumer.second));                                              \r
                                else if (name == L"system-audio")\r
                                        on_consumer(oal::create_consumer());\r