/*++

   Copyright    (c)    1997    Microsoft Corporation

   Module  Name :

       OutStrm.cpp

   Abstract:
		A lightweight interface of output streams.  This class provides
		the interface, as well as a basic skeleton for output streams.

   Author:

       Neil Allain    ( a-neilal )     August-1997 

   Revision History:

--*/
#include "stdafx.h"
#include "OutStrm.h"

EndLineToken	endl;


OutStream::OutStream()
	:	m_lastError( S_OK )
{
}

OutStream::~OutStream()
{
}

HRESULT
OutStream::writeToken(
	const OutToken&
)
{
	return S_OK;
}

HRESULT
OutStream::writeEolToken(
	const EndLineToken&
)
{
	HRESULT rc = writeChar( '\n' );
	if ( rc == S_OK )
	{
		rc = flush();
	}
	setLastError( rc );
	return rc;
}

HRESULT
OutStream::flush()
{
	return S_OK;
}

HRESULT
OutStream::writeString(
	const String&	str )
{
	HRESULT rc = writeString( str.c_str(), str.length() );
	setLastError( rc );
	return rc;
}

HRESULT
OutStream::writeString(
	LPCTSTR	str )
{
	HRESULT rc = writeString( str, _tcsclen(str) );
	setLastError( rc );
	return rc;
}

HRESULT
OutStream::writeLine(
	LPCTSTR	format,
	... )
{
	va_list args;
	va_start( args, format );
	_TCHAR buf[ 1024 ];
	_vstprintf( buf, format, args );
	HRESULT rc = writeString( buf );
	setLastError( rc );
	return rc;
}

HRESULT
OutStream::writeInt16(
	SHORT	i
)
{
	HRESULT rc = writeString( String::fromInt16(i) );
	setLastError( rc );
	return rc;
}

HRESULT
OutStream::writeInt(
	int	i
)
{
	HRESULT rc = writeString( String::fromInt32(i) );
	setLastError( rc );
	return rc;
}


HRESULT
OutStream::writeInt32(
	LONG	i
)
{
	HRESULT rc = writeString( String::fromInt32(i) );
	setLastError( rc );
	return rc;
}

HRESULT
OutStream::writeFloat(
	float	f
)
{
	HRESULT rc = writeString( String::fromFloat(f) );
	setLastError( rc );
	return rc;
}

HRESULT
OutStream::writeDouble(
	double	d
)
{
	HRESULT rc = writeString( String::fromDouble(d) );
	setLastError( rc );
	return rc;
}

OutStream&
OutStream::operator<<(
	_TCHAR	c
) 
{
	setLastError( writeChar( c ) );
	return *this;
}

OutStream&
OutStream::operator<<(
	SHORT	i
)
{
	setLastError( writeInt16( i ) );
	return *this;
}

OutStream&
OutStream::operator<<(
	int	i
)
{
	setLastError( writeInt( i ) );
	return *this;
}

OutStream&
OutStream::operator<<(
	LONG	i
) 
{
	setLastError( writeInt32( i ) );
	return *this;
}

OutStream&
OutStream::operator<<(
	float	f
) 
{
	setLastError( writeFloat( f ) );
	return *this;
}

OutStream&
OutStream::operator<<(
	double	d
) 
{
	setLastError( writeDouble( d ) );
	return *this;
}

OutStream&
OutStream::operator<<(
	const String&	str
) 
{
	setLastError( writeString( str ) );
	return *this;
}

OutStream&
OutStream::operator<<(
	LPCTSTR		str
) 
{
	setLastError( writeString( str ) );
	return *this;
}

OutStream&
OutStream::operator<<(
	const OutToken&	ot
) 
{
	setLastError( writeToken( ot ) );
	return *this;
}

OutStream&
OutStream::operator<<(
	const EndLineToken&	elt
) 
{
	setLastError( writeEolToken( elt ) );
	return *this;
}

void
OutStream::setLastError(
	HRESULT	hr )
{
	if ( hr == S_OK )
	{
	}
	else
	{
		m_lastError = hr;
	}
}