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