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.
17 * This file contains the definition of widget dao class.
19 * @file widget_dao.cpp
20 * @author Przemyslaw Dobrowolski (p.dobrowolsk@samsung.com)
21 * @author Bartosz Janiak (b.janiak@samsung.com)
22 * @author Yang Jie (jie2.yang@samsung.com)
23 * @author Koeun Choi(koeun.choi@samsung.com)
24 * @author Pawel Sikorski(p.sikorski@samsung.com)
26 * @brief This file contains the definition of Configuration.
29 #include <dpl/wrt-dao-rw/widget_dao.h>
32 #include <dpl/log/log.h>
33 #include <dpl/foreach.h>
34 #include <dpl/wrt-dao-ro/webruntime_database.h>
35 #include <dpl/wrt-dao-rw/property_dao.h>
36 #include <orm_generator_wrt.h>
37 #include <dpl/wrt-dao-ro/WrtDatabase.h>
41 //TODO in current solution in each getter there exists a check
42 //"IsWidgetInstalled". Maybe it should be verified, if it could be done
43 //differently (check in WidgetDAO constructor)
45 #define SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN Try
47 #define SQL_CONNECTION_EXCEPTION_HANDLER_END(message) \
48 Catch(DPL::DB::SqlConnection::Exception::Base) { \
50 ReThrowMsg(WidgetDAO::Exception::DatabaseError, \
54 #define CHECK_WIDGET_EXISTENCE(macro_transaction, macro_handle) \
55 if (!WidgetDAO::isWidgetInstalled(macro_handle)) \
57 macro_transaction.Commit(); \
58 LogWarning("Cannot find widget. Handle: " << macro_handle); \
59 ThrowMsg(WidgetDAO::Exception::WidgetNotExist, \
60 "Cannot find widget. Handle: " << macro_handle); \
64 WidgetDAO::WidgetDAO(DbWidgetHandle widgetHandle) :
65 WidgetDAOReadOnly(widgetHandle)
69 WidgetDAO::WidgetDAO(DPL::OptionalString widgetGUID) :
70 WidgetDAOReadOnly(WidgetDAOReadOnly::getHandle(widgetGUID))
74 WidgetDAO::~WidgetDAO()
78 void WidgetDAO::removeProperty(
79 const PropertyDAOReadOnly::WidgetPropertyKey &key)
82 PropertyDAO::RemoveProperty(m_widgetHandle, key);
84 Catch(PropertyDAOReadOnly::Exception::ReadOnlyProperty){
85 ReThrowMsg(WidgetDAO::Exception::DatabaseError,
86 "Failure during removing property");
90 void WidgetDAO::setProperty(
91 const PropertyDAOReadOnly::WidgetPropertyKey &key,
92 const PropertyDAOReadOnly::WidgetPropertyValue &value,
96 PropertyDAO::SetProperty(m_widgetHandle, key, value, readOnly);
98 Catch(PropertyDAOReadOnly::Exception::ReadOnlyProperty){
99 ReThrowMsg(WidgetDAO::Exception::DatabaseError,
100 "Failure during setting/updating property");
104 void WidgetDAO::setPkgName(const DPL::OptionalString& pkgName)
106 SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN
108 using namespace DPL::DB::ORM;
109 wrt::ScopedTransaction transaction(&WrtDatabase::interface());
111 isWidgetInstalled(getHandle());
113 wrt::WidgetInfo::Row row;
114 row.Set_pkgname(pkgName);
116 WRT_DB_UPDATE(update, wrt::WidgetInfo, &WrtDatabase::interface())
118 Equals<wrt::WidgetInfo::app_id>(getHandle()));
122 transaction.Commit();
124 SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to register widget")
127 DbWidgetHandle WidgetDAO::registerWidget(const WidgetRegisterInfo &widgetRegInfo,
128 const IWacSecurity &wacSecurity,
129 const LanguageTagsList& languageTags)
131 LogDebug("Registering widget");
132 SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN
134 DPL::DB::ORM::wrt::ScopedTransaction transaction(&WrtDatabase::interface());
136 //Register into WidgetInfo has to be first
137 //as all other tables depend upon that
138 DbWidgetHandle widgetHandle =
139 registerWidgetInfo(widgetRegInfo, wacSecurity);
141 registerWidgetExtendedInfo(widgetHandle, widgetRegInfo);
143 registerWidgetLocalizedInfo(widgetHandle, widgetRegInfo);
145 registerWidgetUserAgentLocales(
146 widgetHandle, widgetRegInfo, languageTags);
148 registerWidgetIcons(widgetHandle, widgetRegInfo);
150 registerWidgetStartFile(widgetHandle, widgetRegInfo);
152 PropertyDAO::RegisterProperties(widgetHandle, widgetRegInfo);
154 registerWidgetFeatures(widgetHandle, widgetRegInfo);
156 registerWidgetWindowModes(widgetHandle, widgetRegInfo);
158 registerWidgetWarpInfo(widgetHandle, widgetRegInfo);
160 registerWidgetCertificates(widgetHandle, wacSecurity);
162 CertificateChainList list;
163 wacSecurity.getCertificateChainList(list);
164 registerLaunchCertificates(widgetHandle,list);
166 registerWidgetSettings(widgetHandle, widgetRegInfo);
168 registerAppService(widgetHandle, widgetRegInfo);
170 transaction.Commit();
174 SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to register widget")
177 #define DO_INSERT(row, table) \
179 WRT_DB_INSERT(insert, table, &WrtDatabase::interface()) \
180 insert->Values(row); \
184 void WidgetDAO::registerWidgetExtendedInfo(DbWidgetHandle widgetHandle,
185 const WidgetRegisterInfo ®Info)
187 //Try and transaction not needed
188 using namespace DPL::DB::ORM;
189 using namespace DPL::DB::ORM::wrt;
192 WidgetExtendedInfo::Row row;
193 row.Set_app_id(widgetHandle);
194 // row.Set_share_href (DPL::FromUTF8String(regInfo.shareHref));
195 row.Set_signature_type(regInfo.signatureType);
196 row.Set_factory_widget(regInfo.isFactoryWidget);
197 row.Set_test_widget(regInfo.isTestWidget);
198 row.Set_install_time(regInfo.installedTime);
200 DO_INSERT(row, WidgetExtendedInfo)
203 DbWidgetHandle WidgetDAO::registerWidgetInfo(const WidgetRegisterInfo ®Info,
204 const IWacSecurity &wacSecurity)
206 using namespace DPL::DB::ORM;
207 using namespace DPL::DB::ORM::wrt;
208 const ConfigParserData& widgetConfigurationInfo = regInfo.configInfo;
210 // TODO in wrt_db all Columns in WidgetInfo have DEFAULT VALUE set.
211 // Because of that, "Optional" is not used there
214 row.Set_widget_type(regInfo.type.appType);
215 row.Set_widget_id(widgetConfigurationInfo.widget_id);
216 row.Set_defaultlocale(widgetConfigurationInfo.defaultlocale);
217 row.Set_widget_version(widgetConfigurationInfo.version);
218 row.Set_widget_width(widgetConfigurationInfo.width);
219 row.Set_widget_height(widgetConfigurationInfo.height);
220 row.Set_author_name(widgetConfigurationInfo.authorName);
221 row.Set_author_email(widgetConfigurationInfo.authorEmail);
222 row.Set_author_href(widgetConfigurationInfo.authorHref);
223 row.Set_base_folder(DPL::FromUTF8String(regInfo.baseFolder));
224 row.Set_webkit_plugins_required(widgetConfigurationInfo.flashNeeded);
225 row.Set_recognized(wacSecurity.isRecognized());
226 row.Set_wac_signed(wacSecurity.isWacSigned());
227 row.Set_distributor_signed(wacSecurity.isDistributorSigned());
229 std::stringstream tmp;
230 tmp << widgetConfigurationInfo.minVersionRequired;
231 row.Set_min_version(DPL::FromUTF8String(tmp.str()));
233 row.Set_back_supported(widgetConfigurationInfo.backSupported);
234 row.Set_access_network(widgetConfigurationInfo.accessNetwork);
235 row.Set_pkgname(regInfo.pkgname);
237 wrt::WidgetInfo::app_id::ColumnType appID;
239 WRT_DB_INSERT(insert, WidgetInfo, &WrtDatabase::interface())
241 appID = insert->Execute();
246 void WidgetDAO::registerWidgetLocalizedInfo(DbWidgetHandle widgetHandle,
247 const WidgetRegisterInfo ®Info)
249 using namespace DPL::DB::ORM;
250 using namespace DPL::DB::ORM::wrt;
252 const ConfigParserData& widgetConfigurationInfo = regInfo.configInfo;
254 FOREACH(it, widgetConfigurationInfo.localizedDataSet)
256 const DPL::String& locale = it->first;
257 const ConfigParserData::LocalizedData& data = it->second;
259 LocalizedWidgetInfo::Row row;
260 row.Set_app_id(widgetHandle);
261 row.Set_widget_locale(locale);
262 row.Set_widget_name(data.name);
263 row.Set_widget_shortname(data.shortName);
264 row.Set_widget_description(data.description);
265 row.Set_widget_license(data.license);
266 row.Set_widget_license_file(data.licenseFile);
267 row.Set_widget_license_href(data.licenseHref);
269 DO_INSERT(row, LocalizedWidgetInfo)
273 void WidgetDAO::registerWidgetUserAgentLocales(
274 DbWidgetHandle widgetHandle,
275 const WidgetRegisterInfo &/*regInfo*/,
276 const LanguageTagsList& languageTags)
278 using namespace DPL::DB::ORM;
279 using namespace DPL::DB::ORM::wrt;
282 FOREACH(i, languageTags)
284 wrt::WidgetUserAgentLocales::Row row;
285 row.Set_app_id(widgetHandle);
286 row.Set_language_tag(*i);
288 DO_INSERT(row, wrt::WidgetUserAgentLocales)
292 void WidgetDAO::registerWidgetIcons(DbWidgetHandle widgetHandle,
293 const WidgetRegisterInfo ®Info)
295 using namespace DPL::DB::ORM;
296 using namespace DPL::DB::ORM::wrt;
299 FOREACH(i, regInfo.localizationData.icons)
301 wrt::WidgetIcon::icon_id::ColumnType icon_id;
303 wrt::WidgetIcon::Row row;
304 row.Set_app_id(widgetHandle);
305 row.Set_icon_src(i->src);
306 row.Set_icon_width(i->width);
307 row.Set_icon_height(i->height);
309 WRT_DB_INSERT(insert, wrt::WidgetIcon, &WrtDatabase::interface())
311 icon_id = insert->Execute();
314 FOREACH(j, i->availableLocales)
316 WidgetLocalizedIcon::Row row;
317 row.Set_app_id(widgetHandle);
318 row.Set_icon_id(icon_id);
319 row.Set_widget_locale(*j);
320 WRT_DB_SELECT(select, WidgetLocalizedIcon, &WrtDatabase::interface())
321 select->Where(And(Equals<WidgetLocalizedIcon::app_id>(widgetHandle),
322 Equals<WidgetLocalizedIcon::widget_locale>(*j)));
323 WidgetLocalizedIcon::Select::RowList rows = select->GetRowList();
325 bool flag = !rows.empty();
329 // already default icon value of same locale exists
330 WRT_DB_UPDATE(update, WidgetLocalizedIcon, &WrtDatabase::interface())
331 update->Where(And(Equals<WidgetLocalizedIcon::app_id>(widgetHandle),
332 Equals<WidgetLocalizedIcon::widget_locale>(*j)));
336 // any icon value of same locale doesn't exist
337 DO_INSERT(row, WidgetLocalizedIcon)
343 void WidgetDAO::registerWidgetStartFile(DbWidgetHandle widgetHandle,
344 const WidgetRegisterInfo ®Info)
346 using namespace DPL::DB::ORM;
347 using namespace DPL::DB::ORM::wrt;
350 FOREACH(i, regInfo.localizationData.startFiles)
352 WidgetStartFile::start_file_id::ColumnType startFileID;
354 WidgetStartFile::Row row;
355 row.Set_app_id(widgetHandle);
356 row.Set_src(i->path);
358 WRT_DB_INSERT(insert, WidgetStartFile, &WrtDatabase::interface())
360 startFileID = insert->Execute();
363 FOREACH(j, i->propertiesForLocales)
365 WidgetLocalizedStartFile::Row row;
366 row.Set_app_id(widgetHandle);
367 row.Set_start_file_id(startFileID);
368 row.Set_widget_locale(j->first);
369 row.Set_type(j->second.type);
370 row.Set_encoding(j->second.encoding);
372 DO_INSERT(row, WidgetLocalizedStartFile)
377 void WidgetDAO::registerWidgetFeatures(DbWidgetHandle widgetHandle,
378 const WidgetRegisterInfo ®Info)
380 using namespace DPL::DB::ORM;
381 const ConfigParserData& widgetConfigurationInfo = regInfo.configInfo;
384 FOREACH(pWidgetFeature, widgetConfigurationInfo.featuresList)
386 wrt::WidgetFeature::Row widgetFeature;
387 widgetFeature.Set_app_id(widgetHandle);
388 widgetFeature.Set_name(pWidgetFeature->name);
389 widgetFeature.Set_required(pWidgetFeature->required);
390 widgetFeature.Set_rejected(false);
392 wrt::WidgetFeature::widget_feature_id::ColumnType widgetFeatureID;
394 WRT_DB_INSERT(insert, wrt::WidgetFeature, &WrtDatabase::interface())
395 insert->Values(widgetFeature);
396 widgetFeatureID = insert->Execute();
399 // Insert into table FeatureParam
400 wrt::FeatureParam::Row featureParam;
401 featureParam.Set_widget_feature_id(widgetFeatureID);
403 ConfigParserData::ParamsList::const_iterator iter;
405 FOREACH(iter, pWidgetFeature->paramsList)
407 featureParam.Set_name(iter->name);
408 featureParam.Set_value(iter->value);
410 DO_INSERT(featureParam, wrt::FeatureParam)
415 void WidgetDAO::updateFeatureRejectStatus(const DbWidgetFeature &widgetFeature){
416 // This function could be merged with registerWidgetFeature but it requires desing change:
417 // 1. Check "ace step" in installer must be done before "update database step"
419 // ConfigurationParserData shouldn't be called "ParserData" any more.
420 using namespace DPL::DB::ORM;
422 wrt::ScopedTransaction transaction(&WrtDatabase::interface());
423 WRT_DB_SELECT(select, wrt::WidgetFeature, &WrtDatabase::interface())
424 select->Where(And(Equals<wrt::WidgetFeature::app_id>(m_widgetHandle),
425 Equals<wrt::WidgetFeature::name>(widgetFeature.name)));
427 auto row = select->GetSingleRow();
428 row.Set_rejected(widgetFeature.rejected);
430 WRT_DB_UPDATE(update, wrt::WidgetFeature, &WrtDatabase::interface())
431 update->Where(And(Equals<wrt::WidgetFeature::app_id>(m_widgetHandle),
432 Equals<wrt::WidgetFeature::name>(widgetFeature.name)));
435 transaction.Commit();
438 void WidgetDAO::registerWidgetWindowModes(DbWidgetHandle widgetHandle,
439 const WidgetRegisterInfo ®Info)
441 using namespace DPL::DB::ORM;
442 using namespace DPL::DB::ORM::wrt;
443 const ConfigParserData& widgetConfigurationInfo = regInfo.configInfo;
446 FOREACH(i, widgetConfigurationInfo.windowModes)
448 wrt::WidgetWindowModes::Row windowMode;
449 windowMode.Set_app_id(widgetHandle);
450 windowMode.Set_window_mode(*i);
452 DO_INSERT(windowMode, wrt::WidgetWindowModes)
456 void WidgetDAO::registerWidgetWarpInfo(DbWidgetHandle widgetHandle,
457 const WidgetRegisterInfo ®Info)
459 using namespace DPL::DB::ORM;
460 using namespace DPL::DB::ORM::wrt;
461 const ConfigParserData& widgetConfigurationInfo = regInfo.configInfo;
464 FOREACH(AccIt, widgetConfigurationInfo.accessInfoSet)
466 WidgetWARPInfo::Row row;
467 row.Set_app_id(widgetHandle);
468 row.Set_iri(AccIt->m_strIRI);
469 row.Set_subdomain_access(static_cast <int>(
470 AccIt->m_bSubDomainAccess));
472 DO_INSERT(row, WidgetWARPInfo)
476 void WidgetDAO::registerWidgetCertificates(DbWidgetHandle widgetHandle,
477 const IWacSecurity &wacSecurity)
479 using namespace DPL::DB::ORM;
480 using namespace DPL::DB::ORM::wrt;
483 FOREACH(it, wacSecurity.getCertificateList())
485 WidgetCertificateFingerprint::Row row;
486 row.Set_app_id(widgetHandle);
487 row.Set_owner(it->owner);
488 row.Set_chainid(it->chainId);
489 row.Set_type(it->type);
490 row.Set_md5_fingerprint(DPL::FromUTF8String(it->strMD5Fingerprint));
491 row.Set_sha1_fingerprint(DPL::FromUTF8String(it->strSHA1Fingerprint));
492 row.Set_common_name(it->strCommonName);
494 DO_INSERT(row, WidgetCertificateFingerprint)
498 void WidgetDAO::registerLaunchCertificates(DbWidgetHandle widgetHandle,
499 const CertificateChainList &certificateChainList)
501 using namespace DPL::DB::ORM;
502 using namespace DPL::DB::ORM::wrt;
503 FOREACH(certChain, certificateChainList)
505 WidgetCertificate::Row row;
506 row.Set_app_id(widgetHandle);
507 row.Set_encoded_chain(DPL::FromASCIIString(*certChain));
509 DO_INSERT(row, WidgetCertificate);
513 void WidgetDAO::registerWidgetSettings(DbWidgetHandle widgetHandle,
514 const WidgetRegisterInfo ®Info)
516 using namespace DPL::DB::ORM;
517 using namespace DPL::DB::ORM::wrt;
519 const ConfigParserData& widgetConfigurationInfo = regInfo.configInfo;
521 FOREACH(pWidgetSetting, widgetConfigurationInfo.settingsList)
523 SettginsList::Row row;
524 row.Set_appId(widgetHandle);
525 row.Set_settingName(pWidgetSetting->m_name);
526 row.Set_settingValue(pWidgetSetting->m_value);
528 DO_INSERT(row, SettginsList)
532 void WidgetDAO::registerAppService(DbWidgetHandle widgetHandle,
533 const WidgetRegisterInfo ®Info)
535 using namespace DPL::DB::ORM;
536 using namespace DPL::DB::ORM::wrt;
537 const ConfigParserData& widgetConfigurationInfo = regInfo.configInfo;
539 FOREACH(ASIt, widgetConfigurationInfo.appServiceList)
541 ApplicationServiceInfo::Row row;
542 row.Set_app_id(widgetHandle);
543 row.Set_src(ASIt->m_src);
544 row.Set_operation(ASIt->m_operation);
545 row.Set_scheme(ASIt->m_scheme);
546 row.Set_mime(ASIt->m_mime);
548 DO_INSERT(row, ApplicationServiceInfo)
554 void WidgetDAO::unregisterWidget(DbWidgetHandle widgetHandle)
556 LogDebug("Unregistering widget from DB. Handle: " << widgetHandle);
557 SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN
559 DPL::DB::ORM::wrt::ScopedTransaction transaction(&WrtDatabase::interface());
560 using namespace DPL::DB::ORM;
561 using namespace DPL::DB::ORM::wrt;
563 CHECK_WIDGET_EXISTENCE(transaction, widgetHandle)
565 // Delete from table Widget Info
567 WRT_DB_DELETE(del, WidgetInfo, &WrtDatabase::interface())
568 del->Where(Equals<WidgetInfo::app_id>(widgetHandle));
572 // Deleting in other tables is done via "delete cascade" in SQL
574 transaction.Commit();
576 SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to unregister widget")
579 #undef SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN
580 #undef SQL_CONNECTION_EXCEPTION_HANDLER_END
581 #undef CHECK_WIDGET_EXISTENCE