Commit directly when running as root 73/257173/3
authorSangyoon Jang <jeremy.jang@samsung.com>
Tue, 20 Apr 2021 09:24:43 +0000 (18:24 +0900)
committerSangyoon Jang <jeremy.jang@samsung.com>
Mon, 26 Apr 2021 05:21:52 +0000 (14:21 +0900)
During image creation, theme provider is not running, so plugin should
commit directly.

Change-Id: Ieaa2df7f54607526e50a07064f37d6ccda08e513
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
src/theme_plugin/CMakeLists.txt
src/theme_plugin/theme_metadata_plugin.cc
src/theme_plugin/theme_parser.cc
src/theme_plugin/theme_parser.h
test/unit_tests/test_theme_metadata_plugin.cc
test/unit_tests/test_theme_parser.cc

index e99335a..dda1cf1 100644 (file)
@@ -1,7 +1,7 @@
 AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} THEME_PLUGIN_SRCS)
 
 ADD_LIBRARY(${TARGET_TIZEN_THEME_PLUGIN} SHARED ${THEME_PLUGIN_SRCS})
-TARGET_LINK_LIBRARIES(${TARGET_TIZEN_THEME_PLUGIN} PRIVATE ${TARGET_TIZEN_THEME})
+TARGET_LINK_LIBRARIES(${TARGET_TIZEN_THEME_PLUGIN} PRIVATE ${TARGET_TIZEN_THEME} ${TARGET_TIZEN_THEME_PROVIDER})
 TARGET_INCLUDE_DIRECTORIES(${TARGET_TIZEN_THEME_PLUGIN} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}../)
 
 APPLY_PKG_CONFIG(${TARGET_TIZEN_THEME_PLUGIN} PUBLIC
index d556efe..38662a7 100644 (file)
@@ -179,11 +179,12 @@ extern "C" int PKGMGR_MDPARSER_PLUGIN_CLEAN(
     const char* pkgid, const char* appid, GList* metadata) {
   if (AutosetData::GetInst().autoset_id.empty())
     return 0;
+  ttm::dbus::RequestBroker& broker = ttm::dbus::RequestBroker::GetInst();
+  if (!broker.GetConnection())
+    return 0;
   tizen_base::Bundle b;
   b.Add(ttm::dbus::kCmdDataKey, AutosetData::GetInst().autoset_id);
-  tizen_base::Bundle reply =
-      ttm::dbus::RequestBroker::GetInst().SendData(
-          ttm::dbus::Command::SET_ID, b);
+  tizen_base::Bundle reply = broker.SendData(ttm::dbus::Command::SET_ID, b);
   if (reply.GetString(ttm::dbus::kCmdResultKey) != "ok")
     return -1;
   return 0;
index 7bfac76..c106062 100644 (file)
@@ -16,6 +16,7 @@
 #include "theme/loader/theme_info.h"
 #include "theme/utils/logging.h"
 #include "theme_plugin/theme_info_builder.h"
+#include "theme_provider/theme_info_proxy.h"
 
 namespace {
 
@@ -198,21 +199,33 @@ loader::ThemeInfo ThemeParser::Inflate(const std::string id,
 using ttm::dbus::Command;
 using ttm::dbus::RequestBroker;
 bool ThemeParser::Commit(ThemeOperation operation,
-  const loader::ThemeInfo& theme) {
+    const loader::ThemeInfo& theme) {
+  RequestBroker& broker = RequestBroker::GetInst();
+  if (!broker.GetConnection()) {
+    if (getuid() == 0) {
+      // in case of root, this installation processed during image creation or
+      // platform update.
+      return ForceCommit(operation, theme);
+    } else {
+      LOG(ERROR) << "Cannot connect with theme-provider";
+      return false;
+    }
+  }
+
   tizen_base::Bundle theme_info = theme.Serialize();
   tizen_base::Bundle reply;
   switch (operation) {
     case ThemeOperation::ADD:
       LOG(DEBUG) << "Add Theme: " << theme.GetId();
-      reply = RequestBroker::GetInst().SendData(Command::ADD, theme_info);
+      reply = broker.SendData(Command::ADD, theme_info);
       break;
     case ThemeOperation::UPDATE:
       LOG(DEBUG) << "Update Theme: " << theme.GetId();
-      reply = RequestBroker::GetInst().SendData(Command::UPDATE, theme_info);
+      reply = broker.SendData(Command::UPDATE, theme_info);
       break;
     case ThemeOperation::REMOVE:
       LOG(DEBUG) << "Remove Theme: " << theme.GetId();
-      reply = RequestBroker::GetInst().SendData(Command::REMOVE, theme_info);
+      reply = broker.SendData(Command::REMOVE, theme_info);
       break;
     default:
       return false;
@@ -222,5 +235,19 @@ bool ThemeParser::Commit(ThemeOperation operation,
   return true;
 }
 
+bool ThemeParser::ForceCommit(ThemeOperation operation,
+    const loader::ThemeInfo& theme) {
+  ttm::provider::ThemeInfoProxy proxy("/opt/dbspace/.tizen_theme.db");
+  switch (operation) {
+    case ThemeOperation::ADD:
+      return proxy.SaveTheme(theme);
+    case ThemeOperation::UPDATE:
+      return proxy.UpdateTheme(theme);
+    case ThemeOperation::REMOVE:
+      return proxy.RemoveTheme(theme.GetId());
+  }
+  return false;
+}
+
 }  // namespace plugin
 }  // namespace ttm
index bb3b4df..fc25ff9 100644 (file)
@@ -38,6 +38,7 @@ class ThemeParser {
       const std::string parent_key, ThemeInfoBuilder* builder);
   bool ExtractJson(const Json::Value& node,
       std::string parent_key, ThemeInfoBuilder* builder, int depth);
+  bool ForceCommit(ThemeOperation operation, const loader::ThemeInfo& theme);
 
   std::string path_;
   bool auto_file_key_gen_;
index 4310804..bad510f 100644 (file)
@@ -123,6 +123,10 @@ TEST_F(ThemeMetadataPluginTest, PKGMGR_MDPARSER_PLUGIN_INSTALL) {
           WillOnce(DoAll(
               SetArgPointee<0>(PM_PRIVILEGE_PUBLIC),
               Return(PMINFO_R_OK)));
+  GDBusConnection* conn =
+      reinterpret_cast<GDBusConnection*>(g_object_new(G_TYPE_OBJECT, NULL));
+  EXPECT_CALL(GetMock<GioMock>(),
+      g_bus_get_sync(_, _, _)).WillRepeatedly(Return(conn));
   GDBusMessage* msg =
       reinterpret_cast<GDBusMessage*>(g_object_new(G_TYPE_OBJECT, NULL));
   EXPECT_CALL(GetMock<GioMock>(),
@@ -200,6 +204,10 @@ TEST_F(ThemeMetadataPluginTest, PKGMGR_MDPARSER_PLUGIN_UPGRADE) {
           WillRepeatedly(DoAll(
               SetArgPointee<1>(const_cast<char*>(root_path)),
               Return(PMINFO_R_OK)));
+  GDBusConnection* conn =
+      reinterpret_cast<GDBusConnection*>(g_object_new(G_TYPE_OBJECT, NULL));
+  EXPECT_CALL(GetMock<GioMock>(),
+      g_bus_get_sync(_, _, _)).WillRepeatedly(Return(conn));
   GDBusMessage* msg =
       reinterpret_cast<GDBusMessage*>(g_object_new(G_TYPE_OBJECT, NULL));
   EXPECT_CALL(GetMock<GioMock>(),
@@ -246,6 +254,10 @@ TEST_F(ThemeMetadataPluginTest, PKGMGR_MDPARSER_PLUGIN_UNINSTALL) {
           WillRepeatedly(DoAll(
               SetArgPointee<1>(const_cast<char*>(root_path)),
               Return(PMINFO_R_OK)));
+  GDBusConnection* conn =
+      reinterpret_cast<GDBusConnection*>(g_object_new(G_TYPE_OBJECT, NULL));
+  EXPECT_CALL(GetMock<GioMock>(),
+      g_bus_get_sync(_, _, _)).WillRepeatedly(Return(conn));
   GDBusMessage* msg =
       reinterpret_cast<GDBusMessage*>(g_object_new(G_TYPE_OBJECT, NULL));
   EXPECT_CALL(GetMock<GioMock>(),
index 1f93c4d..d5d88be 100644 (file)
@@ -197,8 +197,6 @@ TEST_F(ThemeParserTest, Commit_N1) {
   auto info = parser.Inflate("testid", "testpkgid", 5001, false);
   EXPECT_FALSE(info.IsValid());
 
-  EXPECT_CALL(GetMock<GioMock>(),
-      g_dbus_message_new_method_call(_, _, _, _)).WillOnce(Return(nullptr));
   EXPECT_FALSE(
       parser.Commit(ttm::plugin::ThemeParser::ThemeOperation::ADD, info));
 }
@@ -208,8 +206,6 @@ TEST_F(ThemeParserTest, Commit_N2) {
   auto info = parser.Inflate("testid", "testpkgid", 5001, false);
   EXPECT_FALSE(info.IsValid());
 
-  EXPECT_CALL(GetMock<GioMock>(),
-      g_dbus_message_new_method_call(_, _, _, _)).WillOnce(Return(nullptr));
   EXPECT_FALSE(
       parser.Commit(ttm::plugin::ThemeParser::ThemeOperation::UPDATE, info));
 }
@@ -219,8 +215,6 @@ TEST_F(ThemeParserTest, Commit_N3) {
   auto info = parser.Inflate("testid", "testpkgid", 5001, false);
   EXPECT_FALSE(info.IsValid());
 
-  EXPECT_CALL(GetMock<GioMock>(),
-      g_dbus_message_new_method_call(_, _, _, _)).WillOnce(Return(nullptr));
   EXPECT_FALSE(
       parser.Commit(ttm::plugin::ThemeParser::ThemeOperation::REMOVE, info));
 }