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

#include <list>
#include <vector>
#include <set>

#include <stdio.h>
#include <rtl/ustring.hxx>	
#include <rtl/strbuf.hxx>	

struct EqualString
{
	sal_Bool operator()(const ::rtl::OString& str1, const ::rtl::OString& str2) const
	{
		return (str1 == str2);
	}
};

struct HashString
{
	size_t operator()(const ::rtl::OString& str) const
	{
        return str.hashCode();
	}
};

struct LessString
{
	sal_Bool operator()(const ::rtl::OString& str1, const ::rtl::OString& str2) const
	{
		return (str1 < str2);
	}
};

#if defined(_MSC_VER) &&  _MSC_VER < 1200
typedef ::std::new_alloc NewAlloc;
#endif


typedef ::std::list< ::rtl::OString > 				StringList;
typedef ::std::vector< ::rtl::OString > 			StringVector;
typedef ::std::set< ::rtl::OString, LessString > 	StringSet;

::rtl::OString makeTempName();

const ::rtl::OString inGlobalSet(const ::rtl::OUString & r);

::rtl::OUString convertToFileUrl(const ::rtl::OString& fileName);

//*************************************************************************
// FileStream
//*************************************************************************
enum FileAccessMode
{
    FAM_READ,                   // "r"
    FAM_WRITE,                  // "w"
    FAM_APPEND,                 // "a"
    FAM_READWRITE_EXIST,        // "r+"
    FAM_READWRITE,              // "w+"
    FAM_READAPPEND              // "a+"
};

class FileStream //: public ofstream
{
public:
	FileStream();	
	virtual ~FileStream();
	
	sal_Bool isValid();

	void open(const ::rtl::OString& name, FileAccessMode nMode = FAM_READWRITE);
	void close();

	::rtl::OString 	getName() { return m_name; }

	// friend functions
	friend FileStream &operator<<(FileStream& o, sal_uInt32 i)
		{   fprintf(o.m_pFile, "%lu", sal::static_int_cast< unsigned long >(i));
            return o;
        }
	friend FileStream &operator<<(FileStream& o, char const * s)
		{   fprintf(o.m_pFile, "%s", s);
            return o;
        }
	friend FileStream &operator<<(FileStream& o, ::rtl::OString* s)
		{   fprintf(o.m_pFile, "%s", s->getStr());
            return o;
        }
	friend FileStream &operator<<(FileStream& o, const ::rtl::OString& s)
		{   fprintf(o.m_pFile, "%s", s.getStr());
            return o;
        }
	friend FileStream &operator<<(FileStream& o, ::rtl::OStringBuffer* s)
		{   fprintf(o.m_pFile, "%s", s->getStr());
            return o;
        }
	friend FileStream &operator<<(FileStream& o, const ::rtl::OStringBuffer& s)
		{   fprintf(o.m_pFile, "%s", s.getStr());
            return o;
        }

protected:
    const sal_Char* checkAccessMode(FileAccessMode mode);
    
    FILE*               m_pFile;
	::rtl::OString      m_name;
};

#endif // _CODEMAKER_GLOBAL_HXX_

