/**************************************************************
 * 
 * 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 "xsecparser.hxx"
#include <tools/debug.hxx>
#include "cppuhelper/exc_hlp.hxx"

#include <string.h>

namespace cssu = com::sun::star::uno;
namespace cssxs = com::sun::star::xml::sax;

#define RTL_ASCII_USTRINGPARAM( asciiStr ) asciiStr, strlen( asciiStr ), RTL_TEXTENCODING_ASCII_US

XSecParser::XSecParser(
	XSecController* pXSecController,
	const cssu::Reference< cssxs::XDocumentHandler >& xNextHandler )
	: m_pXSecController(pXSecController),
	  m_xNextHandler(xNextHandler),
	  m_bReferenceUnresolved(false)
{
}

rtl::OUString XSecParser::getIdAttr(const cssu::Reference< cssxs::XAttributeList >& xAttribs )
{
	rtl::OUString ouIdAttr = xAttribs->getValueByName(
		rtl::OUString(RTL_ASCII_USTRINGPARAM("id")));
		
	if (ouIdAttr == NULL) 
	{
		ouIdAttr = xAttribs->getValueByName(
			rtl::OUString(RTL_ASCII_USTRINGPARAM("Id")));
	}
	
	return ouIdAttr;
}

/*
 * XDocumentHandler 
 */
void SAL_CALL XSecParser::startDocument(  )
	throw (cssxs::SAXException, cssu::RuntimeException)
{
	m_bInX509IssuerName = false;
	m_bInX509SerialNumber = false;
	m_bInX509Certificate = false;
	m_bInSignatureValue = false;
	m_bInDigestValue = false;
	m_bInDate = false;
	//m_bInTime = false;
	
	if (m_xNextHandler.is())
	{
		m_xNextHandler->startDocument();
	}
}
	
void SAL_CALL XSecParser::endDocument(  )
	throw (cssxs::SAXException, cssu::RuntimeException)
{
	if (m_xNextHandler.is())
	{
		m_xNextHandler->endDocument();
	}
}

