|  | // Copyright 2017 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "base/win/scoped_winrt_initializer.h" | 
|  |  | 
|  | #include "base/logging.h" | 
|  | #include "base/win/com_init_util.h" | 
|  | #include "base/win/core_winrt_util.h" | 
|  | #include "base/win/windows_version.h" | 
|  |  | 
|  | namespace base { | 
|  | namespace win { | 
|  |  | 
|  | ScopedWinrtInitializer::ScopedWinrtInitializer() | 
|  | : hr_(base::win::RoInitialize(RO_INIT_MULTITHREADED)) { | 
|  | DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); | 
|  | DCHECK_GE(GetVersion(), VERSION_WIN8); | 
|  | #if DCHECK_IS_ON() | 
|  | if (SUCCEEDED(hr_)) | 
|  | AssertComApartmentType(ComApartmentType::MTA); | 
|  | else | 
|  | DCHECK_NE(RPC_E_CHANGED_MODE, hr_) << "Invalid COM thread model change"; | 
|  | #endif | 
|  | } | 
|  |  | 
|  | ScopedWinrtInitializer::~ScopedWinrtInitializer() { | 
|  | DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); | 
|  | if (SUCCEEDED(hr_)) | 
|  | base::win::RoUninitialize(); | 
|  | } | 
|  |  | 
|  | bool ScopedWinrtInitializer::Succeeded() const { | 
|  | return SUCCEEDED(hr_); | 
|  | } | 
|  |  | 
|  | }  // namespace win | 
|  | }  // namespace base |