From 8024ea8d1735377be09891f3dd1b5142366a5c4a Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Wed, 13 Nov 2019 14:33:39 +0900 Subject: [PATCH] Fix ManifestDirectInstall/Update on Hybrid pkg Previous implementation did not consider if modified manifest has deleted. Merging WGT and TPK configs with "OVERWRITE" option will remove WGT application data so fixing it by merge it and to consider modified manifest's existance, CONCAT works as merge, not direct concat to remove duplication. Change-Id: I5ae4f085b0e33dde2a8408fa4a525806e9321b09 Signed-off-by: Junghyun Yeon --- src/hybrid/hybrid_installer.cc | 33 +++++++------------ .../step/configuration/step_merge_tpk_config.cc | 37 +++++++++++++++------- .../step/configuration/step_merge_tpk_config.h | 11 ------- 3 files changed, 36 insertions(+), 45 deletions(-) diff --git a/src/hybrid/hybrid_installer.cc b/src/hybrid/hybrid_installer.cc index d25264d..fc7824f 100644 --- a/src/hybrid/hybrid_installer.cc +++ b/src/hybrid/hybrid_installer.cc @@ -151,8 +151,7 @@ void HybridInstaller::InstallSteps() { AddStep(); AddStep(); AddStep(); - AddStep( - hybrid::configuration::StepMergeTpkConfig::MergeType::CONCAT); + AddStep(); AddStep(); AddStep( ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH); @@ -211,8 +210,7 @@ void HybridInstaller::UpdateSteps() { AddStep(); AddStep(); AddStep(); - AddStep( - hybrid::configuration::StepMergeTpkConfig::MergeType::CONCAT); + AddStep(); AddStep(); AddStep( ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH); @@ -307,8 +305,7 @@ void HybridInstaller::DeltaSteps() { AddStep(); AddStep(); AddStep(); - AddStep( - hybrid::configuration::StepMergeTpkConfig::MergeType::CONCAT); + AddStep(); AddStep(); AddStep( ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH); @@ -382,8 +379,7 @@ void HybridInstaller::MountInstallSteps() { AddStep(); AddStep(); AddStep(); - AddStep( - hybrid::configuration::StepMergeTpkConfig::MergeType::CONCAT); + AddStep(); AddStep(); AddStep( ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH); @@ -441,8 +437,7 @@ void HybridInstaller::MountUpdateSteps() { AddStep(); AddStep(); AddStep(); - AddStep( - hybrid::configuration::StepMergeTpkConfig::MergeType::CONCAT); + AddStep(); AddStep(); AddStep( ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH); @@ -482,8 +477,7 @@ void HybridInstaller::ManifestDirectInstallSteps() { AddStep(); AddStep(); AddStep(); - AddStep( - hybrid::configuration::StepMergeTpkConfig::MergeType::OVERWRITE); + AddStep(); AddStep(); AddStep( ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH); @@ -526,8 +520,7 @@ void HybridInstaller::ManifestDirectUpdateSteps() { AddStep(); AddStep(); AddStep(); - AddStep( - hybrid::configuration::StepMergeTpkConfig::MergeType::OVERWRITE); + AddStep(); AddStep(); AddStep( ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH); @@ -553,8 +546,7 @@ void HybridInstaller::ManifestPartialInstallSteps() { AddStep(); AddStep( wgt::configuration::StepParse::ConfigLocation::INSTALLED, true); - AddStep( - hybrid::configuration::StepMergeTpkConfig::MergeType::OVERWRITE); + AddStep(); AddStep(); AddStep(); AddStep(false); @@ -584,8 +576,7 @@ void HybridInstaller::ManifestPartialUpdateSteps() { AddStep(); AddStep( wgt::configuration::StepParse::ConfigLocation::INSTALLED, true); - AddStep( - hybrid::configuration::StepMergeTpkConfig::MergeType::OVERWRITE); + AddStep(); AddStep(); AddStep(); AddStep(false); @@ -668,8 +659,7 @@ void HybridInstaller::ReadonlyUpdateInstallSteps() { AddStep(); AddStep(); AddStep(); - AddStep( - hybrid::configuration::StepMergeTpkConfig::MergeType::CONCAT); + AddStep(); AddStep(); AddStep( ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH); @@ -766,8 +756,7 @@ void HybridInstaller::RecoverDBSteps() { wgt::configuration::StepParse::ConfigLocation::INSTALLED, true); AddStep(); AddStep(); - AddStep( - hybrid::configuration::StepMergeTpkConfig::MergeType::OVERWRITE); + AddStep(); AddStep(); AddStep(); AddStep( diff --git a/src/hybrid/step/configuration/step_merge_tpk_config.cc b/src/hybrid/step/configuration/step_merge_tpk_config.cc index d63d003..504f557 100644 --- a/src/hybrid/step/configuration/step_merge_tpk_config.cc +++ b/src/hybrid/step/configuration/step_merge_tpk_config.cc @@ -4,31 +4,44 @@ #include "hybrid/step/configuration/step_merge_tpk_config.h" +#include +#include + #include +#include "common/utils/glist_range.h" + #include "hybrid/hybrid_backend_data.h" namespace hybrid { namespace configuration { -StepMergeTpkConfig::StepMergeTpkConfig( - common_installer::InstallerContext* context, - MergeType type) : Step(context), merge_type_(type) { -} - common_installer::Step::Status StepMergeTpkConfig::process() { HybridBackendData* data = static_cast(context_->backend_data.get()); manifest_x* tpk_data = data->tpk_manifest_data.get(); manifest_x* wgt_data = context_->manifest_data.get(); + // FIXME:api-version of tpk app will have wgt's if modified manifest exists. + for (GList* tpk_list = tpk_data->application; + tpk_list != nullptr; tpk_list = g_list_next(tpk_list)) { + application_x* tpk_app = static_cast(tpk_list->data); + bool is_found = false; + for (GList* wgt_list = wgt_data->application; + wgt_list != nullptr; wgt_list = g_list_next(wgt_list)) { + application_x* wgt_app = static_cast(wgt_list->data); + if (!strcmp(tpk_app->appid, wgt_app->appid)) { + is_found = true; + break; + } + } + if (is_found) + continue; + wgt_data->application = g_list_append( + wgt_data->application, tpk_list->data); + tpk_data->application = g_list_delete_link( + tpk_data->application, tpk_list); + } - if (merge_type_ == MergeType::CONCAT) - wgt_data->application = - g_list_concat(wgt_data->application, tpk_data->application); - else - wgt_data->application = tpk_data->application; - - tpk_data->application = nullptr; return Status::OK; } diff --git a/src/hybrid/step/configuration/step_merge_tpk_config.h b/src/hybrid/step/configuration/step_merge_tpk_config.h index 6491d34..2171d59 100644 --- a/src/hybrid/step/configuration/step_merge_tpk_config.h +++ b/src/hybrid/step/configuration/step_merge_tpk_config.h @@ -18,14 +18,6 @@ namespace configuration { */ class StepMergeTpkConfig : public common_installer::Step { public: - enum class MergeType { - CONCAT, // Concatenate configurations - OVERWRITE // Overwrite one with others - }; - - explicit StepMergeTpkConfig(common_installer::InstallerContext* context, - MergeType type); - using Step::Step; Status process() override; @@ -33,9 +25,6 @@ class StepMergeTpkConfig : public common_installer::Step { Status undo() override { return Status::OK; } Status precheck() override { return Status::OK; } - private: - MergeType merge_type_; - STEP_NAME(MergeTpkConfig) }; -- 2.7.4