/**************************************************************
 *
 * 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"

/*
 * Implementation of the I/O interfaces based on stream and URI binding
 */
#include "errorcallback.hxx"

#include <sal/types.h>
//For reasons that escape me, this is what xmlsec does when size_t is not 4
#if SAL_TYPES_SIZEOFPOINTER != 4
#    define XMLSEC_NO_SIZE_T
#endif
#include "xmlsec/xmlsec.h"
#include "xmlsec/errors.h"

using namespace ::com::sun::star::xml::crypto;

// ::com::sun::star::uno::Reference< XXMLSecurityTemplate > g_xErrorRecorder;
// bool g_bErrorRecorded;

// SecurityOperationStatus getOperationStatus(int reason)
// {
// 	switch (reason)
// 	{
// 	case XMLSEC_ERRORS_R_XMLSEC_FAILED:
// 		return SecurityOperationStatus_ENGINE_FAILED;
// 	case XMLSEC_ERRORS_R_MALLOC_FAILED:
// 		return SecurityOperationStatus_MALLOC_FAILED;
// 	case XMLSEC_ERRORS_R_STRDUP_FAILED:
// 		return SecurityOperationStatus_STRDUP_FAILED;
// 	case XMLSEC_ERRORS_R_CRYPTO_FAILED:
// 		return SecurityOperationStatus_CRYPTO_FAILED;
// 	case XMLSEC_ERRORS_R_XML_FAILED:
// 		return SecurityOperationStatus_XML_FAILED;
// 	case XMLSEC_ERRORS_R_XSLT_FAILED:
// 		return SecurityOperationStatus_XSLT_FAILED;
// 	case XMLSEC_ERRORS_R_IO_FAILED:
// 		return SecurityOperationStatus_IO_FAILED;
// 	case XMLSEC_ERRORS_R_DISABLED:
// 		return SecurityOperationStatus_DISABLED;
// 	case XMLSEC_ERRORS_R_NOT_IMPLEMENTED:
// 		return SecurityOperationStatus_NOT_IMPLEMENTED;
// 	case XMLSEC_ERRORS_R_INVALID_SIZE:
// 		return SecurityOperationStatus_INVALID_SIZE;
// 	case XMLSEC_ERRORS_R_INVALID_DATA:
// 		return SecurityOperationStatus_INVALID_DATA;
// 	case XMLSEC_ERRORS_R_INVALID_RESULT:
// 		return SecurityOperationStatus_INVALID_RESULT;
// 	case XMLSEC_ERRORS_R_INVALID_TYPE:
// 		return SecurityOperationStatus_INVALID_TYPE;
// 	case XMLSEC_ERRORS_R_INVALID_OPERATION:
// 		return SecurityOperationStatus_INVALID_OPERATION;
// 	case XMLSEC_ERRORS_R_INVALID_STATUS:
// 		return SecurityOperationStatus_INVALID_STATUS;
// 	case XMLSEC_ERRORS_R_INVALID_FORMAT:
// 		return SecurityOperationStatus_INVALID_FORMAT;
// 	case XMLSEC_ERRORS_R_DATA_NOT_MATCH:
// 		return SecurityOperationStatus_DATA_NOT_MATCH;
// 	case XMLSEC_ERRORS_R_INVALID_NODE:
// 		return SecurityOperationStatus_INVALID_NODE;
// 	case XMLSEC_ERRORS_R_INVALID_NODE_CONTENT:
// 		return SecurityOperationStatus_INVALID_NODE_CONTENT;
// 	case XMLSEC_ERRORS_R_INVALID_NODE_ATTRIBUTE:
// 		return SecurityOperationStatus_INVALID_NODE_ATTRIBUTE;
// 	case XMLSEC_ERRORS_R_MISSING_NODE_ATTRIBUTE:
// 		return SecurityOperationStatus_MISSING_NODE_ATTRIBUTE;
// 	case XMLSEC_ERRORS_R_NODE_ALREADY_PRESENT:
// 		return SecurityOperationStatus_NODE_ALREADY_PRESENT;
// 	case XMLSEC_ERRORS_R_UNEXPECTED_NODE:
// 		return SecurityOperationStatus_UNEXPECTED_NODE;
// 	case XMLSEC_ERRORS_R_NODE_NOT_FOUND:
// 		return SecurityOperationStatus_NODE_NOT_FOUND;
// 	case XMLSEC_ERRORS_R_INVALID_TRANSFORM:
// 		return SecurityOperationStatus_INVALID_TRANSFORM;
// 	case XMLSEC_ERRORS_R_INVALID_TRANSFORM_KEY:
// 		return SecurityOperationStatus_INVALID_TRANSFORM_KEY;
// 	case XMLSEC_ERRORS_R_INVALID_URI_TYPE:
// 		return SecurityOperationStatus_INVALID_URI_TYPE;
// 	case XMLSEC_ERRORS_R_TRANSFORM_SAME_DOCUMENT_REQUIRED:
// 		return SecurityOperationStatus_TRANSFORM_SAME_DOCUMENT_REQUIRED;
// 	case XMLSEC_ERRORS_R_TRANSFORM_DISABLED:
// 		return SecurityOperationStatus_TRANSFORM_DISABLED;
// 	case XMLSEC_ERRORS_R_INVALID_KEY_DATA:
// 		return SecurityOperationStatus_INVALID_KEY_DATA;
// 	case XMLSEC_ERRORS_R_KEY_DATA_NOT_FOUND:
// 		return SecurityOperationStatus_KEY_DATA_NOT_FOUND;
// 	case XMLSEC_ERRORS_R_KEY_DATA_ALREADY_EXIST:
// 		return SecurityOperationStatus_KEY_DATA_ALREADY_EXIST;
// 	case XMLSEC_ERRORS_R_INVALID_KEY_DATA_SIZE:
// 		return SecurityOperationStatus_INVALID_KEY_DATA_SIZE;
// 	case XMLSEC_ERRORS_R_KEY_NOT_FOUND:
// 		return SecurityOperationStatus_KEY_NOT_FOUND;
// 	case XMLSEC_ERRORS_R_KEYDATA_DISABLED:
// 		return SecurityOperationStatus_KEYDATA_DISABLED;
// 	case XMLSEC_ERRORS_R_MAX_RETRIEVALS_LEVEL:
// 		return SecurityOperationStatus_MAX_RETRIEVALS_LEVEL;
// 	case XMLSEC_ERRORS_R_MAX_RETRIEVAL_TYPE_MISMATCH:
// 		return SecurityOperationStatus_MAX_RETRIEVAL_TYPE_MISMATCH;
// 	case XMLSEC_ERRORS_R_MAX_ENCKEY_LEVEL:
// 		return SecurityOperationStatus_MAX_ENCKEY_LEVEL;
// 	case XMLSEC_ERRORS_R_CERT_VERIFY_FAILED:
// 		return SecurityOperationStatus_CERT_VERIFY_FAILED;
// 	case XMLSEC_ERRORS_R_CERT_NOT_FOUND:
// 		return SecurityOperationStatus_CERT_NOT_FOUND;
// 	case XMLSEC_ERRORS_R_CERT_REVOKED:
// 		return SecurityOperationStatus_CERT_REVOKED;
// 	case XMLSEC_ERRORS_R_CERT_ISSUER_FAILED:
// 		return SecurityOperationStatus_CERT_ISSUER_FAILED;
// 	case XMLSEC_ERRORS_R_CERT_NOT_YET_VALID:
// 		return SecurityOperationStatus_CERT_NOT_YET_VALID;
// 	case XMLSEC_ERRORS_R_CERT_HAS_EXPIRED:
// 		return SecurityOperationStatus_CERT_HAS_EXPIRED;
// 	case XMLSEC_ERRORS_R_DSIG_NO_REFERENCES:
// 		return SecurityOperationStatus_DSIG_NO_REFERENCES;
// 	case XMLSEC_ERRORS_R_DSIG_INVALID_REFERENCE:
// 		return SecurityOperationStatus_DSIG_INVALID_REFERENCE;
// 	case XMLSEC_ERRORS_R_ASSERTION:
// 		return SecurityOperationStatus_ASSERTION;
// 	default:
// 		return SecurityOperationStatus_RUNTIMEERROR_FAILED;
// 	}
// }


