Introducing PkgMgrInterface to separate app-installer from 23/37923/2
authorPawel Sikorski <p.sikorski@samsung.com>
Fri, 3 Apr 2015 11:36:27 +0000 (13:36 +0200)
committerPawel Sikorski <p.sikorski@samsung.com>
Thu, 9 Apr 2015 07:52:22 +0000 (09:52 +0200)
external library.

TODO:
* PkgMgrSignal should be refactor. Possibly, it could inherit from
  PkgMgrInterface

Change-Id: I3f934674aec54c69073a122fcb4b71e16a94565f

src/common/CMakeLists.txt
src/common/app_installer.cc
src/common/app_installer.h
src/common/context_installer.cc
src/common/context_installer.h
src/common/pkgmgr_interface.cc [new file with mode: 0644]
src/common/pkgmgr_interface.h [new file with mode: 0644]
src/tpk/task.cc
src/tpk/task.h
src/utils/macros.h
src/wgt/wgt_backend.cc

index cadd25c..6915b3b 100644 (file)
@@ -2,6 +2,7 @@
 SET(SRCS
   app_installer.cc
   context_installer.cc
+  pkgmgr_interface.cc
   pkgmgr_signal.cc
   security_registration.cc
   step/step_unzip.cc
index 369d7d2..48002a0 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "common/app_installer.h"
 #include "common/context_installer.h"
+#include "common/pkgmgr_interface.h"
 #include "common/pkgmgr_signal.h"
 #include "utils/logging.h"
 
@@ -17,21 +18,25 @@ const unsigned kProgressRange = 100;
 
 namespace common_installer {
 
-AppInstaller::AppInstaller(pkgmgr_installer *pi, const char* package_type)
-  : context_(new ContextInstaller()) {
-  int request_type = pkgmgr_installer_get_request_type(pi);
-  pi_.reset(new PkgmgrSignal(pi));
-  context_->request_type.set(request_type);
+AppInstaller::AppInstaller(const char* package_type)
+    : context_(new ContextInstaller()) {
+  PkgMgrPtr pkgmgr = PkgMgrInterface::Instance();
+  pi_.reset(new PkgmgrSignal(pkgmgr.get()->GetRawPi()));
   context_->pkg_type.set(package_type);
-  switch (request_type) {
-    case PKGMGR_REQ_INSTALL:
-     context_->file_path.set(pkgmgr_installer_get_request_info(pi));
-     context_->pkgid.set(STR_EMPTY);
-    break;
-    case PKGMGR_REQ_UNINSTALL:
-     context_->pkgid.set(pkgmgr_installer_get_request_info(pi));
-     context_->file_path.set(STR_EMPTY);
-    break;
+  context_->request_type.set(pkgmgr->GetRequestType());
+  switch (context_->request_type.get()) {
+    case PkgMgrInterface::Type::Install:
+      context_->file_path.set(pkgmgr->GetRequestInfo());
+      context_->pkgid.set(STR_EMPTY);
+      break;
+    case PkgMgrInterface::Type::Uninstall:
+      context_->pkgid.set(pkgmgr->GetRequestInfo());
+      context_->file_path.set(STR_EMPTY);
+      break;
+    default:
+      // currently, only installation and uninstallation handled
+      // TODO(p.sikorski): should return unsupported, and display error
+      break;
   }
 }
 
index 7ff1e6d..1a28150 100644 (file)
@@ -3,7 +3,6 @@
 #ifndef COMMON_APP_INSTALLER_H_
 #define COMMON_APP_INSTALLER_H_
 
-#include <pkgmgr_installer.h>
 #include <list>
 #include <memory>
 
@@ -16,7 +15,7 @@ namespace common_installer {
 
 class AppInstaller {
  public:
-  explicit AppInstaller(pkgmgr_installer *pi, const char* package_type);
+  explicit AppInstaller(const char* package_type);
   virtual ~AppInstaller();
 
   // Adds new step to installer by specified type
index b33b568..9b15d5f 100644 (file)
@@ -1,13 +1,9 @@
 /* 2014, Copyright © Intel Coporation, license APACHE-2.0, see LICENSE file */
 
 #include "common/context_installer.h"
-
 #include <boost/filesystem.hpp>
-
-#include <pkgmgr_installer.h>
 #include <tzplatform_config.h>
 #include <unistd.h>
-
 #include <cstdlib>
 
 namespace common_installer {
@@ -15,7 +11,7 @@ namespace common_installer {
 namespace fs = boost::filesystem;
 
 ContextInstaller::ContextInstaller()
-    : request_type(PKGMGR_REQ_INVALID),
+    : request_type(PkgMgrInterface::Type::Unknown),
       manifest_data(static_cast<manifest_x*>(calloc(1, sizeof(manifest_x)))),
       uid(getuid()) {
 
index e55913e..d4b2b03 100644 (file)
@@ -11,6 +11,8 @@
 #include <memory>
 #include <string>
 
+#include "common/pkgmgr_interface.h"
+
 namespace common_installer {
 
 /** Template class for defining smart attributes.
@@ -49,8 +51,9 @@ class ContextInstaller {
   ContextInstaller();
   ~ContextInstaller();
 
+  // TODO(p.sikorski) it looks, as it is not used anywhere.
   // request type: Install, Reinstall, Uninstall, Update.
-  Property<int> request_type;
+  Property<PkgMgrInterface::Type> request_type;
 
   // package_type
   Property<std::string> pkg_type;
diff --git a/src/common/pkgmgr_interface.cc b/src/common/pkgmgr_interface.cc
new file mode 100644 (file)
index 0000000..c007542
--- /dev/null
@@ -0,0 +1,67 @@
+// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
+// Use of this source code is governed by an apache 2.0 license that can be
+// found in the LICENSE file.
+
+#include "common/pkgmgr_interface.h"
+
+#include <memory>
+
+namespace common_installer {
+
+PkgMgrPtr PkgMgrInterface::instance_;
+
+PkgMgrPtr PkgMgrInterface::Instance() {
+  return instance_;
+}
+
+int PkgMgrInterface::Init(int argc, char** argv) {
+  if (instance_)
+    return 0;
+
+  PkgMgrPtr tmp(new PkgMgrInterface());
+  int result = tmp->InitInternal(argc, argv);
+
+  instance_ = tmp;
+
+  return result;
+}
+
+int PkgMgrInterface::InitInternal(int argc, char** argv) {
+  pi_ = pkgmgr_installer_new();
+
+  if (!pi_) {
+    LOG(ERROR) << "Cannot create pkgmgr_installer object";
+    return ENOMEM;
+  }
+
+  int result = pkgmgr_installer_receive_request(pi_, argc, argv);
+  if (result) {
+    LOG(ERROR) << "Cannot receive request. Invalid arguments?";
+    // no need to free pkgmgr_installer here. it will be freed in DTOR.
+  }
+  return result;
+}
+
+PkgMgrInterface::~PkgMgrInterface() {
+  if (pi_)
+    pkgmgr_installer_free(pi_);
+}
+
+PkgMgrInterface::Type PkgMgrInterface::GetRequestType() const {
+  switch (pkgmgr_installer_get_request_type(pi_)) {
+    case PKGMGR_REQ_INSTALL:
+      return PkgMgrInterface::Type::Install;
+    case PKGMGR_REQ_UNINSTALL:
+      return PkgMgrInterface::Type::Uninstall;
+    case PKGMGR_REQ_REINSTALL:
+      return PkgMgrInterface::Type::Reinstall;
+    default:
+      return PkgMgrInterface::Type::Unknown;
+  }
+}
+
+const char* PkgMgrInterface::GetRequestInfo() const {
+  return pkgmgr_installer_get_request_info(pi_);
+}
+
+}  // namespace common_installer
diff --git a/src/common/pkgmgr_interface.h b/src/common/pkgmgr_interface.h
new file mode 100644 (file)
index 0000000..738f4dc
--- /dev/null
@@ -0,0 +1,81 @@
+// Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
+// Use of this source code is governed by an apache 2.0 license that can be
+// found in the LICENSE file.
+
+#ifndef COMMON_PKGMGR_INTERFACE_H_
+#define COMMON_PKGMGR_INTERFACE_H_
+
+#include <pkgmgr_installer.h>
+
+#include <memory>
+
+#include "utils/macros.h"
+#include "utils/logging.h"
+
+namespace common_installer {
+
+class PkgMgrInterface;
+typedef std::shared_ptr<PkgMgrInterface> PkgMgrPtr;
+
+/** Class that covers pkgmgr_installer basic platform calls.
+ *
+ *  PkgMgr covers all pkgmgr_installer platform calls (and manages its
+ *  creation/destruction.
+ */
+class PkgMgrInterface {
+ public:
+  /** Request type received from pkgmgr_installer
+   */
+  enum class Type {
+       Unknown,
+       Install,
+       Uninstall,
+       Reinstall
+  };
+
+  /** Returns Request type passed from pkgmgr_installer
+   */
+  PkgMgrInterface::Type GetRequestType() const;
+
+  /** Returns Request info passed from pkgmgr_installer
+   */
+  const char *GetRequestInfo() const;
+
+  /** Returns instance of PkgrMgr (Singleton pattern).
+   *
+   *  However, Init method has to be called first (otherwise, this Instance
+   *  returns nullptr).
+   *
+   *  @see PkgMgr::Init(int argc, char** argv)
+   */
+  static PkgMgrPtr Instance();
+
+  /** Initialize PkgMgrInterface.
+   */
+  static int Init(int argc, char** argv);
+
+  /** Get Raw pointer to pkgmgr_installer object
+   *
+   *  It should not be used (PkgMgrInterface can destroy it
+   */
+  DEPRECATED pkgmgr_installer *GetRawPi() const { return pi_; }
+
+  /** PkgMgrInstance destructor.
+   *
+   */
+  ~PkgMgrInterface();
+
+ private:
+  PkgMgrInterface() :pi_(nullptr) {}
+  int InitInternal(int argc, char** argv);
+
+  pkgmgr_installer* pi_;
+  static PkgMgrPtr instance_;
+
+  SCOPE_LOG_TAG(PkgMgrInterface)
+  DISALLOW_COPY_AND_ASSIGN(PkgMgrInterface);
+};
+
+}  // namespace common_installer
+
+#endif  // COMMON_PKGMGR_INTERFACE_H_
index b616fde..50098e5 100644 (file)
@@ -3,7 +3,7 @@
 #ifdef HOSTTEST
 #include "test/mock_pkgmgr_installer.h"
 #else
-#include <pkgmgr_installer.h>
+#include "common/pkgmgr_interface.h"
 #include "common/app_installer.h"
 #include "common/step/step_copy.h"
 #include "common/step/step_generate_xml.h"
@@ -33,52 +33,40 @@ SCOPE_LOG_TAG(TpkTask)
 
 /* Constructor
  */
-Task::Task() :
-  pi_(nullptr),
-  request_(PKGMGR_REQ_INVALID) {
+Task::Task() {
 }
 
 
 /* Destructor
  */
 ::tpk::Task::~Task() {
-  if (pi_) {
-    pkgmgr_installer_free(pi_);
-    pi_ = nullptr;
-  }
 }
 
 
 bool Task::Init(int argc, char** argv) {
-  pi_ = pkgmgr_installer_new();
-  if (!pi_) {
-    LOG(ERROR) << "Failed to run pkgmgr_installer_new()";
-    return false;
-  }
-  if (!!pkgmgr_installer_receive_request(pi_, argc, argv)) {
-    LOG(ERROR) << "Invalid argument";
-    pkgmgr_installer_free(pi_);
-    pi_ = nullptr;
+  int result = ci::PkgMgrInterface::Init(argc, argv);
+  if (!result) {
+    LOG(ERROR) << "Cannot connect to PkgMgrInstaller";
     return false;
   }
-  request_ = pkgmgr_installer_get_request_type(pi_);
-
   return true;
 }
 
 
 bool Task::Run() {
   int ret = 0;
-  switch (request_) {
-    case PKGMGR_REQ_INSTALL:
+  switch (ci::PkgMgrInterface::Instance()->GetRequestType()) {
+    case ci::PkgMgrInterface::Type::Install:
       ret = Install();
       break;
-    case PKGMGR_REQ_UNINSTALL:
+    case ci::PkgMgrInterface::Type::Uninstall:
       ret = Uninstall();
       break;
-    case PKGMGR_REQ_REINSTALL:
+    case ci::PkgMgrInterface::Type::Reinstall:
       ret = Reinstall();
       break;
+    default:
+      break;
   }
   if (ret != 0) {
     LOG(ERROR) << "Got error from AppInstaler: error code " << ret;
@@ -88,7 +76,7 @@ bool Task::Run() {
 }
 
 int Task::Install() {
-  ci::AppInstaller ai(pi_, kPkgType);
+  ci::AppInstaller ai(kPkgType);
 
   ai.AddStep<ci::unzip::StepUnzip>();
   ai.AddStep<ci::signature::StepCheckSignature>();
@@ -103,7 +91,7 @@ int Task::Install() {
 }
 
 int Task::Uninstall() {
-  ci::AppInstaller ai(pi_, kPkgType);
+  ci::AppInstaller ai(kPkgType);
 
   ai.AddStep<ci::parse::StepParse>();
   ai.AddStep<ci::unregister_app::StepUnregisterApplication>();
index cb71c40..80a5ef3 100644 (file)
@@ -4,8 +4,6 @@
 
 #ifdef HOSTTEST
 #include "test/mock_pkgmgr_installer.h"
-#else
-#include <pkgmgr_installer.h>
 #endif
 
 namespace tpk {
@@ -22,9 +20,6 @@ class Task {
   int Install();
   int Uninstall();
   int Reinstall();
-
-  pkgmgr_installer* pi_;
-  int request_;
 };  //  class Task
 
 }  //  namespace tpk
index c2e558d..40e1cb6 100644 (file)
@@ -9,4 +9,6 @@
   CLASS(const CLASS&) = delete;                    \
   CLASS& operator=(const CLASS&) = delete          \
 
+#define DEPRECATED  __attribute__ ((__deprecated__))
+
 #endif  // UTILS_MACROS_H_
index bd4e2b1..a56b0f8 100644 (file)
@@ -1,18 +1,9 @@
 /* 2014, Copyright © Intel Coporation, license APACHE-2.0, see LICENSE file */
 
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <pkgmgr_installer.h>
-
-#include <cstdio>
-#include <cstdlib>
-#include <cstring>
 #include <cerrno>
-#include <memory>
 
 #include "common/app_installer.h"
+#include "common/pkgmgr_interface.h"
 #include "common/step/step_copy.h"
 #include "common/step/step_generate_xml.h"
 #include "common/step/step_parse.h"
 namespace ci = common_installer;
 
 int main(int argc, char** argv) {
-  // get request data
-  pkgmgr_installer* pi = pkgmgr_installer_new();
-  if (!pi)
-    return ENOMEM;
-
-  int result = pkgmgr_installer_receive_request(pi, argc, argv);
+  int result = ci::PkgMgrInterface::Init(argc, argv);
   if (result) {
-    pkgmgr_installer_free(pi);
+    LOG(ERROR) << "Cannot connect to PkgMgrInstaller";
     return -result;
   }
-  common_installer::AppInstaller installer(pi, "wgt");
+
+  ci::PkgMgrPtr pkgmgr = ci::PkgMgrInterface::Instance();
+
+  ci::AppInstaller installer("wgt");
   /* treat the request */
-  switch (pkgmgr_installer_get_request_type(pi)) {
-    case PKGMGR_REQ_INSTALL: {
+  switch (pkgmgr->GetRequestType()) {
+    case ci::PkgMgrInterface::Type::Install : {
       installer.AddStep<ci::unzip::StepUnzip>();
       installer.AddStep<ci::signature::StepCheckSignature>();
       installer.AddStep<wgt::parse::StepParse>();
@@ -54,7 +43,7 @@ int main(int argc, char** argv) {
       installer.AddStep<ci::register_app::StepRegisterApplication>();
       break;
     }
-    case PKGMGR_REQ_UNINSTALL: {
+    case ci::PkgMgrInterface::Type::Uninstall: {
       installer.AddStep<ci::parse::StepParse>();
       installer.AddStep<ci::unregister_app::StepUnregisterApplication>();
       installer.AddStep<ci::remove::StepRemoveFiles>();
@@ -63,7 +52,6 @@ int main(int argc, char** argv) {
     }
     default: {
       // unsupported operation
-      pkgmgr_installer_free(pi);
       return EINVAL;
     }
   }
@@ -71,6 +59,5 @@ int main(int argc, char** argv) {
   // run request
   result = installer.Run();
 
-  pkgmgr_installer_free(pi);
   return result;
 }