1 // Copyright (c) 2014 Intel Corporation. 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/common/manifest_handlers/tizen_application_handler.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "base/strings/string_split.h"
12 #include "third_party/re2/re2/re2.h"
13 #include "xwalk/application/common/application_manifest_constants.h"
17 namespace keys = application_widget_keys;
19 namespace application {
21 TizenApplicationInfo::TizenApplicationInfo() {
24 TizenApplicationInfo::~TizenApplicationInfo() {
27 TizenApplicationHandler::TizenApplicationHandler() {}
29 TizenApplicationHandler::~TizenApplicationHandler() {}
31 bool TizenApplicationHandler::Parse(scoped_refptr<ApplicationData> application,
32 base::string16* error) {
33 scoped_ptr<TizenApplicationInfo> app_info(new TizenApplicationInfo);
34 const Manifest* manifest = application->GetManifest();
37 base::Value* app_value = NULL;
38 manifest->Get(keys::kTizenApplicationKey, &app_value);
39 // Find an application element with tizen namespace
40 base::DictionaryValue* app_dict;
43 if (app_value && app_value->IsType(base::Value::TYPE_DICTIONARY)) {
44 app_value->GetAsDictionary(&app_dict);
45 find = app_dict->GetString(keys::kNamespaceKey, &value);
46 find = find && (value == kTizenNamespacePrefix);
47 } else if (app_value && app_value->IsType(base::Value::TYPE_LIST)) {
48 base::ListValue* list;
49 app_value->GetAsList(&list);
50 for (base::ListValue::iterator it = list->begin();
51 it != list->end(); ++it) {
52 (*it)->GetAsDictionary(&app_dict);
53 find = app_dict->GetString(keys::kNamespaceKey, &value);
54 find = find && (value == kTizenNamespacePrefix);
61 *error = base::ASCIIToUTF16(
62 "Cannot find application element with tizen namespace"
63 " or the tizen namespace prefix is incorrect.\n");
66 if (app_dict->GetString(keys::kTizenApplicationIdKey, &value))
67 app_info->set_id(value);
68 if (app_dict->GetString(keys::kTizenApplicationPackageKey, &value))
69 app_info->set_package(value);
70 if (app_dict->GetString(keys::kTizenApplicationRequiredVersionKey, &value))
71 app_info->set_required_version(value);
73 application->SetManifestData(keys::kTizenApplicationKey,
78 bool TizenApplicationHandler::Validate(
79 scoped_refptr<const ApplicationData> application,
80 std::string* error) const {
81 const TizenApplicationInfo* app_info =
82 static_cast<const TizenApplicationInfo*>(
83 application->GetManifestData(keys::kTizenApplicationKey));
85 const char kIdPattern[] = "\\A[0-9a-zA-Z]{10}[.][0-9a-zA-Z]{1,52}\\z";
86 const char kPackagePattern[] = "\\A[0-9a-zA-Z]{10}\\z";
87 if (!RE2::PartialMatch(app_info->id(), kIdPattern)) {
88 *error = std::string("The id property of application element"
89 " does not match the format\n");
92 if (!RE2::PartialMatch(app_info->package(), kPackagePattern)) {
93 *error = std::string("The package property of application element"
94 " does not match the format\n");
97 if (app_info->id().find(app_info->package()) != 0) {
98 *error = std::string("The application element property id"
99 " does not start with package.\n");
102 // TODO(hongzhang): We need a version map (Tizen API version
103 // to Crosswalk API version) for checking required_version
104 if (app_info->required_version().empty()) {
105 *error = std::string("The required_version property of application"
106 " element does not exist.\n");
113 std::vector<std::string> TizenApplicationHandler::Keys() const {
114 return std::vector<std::string>(1, keys::kTizenApplicationKey);
117 bool TizenApplicationHandler::AlwaysParseForType(Manifest::Type type) const {
121 } // namespace application