1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Use of this source code is governed by a BSD-style license that can be
3731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// found in the LICENSE file.
4731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#ifndef BASE_WIN_SCOPED_BSTR_H_
6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#define BASE_WIN_SCOPED_BSTR_H_
7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#pragma once
8731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <windows.h>
10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <oleauto.h>
11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/base_api.h"
13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/logging.h"
14731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/string16.h"
15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
16731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace base {
17731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace win {
18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Manages a BSTR string pointer.
20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// The class interface is based on scoped_ptr.
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass BASE_API ScopedBstr {
22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
23731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ScopedBstr() : bstr_(NULL) {
24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Constructor to create a new BSTR.
27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  //
28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // NOTE: Do not pass a BSTR to this constructor expecting ownership to
29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // be transferred - even though it compiles! ;-)
30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  explicit ScopedBstr(const char16* non_bstr);
31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ~ScopedBstr();
32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Give ScopedBstr ownership over an already allocated BSTR or NULL.
34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // If you need to allocate a new BSTR instance, use |allocate| instead.
35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void Reset(BSTR bstr = NULL);
36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Releases ownership of the BSTR to the caller.
38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BSTR Release();
39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Creates a new BSTR from a 16-bit C-style string.
41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  //
42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // If you already have a BSTR and want to transfer ownership to the
43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // ScopedBstr instance, call |reset| instead.
44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  //
45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Returns a pointer to the new BSTR, or NULL if allocation failed.
46731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BSTR Allocate(const char16* str);
47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Allocates a new BSTR with the specified number of bytes.
49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Returns a pointer to the new BSTR, or NULL if allocation failed.
50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BSTR AllocateBytes(size_t bytes);
51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Sets the allocated length field of the already-allocated BSTR to be
53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // |bytes|.  This is useful when the BSTR was preallocated with e.g.
54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // SysAllocStringLen or SysAllocStringByteLen (call |AllocateBytes|) and then
55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // not all the bytes are being used.
56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  //
57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Note that if you want to set the length to a specific number of
58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // characters, you need to multiply by sizeof(wchar_t).  Oddly, there's no
59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // public API to set the length, so we do this ourselves by hand.
60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  //
61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // NOTE: The actual allocated size of the BSTR MUST be >= bytes.  That
62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // responsibility is with the caller.
63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void SetByteLen(size_t bytes);
64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Swap values of two ScopedBstr's.
66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void Swap(ScopedBstr& bstr2);
67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Retrieves the pointer address.
69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Used to receive BSTRs as out arguments (and take ownership).
70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // The function DCHECKs on the current value being NULL.
71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Usage: GetBstr(bstr.Receive());
72731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BSTR* Receive();
73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Returns number of chars in the BSTR.
75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  size_t Length() const;
76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Returns the number of bytes allocated for the BSTR.
78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  size_t ByteLength() const;
79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  operator BSTR() const {
81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return bstr_;
82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected:
85731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BSTR bstr_;
86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private:
88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Forbid comparison of ScopedBstr types.  You should never have the same
89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // BSTR owned by two different scoped_ptrs.
90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool operator==(const ScopedBstr& bstr2) const;
91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool operator!=(const ScopedBstr& bstr2) const;
92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DISALLOW_COPY_AND_ASSIGN(ScopedBstr);
93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}  // namespace win
96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}  // namespace base
97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif  // BASE_SCOPED_BSTR_H_
99