void SAL_CALL XSecParser::startElement(
	const rtl::OUString& aName,
	const cssu::Reference< cssxs::XAttributeList >& xAttribs )
	throw (cssxs::SAXException, cssu::RuntimeException)
{
	try
	{
		rtl::OUString ouIdAttr = getIdAttr(xAttribs);
		if (ouIdAttr != NULL)
		{
			m_pXSecController->collectToVerify( ouIdAttr );
		}
		
		if ( aName == rtl::OUString(RTL_ASCII_USTRINGPARAM(TAG_SIGNATURE)) )
		{
			m_pXSecController->addSignature();
			if (ouIdAttr != NULL)
			{
				m_pXSecController->setId( ouIdAttr );
			}
		}
		else if ( aName == rtl::OUString(RTL_ASCII_USTRINGPARAM(TAG_REFERENCE)) )
		{
			rtl::OUString ouUri = xAttribs->getValueByName(rtl::OUString(RTL_ASCII_USTRINGPARAM(ATTR_URI)));
			DBG_ASSERT( ouUri != NULL, "URI == NULL" );
			
			if (0 == ouUri.compareTo(rtl::OUString(RTL_ASCII_USTRINGPARAM(CHAR_FRAGMENT)),1))
			{
				/*
				* remove the first character '#' from the attribute value
				*/
				m_pXSecController->addReference( ouUri.copy(1) );
			}
			else
			{
				/*
				* remember the uri
				*/
				m_currentReferenceURI = ouUri;
				m_bReferenceUnresolved = true;
			}
		}
			else if (aName == rtl::OUString(RTL_ASCII_USTRINGPARAM(TAG_TRANSFORM)))
			{
			if ( m_bReferenceUnresolved )
			{
				rtl::OUString ouAlgorithm = xAttribs->getValueByName(rtl::OUString(RTL_ASCII_USTRINGPARAM(ATTR_ALGORITHM)));
				
				if (ouAlgorithm != NULL && ouAlgorithm == rtl::OUString(RTL_ASCII_USTRINGPARAM(ALGO_C14N)))
				/*
				* a xml stream
				*/
				{
					m_pXSecController->addStreamReference( m_currentReferenceURI, sal_False);
					m_bReferenceUnresolved = false;
				}
			}
			}
			else if (aName == rtl::OUString(RTL_ASCII_USTRINGPARAM(TAG_X509ISSUERNAME)))
			{
			m_ouX509IssuerName = rtl::OUString::createFromAscii("");
			m_bInX509IssuerName = true;
			}
			else if (aName == rtl::OUString(RTL_ASCII_USTRINGPARAM(TAG_X509SERIALNUMBER)))
			{
			m_ouX509SerialNumber = rtl::OUString::createFromAscii("");
			m_bInX509SerialNumber = true;
			}
			else if (aName == rtl::OUString(RTL_ASCII_USTRINGPARAM(TAG_X509CERTIFICATE)))
			{
			m_ouX509Certificate = rtl::OUString::createFromAscii("");
			m_bInX509Certificate = true;
			}
			else if (aName == rtl::OUString(RTL_ASCII_USTRINGPARAM(TAG_SIGNATUREVALUE)))
			{
			m_ouSignatureValue = rtl::OUString::createFromAscii("");
        		m_bInSignatureValue = true;
			}
			else if (aName == rtl::OUString(RTL_ASCII_USTRINGPARAM(TAG_DIGESTVALUE)))
			{
			m_ouDigestValue = rtl::OUString::createFromAscii("");
        		m_bInDigestValue = true;
			}
			else if ( aName == rtl::OUString(RTL_ASCII_USTRINGPARAM(TAG_SIGNATUREPROPERTY)) )
		{
			if (ouIdAttr != NULL)
			{
				m_pXSecController->setPropertyId( ouIdAttr );
			}
		}
			else if (aName == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(NSTAG_DC))
        				+rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":"))
        				+rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(TAG_DATE)))
			{
			m_ouDate = rtl::OUString::createFromAscii("");
        		m_bInDate = true;
			}
			/*
			else if (aName == rtl::OUString(RTL_ASCII_USTRINGPARAM(TAG_TIME)))
			{
			m_ouTime = rtl::OUString::createFromAscii("");
        		m_bInTime = true;
			}
			*/
			
		if (m_xNextHandler.is())
		{
			m_xNextHandler->startElement(aName, xAttribs);
		}
	}
	catch (cssu::Exception& )
	{//getCaughtException MUST be the first line in the catch block
        cssu::Any exc =  cppu::getCaughtException();
        throw cssxs::SAXException(
			rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
                              "xmlsecurity: Exception in XSecParser::startElement")),
            0, exc);
	}
	catch (...)
	{
		throw cssxs::SAXException(
			rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("xmlsecurity: unexpected exception in XSecParser::startElement")), 0,
			cssu::Any());
	}
}
	
