/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_comphelper.hxx"
#include <comphelper/basicio.hxx>

//.........................................................................
namespace comphelper
{
//.........................................................................

//------------------------------------------------------------------------------
const staruno::Reference<stario::XObjectOutputStream>& operator << (
		const staruno::Reference<stario::XObjectOutputStream>& _rxOutStream,
		const starawt::FontDescriptor& _rFont)
{
	_rxOutStream->writeUTF( _rFont.Name );
	_rxOutStream->writeShort( _rFont.Height );
	_rxOutStream->writeShort( _rFont.Width );
	_rxOutStream->writeUTF( _rFont.StyleName );
	_rxOutStream->writeShort( _rFont.Family );
	_rxOutStream->writeShort( _rFont.CharSet );
	_rxOutStream->writeShort( _rFont.Pitch );
	_rxOutStream->writeDouble( _rFont.CharacterWidth );
	_rxOutStream->writeDouble( _rFont.Weight );
	_rxOutStream->writeShort( static_cast< sal_Int16 >(_rFont.Slant) );
	_rxOutStream->writeShort( _rFont.Underline );
	_rxOutStream->writeShort( _rFont.Strikeout );
	_rxOutStream->writeDouble( _rFont.Orientation );
	_rxOutStream->writeBoolean( _rFont.Kerning );
	_rxOutStream->writeBoolean( _rFont.WordLineMode );
	_rxOutStream->writeShort( _rFont.Type );
	return _rxOutStream;
}

// FontDescriptor
//------------------------------------------------------------------------------
const staruno::Reference<stario::XObjectInputStream>& operator >> (
		const staruno::Reference<stario::XObjectInputStream>& _rxInStream,
		starawt::FontDescriptor& _rFont)
{
	// schreiben des Fontdescriptors
	_rFont.Name = _rxInStream->readUTF();
	_rFont.Height = _rxInStream->readShort();
	_rFont.Width = _rxInStream->readShort();
	_rFont.StyleName = _rxInStream->readUTF();
	_rFont.Family = _rxInStream->readShort();
	_rFont.CharSet = _rxInStream->readShort();
	_rFont.Pitch = _rxInStream->readShort();
	_rFont.CharacterWidth = static_cast< float >(_rxInStream->readDouble());
	_rFont.Weight = static_cast< float >(_rxInStream->readDouble());
	_rFont.Slant = (starawt::FontSlant)_rxInStream->readShort();
	_rFont.Underline = _rxInStream->readShort();
	_rFont.Strikeout = _rxInStream->readShort();
	_rFont.Orientation = static_cast< float >(_rxInStream->readDouble());
	_rFont.Kerning = _rxInStream->readBoolean();
	_rFont.WordLineMode = _rxInStream->readBoolean();
	_rFont.Type = _rxInStream->readShort();
	return _rxInStream;
}

//------------------------------------------------------------------------------
const staruno::Reference<stario::XObjectInputStream>& operator >> (const staruno::Reference<stario::XObjectInputStream>& _rxInStream, sal_Bool& _rVal)
{
	_rVal = _rxInStream->readBoolean();
	return _rxInStream;
}

//------------------------------------------------------------------------------
const staruno::Reference<stario::XObjectOutputStream>& operator << (const staruno::Reference<stario::XObjectOutputStream>& _rxOutStream, sal_Bool _bVal)
{
	_rxOutStream->writeBoolean(_bVal);
	return _rxOutStream;
}

//------------------------------------------------------------------------------
const staruno::Reference<stario::XObjectInputStream>& operator >> (const staruno::Reference<stario::XObjectInputStream>& _rxInStream, ::rtl::OUString& rStr)
{
	rStr = _rxInStream->readUTF();
	return _rxInStream;
}

//------------------------------------------------------------------------------
const staruno::Reference<stario::XObjectOutputStream>& operator << (const staruno::Reference<stario::XObjectOutputStream>& _rxOutStream, const ::rtl::OUString& rStr)
{
	_rxOutStream->writeUTF(rStr);
	return _rxOutStream;
}

//------------------------------------------------------------------------------
const staruno::Reference<stario::XObjectInputStream>& operator >> (const staruno::Reference<stario::XObjectInputStream>& _rxInStream, sal_Int16& _rValue)
{
	_rValue = _rxInStream->readShort();
	return _rxInStream;
}

//------------------------------------------------------------------------------
const staruno::Reference<stario::XObjectOutputStream>& operator << (const staruno::Reference<stario::XObjectOutputStream>& _rxOutStream, sal_Int16 _nValue)
{
	_rxOutStream->writeShort(_nValue);
	return _rxOutStream;
}

//------------------------------------------------------------------------------
const staruno::Reference<stario::XObjectInputStream>& operator >> (const staruno::Reference<stario::XObjectInputStream>& _rxInStream, sal_uInt16& _rValue)
{
	_rValue = _rxInStream->readShort();
	return _rxInStream;
}

//------------------------------------------------------------------------------
const staruno::Reference<stario::XObjectOutputStream>& operator << (const staruno::Reference<stario::XObjectOutputStream>& _rxOutStream, sal_uInt16 _nValue)
{
	_rxOutStream->writeShort(_nValue);
	return _rxOutStream;
}

//------------------------------------------------------------------------------
const staruno::Reference<stario::XObjectInputStream>& operator >> (const staruno::Reference<stario::XObjectInputStream>& _rxInStream, sal_uInt32& _rValue)
{
	_rValue = _rxInStream->readLong();
	return _rxInStream;
}

//------------------------------------------------------------------------------
const staruno::Reference<stario::XObjectOutputStream>& operator << (const staruno::Reference<stario::XObjectOutputStream>& _rxOutStream, sal_uInt32 _nValue)
{
	_rxOutStream->writeLong(_nValue);
	return _rxOutStream;
}

//------------------------------------------------------------------------------
const staruno::Reference<stario::XObjectInputStream>& operator >> (const staruno::Reference<stario::XObjectInputStream>& _rxInStream, sal_Int32& _rValue)
{
	_rValue = _rxInStream->readLong();
	return _rxInStream;
}

//------------------------------------------------------------------------------
const staruno::Reference<stario::XObjectOutputStream>& operator << (const staruno::Reference<stario::XObjectOutputStream>& _rxOutStream, sal_Int32 _nValue)
{
	_rxOutStream->writeLong(_nValue);
	return _rxOutStream;
}

//.........................................................................
}	// namespace comphelper
//.........................................................................

