/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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. */ /* * $Id: XSValue.hpp 568078 2007-08-21 11:43:25Z amassari $ */ #if !defined(XSVALUE_HPP) #define XSVALUE_HPP #include #include XERCES_CPP_NAMESPACE_BEGIN class RegularExpression; class XMLPARSER_EXPORT XSValue : public XMemory { public: enum DataType { dt_string = 0, dt_boolean = 1, dt_decimal = 2, dt_float = 3, dt_double = 4, dt_duration = 5, dt_dateTime = 6, dt_time = 7, dt_date = 8, dt_gYearMonth = 9, dt_gYear = 10, dt_gMonthDay = 11, dt_gDay = 12, dt_gMonth = 13, dt_hexBinary = 14, dt_base64Binary = 15, dt_anyURI = 16, dt_QName = 17, dt_NOTATION = 18, dt_normalizedString = 19, dt_token = 20, dt_language = 21, dt_NMTOKEN = 22, dt_NMTOKENS = 23, dt_Name = 24, dt_NCName = 25, dt_ID = 26, dt_IDREF = 27, dt_IDREFS = 28, dt_ENTITY = 29, dt_ENTITIES = 30, dt_integer = 31, dt_nonPositiveInteger = 32, dt_negativeInteger = 33, dt_long = 34, dt_int = 35, dt_short = 36, dt_byte = 37, dt_nonNegativeInteger = 38, dt_unsignedLong = 39, dt_unsignedInt = 40, dt_unsignedShort = 41, dt_unsignedByte = 42, dt_positiveInteger = 43, dt_MAXCOUNT = 44 }; enum XMLVersion { ver_10, ver_11 }; enum Status { st_Init, st_NoContent, st_NoCanRep, st_NoActVal, st_NotSupported, st_CantCreateRegEx, st_FOCA0002, //invalid lexical value st_FOCA0001, //input value too large/too small for decimal st_FOCA0003, //input value too large for integer st_FODT0003, //invalid timezone value st_UnknownType }; enum DataGroup { dg_numerics, dg_datetimes, dg_strings }; enum DoubleFloatType { DoubleFloatType_NegINF, DoubleFloatType_PosINF, DoubleFloatType_NaN, DoubleFloatType_Zero, DoubleFloatType_Normal }; // Constructors and Destructor // ----------------------------------------------------------------------- /** @name Destructor */ //@{ ~XSValue(); //@} //--------------------------------- /** @name Externalization methods */ //@{ /** * Validate a given string of the data type specified * * @param content data to be validated * @param datatype schema datatype * @param status validation status which is set upon validation fails * @param version xml version * @param manager memory manager provided */ static bool validate ( const XMLCh* const content , DataType datatype , Status& status , XMLVersion version = ver_10 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager ); /** * Get the canonical representation for a given string of the * data type specified * * @param content raw data * @param datatype schema datatype * @param status validation status which is set upon validation fails * @param version xml version * @param toValidate to validate the content before generate canonical representation * @param manager memory manager provided */ static XMLCh* getCanonicalRepresentation ( const XMLCh* const content , DataType datatype , Status& status , XMLVersion version = ver_10 , bool toValidate = true , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager ); /** * Get the actual value, in the form of XSValue, for a given string of the * data type specified * * Client application is responsible for the deleletion of the XSValue returned. * * @param content raw data * @param datatype schema datatype * @param status validation status which is set upon validation fails * @param version xml version * @param toValidate to validate the content before generate actual value * @param manager memory manager provided */ static XSValue* getActualValue ( const XMLCh* const content , DataType datatype , Status& status , XMLVersion version = ver_10 , bool toValidate = true , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager ); static DataType getDataType (const XMLCh* const dtString); //@} //---------------------------------- /** public data */ struct XSValue_Data { DataType f_datatype; union { bool f_bool; char f_char; unsigned char f_uchar; short f_short; unsigned short f_ushort; int f_int; unsigned int f_uint; long f_long; unsigned long f_ulong; float f_float; double f_double; XMLCh* f_strVal; XMLByte* f_byteVal; struct decimal { double f_dvalue; } f_decimal; struct datetime { int f_year; int f_month; int f_day; int f_hour; int f_min; int f_second; double f_milisec; } f_datetime; struct doubletype { double f_double; DoubleFloatType f_doubleEnum; } f_doubleType; struct floattype { float f_float; DoubleFloatType f_floatEnum; } f_floatType; } fValue; } fData; static void reinitMutex(); static void reinitRegEx(); static void reinitRegistry(); private: typedef union { long f_long; unsigned long f_ulong; } t_value; /** @name Constructors */ //@{ /** * The default constructor * */ XSValue( DataType const dt , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager ); //@}; // ----------------------------------------------------------------------- // Unimplemented constructors and operators // ----------------------------------------------------------------------- XSValue(const XSValue&); XSValue & operator=(const XSValue &); //--------------------------------- /** @name Helpers */ //@{ static const XSValue::DataGroup inGroup[]; static const bool numericSign[]; //@} static bool validateNumerics ( const XMLCh* const content , DataType datatype , Status& status , MemoryManager* const manager ); static bool validateDateTimes ( const XMLCh* const content , DataType datatype , Status& status , MemoryManager* const manager ); static bool validateStrings ( const XMLCh* const content , DataType datatype , Status& status , XMLVersion version , MemoryManager* const manager ); static XMLCh* getCanRepNumerics ( const XMLCh* const content , DataType datatype , Status& status , bool toValidate , MemoryManager* const manager ); static XMLCh* getCanRepDateTimes ( const XMLCh* const content , DataType datatype , Status& status , bool toValidate , MemoryManager* const manager ); static XMLCh* getCanRepStrings ( const XMLCh* const content , DataType datatype , Status& status , XMLVersion version , bool toValidate , MemoryManager* const manager ); static XSValue* getActValNumerics ( const XMLCh* const content , DataType datatype , Status& status , bool toValidate , MemoryManager* const manager ); static XSValue* getActValDateTimes ( const XMLCh* const content , DataType datatype , Status& status , MemoryManager* const manager ); static XSValue* getActValStrings ( const XMLCh* const content , DataType datatype , Status& status , XMLVersion version , bool toValidate , MemoryManager* const manager ); static bool getActualNumericValue ( const XMLCh* const content , Status& status , t_value& retVal , MemoryManager* const manager , DataType datatype ); static ValueHashTableOf* fDataTypeRegistry; // ----------------------------------------------------------------------- // static helper methods // ----------------------------------------------------------------------- static void initializeRegistry(); friend class XMLInitializer; // ----------------------------------------------------------------------- // data members // ----------------------------------------------------------------------- bool fMemAllocated; MemoryManager* fMemoryManager; }; XERCES_CPP_NAMESPACE_END #endif