1731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/win/scoped_bstr.h" 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/logging.h" 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace base { 10731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace win { 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 12731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickScopedBstr::ScopedBstr(const char16* non_bstr) 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : bstr_(SysAllocString(non_bstr)) { 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottScopedBstr::~ScopedBstr() { 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott COMPILE_ASSERT(sizeof(ScopedBstr) == sizeof(BSTR), ScopedBstrSize); 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SysFreeString(bstr_); 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid ScopedBstr::Reset(BSTR bstr) { 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bstr != bstr_) { 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // if |bstr_| is NULL, SysFreeString does nothing. 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SysFreeString(bstr_); 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bstr_ = bstr; 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottBSTR ScopedBstr::Release() { 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BSTR bstr = bstr_; 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bstr_ = NULL; 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return bstr; 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid ScopedBstr::Swap(ScopedBstr& bstr2) { 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott BSTR tmp = bstr_; 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bstr_ = bstr2.bstr_; 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bstr2.bstr_ = tmp; 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottBSTR* ScopedBstr::Receive() { 42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(!bstr_) << "BSTR leak."; 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return &bstr_; 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 46731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBSTR ScopedBstr::Allocate(const char16* str) { 47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Reset(SysAllocString(str)); 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return bstr_; 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 51731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBSTR ScopedBstr::AllocateBytes(size_t bytes) { 52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Reset(SysAllocStringByteLen(NULL, static_cast<UINT>(bytes))); 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return bstr_; 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid ScopedBstr::SetByteLen(size_t bytes) { 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DCHECK(bstr_ != NULL) << "attempting to modify a NULL bstr"; 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott uint32* data = reinterpret_cast<uint32*>(bstr_); 59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick data[-1] = static_cast<uint32>(bytes); 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 62731df977c0511bca2206b5f333555b1205ff1f43Iain Merricksize_t ScopedBstr::Length() const { 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return SysStringLen(bstr_); 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 66731df977c0511bca2206b5f333555b1205ff1f43Iain Merricksize_t ScopedBstr::ByteLength() const { 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return SysStringByteLen(bstr_); 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} // namespace win 71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} // namespace base 72