1 // Copyright (c) 2010 The Chromium Authors. 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. 4 5 #include "chrome/installer/test/resource_updater.h" 6 7 #include <windows.h> 8 9 #include "base/files/file_path.h" 10 #include "base/files/memory_mapped_file.h" 11 #include "base/logging.h" 12 13 namespace upgrade_test { 14 15 ResourceUpdater::ResourceUpdater() : handle_(NULL) { 16 } 17 18 ResourceUpdater::~ResourceUpdater() { 19 if (handle_ != NULL) { 20 // An update wasn't committed, so discard it. 21 BOOL result = EndUpdateResource(handle_, TRUE); 22 DPCHECK(result != FALSE) << "EndUpdateResource failed"; 23 } 24 } 25 26 bool ResourceUpdater::Initialize(const base::FilePath& pe_image_path) { 27 DCHECK(handle_ == NULL); 28 handle_ = BeginUpdateResource(pe_image_path.value().c_str(), FALSE); 29 if (handle_ == NULL) { 30 PLOG(DFATAL) 31 << "BeginUpdateResource failed on \"" << pe_image_path.value() << "\""; 32 return false; 33 } 34 return true; 35 } 36 37 bool ResourceUpdater::Update(const std::wstring& name, 38 const std::wstring& type, 39 WORD language_id, 40 const base::FilePath& input_file) { 41 DCHECK(handle_ != NULL); 42 base::MemoryMappedFile input; 43 44 if (input.Initialize(input_file)) { 45 if (UpdateResource(handle_, type.c_str(), name.c_str(), language_id, 46 const_cast<uint8*>(input.data()), input.length()) 47 != FALSE) { 48 return true; 49 } 50 PLOG(DFATAL) << "UpdateResource failed for resource \"" << name << "\""; 51 } else { 52 PLOG(DFATAL) << "Failed mapping \"" << input_file.value() << "\""; 53 } 54 return false; 55 } 56 57 bool ResourceUpdater::Commit() { 58 DCHECK(handle_ != NULL); 59 bool result = true; 60 if (EndUpdateResource(handle_, FALSE) == FALSE) { 61 PLOG(DFATAL) << "EndUpdateResource failed"; 62 result = false; 63 } 64 handle_ = NULL; 65 return result; 66 } 67 68 } // namespace upgrade_test 69