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