resource_updater.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be 3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project// found in the LICENSE file. 4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "chrome/installer/test/resource_updater.h" 6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#include <windows.h> 8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "base/files/file_path.h" 10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "base/files/memory_mapped_file.h" 11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "base/logging.h" 12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectnamespace upgrade_test { 14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectResourceUpdater::ResourceUpdater() : handle_(NULL) { 16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source ProjectResourceUpdater::~ResourceUpdater() { 19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (handle_ != NULL) { 20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project // An update wasn't committed, so discard it. 21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project BOOL result = EndUpdateResource(handle_, TRUE); 22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DPCHECK(result != FALSE) << "EndUpdateResource failed"; 23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectbool ResourceUpdater::Initialize(const base::FilePath& pe_image_path) { 27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DCHECK(handle_ == NULL); 28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project handle_ = BeginUpdateResource(pe_image_path.value().c_str(), FALSE); 29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (handle_ == NULL) { 30aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner PLOG(DFATAL) 31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project << "BeginUpdateResource failed on \"" << pe_image_path.value() << "\""; 32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return false; 33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return true; 35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 36aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 37aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turnerbool ResourceUpdater::Update(const std::wstring& name, 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const std::wstring& type, 39aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner WORD language_id, 40aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner const base::FilePath& input_file) { 41aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner DCHECK(handle_ != NULL); 42aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner base::MemoryMappedFile input; 43aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 44aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if (input.Initialize(input_file)) { 45aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if (UpdateResource(handle_, type.c_str(), name.c_str(), language_id, 46aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner const_cast<uint8*>(input.data()), input.length()) 47aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner != FALSE) { 48aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner return true; 49aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 50aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner PLOG(DFATAL) << "UpdateResource failed for resource \"" << name << "\""; 51aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } else { 52aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner PLOG(DFATAL) << "Failed mapping \"" << input_file.value() << "\""; 53aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 54aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner return false; 55aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner} 56aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 57aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turnerbool ResourceUpdater::Commit() { 58aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner DCHECK(handle_ != NULL); 59aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner bool result = true; 60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if (EndUpdateResource(handle_, FALSE) == FALSE) { 61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PLOG(DFATAL) << "EndUpdateResource failed"; 62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project result = false; 63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 64aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner handle_ = NULL; 65aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner return result; 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} 67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project} // namespace upgrade_test 69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project