2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 #include <installer_logic.h>
17 #include <installer_controller.h>
18 #include <dpl/string.h>
19 #include <dpl/foreach.h>
20 #include <dpl/wrt-dao-rw/feature_dao.h>
21 #include <dpl/wrt-dao-rw/plugin_dao.h>
22 #include <widget_install/job_widget_install.h>
23 #include <widget_uninstall/job_widget_uninstall.h>
24 #include <plugin_install/job_plugin_install.h>
25 #include <job_exception_base.h>
26 #include <plugin_install/plugin_objects.h>
28 using namespace WrtDB;
31 InstallerLogic::InstallerLogic() :
32 m_NextHandle(0),m_job(0)
35 InstallerLogic::~InstallerLogic()
37 Assert(!m_job && "There are still running job");
38 //FIXME what should be done here?
41 void InstallerLogic::Initialize()
46 void InstallerLogic::Terminate()
48 //TODO how to delete, if it is still running, paused and so on
50 m_job->SetPaused(true);
55 Jobs::JobHandle InstallerLogic::AddAndStartJob()
57 Jobs::JobHandle handle = GetNewJobHandle();
58 m_job->SetJobHandle(handle);
60 CONTROLLER_POST_EVENT(InstallerController,
61 InstallerControllerEvents::NextStepEvent(m_job));
66 //InstallWidget, UninstallWidget InstallPlugin method are almost the same
67 // But each Job has different constructor, so creating new Job is specific
68 Jobs::JobHandle InstallerLogic::InstallWidget(
69 const std::string & widgetPath,
70 const WidgetInstallationStruct &
75 LogError("Job is in progress. It is impossible to add new job");
79 LogDebug("New Widget Installation:");
82 new Jobs::WidgetInstall::JobWidgetInstall(widgetPath, installerStruct);
85 return AddAndStartJob();
88 Jobs::JobHandle InstallerLogic::UninstallWidget(
89 const std::string & widgetPkgName,
91 WidgetUninstallationStruct &uninstallerStruct)
95 LogError("Job is in progress. It is impossible to add new job");
99 LogDebug("New Widget Uninstallation");
102 new Jobs::WidgetUninstall::JobWidgetUninstall(widgetPkgName,
105 return AddAndStartJob();
108 Jobs::JobHandle InstallerLogic::InstallPlugin(
109 std::string const & pluginPath,
110 const PluginInstallerStruct &
115 LogError("Job is in progress. It is impossible to add new job");
119 LogDebug("New Plugin Installation");
122 new Jobs::PluginInstall::JobPluginInstall(pluginPath, installerStruct);
123 // before start install plugin, reset plugin data which is stopped
124 // during installing. (PluginDAO::INSTALLATION_IN_PROGRESS)
125 ResetProgressPlugins();
127 return AddAndStartJob();
130 #define TRANSLATE_JOB_EXCEPTION() \
131 _rethrown_exception.getParam()
132 #define TRANSLATE_JOB_MESSAGE() \
133 _rethrown_exception.GetMessage()
135 bool InstallerLogic::NextStep(Jobs::Job *job)
138 bool stepSucceded = job->NextStep();
143 return !job->IsPaused();
146 if (!job->GetUndoType()) {
147 //job successfully finished
149 //send finished callback
150 job->SendFinishedSuccess();
152 switch (job->GetInstallationType()) {
153 case Jobs::PluginInstallation:
154 //todo move it somewhere
155 InstallWaitingPlugins();
157 default: //because of warning
161 //job abort process completed
162 job->SendFinishedFailure();
170 } catch (Jobs::JobExceptionBase &exc) {
172 LogInfo("Exception occured: " << exc.getParam() <<
173 ". Reverting job...");
174 bool hasAbortSteps = job->Abort();
175 job->SetUndoType(true);
176 job->SaveExceptionData(exc);
178 if (!hasAbortSteps) {
180 job->SendFinishedFailure();
186 return hasAbortSteps;
190 void InstallerLogic::InstallWaitingPlugins()
192 PluginHandleSetPtr waitingPlugins;
195 PluginDAO::getPluginHandleByStatus(PluginDAO::INSTALLATION_WAITING);
197 FOREACH(it, *waitingPlugins)
199 resolvePluginDependencies(*it);
203 void InstallerLogic::ResetProgressPlugins()
205 PluginHandleSetPtr progressPlugins;
208 PluginDAO::getPluginHandleByStatus(PluginDAO::INSTALLATION_IN_PROGRESS);
210 FOREACH(it, *progressPlugins) {
211 FeatureHandleListPtr featureListPtr =
212 FeatureDAOReadOnly::GetFeatureHandleListForPlugin(*it);
213 FOREACH(ItFeature, *featureListPtr) {
214 FeatureDAO::UnregisterFeature(*ItFeature);
216 PluginDAO::unregisterPlugin(*it);
220 bool InstallerLogic::resolvePluginDependencies(PluginHandle handle)
222 PluginHandleSetPtr dependencies(new PluginHandleSet);
224 PluginObjects::ObjectsPtr requiredObjects =
225 PluginDAO::getRequiredObjectsForPluginHandle(handle);
227 PluginHandle depHandle =
228 Jobs::PluginInstall::JobPluginInstall::INVALID_HANDLE;
230 FOREACH(requiredObject, *requiredObjects)
233 PluginDAO::getPluginHandleForImplementedObject(*requiredObject);
236 Jobs::PluginInstall::JobPluginInstall::INVALID_HANDLE)
238 LogError("Library implementing: " <<
239 *requiredObject << " NOT FOUND");
241 //PluginDAO::SetPluginInstallationStatus(INSTALLATION_WAITING);
244 dependencies->insert(depHandle);
247 PluginDAO::registerPluginLibrariesDependencies(handle, dependencies);
248 PluginDAO::setPluginInstallationStatus(handle,
249 PluginDAO::INSTALLATION_COMPLETED);