2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
18 * @file osp-installer-plugin.cpp
23 #include <sys/types.h>
26 #include <package-manager-plugin.h>
28 #include <FAppTypes.h>
29 #include <FBaseString.h>
30 #include <FIoDirectory.h>
31 #include <FAppPkg_PackageInfoImpl.h>
32 #include <FAppPkg_PackageManagerImpl.h>
33 #include <FBase_StringConverter.h>
35 #include "InstallerDefs.h"
37 using namespace Tizen::Base;
38 using namespace Tizen::Io;
39 using namespace Tizen::App;
40 using namespace Tizen::App::Package;
47 static const int PKG_SUCCESS = 0;
48 static const int PKG_ERROR = 1;
50 static int pkg_get_installed_size(const String& rootPath);
51 static int pkg_get_data_size(const String& rootPath);
53 static void pkg_plugin_unload(void)
55 AppLog("[libtpk] pkg_plugin_unload() is called");
58 static int pkg_plugin_pkg_is_installed(const char *pkg_name)
60 int err = PKG_SUCCESS;
61 String packageName(pkg_name);
63 bool installed = true;
65 AppLog("[libtpk] pkg_plugin_pkg_is_installed() is called");
67 TryCatch(pkg_name, err = PKG_ERROR, "[osp-installer][libtpk] package is null");
69 if (packageName.Contains(PACKAGE_NAME_PREFIX_ORG) == true)
71 String prefixPackage(PACKAGE_NAME_PREFIX_ORG);
72 packageName.SubString(prefixPackage.GetLength(), PACKAGE_ID_LENGTH, packageId);
76 packageName.SubString(0, PACKAGE_ID_LENGTH, packageId);
79 installed = _PackageManagerImpl::GetInstance()->IsPackageInstalled(packageId);
80 TryCatch(installed == true, err = PKG_ERROR, "[osp-installer][libtpk] IsPackageInstalled() is failed");
82 AppLog("[libtpk] IsPackageInstalled=[%d]", installed);
89 static int pkg_plugin_get_installed_pkg_list(const char *category,
90 const char *option, package_manager_pkg_info_t **list, int *count)
92 AppLog("[libtpk] pkg_plugin_get_installed_pkg_list() is called");
97 static int pkg_plugin_get_pkg_detail_info(const char *pkg_name,
98 package_manager_pkg_detail_info_t *pkg_detail_info)
100 bool err = PKG_SUCCESS;
101 String packageName(pkg_name);
103 char* pVersion = null;
104 _PackageInfoImpl pkgInfoImpl;
105 result r = E_SUCCESS;
107 AppLog("[libtpk] pkg_plugin_get_pkg_detail_info() is called");
109 TryCatch(pkg_name, err = PKG_ERROR, "[osp-installer][libtpk] package is null");
111 memset(pkg_detail_info, 0, sizeof(package_manager_pkg_detail_info_t));
113 if (packageName.Contains(PACKAGE_NAME_PREFIX_ORG) == true)
115 String prefixPackage(PACKAGE_NAME_PREFIX_ORG);
116 packageName.SubString(prefixPackage.GetLength(), PACKAGE_ID_LENGTH, appId);
120 packageName.SubString(0, PACKAGE_ID_LENGTH, appId);
123 r = pkgInfoImpl.Construct(appId);
124 TryCatch(!IsFailed(r), err = PKG_ERROR, "[osp-installer][libtpk] pkgInfoImpl.Construct is failed");
126 strncpy(pkg_detail_info->pkg_type, "tpk", PKG_TYPE_STRING_LEN_MAX);
127 strncpy(pkg_detail_info->pkg_name, pkg_name, PKG_NAME_STRING_LEN_MAX-1);
129 pVersion = _StringConverter::CopyToCharArrayN(pkgInfoImpl.GetVersion());
130 TryCatch(pVersion, err = PKG_ERROR, "[osp-installer][libtpk] pVersion is null");
131 strncpy(pkg_detail_info->version, pVersion, PKG_VERSION_STRING_LEN_MAX-1);
136 pkg_detail_info->installed_size = pkg_get_installed_size(pkgInfoImpl.GetAppRootPath());
137 pkg_detail_info->data_size = pkg_get_data_size(pkgInfoImpl.GetAppRootPath());
138 pkg_detail_info->app_size = pkg_detail_info->installed_size - pkg_detail_info->data_size;
147 static int pkg_plugin_get_pkg_detail_info_from_package(const char *pkg_path,
148 package_manager_pkg_detail_info_t *pkg_detail_info)
150 AppLog("[libtpk] pkg_plugin_get_pkg_detail_info_from_package() is called");
155 long long pkg_get_directory_size(const String& rootPath)
162 struct dirent *ep = NULL;
163 struct stat fileinfo;
164 char file[FILENAME_MAX] = { 0, };
165 char *pDirName = null;
167 pDirName = _StringConverter::CopyToCharArrayN(rootPath);
168 TryCatch(pDirName, total = 0, "[osp-installer][libtpk] pDirName is null");
170 dp = opendir(pDirName);
171 TryCatch(dp, total = 0, "[osp-installer][libtpk] dp is null");
173 while ((ep = readdir(dp)) != NULL)
175 if (!strcmp(ep->d_name, ".") || !strcmp(ep->d_name, ".."))
180 snprintf(file, FILENAME_MAX, "%s/%s", pDirName, ep->d_name);
182 if (lstat(file, &fileinfo) < 0)
187 if (S_ISLNK(fileinfo.st_mode))
189 AppLog("[libtpk] SYMLINK=%s", file);
190 total += INSTALLER_BLOCK_SIZE;
193 else if (S_ISDIR(fileinfo.st_mode))
195 ret = pkg_get_directory_size(file);
196 ret += fileinfo.st_size;
198 AppLog("[libtpk] DIR=%s, size=%d[%dK],", file, (int)ret, (int)(ret/1024));
202 /*It is a file. Calculate the actual size occupied (in terms of 4096 blocks)*/
203 q = (fileinfo.st_size / INSTALLER_BLOCK_SIZE);
204 r = (fileinfo.st_size % INSTALLER_BLOCK_SIZE);
209 total += q * INSTALLER_BLOCK_SIZE;
213 AppLog("[libtpk] File=%s, size=%d[%dK]", file, (q * INSTALLER_BLOCK_SIZE), (q * INSTALLER_BLOCK_SIZE)/1024);
227 int pkg_get_installed_size(const String& rootPath)
232 size = pkg_get_directory_size(rootPath);
237 int pkg_get_data_size(const String& rootPath)
242 destPath = rootPath + DIR_DATA;
243 size = pkg_get_directory_size(destPath);
244 size += INSTALLER_BLOCK_SIZE;
249 __attribute__ ((visibility("default")))
250 int pkg_plugin_on_load(pkg_plugin_set *set)
252 memset(set, 0, sizeof(pkg_plugin_set));
254 set->plugin_on_unload = pkg_plugin_unload;
255 set->pkg_is_installed = pkg_plugin_pkg_is_installed;
256 set->get_installed_pkg_list = pkg_plugin_get_installed_pkg_list;
257 set->get_pkg_detail_info = pkg_plugin_get_pkg_detail_info;
258 set->get_pkg_detail_info_from_package = pkg_plugin_get_pkg_detail_info_from_package;