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

// !!! This include file must be first thing in file !!!
#include "../../platforms/PlatformAutoSense.hpp"

#include "Duration.hpp"

AXIS_CPP_NAMESPACE_START

Duration::Duration()
{
}

Duration::Duration(const xsd__duration* value)
{
    if (value)
    {
        setNil(false);
        serialize(value);
    }
}

XSDTYPE Duration::getType()
{
    return XSD_DURATION;
}

xsd__duration* Duration::getDuration()
{
    if (isNil())
    {
        return NULL;
    }
    else
    {
        return deserializeDuration(m_Buf);
    }
}

void * Duration::getValue()
{
    return (void*) getDuration();
}

AxisChar* Duration::serialize(const xsd__duration* value) throw (AxisSoapException)
{
 
    MinInclusive* minInclusive = getMinInclusive();
    if (minInclusive->isSet())
        if ( *value < minInclusive->getMinInclusiveAsLONGLONG() )
        {
            AxisString exceptionMessage =
            "Value to be serialized is less than MinInclusive specified for this type.  MinInclusive = ";
            AxisChar length[100];
            sprintf(length, PRINTF_LONGLONG_FORMAT_SPECIFIER, minInclusive->getMinInclusiveAsLONGLONG());
            exceptionMessage += length;
            exceptionMessage += ", Value = ";
            sprintf(length, "%ld", *value);
            exceptionMessage += length;
            exceptionMessage += ".";
            
            delete minInclusive;
            throw AxisSoapException(CLIENT_SOAP_SOAP_CONTENT_ERROR,
                const_cast<AxisChar*>(exceptionMessage.c_str()));
        }
    delete minInclusive;
 
    MinExclusive* minExclusive = getMinExclusive();
    if (minExclusive->isSet())
        if ( *value <= minExclusive->getMinExclusiveAsLONGLONG() )
        {
            AxisString exceptionMessage =
            "Value to be serialized is less than or equal to MinExclusive specified for this type.  MinExclusive = ";
            AxisChar length[100];
            sprintf(length, PRINTF_LONGLONG_FORMAT_SPECIFIER, minExclusive->getMinExclusiveAsLONGLONG());
            exceptionMessage += length;
            exceptionMessage += ", Value = ";
            sprintf(length, "%ld", *value);
            exceptionMessage += length;
            exceptionMessage += ".";
            
            delete minExclusive;
            throw AxisSoapException(CLIENT_SOAP_SOAP_CONTENT_ERROR,
                const_cast<AxisChar*>(exceptionMessage.c_str()));
        }
    delete minExclusive;


    MaxInclusive* maxInclusive = getMaxInclusive();
    if (maxInclusive->isSet())
        if ( *value > maxInclusive->getMaxInclusiveAsLONGLONG() )
        {
            AxisString exceptionMessage =
            "Value to be serialized is greater than MaxInclusive specified for this type.  MaxInclusive = ";
            AxisChar length[100];
            sprintf(length, PRINTF_LONGLONG_FORMAT_SPECIFIER, maxInclusive->getMaxInclusiveAsLONGLONG());
            exceptionMessage += length;
            exceptionMessage += ", Value = ";
            sprintf(length, "%ld", *value);
            exceptionMessage += length;
            exceptionMessage += ".";
            
            delete maxInclusive;
            throw AxisSoapException(CLIENT_SOAP_SOAP_CONTENT_ERROR,
                const_cast<AxisChar*>(exceptionMessage.c_str()));
        }
    delete maxInclusive;
 
    MaxExclusive* maxExclusive = getMaxExclusive();
    if (maxExclusive->isSet())
        if ( *value >= maxExclusive->getMaxExclusiveAsLONGLONG() )
        {
            AxisString exceptionMessage =
            "Value to be serialized is greater than or equal to MaxExclusive specified for this type.  MaxExclusive = ";
            AxisChar length[100];
            sprintf(length, PRINTF_LONGLONG_FORMAT_SPECIFIER, maxExclusive->getMaxExclusiveAsLONGLONG());
            exceptionMessage += length;
            exceptionMessage += ", Value = ";
            sprintf(length, "%ld", *value);
            exceptionMessage += length;
            exceptionMessage += ".";
            
            delete maxExclusive;
            throw AxisSoapException(CLIENT_SOAP_SOAP_CONTENT_ERROR,
                const_cast<AxisChar*>(exceptionMessage.c_str()));
        }
    delete maxExclusive;
 
	long valueToSerialize = *value;
	AxisChar buff[4];
    AxisString serializedValue;
	/*
	 * Duration takes the form:
	 * PnYnMnDTnHnMnS
	 */
    serializedValue = "P";
    
    // Calculate years
    int x = 365 * 24 * 3600;
    int intYears = valueToSerialize / x;
    long tempYears = intYears * x;
    AxisSprintf (buff, 4, "%d", intYears);
    serializedValue.append (buff);
    serializedValue.append ("Y");


	// Calculate Months
    valueToSerialize = valueToSerialize - (tempYears);
    x = 30 * 24 * 3600;
    int intMonths = valueToSerialize / x;
    AxisSprintf (buff, 4, "%d", intMonths);
    serializedValue.append (buff);
    serializedValue.append ("M");

	// Calculate Days
    valueToSerialize = valueToSerialize - (intMonths * x);
    x = 24 * 3600;
    int intDays = valueToSerialize / x;
    AxisSprintf (buff, 4, "%d", intDays);
    serializedValue.append (buff);
    serializedValue.append ("DT");

	// Calculate Hours
    valueToSerialize = valueToSerialize - (intDays * x);
    x = 3600;
    int intHours = valueToSerialize / x;
    AxisSprintf (buff, 4, "%d", intHours);
    serializedValue.append (buff);
    serializedValue.append ("H");

	// Calculate Minutes
    valueToSerialize = valueToSerialize - (intHours * x);
    x = 60;
    int intMins = valueToSerialize / x;
    AxisSprintf (buff, 4, "%d", intMins);
    serializedValue.append (buff);
    serializedValue.append ("M");

	// Calculate Seconds
    int intSecs = valueToSerialize - (intMins * x);
    AxisSprintf (buff, 4, "%d", intSecs);
    serializedValue.append (buff);
    serializedValue.append ("S");

	// Convert from String to Char[]	
	AxisChar* returnValue = (AxisChar*) serializedValue.c_str ();
   
    IAnySimpleType::serialize(returnValue);
	return m_Buf;
}

