rcpp_framework/rcpp_framework.cpp

166 lines
3.2 KiB
C++

#include "rcpp_framework.h"
#include "core/error_macros.h"
#include "core/settings/settings.h"
#if DATABASES_ENABLED
#include "database/database_manager.h"
#include "database_backends/db_init.h"
#include "database_modules/db_settings/db_settings.h"
#endif
#if WEB_ENABLED
#include "web/file_cache.h"
#include "web/http/session_manager.h"
#endif
#include "platform/platform_initializer.h"
// Backends
#include "crypto_backends/hash_hashlib/setup.h"
void RCPPFramework::create() {
new RCPPFramework();
}
void RCPPFramework::destroy() {
delete _instance;
}
void RCPPFramework::create_and_init() {
new RCPPFramework();
RCPPFramework::get_singleton()->initialize();
}
void RCPPFramework::create_and_init(int argc, char **argv, char **envp) {
new RCPPFramework();
RCPPFramework::get_singleton()->initialize();
RCPPFramework::get_singleton()->setup_args(argc, argv, envp);
}
void RCPPFramework::initialize() {
if (_initialized) {
RLOG_ERR("RCPPFramework: has already beed initialized!");
return;
}
_initialized = true;
_do_initialize();
}
void RCPPFramework::initialize(int argc, char **argv, char **envp) {
initialize();
setup_args(argc, argv, envp);
}
void RCPPFramework::setup_args(int argc, char **argv, char **envp) {
ERR_FAIL_COND(!_initialized);
PlatformInitializer::arg_setup(argc, argv, envp);
}
void RCPPFramework::uninitialize() {
delete _instance;
}
void RCPPFramework::manage_object(Object *obj) {
ERR_FAIL_COND(!_initialized);
ERR_FAIL_COND(obj);
_managed_objects.push_back(obj);
}
RCPPFramework::RCPPFramework() {
_instance = this;
_initialized = false;
allocate_settings_singleton = true;
#if DATABASES_ENABLED
allocate_database_manager_singleton = true;
allocate_db_settings_singleton = true;
#endif
#if WEB_ENABLED
allocate_session_manager_singleton = true;
allocate_file_cache_singleton = true;
#endif
}
RCPPFramework::~RCPPFramework() {
// delete in reverse order added
for (int i = _managed_objects.size() - 1; i >= 0; --i) {
delete _managed_objects[i];
}
_managed_objects.clear();
_instance = nullptr;
}
RCPPFramework *RCPPFramework::get_singleton() {
return _instance;
}
RCPPFramework *RCPPFramework::_instance = nullptr;
void RCPPFramework::_do_initialize() {
#if DATABASES_ENABLED
initialize_database_backends();
#endif
backend_hash_hashlib_install_providers();
PlatformInitializer::allocate_all();
if (allocate_settings_singleton) {
Settings *settings = nullptr;
#if DATABASES_ENABLED
if (allocate_db_settings_singleton) {
settings = new DBSettings(true);
} else {
settings = new Settings(true);
}
#else
settings = new Settings(true);
#endif
manage_object(settings);
}
#if DATABASES_ENABLED
if (allocate_database_manager_singleton) {
DatabaseManager *dbm = new DatabaseManager();
manage_object(dbm);
}
#endif
#if WEB_ENABLED
if (allocate_session_manager_singleton) {
::SessionManager *session_manager = new ::SessionManager();
manage_object(session_manager);
}
if (allocate_file_cache_singleton) {
FileCache *file_cache = new FileCache(true);
manage_object(file_cache);
if (www_root != "") {
file_cache->wwwroot = www_root;
file_cache->wwwroot_refresh_cache();
}
}
#endif
}
void RCPPFramework::_do_uninitialize() {
PlatformInitializer::free_all();
}