diff options
author | Justin Dickow <jjdickow@gmail.com> | 2014-10-20 17:44:41 -0400 |
---|---|---|
committer | Justin Dickow <jjdickow@gmail.com> | 2014-10-20 17:44:41 -0400 |
commit | 34e7256493ff0e6594029b9857d7e2aa31f5dbeb (patch) | |
tree | 367306b507c52d3af211533810adbc22004e0192 /src/appMain/main.cc | |
parent | 2eef966e9b5fd4d94dd98820095eb765e200c64b (diff) | |
download | sdl_core-34e7256493ff0e6594029b9857d7e2aa31f5dbeb.tar.gz |
SDL 3.8!
Signed-off-by: Justin Dickow <jjdickow@gmail.com>
Diffstat (limited to 'src/appMain/main.cc')
-rw-r--r-- | src/appMain/main.cc | 238 |
1 files changed, 238 insertions, 0 deletions
diff --git a/src/appMain/main.cc b/src/appMain/main.cc new file mode 100644 index 0000000000..db947014c8 --- /dev/null +++ b/src/appMain/main.cc @@ -0,0 +1,238 @@ +/* + * Copyright (c) 2014, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/stat.h> +#include <unistd.h> +#include <signal.h> +#include <cstdio> +#include <cstdlib> +#include <vector> +#include <string> +#include <iostream> // cpplint: Streams are highly discouraged. +#include <fstream> // cpplint: Streams are highly discouraged. + +// ---------------------------------------------------------------------------- + +#include "utils/log_message_loop_thread.h" +#include "utils/logger.h" + +#include "./life_cycle.h" +#include "signal_handlers.h" + +#include "utils/signals.h" +#include "utils/system.h" +#include "config_profile/profile.h" +#include "utils/appenders_loader.h" + +#if defined(EXTENDED_MEDIA_MODE) +#include <gst/gst.h> +#endif + +#include "media_manager/media_manager_impl.h" +// ---------------------------------------------------------------------------- +// Third-Party includes +#include "networking.h" // cpplint: Include the directory when naming .h files + +// ---------------------------------------------------------------------------- + + +CREATE_LOGGERPTR_GLOBAL(logger_, "appMain") +extern const char* gitVersion; +namespace { + +const std::string kBrowser = "/usr/bin/chromium-browser"; +const std::string kBrowserName = "chromium-browser"; +const std::string kBrowserParams = "--auth-schemes=basic,digest,ntlm"; +const std::string kLocalHostAddress = "127.0.0.1"; +const std::string kApplicationVersion = "Develop"; + +#ifdef WEB_HMI +/** + * Initialize HTML based HMI. + * @return true if success otherwise false. + */ +bool InitHmi() { + +struct stat sb; +if (stat("hmi_link", &sb) == -1) { + LOG4CXX_FATAL(logger_, "File with HMI link doesn't exist!"); + return false; +} + +std::ifstream file_str; +file_str.open("hmi_link"); + +if (!file_str.is_open()) { + LOG4CXX_FATAL(logger_, "File with HMI link was not opened!"); + return false; +} + +std::string hmi_link; +std::getline(file_str, hmi_link); + + +LOG4CXX_INFO(logger_, + "Input string:" << hmi_link << " length = " << hmi_link.size()); +file_str.close(); + +if (stat(hmi_link.c_str(), &sb) == -1) { + LOG4CXX_FATAL(logger_, "HMI index.html doesn't exist!"); + return false; +} + return utils::System(kBrowser, kBrowserName).Add(kBrowserParams).Add(hmi_link) + .Execute(); +} +#endif // WEB_HMI + +#ifdef QT_HMI +/** + * Initialize HTML based HMI. + * @return true if success otherwise false. + */ +bool InitHmi() { + std::string kStartHmi = "./start_hmi.sh"; + struct stat sb; + if (stat(kStartHmi.c_str(), &sb) == -1) { + LOG4CXX_FATAL(logger_, "HMI start script doesn't exist!"); + return false; + } + + return utils::System(kStartHmi).Execute(); +} +#endif // QT_HMI + +} + +/** + * \brief Entry point of the program. + * \param argc number of argument + * \param argv array of arguments + * \return EXIT_SUCCESS or EXIT_FAILURE + */ +int32_t main(int32_t argc, char** argv) { + threads::Thread::MaskSignals(); + threads::Thread::SetMainThread(); + + // -------------------------------------------------------------------------- + // Logger initialization + INIT_LOGGER("log4cxx.properties"); + LOG4CXX_INFO(logger_, gitVersion); + + threads::Thread::SetNameForId(threads::Thread::CurrentId(), "MainThread"); + + if (!utils::appenders_loader.Loaded()) { + LOG4CXX_ERROR(logger_, "Appenders plugin not loaded, file logging disabled"); + } + + LOG4CXX_INFO(logger_, "Application started!"); + LOG4CXX_INFO(logger_, "Application version " << kApplicationVersion); + + // Initialize gstreamer. Needed to activate debug from the command line. +#if defined(EXTENDED_MEDIA_MODE) + gst_init(&argc, &argv); +#endif + + // -------------------------------------------------------------------------- + // Components initialization + if ((argc > 1)&&(0 != argv)) { + profile::Profile::instance()->config_file_name(argv[1]); + } else { + profile::Profile::instance()->config_file_name("smartDeviceLink.ini"); + } + +#ifdef __QNX__ + if (profile::Profile::instance()->enable_policy()) { + if (!utils::System("./init_policy.sh").Execute(true)) { + LOG4CXX_ERROR(logger_, "Failed initialization of policy database"); +#ifdef ENABLE_LOG + logger::LogMessageLoopThread::destroy(); +#endif + DEINIT_LOGGER(); + exit(EXIT_FAILURE); + } + } +#endif // __QNX__ + + if (!main_namespace::LifeCycle::instance()->StartComponents()) { + main_namespace::LifeCycle::instance()->StopComponents(); +#ifdef ENABLE_LOG + logger::LogMessageLoopThread::destroy(); +#endif + DEINIT_LOGGER(); + exit(EXIT_FAILURE); + } + + // -------------------------------------------------------------------------- + // Third-Party components initialization. + + if (!main_namespace::LifeCycle::instance()->InitMessageSystem()) { + main_namespace::LifeCycle::instance()->StopComponents(); + DEINIT_LOGGER(); + exit(EXIT_FAILURE); + } + LOG4CXX_INFO(logger_, "InitMessageBroker successful"); + + if (profile::Profile::instance()->launch_hmi()) { + if (profile::Profile::instance()->server_address() == kLocalHostAddress) { + LOG4CXX_INFO(logger_, "Start HMI on localhost"); + +#ifndef NO_HMI + if (!InitHmi()) { + main_namespace::LifeCycle::instance()->StopComponents(); +#ifdef ENABLE_LOG + logger::LogMessageLoopThread::destroy(); +#endif + DEINIT_LOGGER(); + exit(EXIT_FAILURE); + } + LOG4CXX_INFO(logger_, "InitHmi successful"); +#endif // #ifndef NO_HMI + } + } + // -------------------------------------------------------------------------- + + utils::SubscribeToTerminateSignal(main_namespace::dummy_signal_handler); + threads::Thread::UnmaskSignals(); + + pause(); + LOG4CXX_INFO(logger_, "Stopping application due to signal caught"); + + main_namespace::LifeCycle::instance()->StopComponents(); + + LOG4CXX_INFO(logger_, "Application successfully stopped"); +#ifdef ENABLE_LOG + logger::LogMessageLoopThread::destroy(); +#endif + DEINIT_LOGGER(); + + return EXIT_SUCCESS; +} |