Implement unimplemented APIs 05/309505/4
authorIlho Kim <ilho159.kim@samsung.com>
Thu, 11 Apr 2024 12:39:36 +0000 (21:39 +0900)
committerIlho Kim <ilho159.kim@samsung.com>
Fri, 12 Apr 2024 06:35:31 +0000 (15:35 +0900)
pkgmgr_client_listen_pkg_upgrade_status
pkgmgr_installer_send_pkg_upgrade_signal
pkgmgr_installer_set_privilege_level
pkgmgr_installer_info_get_privilege_level
pkgmgr_installer_info_get_debug_mode
pkgmgr_installer_info_get_skip_optimization
pkgmgr_installer_error_to_string
pkgmgr_installer_set_is_upgrade

Change-Id: Iad57673b461980c3f59aea51358c37f2b3d68e12
Signed-off-by: Ilho Kim <ilho159.kim@samsung.com>
client/src/PkgSignal.cc
client/src/PkgSignal.h
client/src/api_stub.cc
client/src/signal_receiver.cc
client/src/signal_receiver.hh
installer/src/PkgSignal.cc
installer/src/PkgSignal.h
installer/src/api_stub.cc
installer/src/control.cc
installer/src/control.hh
tidl/PkgSignal.tidl

index 7869ac3..216a9e8 100644 (file)
@@ -346,6 +346,20 @@ void PkgSignal::EventCb(const char* event_name, bundle* event_data, void* user_d
     break;
 
 
+    case static_cast<int>(MethodId::AsyncResultForPkgUpgrade):
+    {
+      char* param1_raw  = nullptr;
+      rpc_port_parcel_read_string(p, &param1_raw);
+      std::string param1(param1_raw);
+      free(param1_raw);
+      int param2;
+      rpc_port_parcel_read_int32(p, &param2);
+      ptr->OnAsyncResultForPkgUpgrade(param1, param2);
+
+    }
+    break;
+
+
 
     default:
       _E("Unknown command(%d)", cmd);
@@ -424,6 +438,38 @@ void PkgSignal::AsyncResultForResource(std::string signal, int targetUid, std::s
     throw InvalidIOException();
   }
 }
+
+void PkgSignal::AsyncResultForPkgUpgrade(std::string signal, int progress) {
+  rpc_port_parcel_h p;
+  rpc_port_parcel_create(&p);
+  std::unique_ptr<std::remove_pointer<rpc_port_parcel_h>::type,
+      decltype(rpc_port_parcel_destroy)*> p_auto(p, rpc_port_parcel_destroy);
+  rpc_port_parcel_header_h header_;
+  rpc_port_parcel_get_header(p, &header_);
+  rpc_port_parcel_header_set_tag(header_, TIDL_VERSION);
+  int seq_num_ = -1;
+  rpc_port_parcel_header_get_seq_num(header_, &seq_num_);
+  _W("[Version] \"%s\", [Sequence] %d", TIDL_VERSION, seq_num_);
+  rpc_port_parcel_write_int32(p, static_cast<int>(MethodId::AsyncResultForPkgUpgrade));
+  rpc_port_parcel_write_string(p, signal.c_str());
+  rpc_port_parcel_write_int32(p, progress);
+
+
+  // Send
+  bundle* b = bundle_create();
+  std::unique_ptr<bundle, decltype(bundle_free)*> b_auto(b, bundle_free);
+  if (GetBundleFromParcel(p, b) == nullptr) {
+    _E("Failed to make bundle from parcel");
+    throw InvalidIOException();
+  }
+
+  std::lock_guard<std::recursive_mutex> lock(mutex_);
+  int ret = event_publish_app_event(GetEventName().c_str(), b);
+  if (ret != EVENT_ERROR_NONE) {
+    _E("Failed to publish event. result(%d)", ret);
+    throw InvalidIOException();
+  }
+}
 }  // namespace group
 }  // namespace PkgSignal
 }  // namespace rpc_port
