/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed 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.
 */


#include "php.h"
#include "php_axis2.h"
#include <axis2_om_node.h>
#include <axis2_om_element.h>
#include <axis2_allocator.h>
#include <axis2_env.h>

zend_function_entry php_axis2_om_element_class_functions[]=
{
    PHP_FALIAS(findNamespace , axis2_om_element_find_namespace, NULL)
    PHP_FALIAS(declareNamespace , axis2_om_element_declare_namespace, NULL)
    PHP_FALIAS(findNamespaceWithQname , axis2_om_element_find_namespace_with_qname, NULL)
    PHP_FALIAS(addAttribute , axis2_om_element_add_attribute, NULL)
    PHP_FALIAS(getAttribute , axis2_om_element_get_attribute, NULL)
    PHP_FALIAS(findDeclaredNamespace , axis2_om_element_find_declared_namespace, NULL)
    PHP_FALIAS(getLocalname , axis2_om_element_get_localname, NULL)
    PHP_FALIAS(getNamespace , axis2_om_element_get_namespace, NULL)
    PHP_FALIAS(setNamespace , axis2_om_element_set_namespace, NULL)
    PHP_FALIAS(setLocalname , axis2_om_element_set_localname, NULL)
    PHP_ME(om_element, __construct, NULL, ZEND_ACC_PUBLIC)
    {NULL, NULL, NULL}
};

PHP_METHOD(om_element, __construct)
{
    axis2_object_ptr intern = NULL;
    axis2_object_ptr intern_parent = NULL;
    axis2_object_ptr intern_ns = NULL;
    
    om_node_ptr node_obj = NULL;
    om_node_ptr node_obj_parent = NULL;
    om_object_ptr om_obj_ns = NULL;
    
    zval *object = NULL;
    zval *object_parent = NULL;
    zval *object_ns = NULL;
    
    axis2_env_t *env = NULL;
    char *lname = NULL;
    int lname_len = 0;
    char *n = NULL;

    axis2_om_element_t *om_element = NULL;
    axis2_om_node_t *node = NULL;
    axis2_om_node_t *node_parent = NULL;
    axis2_om_namespace_t *ns = NULL;
    
    if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
             getThis(), "OO!sO!",&object, axis2_om_element_class_entry, &object_parent,
                    axis2_om_node_class_entry, &lname, &lname_len,
                    &object_ns, axis2_om_namespace_class_entry) == FAILURE)
    {
        php_std_error_handling();
        return;
    }
    env = php_axis2_get_env();
    
    intern = (axis2_object_ptr)zend_object_store_get_object(object TSRMLS_CC);
    node_obj = (om_node_ptr)emalloc(sizeof(om_node_t));
    node_obj->builder = NULL;
    node_obj->doc = NULL;
    node_obj->node_type = OM_ELEMENT;
    
    if(object_parent)
    {
        AXIS2_GET_OBJ(node_obj_parent, object_parent, om_node_ptr, intern_parent);
        if(node_obj_parent && node_obj_parent->ptr)
            node_parent = (axis2_om_node_t *)(node_obj_parent->ptr);
    }
    if(object_ns)
    {
        AXIS2_GET_OBJ(om_obj_ns, object_ns, om_object_ptr, intern_ns);
        if(om_obj_ns && om_obj_ns->ptr)
            ns = (axis2_om_namespace_t *)(om_obj_ns->ptr);
    }
    
    om_element = axis2_om_element_create(&env, node_parent, lname, ns, &node);
    node_obj->ptr = node;
    intern->obj_type = OM_NODE_OBJ;
    intern->ptr = node_obj;
}


PHP_FUNCTION(axis2_om_element_get_localname)
{
    axis2_object_ptr intern = NULL;
    om_node_ptr node_obj = NULL;
    
    zval *object = NULL;
    
    axis2_env_t *env = NULL;
    char *localname = NULL;
    axis2_om_element_t *om_element = NULL;
    axis2_om_node_t *node = NULL;

    AXIS2_GET_THIS(object);
    
    env = php_axis2_get_env();
    
    AXIS2_GET_OBJ(node_obj, object, om_node_ptr, intern);
    node = (axis2_om_node_t*)(node_obj->ptr);
    om_element = (axis2_om_element_t*)AXIS2_OM_NODE_GET_DATA_ELEMENT(node , &env);
   
    localname = AXIS2_OM_ELEMENT_GET_LOCALNAME(om_element, &env);
    if(localname)
    {
        RETURN_STRING(localname, 1);
    }
    RETURN_NULL();
}


PHP_FUNCTION(axis2_om_element_get_namespace)
{
    axis2_object_ptr intern = NULL;
    om_node_ptr node_obj = NULL;
    zval *object = NULL;
    zval *object_ns = NULL;
    
    axis2_env_t *env = NULL;
    axis2_om_element_t *om_element = NULL;
    axis2_om_node_t *node = NULL;
    axis2_om_namespace_t *ns = NULL;
   
    AXIS2_GET_THIS(object);
    env = php_axis2_get_env();
    AXIS2_GET_OBJ(node_obj, object, om_node_ptr, intern);
    
    node = (axis2_om_node_t*)(node_obj->ptr);
    om_element = (axis2_om_element_t*)AXIS2_OM_NODE_GET_DATA_ELEMENT(node , &env);
   
    ns = AXIS2_OM_ELEMENT_GET_NAMESPACE(om_element, &env);
    if(ns)
    {
        object_ns = php_axis2_create_om_object(ns, OM_OBJ, axis2_om_namespace_class_entry TSRMLS_CC);         
        RETURN_ZVAL(object_ns, NULL, NULL);
    }
    RETURN_NULL();
}

