/**************************************************************
 * 
 * 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 _OSL_PROFILE_HXX_
#define _OSL_PROFILE_HXX_

#include "profile.h"
#include <rtl/ustring.hxx>
#include <string.h>
#include <list>

namespace osl {

	typedef oslProfileOption ProfileOption;

	const int Profile_DEFAULT   = osl_Profile_DEFAULT;
	const int Profile_SYSTEM    = osl_Profile_SYSTEM;    /* use system depended functinality */
	const int Profile_READLOCK  = osl_Profile_READLOCK;  /* lock file for reading            */
	const int Profile_WRITELOCK = osl_Profile_WRITELOCK; /* lock file for writing            */

    /** Deprecated API.
        @deprecated
    */
	class Profile {
		oslProfile profile;

	public:
		/** Open or create a configuration profile.
			@return 0 if the profile could not be created, otherwise a handle to the profile.
		*/
		Profile(const rtl::OUString strProfileName, oslProfileOption Options = Profile_DEFAULT )
		{
			profile = osl_openProfile(strProfileName.pData, Options);
			if( ! profile )
				throw std::exception();
		}
				

		/** Close the opened profile an flush all data to the disk.
			@param Profile handle to a opened profile.
		*/
		~Profile()
		{
			osl_closeProfile(profile);
		}


		sal_Bool flush()
		{
			return osl_flushProfile(profile);
		}

		rtl::OString readString( const rtl::OString& rSection, const rtl::OString& rEntry, 
								 const rtl::OString& rDefault)
		{
			sal_Char aBuf[1024];
			return osl_readProfileString( profile,
										  rSection.getStr(),
										  rEntry.getStr(),
										  aBuf,
										  sizeof( aBuf ),
										  rDefault.getStr() ) ? rtl::OString( aBuf ) : rtl::OString();

		}

		sal_Bool readBool( const rtl::OString& rSection, const rtl::OString& rEntry, sal_Bool bDefault )
		{
			return osl_readProfileBool( profile, rSection.getStr(), rEntry.getStr(), bDefault );
		}

		sal_uInt32 readIdent(const rtl::OString& rSection, const rtl::OString& rEntry, 
							 sal_uInt32 nFirstId, const std::list< rtl::OString >& rStrings,
							 sal_uInt32 nDefault)
		{
			int nItems = rStrings.size();
			const sal_Char** pStrings = new const sal_Char*[ nItems+1 ];
			std::list< rtl::OString >::const_iterator it = rStrings.begin();
			nItems = 0;
			while( it != rStrings.end() )
			{
				pStrings[ nItems++ ] = (*it).getStr();
				++it;
			}
			pStrings[ nItems ] = NULL;
			sal_uInt32 nRet = osl_readProfileIdent( profile, rSection.getStr(), rEntry.getStr(), nFirstId, pStrings, nDefault);
			delete[] pStrings;
			return nRet;
		}

		sal_Bool writeString(const rtl::OString& rSection, const rtl::OString& rEntry, 
							 const rtl::OString& rString)
		{
			return osl_writeProfileString( profile, rSection.getStr(), rEntry.getStr(), rString.getStr());
		}

		sal_Bool writeBool(const rtl::OString& rSection, const rtl::OString& rEntry, sal_Bool Value)
		{
			return osl_writeProfileBool( profile, rSection.getStr(), rEntry.getStr(), Value);
		}

		sal_Bool writeIdent(const rtl::OString& rSection, const rtl::OString& rEntry, 
							sal_uInt32 nFirstId, const std::list< rtl::OString >& rStrings, 
							sal_uInt32 nValue)
		{
			int nItems = rStrings.size();
			const sal_Char** pStrings = new const sal_Char*[ nItems+1 ];
			std::list< rtl::OString >::const_iterator it = rStrings.begin();
			nItems = 0;
			while( it != rStrings.end() )
			{
				pStrings[ nItems++ ] = (*it).getStr();
				++it;
			}
			pStrings[ nItems ] = NULL;
			sal_Bool bRet =
				osl_writeProfileIdent( profile, rSection.getStr(), rEntry.getStr(), nFirstId, pStrings, nValue );
			delete[] pStrings;
			return bRet;
		}

		/** Acquire the mutex, block if already acquired by another thread.
			@param Profile handle to a opened profile.
			@return False if section or entry could not be found.
		*/
		sal_Bool removeEntry(const rtl::OString& rSection, const rtl::OString& rEntry)
		{
			return osl_removeProfileEntry( profile, rSection.getStr(), rEntry.getStr());
		}

		/** Get all entries belonging to the specified section.
			@param Profile handle to a opened profile.
			@return Pointer to a array of pointers.
		*/
		std::list< rtl::OString > getSectionEntries(const rtl::OString& rSection )
		{
			std::list< rtl::OString > aEntries;

			// count buffer size necessary
			int n = osl_getProfileSectionEntries( profile, rSection.getStr(), NULL, 0 );
			if( n > 1 )
			{
				sal_Char* pBuf = new sal_Char[ n+1 ];
				osl_getProfileSectionEntries( profile, rSection.getStr(), pBuf, n+1 );
				int nLen;
				for( n = 0; ( nLen = strlen( pBuf+n ) ); n += nLen+1 )
					aEntries.push_back( rtl::OString( pBuf+n ) );
				delete[] pBuf;
			}

			return aEntries;
		}

		/** Get all section entries
			@param Profile handle to a opened profile.
			@return Pointer to a array of pointers.
		*/
		std::list< rtl::OString > getSections()
		{
			std::list< rtl::OString > aSections;

			// count buffer size necessary
			int n = osl_getProfileSections( profile, NULL, 0 );
			if( n > 1 )
			{
				sal_Char* pBuf = new sal_Char[ n+1 ];
				osl_getProfileSections( profile, pBuf, n+1 );
				int nLen;
				for( n = 0; ( nLen = strlen( pBuf+n ) ); n += nLen+1 )
					aSections.push_back( rtl::OString( pBuf+n ) );
				delete[] pBuf;
			}

			return aSections;
		}
	};
}

#endif	/* _OSL_PROFILE_HXX_ */


