b29d71fd68787eb65c43c4ba298d6d3d15a94bd7
[platform/core/appfw/app-installers.git] / src / common / app2ext_dynamic_service.cc
1 // Copyright (c) 2017 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 <functional>
6 #include <string>
7
8 #include "common/app2ext_dynamic_service.h"
9
10
11
12 namespace {
13
14 const std::string& disable_pkg_sym_name = "app2ext_usr_disable_external_pkg";
15 const std::string& enable_pkg_sym_name = "app2ext_usr_enable_external_pkg";
16 const std::string& get_image_path_sym_name = "app2ext_usr_get_image_path";
17 const std::string& init_sym_name = "app2ext_init";
18 const std::string& deinit_sym_name = "app2ext_deinit";
19 const std::string& LIBNAME = "/usr/lib/libapp2ext.so.0";
20
21 }
22
23 namespace common_installer {
24
25 App2ExtDynamicService::App2ExtDynamicService()
26     : dl_handle(NULL) {
27   dl_handle = dlopen(LIBNAME.c_str(), RTLD_LAZY);
28   if (!dl_handle) {
29     LOG(WARNING) << "Cannot open handle: " << dlerror();
30     return;
31   }
32 }
33
34 App2ExtDynamicService::~App2ExtDynamicService() {
35   if (!app2ext_handler && dl_handle)
36     dlclose(dl_handle);
37 }
38
39 bool App2ExtDynamicService::EnableExternalPkgForUsr(const char* appname,
40     uid_t uid) {
41   int ret = CallMethod<int>(-1, enable_pkg_sym_name.c_str(), appname, uid);
42   if (ret) {
43     LOG(ERROR) << enable_pkg_sym_name << " failed with error code: "
44                << ret;
45   }
46   return ret == 0;
47 }
48
49 bool App2ExtDynamicService::DisableExternalPkgForUsr(const char* appname,
50     uid_t uid) {
51   int ret = CallMethod<int>(-1, disable_pkg_sym_name.c_str(), appname, uid);
52   if (ret) {
53     LOG(ERROR) << disable_pkg_sym_name << " failed with error code: "
54                << ret;
55   }
56   return ret == 0;
57 }
58
59 std::string App2ExtDynamicService::GetExternalImagePath(const char* pkgid,
60     uid_t uid) {
61   char* image_path = CallMethod<char*>(nullptr, get_image_path_sym_name.c_str(),
62       pkgid, uid);
63   std::string result;
64   if (image_path) {
65     result = std::string(image_path);
66     free(image_path);
67   }
68   return result;
69 }
70
71 app2ext_handle* App2ExtDynamicService::InitLibrary() {
72   return CallMethod<app2ext_handle*>(NULL, init_sym_name.c_str(),
73                                      APP2EXT_SD_CARD);
74 }
75
76 void App2ExtDynamicService::DeinitLibrary(app2ext_handle* handle) {
77   if (handle)
78     CallMethod<int>(-1, deinit_sym_name.c_str(), handle);
79 }
80
81 bool App2ExtDynamicService::ProperlyLoaded() {
82   return dl_handle != NULL;
83 }
84
85 std::shared_ptr<app2ext_handle> App2ExtDynamicService::getInterfaceHandle() {
86   if (!app2ext_handler && ProperlyLoaded()) {
87     app2ext_handler = std::shared_ptr<app2ext_handle>(InitLibrary(),
88         std::bind(&App2ExtDynamicService::DeinitLibrary,
89                   this, std::placeholders::_1));
90     if (!app2ext_handler)
91         LOG(ERROR) "app2ext_init() failed.";
92   }
93   return app2ext_handler;
94 }
95
96 }  // namespace common_installer