summaryrefslogtreecommitdiff
path: root/src/components/policy/src/cache_manager.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/policy/src/cache_manager.cc')
-rw-r--r--src/components/policy/src/cache_manager.cc1601
1 files changed, 0 insertions, 1601 deletions
diff --git a/src/components/policy/src/cache_manager.cc b/src/components/policy/src/cache_manager.cc
deleted file mode 100644
index c0e402c580..0000000000
--- a/src/components/policy/src/cache_manager.cc
+++ /dev/null
@@ -1,1601 +0,0 @@
-/*
- * 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 "policy/cache_manager.h"
-
-#include <algorithm>
-#include <functional>
-#include <ctime>
-#include <cmath>
-
-#include "utils/file_system.h"
-#include "json/reader.h"
-#include "json/features.h"
-#include "json/writer.h"
-#include "utils/logger.h"
-#include "utils/gen_hash.h"
-#include "utils/macro.h"
-#include "utils/threads/thread.h"
-#include "utils/threads/thread_delegate.h"
-
-#include "policy/sql_pt_representation.h"
-
-namespace policy_table = rpc::policy_table_interface_base;
-
-namespace policy {
-
-CREATE_LOGGERPTR_GLOBAL(logger_, "Policy")
-
-#define CACHE_MANAGER_CHECK(return_value) \
- { \
- if (!pt_) { \
- LOG4CXX_WARN(logger_, "The cache manager is not initialized"); \
- return return_value; \
- } \
- }
-
-#define CACHE_MANAGER_CHECK_VOID() \
- { \
- if (!pt_) { \
- LOG4CXX_WARN(logger_, "The cache manager is not initialized"); \
- return; \
- } \
- }
-
-struct LanguageFinder {
- LanguageFinder(const std::string& language) : language_(language) {}
- bool operator()(const policy_table::Languages::value_type& lang) const {
- return !strcasecmp(language_.c_str(), lang.first.c_str());
- }
-
- private:
- const std::string& language_;
-};
-
-CacheManager::CacheManager()
- : CacheManagerInterface()
- , pt_(new policy_table::Table)
- , backup_(new SQLPTRepresentation())
- , update_required(false) {
- LOG4CXX_AUTO_TRACE(logger_);
- backuper_ = new BackgroundBackuper(this);
- backup_thread_ = threads::CreateThread("Backup thread", backuper_);
- backup_thread_->start();
-}
-
-CacheManager::~CacheManager() {
- LOG4CXX_AUTO_TRACE(logger_);
- sync_primitives::AutoLock lock(backuper_locker_);
- backup_thread_->join();
- delete backup_thread_->delegate();
- threads::DeleteThread(backup_thread_);
-}
-
-bool CacheManager::CanAppKeepContext(const std::string& app_id) const {
- CACHE_MANAGER_CHECK(false);
- bool result = true;
- return result;
-}
-
-uint32_t CacheManager::HeartBeatTimeout(const std::string& app_id) const {
- CACHE_MANAGER_CHECK(0);
- uint32_t result = 0;
- if (AppExists(app_id)) {
- if (pt_->policy_table.app_policies_section.apps[app_id]
- .heart_beat_timeout_ms.is_initialized()) {
- result = *(pt_->policy_table.app_policies_section.apps[app_id]
- .heart_beat_timeout_ms);
- }
- }
- return result;
-}
-
-bool CacheManager::CanAppStealFocus(const std::string& app_id) const {
- CACHE_MANAGER_CHECK(false);
- bool result = true;
- return result;
-}
-
-bool CacheManager::GetDefaultHMI(const std::string& app_id,
- std::string& default_hmi) const {
- CACHE_MANAGER_CHECK(false);
- bool result = true;
- return result;
-}
-
-bool CacheManager::ResetUserConsent() {
- CACHE_MANAGER_CHECK(false);
- sync_primitives::AutoLock lock(cache_lock_);
- return true;
-}
-
-bool CacheManager::GetUserPermissionsForDevice(
- const std::string& device_id,
- StringArray& consented_groups,
- StringArray& disallowed_groups) const {
- LOG4CXX_AUTO_TRACE(logger_);
- CACHE_MANAGER_CHECK(false);
- return true;
-}
-
-void CacheManager::GetAllAppGroups(const std::string& app_id,
- FunctionalGroupIDs& all_group_ids) {
- LOG4CXX_AUTO_TRACE(logger_);
- CACHE_MANAGER_CHECK_VOID();
-
- if (kDeviceId == app_id) {
- LOG4CXX_INFO(logger_, "Devices doesn't have groups");
- return;
- }
-
- policy_table::ApplicationPolicies::const_iterator app_params_iter =
- pt_->policy_table.app_policies_section.apps.find(app_id);
-
- if (pt_->policy_table.app_policies_section.apps.end() != app_params_iter) {
- policy_table::Strings::const_iterator iter =
- (*app_params_iter).second.groups.begin();
- policy_table::Strings::const_iterator iter_end =
- (*app_params_iter).second.groups.end();
-
- for (; iter != iter_end; ++iter) {
- const uint32_t group_id = static_cast<uint32_t>((GenerateHash(*iter)));
- all_group_ids.push_back(group_id);
- }
- }
-}
-
-void CacheManager::GetPreConsentedGroups(
- const std::string& app_id, FunctionalGroupIDs& preconsented_groups) {
- LOG4CXX_AUTO_TRACE(logger_);
- CACHE_MANAGER_CHECK_VOID();
-}
-
-void CacheManager::GetConsentedGroups(const std::string& device_id,
- const std::string& app_id,
- FunctionalGroupIDs& allowed_groups,
- FunctionalGroupIDs& disallowed_groups) {
- LOG4CXX_AUTO_TRACE(logger_);
- CACHE_MANAGER_CHECK_VOID();
-}
-
-void CacheManager::GetUnconsentedGroups(
- const std::string& device_id,
- const std::string& policy_app_id,
- FunctionalGroupIDs& unconsented_groups) {
- LOG4CXX_AUTO_TRACE(logger_);
- CACHE_MANAGER_CHECK_VOID();
-}
-
-void CacheManager::RemoveAppConsentForGroup(const std::string& app_id,
- const std::string& group_name) {
- CACHE_MANAGER_CHECK_VOID();
-}
-
-bool CacheManager::ApplyUpdate(const policy_table::Table& update_pt) {
- LOG4CXX_AUTO_TRACE(logger_);
- CACHE_MANAGER_CHECK(false);
- sync_primitives::AutoLock auto_lock(cache_lock_);
- pt_->policy_table.functional_groupings =
- update_pt.policy_table.functional_groupings;
-
- policy_table::ApplicationPolicies::const_iterator iter =
- update_pt.policy_table.app_policies_section.apps.begin();
- policy_table::ApplicationPolicies::const_iterator iter_end =
- update_pt.policy_table.app_policies_section.apps.end();
-
- for (; iter != iter_end; ++iter) {
- if (iter->second.is_null()) {
- pt_->policy_table.app_policies_section.apps[iter->first].set_to_null();
- pt_->policy_table.app_policies_section.apps[iter->first].set_to_string(
- "");
- } else if (policy::kDefaultId == (iter->second).get_string()) {
- policy_table::ApplicationPolicies::const_iterator iter_default =
- update_pt.policy_table.app_policies_section.apps.find(kDefaultId);
- if (update_pt.policy_table.app_policies_section.apps.end() ==
- iter_default) {
- LOG4CXX_ERROR(logger_, "The default section was not found in PTU");
- continue;
- }
- pt_->policy_table.app_policies_section.apps[iter->first] =
- iter_default->second;
- } else {
- pt_->policy_table.app_policies_section.apps[iter->first] = iter->second;
- }
- }
-
- pt_->policy_table.app_policies_section.device =
- update_pt.policy_table.app_policies_section.device;
-
- pt_->policy_table.module_config.SafeCopyFrom(
- update_pt.policy_table.module_config);
-
- pt_->policy_table.consumer_friendly_messages.assign_if_valid(
- update_pt.policy_table.consumer_friendly_messages);
-
- ResetCalculatedPermissions();
- Backup();
- return true;
-}
-
-void CacheManager::GetHMIAppTypeAfterUpdate(
- std::map<std::string, StringArray>& app_hmi_types) {
- LOG4CXX_AUTO_TRACE(logger_);
- CACHE_MANAGER_CHECK_VOID();
- policy_table::ApplicationPolicies::const_iterator policy_iter_begin =
- pt_->policy_table.app_policies_section.apps.begin();
- policy_table::ApplicationPolicies::const_iterator policy_iter_end =
- pt_->policy_table.app_policies_section.apps.end();
- std::vector<std::string> transform_app_hmi_types;
- for (; policy_iter_begin != policy_iter_end; ++policy_iter_begin) {
- const policy_table::ApplicationParams& app_params =
- (*policy_iter_begin).second;
- if (app_params.AppHMIType.is_initialized()) {
- if (!(transform_app_hmi_types.empty())) {
- transform_app_hmi_types.clear();
- }
- std::transform(app_params.AppHMIType->begin(),
- app_params.AppHMIType->end(),
- std::back_inserter(transform_app_hmi_types),
- AppHMITypeToString());
- app_hmi_types[(*policy_iter_begin).first] = transform_app_hmi_types;
- }
- }
-}
-
-void CacheManager::Backup() {
- sync_primitives::AutoLock lock(backuper_locker_);
- DCHECK(backuper_);
- backuper_->DoBackup();
-}
-
-std::string CacheManager::currentDateTime() {
- time_t now = time(0);
- struct tm tstruct;
- char buf[80];
- tstruct = *localtime(&now);
- // ISO_8601 format is expected, e.g. “2000-01-01T12:18:53Z”
- strftime(buf, sizeof(buf), "%Y-%m-%dT%XZ", &tstruct);
- return buf;
-}
-
-bool CacheManager::GetPermissionsForApp(const std::string& device_id,
- const std::string& app_id,
- FunctionalIdType& group_types) {
- LOG4CXX_AUTO_TRACE(logger_);
- GetAllAppGroups(app_id, group_types[kTypeGeneral]);
- GetAllAppGroups(kDefaultId, group_types[kTypeDefault]);
- GetAllAppGroups(kPreDataConsentId, group_types[kTypePreDataConsented]);
- return true;
-}
-
-bool CacheManager::GetDeviceGroupsFromPolicies(
- policy_table::Strings& groups,
- policy_table::Strings& preconsented_groups) const {
- LOG4CXX_AUTO_TRACE(logger_);
- CACHE_MANAGER_CHECK(false);
- return true;
-}
-
-bool CacheManager::AddDevice(const std::string& device_id,
- const std::string& connection_type) {
- LOG4CXX_AUTO_TRACE(logger_);
-
- sync_primitives::AutoLock auto_lock(cache_lock_);
- CACHE_MANAGER_CHECK(false);
- policy_table::DeviceParams& params =
- (*(pt_->policy_table.device_data))[device_id];
-
- // Open SDL stored just device id in policy
- UNUSED(params);
-
- // We have to set preloaded flag as false in policy table on adding new
- // information (SDLAQ-CRS-2365). It can happens only after device addition.
- *pt_->policy_table.module_config.preloaded_pt = false;
-
- Backup();
- return true;
-}
-
-bool CacheManager::SetDeviceData(const std::string& device_id,
- const std::string& hardware,
- const std::string& firmware,
- const std::string& os,
- const std::string& os_version,
- const std::string& carrier,
- const uint32_t number_of_ports,
- const std::string& connection_type) {
- LOG4CXX_AUTO_TRACE(logger_);
-
- sync_primitives::AutoLock auto_lock(cache_lock_);
- CACHE_MANAGER_CHECK(false);
- Backup();
- return true;
-}
-
-bool CacheManager::SetUserPermissionsForDevice(
- const std::string& device_id,
- const StringArray& consented_groups,
- const StringArray& disallowed_groups) {
- LOG4CXX_AUTO_TRACE(logger_);
- sync_primitives::AutoLock auto_lock(cache_lock_);
- CACHE_MANAGER_CHECK(false);
- Backup();
- return true;
-}
-
-bool CacheManager::ReactOnUserDevConsentForApp(const std::string& app_id,
- bool is_device_allowed) {
- LOG4CXX_AUTO_TRACE(logger_);
- CACHE_MANAGER_CHECK(false);
- bool result = true;
- Backup();
- return result;
-}
-
-void CacheManager::GetGroupNameByHashID(const int32_t group_id,
- std::string& group_name) {
- CACHE_MANAGER_CHECK_VOID();
- policy_table::FunctionalGroupings::const_iterator fg_iter =
- pt_->policy_table.functional_groupings.begin();
- policy_table::FunctionalGroupings::const_iterator fg_iter_end =
- pt_->policy_table.functional_groupings.end();
-
- for (; fg_iter != fg_iter_end; ++fg_iter) {
- const int32_t id = GenerateHash((*fg_iter).first);
- if (group_id == id) {
- group_name = (*fg_iter).first;
- }
- }
-}
-
-bool CacheManager::SetUserPermissionsForApp(
- const PermissionConsent& permissions) {
- LOG4CXX_AUTO_TRACE(logger_);
- sync_primitives::AutoLock auto_lock(cache_lock_);
- CACHE_MANAGER_CHECK(false);
- Backup();
- return true;
-}
-
-bool CacheManager::UpdateRequired() const {
- return update_required;
-}
-
-void CacheManager::SaveUpdateRequired(bool status) {
- update_required = status;
- Backup();
-}
-
-bool CacheManager::IsApplicationRevoked(const std::string& app_id) const {
- CACHE_MANAGER_CHECK(false);
- bool is_revoked = false;
- if (pt_->policy_table.app_policies_section.apps.end() !=
- pt_->policy_table.app_policies_section.apps.find(app_id)) {
- is_revoked = pt_->policy_table.app_policies_section.apps[app_id].is_null();
- }
-
- return is_revoked;
-}
-
-void CacheManager::CheckPermissions(const PTString& app_id,
- const PTString& hmi_level,
- const PTString& rpc,
- CheckPermissionResult& result) {
- LOG4CXX_AUTO_TRACE(logger_);
- CACHE_MANAGER_CHECK_VOID();
-
- if (pt_->policy_table.app_policies_section.apps.end() ==
- pt_->policy_table.app_policies_section.apps.find(app_id)) {
- LOG4CXX_ERROR(
- logger_, "Application id " << app_id << " was not found in policy DB.");
- return;
- }
-
- policy_table::Strings::const_iterator app_groups_iter =
- pt_->policy_table.app_policies_section.apps[app_id].groups.begin();
-
- policy_table::Strings::const_iterator app_groups_iter_end =
- pt_->policy_table.app_policies_section.apps[app_id].groups.end();
-
- policy_table::FunctionalGroupings::const_iterator concrete_group;
-
- for (; app_groups_iter != app_groups_iter_end; ++app_groups_iter) {
- concrete_group =
- pt_->policy_table.functional_groupings.find(*app_groups_iter);
- if (pt_->policy_table.functional_groupings.end() != concrete_group) {
- const policy_table::Rpcs& rpcs = concrete_group->second;
-
- policy_table::Rpc::const_iterator rpc_iter = rpcs.rpcs.find(rpc);
- if (rpcs.rpcs.end() != rpc_iter) {
- policy_table::RpcParameters rpc_param = rpc_iter->second;
-
- policy_table::HmiLevel hmi_level_e;
- policy_table::EnumFromJsonString(hmi_level, &hmi_level_e);
-
- policy_table::HmiLevels::const_iterator hmi_iter =
- std::find(rpc_param.hmi_levels.begin(),
- rpc_param.hmi_levels.end(),
- hmi_level_e);
-
- if (rpc_param.hmi_levels.end() != hmi_iter) {
- result.hmi_level_permitted = PermitResult::kRpcAllowed;
-
- policy_table::Parameters::const_iterator params_iter =
- rpc_param.parameters->begin();
- policy_table::Parameters::const_iterator params_iter_end =
- rpc_param.parameters->end();
-
- for (; params_iter != params_iter_end; ++params_iter) {
- result.list_of_allowed_params.push_back(
- policy_table::EnumToJsonString(*params_iter));
- }
- }
- }
- }
- }
-}
-
-bool CacheManager::IsPTPreloaded() {
- CACHE_MANAGER_CHECK(false);
- return *pt_->policy_table.module_config.preloaded_pt;
-}
-
-int CacheManager::IgnitionCyclesBeforeExchange() {
- CACHE_MANAGER_CHECK(0);
- const uint8_t limit = std::max(
- static_cast<int>(
- pt_->policy_table.module_config.exchange_after_x_ignition_cycles),
- 0);
- LOG4CXX_DEBUG(logger_, "IgnitionCyclesBeforeExchange limit:" << limit);
- uint8_t current = 0;
-
- const int last_exch = static_cast<int>(
- *pt_->policy_table.module_meta->ignition_cycles_since_last_exchange);
- current = std::max(last_exch, 0);
- LOG4CXX_DEBUG(
- logger_,
- "IgnitionCyclesBeforeExchange current:" << static_cast<int>(current));
-
- return std::max(limit - current, 0);
-}
-
-int CacheManager::KilometersBeforeExchange(int current) {
- CACHE_MANAGER_CHECK(0);
- const int limit =
- std::max(static_cast<int>(
- pt_->policy_table.module_config.exchange_after_x_kilometers),
- 0);
- LOG4CXX_DEBUG(logger_, "KilometersBeforeExchange limit:" << limit);
- int last = 0;
-
- const int odo_val = static_cast<int>(
- *pt_->policy_table.module_meta->pt_exchanged_at_odometer_x);
- last = std::max(odo_val, 0);
- LOG4CXX_DEBUG(logger_, "KilometersBeforeExchange last:" << last);
-
- const int actual = std::max((current - last), 0);
- LOG4CXX_DEBUG(logger_, "KilometersBeforeExchange actual:" << actual);
- return std::max(limit - actual, 0);
-}
-
-bool CacheManager::SetCountersPassedForSuccessfulUpdate(
- policy::Counters counter, int value) {
- CACHE_MANAGER_CHECK(false);
- switch (counter) {
- case KILOMETERS:
- *pt_->policy_table.module_meta->pt_exchanged_at_odometer_x = value;
- LOG4CXX_DEBUG(logger_,
- "SetCountersPassedForSuccessfulUpdate km:" << value);
- break;
- case DAYS_AFTER_EPOCH:
- *pt_->policy_table.module_meta->pt_exchanged_x_days_after_epoch = value;
- LOG4CXX_DEBUG(
- logger_,
- "SetCountersPassedForSuccessfulUpdate days after epoch:" << value);
- break;
- default:
- LOG4CXX_ERROR(logger_,
- "Unknown counter was requested to set: " << counter);
- return false;
- }
-
- Backup();
- return true;
-}
-
-int CacheManager::DaysBeforeExchange(int current) {
- LOG4CXX_AUTO_TRACE(logger_);
- CACHE_MANAGER_CHECK(0);
- const uint8_t limit = pt_->policy_table.module_config.exchange_after_x_days;
- LOG4CXX_DEBUG(logger_,
- "Exchange after: " << static_cast<int>(limit) << " days");
-
- const uint16_t days_after_epoch =
- (*pt_->policy_table.module_meta->pt_exchanged_x_days_after_epoch);
- LOG4CXX_DEBUG(logger_, "Epoch since last update: " << days_after_epoch);
-
- const uint16_t actual =
- std::max(static_cast<uint16_t>(current - days_after_epoch), uint16_t(0));
- LOG4CXX_DEBUG(logger_, "The days since last update: " << actual);
-
- return std::max(limit - actual, 0);
-}
-
-void CacheManager::IncrementIgnitionCycles() {
- CACHE_MANAGER_CHECK_VOID();
- const int ign_val = static_cast<int>(
- *pt_->policy_table.module_meta->ignition_cycles_since_last_exchange);
- (*pt_->policy_table.module_meta->ignition_cycles_since_last_exchange) =
- ign_val + 1;
- LOG4CXX_DEBUG(logger_, "IncrementIgnitionCycles ignitions:" << ign_val);
- Backup();
-}
-
-void CacheManager::ResetIgnitionCycles() {
- CACHE_MANAGER_CHECK_VOID();
- (*pt_->policy_table.module_meta->ignition_cycles_since_last_exchange) = 0;
- Backup();
-}
-
-int CacheManager::TimeoutResponse() {
- CACHE_MANAGER_CHECK(0);
- return pt_->policy_table.module_config.timeout_after_x_seconds;
-}
-
-bool CacheManager::SecondsBetweenRetries(std::vector<int>& seconds) {
- CACHE_MANAGER_CHECK(false);
- rpc::policy_table_interface_base::SecondsBetweenRetries::iterator iter =
- pt_->policy_table.module_config.seconds_between_retries.begin();
- rpc::policy_table_interface_base::SecondsBetweenRetries::iterator iter_end =
- pt_->policy_table.module_config.seconds_between_retries.end();
-
- const std::size_t size =
- pt_->policy_table.module_config.seconds_between_retries.size();
- seconds.reserve(size);
- for (; iter != iter_end; ++iter) {
- seconds.push_back(*iter);
- }
- return true;
-}
-
-const policy::VehicleInfo CacheManager::GetVehicleInfo() const {
- CACHE_MANAGER_CHECK(VehicleInfo());
- policy_table::ModuleConfig& module_config = pt_->policy_table.module_config;
- VehicleInfo vehicle_info;
- vehicle_info.vehicle_make = *module_config.vehicle_make;
- vehicle_info.vehicle_model = *module_config.vehicle_model;
- vehicle_info.vehicle_year = *module_config.vehicle_year;
- LOG4CXX_DEBUG(
- logger_,
- "Vehicle info (make, model, year):" << vehicle_info.vehicle_make << ","
- << vehicle_info.vehicle_model << ","
- << vehicle_info.vehicle_year);
- return vehicle_info;
-}
-
-std::vector<UserFriendlyMessage> CacheManager::GetUserFriendlyMsg(
- const std::vector<std::string>& msg_codes, const std::string& language) {
- LOG4CXX_AUTO_TRACE(logger_);
- std::vector<UserFriendlyMessage> result;
- CACHE_MANAGER_CHECK(result);
-
- std::vector<std::string>::const_iterator it = msg_codes.begin();
- std::vector<std::string>::const_iterator it_end = msg_codes.end();
- for (; it != it_end; ++it) {
- policy_table::MessageLanguages msg_languages =
- (*pt_->policy_table.consumer_friendly_messages->messages)[*it];
-
- policy_table::MessageString message_string;
-
- // If message has no records with required language, fallback language
- // should be used instead.
- LanguageFinder finder(language);
- policy_table::Languages::const_iterator it_language = std::find_if(
- msg_languages.languages.begin(), msg_languages.languages.end(), finder);
-
- if (msg_languages.languages.end() == it_language) {
- LOG4CXX_WARN(logger_,
- "Language "
- << language
- << " haven't been found for message code: " << *it);
-
- LanguageFinder fallback_language_finder("en-us");
-
- policy_table::Languages::const_iterator it_fallback_language =
- std::find_if(msg_languages.languages.begin(),
- msg_languages.languages.end(),
- fallback_language_finder);
-
- if (msg_languages.languages.end() == it_fallback_language) {
- LOG4CXX_ERROR(logger_,
- "No fallback language found for message code: " << *it);
- continue;
- }
-
- message_string = it_fallback_language->second;
- } else {
- message_string = it_language->second;
- }
-
- UserFriendlyMessage msg;
- msg.message_code = *it;
- result.push_back(msg);
- }
- return result;
-}
-
-void CacheManager::GetServiceUrls(const std::string& service_type,
- EndpointUrls& end_points) {
- LOG4CXX_AUTO_TRACE(logger_);
- CACHE_MANAGER_CHECK_VOID();
- std::string search_value;
- if (!IsNumberService(service_type, search_value)) {
- search_value = service_type;
- }
-
- LOG4CXX_DEBUG(logger_, "Search service value is: " << search_value);
-
- policy_table::ServiceEndpoints::const_iterator iter =
- pt_->policy_table.module_config.endpoints.find(search_value);
-
- if (pt_->policy_table.module_config.endpoints.end() != iter) {
- policy_table::URLList::const_iterator url_list_iter =
- (*iter).second.begin();
- policy_table::URLList::const_iterator url_list_iter_end =
- (*iter).second.end();
- for (; url_list_iter != url_list_iter_end; ++url_list_iter) {
- EndpointData data;
- data.app_id = (*url_list_iter).first;
- std::copy((*url_list_iter).second.begin(),
- (*url_list_iter).second.end(),
- std::back_inserter(data.url));
-
- end_points.push_back(data);
- }
- }
-}
-
-std::string CacheManager::GetLockScreenIconUrl() const {
- if (backup_) {
- return backup_->GetLockScreenIconUrl();
- }
- return std::string("");
-}
-
-rpc::policy_table_interface_base::NumberOfNotificationsType
-CacheManager::GetNotificationsNumber(const std::string& priority) {
- CACHE_MANAGER_CHECK(0);
- typedef rpc::policy_table_interface_base::NumberOfNotificationsPerMinute NNPM;
-
- const NNPM& nnpm =
- pt_->policy_table.module_config.notifications_per_minute_by_priority;
-
- NNPM::const_iterator priority_iter = nnpm.find(priority);
-
- const rpc::policy_table_interface_base::NumberOfNotificationsType result =
- (nnpm.end() != priority_iter ? (*priority_iter).second : 0u);
- return result;
-}
-
-bool CacheManager::GetPriority(const std::string& policy_app_id,
- std::string& priority) const {
- CACHE_MANAGER_CHECK(false);
- if (kDeviceId == policy_app_id) {
- priority = EnumToJsonString(
- pt_->policy_table.app_policies_section.device.priority);
- return true;
- }
-
- const policy_table::ApplicationPolicies& policies =
- pt_->policy_table.app_policies_section.apps;
-
- policy_table::ApplicationPolicies::const_iterator policy_iter =
- policies.find(policy_app_id);
- const bool app_id_exists = policies.end() != policy_iter;
- if (app_id_exists) {
- priority = EnumToJsonString((*policy_iter).second.priority);
- }
-
- return app_id_exists;
-}
-
-void CacheManager::CheckSnapshotInitialization() {
- CACHE_MANAGER_CHECK_VOID();
- if (!snapshot_) {
- LOG4CXX_ERROR(logger_, "Snapshot pointer is not initialized");
- return;
- }
-
- *(snapshot_->policy_table.module_config.preloaded_pt) = false;
-
- // SDL must not send certificate in snapshot
- snapshot_->policy_table.module_config.certificate =
- rpc::Optional<rpc::String<0, 65535> >();
-
- /* consumer_friendly_messages are required for the snapshot;
- * consumer_friendly_messages->version is required always, but
- * consumer_friendly_messages->messages must be omitted in PTS */
- if (snapshot_->policy_table.consumer_friendly_messages->is_initialized()) {
- snapshot_->policy_table.consumer_friendly_messages->messages =
- rpc::Optional<policy_table::Messages>();
- } else {
- LOG4CXX_WARN(logger_,
- "policy_table.consumer_friendly_messages is not initialized");
- }
-
- /* policy_table.usage_and_error_counts are required for PTS and
- * policy_table.usage_and_error_counts->app_level is optional */
- rpc::Optional<policy_table::UsageAndErrorCounts>& usage_and_error_counts =
- snapshot_->policy_table.usage_and_error_counts;
-
- if (usage_and_error_counts->app_level->is_initialized()) {
- policy_table::AppLevels::iterator it =
- usage_and_error_counts->app_level->begin();
- policy_table::AppLevels::const_iterator it_end =
- usage_and_error_counts->app_level->end();
- for (; it != it_end; ++it) {
- if (!(*it).second.minutes_in_hmi_full.is_initialized()) {
- (*it).second.minutes_in_hmi_full = 0;
- }
-
- if (!(*it).second.app_registration_language_gui.is_initialized()) {
- (*it).second.app_registration_language_gui = "unknown";
- }
-
- if (!(*it).second.app_registration_language_vui.is_initialized()) {
- (*it).second.app_registration_language_vui = "unknown";
- }
-
- if (!(*it).second.minutes_in_hmi_limited.is_initialized()) {
- (*it).second.minutes_in_hmi_limited = 0;
- }
-
- if (!(*it).second.minutes_in_hmi_background.is_initialized()) {
- (*it).second.minutes_in_hmi_background = 0;
- }
-
- if (!(*it).second.minutes_in_hmi_none.is_initialized()) {
- (*it).second.minutes_in_hmi_none = 0;
- }
-
- if (!(*it).second.count_of_user_selections.is_initialized()) {
- (*it).second.count_of_user_selections = 0;
- }
-
- if (!(*it)
- .second.count_of_rejections_sync_out_of_memory
- .is_initialized()) {
- (*it).second.count_of_rejections_sync_out_of_memory = 0;
- }
-
- if (!(*it)
- .second.count_of_rejections_nickname_mismatch.is_initialized()) {
- (*it).second.count_of_rejections_nickname_mismatch = 0;
- }
-
- if (!(*it).second.count_of_rejections_duplicate_name.is_initialized()) {
- (*it).second.count_of_rejections_duplicate_name = 0;
- }
-
- if (!(*it).second.count_of_rejected_rpc_calls.is_initialized()) {
- (*it).second.count_of_rejected_rpc_calls = 0;
- }
-
- if (!(*it).second.count_of_rpcs_sent_in_hmi_none.is_initialized()) {
- (*it).second.count_of_rpcs_sent_in_hmi_none = 0;
- }
-
- if (!(*it).second.count_of_removals_for_bad_behavior.is_initialized()) {
- (*it).second.count_of_removals_for_bad_behavior = 0;
- }
-
- if (!(*it).second.count_of_run_attempts_while_revoked.is_initialized()) {
- (*it).second.count_of_run_attempts_while_revoked = 0;
- }
- }
- } else {
- LOG4CXX_WARN(logger_, "app_level is not initialized");
- }
-}
-
-void CacheManager::PersistData() {
- LOG4CXX_AUTO_TRACE(logger_);
- if (backup_.valid()) {
- if (pt_.valid()) {
- cache_lock_.Acquire();
- policy_table::Table copy_pt(*pt_);
- cache_lock_.Release();
-
- backup_->Save(copy_pt);
- backup_->SaveUpdateRequired(update_required);
-
- policy_table::ApplicationPolicies::const_iterator app_policy_iter =
- copy_pt.policy_table.app_policies_section.apps.begin();
- policy_table::ApplicationPolicies::const_iterator app_policy_iter_end =
- copy_pt.policy_table.app_policies_section.apps.end();
-
- bool is_revoked = false;
- bool is_default_policy;
- bool is_predata_policy;
-
- for (; app_policy_iter != app_policy_iter_end; ++app_policy_iter) {
- const std::string app_id = (*app_policy_iter).first;
-
- if (copy_pt.policy_table.app_policies_section.apps.end() !=
- copy_pt.policy_table.app_policies_section.apps.find(app_id)) {
- is_revoked =
- copy_pt.policy_table.app_policies_section.apps[app_id].is_null();
- }
-
- is_default_policy =
- copy_pt.policy_table.app_policies_section.apps.end() !=
- copy_pt.policy_table.app_policies_section.apps.find(app_id) &&
- policy::kDefaultId ==
- copy_pt.policy_table.app_policies_section.apps[app_id]
- .get_string();
-
- // TODO(AOleynik): Remove this field from DB
- is_predata_policy =
- copy_pt.policy_table.app_policies_section.apps.end() !=
- copy_pt.policy_table.app_policies_section.apps.find(app_id) &&
- policy::kPreDataConsentId ==
- copy_pt.policy_table.app_policies_section.apps[app_id]
- .get_string();
-
- backup_->SaveApplicationCustomData(
- app_id, is_revoked, is_default_policy, is_predata_policy);
- is_revoked = false;
- }
-
- // In case of extended policy the meta info should be backuped as well.
- backup_->WriteDb();
- }
- }
-}
-
-void CacheManager::ResetCalculatedPermissions() {
- LOG4CXX_AUTO_TRACE(logger_);
- sync_primitives::AutoLock lock(calculated_permissions_lock_);
- calculated_permissions_.clear();
-}
-
-void CacheManager::AddCalculatedPermissions(const std::string& device_id,
- const std::string& policy_app_id,
- const Permissions& permissions) {
- LOG4CXX_DEBUG(logger_,
- "AddCalculatedPermissions for device: "
- << device_id << " and app: " << policy_app_id);
- sync_primitives::AutoLock lock(calculated_permissions_lock_);
- calculated_permissions_[device_id][policy_app_id] = permissions;
-}
-
-bool CacheManager::IsPermissionsCalculated(const std::string& device_id,
- const std::string& policy_app_id,
- Permissions& permission) {
- LOG4CXX_DEBUG(logger_,
- "IsPermissionsCalculated for device: "
- << device_id << " and app: " << policy_app_id);
- sync_primitives::AutoLock lock(calculated_permissions_lock_);
- CalculatedPermissions::const_iterator it =
- calculated_permissions_.find(device_id);
-
- if (calculated_permissions_.end() == it) {
- return false;
- }
-
- AppCalculatedPermissions::const_iterator app_it =
- (*it).second.find(policy_app_id);
- if ((*it).second.end() == app_it) {
- return false;
- } else {
- permission = (*app_it).second;
- return true;
- }
- return false;
-}
-
-bool policy::CacheManager::IsNumberService(const std::string& input,
- std::string& output) const {
- const char* input_value = input.c_str();
- char* endptr;
- const int base = 10;
- errno = 0;
- uint32_t service_value = strtoul(input_value, &endptr, base);
- bool is_real_zero_value =
- (!service_value && endptr != input_value && *endptr == '\0');
- if (!is_real_zero_value && (!service_value || errno == ERANGE)) {
- return false;
- }
-
- output = input;
- if (service_value <= 9) {
- output.insert(0, "0x0", 3);
- } else {
- output.insert(0, "0x", 2);
- }
-
- return true;
-}
-
-utils::SharedPtr<policy_table::Table> CacheManager::GenerateSnapshot() {
- CACHE_MANAGER_CHECK(snapshot_);
- sync_primitives::AutoLock lock(cache_lock_);
-
- snapshot_ = new policy_table::Table();
-
- // Copy all members of policy table except messages in consumer friendly
- // messages
- snapshot_->policy_table.app_policies_section =
- pt_->policy_table.app_policies_section;
- snapshot_->policy_table.functional_groupings =
- pt_->policy_table.functional_groupings;
- snapshot_->policy_table.consumer_friendly_messages->version =
- pt_->policy_table.consumer_friendly_messages->version;
- snapshot_->policy_table.consumer_friendly_messages->mark_initialized();
- snapshot_->policy_table.module_config = pt_->policy_table.module_config;
- snapshot_->policy_table.module_meta = pt_->policy_table.module_meta;
- snapshot_->policy_table.usage_and_error_counts =
- pt_->policy_table.usage_and_error_counts;
- snapshot_->policy_table.device_data = pt_->policy_table.device_data;
-
- // Set policy table type to Snapshot
- snapshot_->SetPolicyTableType(
- rpc::policy_table_interface_base::PolicyTableType::PT_SNAPSHOT);
-
- CheckSnapshotInitialization();
- return snapshot_;
-}
-
-bool CacheManager::GetInitialAppData(const std::string& app_id,
- StringArray& nicknames,
- StringArray& app_hmi_types) {
- LOG4CXX_AUTO_TRACE(logger_);
- CACHE_MANAGER_CHECK(false);
- policy_table::ApplicationPolicies::const_iterator policy_iter =
- pt_->policy_table.app_policies_section.apps.find(app_id);
-
- if (pt_->policy_table.app_policies_section.apps.end() != policy_iter) {
- const policy_table::ApplicationParams& app_params = (*policy_iter).second;
-
- std::copy(app_params.nicknames->begin(),
- app_params.nicknames->end(),
- std::back_inserter(nicknames));
-
- std::transform(app_params.AppHMIType->begin(),
- app_params.AppHMIType->end(),
- std::back_inserter(app_hmi_types),
- AppHMITypeToString());
- }
- return true;
-}
-
-bool CacheManager::GetFunctionalGroupings(
- policy_table::FunctionalGroupings& groups) {
- LOG4CXX_AUTO_TRACE(logger_);
- CACHE_MANAGER_CHECK(false);
- const policy_table::FunctionalGroupings& f_groupings =
- pt_->policy_table.functional_groupings;
-
- groups.insert(f_groupings.begin(), f_groupings.end());
- return true;
-}
-
-int CacheManager::CountUnconsentedGroups(const std::string& policy_app_id,
- const std::string& device_id) {
- LOG4CXX_AUTO_TRACE(logger_);
- CACHE_MANAGER_CHECK(false);
- LOG4CXX_DEBUG(logger_, "Application id: " << policy_app_id);
- int result = 0;
- return result;
-}
-
-bool CacheManager::SetMetaInfo(const std::string& ccpu_version,
- const std::string& wers_country_code,
- const std::string& language) {
- CACHE_MANAGER_CHECK(false);
-
- // We have to set preloaded flag as false in policy table on any response
- // of GetSystemInfo (SDLAQ-CRS-2365)
- *pt_->policy_table.module_config.preloaded_pt = false;
-
- Backup();
- return true;
-}
-
-bool CacheManager::IsMetaInfoPresent() const {
- CACHE_MANAGER_CHECK(false);
- bool result = true;
- return result;
-}
-
-bool CacheManager::SetSystemLanguage(const std::string& language) {
- CACHE_MANAGER_CHECK(false);
- Backup();
- return true;
-}
-
-bool CacheManager::GetFunctionalGroupNames(FunctionalGroupNames& names) {
- LOG4CXX_AUTO_TRACE(logger_);
- CACHE_MANAGER_CHECK(false);
- rpc::policy_table_interface_base::FunctionalGroupings::iterator iter =
- pt_->policy_table.functional_groupings.begin();
- rpc::policy_table_interface_base::FunctionalGroupings::iterator iter_end =
- pt_->policy_table.functional_groupings.end();
-
- for (; iter != iter_end; ++iter) {
- const int32_t id = GenerateHash((*iter).first);
- std::pair<std::string, std::string> value =
- std::make_pair(*(*iter).second.user_consent_prompt, (*iter).first);
-
- names.insert(
- std::pair<uint32_t, std::pair<std::string, std::string> >(id, value));
- }
- return true;
-}
-
-bool CacheManager::CleanupUnpairedDevices() {
- CACHE_MANAGER_CHECK(false);
- Backup();
- return true;
-}
-
-void CacheManager::Increment(usage_statistics::GlobalCounterId type) {
- CACHE_MANAGER_CHECK_VOID();
- Backup();
-}
-
-void CacheManager::Increment(const std::string& app_id,
- usage_statistics::AppCounterId type) {
- CACHE_MANAGER_CHECK_VOID();
- sync_primitives::AutoLock lock(cache_lock_);
- switch (type) {
- case usage_statistics::USER_SELECTIONS:
- ++(*pt_->policy_table.usage_and_error_counts->app_level)[app_id]
- .count_of_user_selections;
- break;
- case usage_statistics::REJECTIONS_SYNC_OUT_OF_MEMORY:
- ++(*pt_->policy_table.usage_and_error_counts->app_level)[app_id]
- .count_of_rejections_sync_out_of_memory;
- break;
- case usage_statistics::REJECTIONS_NICKNAME_MISMATCH:
- ++(*pt_->policy_table.usage_and_error_counts->app_level)[app_id]
- .count_of_rejections_nickname_mismatch;
- break;
- case usage_statistics::REJECTIONS_DUPLICATE_NAME:
- ++(*pt_->policy_table.usage_and_error_counts->app_level)[app_id]
- .count_of_rejections_duplicate_name;
- break;
- case usage_statistics::REJECTED_RPC_CALLS:
- ++(*pt_->policy_table.usage_and_error_counts->app_level)[app_id]
- .count_of_rejected_rpc_calls;
- break;
- case usage_statistics::RPCS_IN_HMI_NONE:
- ++(*pt_->policy_table.usage_and_error_counts->app_level)[app_id]
- .count_of_rpcs_sent_in_hmi_none;
- break;
- case usage_statistics::REMOVALS_MISBEHAVED:
- ++(*pt_->policy_table.usage_and_error_counts->app_level)[app_id]
- .count_of_removals_for_bad_behavior;
- break;
- case usage_statistics::RUN_ATTEMPTS_WHILE_REVOKED:
- ++(*pt_->policy_table.usage_and_error_counts->app_level)[app_id]
- .count_of_run_attempts_while_revoked;
- break;
- case usage_statistics::COUNT_OF_TLS_ERRORS:
- ++(*pt_->policy_table.usage_and_error_counts->app_level)[app_id]
- .count_of_tls_errors;
- break;
- default:
- LOG4CXX_WARN(logger_, "Type app counter is unknown");
- return;
- }
- Backup();
-}
-
-void CacheManager::Set(const std::string& app_id,
- usage_statistics::AppInfoId type,
- const std::string& value) {
- CACHE_MANAGER_CHECK_VOID();
- sync_primitives::AutoLock lock(cache_lock_);
- switch (type) {
- case usage_statistics::LANGUAGE_GUI:
- (*pt_->policy_table.usage_and_error_counts->app_level)[app_id]
- .app_registration_language_gui = value;
- break;
- case usage_statistics::LANGUAGE_VUI:
- (*pt_->policy_table.usage_and_error_counts->app_level)[app_id]
- .app_registration_language_vui = value;
- break;
- default:
- LOG4CXX_WARN(logger_, "Type app info is unknown");
- return;
- }
- Backup();
-}
-
-void CacheManager::Add(const std::string& app_id,
- usage_statistics::AppStopwatchId type,
- int seconds) {
- CACHE_MANAGER_CHECK_VOID();
- sync_primitives::AutoLock lock(cache_lock_);
- const int minutes = ConvertSecondsToMinute(seconds);
- switch (type) {
- case usage_statistics::SECONDS_HMI_FULL:
- (*pt_->policy_table.usage_and_error_counts->app_level)[app_id]
- .minutes_in_hmi_full += minutes;
- break;
- case usage_statistics::SECONDS_HMI_LIMITED:
- (*pt_->policy_table.usage_and_error_counts->app_level)[app_id]
- .minutes_in_hmi_limited += minutes;
- break;
- case usage_statistics::SECONDS_HMI_BACKGROUND:
- (*pt_->policy_table.usage_and_error_counts->app_level)[app_id]
- .minutes_in_hmi_background += minutes;
- break;
- case usage_statistics::SECONDS_HMI_NONE:
- (*pt_->policy_table.usage_and_error_counts->app_level)[app_id]
- .minutes_in_hmi_none += minutes;
- break;
- default:
- LOG4CXX_WARN(logger_, "Type app stopwatch is unknown");
- return;
- }
- Backup();
-}
-
-long CacheManager::ConvertSecondsToMinute(int seconds) {
- const float seconds_in_minute = 60.0;
- return std::round(seconds / seconds_in_minute);
-}
-
-bool CacheManager::SetDefaultPolicy(const std::string& app_id) {
- CACHE_MANAGER_CHECK(false);
- policy_table::ApplicationPolicies::const_iterator iter =
- pt_->policy_table.app_policies_section.apps.find(kDefaultId);
- if (pt_->policy_table.app_policies_section.apps.end() != iter) {
- pt_->policy_table.app_policies_section.apps[app_id] =
- pt_->policy_table.app_policies_section.apps[kDefaultId];
-
- SetIsDefault(app_id);
- }
- Backup();
- return true;
-}
-
-bool CacheManager::IsDefaultPolicy(const std::string& app_id) {
- CACHE_MANAGER_CHECK(false);
- const bool result =
- pt_->policy_table.app_policies_section.apps.end() !=
- pt_->policy_table.app_policies_section.apps.find(app_id) &&
- policy::kDefaultId ==
- pt_->policy_table.app_policies_section.apps[app_id].get_string();
-
- return result;
-}
-
-bool CacheManager::SetIsDefault(const std::string& app_id) {
- CACHE_MANAGER_CHECK(false);
- policy_table::ApplicationPolicies::const_iterator iter =
- pt_->policy_table.app_policies_section.apps.find(app_id);
- if (pt_->policy_table.app_policies_section.apps.end() != iter) {
- pt_->policy_table.app_policies_section.apps[app_id].set_to_string(
- kDefaultId);
- }
- return true;
-}
-
-bool CacheManager::SetPredataPolicy(const std::string& app_id) {
- CACHE_MANAGER_CHECK(false);
- policy_table::ApplicationPolicies::const_iterator iter =
- pt_->policy_table.app_policies_section.apps.find(kPreDataConsentId);
-
- if (pt_->policy_table.app_policies_section.apps.end() == iter) {
- LOG4CXX_ERROR(logger_,
- "Could not set " << kPreDataConsentId
- << " permissions for app " << app_id);
- return false;
- }
-
- pt_->policy_table.app_policies_section.apps[app_id] =
- pt_->policy_table.app_policies_section.apps[kPreDataConsentId];
-
- pt_->policy_table.app_policies_section.apps[app_id].set_to_string(
- kPreDataConsentId);
-
- Backup();
- return true;
-}
-
-bool CacheManager::IsPredataPolicy(const std::string& app_id) {
- // TODO(AOleynik): Maybe change for comparison with pre_DataConsent
- // permissions or check string value from get_string()
- policy_table::ApplicationParams& pre_data_app =
- pt_->policy_table.app_policies_section.apps[kPreDataConsentId];
- policy_table::ApplicationParams& specific_app =
- pt_->policy_table.app_policies_section.apps[app_id];
-
- policy_table::Strings res;
- std::set_intersection(pre_data_app.groups.begin(),
- pre_data_app.groups.end(),
- specific_app.groups.begin(),
- specific_app.groups.end(),
- std::back_inserter(res));
-
- bool is_marked_as_predata =
- kPreDataConsentId ==
- pt_->policy_table.app_policies_section.apps[app_id].get_string();
-
- return !res.empty() && is_marked_as_predata;
-}
-
-bool CacheManager::SetUnpairedDevice(const std::string& device_id,
- bool unpaired) {
- const bool result = pt_->policy_table.device_data->end() !=
- pt_->policy_table.device_data->find(device_id);
- if (!result) {
- LOG4CXX_DEBUG(logger_,
- "Couldn't set unpaired flag for device id "
- << device_id << " , since it wasn't found.");
- return false;
- }
-
- sync_primitives::AutoLock lock(unpaired_lock_);
- if (unpaired) {
- is_unpaired_.insert(device_id);
- LOG4CXX_DEBUG(logger_, "Unpaired flag was set for device id " << device_id);
- } else {
- is_unpaired_.erase(device_id);
- LOG4CXX_DEBUG(logger_,
- "Unpaired flag was removed for device id " << device_id);
- }
- return result;
-}
-
-bool CacheManager::SetVINValue(const std::string& value) {
- CACHE_MANAGER_CHECK(false);
- Backup();
- return true;
-}
-
-bool CacheManager::IsApplicationRepresented(const std::string& app_id) const {
- CACHE_MANAGER_CHECK(false);
- if (kDeviceId == app_id) {
- return true;
- }
- policy_table::ApplicationPolicies::const_iterator iter =
- pt_->policy_table.app_policies_section.apps.find(app_id);
- return pt_->policy_table.app_policies_section.apps.end() != iter;
-}
-
-bool CacheManager::Init(const std::string& file_name,
- const PolicySettings* settings) {
- LOG4CXX_AUTO_TRACE(logger_);
- settings_ = settings;
- InitResult init_result = backup_->Init(settings);
-
- bool result = true;
- switch (init_result) {
- case InitResult::EXISTS: {
- LOG4CXX_INFO(logger_, "Policy Table exists, was loaded correctly.");
- result = LoadFromBackup();
- if (result) {
- if (!backup_->IsDBVersionActual()) {
- LOG4CXX_INFO(logger_, "DB version is NOT actual");
- if (!backup_->RefreshDB()) {
- LOG4CXX_ERROR(logger_, "RefreshDB() failed");
- return false;
- }
- backup_->UpdateDBVersion();
- Backup();
- }
- MergePreloadPT(file_name);
- }
- } break;
- case InitResult::SUCCESS: {
- LOG4CXX_INFO(logger_, "Policy Table was inited successfully");
-
- result = LoadFromFile(file_name, *pt_);
-
- utils::SharedPtr<policy_table::Table> snapshot = GenerateSnapshot();
- result &= snapshot->is_valid();
- LOG4CXX_DEBUG(logger_,
- "Check if snapshot is valid: " << std::boolalpha << result);
- if (!result) {
- rpc::ValidationReport report("policy_table");
- snapshot->ReportErrors(&report);
- return result;
- }
-
- backup_->UpdateDBVersion();
- Backup();
- } break;
- default: {
- result = false;
- LOG4CXX_ERROR(logger_, "Failed to init policy table.");
- } break;
- }
-
- return result;
-}
-
-void CacheManager::FillDeviceSpecificData() {}
-
-bool CacheManager::LoadFromBackup() {
- sync_primitives::AutoLock lock(cache_lock_);
- pt_ = backup_->GenerateSnapshot();
- update_required = backup_->UpdateRequired();
-
- FillDeviceSpecificData();
-
- return true;
-}
-
-bool CacheManager::LoadFromFile(const std::string& file_name,
- policy_table::Table& table) {
- LOG4CXX_AUTO_TRACE(logger_);
- BinaryMessage json_string;
- if (!file_system::ReadBinaryFile(file_name, json_string)) {
- LOG4CXX_FATAL(logger_, "Failed to read pt file.");
- return false;
- }
-
- Json::Value value;
- Json::Reader reader(Json::Features::strictMode());
- std::string json(json_string.begin(), json_string.end());
- if (!reader.parse(json.c_str(), value)) {
- LOG4CXX_FATAL(
- logger_,
- "Preloaded PT is corrupted: " << reader.getFormattedErrorMessages());
- return false;
- }
-
- LOG4CXX_TRACE(logger_, "Start create PT");
- sync_primitives::AutoLock locker(cache_lock_);
-
- table = policy_table::Table(&value);
-
- Json::StyledWriter s_writer;
- LOG4CXX_DEBUG(logger_, "PT out:");
- LOG4CXX_DEBUG(logger_, s_writer.write(table.ToJsonValue()));
-
- if (!table.is_valid()) {
- rpc::ValidationReport report("policy_table");
- table.ReportErrors(&report);
- LOG4CXX_FATAL(logger_,
- "Parsed table is not valid " << rpc::PrettyFormat(report));
- return false;
- }
- return true;
-}
-
-bool CacheManager::ResetPT(const std::string& file_name) {
- bool result = true;
- Backup();
- return result;
-}
-
-bool CacheManager::AppExists(const std::string& app_id) const {
- CACHE_MANAGER_CHECK(false);
- if (kDeviceId == app_id) {
- return true;
- }
- policy_table::ApplicationPolicies::iterator policy_iter =
- pt_->policy_table.app_policies_section.apps.find(app_id);
- return pt_->policy_table.app_policies_section.apps.end() != policy_iter;
-}
-
-int32_t CacheManager::GenerateHash(const std::string& str_to_hash) {
- uint32_t hash = 5381U;
- std::string::const_iterator it = str_to_hash.begin();
- std::string::const_iterator it_end = str_to_hash.end();
-
- for (; it != it_end; ++it) {
- hash = ((hash << 5) + hash) + (*it);
- }
-
- // Reset sign bit in case it has been set.
- // This is needed to avoid overflow for signed int.
- const int32_t result = hash & 0x7FFFFFFF;
- return result;
-}
-
-void CacheManager::GetAppRequestTypes(
- const std::string& policy_app_id,
- std::vector<std::string>& request_types) const {
- LOG4CXX_AUTO_TRACE(logger_);
- CACHE_MANAGER_CHECK_VOID();
- policy_table::ApplicationPolicies::iterator policy_iter =
- pt_->policy_table.app_policies_section.apps.find(policy_app_id);
- if (pt_->policy_table.app_policies_section.apps.end() == policy_iter) {
- LOG4CXX_DEBUG(logger_,
- "Can't find request types for app_id " << policy_app_id);
- return;
- }
- policy_table::RequestTypes::iterator it_request_type =
- policy_iter->second.RequestType->begin();
- for (; it_request_type != policy_iter->second.RequestType->end();
- ++it_request_type) {
- request_types.push_back(EnumToJsonString(*it_request_type));
- }
- return;
-}
-
-std::string CacheManager::GetCertificate() const {
- CACHE_MANAGER_CHECK(std::string(""));
- if (pt_->policy_table.module_config.certificate.is_initialized()) {
- return *pt_->policy_table.module_config.certificate;
- }
- return std::string("");
-}
-
-void CacheManager::MergePreloadPT(const std::string& file_name) {
- LOG4CXX_AUTO_TRACE(logger_);
- policy_table::Table table;
- if (!LoadFromFile(file_name, table)) {
- LOG4CXX_DEBUG(logger_, "Unable to load preloaded PT.");
- return;
- }
-
- sync_primitives::AutoLock lock(cache_lock_);
- policy_table::PolicyTable& current = pt_->policy_table;
- policy_table::PolicyTable& new_table = table.policy_table;
- const std::string date_current = *current.module_config.preloaded_date;
- const std::string date_new = *new_table.module_config.preloaded_date;
- if (date_current != date_new) {
- MergeMC(new_table, current);
- MergeFG(new_table, current);
- MergeAP(new_table, current);
- MergeCFM(new_table, current);
- Backup();
- }
-}
-
-void CacheManager::MergeMC(const policy_table::PolicyTable& new_pt,
- policy_table::PolicyTable& pt) {
- LOG4CXX_AUTO_TRACE(logger_);
- policy_table::ModuleConfig copy(pt.module_config);
-
- pt.module_config = new_pt.module_config;
- pt.module_config.vehicle_make = copy.vehicle_make;
- pt.module_config.vehicle_year = copy.vehicle_year;
- pt.module_config.vehicle_model = copy.vehicle_model;
-}
-
-void CacheManager::MergeFG(const policy_table::PolicyTable& new_pt,
- policy_table::PolicyTable& pt) {
- LOG4CXX_AUTO_TRACE(logger_);
- policy_table::FunctionalGroupings::const_iterator it =
- new_pt.functional_groupings.begin();
-
- for (; it != new_pt.functional_groupings.end(); ++it) {
- LOG4CXX_DEBUG(logger_, "Merge functional group: " << it->first);
- pt.functional_groupings[it->first] = it->second;
- }
-}
-
-void CacheManager::MergeAP(const policy_table::PolicyTable& new_pt,
- policy_table::PolicyTable& pt) {
- LOG4CXX_AUTO_TRACE(logger_);
- pt.app_policies_section.device = const_cast<policy_table::PolicyTable&>(
- new_pt).app_policies_section.device;
-
- pt.app_policies_section.apps[kDefaultId] =
- const_cast<policy_table::PolicyTable&>(new_pt)
- .app_policies_section.apps[kDefaultId];
-
- pt.app_policies_section.apps[kPreDataConsentId] =
- const_cast<policy_table::PolicyTable&>(new_pt)
- .app_policies_section.apps[kPreDataConsentId];
-}
-
-void CacheManager::MergeCFM(const policy_table::PolicyTable& new_pt,
- policy_table::PolicyTable& pt) {
- LOG4CXX_AUTO_TRACE(logger_);
- if (new_pt.consumer_friendly_messages.is_initialized()) {
- if (!pt.consumer_friendly_messages.is_initialized()) {
- pt.consumer_friendly_messages = new_pt.consumer_friendly_messages;
- } else {
- policy_table::Messages::const_iterator it =
- new_pt.consumer_friendly_messages->messages->begin();
-
- pt.consumer_friendly_messages->version =
- new_pt.consumer_friendly_messages->version;
- for (; it != new_pt.consumer_friendly_messages->messages->end(); ++it) {
- LOG4CXX_DEBUG(logger_, "Merge CFM: " << it->first);
- if (!(pt.consumer_friendly_messages->messages.is_initialized())) {
- LOG4CXX_DEBUG(logger_, "CFM not initialized.");
- }
- (*pt.consumer_friendly_messages->messages)[it->first] = it->second;
- }
- }
- }
-}
-
-const PolicySettings& CacheManager::get_settings() const {
- DCHECK(settings_);
-
- return *settings_;
-}
-
-CacheManager::BackgroundBackuper::BackgroundBackuper(
- CacheManager* cache_manager)
- : cache_manager_(cache_manager)
- , stop_flag_(false)
- , new_data_available_(false) {
- LOG4CXX_AUTO_TRACE(logger_);
-}
-
-CacheManager::BackgroundBackuper::~BackgroundBackuper() {
- LOG4CXX_AUTO_TRACE(logger_);
-}
-
-void CacheManager::BackgroundBackuper::InternalBackup() {
- LOG4CXX_AUTO_TRACE(logger_);
- DCHECK(cache_manager_);
-
- while (new_data_available_) {
- new_data_available_ = false;
- LOG4CXX_DEBUG(logger_, "DoBackup");
- cache_manager_->PersistData();
- }
-}
-
-void CacheManager::BackgroundBackuper::threadMain() {
- LOG4CXX_AUTO_TRACE(logger_);
- sync_primitives::AutoLock lock(need_backup_lock_);
- while (!stop_flag_) {
- need_backup_lock_.Release();
- InternalBackup();
- need_backup_lock_.Acquire();
- if (new_data_available_ || stop_flag_) {
- continue;
- }
- LOG4CXX_DEBUG(logger_, "Wait for a next backup");
- backup_notifier_.Wait(need_backup_lock_);
- }
-}
-
-void CacheManager::BackgroundBackuper::exitThreadMain() {
- LOG4CXX_AUTO_TRACE(logger_);
- sync_primitives::AutoLock auto_lock(need_backup_lock_);
- stop_flag_ = true;
- backup_notifier_.NotifyOne();
-}
-
-void CacheManager::BackgroundBackuper::DoBackup() {
- LOG4CXX_AUTO_TRACE(logger_);
- sync_primitives::AutoLock auto_lock(need_backup_lock_);
- new_data_available_ = true;
- backup_notifier_.NotifyOne();
-}
-
-} // namespace policy