summaryrefslogtreecommitdiff
path: root/xmloff
diff options
context:
space:
mode:
authorVladimir Glazounov <vg@openoffice.org>2005-03-23 10:25:59 +0000
committerVladimir Glazounov <vg@openoffice.org>2005-03-23 10:25:59 +0000
commit77a20537a98ad20ed1af93272fc55a9c10ef3e13 (patch)
tree77c8ab4de7b1a6b8d94b4b070e8a1fe2dff508bb /xmloff
parentfbd8c7c314cc6584acd59b5c348e40845fd5cd73 (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')
-rw-r--r--xmloff/source/xforms/SchemaRestrictionContext.cxx242
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 );