Task database fix - TC11
[framework/web/wrt-installer.git] / src / jobs / widget_install / task_database.cpp
index 696a962..78c06ef 100644 (file)
@@ -39,6 +39,7 @@
 #include <errno.h>
 #include <string.h>
 #include <vconf.h>
+#include <map>
 
 using namespace WrtDB;
 
@@ -69,9 +70,17 @@ void TaskDatabase::StepWrtDBInsert()
 
         if (m_context.existingWidgetInfo.isExist) //update
         {
-            m_handleToRemove = WidgetDAOReadOnly::getHandle(
-                m_context.locations->getPkgname());
             LogInfo("Registering widget... (update)");
+            Try
+            {
+                m_handleToRemove = WidgetDAOReadOnly::getHandle(
+                    m_context.locations->getPkgname());
+            }
+            Catch(WidgetDAOReadOnly::Exception::WidgetNotExist)
+            {
+                LogError("Given tizenId not found for update installation (Same GUID?)");
+                ThrowMsg(Exceptions::InvalidPackage, "Given tizenId not found for update installation");
+            }
             WidgetDAO::registerOrUpdateWidget(
                     m_context.locations->getPkgname(),
                     m_context.widgetConfig,
@@ -125,7 +134,7 @@ void TaskDatabase::StepAceDBInsert()
                                   m_context.wacSecurity.getCertificateList()))
     {
         LogError("ace database insert failed");
-        ThrowMsg(Exceptions::NotAllowed, "Update failure. ace_register_widget failed");
+        ThrowMsg(Exceptions::UpdateFailed, "Update failure. ace_register_widget failed");
     }
     LogDebug("Ace data inserted");
 
@@ -139,15 +148,23 @@ void TaskDatabase::StepRegisterExternalFiles()
     WrtDB::ExternalLocationList externalLocationsUpdate = m_context.locations->listExternalLocations();
     if (m_context.existingWidgetInfo.isExist) //update
     {
-        WidgetDAO dao(m_context.locations->getPkgname());
-        WrtDB::ExternalLocationList externalLocationsDB = dao.getWidgetExternalLocations();
-        FOREACH(file, externalLocationsDB)
+        Try
         {
-            if(std::find(externalLocationsUpdate.begin(), externalLocationsUpdate.end(), *file) == externalLocationsUpdate.end())
+            WidgetDAO dao(m_context.locations->getPkgname());
+            WrtDB::ExternalLocationList externalLocationsDB = dao.getWidgetExternalLocations();
+            FOREACH(file, externalLocationsDB)
             {
-                m_externalLocationsToRemove.push_back(*file);
+                if(std::find(externalLocationsUpdate.begin(), externalLocationsUpdate.end(), *file) == externalLocationsUpdate.end())
+                {
+                    m_externalLocationsToRemove.push_back(*file);
+                }
             }
         }
+        Catch(WidgetDAOReadOnly::Exception::WidgetNotExist)
+        {
+            LogError("Given tizenId not found for update installation (Same GUID?)");
+            ThrowMsg(Exceptions::UpdateFailed, "Given tizenId not found for update installation");
+        }
     }
     LogDebug("Registering external files:");
     FOREACH(file, externalLocationsUpdate)
@@ -191,41 +208,40 @@ void TaskDatabase::StepRemoveExternalFiles()
 void TaskDatabase::StepCreateVconf()
 {
     LogDebug("StepCreateVconf");
-    std::string popupUsageKey =
+    std::map<std::string, WrtDB::SettingsType> vconfData;
+    vconfData[
         WrtDB::VconfConfig::GetVconfKeyPopupUsage(
-            m_context.locations->getPkgname());
-    std::string geolocationUsageKey =
+            m_context.locations->getPkgname())] = WrtDB::SETTINGS_TYPE_ON;
+    vconfData[
         WrtDB::VconfConfig::GetVconfKeyGeolocationUsage(
-            m_context.locations->getPkgname());
-    std::string webNotificationUsageKey =
+            m_context.locations->getPkgname())] = WrtDB::SETTINGS_TYPE_ON;
+    vconfData[
         WrtDB::VconfConfig::GetVconfKeyWebNotificationUsage(
-            m_context.locations->getPkgname());
-    std::string webDatabaseUsageKey =
+            m_context.locations->getPkgname())] = WrtDB::SETTINGS_TYPE_ON;
+    vconfData[
         WrtDB::VconfConfig::GetVconfKeyWebDatabaseUsage(
-            m_context.locations->getPkgname());
-    std::string filesystemUsageKey =
+            m_context.locations->getPkgname())] = WrtDB::SETTINGS_TYPE_ON;
+    vconfData[
         WrtDB::VconfConfig::GetVconfKeyFilesystemUsage(
-            m_context.locations->getPkgname());
-    std::string memorySavingModeKey =
+            m_context.locations->getPkgname())] = WrtDB::SETTINGS_TYPE_ON;
+    vconfData[
         WrtDB::VconfConfig::GetVconfKeyMemorySavingMode(
-            m_context.locations->getPkgname());
-
-    vconf_set_int(popupUsageKey.c_str(),
-                  static_cast<int>(WrtDB::SETTINGS_TYPE_ON));
-    // prevent permission error
-    vconf_unset(popupUsageKey.c_str());
-    vconf_set_int(popupUsageKey.c_str(),
-                  static_cast<int>(WrtDB::SETTINGS_TYPE_ON));
-    vconf_set_int(geolocationUsageKey.c_str(),
-                  static_cast<int>(WrtDB::SETTINGS_TYPE_ON));
-    vconf_set_int(webNotificationUsageKey.c_str(),
-                  static_cast<int>(WrtDB::SETTINGS_TYPE_ON));
-    vconf_set_int(webDatabaseUsageKey.c_str(),
-                  static_cast<int>(WrtDB::SETTINGS_TYPE_ON));
-    vconf_set_int(filesystemUsageKey.c_str(),
-                  static_cast<int>(WrtDB::SETTINGS_TYPE_ON));
-    vconf_set_int(memorySavingModeKey.c_str(),
-                  static_cast<int>(WrtDB::SETTINGS_TYPE_OFF));
+            m_context.locations->getPkgname())] = WrtDB::SETTINGS_TYPE_OFF;
+
+    // vconftool -g 5000 set -t int <path> initialize value
+    // Current installer should use vconftool for setting group ID
+    // In case of install application by pkgcmd, permission for others
+    // set to read-only
+    FOREACH(it, vconfData) {
+        std::ostringstream command;
+        command << "vconftool -g 5000 set -t int ";
+        command << (*it).first;
+        command << " \"" << static_cast<int>((*it).second) << "\"";
+        int ret = system(command.str().c_str());
+        if (-1 == ret) {
+            ThrowMsg(Exceptions::CreateVconfFailure, "Failed to create vconf files");
+        }
+    }
 }
 
 void TaskDatabase::StepAbortDBInsert()