X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=common%2Fenv.cpp;h=4dd5011050ffb039f54606c968d4ddb1856826f1;hb=042abffe522430cd2f5cb411a39c657ed137d0b4;hp=07f6e55ac230deacd4e0f357e0c4cd3bdb463e02;hpb=0298935819a4e86a0ee06d877fde9fe5f622710a;p=casparcg diff --git a/common/env.cpp b/common/env.cpp index 07f6e55ac..4dd501105 100644 --- a/common/env.cpp +++ b/common/env.cpp @@ -1,166 +1,220 @@ -/* -* Copyright (c) 2011 Sveriges Television AB -* -* This file is part of CasparCG (www.casparcg.com). -* -* CasparCG is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* CasparCG is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with CasparCG. If not, see . -* -* Author: Robert Nagy, ronag89@gmail.com -*/ - -#include "stdafx.h" - -#include "env.h" - -#include "../version.h" - -#include "except.h" -#include "log.h" -#include "string.h" - -#include -#include -#include -#include - -#include -#include - -namespace caspar { namespace env { - -std::wstring media; -std::wstring log; -std::wstring ftemplate; -std::wstring data; -boost::property_tree::wptree pt; - -void check_is_configured() -{ - if(pt.empty()) - BOOST_THROW_EXCEPTION(invalid_operation() << msg_info(L"Enviroment properties has not been configured")); -} - -void configure(const std::wstring& filename) -{ - try - { - auto initialPath = boost::filesystem3::initial_path().wstring(); - - std::wifstream file(initialPath + L"\\" + filename); - boost::property_tree::read_xml(file, pt, boost::property_tree::xml_parser::trim_whitespace | boost::property_tree::xml_parser::no_comments); - - auto paths = pt.get_child(L"configuration.paths"); - media = paths.get(L"media-path", initialPath + L"\\media\\"); - log = paths.get(L"log-path", initialPath + L"\\log\\"); - ftemplate = boost::filesystem3::complete(paths.get(L"template-path", initialPath + L"\\template\\")).wstring(); - data = paths.get(L"data-path", initialPath + L"\\data\\"); - - try - { - for(auto it = boost::filesystem::directory_iterator(initialPath); it != boost::filesystem::directory_iterator(); ++it) - { - if(it->path().wstring().find(L".fth") != std::wstring::npos) - { - auto from_path = *it; - auto to_path = boost::filesystem::path(ftemplate + L"/" + it->path().wstring()); - - if(boost::filesystem::exists(to_path)) - boost::filesystem::remove(to_path); - - boost::filesystem::copy_file(from_path, to_path); - } - } - } - catch(...) - { - CASPAR_LOG_CURRENT_EXCEPTION(); - CASPAR_LOG(error) << L"Failed to copy template-hosts from initial-path to template-path."; - } - } - catch(...) - { - CASPAR_LOG(error) << L" ### Invalid configuration file. ###"; - throw; - } - - try - { - auto media_path = boost::filesystem::path(media); - if(!boost::filesystem::exists(media_path)) - boost::filesystem::create_directory(media_path); - - auto log_path = boost::filesystem::path(log); - if(!boost::filesystem::exists(log_path)) - boost::filesystem::create_directory(log_path); - - auto template_path = boost::filesystem::path(ftemplate); - if(!boost::filesystem::exists(template_path)) - boost::filesystem::create_directory(template_path); - - auto data_path = boost::filesystem::path(data); - if(!boost::filesystem::exists(data_path)) - boost::filesystem::create_directory(data_path); - } - catch(...) - { - CASPAR_LOG_CURRENT_EXCEPTION(); - CASPAR_LOG(error) << L"Failed to create configured directories."; - } -} - -const std::wstring& media_folder() -{ - check_is_configured(); - return media; -} - -const std::wstring& log_folder() -{ - check_is_configured(); - return log; -} - -const std::wstring& template_folder() -{ - check_is_configured(); - return ftemplate; -} - -const std::wstring& data_folder() -{ - check_is_configured(); - return data; -} - -#define QUOTE(str) #str -#define EXPAND_AND_QUOTE(str) QUOTE(str) - -const std::wstring& version() -{ - static std::wstring ver = u16( - EXPAND_AND_QUOTE(CASPAR_GEN) "." - EXPAND_AND_QUOTE(CASPAR_MAYOR) "." - EXPAND_AND_QUOTE(CASPAR_MINOR) "." - EXPAND_AND_QUOTE(CASPAR_REV) " " - CASPAR_TAG); - return ver; -} - -const boost::property_tree::wptree& properties() -{ - check_is_configured(); - return pt; -} - -}} \ No newline at end of file +/* +* Copyright (c) 2011 Sveriges Television AB +* +* This file is part of CasparCG (www.casparcg.com). +* +* CasparCG is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* CasparCG is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with CasparCG. If not, see . +* +* Author: Robert Nagy, ronag89@gmail.com +*/ + +#include "stdafx.h" + +#include "env.h" + +#include "../version.h" + +#include "except.h" +#include "log.h" +#include "string.h" +#include "os/filesystem.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace caspar { namespace env { + +std::wstring initial; +std::wstring media; +std::wstring log; +std::wstring ftemplate; +std::wstring data; +std::wstring font; +std::wstring thumbnail; +boost::property_tree::wptree pt; + +void check_is_configured() +{ + if(pt.empty()) + CASPAR_THROW_EXCEPTION(invalid_operation() << msg_info(L"Enviroment properties has not been configured")); +} + +std::wstring clean_path(std::wstring path) +{ + boost::replace_all(path, L"\\\\", L"/"); + boost::replace_all(path, L"\\", L"/"); + + return path; +} + +std::wstring ensure_trailing_slash(std::wstring folder) +{ + if (folder.at(folder.length() - 1) != L'/') + folder.append(L"/"); + + return folder; +} + +std::wstring resolve_or_create(const std::wstring& folder) +{ + auto found_path = find_case_insensitive(folder); + + if (found_path) + return *found_path; + else + { + boost::system::error_code ec; + boost::filesystem::create_directories(folder, ec); + + if (ec) + CASPAR_THROW_EXCEPTION(user_error() << msg_info("Failed to create directory " + u8(folder) + " (" + ec.message() + ")")); + + return folder; + } +} + +void ensure_writable(const std::wstring& folder) +{ + static const std::wstring CREATE_FILE_TEST = L"casparcg_test_writable.empty"; + + boost::system::error_code ec; + boost::filesystem::path test_file(folder + L"/" + CREATE_FILE_TEST); + boost::filesystem::ofstream out(folder + L"/" + CREATE_FILE_TEST); + + if (out.fail()) + { + boost::filesystem::remove(test_file, ec); + CASPAR_THROW_EXCEPTION(user_error() << msg_info(L"Directory " + folder + L" is not writable.")); + } + + out.close(); + boost::filesystem::remove(test_file, ec); +} + +void configure(const std::wstring& filename) +{ + try + { + initial = clean_path(boost::filesystem::initial_path().wstring()); + + boost::filesystem::wifstream file(initial + L"/" + filename); + boost::property_tree::read_xml(file, pt, boost::property_tree::xml_parser::trim_whitespace | boost::property_tree::xml_parser::no_comments); + + auto paths = pt.get_child(L"configuration.paths"); + media = clean_path(paths.get(L"media-path", initial + L"/media/")); + log = clean_path(paths.get(L"log-path", initial + L"/log/")); + ftemplate = clean_path(boost::filesystem::complete(paths.get(L"template-path", initial + L"/template/")).wstring()); + data = clean_path(paths.get(L"data-path", initial + L"/data/")); + font = clean_path(paths.get(L"font-path", initial + L"/font/")); + thumbnail = clean_path(paths.get(L"thumbnail-path", paths.get(L"thumbnails-path", initial + L"/thumbnail/"))); + } + catch (...) + { + CASPAR_LOG(error) << L" ### Invalid configuration file. ###"; + throw; + } + + media = ensure_trailing_slash(resolve_or_create(media)); + log = ensure_trailing_slash(resolve_or_create(log)); + ftemplate = ensure_trailing_slash(resolve_or_create(ftemplate)); + data = ensure_trailing_slash(resolve_or_create(data)); + font = ensure_trailing_slash(resolve_or_create(font)); + thumbnail = ensure_trailing_slash(resolve_or_create(thumbnail)); + + ensure_writable(log); + ensure_writable(ftemplate); + ensure_writable(data); + ensure_writable(thumbnail); +} + +const std::wstring& initial_folder() +{ + check_is_configured(); + return initial; +} + +const std::wstring& media_folder() +{ + check_is_configured(); + return media; +} + +const std::wstring& log_folder() +{ + check_is_configured(); + return log; +} + +const std::wstring& template_folder() +{ + check_is_configured(); + return ftemplate; +} + +const std::wstring& data_folder() +{ + check_is_configured(); + return data; +} + +const std::wstring& font_folder() +{ + check_is_configured(); + return font; +} + +const std::wstring& thumbnail_folder() +{ + check_is_configured(); + return thumbnail; +} + +#define QUOTE(str) #str +#define EXPAND_AND_QUOTE(str) QUOTE(str) + +const std::wstring& version() +{ + static std::wstring ver = u16( + EXPAND_AND_QUOTE(CASPAR_GEN) "." + EXPAND_AND_QUOTE(CASPAR_MAYOR) "." + EXPAND_AND_QUOTE(CASPAR_MINOR) "." + CASPAR_REV " " + CASPAR_TAG); + return ver; +} + +const boost::property_tree::wptree& properties() +{ + check_is_configured(); + return pt; +} + +void log_configuration_warnings() +{ + if (pt.empty()) + return; + + if (pt.get_optional(L"configuration.paths.thumbnails-path")) + CASPAR_LOG(warning) << L"Element thumbnails-path in casparcg.config has been deprecated. Use thumbnail-path instead."; +} + +}}