/**************************************************************
 *
 * 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/streamsection.hxx>
#include <osl/diagnose.h>

namespace comphelper
{

//-------------------------------------------------------------------------
OStreamSection::OStreamSection(const staruno::Reference< stario::XDataInputStream >& _rxInput)
	:m_xMarkStream(_rxInput, ::com::sun::star::uno::UNO_QUERY)
	,m_xInStream(_rxInput)
	,m_nBlockStart(-1)
	,m_nBlockLen(-1)
{
	OSL_ENSURE(m_xInStream.is() && m_xMarkStream.is(), "OStreamSection::OStreamSection : invalid argument !");
	if (m_xInStream.is() && m_xMarkStream.is())
	{
		m_nBlockLen = _rxInput->readLong();
		m_nBlockStart = m_xMarkStream->createMark();
	}
}

//-------------------------------------------------------------------------
OStreamSection::OStreamSection(const staruno::Reference< stario::XDataOutputStream >& _rxOutput, sal_Int32 _nPresumedLength)
	:m_xMarkStream(_rxOutput, ::com::sun::star::uno::UNO_QUERY)
	,m_xOutStream(_rxOutput)
	,m_nBlockStart(-1)
	,m_nBlockLen(-1)
{
	OSL_ENSURE(m_xOutStream.is() && m_xMarkStream.is(), "OStreamSection::OStreamSection : invalid argument !");
	if (m_xOutStream.is() && m_xMarkStream.is())
	{
		m_nBlockStart = m_xMarkStream->createMark();
		// a placeholder where we will write the overall length (within the destructor)
		if (_nPresumedLength > 0)
			m_nBlockLen = _nPresumedLength + sizeof(m_nBlockLen);
			// as the caller did not consider - of course - the placeholder we are going to write
		else
			m_nBlockLen = 0;
		m_xOutStream->writeLong(m_nBlockLen);
	}
}

//-------------------------------------------------------------------------
OStreamSection::~OStreamSection()
{
	try
	{	// don't allow any exceptions to leave this block, this may be called during the stack unwinding of an exception
		// handling routing
		if (m_xInStream.is() &&  m_xMarkStream.is())
		{	// we're working on an input stream
			m_xMarkStream->jumpToMark(m_nBlockStart);
			m_xInStream->skipBytes(m_nBlockLen);
			m_xMarkStream->deleteMark(m_nBlockStart);
		}
		else if (m_xOutStream.is() && m_xMarkStream.is())
		{
			sal_Int32 nRealBlockLength = m_xMarkStream->offsetToMark(m_nBlockStart) - sizeof(m_nBlockLen);
			if (m_nBlockLen && (m_nBlockLen == nRealBlockLength))
				// nothing to do : the estimation the caller gave us (in the ctor) was correct
				m_xMarkStream->deleteMark(m_nBlockStart);
			else
			{	// the estimation was wrong (or we didn't get one)
				m_nBlockLen = nRealBlockLength;
				m_xMarkStream->jumpToMark(m_nBlockStart);
				m_xOutStream->writeLong(m_nBlockLen);
				m_xMarkStream->jumpToFurthest();
				m_xMarkStream->deleteMark(m_nBlockStart);
			}
		}
	}
	catch(const staruno::Exception&)
	{
	}
}
// -----------------------------------------------------------------------------
sal_Int32 OStreamSection::available()
{
	sal_Int32 nBytes = 0;
	try
	{	// don't allow any exceptions to leave this block, this may be called during the stack unwinding of an exception
		if (m_xInStream.is() &&  m_xMarkStream.is())
			nBytes = m_xMarkStream->offsetToMark(m_nBlockStart) - sizeof(m_nBlockLen);
	}
	catch(const staruno::Exception&)
	{
	}
	return nBytes;
}
// -----------------------------------------------------------------------------

}	// namespace comphelper
