remove remaining codes reltated to preload_list.txt
[platform/core/appfw/app-installers.git] / src / common / pkgmgr_interface.cc
1 // Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
2 // Use of this source code is governed by an apache 2.0 license that can be
3 // found in the LICENSE file.
4
5 #include "common/pkgmgr_interface.h"
6
7 #include <boost/filesystem/path.hpp>
8 #include <boost/filesystem.hpp>
9
10
11 #include <memory>
12 #include <string>
13 #include <fstream>
14
15 #include "common/app_query_interface.h"
16
17 namespace bf = boost::filesystem;
18
19 namespace {
20
21 const char kDeltaFileExtension[] = ".delta";
22
23 }
24
25 namespace common_installer {
26
27 PkgMgrPtr PkgMgrInterface::Create(int argc, char** argv,
28                                   AppQueryInterface* interface) {
29   PkgMgrPtr instance(new PkgMgrInterface(interface));
30   int result = instance->InitInternal(argc, argv);
31   if (result != 0)
32     return nullptr;
33
34   return instance;
35 }
36
37 int PkgMgrInterface::InitInternal(int argc, char** argv) {
38   pi_ = pkgmgr_installer_new();
39
40   if (!pi_) {
41     LOG(ERROR) << "Cannot create pkgmgr_installer object";
42     return ENOMEM;
43   }
44
45   int result = pkgmgr_installer_receive_request(pi_, argc, argv);
46   if (result) {
47     LOG(ERROR) << "Cannot receive request. Invalid arguments?";
48     // no need to free pkgmgr_installer here. it will be freed in DTOR.
49   }
50
51   if (pkgmgr_installer_get_request_type(pi_)
52       == PKGMGR_REQ_MANIFEST_DIRECT_INSTALL) {
53     uid_t uid = getuid();
54     if (uid != 0) {
55       LOG(ERROR) << "You are not an authorized user(" << uid << ")!";
56       return EINVAL;
57     }
58   }
59   is_app_installed_ = false;
60   if (query_interface_)
61     is_app_installed_ = query_interface_->IsAppInstalledByArgv(argc, argv);
62
63   return result;
64 }
65
66 PkgMgrInterface::~PkgMgrInterface() {
67   if (pi_)
68     pkgmgr_installer_free(pi_);
69 }
70
71 RequestType PkgMgrInterface::GetRequestType() const {
72   switch (pkgmgr_installer_get_request_type(pi_)) {
73     case PKGMGR_REQ_INSTALL : {
74       auto request_info = GetRequestInfo();
75       if (!request_info)
76         return RequestType::Unknown;
77       std::string extension = bf::path(request_info).extension().string();
78       if (!is_app_installed_) {
79         if (extension == kDeltaFileExtension) {
80           LOG(ERROR) << "Package is not installed. "
81                         "Cannot update from delta package";
82           return RequestType::Unknown;
83         } else {
84           return RequestType::Install;
85         }
86       } else {
87         if (extension == kDeltaFileExtension)
88           return RequestType::Delta;
89         else
90           return RequestType::Update;
91       }
92     }
93     case PKGMGR_REQ_UNINSTALL:
94       return RequestType::Uninstall;
95     case PKGMGR_REQ_REINSTALL:
96       return RequestType::Reinstall;
97     case PKGMGR_REQ_RECOVER:
98       return RequestType::Recovery;
99     case PKGMGR_REQ_MANIFEST_DIRECT_INSTALL:
100       if (!is_app_installed_)
101         return RequestType::ManifestDirectInstall;
102       else
103         return RequestType::ManifestDirectUpdate;
104     default:
105       return RequestType::Unknown;
106   }
107 }
108
109 const char* PkgMgrInterface::GetRequestInfo() const {
110   return pkgmgr_installer_get_request_info(pi_);
111 }
112
113 boost::filesystem::path PkgMgrInterface::GetTepPath() const {
114   if (pkgmgr_installer_get_tep_path(pi_) == nullptr)
115     return boost::filesystem::path("");
116   else
117     return boost::filesystem::path(pkgmgr_installer_get_tep_path(pi_));
118 }
119
120 bool PkgMgrInterface::GetIsTepMove() {
121   return (pkgmgr_installer_get_tep_move_type(pi_) == 1)?true:false;
122 }
123
124 }  // namespace common_installer