2 * Copyright (c) 2011 Sveriges Television AB <info@casparcg.com>
4 * This file is part of CasparCG (www.casparcg.com).
6 * CasparCG is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * CasparCG is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with CasparCG. If not, see <http://www.gnu.org/licenses/>.
19 * Author: Helge Norberg, helge.norberg@svt.se
22 #include "included_modules.h"
24 #include <common/env.h>
25 #include <common/log.h>
27 #include <core/producer/media_info/in_memory_media_info_repository.h>
28 #include <core/help/help_repository.h>
29 #include <core/help/help_sink.h>
30 #include <core/help/util.h>
31 #include <core/consumer/syncto/syncto_consumer.h>
32 #include <core/producer/text/text_producer.h>
34 #include <protocol/amcp/amcp_command_repository.h>
35 #include <protocol/amcp/AMCPCommandsImpl.h>
37 #include <boost/filesystem/fstream.hpp>
42 using namespace caspar;
44 static const int WIDTH = 150;
46 class mediawiki_paragraph_builder : public core::paragraph_builder
48 std::wostringstream out_;
49 std::wostream& commit_to_;
51 mediawiki_paragraph_builder(std::wostream& out)
56 ~mediawiki_paragraph_builder()
58 commit_to_ << core::wordwrap(out_.str(), WIDTH) << std::endl;
61 spl::shared_ptr<paragraph_builder> text(std::wstring text) override
63 out_ << std::move(text);
64 return shared_from_this();
67 spl::shared_ptr<paragraph_builder> code(std::wstring text) override
69 out_ << L"<code>" << std::move(text) << L"</code>";
70 return shared_from_this();
73 spl::shared_ptr<paragraph_builder> strong(std::wstring text) override
75 out_ << L"'''" << std::move(text) << L"'''";
76 return shared_from_this();
79 spl::shared_ptr<paragraph_builder> see(std::wstring item) override
81 out_ << L"[[#" << item << L"|" << item << L"]]";
82 return shared_from_this();
85 spl::shared_ptr<paragraph_builder> url(std::wstring url, std::wstring name) override
87 out_ << L"[" << std::move(url) << L" " << std::move(name) << L"]";
88 return shared_from_this();
92 class mediawiki_definition_list_builder : public core::definition_list_builder
96 mediawiki_definition_list_builder(std::wostream& out)
101 ~mediawiki_definition_list_builder()
106 spl::shared_ptr<definition_list_builder> item(std::wstring term, std::wstring description) override
108 out_ << L"; <code>" << term << L"</code>\n";
109 out_ << L": " << description << L"\n";
111 return shared_from_this();
115 class mediawiki_help_sink : public core::help_sink
119 mediawiki_help_sink(std::wostream& out)
124 void start_section(std::wstring title)
126 out_ << L"=" << title << L"=\n" << std::endl;
129 void syntax(const std::wstring& syntax) override
131 out_ << L"Syntax:\n";
132 out_ << core::indent(core::wordwrap(syntax, WIDTH - 1), L" ") << std::endl;
135 spl::shared_ptr<core::paragraph_builder> para() override
137 return spl::make_shared<mediawiki_paragraph_builder>(out_);
140 spl::shared_ptr<core::definition_list_builder> definitions() override
142 return spl::make_shared<mediawiki_definition_list_builder>(out_);
145 void example(const std::wstring& code, const std::wstring& caption) override
147 out_ << core::indent(core::wordwrap(code, WIDTH - 1), L" ");
149 if (!caption.empty())
150 out_ << core::wordwrap(L"..." + caption, WIDTH - 1);
155 void begin_item(const std::wstring& name) override
157 out_ << L"==" << name << L"==\n" << std::endl;
161 void generate_amcp_commands_help(const core::help_repository& help_repo)
163 boost::filesystem::wofstream file(L"amcp_commands_help.wiki");
164 mediawiki_help_sink sink(file);
166 auto print_section = [&](std::wstring title)
168 sink.start_section(title);
169 help_repo.help({ L"AMCP", title }, sink);
172 print_section(L"Basic Commands");
173 print_section(L"Data Commands");
174 print_section(L"Template Commands");
175 print_section(L"Mixer Commands");
176 print_section(L"Thumbnail Commands");
177 print_section(L"Query Commands");
181 void generate_producers_help(const core::help_repository& help_repo)
183 boost::filesystem::wofstream file(L"producers_help.wiki");
184 mediawiki_help_sink sink(file);
186 sink.start_section(L"Producers (Input Modules)");
187 help_repo.help({ L"producer" }, sink);
192 void generate_consumers_help(const core::help_repository& help_repo)
194 boost::filesystem::wofstream file(L"consumers_help.wiki");
195 mediawiki_help_sink sink(file);
197 sink.start_section(L"Consumers (Output Modules)");
198 help_repo.help({ L"consumer" }, sink);
203 int main(int argc, char** argv)
205 if (intercept_command_line_args(argc, argv))
210 env::configure(L"casparcg.config");
211 spl::shared_ptr<core::system_info_provider_repository> system_info_provider_repo;
212 spl::shared_ptr<core::cg_producer_registry> cg_registry;
213 auto media_info_repo = core::create_in_memory_media_info_repository();
214 spl::shared_ptr<core::help_repository> help_repo;
215 auto producer_registry = spl::make_shared<core::frame_producer_registry>(help_repo);
216 auto consumer_registry = spl::make_shared<core::frame_consumer_registry>(help_repo);
217 std::promise<bool> shutdown_server_now;
218 protocol::amcp::amcp_command_repository repo(
222 system_info_provider_repo,
228 shutdown_server_now);
230 protocol::amcp::register_commands(repo);
232 core::module_dependencies dependencies(system_info_provider_repo, cg_registry, media_info_repo, producer_registry, consumer_registry);
233 initialize_modules(dependencies);
234 core::text::init(dependencies);
236 generate_amcp_commands_help(*help_repo);
237 generate_producers_help(*help_repo);
238 generate_consumers_help(*help_repo);
240 uninitialize_modules();