1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/component_updater/component_patcher.h" 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <string> 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <vector> 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/file_util.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/json/json_file_value_serializer.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/values.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/component_updater/component_patcher_operation.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/component_updater/component_updater_service.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace { 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Deserialize the commands file (present in delta update packages). The top 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// level must be a list. 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbase::ListValue* ReadCommands(const base::FilePath& unpack_path) { 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::FilePath commands = 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch unpack_path.Append(FILE_PATH_LITERAL("commands.json")); 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::PathExists(commands)) 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return NULL; 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch JSONFileValueSerializer serializer(commands); 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::Value> root(serializer.Deserialize(NULL, NULL)); 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return (root.get() && root->IsType(base::Value::TYPE_LIST)) ? 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static_cast<base::ListValue*>(root.release()) : NULL; 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// The patching support is not cross-platform at the moment. 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentPatcherCrossPlatform::ComponentPatcherCrossPlatform() {} 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUnpacker::Error ComponentPatcherCrossPlatform::Patch( 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PatchType patch_type, 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::FilePath& input_file, 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::FilePath& patch_file, 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::FilePath& output_file, 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int* error) { 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return ComponentUnpacker::kDeltaUnsupportedCommand; 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Takes the contents of a differential component update in input_dir 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// and produces the contents of a full component update in unpack_dir 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// using input_abs_path_ files that the installer knows about. 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochComponentUnpacker::Error DifferentialUpdatePatch( 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::FilePath& input_dir, 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::FilePath& unpack_dir, 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ComponentPatcher* patcher, 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ComponentInstaller* installer, 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int* error) { 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *error = 0; 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::ListValue> commands(ReadCommands(input_dir)); 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!commands.get()) 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return ComponentUnpacker::kDeltaBadCommands; 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (base::ValueVector::const_iterator command = commands->begin(), 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch end = commands->end(); command != end; command++) { 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!(*command)->IsType(base::Value::TYPE_DICTIONARY)) 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return ComponentUnpacker::kDeltaBadCommands; 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::DictionaryValue* command_args = 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static_cast<base::DictionaryValue*>(*command); 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<DeltaUpdateOp> operation(CreateDeltaUpdateOp(command_args)); 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!operation) 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return ComponentUnpacker::kDeltaUnsupportedCommand; 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ComponentUnpacker::Error result = operation->Run( 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch command_args, input_dir, unpack_dir, patcher, installer, error); 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (result != ComponentUnpacker::kNone) 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return result; 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return ComponentUnpacker::kNone; 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 82