// Copyright 2003-2004 The Apache Software Foundation.
// (c) Copyright IBM Corp. 2004, 2005 All Rights Reserved
// 
// 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.

 
/*
 * Supported types are
  1 <element name="getBoolean">
  2 <element name="getByte">
  3 <element name="getUnsignedByte">
  4 <element name="getShort">
  5 <element name="getUnsignedShort">
  6 <element name="getInt">
  7 <element name="getUnsignedInt">
  8 <element name="getLong">
  9 <element name="getUnsignedLong">
 10 <element name="getFloat">
 11 <element name="getDouble">
 12 <element name="getDate">
 13 <element name="getDateTime">
 14 <element name="getTime">
 15 <element name="getDuration">
 16 <element name="getString">
 17 <element name="getInteger">
 18 <element name="getDecimal">
 19 <element name="getBase64Binary">
 20 <element name="getHexBinary">
 *
 */


#include "XSDElementNil.hpp"
#include <axis/AxisException.hpp>
#include <ctype.h>
#include <iostream>
#include "CommonClientTestCode.hpp"

int main(int argc, char* argv[])
{
        char endpoint[256];
        const char* url="http://localhost:80/axis/Calculator";
        char dateTime[50];

        xsd__boolean* boolResult;
        xsd__byte* bResult;
        xsd__unsignedByte* ubResult;
        xsd__short* sResult;
        xsd__unsignedShort* usResult;
        xsd__int* iResult;
        xsd__unsignedInt* uiResult;
        xsd__long* lResult;
        xsd__unsignedLong* ulResult;
        xsd__float* fResult;
        xsd__double* dResult;
        xsd__date* dateResult;                  // typedef of struct tm
        xsd__dateTime* dateTimeResult;  // typedef of struct tm
        xsd__time* timeResult;                  // typedef of struct tm
        xsd__duration* durationResult;
        xsd__string strResult;
        xsd__integer* intResult;
        xsd__decimal* decResult;
        xsd__base64Binary* b64Result;
        xsd__hexBinary* hexResult;

        xsd__boolean boolInput=(xsd__boolean)1;
        xsd__byte bInput=(xsd__byte)31;
        xsd__unsignedByte ubInput=(xsd__unsignedByte)32;
        xsd__short sInput=(xsd__short)7;
        xsd__unsignedShort usInput=(xsd__unsignedShort)14;
        xsd__int iInput=(xsd__int)21;
        xsd__unsignedInt uiInput=(xsd__unsignedInt)28;
        xsd__long lInput=(xsd__long)35;
        xsd__unsignedLong ulInput=(xsd__unsignedLong)42;
        xsd__float fInput=(xsd__float)35.3535888888;
        xsd__double dInput=(xsd__double)70.7175888888;
        xsd__date dateInput;                    // typedef of struct tm
        xsd__dateTime dateTimeInput;    // typedef of struct tm
        xsd__time timeInput;                    // typedef of struct tm
        xsd__duration durationInput = (xsd__duration) 123456789;
        xsd__string strInput=(xsd__string)"never odd or even";
        xsd__integer intInput=(xsd__integer)919191919;
        xsd__decimal decInput=(xsd__decimal)929292929.5555555555555;
        xsd__base64Binary b64Input;
        xsd__hexBinary hexInput;

        xsd__base64Binary b64Test;
        xsd__hexBinary hexTest;

        //xsd__unsignedByte* testUB = (xsd__unsignedByte*)"never odd or even";

        xsd__unsignedByte* testUB = (xsd__unsignedByte*)stringToAscii("<test><xml>some dod&y string</xml></test>");


        b64Test.set(testUB, 41);
    hexTest.set(testUB, 41);

    time_t timeToTest;
    timeToTest = 1100246323;
    xsd__date *temp = gmtime(&timeToTest);
    xsd__date testDate;
    memcpy(&testDate, temp, sizeof(xsd__date));

        if(argc>1)
                url = argv[1];

                bool bSuccess = false;
                int     iRetryIterationCount = 3;

                do
                {
        try
        {
                sprintf(endpoint, "%s", url);
                XSDElementNil* ws = new XSDElementNil(endpoint);

                boolResult = ws->setGetDataBoolean(&boolInput);
                cout << "bool=" << *boolResult << endl;
                boolResult = ws->setGetDataBoolean(NULL);
                if(boolResult)
                        cout << "bool nil=" << *boolResult << endl;
                else
                        cout << "bool nil=NULL" << endl;

                bResult = ws->setGetDataByte(&bInput);
                printf("byte=%d\n", *bResult); fflush(stdout);
                bResult = ws->setGetDataByte(NULL);
                if(bResult) {
                        printf("byte nil=%d\n", *bResult); fflush(stdout);
                }
                else
                        cout << "byte nil=NULL" << endl;


                ubResult = ws->setGetDataUnsignedByte(&ubInput);
                printf("unsigned byte=%d\n", *ubResult); fflush(stdout);
                ubResult = ws->setGetDataUnsignedByte(NULL);
                if(ubResult) {
                        printf("unsigned byte nil=%d\n", *ubResult); fflush(stdout);
                }
                else
                        cout << "unsigned byte nil=NULL" << endl;

                sResult = ws->setGetDataShort(&sInput);
                cout << "short=" << *sResult << endl;
                sResult = ws->setGetDataShort(NULL);
                if(sResult)
                        cout << "short nil=" << *sResult << endl;
                else
                        cout << "short nil=NULL" << endl;

                usResult = ws->setGetDataUnsignedShort(&usInput);
                cout << "unsigned short=" << *usResult << endl;
                usResult = ws->setGetDataUnsignedShort(NULL);
                if(usResult)
                        cout << "unsigned short nil=" << *usResult << endl;
                else
                        cout << "unsigned short nil=NULL" << endl;

                iResult = ws->setGetDataInt(&iInput);
                cout << "int=" << *iResult << endl;
                iResult = ws->setGetDataInt(NULL);
                if(iResult)
                        cout << "int nil=" << *iResult << endl;
                else
                        cout << "int nil=NULL" << endl;

                uiResult = ws->setGetDataUnsignedInt(&uiInput);
                cout << "unsigned int=" << *uiResult << endl;
                uiResult = ws->setGetDataUnsignedInt(NULL);
                if(uiResult)
                        cout << "unsigned int nil=" << *uiResult << endl;
                else
                        cout << "unsigned int nil=NULL" << endl;

                lResult = ws->setGetDataLong(&lInput);
                cout << "long=" << *lResult << endl;
                lResult = ws->setGetDataLong(NULL);
                if(lResult)
                        cout << "long nil=" << *lResult << endl;
                else
                        cout << "long nil=NULL" << endl;

                ulResult = ws->setGetDataUnsignedLong(&ulInput);
                cout << "unsigned long=" << *ulResult << endl;
                ulResult = ws->setGetDataUnsignedLong(NULL);
                if(ulResult)
                        cout << "unsigned long nil=" << *ulResult << endl;
                else
                        cout << "unsigned long nil=NULL" << endl;

                fResult = ws->setGetDataFloat(&fInput);
                printf("float=%.6g\n", *fResult); fflush(stdout);
                fResult = ws->setGetDataFloat(NULL);
                if(fResult) {
                        printf("float nil=%.6g\n", *fResult); fflush(stdout);
                } else
                        cout << "float nil=NULL" << endl;

                dResult = ws->setGetDataDouble(&dInput);
                printf("double=%.10g\n", *dResult); fflush(stdout);
                dResult = ws->setGetDataDouble(NULL);
                if(dResult) {
                        printf("double nil=%.10g\n", *dResult); fflush(stdout);
                } else
                        cout << "double nil=NULL" << endl;

        durationResult = ws->setGetDataDurationType(&durationInput);
        cout << "duration=" << *durationResult << endl;

                dateResult = ws->setGetDateType(&testDate);
                strftime(dateTime, 50, "%a %b %d %Y", dateResult);
                cout << "date=" << dateTime << endl;
                dateResult = ws->setGetDateType(NULL);
                if(dateResult) {
                        strftime(dateTime, 50, "%a %b %d %Y", dateResult);
                        cout << "date nil=" << dateTime << endl;
                }
                else
                        cout << "date nil=NULL" << endl;

                dateTimeResult = ws->setGetDateTimeType(&testDate);
                strftime(dateTime, 50, "%a %b %d %H:%M:%S %Y", dateTimeResult);
                cout << "dateTime=" << dateTime << endl;
                dateTimeResult = ws->setGetDateTimeType(NULL);
                if(dateTimeResult) {
                        strftime(dateTime, 50, "%a %b %d %H:%M:%S %Y", dateTimeResult);
                        cout << "dateTime nil=" << dateTime << endl;
                }
                else
                        cout << "dateTime nil=NULL" << endl;

//  This is being commented out due to issue on some servers
//  An additional testcase XSDTimeNil has been created to isolate this test.
//              timeResult = ws->setGetTimeType(&testDate);
//              strftime(dateTime, 50, "%H:%M:%S", timeResult);
//              cout << "time=" << dateTime << endl;

                strResult = ws->setGetDataString("never odd or even");
                cout << "string=" << strResult << endl;
                strResult = ws->setGetDataString("m");
                cout << "small string=" << strResult << endl;
                strResult = ws->setGetDataString(NULL);
                if(strResult)
                        cout << "string nil=" << strResult << endl;
                else
                        cout << "string nil=NULL" << endl;

                intResult = ws->setGetIntegerType(&intInput);
                cout << "integer=" << *intResult << endl;
                intResult = ws->setGetIntegerType(NULL);
                if(intResult)
                        cout << "integer nil=" << *intResult << endl;
                else
                        cout << "integer nil=NULL" << endl;

                decResult = ws->setGetDecimalType(&decInput);
        printf("decimal=%.5f\n", *decResult); fflush(stdout);
                decResult = ws->setGetDecimalType(NULL);
        if(decResult) {
                        printf("decimal nil=%.5f\n", *decResult); fflush(stdout);
                } else
                        cout << "decimal nil=NULL" << endl;

                b64Result = ws->setGetBase64BinaryType(&b64Test);
        int size = 0;
        const xsd__unsignedByte * base64BinaryData = b64Result->get(size);
                cout << "base64Binary size=" << size << endl;
                if( size > 0)
                {
                        cout << "base64Binary data=" << asciiToStringOfLength((char *)base64BinaryData, size) << endl;
                }
                b64Result = ws->setGetBase64BinaryType(NULL);
                if(b64Result)
                        cout << "base64Binary nil size=" << b64Result->getSize() << endl;
                else
                        cout << "base64Binary nil=NULL" << endl;

                hexResult = ws->setGetHexBinary(&hexTest);
        size = 0;
        const xsd__unsignedByte * hexBinaryData = hexResult->get(size);
                cout << "hexBinary size=" << size << endl;
                if( size > 0)
                {
                        cout << "hexBinary data=" << asciiToStringOfLength((char *)hexBinaryData, size) << endl;
                }
                hexResult = ws->setGetHexBinary(&hexTest);
                if(hexResult)
                        cout << "hexBinary nil size=" << hexResult->getSize() << endl;
                else
                        cout << "hexBinary nil=NULL" << endl;

                bSuccess = true;
                delete ws;
        }
        catch(AxisException& e)
        {
                        bool bSilent = false;

                        if( e.getExceptionCode() == CLIENT_TRANSPORT_OPEN_CONNECTION_FAILED)
                        {
                                if( iRetryIterationCount > 0)
                                {
                                        bSilent = true;
                                }
                        }
                        else
                        {
                                iRetryIterationCount = 0;
                        }

            if( !bSilent)
                        {
                                cout << "Exception : " << e.what() << endl;
                        }
        }
        catch(exception& e)
        {
            cout << "Unknown exception has occured" << endl;
        }
        catch(...)
        {
            cout << "Unknown exception has occured" << endl;
        }
                iRetryIterationCount--;
                } while( iRetryIterationCount > 0 && !bSuccess);
        cout<< "---------------------- TEST COMPLETE -----------------------------"<< endl;
        
        return 0;
}