xsd__duration* Duration::deserializeDuration(const AxisChar* valueAsChar) throw (AxisSoapException)
{
	AxisString valueAsString = valueAsChar;
	AxisString buff;
    unsigned int intPos1, intPos2, intPos3, intPos4, intPos5, intPos6;

    xsd__duration* value = new xsd__duration;

    /*XSD_DURATION is of the format PnYnMnDTnHnMnS */

	// Deserialize Years
	*value = 0;
    intPos1 = valueAsString.find_first_of ("Y");
    buff = valueAsString.substr (1, intPos1 - 1);
    int years = atoi (buff.c_str ());
    *value += years * 365 * 24 * 3600;

	// Deserialize Months
    intPos2 = valueAsString.find_first_of ("M");
    buff = valueAsString.substr (intPos1 + 1, intPos2 - intPos1 - 1);
    int months = atoi (buff.c_str ());
    *value += months * 30 * 24 * 3600;

	// Deserialize Days
    intPos3 = valueAsString.find_first_of ("D");
    buff = valueAsString.substr (intPos2 + 1, intPos3 - intPos2 - 1);
    int days = atoi (buff.c_str ());
    *value += days * 24 * 3600;
    
	// Deserialize Hours
    intPos4 = valueAsString.find_first_of ("H");
    buff = valueAsString.substr (intPos3 + 2, intPos4 - intPos3 - 2);
    int hours = atoi (buff.c_str ());
    *value += hours * 3600;

	// Deserialize Minutes
    intPos5 = valueAsString.find_last_of ("M");
    buff = valueAsString.substr (intPos4 + 1, intPos5 - intPos4 - 1);
    int mins = atoi (buff.c_str ());
    *value += mins * 60;

	// Deserialize Seconds
    intPos6 = valueAsString.find_first_of ("S");
    buff = valueAsString.substr (intPos5 + 1, intPos6 - intPos5 - 1);
    int secs = atoi (buff.c_str ());
    *value += secs;
    
    return value;
}

WhiteSpace* Duration::getWhiteSpace()
{
    return new WhiteSpace(COLLAPSE);
}

MinInclusive* Duration::getMinInclusive()
{
    return new MinInclusive();
}

MinExclusive* Duration::getMinExclusive()
{
    return new MinExclusive();
}

MaxInclusive* Duration::getMaxInclusive()
{
    return new MaxInclusive();
}

MaxExclusive* Duration::getMaxExclusive()
{
    return new MaxExclusive();
}
    
AXIS_CPP_NAMESPACE_END
