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

#include <xmlsecurity/xmlsignaturehelper.hxx>
#include <xmlsignaturehelper2.hxx>

#include <tools/solar.h>
#include <unotools/streamhelper.hxx>

#include <com/sun/star/embed/XStorage.hpp>
#include <com/sun/star/embed/XStorageRawAccess.hpp>
#include <com/sun/star/embed/ElementModes.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include "rtl/uri.hxx"

using namespace com::sun::star;

ImplXMLSignatureListener::ImplXMLSignatureListener( const Link& rCreationResultListenerListener, const Link rVerifyResultListenerListener, const Link rStartSignatureElement )
{
    maCreationResultListenerListener = rCreationResultListenerListener;
    maVerifyResultListenerListener = rVerifyResultListenerListener;
    maStartVerifySignatureElementListener = rStartSignatureElement;

}
ImplXMLSignatureListener::~ImplXMLSignatureListener()
{
}

void ImplXMLSignatureListener::setNextHandler(
	uno::Reference< xml::sax::XDocumentHandler > xNextHandler)
{
	m_xNextHandler = xNextHandler;
}

void SAL_CALL ImplXMLSignatureListener::signatureCreated( sal_Int32 securityId, com::sun::star::xml::crypto::SecurityOperationStatus nResult )
		throw (com::sun::star::uno::RuntimeException)
{
    XMLSignatureCreationResult aResult( securityId, nResult );
    maCreationResultListenerListener.Call( &aResult );
}

void SAL_CALL ImplXMLSignatureListener::signatureVerified( sal_Int32 securityId, com::sun::star::xml::crypto::SecurityOperationStatus nResult )
		throw (com::sun::star::uno::RuntimeException)
{
    XMLSignatureVerifyResult aResult( securityId, nResult );
    maVerifyResultListenerListener.Call( &aResult );
}

// ---------------------------------------------------------------------------------
// XDocumentHandler 
// ---------------------------------------------------------------------------------
void SAL_CALL ImplXMLSignatureListener::startDocument(  )
	throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException)
{
	if (m_xNextHandler.is())
	{
		m_xNextHandler->startDocument();
	}
}
	
void SAL_CALL ImplXMLSignatureListener::endDocument(  )
	throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException)
{
	if (m_xNextHandler.is())
	{
		m_xNextHandler->endDocument();
	}
}

void SAL_CALL ImplXMLSignatureListener::startElement( const rtl::OUString& aName, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList >& xAttribs )
		throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException)
{
	if ( aName == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Signature")) )
	{
        	maStartVerifySignatureElementListener.Call( (void*)&xAttribs );
	}

	if (m_xNextHandler.is())
	{
		m_xNextHandler->startElement( aName, xAttribs );
	}
}
	
void SAL_CALL ImplXMLSignatureListener::endElement( const rtl::OUString& aName ) 
	throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException)
{
	if (m_xNextHandler.is())
	{
		m_xNextHandler->endElement( aName );
	}
}
	
void SAL_CALL ImplXMLSignatureListener::characters( const rtl::OUString& aChars )
	throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException)
{
	if (m_xNextHandler.is())
	{
		m_xNextHandler->characters( aChars );
	}
}
	
void SAL_CALL ImplXMLSignatureListener::ignorableWhitespace( const rtl::OUString& aWhitespaces )
	throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException)
{
	if (m_xNextHandler.is())
	{
		m_xNextHandler->ignorableWhitespace( aWhitespaces );
	}
}
	
void SAL_CALL ImplXMLSignatureListener::processingInstruction( const rtl::OUString& aTarget, const rtl::OUString& aData )
	throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException)
{
	if (m_xNextHandler.is())
	{
		m_xNextHandler->processingInstruction( aTarget, aData );
	}
}
	
void SAL_CALL ImplXMLSignatureListener::setDocumentLocator( const com::sun::star::uno::Reference< com::sun::star::xml::sax::XLocator >& xLocator )
	throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException)
{
	if (m_xNextHandler.is())
	{
		m_xNextHandler->setDocumentLocator( xLocator );
	}
}

// ---------------------------------------------------------------------------------
// XUriBinding 
// ---------------------------------------------------------------------------------

UriBindingHelper::UriBindingHelper()
{
}

UriBindingHelper::UriBindingHelper( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& rxStorage )
{
    mxStorage = rxStorage;
}


void SAL_CALL UriBindingHelper::setUriBinding( const rtl::OUString& /*uri*/, const uno::Reference< io::XInputStream >&) 
    throw (uno::Exception, uno::RuntimeException)
{
}
	
uno::Reference< io::XInputStream > SAL_CALL UriBindingHelper::getUriBinding( const rtl::OUString& uri )
	throw (uno::Exception, uno::RuntimeException)
{
    uno::Reference< io::XInputStream > xInputStream;
    if ( mxStorage.is() )
    {
        xInputStream = OpenInputStream( mxStorage, uri );
    }
    else
    {
        SvFileStream* pStream = new SvFileStream( uri, STREAM_READ );
        pStream->Seek( STREAM_SEEK_TO_END );
        sal_uLong nBytes = pStream->Tell();
        pStream->Seek( STREAM_SEEK_TO_BEGIN );
        SvLockBytesRef xLockBytes = new SvLockBytes( pStream, sal_True );
        xInputStream = new utl::OInputStreamHelper( xLockBytes, nBytes );
    }
    return xInputStream;
}

uno::Reference < io::XInputStream > UriBindingHelper::OpenInputStream( const uno::Reference < embed::XStorage >& rxStore, const rtl::OUString& rURI )
{
    OSL_ASSERT(rURI.getLength());
    uno::Reference < io::XInputStream > xInStream;

    sal_Int32 nSepPos = rURI.indexOf( '/' );
    if ( nSepPos == -1 )
    {
        // Cloning because of I can't keep all storage references open
        // MBA with think about a better API...
        const ::rtl::OUString sName = ::rtl::Uri::decode(
            rURI, rtl_UriDecodeStrict, rtl_UriCharClassRelSegment);
        if (sName.getLength() == 0 && rURI.getLength() != 0)
            throw uno::Exception(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
            "Could not decode URI for stream element.")), 0);

        uno::Reference< io::XStream > xStream;
        xStream = rxStore->cloneStreamElement( sName );
        if ( !xStream.is() )
            throw uno::RuntimeException();
        xInStream = xStream->getInputStream();
    }
    else
    {
        const rtl::OUString aStoreName = ::rtl::Uri::decode(
            rURI.copy( 0, nSepPos ), rtl_UriDecodeStrict, rtl_UriCharClassRelSegment);
        if (aStoreName.getLength() == 0 && rURI.getLength() != 0)
            throw uno::Exception(
            ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
            "Could not decode URI for stream element.")), 0);

        rtl::OUString aElement = rURI.copy( nSepPos+1 );
        uno::Reference < embed::XStorage > xSubStore = rxStore->openStorageElement( aStoreName, embed::ElementModes::READ );
        xInStream = OpenInputStream( xSubStore, aElement );
    }
    return xInStream;
}


