376f2af7d2d351570412b2aa0876d08250aa93b9
[platform/framework/web/crosswalk.git] / src / xwalk / application / tools / tizen / xwalk_backend_plugin.cc
1 // Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "xwalk/application/tools/tizen/xwalk_backend_plugin.h"
6
7 #include <cstdlib>
8 #include <cstring>
9 #include <vector>
10
11 #include "base/file_util.h"
12 #include "base/files/file_path.h"
13 #include "base/files/scoped_temp_dir.h"
14 #include "base/path_service.h"
15 #include "base/version.h"
16 #include "xwalk/application/common/application_data.h"
17 #include "xwalk/application/common/application_file_util.h"
18 #include "xwalk/application/common/id_util.h"
19 #include "xwalk/runtime/common/xwalk_paths.h"
20
21 namespace {
22
23 enum PkgmgrPluginBool {
24   kPkgmgrPluginTrue = 0,
25   kPkgmgrPluginFalse = -1
26 };
27
28 }  // namespace
29
30 PkgmgrBackendPlugin* PkgmgrBackendPlugin::GetInstance() {
31   return Singleton<PkgmgrBackendPlugin,
32                    PkgmgrBackendPluginTraits<PkgmgrBackendPlugin> >::get();
33 }
34
35 int PkgmgrBackendPlugin::DetailedInfo(
36     const std::string& pkgid,
37     package_manager_pkg_detail_info_t* pkg_detail_info) {
38
39   std::string app_id = xwalk::application::PkgIdToAppId(pkgid);
40
41   if (app_id.empty())
42     return kPkgmgrPluginFalse;
43
44   scoped_refptr<xwalk::application::ApplicationData> app_data =
45       storage_->GetApplicationData(app_id);
46   if (!app_data)
47     return kPkgmgrPluginFalse;
48
49   SaveDetailInfo(app_data.get(), pkg_detail_info);
50   return kPkgmgrPluginTrue;
51 }
52
53 int PkgmgrBackendPlugin::DetailedInfoPkg(
54     const std::string& pkg_path,
55     package_manager_pkg_detail_info_t* pkg_detail_info) {
56   if (!base::PathExists(base::FilePath(pkg_path))) {
57     return kPkgmgrPluginFalse;
58   }
59
60   scoped_refptr<xwalk::application::ApplicationData> app_data =
61       GetApplicationDataFromPkg(pkg_path);
62   if (app_data.get() == NULL) {
63     return kPkgmgrPluginFalse;
64   }
65
66   SaveDetailInfo(app_data.get(), pkg_detail_info);
67   return kPkgmgrPluginTrue;
68 }
69
70 int PkgmgrBackendPlugin::IsAppInstalled(const std::string& pkgid) {
71   // this will fetch app_id if exists
72   std::string app_id = xwalk::application::PkgIdToAppId(pkgid);
73   return app_id.empty() ? kPkgmgrPluginFalse : kPkgmgrPluginTrue;
74 }
75
76 int PkgmgrBackendPlugin::AppsList(package_manager_pkg_info_t** list,
77                                   int* count) {
78   *list = NULL;
79   *count = 0;
80   std::vector<std::string> app_ids;
81   if (!storage_->GetInstalledApplicationIDs(app_ids)) {
82     return kPkgmgrPluginFalse;
83   }
84   for (std::vector<std::string>::const_iterator citer = app_ids.begin();
85        citer != app_ids.end(); ++citer) {
86     scoped_refptr<xwalk::application::ApplicationData> app_data =
87         storage_->GetApplicationData(*citer);
88     if (app_data.get() != NULL) {
89       package_manager_pkg_info_t* result =
90           static_cast<package_manager_pkg_info_t*>(
91               malloc(sizeof(package_manager_pkg_info_t)));
92       memset(result, 0x00, sizeof(package_manager_pkg_info_t));
93       SaveInfo(app_data.get(), result);
94       if (*list) {
95         result->next = *list;
96       }
97       *list = result;
98       ++*count;
99     }
100   }
101   return kPkgmgrPluginTrue;
102 }
103
104 PkgmgrBackendPlugin::PkgmgrBackendPlugin() {
105   base::FilePath data_path;
106   xwalk::RegisterPathProvider();
107   PathService::Get(xwalk::DIR_DATA_PATH, &data_path);
108   storage_.reset(new xwalk::application::ApplicationStorage(data_path));
109 }
110
111 void PkgmgrBackendPlugin::SaveInfo(
112     xwalk::application::ApplicationData* app_data,
113     package_manager_pkg_info_t* pkg_detail_info) {
114   strncpy(pkg_detail_info->pkg_type, "xpk", PKG_TYPE_STRING_LEN_MAX - 1);
115   strncpy(pkg_detail_info->pkg_name, app_data->GetPackageID().c_str(),
116           PKG_NAME_STRING_LEN_MAX - 1);
117   if (app_data->Version() != NULL) {
118     strncpy(pkg_detail_info->version, app_data->Version()->GetString().c_str(),
119             PKG_VERSION_STRING_LEN_MAX - 1);
120   }
121 }
122
123 void PkgmgrBackendPlugin::SaveDetailInfo(
124     xwalk::application::ApplicationData* app_data,
125     package_manager_pkg_detail_info_t* pkg_detail_info) {
126   strncpy(pkg_detail_info->pkg_type, "xpk", PKG_TYPE_STRING_LEN_MAX - 1);
127   strncpy(pkg_detail_info->pkg_name, app_data->GetPackageID().c_str(),
128           PKG_NAME_STRING_LEN_MAX - 1);
129   if (app_data->Version() != NULL) {
130     strncpy(pkg_detail_info->version, app_data->Version()->GetString().c_str(),
131             PKG_VERSION_STRING_LEN_MAX - 1);
132   }
133   strncpy(pkg_detail_info->pkg_description, app_data->Description().c_str(),
134           PKG_VALUE_STRING_LEN_MAX - 1);
135
136   // TODO(t.iwanek) support this data in ApplicationStorage
137   // strncpy(pkg_detail_info.min_platform_version,
138   //         app_data->todo, PKG_VERSION_STRING_LEN_MAX -1);
139   // PKG_VERSION_STRING_LEN_MAX - 1);
140   // pkg_detail_info->installed_time = 0;
141   // pkg_detail_info->installed_size = -1;
142   // pkg_detail_info->app_size = -1;
143   // pkg_detail_info->data_size = -1;
144
145   strncpy(pkg_detail_info->optional_id, app_data->GetPackageID().c_str(),
146           PKG_NAME_STRING_LEN_MAX - 1);
147   pkg_detail_info->pkg_optional_info = NULL;
148 }
149
150 scoped_refptr<xwalk::application::ApplicationData>
151 PkgmgrBackendPlugin::GetApplicationDataFromPkg(const std::string& pkg_path) {
152   base::ScopedTempDir dir;
153   dir.CreateUniqueTempDir();
154   base::FilePath unpacked_dir = dir.path();
155
156   scoped_ptr<xwalk::application::Package> package =
157       xwalk::application::Package::Create(base::FilePath(pkg_path));
158   package->ExtractToTemporaryDir(&unpacked_dir);
159   std::string app_id = package->Id();
160
161   std::string error;
162   scoped_refptr<xwalk::application::ApplicationData> app_data = LoadApplication(
163       unpacked_dir, app_id, xwalk::application::ApplicationData::TEMP_DIRECTORY,
164       package->type(), &error);
165   return app_data;
166 }