/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/

#ifndef _DBASHARED_CONSTASCIISTRING_HXX_
#define _DBASHARED_CONSTASCIISTRING_HXX_

#ifndef CONSTASCII_INCLUDED_INDIRECT
#error "don't include this file directly! use stringconstants.hrc instead!"
#endif

// no namespaces. This file is included from several other files _within_ a namespace.

//============================================================
//= a helper for static ascii pseudo-unicode strings
//============================================================
// string constants
struct ConstAsciiString
{
	const sal_Char*	ascii;
	sal_Int32		length;

	inline	operator const ::rtl::OUString& () const;
	inline	operator const sal_Char* () const { return ascii; }

	inline ConstAsciiString(const sal_Char* _pAsciiZeroTerminated, const sal_Int32 _nLength);
	inline ~ConstAsciiString();

private:
	mutable ::rtl::OUString*	ustring;
};

//------------------------------------------------------------
inline ConstAsciiString::ConstAsciiString(const sal_Char* _pAsciiZeroTerminated, const sal_Int32 _nLength)
	:ascii(_pAsciiZeroTerminated)
	,length(_nLength)
	,ustring(NULL)
{
}

//------------------------------------------------------------
inline ConstAsciiString::~ConstAsciiString()
{
	delete ustring;
	ustring = NULL;
}

//------------------------------------------------------------
inline ConstAsciiString::operator const ::rtl::OUString& () const
{
	if (!ustring)
		ustring = new ::rtl::OUString(ascii, length, RTL_TEXTENCODING_ASCII_US);
	return *ustring;
}

//============================================================

#define DECLARE_CONSTASCII_USTRING( name ) \
	extern const ConstAsciiString name

#define IMPLEMENT_CONSTASCII_USTRING( name, string ) \
	const ConstAsciiString name(string, sizeof(string)-1)


#endif // _DBASHARED_CONSTASCIISTRING_HXX_
