Merge "[Path usage Unification] Widget Uninstallation part unification"
[framework/web/wrt-installer.git] / src / logic / installer_logic.cpp
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  *        http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
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>
27
28 using namespace WrtDB;
29
30 namespace Logic {
31 InstallerLogic::InstallerLogic() :
32     m_NextHandle(0),m_job(0)
33 {}
34
35 InstallerLogic::~InstallerLogic()
36 {
37         Assert(!m_job && "There are still running job");
38     //FIXME what should be done here?
39 }
40
41 void InstallerLogic::Initialize()
42 {
43     LogDebug("Done");
44 }
45
46 void InstallerLogic::Terminate()
47 {
48     //TODO how to delete, if it is still running, paused and so on
49     if(m_job)
50         m_job->SetPaused(true);
51
52     LogDebug("Done");
53 }
54
55 Jobs::JobHandle InstallerLogic::AddAndStartJob()
56 {
57     Jobs::JobHandle handle = GetNewJobHandle();
58     m_job->SetJobHandle(handle);
59     //Start job
60     CONTROLLER_POST_EVENT(InstallerController,
61                           InstallerControllerEvents::NextStepEvent(m_job));
62
63     return handle;
64 }
65
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 &
71     installerStruct)
72 {
73     if(m_job)
74     {
75         LogError("Job is in progress. It is impossible to add new job");
76         return -1;
77     }
78
79     LogDebug("New Widget Installation:");
80
81     m_job =
82         new Jobs::WidgetInstall::JobWidgetInstall(widgetPath, installerStruct);
83
84
85     return AddAndStartJob();
86 }
87
88 Jobs::JobHandle InstallerLogic::UninstallWidget(
89     const std::string & widgetPkgName,
90     const
91     WidgetUninstallationStruct &uninstallerStruct)
92 {
93     if(m_job)
94     {
95         LogError("Job is in progress. It is impossible to add new job");
96         return -1;
97     }
98
99     LogDebug("New Widget Uninstallation");
100
101     m_job  =
102         new Jobs::WidgetUninstall::JobWidgetUninstall(widgetPkgName,
103                                                       uninstallerStruct);
104
105       return AddAndStartJob();
106 }
107
108 Jobs::JobHandle InstallerLogic::InstallPlugin(
109     std::string const & pluginPath,
110     const PluginInstallerStruct &
111     installerStruct)
112 {
113     if(m_job)
114     {
115         LogError("Job is in progress. It is impossible to add new job");
116         return -1;
117     }
118
119     LogDebug("New Plugin Installation");
120
121     m_job  =
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();
126
127     return AddAndStartJob();
128 }
129
130 #define TRANSLATE_JOB_EXCEPTION() \
131     _rethrown_exception.getParam()
132 #define TRANSLATE_JOB_MESSAGE() \
133     _rethrown_exception.GetMessage()
134
135 bool InstallerLogic::NextStep(Jobs::Job *job)
136 {
137     Try {
138         bool stepSucceded = job->NextStep();
139
140         job->SendProgress();
141
142         if (stepSucceded) {
143             return !job->IsPaused();
144         }
145
146         if (!job->GetUndoType()) {
147             //job successfully finished
148
149             //send finished callback
150             job->SendFinishedSuccess();
151
152             switch (job->GetInstallationType()) {
153             case Jobs::PluginInstallation:
154                 //todo move it somewhere
155                 InstallWaitingPlugins();
156                 break;
157             default: //because of warning
158                 break;
159             }
160         } else {
161             //job abort process completed
162             job->SendFinishedFailure();
163         }
164
165         //clean job
166         delete job;
167         m_job=0;
168
169         return false;
170     } catch (Jobs::JobExceptionBase &exc) {
171         //start revert job
172         LogInfo("Exception occured: " << exc.getParam() <<
173                 ". Reverting job...");
174         bool hasAbortSteps = job->Abort();
175         job->SetUndoType(true);
176         job->SaveExceptionData(exc);
177
178         if (!hasAbortSteps) {
179             //no AbortSteps
180             job->SendFinishedFailure();
181
182             //clean job
183             delete job;
184             m_job=0;
185         }
186         return hasAbortSteps;
187     }
188 }
189
190 void InstallerLogic::InstallWaitingPlugins()
191 {
192     PluginHandleSetPtr waitingPlugins;
193
194     waitingPlugins =
195         PluginDAO::getPluginHandleByStatus(PluginDAO::INSTALLATION_WAITING);
196
197     FOREACH(it, *waitingPlugins)
198     {
199         resolvePluginDependencies(*it);
200     }
201 }
202
203 void InstallerLogic::ResetProgressPlugins()
204 {
205     PluginHandleSetPtr progressPlugins;
206
207     progressPlugins =
208         PluginDAO::getPluginHandleByStatus(PluginDAO::INSTALLATION_IN_PROGRESS);
209
210     FOREACH(it, *progressPlugins) {
211         FeatureHandleListPtr featureListPtr =
212             FeatureDAOReadOnly::GetFeatureHandleListForPlugin(*it);
213         FOREACH(ItFeature, *featureListPtr) {
214             FeatureDAO::UnregisterFeature(*ItFeature);
215         }
216         PluginDAO::unregisterPlugin(*it);
217     }
218 }
219
220 bool InstallerLogic::resolvePluginDependencies(PluginHandle handle)
221 {
222     PluginHandleSetPtr dependencies(new PluginHandleSet);
223
224     PluginObjects::ObjectsPtr requiredObjects =
225         PluginDAO::getRequiredObjectsForPluginHandle(handle);
226
227     PluginHandle depHandle =
228         Jobs::PluginInstall::JobPluginInstall::INVALID_HANDLE;
229
230     FOREACH(requiredObject, *requiredObjects)
231     {
232         depHandle =
233             PluginDAO::getPluginHandleForImplementedObject(*requiredObject);
234
235         if (depHandle ==
236             Jobs::PluginInstall::JobPluginInstall::INVALID_HANDLE)
237         {
238             LogError("Library implementing: " <<
239                      *requiredObject << " NOT FOUND");
240
241             //PluginDAO::SetPluginInstallationStatus(INSTALLATION_WAITING);
242             return false;
243         }
244         dependencies->insert(depHandle);
245     }
246
247     PluginDAO::registerPluginLibrariesDependencies(handle, dependencies);
248     PluginDAO::setPluginInstallationStatus(handle,
249                                            PluginDAO::INSTALLATION_COMPLETED);
250
251     return true;
252 }
253 }
254