| // 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 |