1// Copyright 2013 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 "device/nfc/nfc_adapter_factory.h" 6 7#include "base/lazy_instance.h" 8#include "base/logging.h" 9#include "base/memory/weak_ptr.h" 10 11#if defined(OS_CHROMEOS) 12#include "device/nfc/nfc_adapter_chromeos.h" 13#endif 14 15namespace device { 16 17namespace { 18 19// Shared default adapter instance, we don't want to keep this class around 20// if nobody is using it so use a WeakPtr and create the object when needed; 21// since Google C++ Style (and clang's static analyzer) forbids us having 22// exit-time destructors we use a leaky lazy instance for it. 23base::LazyInstance<base::WeakPtr<device::NfcAdapter> >::Leaky 24 default_adapter = LAZY_INSTANCE_INITIALIZER; 25 26} // namespace 27 28// static 29bool NfcAdapterFactory::IsNfcAvailable() { 30#if defined(OS_CHROMEOS) 31 return true; 32#else 33 return false; 34#endif 35} 36 37// static 38void NfcAdapterFactory::GetAdapter(const AdapterCallback& callback) { 39 if (!IsNfcAvailable()) { 40 LOG(WARNING) << "NFC is not available on the current platform."; 41 return; 42 } 43 if (!default_adapter.Get().get()) { 44#if defined(OS_CHROMEOS) 45 chromeos::NfcAdapterChromeOS* new_adapter = 46 new chromeos::NfcAdapterChromeOS(); 47 default_adapter.Get() = new_adapter->weak_ptr_factory_.GetWeakPtr(); 48#endif 49 } 50 if (default_adapter.Get()->IsInitialized()) 51 callback.Run(scoped_refptr<NfcAdapter>(default_adapter.Get().get())); 52} 53 54} // namespace device 55