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.
5 #include "xwalk/application/tools/tizen/xwalk_backend_plugin.h"
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"
23 enum PkgmgrPluginBool {
24 kPkgmgrPluginTrue = 0,
25 kPkgmgrPluginFalse = -1
30 PkgmgrBackendPlugin* PkgmgrBackendPlugin::GetInstance() {
31 return Singleton<PkgmgrBackendPlugin,
32 PkgmgrBackendPluginTraits<PkgmgrBackendPlugin> >::get();
35 int PkgmgrBackendPlugin::DetailedInfo(
36 const std::string& pkgid,
37 package_manager_pkg_detail_info_t* pkg_detail_info) {
39 std::string app_id = xwalk::application::PkgIdToAppId(pkgid);
42 return kPkgmgrPluginFalse;
44 scoped_refptr<xwalk::application::ApplicationData> app_data =
45 storage_->GetApplicationData(app_id);
47 return kPkgmgrPluginFalse;
49 SaveDetailInfo(app_data.get(), pkg_detail_info);
50 return kPkgmgrPluginTrue;
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;
60 scoped_refptr<xwalk::application::ApplicationData> app_data =
61 GetApplicationDataFromPkg(pkg_path);
62 if (app_data.get() == NULL) {
63 return kPkgmgrPluginFalse;
66 SaveDetailInfo(app_data.get(), pkg_detail_info);
67 return kPkgmgrPluginTrue;
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;
76 int PkgmgrBackendPlugin::AppsList(package_manager_pkg_info_t** list,
80 std::vector<std::string> app_ids;
81 if (!storage_->GetInstalledApplicationIDs(app_ids)) {
82 return kPkgmgrPluginFalse;
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);
101 return kPkgmgrPluginTrue;
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));
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);
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);
133 strncpy(pkg_detail_info->pkg_description, app_data->Description().c_str(),
134 PKG_VALUE_STRING_LEN_MAX - 1);
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;
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;
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();
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();
162 scoped_refptr<xwalk::application::ApplicationData> app_data = LoadApplication(
163 unpacked_dir, app_id, xwalk::application::ApplicationData::TEMP_DIRECTORY,
164 package->type(), &error);