context_->pkg_type.set(package_type);
context_->installation_mode.set(pkgmgr->GetInstallationMode());
- if (context_->installation_mode.get() == InstallationMode::ONLINE) {
- // pkgmgr signal should work only for online mode
- // there is no one to receive it in offline mode
- pi_.reset(new PkgmgrSignal(pkgmgr.get()->GetRawPi(),
- pkgmgr->GetRequestType()));
+ if (pkgmgr->ShouldCreateSignal()) {
+ if (context_->installation_mode.get() == InstallationMode::ONLINE) {
+ // pkgmgr signal should work only for online mode
+ // there is no one to receive it in offline mode
+ pi_.reset(new PkgmgrSignal(pkgmgr.get()->GetRawPi(),
+ pkgmgr->GetRequestType()));
+ }
}
}
namespace common_installer {
+bool PkgmgrInstaller::CreatePkgMgrInstaller(pkgmgr_installer** installer,
+ InstallationMode* mode) {
+ *installer = pkgmgr_installer_new();
+ if (!*installer) {
+ LOG(WARNING) << "Cannot create pkgmgr_installer object. Will try offline";
+ // TODO(t.iwanek): app-installer should recognize offline installation and
+ // this information should be accesible in installation context
+ *installer = pkgmgr_installer_offline_new();
+ if (!*installer) {
+ return false;
+ }
+ *mode = InstallationMode::OFFLINE;
+ } else {
+ *mode = InstallationMode::ONLINE;
+ }
+ return true;
+}
+
+bool PkgmgrInstaller::ShouldCreateSignal() const {
+ return true;
+}
+
PkgMgrPtr PkgMgrInterface::Create(int argc, char** argv,
- AppQueryInterface* interface) {
- PkgMgrPtr instance(new PkgMgrInterface(interface));
+ PkgmgrInstallerInterface* pkgmgr_installer_interface,
+ AppQueryInterface* interface) {
+ PkgMgrPtr instance(new PkgMgrInterface(pkgmgr_installer_interface,
+ interface));
int result = instance->InitInternal(argc, argv);
if (result != 0)
return nullptr;
}
int PkgMgrInterface::InitInternal(int argc, char** argv) {
- pi_ = pkgmgr_installer_new();
-
- if (!pi_) {
- LOG(WARNING) << "Cannot create pkgmgr_installer object. Will try offline";
- // TODO(t.iwanek): app-installer should recognize offline installation and
- // this information should be accesible in installation context
- pi_ = pkgmgr_installer_offline_new();
- if (!pi_) {
- LOG(ERROR) << "Cannot create pkgmgr_installer object. Aborting.";
- return ENOMEM;
- }
- install_mode_ = InstallationMode::OFFLINE;
- } else {
- install_mode_ = InstallationMode::ONLINE;
+ if (!pkgmgr_installer_interface_->CreatePkgMgrInstaller(&pi_,
+ &install_mode_)) {
+ LOG(ERROR) << "Cannot create pkgmgr_installer object. Aborting.";
+ return false;
}
int result = pkgmgr_installer_receive_request(pi_, argc, argv);
typedef std::shared_ptr<PkgMgrInterface> PkgMgrPtr;
/**
+ * \brief The PkgmgrInstallerInterface class
+ * Interface defining strategy for creation of pkgmgr_installer object
+ * and PkgmgrSignal object.
+ *
+ * This interface is injected to PkgMgrInterface class to decide:
+ * - how to create pkgmgr_installer,
+ * - if to create PkgmgrSignal object,
+ * - what installation mode should be set in installer context.
+ */
+class PkgmgrInstallerInterface {
+ public:
+ virtual bool CreatePkgMgrInstaller(pkgmgr_installer** installer,
+ InstallationMode* mode) = 0;
+ virtual bool ShouldCreateSignal() const = 0;
+};
+
+/**
+ * \brief The PkgmgrInstaller class
+ * Implementation of PkgmgrInstallerInterface that handles creation of
+ * pkgmgr_installer class in online and offline mode.
+ */
+class PkgmgrInstaller : public PkgmgrInstallerInterface {
+ public:
+ bool CreatePkgMgrInstaller(pkgmgr_installer** installer,
+ InstallationMode* mode);
+ bool ShouldCreateSignal() const;
+};
+
+/**
* \brief Encapsulates pkgmgr API which handles parsing backend options
* and returns values/modes for installation process.
*/
*
* \param argc main() argc argument passed to the backend
* \param argv main() argv argument passed to the backend
+ * \param pkgmgr_installer_interface interface defining strategy of creation
+ * of pkgmgr_installer
* \param interface pointer to AppQueryInterface
*
* \return Smart pointer to the PkgMgrInterface
*/
static PkgMgrPtr Create(int argc, char** argv,
+ PkgmgrInstallerInterface* pkgmgr_installer_interface,
AppQueryInterface* interface = nullptr);
/**
*/
InstallationMode GetInstallationMode() const { return install_mode_; }
+ /**
+ * @brief ShouldCreateSignal
+ *
+ *
+ * @return true if pkgmgr signal should be created
+ */
+ bool ShouldCreateSignal() const {
+ return pkgmgr_installer_interface_->ShouldCreateSignal();
+ }
/** PkgMgrInstance destructor. */
~PkgMgrInterface();
private:
- explicit PkgMgrInterface(AppQueryInterface* interface)
+ explicit PkgMgrInterface(PkgmgrInstallerInterface* pkgmgr_installer_interface,
+ AppQueryInterface* interface)
: pi_(nullptr),
install_mode_(InstallationMode::ONLINE),
is_app_installed_(false),
+ pkgmgr_installer_interface_(pkgmgr_installer_interface),
query_interface_(interface) {}
int InitInternal(int argc, char** argv);
pkgmgr_installer* pi_;
InstallationMode install_mode_;
bool is_app_installed_;
+ PkgmgrInstallerInterface* pkgmgr_installer_interface_;
AppQueryInterface* query_interface_;