11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/tools/package_manager/manifest.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/json/json_reader.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/values.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "url/gurl.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace mojo { 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciManifest::Manifest() { 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciManifest::~Manifest() { 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool Manifest::Parse(const std::string& str, std::string* err_msg) { 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int err_code = base::JSONReader::JSON_NO_ERROR; 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<base::Value> root(base::JSONReader::ReadAndReturnError( 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci str, 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::JSON_ALLOW_TRAILING_COMMAS, 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &err_code, err_msg)); 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (err_code != base::JSONReader::JSON_NO_ERROR) 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::DictionaryValue* root_dict; 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!root->GetAsDictionary(&root_dict)) { 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *err_msg = "Manifest is not a dictionary."; 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!PopulateDeps(root_dict, err_msg)) 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool Manifest::ParseFromFile(const base::FilePath& file_name, 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string* err_msg) { 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string data; 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!base::ReadFileToString(file_name, &data)) { 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *err_msg = "Couldn't read manifest file " + file_name.AsUTF8Unsafe(); 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return Parse(data, err_msg); 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool Manifest::PopulateDeps(const base::DictionaryValue* root, 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string* err_msg) { 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::Value* deps_value; 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!root->Get("deps", &deps_value)) 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; // No deps, that's OK. 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::ListValue* deps; 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!deps_value->GetAsList(&deps)) { 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *err_msg = "Deps is not a list. Should be \"deps\": [ \"...\", \"...\" ]"; 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deps_.reserve(deps->GetSize()); 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t i = 0; i < deps->GetSize(); i++) { 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string cur_dep; 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!deps->GetString(i, &cur_dep)) { 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *err_msg = "Dependency list item wasn't a string."; 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL cur_url(cur_dep); 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!cur_url.is_valid()) { 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *err_msg = "Dependency entry isn't a valid URL: " + cur_dep; 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deps_.push_back(cur_url); 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace mojo 84