merge with master
[framework/web/wrt-commons.git] / modules / widget_dao / dao / widget_dao.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 /**
17  * This file contains the definition of widget dao class.
18  *
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)
25  * @version 1.0
26  * @brief   This file contains the definition of Configuration.
27  */
28 #include <stddef.h>
29 #include <dpl/wrt-dao-rw/widget_dao.h>
30
31 #include <sstream>
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>
38
39 namespace WrtDB {
40 //TODO in current solution in each getter there exists a check
41 //"IsWidgetInstalled". Maybe it should be verified, if it could be done
42 //differently  (check in WidgetDAO constructor)
43
44 #define SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN          Try
45
46 #define SQL_CONNECTION_EXCEPTION_HANDLER_END(message)   \
47     Catch(DPL::DB::SqlConnection::Exception::Base) {       \
48         LogError(message);                              \
49         ReThrowMsg(WidgetDAO::Exception::DatabaseError, \
50                    message);                            \
51     }
52
53 WidgetDAO::WidgetDAO(DPL::OptionalString widgetGUID) :
54     WidgetDAOReadOnly(WidgetDAOReadOnly::getHandle(widgetGUID))
55 {}
56
57 WidgetDAO::WidgetDAO(DPL::String tzAppId) :
58     WidgetDAOReadOnly(WidgetDAOReadOnly::getHandle(tzAppId))
59 {}
60
61 WidgetDAO::WidgetDAO(DbWidgetHandle handle) :
62     WidgetDAOReadOnly(handle)
63 {}
64
65 WidgetDAO::~WidgetDAO()
66 {}
67
68 void WidgetDAO::setTizenAppId(const DPL::OptionalString& tzAppId)
69 {
70     SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN
71     {
72         using namespace DPL::DB::ORM;
73         wrt::ScopedTransaction transaction(&WrtDatabase::interface());
74
75         if (!isWidgetInstalled(getHandle())) {
76             ThrowMsg(WidgetDAOReadOnly::Exception::WidgetNotExist,
77                      "Cannot find widget. Handle: " << getHandle());
78         }
79
80         wrt::WidgetInfo::Row row;
81         row.Set_tizen_appid(*tzAppId);
82
83         WRT_DB_UPDATE(update, wrt::WidgetInfo, &WrtDatabase::interface())
84         update->Where(
85             Equals<wrt::WidgetInfo::app_id>(getHandle()));
86
87         update->Values(row);
88         update->Execute();
89         transaction.Commit();
90     }
91     SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to register widget")
92 }
93
94 void WidgetDAO::setSecurityPopupUsage(const SettingsType value)
95 {
96     SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN
97     {
98         using namespace DPL::DB::ORM;
99         using namespace DPL::DB::ORM::wrt;
100
101         ScopedTransaction transaction(&WrtDatabase::interface());
102         if (!isWidgetInstalled(getHandle())) {
103             ThrowMsg(WidgetDAOReadOnly::Exception::WidgetNotExist,
104                      "Cannot find widget. Handle: " << getHandle());
105         }
106
107         WidgetSecuritySettings::Row row;
108         row.Set_security_popup_usage(value);
109
110         WRT_DB_UPDATE(update, WidgetSecuritySettings, &WrtDatabase::interface())
111         update->Where(Equals<WidgetSecuritySettings::app_id>(getHandle()));
112         update->Values(row);
113         update->Execute();
114
115         transaction.Commit();
116     }
117     SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to set security popup usage")
118 }
119
120 void WidgetDAO::setGeolocationUsage(const SettingsType value)
121 {
122     SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN
123     {
124         using namespace DPL::DB::ORM;
125         using namespace DPL::DB::ORM::wrt;
126
127         ScopedTransaction transaction(&WrtDatabase::interface());
128         if (!isWidgetInstalled(getHandle())) {
129             ThrowMsg(WidgetDAOReadOnly::Exception::WidgetNotExist,
130                      "Cannot find widget. Handle: " << getHandle());
131         }
132
133         WidgetSecuritySettings::Row row;
134         row.Set_geolocation_usage(value);
135
136         WRT_DB_UPDATE(update, WidgetSecuritySettings, &WrtDatabase::interface())
137         update->Where(Equals<WidgetSecuritySettings::app_id>(getHandle()));
138         update->Values(row);
139         update->Execute();
140
141         transaction.Commit();
142     }
143     SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to set geolocation usage")
144 }
145
146 void WidgetDAO::setWebNotificationUsage(const SettingsType value)
147 {
148     SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN
149     {
150         using namespace DPL::DB::ORM;
151         using namespace DPL::DB::ORM::wrt;
152
153         ScopedTransaction transaction(&WrtDatabase::interface());
154         if (!isWidgetInstalled(getHandle())) {
155             ThrowMsg(WidgetDAOReadOnly::Exception::WidgetNotExist,
156                      "Cannot find widget. Handle: " << getHandle());
157         }
158
159         WidgetSecuritySettings::Row row;
160         row.Set_web_notification_usage(value);
161
162         WRT_DB_UPDATE(update, WidgetSecuritySettings, &WrtDatabase::interface())
163         update->Where(Equals<WidgetSecuritySettings::app_id>(getHandle()));
164         update->Values(row);
165         update->Execute();
166
167         transaction.Commit();
168     }
169     SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to set web notification usage")
170 }
171
172 void WidgetDAO::setWebDatabaseUsage(const SettingsType value)
173 {
174     SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN
175     {
176         using namespace DPL::DB::ORM;
177         using namespace DPL::DB::ORM::wrt;
178
179         ScopedTransaction transaction(&WrtDatabase::interface());
180         if (!isWidgetInstalled(getHandle())) {
181             ThrowMsg(WidgetDAOReadOnly::Exception::WidgetNotExist,
182                      "Cannot find widget. Handle: " << getHandle());
183         }
184
185         WidgetSecuritySettings::Row row;
186         row.Set_web_database_usage(value);
187
188         WRT_DB_UPDATE(update, WidgetSecuritySettings, &WrtDatabase::interface())
189         update->Where(Equals<WidgetSecuritySettings::app_id>(getHandle()));
190         update->Values(row);
191         update->Execute();
192
193         transaction.Commit();
194     }
195     SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to set web database usage")
196 }
197
198 void WidgetDAO::setFileSystemUsage(const SettingsType value)
199 {
200     SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN
201     {
202         using namespace DPL::DB::ORM;
203         using namespace DPL::DB::ORM::wrt;
204
205         ScopedTransaction transaction(&WrtDatabase::interface());
206         if (!isWidgetInstalled(getHandle())) {
207             ThrowMsg(WidgetDAOReadOnly::Exception::WidgetNotExist,
208                      "Cannot find widget. Handle: " << getHandle());
209         }
210
211         WidgetSecuritySettings::Row row;
212         row.Set_file_system_usage(value);
213
214         WRT_DB_UPDATE(update, WidgetSecuritySettings, &WrtDatabase::interface())
215         update->Where(Equals<WidgetSecuritySettings::app_id>(getHandle()));
216         update->Values(row);
217         update->Execute();
218
219         transaction.Commit();
220     }
221     SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to set filesystem usage")
222 }
223
224 void WidgetDAO::registerWidget(
225     const TizenAppId & tzAppId,
226     const WidgetRegisterInfo &widgetRegInfo,
227     const IWacSecurity &wacSecurity)
228 {
229     LogDebug("Registering widget");
230     SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN
231     {
232         DPL::DB::ORM::wrt::ScopedTransaction transaction(
233             &WrtDatabase::interface());
234         registerWidgetInternal(tzAppId, widgetRegInfo, wacSecurity);
235         transaction.Commit();
236     }
237     SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to register widget")
238 }
239
240 DbWidgetHandle WidgetDAO::registerWidget(
241     const WidgetRegisterInfo &pWidgetRegisterInfo,
242     const IWacSecurity &wacSecurity)
243 {
244     //make it more precise due to very fast tests
245     struct timeval tv;
246     gettimeofday(&tv, NULL);
247     DbWidgetHandle widgetHandle;
248     unsigned int seed = time(NULL);
249     do {
250         widgetHandle = rand_r(&seed);
251     } while (isWidgetInstalled(widgetHandle));
252
253     registerWidget(*pWidgetRegisterInfo.configInfo.tizenAppId,
254                    pWidgetRegisterInfo,
255                    wacSecurity);
256     return widgetHandle;
257 }
258
259 TizenAppId WidgetDAO::registerWidgetGeneratePkgId(
260     const WidgetRegisterInfo &pWidgetRegisterInfo,
261     const IWacSecurity &wacSecurity)
262 {
263     TizenAppId tzAppId = generatePkgId();
264     registerWidget(tzAppId, pWidgetRegisterInfo, wacSecurity);
265     return tzAppId;
266 }
267
268 void WidgetDAO::registerWidgetInternal(
269     const TizenAppId & tzAppId,
270     const WidgetRegisterInfo &widgetRegInfo,
271     const IWacSecurity &wacSecurity,
272     const DPL::Optional<DbWidgetHandle> handle)
273 {
274     //Register into WidgetInfo has to be first
275     //as all other tables depend upon that
276     DbWidgetHandle widgetHandle = registerWidgetInfo(tzAppId,
277                                                      widgetRegInfo,
278                                                      wacSecurity,
279                                                      handle);
280
281     registerWidgetExtendedInfo(widgetHandle, widgetRegInfo);
282
283     registerWidgetLocalizedInfo(widgetHandle, widgetRegInfo);
284
285     registerWidgetIcons(widgetHandle, widgetRegInfo);
286
287     registerWidgetStartFile(widgetHandle, widgetRegInfo);
288
289     PropertyDAO::RegisterProperties(tzAppId, widgetRegInfo);
290
291     registerWidgetFeatures(widgetHandle, widgetRegInfo);
292
293     registerWidgetPrivilege(widgetHandle, widgetRegInfo);
294
295     registerWidgetWindowModes(widgetHandle, widgetRegInfo);
296
297     registerWidgetWarpInfo(widgetHandle, widgetRegInfo);
298
299     registerWidgetCertificates(widgetHandle, wacSecurity);
300
301     CertificateChainList list;
302     wacSecurity.getCertificateChainList(list, SIGNATURE_DISTRIBUTOR);
303     registerCertificatesChains(widgetHandle, SIGNATURE_DISTRIBUTOR, list);
304
305     list.clear();
306     wacSecurity.getCertificateChainList(list, SIGNATURE_AUTHOR);
307     registerCertificatesChains(widgetHandle, SIGNATURE_AUTHOR, list);
308
309     registerWidgetSettings(widgetHandle, widgetRegInfo);
310
311     registerAppService(widgetHandle, widgetRegInfo);
312
313     registerEncryptedResouceInfo(widgetHandle, widgetRegInfo);
314
315     registerExternalLocations(widgetHandle, widgetRegInfo.externalLocations);
316
317     registerWidgetSecuritySettings(widgetHandle);
318 }
319
320 void WidgetDAO::registerOrUpdateWidget(
321     const TizenAppId & widgetName,
322     const WidgetRegisterInfo &widgetRegInfo,
323     const IWacSecurity &wacSecurity)
324 {
325     LogDebug("Reregistering widget");
326     SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN
327     {
328         DPL::DB::ORM::wrt::ScopedTransaction transaction(
329             &WrtDatabase::interface());
330
331         unregisterWidgetInternal(widgetName);
332         registerWidgetInternal(widgetName, widgetRegInfo, wacSecurity);
333         transaction.Commit();
334     }
335     SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to reregister widget")
336 }
337
338 #define DO_INSERT(row, table)                              \
339     {                                                      \
340         WRT_DB_INSERT(insert, table, &WrtDatabase::interface()) \
341         insert->Values(row);                               \
342         insert->Execute();                                 \
343     }
344
345 void WidgetDAO::registerWidgetExtendedInfo(DbWidgetHandle widgetHandle,
346                                            const WidgetRegisterInfo &regInfo)
347 {
348     //Try and transaction not needed
349     using namespace DPL::DB::ORM;
350     using namespace DPL::DB::ORM::wrt;
351
352     WidgetExtendedInfo::Row row;
353     row.Set_app_id(widgetHandle);
354     //    row.Set_share_href    (DPL::FromUTF8String(regInfo.shareHref));
355     row.Set_signature_type(regInfo.signatureType);
356     row.Set_test_widget(regInfo.isTestWidget);
357     row.Set_install_time(regInfo.installedTime);
358     row.Set_splash_img_src(regInfo.configInfo.splashImgSrc);
359     row.Set_background_page(regInfo.configInfo.backgroundPage);
360     row.Set_installed_path(regInfo.widgetInstalledPath);
361
362     DO_INSERT(row, WidgetExtendedInfo)
363 }
364
365 DbWidgetHandle WidgetDAO::registerWidgetInfo(
366     const TizenAppId & tzAppId,
367     const WidgetRegisterInfo &regInfo,
368     const IWacSecurity &wacSecurity,
369     const DPL::Optional<DbWidgetHandle> handle)
370 {
371     using namespace DPL::DB::ORM;
372     using namespace DPL::DB::ORM::wrt;
373     const ConfigParserData& widgetConfigurationInfo = regInfo.configInfo;
374
375     // TODO in wrt_db all Columns in WidgetInfo have DEFAULT VALUE set.
376     // Because of that, "Optional" is not used there
377
378     WidgetInfo::Row row;
379     if (!!handle) {
380         row.Set_app_id(*handle);
381     }
382
383     row.Set_widget_type(regInfo.webAppType.appType);
384
385     row.Set_widget_id(widgetConfigurationInfo.widget_id);
386     row.Set_defaultlocale(widgetConfigurationInfo.defaultlocale);
387     row.Set_widget_version(widgetConfigurationInfo.version);
388     row.Set_widget_width(widgetConfigurationInfo.width);
389     row.Set_widget_height(widgetConfigurationInfo.height);
390     row.Set_author_name(widgetConfigurationInfo.authorName);
391     row.Set_author_email(widgetConfigurationInfo.authorEmail);
392     row.Set_author_href(widgetConfigurationInfo.authorHref);
393     row.Set_csp_policy(widgetConfigurationInfo.cspPolicy);
394     row.Set_csp_policy_report_only(widgetConfigurationInfo.cspPolicyReportOnly);
395     row.Set_base_folder(DPL::FromUTF8String(regInfo.baseFolder));
396     row.Set_webkit_plugins_required(widgetConfigurationInfo.flashNeeded);
397     row.Set_recognized(wacSecurity.isRecognized());
398     row.Set_wac_signed(wacSecurity.isWacSigned());
399     row.Set_distributor_signed(wacSecurity.isDistributorSigned());
400     row.Set_tizen_appid(tzAppId);
401     row.Set_tizen_pkgid(regInfo.tzPkgid);
402     {
403         std::stringstream tmp;
404         tmp << regInfo.minVersion;
405         row.Set_min_version(DPL::FromUTF8String(tmp.str()));
406     }
407     row.Set_back_supported(widgetConfigurationInfo.backSupported);
408     row.Set_access_network(widgetConfigurationInfo.accessNetwork);
409     row.Set_pkg_type(regInfo.packagingType.pkgType);
410
411     Try
412     {
413         DO_INSERT(row, WidgetInfo);
414     }
415     Catch(DPL::DB::SqlConnection::Exception::Base)
416     {
417         ReThrowMsg(WidgetDAO::Exception::DatabaseError,
418                    "Failed to register widget info.");
419     }
420
421     if (!handle) {
422         //get autoincremented value of widgetHandle
423         WRT_DB_SELECT(select, WidgetInfo, &WrtDatabase::interface())
424         select->Where(Equals<WidgetInfo::tizen_appid>(tzAppId));
425         return select->GetSingleValue<WidgetInfo::app_id>();
426     } else {
427         return *handle;
428     }
429 }
430
431 void WidgetDAO::registerWidgetLocalizedInfo(DbWidgetHandle widgetHandle,
432                                             const WidgetRegisterInfo &regInfo)
433 {
434     using namespace DPL::DB::ORM;
435     using namespace DPL::DB::ORM::wrt;
436
437     const ConfigParserData& widgetConfigurationInfo = regInfo.configInfo;
438
439     FOREACH(it, widgetConfigurationInfo.localizedDataSet)
440     {
441         const DPL::String& locale = it->first;
442         const ConfigParserData::LocalizedData& data = it->second;
443
444         LocalizedWidgetInfo::Row row;
445         row.Set_app_id(widgetHandle);
446         row.Set_widget_locale(locale);
447         row.Set_widget_name(data.name);
448         row.Set_widget_shortname(data.shortName);
449         row.Set_widget_description(data.description);
450         row.Set_widget_license(data.license);
451         row.Set_widget_license_file(data.licenseFile);
452         row.Set_widget_license_href(data.licenseHref);
453
454         DO_INSERT(row, LocalizedWidgetInfo)
455     }
456 }
457
458 void WidgetDAO::registerWidgetIcons(DbWidgetHandle widgetHandle,
459                                     const WidgetRegisterInfo &regInfo)
460 {
461     using namespace DPL::DB::ORM;
462     using namespace DPL::DB::ORM::wrt;
463
464     FOREACH(i, regInfo.localizationData.icons)
465     {
466         wrt::WidgetIcon::icon_id::ColumnType icon_id;
467         {
468             wrt::WidgetIcon::Row row;
469             row.Set_app_id(widgetHandle);
470             row.Set_icon_src(i->src);
471             row.Set_icon_width(i->width);
472             row.Set_icon_height(i->height);
473
474             WRT_DB_INSERT(insert, wrt::WidgetIcon, &WrtDatabase::interface())
475             insert->Values(row);
476             icon_id = static_cast<int>(insert->Execute());
477         }
478
479         FOREACH(j, i->availableLocales)
480         {
481             WidgetLocalizedIcon::Row row;
482             row.Set_app_id(widgetHandle);
483             row.Set_icon_id(icon_id);
484             row.Set_widget_locale(*j);
485             DO_INSERT(row, WidgetLocalizedIcon)
486         }
487     }
488 }
489
490 void WidgetDAO::registerWidgetStartFile(DbWidgetHandle widgetHandle,
491                                         const WidgetRegisterInfo &regInfo)
492 {
493     using namespace DPL::DB::ORM;
494     using namespace DPL::DB::ORM::wrt;
495
496     FOREACH(i, regInfo.localizationData.startFiles)
497     {
498         WidgetStartFile::start_file_id::ColumnType startFileID;
499         {
500             WidgetStartFile::Row row;
501             row.Set_app_id(widgetHandle);
502             row.Set_src(i->path);
503
504             WRT_DB_INSERT(insert, WidgetStartFile, &WrtDatabase::interface())
505             insert->Values(row);
506             startFileID = static_cast<int>(insert->Execute());
507         }
508
509         FOREACH(j, i->propertiesForLocales)
510         {
511             WidgetLocalizedStartFile::Row row;
512             row.Set_app_id(widgetHandle);
513             row.Set_start_file_id(startFileID);
514             row.Set_widget_locale(j->first);
515             row.Set_type(j->second.type);
516             row.Set_encoding(j->second.encoding);
517
518             DO_INSERT(row, WidgetLocalizedStartFile)
519         }
520     }
521 }
522
523 void WidgetDAO::registerWidgetFeatures(DbWidgetHandle widgetHandle,
524                                        const WidgetRegisterInfo &regInfo)
525 {
526     using namespace DPL::DB::ORM;
527     const ConfigParserData& widgetConfigurationInfo = regInfo.configInfo;
528
529     FOREACH(pWidgetFeature, widgetConfigurationInfo.featuresList)
530     {
531         wrt::WidgetFeature::Row widgetFeature;
532         widgetFeature.Set_app_id(widgetHandle);
533         widgetFeature.Set_name(pWidgetFeature->name);
534         widgetFeature.Set_required(pWidgetFeature->required);
535         widgetFeature.Set_rejected(false);
536
537         wrt::WidgetFeature::widget_feature_id::ColumnType widgetFeatureID;
538         {
539             WRT_DB_INSERT(insert, wrt::WidgetFeature, &WrtDatabase::interface())
540             insert->Values(widgetFeature);
541             widgetFeatureID = static_cast<int>(insert->Execute());
542         }
543
544         // Insert into table FeatureParam
545         wrt::FeatureParam::Row featureParam;
546         featureParam.Set_widget_feature_id(widgetFeatureID);
547
548         FOREACH(iter, pWidgetFeature->paramsList)
549         {
550             featureParam.Set_name(iter->name);
551             featureParam.Set_value(iter->value);
552
553             DO_INSERT(featureParam, wrt::FeatureParam)
554         }
555     }
556 }
557
558 void WidgetDAO::registerWidgetPrivilege(DbWidgetHandle widgetHandle,
559                                         const WidgetRegisterInfo &regInfo)
560 {
561     using namespace DPL::DB::ORM;
562     const ConfigParserData& widgetConfigurationInfo = regInfo.configInfo;
563
564     FOREACH(it, widgetConfigurationInfo.privilegeList)
565     {
566         wrt::WidgetPrivilege::Row widgetPrivilege;
567         widgetPrivilege.Set_app_id(widgetHandle);
568         widgetPrivilege.Set_name(it->name);
569
570         DO_INSERT(widgetPrivilege, wrt::WidgetPrivilege)
571     }
572 }
573
574 void WidgetDAO::updateFeatureRejectStatus(const DbWidgetFeature &widgetFeature)
575 {
576     // This function could be merged with registerWidgetFeature but it requires
577     // desing change:
578     // 1. Check "ace step" in installer must be done before "update database
579     // step"
580     // And:
581     // ConfigurationParserData shouldn't be called "ParserData" any more.
582     using namespace DPL::DB::ORM;
583
584     wrt::ScopedTransaction transaction(&WrtDatabase::interface());
585     WRT_DB_SELECT(select, wrt::WidgetFeature, &WrtDatabase::interface())
586     select->Where(And(Equals<wrt::WidgetFeature::app_id>(m_widgetHandle),
587                       Equals<wrt::WidgetFeature::name>(widgetFeature.name)));
588
589     auto row = select->GetSingleRow();
590     row.Set_rejected(widgetFeature.rejected);
591
592     WRT_DB_UPDATE(update, wrt::WidgetFeature, &WrtDatabase::interface())
593     update->Where(And(Equals<wrt::WidgetFeature::app_id>(m_widgetHandle),
594                       Equals<wrt::WidgetFeature::name>(widgetFeature.name)));
595     update->Values(row);
596     update->Execute();
597     transaction.Commit();
598 }
599
600 void WidgetDAO::registerWidgetWindowModes(DbWidgetHandle widgetHandle,
601                                           const WidgetRegisterInfo &regInfo)
602 {
603     using namespace DPL::DB::ORM;
604     using namespace DPL::DB::ORM::wrt;
605     const ConfigParserData& widgetConfigurationInfo = regInfo.configInfo;
606
607     FOREACH(i, widgetConfigurationInfo.windowModes)
608     {
609         wrt::WidgetWindowModes::Row windowMode;
610         windowMode.Set_app_id(widgetHandle);
611         windowMode.Set_window_mode(*i);
612
613         DO_INSERT(windowMode, wrt::WidgetWindowModes)
614     }
615 }
616
617 void WidgetDAO::registerWidgetWarpInfo(DbWidgetHandle widgetHandle,
618                                        const WidgetRegisterInfo &regInfo)
619 {
620     using namespace DPL::DB::ORM;
621     using namespace DPL::DB::ORM::wrt;
622     const ConfigParserData& widgetConfigurationInfo = regInfo.configInfo;
623
624     FOREACH(AccIt, widgetConfigurationInfo.accessInfoSet)
625     {
626         WidgetWARPInfo::Row row;
627         row.Set_app_id(widgetHandle);
628         row.Set_iri(AccIt->m_strIRI);
629         row.Set_subdomain_access(static_cast <int>(
630                                      AccIt->m_bSubDomainAccess));
631
632         DO_INSERT(row, WidgetWARPInfo)
633     }
634 }
635
636 void WidgetDAO::registerWidgetCertificates(DbWidgetHandle widgetHandle,
637                                            const IWacSecurity &wacSecurity)
638 {
639     using namespace DPL::DB::ORM;
640     using namespace DPL::DB::ORM::wrt;
641
642     FOREACH(it, wacSecurity.getCertificateList())
643     {
644         WidgetCertificateFingerprint::Row row;
645         row.Set_app_id(widgetHandle);
646         row.Set_owner(it->owner);
647         row.Set_chainid(it->chainId);
648         row.Set_type(it->type);
649         row.Set_md5_fingerprint(DPL::FromUTF8String(it->strMD5Fingerprint));
650         row.Set_sha1_fingerprint(DPL::FromUTF8String(it->strSHA1Fingerprint));
651         row.Set_common_name(it->strCommonName);
652
653         DO_INSERT(row, WidgetCertificateFingerprint)
654     }
655 }
656
657 void WidgetDAO::registerCertificatesChains(
658     DbWidgetHandle widgetHandle,
659     CertificateSource certificateSource,
660     const CertificateChainList &
661     certificateChainList)
662 {
663     using namespace DPL::DB::ORM;
664     using namespace DPL::DB::ORM::wrt;
665     FOREACH(certChain, certificateChainList)
666     {
667         WidgetCertificate::Row row;
668         row.Set_app_id(widgetHandle);
669         row.Set_cert_source(certificateSource);
670         row.Set_encoded_chain(DPL::FromASCIIString(*certChain));
671
672         DO_INSERT(row, WidgetCertificate);
673     }
674 }
675
676 void WidgetDAO::registerWidgetSettings(DbWidgetHandle widgetHandle,
677                                        const WidgetRegisterInfo &regInfo)
678 {
679     using namespace DPL::DB::ORM;
680     using namespace DPL::DB::ORM::wrt;
681
682     const ConfigParserData& widgetConfigurationInfo = regInfo.configInfo;
683
684     FOREACH(pWidgetSetting, widgetConfigurationInfo.settingsList)
685     {
686         SettingsList::Row row;
687         row.Set_appId(widgetHandle);
688         row.Set_settingName(pWidgetSetting->m_name);
689         row.Set_settingValue(pWidgetSetting->m_value);
690
691         DO_INSERT(row, SettingsList)
692     }
693 }
694
695 void WidgetDAO::insertApplicationServiceInfo(DbWidgetHandle handle,
696                                              DPL::String src,
697                                              DPL::String operation,
698                                              DPL::String scheme,
699                                              DPL::String mime)
700 {
701     using namespace DPL::DB::ORM;
702     using namespace DPL::DB::ORM::wrt;
703
704     ApplicationServiceInfo::Row row;
705
706     row.Set_app_id(handle);
707     row.Set_src(src);
708     row.Set_operation(operation);
709     row.Set_scheme(scheme);
710     row.Set_mime(mime);
711
712     DO_INSERT(row, ApplicationServiceInfo);
713 }
714
715 void WidgetDAO::registerAppService(DbWidgetHandle widgetHandle,
716                                    const WidgetRegisterInfo &regInfo)
717 {
718     using namespace DPL::DB::ORM;
719     using namespace DPL::DB::ORM::wrt;
720     const ConfigParserData& widgetConfigurationInfo = regInfo.configInfo;
721
722     // appServiceList
723     FOREACH(ASIt, widgetConfigurationInfo.appServiceList)
724     {
725         ApplicationServiceInfo::Row row;
726         row.Set_app_id(widgetHandle);
727         row.Set_src(ASIt->m_src);
728         row.Set_operation(ASIt->m_operation);
729         row.Set_scheme(ASIt->m_scheme);
730         row.Set_mime(ASIt->m_mime);
731         row.Set_disposition(static_cast<int>(ASIt->m_disposition));
732
733         DO_INSERT(row, ApplicationServiceInfo)
734     }
735
736     // appControlList
737     FOREACH(appControl_it, widgetConfigurationInfo.appControlList)
738     {
739         DPL::String src       = appControl_it->m_src;
740         DPL::String operation = appControl_it->m_operation;
741
742         if (!appControl_it->m_uriList.empty())
743         {
744             FOREACH(uri_it, appControl_it->m_uriList)
745             {
746                 DPL::String scheme = *uri_it;
747
748                 if (!appControl_it->m_mimeList.empty())
749                 {
750                     FOREACH(mime_it, appControl_it->m_mimeList)
751                     {
752                         DPL::String mime = *mime_it;
753
754                         insertApplicationServiceInfo(widgetHandle, src, operation, scheme, mime);
755                     }
756                 }
757                 else
758                 {
759                     DPL::String mime = L"";
760
761                     insertApplicationServiceInfo(widgetHandle, src, operation, scheme, mime);
762                 }
763             }
764         }
765         else
766         {
767             DPL::String scheme = L"";
768
769             if (!appControl_it->m_mimeList.empty())
770             {
771                 FOREACH(mime_it, appControl_it->m_mimeList)
772                 {
773                     DPL::String mime = *mime_it;
774
775                     insertApplicationServiceInfo(widgetHandle, src, operation, scheme, mime);
776                 }
777             }
778             else
779             {
780                 DPL::String mime = L"";
781
782                 insertApplicationServiceInfo(widgetHandle, src, operation, scheme, mime);
783             }
784         }
785     }
786 }
787
788 void WidgetDAO::registerEncryptedResouceInfo(DbWidgetHandle widgetHandle,
789                                              const WidgetRegisterInfo &regInfo)
790 {
791     using namespace DPL::DB::ORM;
792     using namespace DPL::DB::ORM::wrt;
793
794     FOREACH(it, regInfo.encryptedFiles)
795     {
796         EncryptedResourceList::Row row;
797         row.Set_app_id(widgetHandle);
798         row.Set_resource(it->fileName);
799         row.Set_size(it->fileSize);
800
801         DO_INSERT(row, EncryptedResourceList)
802     }
803 }
804
805 void WidgetDAO::registerExternalLocations(
806     DbWidgetHandle widgetHandle,
807     const ExternalLocationList &
808     externals)
809 {
810     SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN
811     {
812         using namespace DPL::DB::ORM;
813         using namespace DPL::DB::ORM::wrt;
814         DPL::DB::ORM::wrt::ScopedTransaction transaction(
815             &WrtDatabase::interface());
816         LogDebug("Inserting external files for widgetHandle: " << widgetHandle);
817         FOREACH(it, externals)
818         {
819             WidgetExternalLocations::Row row;
820             row.Set_app_id(widgetHandle);
821             row.Set_path(DPL::FromUTF8String(*it));
822
823             DO_INSERT(row, WidgetExternalLocations)
824         }
825         transaction.Commit();
826     }
827     SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to register external files");
828 }
829
830 void WidgetDAO::registerWidgetSecuritySettings(DbWidgetHandle widgetHandle)
831 {
832     using namespace DPL::DB::ORM;
833     using namespace DPL::DB::ORM::wrt;
834     WidgetSecuritySettings::Row row;
835     row.Set_app_id(widgetHandle);
836     row.Set_security_popup_usage(SETTINGS_TYPE_ON);
837     row.Set_geolocation_usage(SETTINGS_TYPE_ON);
838     row.Set_web_notification_usage(SETTINGS_TYPE_ON);
839     row.Set_web_database_usage(SETTINGS_TYPE_ON);
840     row.Set_file_system_usage(SETTINGS_TYPE_ON);
841
842     DO_INSERT(row, WidgetSecuritySettings)
843 }
844
845 void WidgetDAO::unregisterAllExternalLocations()
846 {
847     using namespace DPL::DB::ORM;
848     using namespace DPL::DB::ORM::wrt;
849     LogDebug("Deleting external files for widgetHandle: " << m_widgetHandle);
850     WRT_DB_DELETE(del, WidgetExternalLocations, &WrtDatabase::interface());
851     del->Where(Equals<WidgetExternalLocations::app_id>(m_widgetHandle));
852     del->Execute();
853 }
854
855 void WidgetDAO::unregisterWidget(const TizenAppId & tzAppId)
856 {
857     LogDebug("Unregistering widget from DB. tzAppId: " << tzAppId);
858     SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN
859     {
860         DPL::DB::ORM::wrt::ScopedTransaction transaction(
861             &WrtDatabase::interface());
862         unregisterWidgetInternal(tzAppId);
863         transaction.Commit();
864     }
865     SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to unregister widget")
866 }
867
868 void WidgetDAO::unregisterWidget(WrtDB::DbWidgetHandle handle)
869 {
870     LogDebug("Unregistering widget from DB. Handle: " << handle);
871     SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN
872     {
873         using namespace DPL::DB::ORM;
874         using namespace DPL::DB::ORM::wrt;
875         ScopedTransaction transaction(&WrtDatabase::interface());
876
877         // Delete from table Widget Info
878         WRT_DB_DELETE(del, WidgetInfo, &WrtDatabase::interface())
879         del->Where(Equals<WidgetInfo::app_id>(handle));
880         del->Execute();
881
882         transaction.Commit();
883     }
884     SQL_CONNECTION_EXCEPTION_HANDLER_END("Failed to unregister widget")
885 }
886
887 void WidgetDAO::unregisterWidgetInternal(
888     const TizenAppId & tzAppId)
889 {
890     using namespace DPL::DB::ORM;
891     using namespace DPL::DB::ORM::wrt;
892
893     DbWidgetHandle handle = getHandle(tzAppId);
894
895     // Delete from table Widget Info
896     WRT_DB_DELETE(del, WidgetInfo, &WrtDatabase::interface())
897     del->Where(Equals<WidgetInfo::app_id>(handle));
898     del->Execute();
899
900     // Deleting in other tables is done via "delete cascade" in SQL
901 }
902
903 #undef DO_INSERT
904
905 #undef SQL_CONNECTION_EXCEPTION_HANDLER_BEGIN
906 #undef SQL_CONNECTION_EXCEPTION_HANDLER_END
907 } // namespace WrtDB