1 // Copyright (c) 2014 Intel Corporation. All rights reserved.
2 // Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
6 #include "xwalk/application/common/manifest_handlers/tizen_application_handler.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "base/strings/string_split.h"
13 #include "base/version.h"
14 #include "third_party/re2/re2/re2.h"
15 #include "xwalk/application/common/application_manifest_constants.h"
16 #include "xwalk/application/common/constants.h"
20 namespace keys = application_widget_keys;
22 namespace application {
24 TizenApplicationInfo::TizenApplicationInfo() {
27 TizenApplicationInfo::~TizenApplicationInfo() {
30 TizenApplicationHandler::TizenApplicationHandler() {}
32 TizenApplicationHandler::~TizenApplicationHandler() {}
34 bool TizenApplicationHandler::Parse(scoped_refptr<ApplicationData> application,
35 base::string16* error) {
36 scoped_ptr<TizenApplicationInfo> app_info(new TizenApplicationInfo);
37 const Manifest* manifest = application->GetManifest();
40 base::Value* app_value = NULL;
41 manifest->Get(keys::kTizenApplicationKey, &app_value);
42 // Find an application element with tizen namespace
43 base::DictionaryValue* app_dict;
46 if (app_value && app_value->IsType(base::Value::TYPE_DICTIONARY)) {
47 app_value->GetAsDictionary(&app_dict);
48 find = app_dict->GetString(keys::kNamespaceKey, &value);
49 find = find && (value == keys::kTizenNamespacePrefix);
50 } else if (app_value && app_value->IsType(base::Value::TYPE_LIST)) {
51 base::ListValue* list;
52 app_value->GetAsList(&list);
53 for (base::ListValue::iterator it = list->begin();
54 it != list->end(); ++it) {
55 (*it)->GetAsDictionary(&app_dict);
56 find = app_dict->GetString(keys::kNamespaceKey, &value);
57 find = find && (value == keys::kTizenNamespacePrefix);
64 *error = base::ASCIIToUTF16(
65 "Cannot find application element with tizen namespace"
66 " or the tizen namespace prefix is incorrect.\n");
69 if (app_dict->GetString(keys::kTizenApplicationIdKey, &value))
70 app_info->set_id(value);
71 if (app_dict->GetString(keys::kTizenApplicationPackageKey, &value))
72 app_info->set_package(value);
73 if (app_dict->GetString(keys::kTizenApplicationRequiredVersionKey, &value))
74 app_info->set_required_version(value);
76 application->SetManifestData(keys::kTizenApplicationKey,
81 bool TizenApplicationHandler::Validate(
82 scoped_refptr<const ApplicationData> application,
83 std::string* error) const {
84 const TizenApplicationInfo* app_info =
85 static_cast<const TizenApplicationInfo*>(
86 application->GetManifestData(keys::kTizenApplicationKey));
88 const char kIdPattern[] = "\\A[0-9a-zA-Z]{10}[.][0-9a-zA-Z]{1,52}\\z";
89 const char kPackagePattern[] = "\\A[0-9a-zA-Z]{10}\\z";
90 if (!RE2::PartialMatch(app_info->id(), kIdPattern)) {
91 *error = std::string("The id property of application element"
92 " does not match the format\n");
95 if (!RE2::PartialMatch(app_info->package(), kPackagePattern)) {
96 *error = std::string("The package property of application element"
97 " does not match the format\n");
100 if (app_info->id().find(app_info->package()) != 0) {
101 *error = std::string("The application element property id"
102 " does not start with package.\n");
105 if (app_info->required_version().empty()) {
106 *error = std::string("The required_version property of application"
107 " element does not exist.\n");
111 const base::Version supported_version = Version(kTizenWebAPIVersion);
112 if (supported_version.IsOlderThan(app_info->required_version())) {
113 *error = std::string("The required_version of Tizen Web API"
114 " is not supported.\n");
121 std::vector<std::string> TizenApplicationHandler::Keys() const {
122 return std::vector<std::string>(1, keys::kTizenApplicationKey);
125 bool TizenApplicationHandler::AlwaysParseForType(Manifest::Type type) const {
129 } // namespace application