37 #include <com/sun/star/container/XIndexAccess.hpp>
38 #include <com/sun/star/container/XNameAccess.hpp>
39 #include <com/sun/star/document/NamedPropertyValues.hpp>
40 #include <com/sun/star/frame/XModel.hpp>
41 #include <com/sun/star/xml/dom/XDocument.hpp>
42 #include <com/sun/star/form/binding/XBindableValue.hpp>
43 #include <com/sun/star/form/binding/XListEntrySink.hpp>
44 #include <com/sun/star/form/submission/XSubmissionSupplier.hpp>
45 #include <com/sun/star/xforms/XModel.hpp>
46 #include <com/sun/star/xforms/XDataTypeRepository.hpp>
47 #include <com/sun/star/xforms/XFormsSupplier.hpp>
48 #include <com/sun/star/beans/PropertyValue.hpp>
49 #include <com/sun/star/container/XEnumerationAccess.hpp>
50 #include <com/sun/star/container/XEnumeration.hpp>
51 #include <com/sun/star/container/XNameContainer.hpp>
52 #include <com/sun/star/xsd/WhiteSpaceTreatment.hpp>
53 #include <com/sun/star/xsd/DataTypeClass.hpp>
54 #include <com/sun/star/util/Date.hpp>
55 #include <com/sun/star/util/Time.hpp>
56 #include <com/sun/star/util/DateTime.hpp>
57 #include <com/sun/star/util/Duration.hpp>
64 using com::sun::star::beans::XPropertySetInfo;
65 using com::sun::star::container::XIndexAccess;
66 using com::sun::star::container::XNameAccess;
67 using com::sun::star::container::XNameContainer;
68 using com::sun::star::container::XEnumerationAccess;
69 using com::sun::star::container::XEnumeration;
70 using com::sun::star::xml::dom::XDocument;
71 using com::sun::star::form::binding::XBindableValue;
72 using com::sun::star::form::binding::XListEntrySink;
73 using com::sun::star::form::submission::XSubmissionSupplier;
74 using com::sun::star::beans::PropertyValue;
75 using com::sun::star::xforms::XDataTypeRepository;
76 using com::sun::star::xforms::XFormsSupplier;
77 using com::sun::star::util::Duration;
90 for(
const auto& rName : aNames )
122 const ExportTable* pTable );
124 #define TABLE_ENTRY(NAME,NAMESPACE,TOKEN,CONVERTER) { NAME,XML_NAMESPACE_##NAMESPACE,xmloff::token::XML_##TOKEN, CONVERTER }
125 #define TABLE_END { nullptr, 0, 0, nullptr }
131 template<
typename T,
void (*FUNC)( OUStringBuffer&, T )>
static OUString
xforms_convert(
const Any& );
132 template<
typename T,
void (*FUNC)( OUStringBuffer&, const T& )>
static OUString
xforms_convertRef(
const Any& );
134 static void xforms_formatDate( OUStringBuffer& aBuffer,
const util::Date& aDate );
135 static void xforms_formatTime( OUStringBuffer& aBuffer,
const css::util::Time& aTime );
168 if( ! xModel.is() || ! xModelPropSet.is() )
171 lcl_export( xModelPropSet, rExport, aXFormsModelTable );
178 sal_Int32
nCount = xInstances->getCount();
180 for( i = 0; i < nCount; i++ )
183 xInstances->getByIndex( i ) >>= aInstance;
190 nCount = xBindings->getCount();
191 for( i = 0; i < nCount; i++ )
201 nCount = xSubmissions->getCount();
202 for( i = 0; i < nCount; i++ )
224 for(
const auto& rProp : xInstance )
226 OUString
sName = rProp.Name;
227 const Any& rAny = rProp.Value;
230 else if ( sName ==
"URL" )
232 else if ( sName ==
"Instance" )
239 if( !sURL.isEmpty() )
275 xBinding->getPropertyValue(
"BindingID" ) >>= sName;
276 if( sName.isEmpty() )
279 sal_Int64
nId =
reinterpret_cast<sal_uInt64
>( xBinding.get() );
280 sName =
"bind_" + OUString::number( nId , 16 );
281 xBinding->setPropertyValue(
"BindingID",
makeAny(sName));
285 lcl_export( xBinding, rExport, aXFormsBindingTable );
290 xBinding->getPropertyValue(
"Type" ) >>= sTypeName;
297 xBinding->getPropertyValue(
"Model" ),
301 if( xRepository.is() )
304 xRepository->getDataType( sTypeName );
308 bool bIsBasic =
false;
309 xDataType->getPropertyValue(
"IsBasic" ) >>= bIsBasic;
320 if( !sTypeName.isEmpty() )
331 xBinding->getPropertyValue(
"ModelNamespaces" ), UNO_QUERY);
332 if( xNamespaces.is() )
336 for(
const OUString& rPrefix : aPrefixes )
339 xNamespaces->getByName( rPrefix ) >>= sURI;
350 OUString
sName =
"xmlns:" + rPrefix;
392 lcl_export( xSubmission, rExport, aXFormsSubmissionTable );
437 const ExportTable* pTable )
440 for(
const ExportTable* pCurrent = pTable;
441 pCurrent->pPropertyName !=
nullptr;
444 OUString
sName( OUString::createFromAscii( pCurrent->pPropertyName ) );
445 if( xInfo->hasPropertyByName( sName ) )
447 OUString sValue = (*pCurrent->aConverter)(
448 rPropertySet->getPropertyValue( sName ) );
450 if( !sValue.isEmpty() )
455 pCurrent->nNamespace,
456 static_cast<XMLTokenEnum>( pCurrent->nToken ),
469 sal_uInt16 nDataTypeClass = 0;
470 xType->getPropertyValue(
"TypeClass" ) >>= nDataTypeClass;
471 switch( nDataTypeClass )
473 case css::xsd::DataTypeClass::STRING:
476 case css::xsd::DataTypeClass::anyURI:
479 case css::xsd::DataTypeClass::DECIMAL:
482 case css::xsd::DataTypeClass::DOUBLE:
485 case css::xsd::DataTypeClass::FLOAT:
488 case css::xsd::DataTypeClass::BOOLEAN:
491 case css::xsd::DataTypeClass::DATETIME:
494 case css::xsd::DataTypeClass::TIME:
497 case css::xsd::DataTypeClass::DATE:
500 case css::xsd::DataTypeClass::gYear:
503 case css::xsd::DataTypeClass::gDay:
506 case css::xsd::DataTypeClass::gMonth:
509 case css::xsd::DataTypeClass::DURATION:
510 case css::xsd::DataTypeClass::gYearMonth:
511 case css::xsd::DataTypeClass::gMonthDay:
512 case css::xsd::DataTypeClass::hexBinary:
513 case css::xsd::DataTypeClass::base64Binary:
514 case css::xsd::DataTypeClass::QName:
515 case css::xsd::DataTypeClass::NOTATION:
517 OSL_FAIL(
"unknown data type" );
528 bool bIsBasic =
false;
529 xType->getPropertyValue(
"IsBasic" ) >>= bIsBasic;
537 xType->getPropertyValue(
"Name" ) >>= sName;
554 aDataTypeFacetTable );
571 while( xEnum->hasMoreElements() )
584 xPropSet->getPropertyValue(
"ForeignSchema" ),
598 const ExportTable* pTable )
600 for(
const ExportTable* pCurrent = pTable;
601 pCurrent->pPropertyName !=
nullptr;
604 Any aAny = rPropertySet->getPropertyValue(
605 OUString::createFromAscii( pCurrent->pPropertyName ) );
606 OUString sValue = (*pCurrent->aConverter)( aAny );
608 if( !sValue.isEmpty() )
610 pCurrent->nNamespace,
611 static_cast<XMLTokenEnum>( pCurrent->nToken ),
620 template<
typename T,
void (*FUNC)( OUStringBuffer&, T )>
627 FUNC( aBuffer, aData );
629 return aBuffer.makeStringAndClear();
632 template<
typename T,
void (*FUNC)( OUStringBuffer&, const T& )>
639 FUNC( aBuffer, aData );
641 return aBuffer.makeStringAndClear();
653 bool bResult = bool();
654 if( rAny >>= bResult )
656 OSL_FAIL(
"expected boolean value" );
662 aBuffer.append(OUString::number(static_cast<sal_Int32>( rDate.Year ) ))
663 .append(
"-").append(OUString::number(static_cast<sal_Int32>( rDate.Month )))
664 .append(
"-").append(OUString::number(static_cast<sal_Int32>( rDate.Day )));
670 aDuration.Hours = rTime.Hours;
671 aDuration.Minutes = rTime.Minutes;
672 aDuration.Seconds = rTime.Seconds;
673 aDuration.NanoSeconds = rTime.NanoSeconds;
685 sal_uInt16
n = sal_uInt16();
690 case css::xsd::WhiteSpaceTreatment::Preserve:
693 case css::xsd::WhiteSpaceTreatment::Replace:
696 case css::xsd::WhiteSpaceTreatment::Collapse:
708 OUString sProp(
"BindingID" );
712 xBinding->getPropertySetInfo()->hasPropertyByName( sProp ) )
714 xBinding->getPropertyValue( sProp ) >>= sReturn;
723 return xBindable.is()
733 return xListEntrySink.is()
745 if( xSubmissionSupplier.is() )
748 xSubmissionSupplier->getSubmission(), UNO_QUERY );
749 OUString sProp(
"ID" );
750 if( xPropertySet.is() &&
751 xPropertySet->getPropertySetInfo()->hasPropertyByName( sProp ) )
753 xPropertySet->getPropertyValue( sProp ) >>= sReturn;
764 OSL_PRECOND( _rXForms.is(),
"getXFormsSettings: invalid XForms container!" );
765 if ( !_rXForms.is() )
779 for (
auto const & modelName : aModelNames )
784 aModelSettings[0].Name =
"ExternalData";
785 aModelSettings[0].Value = xModelProps->getPropertyValue( aModelSettings[0].
Name );
787 xModelSettings->insertByName( modelName,
makeAny( aModelSettings ) );
790 if ( xModelSettings->hasElements() )
792 _out_rSettings.realloc( 1 );
793 _out_rSettings[0].Name =
"XFormModels";
794 _out_rSettings[0].Value <<= xModelSettings;
sal_uInt16 GetKeyByPrefix(const OUString &rPrefix) const
constexpr sal_uInt16 XML_NAMESPACE_XFORMS
const sal_uInt16 XML_NAMESPACE_UNKNOWN
SvXMLAttributeList & GetAttrList()
const css::uno::Reference< css::frame::XModel > & GetModel() const
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
void AddAttribute(sal_uInt16 nPrefix, const char *pName, const OUString &rValue)
sal_Int16 GetIndexByName(const OUString &rName) const
XMLTokenEnum
The enumeration of all XML tokens.
constexpr OUStringLiteral aData
#define DBG_UNHANDLED_EXCEPTION(...)
constexpr OUStringLiteral PATTERN
class SAL_NO_VTABLE XPropertySet
static void convertDateTime(OUStringBuffer &rBuffer, const css::util::DateTime &rDateTime, sal_Int16 const *pTimeZoneOffset, bool bAddTimeIf0AM=false)
constexpr sal_uInt16 XML_NAMESPACE_XSD
static void convertDuration(OUStringBuffer &rBuffer, const double fTime)
const sal_uInt16 XML_NAMESPACE_NONE
OUString GetQNameByKey(sal_uInt16 nKey, const OUString &rLocalName, bool bCache=true) const
const SvXMLNamespaceMap & GetNamespaceMap() const
const OUString & GetNameByKey(sal_uInt16 nKey) const
void IgnorableWhitespace()
std::unique_ptr< char[]> aBuffer
Any makeAny(Color const &value)
#define SAL_WARN_IF(condition, area, stream)
const OUString & GetXMLToken(enum XMLTokenEnum eToken)
return the OUString representation for eToken
const char * pPropertyName
Handling of tokens in XML:
OReadImagesDocumentHandler::Image_XML_Namespace nNamespace
void exportDom(SvXMLExport &rExport, const Reference< XDocument > &xDocument)
Reference< XComponentContext > getProcessComponentContext()
void AddAttribute(const OUString &sName, const OUString &sValue)
Reference< XModel > xModel
css::uno::Any const SvXMLExport & rExport
virtual OUString SAL_CALL getValueByIndex(sal_Int16 i) override