void SAL_CALL XSecParser::endElement( const rtl::OUString& aName ) 
	throw (cssxs::SAXException, cssu::RuntimeException)
{
	try 
	{
        if (aName == rtl::OUString(RTL_ASCII_USTRINGPARAM(TAG_DIGESTVALUE)))
			{
        		m_bInDigestValue = false;
			}
		else if ( aName == rtl::OUString(RTL_ASCII_USTRINGPARAM(TAG_REFERENCE)) )
		{
			if ( m_bReferenceUnresolved )
			/*
			* it must be a octet stream
			*/
			{
				m_pXSecController->addStreamReference( m_currentReferenceURI, sal_True);
				m_bReferenceUnresolved = false;
			}
			
			m_pXSecController->setDigestValue( m_ouDigestValue );
		}
		else if ( aName == rtl::OUString(RTL_ASCII_USTRINGPARAM(TAG_SIGNEDINFO)) )
		{
			m_pXSecController->setReferenceCount();
		}
		else if ( aName == rtl::OUString(RTL_ASCII_USTRINGPARAM(TAG_SIGNATUREVALUE)) )
		{
			m_pXSecController->setSignatureValue( m_ouSignatureValue );
        		m_bInSignatureValue = false;
		}
			else if (aName == rtl::OUString(RTL_ASCII_USTRINGPARAM(TAG_X509ISSUERNAME)))
			{
			m_pXSecController->setX509IssuerName( m_ouX509IssuerName );
			m_bInX509IssuerName = false;
			}
			else if (aName == rtl::OUString(RTL_ASCII_USTRINGPARAM(TAG_X509SERIALNUMBER)))
			{
			m_pXSecController->setX509SerialNumber( m_ouX509SerialNumber );
			m_bInX509SerialNumber = false;
			}
			else if (aName == rtl::OUString(RTL_ASCII_USTRINGPARAM(TAG_X509CERTIFICATE)))
			{
			m_pXSecController->setX509Certificate( m_ouX509Certificate );
			m_bInX509Certificate = false;
			}
			else if (aName == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(NSTAG_DC))
        				+rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":"))
        				+rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(TAG_DATE)))
		{
			m_pXSecController->setDate( m_ouDate );
        		m_bInDate = false;
		}
		/*
		else if ( aName == rtl::OUString(RTL_ASCII_USTRINGPARAM(TAG_TIME)) )
		{
			m_pXSecController->setTime( m_ouTime );
        		m_bInTime = false;
		}
		*/

		if (m_xNextHandler.is())
		{
			m_xNextHandler->endElement(aName);
		}
	}
	catch (cssu::Exception& )
	{//getCaughtException MUST be the first line in the catch block
        cssu::Any exc =  cppu::getCaughtException();
        throw cssxs::SAXException(
			rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
                              "xmlsecurity: Exception in XSecParser::endElement")),
            0, exc);
	}
	catch (...)
	{
		throw cssxs::SAXException(
			rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("xmlsecurity: unexpected exception in XSecParser::endElement")), 0,
			cssu::Any());
	}
}
	
void SAL_CALL XSecParser::characters( const rtl::OUString& aChars )
	throw (cssxs::SAXException, cssu::RuntimeException)
{
	if (m_bInX509IssuerName)
	{
		m_ouX509IssuerName += aChars;
	}
	else if (m_bInX509SerialNumber)
	{
		m_ouX509SerialNumber += aChars;
	}
	else if (m_bInX509Certificate)
	{
		m_ouX509Certificate += aChars;
	}
	else if (m_bInSignatureValue)
	{
		m_ouSignatureValue += aChars;
	}
	else if (m_bInDigestValue)
	{
		m_ouDigestValue += aChars;
	}
	else if (m_bInDate)
	{
		m_ouDate += aChars;
	}
	/*
	else if (m_bInTime)
	{
		m_ouTime += aChars;
	} 
	*/
	
	if (m_xNextHandler.is())
	{
		m_xNextHandler->characters(aChars);
        }
}
	
void SAL_CALL XSecParser::ignorableWhitespace( const rtl::OUString& aWhitespaces )
	throw (cssxs::SAXException, cssu::RuntimeException)
{
	if (m_xNextHandler.is())
	{
		m_xNextHandler->ignorableWhitespace( aWhitespaces );
        }
}
	
void SAL_CALL XSecParser::processingInstruction( const rtl::OUString& aTarget, const rtl::OUString& aData )
	throw (cssxs::SAXException, cssu::RuntimeException)
{
	if (m_xNextHandler.is())
	{
		m_xNextHandler->processingInstruction(aTarget, aData);
        }
}
	
void SAL_CALL XSecParser::setDocumentLocator( const cssu::Reference< cssxs::XLocator >& xLocator )
	throw (cssxs::SAXException, cssu::RuntimeException)
{
	if (m_xNextHandler.is())
	{
		m_xNextHandler->setDocumentLocator( xLocator );
        }
}

/*
 * XInitialization
 */
void SAL_CALL XSecParser::initialize(
	const cssu::Sequence< cssu::Any >& aArguments )
	throw(cssu::Exception, cssu::RuntimeException)
{
	aArguments[0] >>= m_xNextHandler;
}
