Apply smack new api
[platform/framework/native/installer.git] / plugin / osp-installer-plugin.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 //
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
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0
10 //
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.
16 //
17 /**
18  * @file        osp-installer-plugin.cpp
19  */
20
21 #include <stdio.h>
22 #include <string.h>
23 #include <sys/types.h>
24 #include <sys/stat.h>
25 #include <dirent.h>
26 #include <package-manager-plugin.h>
27
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>
34
35 #include "InstallerDefs.h"
36
37 using namespace Tizen::Base;
38 using namespace Tizen::Io;
39 using namespace Tizen::App;
40 using namespace Tizen::App::Package;
41
42 #ifdef __cplusplus
43 extern "C"
44 {
45 #endif
46
47 static const int PKG_SUCCESS = 0;
48 static const int PKG_ERROR = 1;
49
50 static int pkg_get_installed_size(const String& rootPath);
51 static int pkg_get_data_size(const String& rootPath);
52
53 static void pkg_plugin_unload(void)
54 {
55         AppLog("[libtpk] pkg_plugin_unload() is called");
56 }
57
58 static int pkg_plugin_pkg_is_installed(const char *pkg_name)
59 {
60         int err = PKG_SUCCESS;
61         String packageName(pkg_name);
62         PackageId packageId;
63         bool installed = true;
64
65         AppLog("[libtpk] pkg_plugin_pkg_is_installed() is called");
66
67         TryCatch(pkg_name, err = PKG_ERROR, "[osp-installer][libtpk] package is null");
68
69         if (packageName.Contains(PACKAGE_NAME_PREFIX_ORG) == true)
70         {
71                 String prefixPackage(PACKAGE_NAME_PREFIX_ORG);
72                 packageName.SubString(prefixPackage.GetLength(), PACKAGE_ID_LENGTH, packageId);
73         }
74         else
75         {
76                 packageName.SubString(0, PACKAGE_ID_LENGTH, packageId);
77         }
78
79         installed = _PackageManagerImpl::GetInstance()->IsPackageInstalled(packageId);
80         TryCatch(installed == true, err = PKG_ERROR, "[osp-installer][libtpk] IsPackageInstalled() is failed");
81
82         AppLog("[libtpk] IsPackageInstalled=[%d]", installed);
83         err = PKG_SUCCESS;
84
85 CATCH:
86         return err;
87 }
88
89 static int pkg_plugin_get_installed_pkg_list(const char *category,
90                 const char *option, package_manager_pkg_info_t **list, int *count)
91 {
92         AppLog("[libtpk] pkg_plugin_get_installed_pkg_list() is called");
93
94         return PKG_ERROR;
95 }
96
97 static int pkg_plugin_get_pkg_detail_info(const char *pkg_name,
98                 package_manager_pkg_detail_info_t *pkg_detail_info)
99 {
100         bool err = PKG_SUCCESS;
101         String packageName(pkg_name);
102         String appId;
103         char* pVersion = null;
104         _PackageInfoImpl pkgInfoImpl;
105         result r = E_SUCCESS;
106
107         AppLog("[libtpk] pkg_plugin_get_pkg_detail_info() is called");
108
109         TryCatch(pkg_name, err = PKG_ERROR, "[osp-installer][libtpk] package is null");
110
111         memset(pkg_detail_info, 0, sizeof(package_manager_pkg_detail_info_t));
112
113         if (packageName.Contains(PACKAGE_NAME_PREFIX_ORG) == true)
114         {
115                 String prefixPackage(PACKAGE_NAME_PREFIX_ORG);
116                 packageName.SubString(prefixPackage.GetLength(), PACKAGE_ID_LENGTH, appId);
117         }
118         else
119         {
120                 packageName.SubString(0, PACKAGE_ID_LENGTH, appId);
121         }
122
123         r = pkgInfoImpl.Construct(appId);
124         TryCatch(!IsFailed(r), err = PKG_ERROR, "[osp-installer][libtpk] pkgInfoImpl.Construct is failed");
125
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);
128
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);
132
133         delete [] pVersion;
134         pVersion = null;
135
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;
139
140         err = PKG_SUCCESS;
141
142 CATCH:
143         delete [] pVersion;
144         return err;
145 }
146
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)
149 {
150         AppLog("[libtpk] pkg_plugin_get_pkg_detail_info_from_package() is called");
151
152         return PKG_ERROR;
153 }
154
155 long long pkg_get_directory_size(const String& rootPath)
156 {
157         long long total = 0;
158         long long ret = 0;
159         int q = 0;
160         int r = 0;
161         DIR *dp = NULL;
162         struct dirent *ep = NULL;
163         struct stat fileinfo;
164         char file[FILENAME_MAX] = { 0, };
165         char *pDirName = null;
166
167         pDirName = _StringConverter::CopyToCharArrayN(rootPath);
168         TryCatch(pDirName, total = 0, "[osp-installer][libtpk] pDirName is null");
169
170         dp = opendir(pDirName);
171         TryCatch(dp, total = 0, "[osp-installer][libtpk] dp is null");
172
173         while ((ep = readdir(dp)) != NULL)
174         {
175                 if (!strcmp(ep->d_name, ".") || !strcmp(ep->d_name, ".."))
176                 {
177                         continue;
178                 }
179
180                 snprintf(file, FILENAME_MAX, "%s/%s", pDirName, ep->d_name);
181
182                 if (lstat(file, &fileinfo) < 0)
183                 {
184                         continue;
185                 }
186
187                 if (S_ISLNK(fileinfo.st_mode))
188                 {
189                         AppLog("[libtpk] SYMLINK=%s", file);
190                         total += INSTALLER_BLOCK_SIZE;
191                         continue;
192                 }
193                 else if (S_ISDIR(fileinfo.st_mode))
194                 {
195                         ret = pkg_get_directory_size(file);
196                         ret += fileinfo.st_size;
197                         total += ret;
198                         AppLog("[libtpk] DIR=%s, size=%d[%dK],", file, (int)ret, (int)(ret/1024));
199                 }
200                 else
201                 {
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);
205                         if (r)
206                         {
207                                 q++;
208                         }
209                         total += q * INSTALLER_BLOCK_SIZE;
210
211                         if (q)
212                         {
213                                 AppLog("[libtpk] File=%s, size=%d[%dK]", file, (q * INSTALLER_BLOCK_SIZE), (q * INSTALLER_BLOCK_SIZE)/1024);
214                         }
215                 }
216         }
217
218         closedir(dp);
219         dp = null;
220
221 CATCH:
222         delete [] pDirName;
223
224         return total;
225 }
226
227 int pkg_get_installed_size(const String& rootPath)
228 {
229         String destPath;
230         long long size = 0;
231
232         size = pkg_get_directory_size(rootPath);
233
234         return (int)size;
235 }
236
237 int pkg_get_data_size(const String& rootPath)
238 {
239         String destPath;
240         long long size = 0;
241
242         destPath = rootPath + DIR_DATA;
243         size = pkg_get_directory_size(destPath);
244         size += INSTALLER_BLOCK_SIZE;
245
246         return (int)size;
247 }
248
249 __attribute__ ((visibility("default")))
250 int pkg_plugin_on_load(pkg_plugin_set *set)
251 {
252         memset(set, 0, sizeof(pkg_plugin_set));
253
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;
259
260         return PKG_SUCCESS;
261 }
262
263 #ifdef __cplusplus
264 }
265 #endif
266