| // Copyright (c) 2010 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_bstr.h" |
| |
| #include "base/logging.h" |
| |
| namespace base { |
| namespace win { |
| |
| ScopedBstr::ScopedBstr(const char16* non_bstr) |
| : bstr_(SysAllocString(non_bstr)) { |
| } |
| |
| ScopedBstr::~ScopedBstr() { |
| COMPILE_ASSERT(sizeof(ScopedBstr) == sizeof(BSTR), ScopedBstrSize); |
| SysFreeString(bstr_); |
| } |
| |
| void ScopedBstr::Reset(BSTR bstr) { |
| if (bstr != bstr_) { |
| // if |bstr_| is NULL, SysFreeString does nothing. |
| SysFreeString(bstr_); |
| bstr_ = bstr; |
| } |
| } |
| |
| BSTR ScopedBstr::Release() { |
| BSTR bstr = bstr_; |
| bstr_ = NULL; |
| return bstr; |
| } |
| |
| void ScopedBstr::Swap(ScopedBstr& bstr2) { |
| BSTR tmp = bstr_; |
| bstr_ = bstr2.bstr_; |
| bstr2.bstr_ = tmp; |
| } |
| |
| BSTR* ScopedBstr::Receive() { |
| DCHECK(!bstr_) << "BSTR leak."; |
| return &bstr_; |
| } |
| |
| BSTR ScopedBstr::Allocate(const char16* str) { |
| Reset(SysAllocString(str)); |
| return bstr_; |
| } |
| |
| BSTR ScopedBstr::AllocateBytes(size_t bytes) { |
| Reset(SysAllocStringByteLen(NULL, static_cast<UINT>(bytes))); |
| return bstr_; |
| } |
| |
| void ScopedBstr::SetByteLen(size_t bytes) { |
| DCHECK(bstr_ != NULL) << "attempting to modify a NULL bstr"; |
| uint32* data = reinterpret_cast<uint32*>(bstr_); |
| data[-1] = static_cast<uint32>(bytes); |
| } |
| |
| size_t ScopedBstr::Length() const { |
| return SysStringLen(bstr_); |
| } |
| |
| size_t ScopedBstr::ByteLength() const { |
| return SysStringByteLen(bstr_); |
| } |
| |
| } // namespace win |
| } // namespace base |