/**************************************************************
 *
 * 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_svx.hxx"

#include <stdio.h>
#include <com/sun/star/io/XStream.hpp>
#include <com/sun/star/embed/XTransactedObject.hpp>
#include <com/sun/star/embed/XEmbedObjectCreator.hpp>
#include <com/sun/star/embed/XEmbedObjectFactory.hpp>
#include <com/sun/star/embed/ElementModes.hpp>
#include <com/sun/star/embed/XEmbeddedObject.hpp>
#ifndef _COM_SUN_STAR_EMBED_XEMBED_PERSIST_HPP_
#include <com/sun/star/embed/XEmbedPersist.hpp>
#endif
#include <com/sun/star/embed/EntryInitModes.hpp>
#include <com/sun/star/embed/EmbedStates.hpp>
#include <com/sun/star/embed/Aspects.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <tools/debug.hxx>
#include <unotools/streamwrap.hxx>
#include <unotools/tempfile.hxx>

#include <svtools/embedhlp.hxx>
#include <unotools/ucbstreamhelper.hxx>
#include <comphelper/processfactory.hxx>
#include <comphelper/storagehelper.hxx>
#include <comphelper/embeddedobjectcontainer.hxx>

#ifndef _SO_CLSIDS_HXX
#include <sot/clsids.hxx>
#endif
#include <map>
#include "svx/xmleohlp.hxx"

// -----------
// - Defines -
// -----------

using namespace ::osl;
using namespace ::cppu;
using namespace ::utl;
using namespace ::com::sun::star;
using namespace ::com::sun::star::document;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::io;
using namespace ::com::sun::star::lang;

#define XML_CONTAINERSTORAGE_NAME_60		"Pictures"
#define XML_CONTAINERSTORAGE_NAME		"ObjectReplacements"
#define XML_EMBEDDEDOBJECT_URL_BASE		"vnd.sun.star.EmbeddedObject:"
#define XML_EMBEDDEDOBJECTGRAPHIC_URL_BASE		"vnd.sun.star.GraphicObject:"

// -----------------------------------------------------------------------------

// -----------------------------------------------------------------------------

class OutputStorageWrapper_Impl : public ::cppu::WeakImplHelper1<XOutputStream>
{
	::osl::Mutex	maMutex;
	Reference < XOutputStream > xOut;
	TempFile aTempFile;
	sal_Bool bStreamClosed : 1;
    SvStream* pStream;

public:
	OutputStorageWrapper_Impl();
	virtual ~OutputStorageWrapper_Impl();

// stario::XOutputStream
	virtual void SAL_CALL writeBytes(const Sequence< sal_Int8 >& aData) throw(NotConnectedException, BufferSizeExceededException, RuntimeException);
	virtual void SAL_CALL flush() throw(NotConnectedException, BufferSizeExceededException, RuntimeException);
	virtual void SAL_CALL closeOutput() throw(NotConnectedException, BufferSizeExceededException, RuntimeException);

    SvStream*   GetStream();
};

OutputStorageWrapper_Impl::OutputStorageWrapper_Impl()
    : bStreamClosed( sal_False )
    , pStream(0)
{
	aTempFile.EnableKillingFile();
    pStream = aTempFile.GetStream( STREAM_READWRITE );
	xOut = new OOutputStreamWrapper( *pStream );
}

OutputStorageWrapper_Impl::~OutputStorageWrapper_Impl()
{
}

SvStream *OutputStorageWrapper_Impl::GetStream()
{
    if( bStreamClosed )
        return pStream;
    return NULL;
}

void SAL_CALL OutputStorageWrapper_Impl::writeBytes(
		const Sequence< sal_Int8 >& aData)
	throw(NotConnectedException, BufferSizeExceededException, RuntimeException)
{
	MutexGuard			aGuard( maMutex );
	xOut->writeBytes( aData );
}

void SAL_CALL OutputStorageWrapper_Impl::flush()
	throw(NotConnectedException, BufferSizeExceededException, RuntimeException)
{
	MutexGuard			aGuard( maMutex );
	xOut->flush();
}

void SAL_CALL OutputStorageWrapper_Impl::closeOutput()
	throw(NotConnectedException, BufferSizeExceededException, RuntimeException)
{
	MutexGuard			aGuard( maMutex );
	xOut->closeOutput();
	bStreamClosed = sal_True;
}

// -----------------------------------------------------------------------------

struct OUStringLess
{
	bool operator() ( const ::rtl::OUString& r1, const ::rtl::OUString& r2 ) const
	{
		return (r1 < r2) != sal_False;
	}
};

// -----------------------------------------------------------------------------

// -----------------------------
// - SvXMLEmbeddedObjectHelper -
// -----------------------------
DBG_NAME(SvXMLEmbeddedObjectHelper)
SvXMLEmbeddedObjectHelper::SvXMLEmbeddedObjectHelper() :
	WeakComponentImplHelper2< XEmbeddedObjectResolver, XNameAccess >( maMutex ),
	maReplacementGraphicsContainerStorageName( RTL_CONSTASCII_USTRINGPARAM(XML_CONTAINERSTORAGE_NAME) ),
	maReplacementGraphicsContainerStorageName60( RTL_CONSTASCII_USTRINGPARAM(XML_CONTAINERSTORAGE_NAME_60) ),
	mpDocPersist( 0 ),
	meCreateMode( EMBEDDEDOBJECTHELPER_MODE_READ ),
	mpStreamMap( 0 )
{
    DBG_CTOR(SvXMLEmbeddedObjectHelper,NULL);
}

SvXMLEmbeddedObjectHelper::SvXMLEmbeddedObjectHelper( ::comphelper::IEmbeddedHelper& rDocPersist, SvXMLEmbeddedObjectHelperMode eCreateMode ) :
	WeakComponentImplHelper2< XEmbeddedObjectResolver, XNameAccess >( maMutex ),
	maReplacementGraphicsContainerStorageName( RTL_CONSTASCII_USTRINGPARAM(XML_CONTAINERSTORAGE_NAME) ),
	maReplacementGraphicsContainerStorageName60( RTL_CONSTASCII_USTRINGPARAM(XML_CONTAINERSTORAGE_NAME_60) ),
	mpDocPersist( 0 ),
	meCreateMode( EMBEDDEDOBJECTHELPER_MODE_READ ),
	mpStreamMap( 0 )
{
    DBG_CTOR(SvXMLEmbeddedObjectHelper,NULL);
	Init( 0, rDocPersist, eCreateMode );
}


// -----------------------------------------------------------------------------

SvXMLEmbeddedObjectHelper::~SvXMLEmbeddedObjectHelper()
{
    DBG_DTOR(SvXMLEmbeddedObjectHelper,NULL);
	if( mpStreamMap )
	{
		SvXMLEmbeddedObjectHelper_Impl::iterator aIter = mpStreamMap->begin();
		SvXMLEmbeddedObjectHelper_Impl::iterator aEnd = mpStreamMap->end();
		for( ; aIter != aEnd; aIter++ )
		{
			if( aIter->second )
			{
				aIter->second->release();
				aIter->second = 0;
			}
		}
	}
}

// -----------------------------------------------------------------------------

void SAL_CALL SvXMLEmbeddedObjectHelper::disposing()
{
	Flush();
}

// -----------------------------------------------------------------------------

sal_Bool SvXMLEmbeddedObjectHelper::ImplGetStorageNames(
		const ::rtl::OUString& rURLStr,
		::rtl::OUString& rContainerStorageName,
		::rtl::OUString& rObjectStorageName,
		sal_Bool bInternalToExternal,
	    sal_Bool *pGraphicRepl,
		sal_Bool *pOasisFormat ) const
{
	// internal URL: vnd.sun.star.EmbeddedObject:<object-name>
	// 			 or: vnd.sun.star.EmbeddedObject:<path>/<object-name>
	// internal replacement images:
	//				 vnd.sun.star.EmbeddedObjectGraphic:<object-name>
	// 			 or: vnd.sun.star.EmbeddedObjectGraphic:<path>/<object-name>
	// external URL: ./<path>/<object-name>
	// 			 or: <path>/<object-name>
	// 			 or: <object-name>
	// currently, path may only consist of a single directory name
	// it is also possible to have additional arguments at the end of URL: <main URL>[?<name>=<value>[,<name>=<value>]*]

	if( pGraphicRepl )
		*pGraphicRepl = sal_False;

	if( pOasisFormat )
		*pOasisFormat = sal_True; // the default value

	if( !rURLStr.getLength() )
		return sal_False;

	// get rid of arguments
	sal_Int32 nPos = rURLStr.indexOf( '?' );
	::rtl::OUString aURLNoPar;
	if ( nPos == -1 )
		aURLNoPar = rURLStr;
	else
	{
		aURLNoPar = rURLStr.copy( 0, nPos );

		// check the arguments
		nPos++;
		while( nPos >= 0 && nPos < rURLStr.getLength() )
		{
			::rtl::OUString aToken = rURLStr.getToken( 0, ',', nPos );
			if ( aToken.equalsIgnoreAsciiCase( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "oasis=false" ) ) ) )
			{
				if ( pOasisFormat )
					*pOasisFormat = sal_False;
				break;
			}
			else
			{
				DBG_ASSERT( sal_False, "invalid arguments was found in URL!" );
			}
		}
	}

	if( bInternalToExternal )
	{
		nPos = aURLNoPar.indexOf( ':' );
		if( -1 == nPos )
			return sal_False;
		sal_Bool bObjUrl =
			0 == aURLNoPar.compareToAscii( XML_EMBEDDEDOBJECT_URL_BASE,
								 sizeof( XML_EMBEDDEDOBJECT_URL_BASE ) -1 );
		sal_Bool bGrUrl = !bObjUrl &&
		  	0 == aURLNoPar.compareToAscii( XML_EMBEDDEDOBJECTGRAPHIC_URL_BASE,
						 sizeof( XML_EMBEDDEDOBJECTGRAPHIC_URL_BASE ) -1 );
		if( !(bObjUrl || bGrUrl) )
			return sal_False;

		sal_Int32 nPathStart = nPos + 1;
		nPos = aURLNoPar.lastIndexOf( '/' );
		if( -1 == nPos )
		{
			rContainerStorageName = ::rtl::OUString();
			rObjectStorageName = aURLNoPar.copy( nPathStart );
		}
		else if( nPos > nPathStart )
		{
			rContainerStorageName = aURLNoPar.copy( nPathStart, nPos-nPathStart);
			rObjectStorageName = aURLNoPar.copy( nPos+1 );
		}
		else
			return sal_False;

		if( bGrUrl )
		{
			sal_Bool bOASIS = mxRootStorage.is() &&
				( SotStorage::GetVersion( mxRootStorage ) > SOFFICE_FILEFORMAT_60 );
			rContainerStorageName = bOASIS
					? maReplacementGraphicsContainerStorageName
					: maReplacementGraphicsContainerStorageName60;

			if( pGraphicRepl )
				*pGraphicRepl = sal_True;
		}


	}
	else
	{
		DBG_ASSERT( '#' != aURLNoPar[0], "invalid object URL" );

		sal_Int32 _nPos = aURLNoPar.lastIndexOf( '/' );
		if( -1 == _nPos )
		{
			rContainerStorageName = ::rtl::OUString();
			rObjectStorageName = aURLNoPar;
		}
		else
		{
            //eliminate 'superfluous' slashes at start and end
            //#i103076# load objects with all allowed xlink:href syntaxes
            {
                //eliminate './' at start
			    sal_Int32 nStart = 0;
                sal_Int32 nCount = aURLNoPar.getLength();
			    if( 0 == aURLNoPar.compareToAscii( "./", 2 ) )
                {
				    nStart = 2;
                    nCount -= 2;
                }

                //eliminate '/' at end
                sal_Int32 nEnd = aURLNoPar.lastIndexOf( '/' );
                if( nEnd == aURLNoPar.getLength()-1 && nEnd != (nStart-1) )
                    nCount--;

                aURLNoPar = aURLNoPar.copy( nStart, nCount );
            }

            _nPos = aURLNoPar.lastIndexOf( '/' );
            if( _nPos >= 0 )
				rContainerStorageName = aURLNoPar.copy( 0, _nPos );
			rObjectStorageName = aURLNoPar.copy( _nPos+1 );
		}
	}

	if( -1 != rContainerStorageName.indexOf( '/' ) )
	{
		DBG_ERROR( "SvXMLEmbeddedObjectHelper: invalid path name" );
		return sal_False;
	}

	return sal_True;
}


// -----------------------------------------------------------------------------

uno::Reference < embed::XStorage > SvXMLEmbeddedObjectHelper::ImplGetContainerStorage(
		const ::rtl::OUString& rStorageName )
{
	DBG_ASSERT( -1 == rStorageName.indexOf( '/' ) &&
				-1 == rStorageName.indexOf( '\\' ),
				"nested embedded storages aren't supported" );
    if( !mxContainerStorage.is() ||
		( rStorageName != maCurContainerStorageName ) )
	{
        if( mxContainerStorage.is() &&
			maCurContainerStorageName.getLength() > 0 &&
			EMBEDDEDOBJECTHELPER_MODE_WRITE == meCreateMode )
        {
            uno::Reference < embed::XTransactedObject > xTrans( mxContainerStorage, uno::UNO_QUERY );
            if ( xTrans.is() )
                xTrans->commit();
        }

        if( rStorageName.getLength() > 0 && mxRootStorage.is() )
		{
            sal_Int32 nMode = EMBEDDEDOBJECTHELPER_MODE_WRITE == meCreateMode
                                    ? ::embed::ElementModes::READWRITE
                                    : ::embed::ElementModes::READ;
            mxContainerStorage = mxRootStorage->openStorageElement( rStorageName,
                                                             nMode );
		}
		else
		{
            mxContainerStorage = mxRootStorage;
		}
		maCurContainerStorageName = rStorageName;
	}

	return mxContainerStorage;
}

// -----------------------------------------------------------------------------

sal_Bool SvXMLEmbeddedObjectHelper::ImplReadObject(
		const ::rtl::OUString& rContainerStorageName,
		::rtl::OUString& rObjName,
	    const SvGlobalName *pClassId,
        SvStream* pTemp )
{
	(void)pClassId;

    uno::Reference < embed::XStorage > xDocStor( mpDocPersist->getStorage() );
    uno::Reference < embed::XStorage > xCntnrStor( ImplGetContainerStorage( rContainerStorageName ) );

    if( !xCntnrStor.is() && !pTemp )
		return sal_False;

	String aSrcObjName( rObjName );
    comphelper::EmbeddedObjectContainer& rContainer = mpDocPersist->getEmbeddedObjectContainer();

	// Is the object name unique?
	// if the object is already instantiated by GetEmbeddedObject
    // that means that the duplication is being loaded
    sal_Bool bDuplicate = rContainer.HasInstantiatedEmbeddedObject( rObjName );
	DBG_ASSERT( !bDuplicate, "An object in the document is referenced twice!" );

    if( xDocStor != xCntnrStor || pTemp || bDuplicate )
	{
        // TODO/LATER: make this altogether a method in the EmbeddedObjectContainer

		// create a unique name for the duplicate object
        if( bDuplicate )
            rObjName = rContainer.CreateUniqueObjectName();

		if( pTemp )
		{
            try
            {
				pTemp->Seek( 0 );
                uno::Reference < io::XStream > xStm = xDocStor->openStreamElement( rObjName,
                        embed::ElementModes::READWRITE | embed::ElementModes::TRUNCATE );
                SvStream* pStream = ::utl::UcbStreamHelper::CreateStream( xStm );
                *pTemp >> *pStream;
                delete pStream;

				// TODO/LATER: what to do when other types of objects are based on substream persistence?
				// This is an ole object
				uno::Reference< beans::XPropertySet > xProps( xStm, uno::UNO_QUERY_THROW );
				xProps->setPropertyValue(
					::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaType" ) ),
					uno::makeAny( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "application/vnd.sun.star.oleobject" ) ) ) );

                xStm->getOutputStream()->closeOutput();
            }
            catch ( uno::Exception& )
            {
                return sal_False;
            }
		}
		else
		{
            try
            {
                xCntnrStor->copyElementTo( aSrcObjName, xDocStor, rObjName );
            }
            catch ( uno::Exception& )
            {
                return sal_False;
            }
		}
	}

    // make object known to the container
    // TODO/LATER: could be done a little bit more efficient!
    ::rtl::OUString aName( rObjName );

	// TODO/LATER: The provided pClassId is ignored for now.
	//             The stream contains OLE storage internally and this storage already has a class id specifying the
	//             server that was used to create the object. pClassId could be used to specify the server that should
	//             be used for the next opening, but this information seems to be out of the file format responsibility
	//             area.
	rContainer.GetEmbeddedObject( aName );

	return sal_True;
}

// -----------------------------------------------------------------------------

::rtl::OUString SvXMLEmbeddedObjectHelper::ImplInsertEmbeddedObjectURL(
		const ::rtl::OUString& rURLStr )
{
	::rtl::OUString sRetURL;

	::rtl::OUString	aContainerStorageName, aObjectStorageName;
	if( !ImplGetStorageNames( rURLStr, aContainerStorageName,
							  aObjectStorageName,
							  EMBEDDEDOBJECTHELPER_MODE_WRITE == meCreateMode ) )
		return sRetURL;

	if( EMBEDDEDOBJECTHELPER_MODE_READ == meCreateMode )
	{
		OutputStorageWrapper_Impl *pOut = 0;
		SvXMLEmbeddedObjectHelper_Impl::iterator aIter;

		if( mpStreamMap )
		{
			aIter = mpStreamMap->find( rURLStr );
			if( aIter != mpStreamMap->end() && aIter->second )
				pOut = aIter->second;
		}

		SvGlobalName aClassId, *pClassId = 0;
		sal_Int32 nPos = aObjectStorageName.lastIndexOf( '!' );
		if( -1 != nPos && aClassId.MakeId( aObjectStorageName.copy( nPos+1 ) ) )
		{
			aObjectStorageName = aObjectStorageName.copy( 0, nPos );
			pClassId = &aClassId;
		}

        ImplReadObject( aContainerStorageName, aObjectStorageName, pClassId, pOut ? pOut->GetStream() : 0 );
        sRetURL = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(XML_EMBEDDEDOBJECT_URL_BASE) );
		sRetURL += aObjectStorageName;

		if( pOut )
		{
			mpStreamMap->erase( aIter );
			pOut->release();
		}
	}
	else
	{
		// Objects are written using ::comphelper::IEmbeddedHelper::SaveAs
		sRetURL = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("./") );
		if( aContainerStorageName.getLength() )
		{
			sRetURL += aContainerStorageName;
			sRetURL += ::rtl::OUString( '/' );
		}
		sRetURL += aObjectStorageName;
	}

	return sRetURL;
}

// -----------------------------------------------------------------------------

uno::Reference< io::XInputStream > SvXMLEmbeddedObjectHelper::ImplGetReplacementImage(
											const uno::Reference< embed::XEmbeddedObject >& xObj )
{
	uno::Reference< io::XInputStream > xStream;

	if( xObj.is() )
	{
		try
		{
			sal_Bool bSwitchBackToLoaded = sal_False;
			sal_Int32 nCurState = xObj->getCurrentState();
			if ( nCurState == embed::EmbedStates::LOADED || nCurState == embed::EmbedStates::RUNNING )
			{
				// means that the object is not active
				// copy replacement image from old to new container
				::rtl::OUString aMediaType;
				xStream = mpDocPersist->getEmbeddedObjectContainer().GetGraphicStream( xObj, &aMediaType );
			}

			if ( !xStream.is() )
			{
				// the image must be regenerated
				// TODO/LATER: another aspect could be used
				if ( nCurState == embed::EmbedStates::LOADED )
					bSwitchBackToLoaded = sal_True;

				::rtl::OUString aMediaType;
				xStream = svt::EmbeddedObjectRef::GetGraphicReplacementStream(
													embed::Aspects::MSOLE_CONTENT,
													xObj,
													&aMediaType );
			}

			if ( bSwitchBackToLoaded )
				// switch back to loaded state; that way we have a minimum cache confusion
				xObj->changeState( embed::EmbedStates::LOADED );
		}
		catch( uno::Exception& )
		{}
	}

	return xStream;
}

// -----------------------------------------------------------------------------

void SvXMLEmbeddedObjectHelper::Init(
        const uno::Reference < embed::XStorage >& rRootStorage,
        ::comphelper::IEmbeddedHelper& rPersist,
		SvXMLEmbeddedObjectHelperMode eCreateMode )
{
    mxRootStorage = rRootStorage;
	mpDocPersist = &rPersist;
	meCreateMode = eCreateMode;
}

// -----------------------------------------------------------------------------

SvXMLEmbeddedObjectHelper* SvXMLEmbeddedObjectHelper::Create(
        const uno::Reference < embed::XStorage >& rRootStorage,
        ::comphelper::IEmbeddedHelper& rDocPersist,
		SvXMLEmbeddedObjectHelperMode eCreateMode,
		sal_Bool bDirect )
{
	(void)bDirect;

	SvXMLEmbeddedObjectHelper* pThis = new SvXMLEmbeddedObjectHelper;

	pThis->acquire();
    pThis->Init( rRootStorage, rDocPersist, eCreateMode );

	return pThis;
}

SvXMLEmbeddedObjectHelper* SvXMLEmbeddedObjectHelper::Create(
        ::comphelper::IEmbeddedHelper& rDocPersist,
		SvXMLEmbeddedObjectHelperMode eCreateMode )
{
	SvXMLEmbeddedObjectHelper* pThis = new SvXMLEmbeddedObjectHelper;

	pThis->acquire();
	pThis->Init( 0, rDocPersist, eCreateMode );

	return pThis;
}

// -----------------------------------------------------------------------------

void SvXMLEmbeddedObjectHelper::Destroy(
		SvXMLEmbeddedObjectHelper* pSvXMLEmbeddedObjectHelper )
{
	if( pSvXMLEmbeddedObjectHelper )
	{
		pSvXMLEmbeddedObjectHelper->dispose();
		pSvXMLEmbeddedObjectHelper->release();
	}
}

// -----------------------------------------------------------------------------

void SvXMLEmbeddedObjectHelper::Flush()
{
	if( mxTempStorage.is() )
	{
		Reference < XComponent > xComp( mxTempStorage, UNO_QUERY );
		xComp->dispose();
	}
}

// XGraphicObjectResolver: alien objects!
::rtl::OUString SAL_CALL SvXMLEmbeddedObjectHelper::resolveEmbeddedObjectURL( const ::rtl::OUString& aURL )
	throw(RuntimeException)
{
	MutexGuard			aGuard( maMutex );

	return ImplInsertEmbeddedObjectURL( aURL );
}

// XNameAccess: alien objects!
Any SAL_CALL SvXMLEmbeddedObjectHelper::getByName(
		const ::rtl::OUString& rURLStr )
	throw (NoSuchElementException, WrappedTargetException, RuntimeException)
{
	MutexGuard			aGuard( maMutex );
	Any aRet;
	if( EMBEDDEDOBJECTHELPER_MODE_READ == meCreateMode )
	{
		Reference < XOutputStream > xStrm;
		if( mpStreamMap )
		{
			SvXMLEmbeddedObjectHelper_Impl::iterator aIter =
				mpStreamMap->find( rURLStr );
			if( aIter != mpStreamMap->end() && aIter->second )
				xStrm = aIter->second;
		}
		if( !xStrm.is() )
		{
			OutputStorageWrapper_Impl *pOut = new OutputStorageWrapper_Impl;
			pOut->acquire();
			if( !mpStreamMap )
				mpStreamMap = new SvXMLEmbeddedObjectHelper_Impl;
			(*mpStreamMap)[rURLStr] = pOut;
			xStrm = pOut;
		}

		aRet <<= xStrm;
	}
	else
	{
		sal_Bool bGraphicRepl = sal_False;
		sal_Bool bOasisFormat = sal_True;
		Reference < XInputStream > xStrm;
		::rtl::OUString aContainerStorageName, aObjectStorageName;
		if( ImplGetStorageNames( rURLStr, aContainerStorageName,
								 aObjectStorageName,
								 sal_True,
				   				 &bGraphicRepl,
								 &bOasisFormat ) )
		{
            try
            {
				comphelper::EmbeddedObjectContainer& rContainer =
						mpDocPersist->getEmbeddedObjectContainer();

    			Reference < embed::XEmbeddedObject > xObj = rContainer.GetEmbeddedObject( aObjectStorageName );
				DBG_ASSERT( xObj.is(), "Didn't get object" );

				if( xObj.is() )
				{
					if( bGraphicRepl )
					{
						xStrm = ImplGetReplacementImage( xObj );
					}
					else
					{
						Reference < embed::XEmbedPersist > xPersist( xObj, UNO_QUERY );
						if( xPersist.is() )
						{
							if( !mxTempStorage.is() )
								mxTempStorage =
									comphelper::OStorageHelper::GetTemporaryStorage();
							Sequence < beans::PropertyValue > aDummy( 0 ), aEmbDescr( 1 );
							aEmbDescr[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StoreVisualReplacement" ) );
					   		aEmbDescr[0].Value <<= (sal_Bool)(!bOasisFormat);
							if ( !bOasisFormat )
							{
								::rtl::OUString aMimeType;
								uno::Reference< io::XInputStream > xGrInStream = ImplGetReplacementImage( xObj );
								if ( xGrInStream.is() )
								{
									aEmbDescr.realloc( 2 );
									aEmbDescr[1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "VisualReplacement" ) );
									aEmbDescr[1].Value <<= xGrInStream;
								}
							}

							xPersist->storeToEntry( mxTempStorage, aObjectStorageName,
													aDummy, aEmbDescr );
							Reference < io::XStream > xStream =
								mxTempStorage->openStreamElement(
														aObjectStorageName,
														embed::ElementModes::READ);
							if( xStream.is() )
								xStrm = xStream->getInputStream();
						}
					}
				}
            }
            catch ( uno::Exception& )
            {
            }
		}

		aRet <<= xStrm;
	}

	return aRet;
}

Sequence< ::rtl::OUString > SAL_CALL SvXMLEmbeddedObjectHelper::getElementNames()
	throw (RuntimeException)
{
	MutexGuard			aGuard( maMutex );
	return Sequence< ::rtl::OUString >(0);
}

sal_Bool SAL_CALL SvXMLEmbeddedObjectHelper::hasByName( const ::rtl::OUString& rURLStr )
	throw (RuntimeException)
{
	MutexGuard			aGuard( maMutex );
	if( EMBEDDEDOBJECTHELPER_MODE_READ == meCreateMode )
	{
		return sal_True;
	}
	else
	{
		::rtl::OUString	aContainerStorageName, aObjectStorageName;
		if( !ImplGetStorageNames( rURLStr, aContainerStorageName,
								  aObjectStorageName,
								  sal_True ) )
			return sal_False;

        comphelper::EmbeddedObjectContainer& rContainer = mpDocPersist->getEmbeddedObjectContainer();
        return aObjectStorageName.getLength() > 0 &&
               rContainer.HasEmbeddedObject( aObjectStorageName );
	}
}

// XNameAccess
Type SAL_CALL SvXMLEmbeddedObjectHelper::getElementType()
	throw (RuntimeException)
{
	MutexGuard			aGuard( maMutex );
	if( EMBEDDEDOBJECTHELPER_MODE_READ == meCreateMode )
		return ::getCppuType((const Reference<XOutputStream>*)0);
	else
		return ::getCppuType((const Reference<XInputStream>*)0);
}

sal_Bool SAL_CALL SvXMLEmbeddedObjectHelper::hasElements()
	throw (RuntimeException)
{
	MutexGuard			aGuard( maMutex );
	if( EMBEDDEDOBJECTHELPER_MODE_READ == meCreateMode )
	{
		return sal_True;
	}
	else
	{
        comphelper::EmbeddedObjectContainer& rContainer = mpDocPersist->getEmbeddedObjectContainer();
        return rContainer.HasEmbeddedObjects();
    }
}
