| // Copyright (c) 2006-2008 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/scoped_bstr_win.h" |
| |
| #include "base/logging.h" |
| |
| |
| ScopedBstr::ScopedBstr(const wchar_t* 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_ == NULL) << "BSTR leak."; |
| return &bstr_; |
| } |
| |
| BSTR ScopedBstr::Allocate(const wchar_t* wide_str) { |
| Reset(SysAllocString(wide_str)); |
| return bstr_; |
| } |
| |
| BSTR ScopedBstr::AllocateBytes(int bytes) { |
| Reset(SysAllocStringByteLen(NULL, bytes)); |
| return bstr_; |
| } |
| |
| void ScopedBstr::SetByteLen(uint32 bytes) { |
| DCHECK(bstr_ != NULL) << "attempting to modify a NULL bstr"; |
| uint32* data = reinterpret_cast<uint32*>(bstr_); |
| data[-1] = bytes; |
| } |
| |
| uint32 ScopedBstr::Length() const { |
| return SysStringLen(bstr_); |
| } |
| |
| uint32 ScopedBstr::ByteLength() const { |
| return SysStringByteLen(bstr_); |
| } |