diff options
author | Vladimir Glazounov <vg@openoffice.org> | 2005-03-23 10:25:59 +0000 |
---|---|---|
committer | Vladimir Glazounov <vg@openoffice.org> | 2005-03-23 10:25:59 +0000 |
commit | 77a20537a98ad20ed1af93272fc55a9c10ef3e13 (patch) | |
tree | 77c8ab4de7b1a6b8d94b4b070e8a1fe2dff508bb /xmloff/source/xforms | |
parent | fbd8c7c314cc6584acd59b5c348e40845fd5cd73 (diff) |
INTEGRATION: CWS eforms4 (1.2.22); FILE MERGED
2005/01/11 11:22:20 dvo 1.2.22.2: fix build
Issue number:
Submitted by:
Reviewed by:
2004/12/23 14:10:48 dvo 1.2.22.1: #i38666# load/save date+time related data types
Issue number:
Submitted by:
Reviewed by:
Diffstat (limited to 'xmloff/source/xforms')
-rw-r--r-- | xmloff/source/xforms/SchemaRestrictionContext.cxx | 242 |
1 files changed, 184 insertions, 58 deletions
diff --git a/xmloff/source/xforms/SchemaRestrictionContext.cxx b/xmloff/source/xforms/SchemaRestrictionContext.cxx index a3faebbea850..f1e549b67fe2 100644 --- a/xmloff/source/xforms/SchemaRestrictionContext.cxx +++ b/xmloff/source/xforms/SchemaRestrictionContext.cxx @@ -2,9 +2,9 @@ * * $RCSfile: SchemaRestrictionContext.cxx,v $ * - * $Revision: 1.2 $ + * $Revision: 1.3 $ * - * last change: $Author: obo $ $Date: 2004-11-16 10:12:16 $ + * last change: $Author: vg $ $Date: 2005-03-23 11:25:59 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -70,9 +70,13 @@ #include <xmlimp.hxx> #include <com/sun/star/beans/XPropertySet.hpp> -#include <com/sun/star/xsd/WhiteSpaceTreatment.hpp> +#include <com/sun/star/uno/Type.hxx> +#include <com/sun/star/util/Date.hpp> +#include <com/sun/star/util/Time.hpp> +#include <com/sun/star/util/DateTime.hpp> #include <com/sun/star/xforms/XDataTypeRepository.hpp> #include <com/sun/star/xsd/DataTypeClass.hpp> +#include <com/sun/star/xsd/WhiteSpaceTreatment.hpp> #include <tools/debug.hxx> @@ -81,9 +85,13 @@ using rtl::OUString; using com::sun::star::uno::Reference; using com::sun::star::uno::Exception; using com::sun::star::uno::Any; +using com::sun::star::uno::makeAny; using com::sun::star::uno::UNO_QUERY; +using com::sun::star::util::Date; +using com::sun::star::util::DateTime; using com::sun::star::xml::sax::XAttributeList; using com::sun::star::beans::XPropertySet; +using com::sun::star::beans::XPropertySetInfo; using com::sun::star::xforms::XDataTypeRepository; using namespace xmloff::token; @@ -146,9 +154,9 @@ void SchemaRestrictionContext::CreateDataType() mxDataType = Reference<XPropertySet>( mxRepository->cloneDataType( - lcl_getTypeName( mxRepository, - GetImport().GetNamespaceMap(), - msBaseName ), + lcl_getBasicTypeName( mxRepository, + GetImport().GetNamespaceMap(), + msBaseName ), msTypeName ), UNO_QUERY ); } @@ -169,6 +177,91 @@ void SchemaRestrictionContext::HandleAttribute( } } +typedef Any (*convert_t)( const OUString& ); + +Any lcl_string( const OUString& rValue ) +{ + return makeAny( rValue ); +} + +Any lcl_int32( const OUString& rValue ) +{ + sal_Int32 nValue; + bool bSuccess = SvXMLUnitConverter::convertNumber( nValue, rValue ); + return bSuccess ? makeAny( nValue ) : Any(); +} + +Any lcl_int16( const OUString& rValue ) +{ + sal_Int32 nValue; + bool bSuccess = SvXMLUnitConverter::convertNumber( nValue, rValue ); + return bSuccess ? makeAny( static_cast<sal_Int16>( nValue ) ) : Any(); +} + +Any lcl_whitespace( const OUString& rValue ) +{ + Any aValue; + if( IsXMLToken( rValue, XML_PRESERVE ) ) + aValue <<= com::sun::star::xsd::WhiteSpaceTreatment::Preserve; + else if( IsXMLToken( rValue, XML_REPLACE ) ) + aValue <<= com::sun::star::xsd::WhiteSpaceTreatment::Replace; + else if( IsXMLToken( rValue, XML_COLLAPSE ) ) + aValue <<= com::sun::star::xsd::WhiteSpaceTreatment::Collapse; + return aValue; +} + +Any lcl_double( const OUString& rValue ) +{ + double fValue; + bool bSuccess = SvXMLUnitConverter::convertDouble( fValue, rValue ); + return bSuccess ? makeAny( fValue ) : Any(); +} + +Any lcl_date( const OUString& rValue ) +{ + Any aAny; + + // parse ISO date + sal_Int32 nPos1 = rValue.indexOf( sal_Unicode('-') ); + sal_Int32 nPos2 = rValue.indexOf( sal_Unicode('-'), nPos1 + 1 ); + if( nPos1 > 0 && nPos2 > 0 ) + { + Date aDate; + aDate.Year = static_cast<sal_uInt16>( + rValue.copy( 0, nPos1 ).toInt32() ); + aDate.Month = static_cast<sal_uInt16>( + rValue.copy( nPos1 + 1, nPos2 - nPos1 - 1 ).toInt32() ); + aDate.Day = static_cast<sal_uInt16>( + rValue.copy( nPos2 + 1 ).toInt32() ); + aAny <<= aDate; + } + return aAny; +} + +Any lcl_dateTime( const OUString& rValue ) +{ + DateTime aDateTime; + bool bSuccess = SvXMLUnitConverter::convertDateTime( aDateTime, rValue ); + return bSuccess ? makeAny( aDateTime ) : Any(); +} + +Any lcl_time( const OUString& rValue ) +{ + Any aAny; + DateTime aDateTime; + if( SvXMLUnitConverter::convertTime( aDateTime, rValue ) ) + { + com::sun::star::util::Time aTime; + aTime.Hours = aDateTime.Hours; + aTime.Minutes = aDateTime.Minutes; + aTime.Seconds = aDateTime.Seconds; + aTime.HundredthSeconds = aDateTime.HundredthSeconds; + aAny <<= aTime; + } + return aAny; +} + + SvXMLImportContext* SchemaRestrictionContext::HandleChild( sal_uInt16 nToken, sal_uInt16 nPrefix, @@ -184,87 +277,113 @@ SvXMLImportContext* SchemaRestrictionContext::HandleChild( sValue = xAttrList->getValueByIndex( n ); } - // determine property name + // determine property name + suitable converter OUString sPropertyName; + convert_t pConvert = NULL; switch( nToken ) { case XML_LENGTH: sPropertyName = OUString(RTL_CONSTASCII_USTRINGPARAM("Length")); + pConvert = &lcl_int32; break; case XML_MINLENGTH: sPropertyName = OUString(RTL_CONSTASCII_USTRINGPARAM("MinLength")); + pConvert = &lcl_int32; break; case XML_MAXLENGTH: sPropertyName = OUString(RTL_CONSTASCII_USTRINGPARAM("MaxLength")); + pConvert = &lcl_int32; break; case XML_TOTALDIGITS: sPropertyName = OUString(RTL_CONSTASCII_USTRINGPARAM("TotalDigits")); + pConvert = &lcl_int32; break; case XML_FRACTIONDIGITS: sPropertyName =OUString(RTL_CONSTASCII_USTRINGPARAM("FractionDigits")); - break; - case XML_MININCLUSIVE: - sPropertyName = OUString(RTL_CONSTASCII_USTRINGPARAM("MinInclusive")); - break; - case XML_MINEXCLUSIVE: - sPropertyName = OUString(RTL_CONSTASCII_USTRINGPARAM("MinExclusive")); - break; - case XML_MAXINCLUSIVE: - sPropertyName = OUString(RTL_CONSTASCII_USTRINGPARAM("MaxInclusive")); - break; - case XML_MAXEXCLUSIVE: - sPropertyName = OUString(RTL_CONSTASCII_USTRINGPARAM("MaxExclusive")); + pConvert = &lcl_int32; break; case XML_PATTERN: sPropertyName = OUString(RTL_CONSTASCII_USTRINGPARAM("Pattern")); + pConvert = &lcl_string; break; case XML_WHITESPACE: sPropertyName = OUString(RTL_CONSTASCII_USTRINGPARAM("WhiteSpace")); + pConvert = &lcl_whitespace; break; - default: - DBG_ERROR( "unknown facet" ); - } - - // determine & convert property value - Any aValue; - switch( nToken ) - { - case XML_LENGTH: - case XML_MINLENGTH: - case XML_MAXLENGTH: - case XML_TOTALDIGITS: - case XML_FRACTIONDIGITS: - { - // convert int32 - sal_Int32 nValue; - if( SvXMLUnitConverter::convertNumber( nValue, sValue ) ) - aValue <<= nValue; - } - break; - case XML_MININCLUSIVE: case XML_MINEXCLUSIVE: case XML_MAXINCLUSIVE: case XML_MAXEXCLUSIVE: { - // convert double - double fValue; - if( SvXMLUnitConverter::convertDouble( fValue, sValue ) ) - aValue <<= fValue; - } - break; + // these attributes are mapped to different properties. + // To determine the property name, we use an attribute + // dependent prefix and a type dependent suffix. The + // converter is only type dependent. - case XML_PATTERN: - aValue <<= sValue; - break; + // first, attribute-dependent prefix + switch( nToken ) + { + case XML_MININCLUSIVE: + sPropertyName = OUString(RTL_CONSTASCII_USTRINGPARAM("MinInclusive")); + break; + case XML_MINEXCLUSIVE: + sPropertyName = OUString(RTL_CONSTASCII_USTRINGPARAM("MinExclusive")); + break; + case XML_MAXINCLUSIVE: + sPropertyName = OUString(RTL_CONSTASCII_USTRINGPARAM("MaxInclusive")); + break; + case XML_MAXEXCLUSIVE: + sPropertyName = OUString(RTL_CONSTASCII_USTRINGPARAM("MaxExclusive")); + break; + } - case XML_WHITESPACE: - if( IsXMLToken( sValue, XML_PRESERVE ) ) - aValue <<= com::sun::star::xsd::WhiteSpaceTreatment::Preserve; - else if( IsXMLToken( sValue, XML_REPLACE ) ) - aValue <<= com::sun::star::xsd::WhiteSpaceTreatment::Replace; - else if( IsXMLToken( sValue, XML_COLLAPSE ) ) - aValue <<= com::sun::star::xsd::WhiteSpaceTreatment::Collapse; + // second, type-dependent suffix + converter + switch( lcl_getTypeClass( mxRepository, + GetImport().GetNamespaceMap(), + msBaseName ) ) + { + case com::sun::star::xsd::DataTypeClass::DECIMAL: + case com::sun::star::xsd::DataTypeClass::DOUBLE: + case com::sun::star::xsd::DataTypeClass::FLOAT: + sPropertyName += OUString(RTL_CONSTASCII_USTRINGPARAM("Double")); + pConvert = &lcl_double; + break; + case com::sun::star::xsd::DataTypeClass::DATETIME: + sPropertyName += OUString(RTL_CONSTASCII_USTRINGPARAM("DateTime")); + pConvert = &lcl_dateTime; + break; + case com::sun::star::xsd::DataTypeClass::DATE: + sPropertyName += OUString(RTL_CONSTASCII_USTRINGPARAM("Date")); + pConvert = &lcl_date; + break; + case com::sun::star::xsd::DataTypeClass::TIME: + sPropertyName += OUString(RTL_CONSTASCII_USTRINGPARAM("Time")); + pConvert = &lcl_time; + break; + case com::sun::star::xsd::DataTypeClass::gYear: + case com::sun::star::xsd::DataTypeClass::gDay: + case com::sun::star::xsd::DataTypeClass::gMonth: + sPropertyName += OUString(RTL_CONSTASCII_USTRINGPARAM("Int")); + pConvert = &lcl_int16; + break; + + case com::sun::star::xsd::DataTypeClass::STRING: + case com::sun::star::xsd::DataTypeClass::anyURI: + case com::sun::star::xsd::DataTypeClass::BOOLEAN: + // invalid: These shouldn't have min/max-inclusive + break; + + /* data types not yet supported: + case com::sun::star::xsd::DataTypeClass::DURATION: + case com::sun::star::xsd::DataTypeClass::gYearMonth: + case com::sun::star::xsd::DataTypeClass::gMonthDay: + case com::sun::star::xsd::DataTypeClass::hexBinary: + case com::sun::star::xsd::DataTypeClass::base64Binary: + case com::sun::star::xsd::DataTypeClass::QName: + case com::sun::star::xsd::DataTypeClass::NOTATION: + */ + } + } break; default: @@ -275,10 +394,17 @@ SvXMLImportContext* SchemaRestrictionContext::HandleChild( CreateDataType(); if( mxDataType.is() && sPropertyName.getLength() > 0 - && aValue.hasValue() + && pConvert != NULL && mxDataType->getPropertySetInfo()->hasPropertyByName(sPropertyName) ) { - mxDataType->setPropertyValue( sPropertyName, aValue ); + try + { + mxDataType->setPropertyValue( sPropertyName, pConvert( sValue ) ); + } + catch( const Exception& ) + { + ; // can't set property? Then ignore. + } } return new SvXMLImportContext( GetImport(), nPrefix, rLocalName ); |