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

#ifndef TRUST_POLICY_UTIL_H
#define	TRUST_POLICY_UTIL_H

#include <axutil_utils.h>
#include <rp_includes.h>
#include <rp_secpolicy.h>
#include <neethi_policy.h>
#include <rp_secpolicy_builder.h>

#ifdef	__cplusplus
extern "C"
{
#endif

    AXIS2_EXTERN rp_algorithmsuite_t *AXIS2_CALL
    trust_policy_util_get_algorithmsuite(
        const axutil_env_t * env,
        neethi_policy_t * policy,
		rp_secpolicy_t **secpolicy);

    AXIS2_EXTERN rp_binding_commons_t *AXIS2_CALL
    trust_policy_util_get_binding_commons(
        const axutil_env_t * env,
        rp_secpolicy_t * secpolicy);

    AXIS2_EXTERN rp_trust10_t *AXIS2_CALL
    trust_policy_util_get_trust10(
        const axutil_env_t * env,
        neethi_policy_t * policy,
		rp_secpolicy_t **secpolicy);

#ifdef	__cplusplus
}
#endif

#endif                          /* _TRUST_POLICY_UTIL_H */