index b7a319d..90888c8 100644 (file)
@@ -207,6 +207,11 @@ class PkgSignal {
 
   virtual void OnAsyncResultForResource(std::string signal, int targetUid, std::string reqId, std::string pkgid, std::string status, ExtraData extra) {}
 
+  
+  void AsyncResultForPkgUpgrade(std::string signal, int progress);
+
+  virtual void OnAsyncResultForPkgUpgrade(std::string signal, int progress) {}
+
 
  private:
 
@@ -215,6 +220,7 @@ class PkgSignal {
     __Callback = 1,
     AsyncResult = 2,
     AsyncResultForResource = 3,
+    AsyncResultForPkgUpgrade = 4,
 
   };
 
index 91c060d..d3439e1 100644 (file)
@@ -450,8 +450,19 @@ API int pkgmgr_client_listen_res_status(pkgmgr_client *pc,
 
 API int pkgmgr_client_listen_pkg_upgrade_status(pkgmgr_client *pc,
     pkgmgr_pkg_upgrade_handler event_cb, void *data) {
-  //TODO
-  return PKGMGR_R_OK;
+  Connector* con = static_cast<Connector*>(pc);
+  if (con->GetPcType() != PC_LISTENING) {
+    _E("client->pc_type is not PC_LISTENING");
+    return PKGMGR_R_EINVAL;
+  }
+
+  try {
+    const auto& receiver = con->GetSignalReceiver();
+    return receiver->AddEventHandler(event_cb, data);
+  } catch (...) {
+    _E("Exception occured");
+    return PKGMGR_R_ERROR;
+  }
 }
 
 API int pkgmgr_client_usr_mount_install_packages(pkgmgr_client *pc,
index c95bcea..eac5686 100644 (file)
@@ -120,6 +120,13 @@ void SignalReceiver::OnAsyncResultForResource(std::string signal,
   HandleGlobalResHandler(signal, targetUid, reqId, pkgid, status, extra);
 }
 
+void SignalReceiver::OnAsyncResultForPkgUpgrade(
+    std::string signal, int progress) {
+  for (const auto& [id, cb, data] : global_pkg_upgrade_handlers_) {
+    cb(progress, data);
+  }
+}
+
 void SignalReceiver::HandleResHandler(const std::string& signal,
     int targetUid, const std::string& reqId, const std::string& pkgid,
     const std::string& status, pkg_signal::ExtraData& extra) const {
@@ -182,6 +189,13 @@ int SignalReceiver::AddEventHandler(std::string req_key,
   return sId;
 }
 
+int SignalReceiver::AddEventHandler(pkgmgr_pkg_upgrade_handler event_cb,
+    void* data) {
+  int sId = SignalReceiver::GetRequestId();
+  global_pkg_upgrade_handlers_.emplace_back(sId, event_cb, data);
+  return sId;
+}
+
 
 int SignalReceiver::GetRequestId() {
   return ++request_id_;
index b6cf64b..620c1ca 100644 (file)
@@ -47,6 +47,8 @@ class SignalReceiver : public pkg_group::PkgSignal {
       std::string reqId, std::string pkgid, std::string status,
       pkg_signal::ExtraData extra) override;
 
+  void OnAsyncResultForPkgUpgrade(std::string signal, int progress) override;
+
   int AddEventHandler(std::string req_key, pkgmgr_handler event_cb, void* data);
   int AddEventHandler(std::string req_key, pkgmgr_app_handler app_event_cb,
       void* data);
@@ -54,6 +56,7 @@ class SignalReceiver : public pkg_group::PkgSignal {
       pkgmgr_pkg_size_info_receive_cb event_cb, void* pc, void* data);
   int AddEventHandler(std::string req_key, pkgmgr_res_handler event_cb,
       void* data);
+  int AddEventHandler(pkgmgr_pkg_upgrade_handler event_cb, void* data);
 
  private:
   static int GetRequestId();
@@ -86,6 +89,7 @@ class SignalReceiver : public pkg_group::PkgSignal {
   std::map<std::string,
       std::tuple<int, pkgmgr_pkg_size_info_receive_cb, void*, void*>> size_info_handlers_;
   std::list<std::tuple<int, pkgmgr_pkg_size_info_receive_cb, void*, void*>> global_size_info_handlers_;
+  std::list<std::tuple<int, pkgmgr_pkg_upgrade_handler, void*>> global_pkg_upgrade_handlers_;
 };
 
 }  // namespace client
index 7869ac3..216a9e8 100644 (file)
@@ -346,6 +346,20 @@ void PkgSignal::EventCb(const char* event_name, bundle* event_data, void* user_d
     break;
 
 
+    case static_cast<int>(MethodId::AsyncResultForPkgUpgrade):
+    {
+      char* param1_raw  = nullptr;
+      rpc_port_parcel_read_string(p, &param1_raw);
+      std::string param1(param1_raw);
+      free(param1_raw);
+      int param2;
+      rpc_port_parcel_read_int32(p, &param2);
+      ptr->OnAsyncResultForPkgUpgrade(param1, param2);
+
+    }
+    break;
+
+
 
     default:
       _E("Unknown command(%d)", cmd);
@@ -424,6 +438,38 @@ void PkgSignal::AsyncResultForResource(std::string signal, int targetUid, std::s
     throw InvalidIOException();
   }
 }
+
+void PkgSignal::AsyncResultForPkgUpgrade(std::string signal, int progress) {
+  rpc_port_parcel_h p;
+  rpc_port_parcel_create(&p);
+  std::unique_ptr<std::remove_pointer<rpc_port_parcel_h>::type,
+      decltype(rpc_port_parcel_destroy)*> p_auto(p, rpc_port_parcel_destroy);
+  rpc_port_parcel_header_h header_;
+  rpc_port_parcel_get_header(p, &header_);
+  rpc_port_parcel_header_set_tag(header_, TIDL_VERSION);
+  int seq_num_ = -1;
+  rpc_port_parcel_header_get_seq_num(header_, &seq_num_);
+  _W("[Version] \"%s\", [Sequence] %d", TIDL_VERSION, seq_num_);
+  rpc_port_parcel_write_int32(p, static_cast<int>(MethodId::AsyncResultForPkgUpgrade));
+  rpc_port_parcel_write_string(p, signal.c_str());
+  rpc_port_parcel_write_int32(p, progress);
+
+
+  // Send
+  bundle* b = bundle_create();
+  std::unique_ptr<bundle, decltype(bundle_free)*> b_auto(b, bundle_free);
+  if (GetBundleFromParcel(p, b) == nullptr) {
+    _E("Failed to make bundle from parcel");
+    throw InvalidIOException();
+  }
+
+  std::lock_guard<std::recursive_mutex> lock(mutex_);
+  int ret = event_publish_app_event(GetEventName().c_str(), b);
+  if (ret != EVENT_ERROR_NONE) {
+    _E("Failed to publish event. result(%d)", ret);
+    throw InvalidIOException();
+  }
+}
 }  // namespace group
 }  // namespace PkgSignal
 }  // namespace rpc_port
index b7a319d..90888c8 100644 (file)
@@ -207,6 +207,11 @@ class PkgSignal {
 
   virtual void OnAsyncResultForResource(std::string signal, int targetUid, std::string reqId, std::string pkgid, std::string status, ExtraData extra) {}
 
+  
+  void AsyncResultForPkgUpgrade(std::string signal, int progress);
+
+  virtual void OnAsyncResultForPkgUpgrade(std::string signal, int progress) {}
+
 
  private:
 
@@ -215,6 +220,7 @@ class PkgSignal {
     __Callback = 1,
     AsyncResult = 2,
     AsyncResultForResource = 3,
+    AsyncResultForPkgUpgrade = 4,
 
   };
 
index 8925d28..5932cf6 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "pkgmgr_installer.h"
 #include "pkgmgr_installer_debug.h"
+#include "pkgmgr_installer_error.h"
 #include "pkgmgr_installer_info.h"
 
 #include <tzplatform_config.h>
@@ -35,6 +36,9 @@
   do { if (nullptr == pi) return (r); } while (0)
 
 static uid_t g_target_uid;
+static int g_debug_mode;
+static int g_skip_optimization;
+static pkgmgr_privilege_level g_privilege_level = PM_PRIVILEGE_UNKNOWN;
 
 API pkgmgr_installer* pkgmgr_installer_new() {
   try {
@@ -70,6 +74,8 @@ API int pkgmgr_installer_receive_request(pkgmgr_installer *pi,
     cls->GetRequest()->SetUid(tzplatform_getuid(TZ_SYS_GLOBALAPP_USER));
 
   g_target_uid = cls->GetRequest()->GetUid();
+  g_debug_mode = cls->GetRequest()->IsDebugMode() ? 1 : 0;
+  g_skip_optimization = cls->GetRequest()->IsSkipOptimization() ? 1 : 0;
 
   return 0;
 }
@@ -354,7 +360,8 @@ API int pkgmgr_installer_delete_certinfo(const char *pkgid) {
 }
 
 API int pkgmgr_installer_set_privilege_level(pkgmgr_privilege_level level) {
-  //TODO
+  g_privilege_level = level;
+
   return 0;
 }
 
@@ -366,23 +373,57 @@ API int pkgmgr_installer_info_get_target_uid(uid_t *uid) {
 
 API int pkgmgr_installer_info_get_privilege_level(
     pkgmgr_privilege_level *level) {
-  //TODO
+  *level = g_privilege_level;
+
   return 0;
 }
 
 API int pkgmgr_installer_info_get_debug_mode(int *debug_mode) {
-  //TODO
+  *debug_mode = g_debug_mode;
+
   return 0;
 }
 
 API int pkgmgr_installer_info_get_skip_optimization(int *skip_optimization) {
-  //TODO
+  *skip_optimization = g_skip_optimization;
+
   return 0;
 }
 
+#define CASE_TO_STR(ERRCODE) case ERRCODE: return ERRCODE##_STR
 API const char* pkgmgr_installer_error_to_string(int error_code) {
-  //TODO
-  return nullptr;
+  switch (error_code) {
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_UNDEFINED_ERROR);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_GLOBALSYMLINK_ERROR);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_GRANT_PERMISSION_ERROR);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_IMAGE_ERROR);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_UNZIP_ERROR);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_SECURITY_ERROR);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_REGISTER_ERROR);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_PRIVILEGE_ERROR);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_PARSE_ERROR);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_RECOVERY_ERROR);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_DELTA_ERROR);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_APP_DIR_ERROR);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_CONFIG_ERROR);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_SIGNATURE_ERROR);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_SIGNATURE_INVALID);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_CERT_ERROR);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_AUTHOR_CERT_NOT_MATCH);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_AUTHOR_CERT_NOT_FOUND);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_ICON_ERROR);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_ICON_NOT_FOUND);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_MANIFEST_ERROR);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_MANIFEST_NOT_FOUND);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_OPERATION_NOT_ALLOWED);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_OUT_OF_SPACE);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_INVALID_VALUE);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_ERROR);
+  CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_OK);
+  default:
+    return PKGMGR_INSTALLER_ERRCODE_UNDEFINED_ERROR_STR;
+  }
 }
 
 API int pkgmgr_installer_add_pkg(pkgmgr_installer *pi,
@@ -410,7 +451,14 @@ API int pkgmgr_installer_send_signals_for_uid(pkgmgr_installer *pi, uid_t uid,
 }
 
 API int pkgmgr_installer_set_is_upgrade(pkgmgr_installer *pi, int is_upgrade) {
-  //TODO
+  if (pi == NULL)
+    return -1;
+
+  auto* cls = static_cast<pkgmgr::installer::Control*>(pi);
+  if (!cls->GetRequest())
+    return -1;
+
+  cls->GetRequest()->SetUpgrade(is_upgrade);
   return 0;
 }
 
@@ -448,6 +496,14 @@ API int pkgmgr_installer_send_res_signal_for_uid(pkgmgr_installer *pi,
 
 API int pkgmgr_installer_send_pkg_upgrade_signal(pkgmgr_installer *pi,
     unsigned int progress) {
-  //TODO
-  return 0;
+  if (!pi) {
+    _E("invalid argument");
+    return -1;
+  }
+
+  auto* cls = static_cast<pkgmgr::installer::Control*>(pi);
+  if (!cls->GetRequest())
+    return -1;
+
+  return cls->SendSignalForPkgUpgrade(progress);
 }
index e9f6d30..e01db4b 100644 (file)
@@ -437,6 +437,22 @@ int Control::SendSignalForResource(std::string pkgid, std::string status,
   }
 }
 
+int Control::SendSignalForPkgUpgrade(int progress) {
+  if (!signal_) {
+    _E("offline mode");
+    return -1;
+  }
+
+  try {
+    signal_->AsyncResultForPkgUpgrade(
+        PKGMGR_INSTALLER_PKG_UPGRADE_EVENT_STR, progress);
+    return 0;
+  } catch (...) {
+    _E("Exception occured");
+    return -1;
+  }
+}
+
 static int __send_signal_to_agent(uid_t uid, void* data, size_t len) {
   int fd;
   struct sockaddr_un sa;
index 6258a4f..99dfd88 100644 (file)
@@ -43,6 +43,7 @@ class Control {
   int SendSignals(std::string key, std::string val);
   int SendSignalForResource(std::string pkgid, std::string status,
     rpc_port::PkgSignal::ExtraData* event_info);
+  int SendSignalForPkgUpgrade(int progress);
   int SendSignalForUid(uid_t uid, std::string pkg_type, std::string pkgid,
       std::string appid, std::string key, std::string val);
   int SendSignalsForUid(uid_t uid, std::string key, std::string val);
index a944c6f..ac520cc 100644 (file)
@@ -23,6 +23,7 @@ interface PkgSignal
 {
   void AsyncResult(string signal, int targetUid, string reqId, array<PkgInfo> pkgs, string key, string val) async;
   void AsyncResultForResource(string signal, int targetUid, string reqId, string pkgid, string status, ExtraData extra) async;
+  void AsyncResultForPkgUpgrade(string signal, int progress) async;
 }