PHP_FUNCTION(axis2_om_element_get_attribute)
{
    axis2_object_ptr intern = NULL;
    axis2_object_ptr intern_qname = NULL;
    
    om_node_ptr node_obj = NULL;
    om_object_ptr qname_obj = NULL;
    
    zval *object = NULL;
    zval *object_attr = NULL;
    zval *object_qname = NULL;
    
    axis2_env_t *env = NULL;
    axis2_om_element_t *om_element = NULL;
    axis2_om_node_t *node = NULL;
    axis2_om_attribute_t *attr = NULL;
    axis2_qname_t *qname = NULL;
   
    if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
             getThis(), "OO",&object, axis2_om_element_class_entry, &object_qname,
                    axis2_qname_class_entry) == FAILURE)
    {
        php_std_error_handling();
        return;
    }
    env = php_axis2_get_env();
    
    AXIS2_GET_OBJ(node_obj, object, om_node_ptr, intern);
    AXIS2_GET_OBJ(qname_obj, object_qname, om_object_ptr, intern_qname);
    
    node = (axis2_om_node_t*)(node_obj->ptr);
    om_element = (axis2_om_element_t*)AXIS2_OM_NODE_GET_DATA_ELEMENT(node , &env);
    qname = (axis2_qname_t *)(qname_obj->ptr);
    
    attr = AXIS2_OM_ELEMENT_GET_ATTRIBUTE(om_element, &env, qname);
    if(attr)
    {
        object_attr = php_axis2_create_om_object(attr, OM_OBJ, axis2_om_attribute_class_entry TSRMLS_CC);         
        RETURN_ZVAL(object_attr, NULL, NULL);
    }
    RETURN_NULL();
}


PHP_FUNCTION(axis2_om_element_add_attribute)
{
    axis2_object_ptr intern = NULL;
    axis2_object_ptr intern_attr = NULL;
    
    om_node_ptr node_obj = NULL;
    om_object_ptr attr_obj = NULL;
    
    zval *object = NULL;
    zval *object_attr = NULL;
    
    axis2_env_t *env = NULL;
    axis2_om_element_t *om_element = NULL;
    axis2_om_node_t *node = NULL;
    axis2_om_attribute_t *attr = NULL;
   
    if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
             getThis(), "OO",&object, axis2_om_element_class_entry, &object_attr,
                    axis2_om_attribute_class_entry) == FAILURE)
    {
        php_std_error_handling();
        return;
    }
    env = php_axis2_get_env();
    
    AXIS2_GET_OBJ(node_obj, object, om_node_ptr, intern);
    AXIS2_GET_OBJ(attr_obj, object_attr, om_object_ptr, intern_attr);
    
    node = (axis2_om_node_t*)(node_obj->ptr);
    om_element = (axis2_om_element_t*)AXIS2_OM_NODE_GET_DATA_ELEMENT(node , &env);
    attr = (axis2_om_attribute_t *)(attr_obj->ptr);
    if(attr)
    {
        AXIS2_OM_ELEMENT_ADD_ATTRIBUTE(om_element, &env, attr, node);
    }
}


PHP_FUNCTION(axis2_om_element_set_namespace)
{
    axis2_object_ptr intern = NULL;
    axis2_object_ptr intern_ns = NULL;
    
    om_node_ptr node_obj = NULL;
    om_object_ptr om_obj = NULL;
    
    zval *object = NULL;
    zval *object_ns = NULL;
    
    axis2_env_t *env = NULL;
    axis2_om_element_t *om_element = NULL;
    axis2_om_node_t *node = NULL;
    axis2_om_namespace_t *ns = NULL;
   
    if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
             getThis(), "OO",&object, axis2_om_element_class_entry, &object_ns,
                    axis2_om_namespace_class_entry) == FAILURE)
    {
        php_std_error_handling();
        return;
    }
    env = php_axis2_get_env();
    
    AXIS2_GET_OBJ(node_obj, object, om_node_ptr, intern);
    AXIS2_GET_OBJ(om_obj, object_ns , om_object_ptr, intern_ns);
    
    node = (axis2_om_node_t*)(node_obj->ptr);
    om_element = (axis2_om_element_t*)AXIS2_OM_NODE_GET_DATA_ELEMENT(node , &env);
    ns  = (axis2_om_namespace_t *)(om_obj->ptr);
    if(ns)
    {
        AXIS2_OM_ELEMENT_SET_NAMESPACE(om_element, &env, ns, node);
    }
}


PHP_FUNCTION(axis2_om_element_set_localname)
{
    axis2_object_ptr intern = NULL;
    om_node_ptr node_obj = NULL;
    zval *object = NULL;

    char *localname = NULL;
    int lnamelen = 0;
    
    axis2_env_t *env = NULL;
    axis2_om_element_t *om_element = NULL;
    axis2_om_node_t *node = NULL;
   
    if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
             getThis(), "Os",&object, axis2_om_element_class_entry, &localname,
                    &lnamelen) == FAILURE)
    {
        php_std_error_handling();
        return;
    }
    env = php_axis2_get_env();
    
    AXIS2_GET_OBJ(node_obj, object, om_node_ptr, intern);
    
    node = (axis2_om_node_t*)(node_obj->ptr);
    om_element = (axis2_om_element_t*)AXIS2_OM_NODE_GET_DATA_ELEMENT(node , &env);
    if(om_element)
    {
        AXIS2_OM_ELEMENT_SET_LOCALNAME(om_element, &env, localname);
    }
}

PHP_FUNCTION(axis2_om_element_find_namespace){}
PHP_FUNCTION(axis2_om_element_declare_namespace){}
PHP_FUNCTION(axis2_om_element_find_namespace_with_qname){}
PHP_FUNCTION(axis2_om_element_find_declared_namespace){}