/* -*- C++ -*- */
/*
 *   Copyright 2003-2004 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.
 *
 */

#if !defined(AXIS_AXISUTILS_H__OF_AXIS_INCLUDED_)
#define AXIS_AXISUTILS_H__OF_AXIS_INCLUDED_

#include <axis/GDefine.hpp>
#include <string>

#include "../soap/xsd/AnyType2.hpp"
#include "../soap/xsd/Boolean.hpp"
#include "../soap/xsd/AnyURI.hpp"
#include "../soap/xsd/String.hpp"
#include "../soap/xsd/XSD_QName.hpp"
#include "../soap/xsd/NOTATION.hpp"
#include "../soap/xsd/Base64Binary.hpp"
#include "../soap/xsd/HexBinary.hpp"
#include "../soap/xsd/Duration.hpp"
#include "../soap/xsd/DateTime.hpp"
#include "../soap/xsd/Date.hpp"
#include "../soap/xsd/Time.hpp"
#include "../soap/xsd/Float.hpp"
#include "../soap/xsd/Double.hpp"
#include "../soap/xsd/Decimal.hpp"
#include "../soap/xsd/Integer.hpp"
#include "../soap/xsd/Long.hpp"
#include "../soap/xsd/Int.hpp"
#include "../soap/xsd/Short.hpp"
#include "../soap/xsd/Byte.hpp"
#include "../soap/xsd/NonNegativeInteger.hpp"
#include "../soap/xsd/UnsignedLong.hpp"
#include "../soap/xsd/UnsignedInt.hpp"
#include "../soap/xsd/UnsignedShort.hpp"
#include "../soap/xsd/UnsignedByte.hpp"
#include "../soap/xsd/GYearMonth.hpp"
#include "../soap/xsd/GYear.hpp"
#include "../soap/xsd/GMonthDay.hpp"
#include "../soap/xsd/GDay.hpp"
#include "../soap/xsd/GMonth.hpp"
#include "../soap/xsd/NonNegativeInteger.hpp"
#include "../soap/xsd/PositiveInteger.hpp"
#include "../soap/xsd/NonPositiveInteger.hpp"
#include "../soap/xsd/NegativeInteger.hpp"
#include "../soap/xsd/NormalizedString.hpp"
#include "../soap/xsd/Token.hpp"
#include "../soap/xsd/Language.hpp"
#include "../soap/xsd/Name.hpp"
#include "../soap/xsd/NCName.hpp"
#include "../soap/xsd/ID.hpp"
#include "../soap/xsd/IDREF.hpp"
#include "../soap/xsd/IDREFS.hpp"
#include "../soap/xsd/ENTITY.hpp"
#include "../soap/xsd/ENTITIES.hpp"
#include "../soap/xsd/NMTOKEN.hpp"
#include "../soap/xsd/NMTOKENS.hpp"

using namespace std;


#define CONVERT_BUFFER_SIZE 1024
/**
 *   @class AxisUtils
 *   @brief interface for the AxisUtils class.
 *
 *   @author Susantha Kumara (skumara@virtusa.com)
 *   @author Roshan Weerasuriya (roshanw@jkcsworld.com, roshan@opensource.lk, roshan_444@yahoo.com)
 */

/*
 * Revision 1.1  2005/01/19 roshan
 * Added decodeFromBase64Binary
 */

AXIS_CPP_NAMESPACE_START

class xsd__base64Binary;

class STORAGE_CLASS_INFO AxisUtils
{
    friend class TypeMapping;
    friend class URIMapping;
    public:

    /**
     * Creates an IAnySimpleType object based on the type provided.
     * Initialized with provided value.
     * 
     * @param pValue The value to be serialized.
     * @param type The xsd type of this value.
     * @return IAnySimpleType matching the provided type.  Note: Is it the responsibility of the calling code to delete this!
     */
    static IAnySimpleType* createSimpleTypeObject(void * pValue, XSDTYPE type);

    /**
     * Creates an IAnySimpleType object based on the type provided.
     * This is essentially the same as static IAnySimpleType* createSimpleTypeObject(void * pValue, XSDTYPE type);
     * with pValue = NULL.
     * 
     * @param type The xsd type of this value.
     * @return IAnySimpleType matching the provided type.  Note: Is it the responsibility of the calling code to delete this!
     */
    static IAnySimpleType* createSimpleTypeObject(XSDTYPE type);

        static bool isStringOnlyWithSpaces(const char* pchWord);

    /**
     * Decodes the given base64 string and returns it.
     */
    static xsd__base64Binary * decodeFromBase64Binary(const AxisChar* pValue);

        /*
     * Converts the given character pointer value to lowercase.
     * @param pchWord The character pointer to be converted.
     * @return The converted lowercase character value
     */
        static char *toLowerCase (const char* pchWord);
        /*
     * Converts the given string to lowercase.
     * @param pchWord The string to be converted.
     * @return The converted lowercase string value
     */
        static string toLowerCase (const string sWord);
        /*
     * Converts the given character pointer value to uppercase.
     * @param pchWord The character pointer to be converted.
     * @return The converted uppercase character value
     */
        static char *toUpperCase (const char* pchWord);
        /*
     * Converts the given string to uppercase.
     * @param pchWord The string to be converted.
     * @return The converted uppercase string value
     */
        static string toUpperCase (const string sWord);
        /*
     * Searchs for the specified character in the given character array and
     * returns whether it is found or not.
     * @param pchStringToSearch The character array to be searched.
     * @param cCharacter The character to search.
     */
        static bool isCharacterAvailable (const char* pchStringToSearch,
            const char cCharacter);
        /*
     * Searchs for the specified character in the given string and returns 
     * whether it is found or not.
     * @param sString The string array to be searched.
     * @param cCharacter The character to search.
     */
        static bool isCharacterAvailable (const string &sString,
            const char cCharacter);
        /*
     * Clears the content of passed character array
     * @param arrCh The character array which is to be cleared.
     * @param iSize The size of the array which is to be cleared.
     */
        static int clearArray (char* arrCh, int iSize);
        static void initialize ();
        static const AxisXMLCh* ToAxisXMLCh (const AxisChar* pch);
        AxisUtils ();
        virtual ~ AxisUtils ();
        /* any usefull static const AxisXMLCh strings. */

    private:
        static const AxisXMLCh *Convert (const AxisChar * pch);
        static AxisXMLCh m_Buffer[CONVERT_BUFFER_SIZE];

};

AXIS_CPP_NAMESPACE_END

#endif 
