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