Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(732)

Unified Diff: base/win/enum_variant.cc

Issue 8588036: Improve support for multiselect list box accessibility on Windows. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/win/enum_variant.cc
===================================================================
--- base/win/enum_variant.cc (revision 0)
+++ base/win/enum_variant.cc (revision 0)
@@ -0,0 +1,83 @@
+// Copyright (c) 2011 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/enum_variant.h"
+
+#include <algorithm>
+
+#include "base/logging.h"
+
+namespace base {
+namespace win {
+
+EnumVariant::EnumVariant(unsigned long count)
+ : items_(new VARIANT[count]),
+ count_(count),
+ current_index_(0) {
+}
+
+EnumVariant::~EnumVariant() {
+}
+
+VARIANT* EnumVariant::ItemAt(unsigned long index) {
+ DCHECK(index < count_);
+ return &items_[index];
+}
+
+ULONG STDMETHODCALLTYPE EnumVariant::AddRef() {
+ return IUnknownImpl::AddRef();
+}
+
+ULONG STDMETHODCALLTYPE EnumVariant::Release() {
+ return IUnknownImpl::Release();
+}
+
+STDMETHODIMP EnumVariant::QueryInterface(REFIID riid, void** ppv) {
+ if (riid == IID_IEnumVARIANT) {
+ *ppv = static_cast<IEnumVARIANT*>(this);
+ AddRef();
+ return S_OK;
+ }
+
+ return IUnknownImpl::QueryInterface(riid, ppv);
+}
+
+STDMETHODIMP EnumVariant::Next(ULONG requested_count,
+ VARIANT* out_elements,
+ ULONG* out_elements_received) {
+ unsigned long count = std::min(requested_count, count_ - current_index_);
+ for (unsigned long i = 0; i < count; ++i)
+ out_elements[i] = items_[current_index_ + i];
+ current_index_ += count;
+ *out_elements_received = count;
+
+ return (count == requested_count ? S_OK : S_FALSE);
+}
+
+STDMETHODIMP EnumVariant::Skip(ULONG skip_count) {
+ unsigned long count = skip_count;
+ if (current_index_ + count > count_)
+ count = count_ - current_index_;
+
+ current_index_ += count;
+ return (count == skip_count ? S_OK : S_FALSE);
+}
+
+STDMETHODIMP EnumVariant::Reset() {
+ current_index_ = 0;
+ return S_OK;
+}
+
+STDMETHODIMP EnumVariant::Clone(IEnumVARIANT** out_cloned_object) {
+ EnumVariant* other = new EnumVariant(count_);
+ if (count_ > 0)
+ memcpy(other->ItemAt(0), &items_[0], count_ * sizeof(VARIANT));
+ other->Skip(current_index_);
+ other->AddRef();
+ *out_cloned_object = other;
+ return S_OK;
+}
+
+} // namespace win
+} // namespace base

Powered by Google App Engine
This is Rietveld 408576698