1 // Copyright (c) 2011 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 #ifndef BASE_WIN_ENUM_VARIANT_H_ 6 #define BASE_WIN_ENUM_VARIANT_H_ 7 8 #include <unknwn.h> 9 10 #include "base/memory/scoped_ptr.h" 11 #include "base/win/iunknown_impl.h" 12 13 namespace base { 14 namespace win { 15 16 // A simple implementation of IEnumVARIANT. 17 class BASE_EXPORT EnumVariant 18 : public IEnumVARIANT, 19 public IUnknownImpl { 20 public: 21 // The constructor allocates an array of size |count|. Then use 22 // ItemAt to set the value of each item in the array to initialize it. 23 explicit EnumVariant(unsigned long count); 24 25 // Returns a mutable pointer to the item at position |index|. 26 VARIANT* ItemAt(unsigned long index); 27 28 // IUnknown. 29 ULONG STDMETHODCALLTYPE AddRef() OVERRIDE; 30 ULONG STDMETHODCALLTYPE Release() OVERRIDE; 31 STDMETHODIMP QueryInterface(REFIID riid, void** ppv) OVERRIDE; 32 33 // IEnumVARIANT. 34 STDMETHODIMP Next(ULONG requested_count, 35 VARIANT* out_elements, 36 ULONG* out_elements_received); 37 STDMETHODIMP Skip(ULONG skip_count); 38 STDMETHODIMP Reset(); 39 STDMETHODIMP Clone(IEnumVARIANT** out_cloned_object); 40 41 private: 42 ~EnumVariant(); 43 44 scoped_ptr<VARIANT[]> items_; 45 unsigned long count_; 46 unsigned long current_index_; 47 }; 48 49 } // namespace win 50 } // namespace base 51 52 #endif // BASE_WIN_ENUM_VARIANT_H_ 53