/*
 * This file was auto-generated by the Axis C++ Web Service Generator (WSDL2Ws)
 * This file contains definitions of the web service
 */

#include "ComplexLists.hpp"


ComplexLists::ComplexLists()
{
}

ComplexLists::~ComplexLists()
{
}

/* This function is called by the AxisEngine when something went wrong
 with the current web service request processing. Appropriate actions should
 be taken here.*/
void ComplexLists::onFault()
{
}

attrlisterr* ComplexLists::multilist(m_list* Value0, attrlist* Value1)  
{
    xsd__string input_string;
    xsd__string input_string2;

    if (Value0)
    {
        int size = 0;
        const xsd__string * items = Value0->getitem()->get(size);
        if (size >= 1 && items[0])
        {
            input_string = new char[strlen(items[0]) + 1];
            strcpy(input_string, items[0]);
        }
        else
        {
            input_string = new char[strlen("attrlist->m_list-item[0] was NULL") + 1];
            strcpy(input_string, "attrlist->m_list-item[0] was NULL");
        }

        if (size >= 2 && items[1])
        {
            input_string2 = new char[strlen(items[1]) + 1];
            strcpy(input_string2, items[1]);
        }
        else
        {
            input_string2 = new char[strlen("attrlist->m_list-item[1] was NULL") + 1];
            strcpy(input_string2, "attrlist->m_list-item[1] was NULL");
        }
    }
    else
    {
        input_string = new char[strlen("attrlist->m_list-item[0] was NULL") + 1];
        strcpy(input_string, "attrlist->m_list-item[0] was NULL");

        input_string2 = new char[strlen("attrlist->m_list-item[1] was NULL") + 1];
        strcpy(input_string2, "attrlist->m_list-item[1] was NULL");
    }

    attrlisterr * ale = new attrlisterr();
    attrlist * al = new attrlist();
    m_list * ml = new m_list();
    m_list * ml2 = new m_list();
    namepair * np = new namepair();
    namepair * np2 = new namepair();
    namepair ** np_array = new namepair*[2];
    namepair_Array * np_arr = new namepair_Array;
    xsd__string * str_array = new xsd__string[2];
    xsd__string_Array * str_arr = new xsd__string_Array;
    xsd__string * str_array2 = new xsd__string[2];
    xsd__string_Array * str_arr2 = new xsd__string_Array;

    str_array[0] = input_string;
    str_array[1] = NULL;
    str_arr->set(str_array, 2);
    delete [] str_array[0];
    delete [] str_array;

    ml->setitem(str_arr);
    delete str_arr;

    np->setm_list_Ref(ml);
    np->setname("namepair return");

    str_array2[0] = input_string2;
    str_array2[1] = NULL;
    str_arr2->set(str_array2, 2);
    delete [] str_array2[0];
    delete [] str_array2;

    ml2->setitem(str_arr2);
    delete str_arr2;

    np2->setm_list_Ref(ml2);
    np2->setname("namepair2 return");

    np_array[0] = np;
    np_array[1] = np2;
    np_arr->set(np_array, 2);
    delete np_array[0];
    delete np_array[1];
    delete [] np_array;

    al->setitem(np_arr);
    delete np_arr;

    ale->setattrlist_Ref(al);
    ale->seterrorcode(007);
    ale->seterrortext("request successful");

    delete Value0;
    delete Value1;

    return ale;
}

attrlisterr* ComplexLists::multilistnil(m_list* Value0, attrlist* Value1)  
{
    delete Value0;
    delete Value1;
    attrlisterr * pReturn = new attrlisterr();
    pReturn->seterrorcode(0);
    return pReturn;
}
attrlisterr* ComplexLists::complexlist(attrlist* Value0, xsd__string Value1, attrlist* Value2)  
{
    xsd__string input_string;
    xsd__string input_string2;

    bool success = false;
    if (Value0)
    {
        int size = 0;
        namepair ** items = Value0->getitem()->get(size);
        if (size >= 1 && items[0])
        {
            m_list * ml = items[0]->getm_list_Ref();
            const xsd__string * stringItems = ml->getitem()->get(size);
            if (size >= 1 && stringItems[0])
            {
                input_string = new char[strlen(stringItems[0]) + 1];
                strcpy(input_string, stringItems[0]);
                success = true;
            }
        }
    }
    if (!success)
    {
        input_string = new char[strlen("arg1 attrlist->m_list-item[0] was NULL") + 1];
        strcpy(input_string, "arg1 attrlist->m_list-item[0] was NULL");
    }

    success = false;
    if (Value2)
    {
        bool success = false;
        int size = 0;
        namepair ** items = Value2->getitem()->get(size);
        if (size >= 1 && items[0])
        {
            m_list * ml = items[0]->getm_list_Ref();
            const xsd__string * stringItems = ml->getitem()->get(size);
            if (size >= 1 && stringItems[0])
            {
                input_string2 = new char[strlen(stringItems[0]) + 1];
                strcpy(input_string2, stringItems[0]);
                success = true;
            }
        }
    }
    if (!success)
    {
        input_string2 = new char[strlen("arg1 attrlist->m_list-item[0] was NULL") + 1];
        strcpy(input_string2, "arg3 attrlist->m_list-item[0] was NULL");
    }

    attrlisterr * ale = new attrlisterr();
    attrlist * al = new attrlist();
    namepair * np = new namepair();
    namepair * np2 = new namepair();
    namepair ** np_array = new namepair*[2];
    namepair_Array * np_arr = new namepair_Array();
    m_list * ml = new m_list();
    m_list * ml2 = new m_list();
    xsd__string * str_array = new xsd__string[2];
    xsd__string_Array * str_arr = new xsd__string_Array();
    xsd__string * str_array2 = new xsd__string[2];
    xsd__string_Array * str_arr2 = new xsd__string_Array();

    str_array[0] = input_string;
    str_array[1] = NULL;
    str_arr->set(str_array, 2);
    delete [] str_array[0];
    delete [] str_array;

    ml->setitem(str_arr);
    delete str_arr;

    np->setm_list_Ref(ml);
    np->setname("namepair return");

    str_array2[0] = input_string2;
    str_array2[1] = NULL;
    str_arr2->set(str_array2, 2);
    delete [] str_array2[0];
    delete [] str_array2;

    ml2->setitem(str_arr2);
    delete str_arr2;

    np2->setm_list_Ref(ml2);
    np2->setname("namepair2 return");

    np_array[0] = np;
    np_array[1] = np2;
    np_arr->set(np_array, 2);
    delete np_array[0];
    delete np_array[1];
    delete [] np_array;

    al->setitem(np_arr);
    delete np_arr;

    ale->setattrlist_Ref(al);
    ale->seterrorcode(007);
    ale->seterrortext("request successful");

    delete Value0;
    delete Value1;
    delete Value2;

    return ale;
}