extern "C"
void errorCallback(const char * /*file*/,
                   int /*line*/,
                   const char * /*func*/,
                   const char * /*errorObject*/,
                   const char * /*errorSubject*/,
                   int /*reason*/,
                   const char  * /*msg*/)
{
#if OSL_DEBUG_LEVEL > 1
//     const char * afunc = func ? func : "";
//     const char * errObj = errorObject ? errorObject : "";
//     const char * errSub = errorSubject ? errorSubject : "";
//     const char * amsg = msg ? msg : "";
// 	fprintf(stdout, "xmlsec error: %s, %s,  %s, %i %s  \n", afunc, errObj, errSub, reason, amsg);
#endif
    //ToDo write log message
// 	if (g_xErrorRecorder.is() && !g_bErrorRecorded)
// 	{
// 		g_xErrorRecorder->setStatus(getOperationStatus(reason));

// 		if ( reason != XMLSEC_ERRORS_R_ASSERTION && reason!=XMLSEC_ERRORS_R_XMLSEC_FAILED)
// 		{
//             g_bErrorRecorded = true;
// 		}
// 	}
}

// void setErrorRecorder(const ::com::sun::star::uno::Reference< ::com::sun::star::xml::crypto::XXMLSecurityTemplate >& xTemplate)
// {
// 	g_xErrorRecorder = xTemplate;
// 	g_xErrorRecorder->setStatus(SecurityOperationStatus_OPERATION_SUCCEEDED);
// 	g_bErrorRecorded = false;
// 	xmlSecErrorsSetCallback(errorCallback);
// }

//void setErrorRecorder(const ::com::sun::star::uno::Reference< ::com::sun::star::xml::crypto::XXMLSignatureTemplate >& xTemplate)

void setErrorRecorder()
{
// 	::com::sun::star::uno::Reference< ::com::sun::star::xml::crypto::XXMLSecurityTemplate >
// 		xSecurityTemplate(xTemplate, ::com::sun::star::uno::UNO_QUERY);
// 	setErrorRecorder( xSecurityTemplate );
    xmlSecErrorsSetCallback(errorCallback);
}

// void setErrorRecorder(const ::com::sun::star::uno::Reference< ::com::sun::star::xml::crypto::XXMLEncryptionTemplate >& xTemplate)
// {
// 	::com::sun::star::uno::Reference< ::com::sun::star::xml::crypto::XXMLSecurityTemplate >
// 		xSecurityTemplate(xTemplate, ::com::sun::star::uno::UNO_QUERY);
// 	setErrorRecorder( xSecurityTemplate );
// }

void clearErrorRecorder()
{
	xmlSecErrorsSetCallback(NULL);
//	g_xErrorRecorder = NULL;
}
