Kaydet (Commit) 9c17f2b2 authored tarafından Luboš Luňák's avatar Luboš Luňák

wrap vararg sax functions in typesafe overloads

Now automatic conversions can take place (no getStr() needed),
and there are compile errors when used improperly. The FSEND terminator
is also no longer needed, but it's better to dump it only after
forgetting it no longer silently breaks backports.

Change-Id: Ib47e6eda2d5e12ce889b69bf2affbda3679c2d3f
üst a6d5ed52
This diff is collapsed.
...@@ -47,14 +47,16 @@ FastSerializerHelper::~FastSerializerHelper() ...@@ -47,14 +47,16 @@ FastSerializerHelper::~FastSerializerHelper()
delete mpSerializer; delete mpSerializer;
} }
void FastSerializerHelper::startElementV(sal_Int32 elementTokenId, va_list args) void FastSerializerHelper::startElementInternal(sal_Int32 elementTokenId, ...)
{ {
va_list args;
va_start( args, elementTokenId );
FastAttributeList* pAttrList = new FastAttributeList( mxTokenHandler ); FastAttributeList* pAttrList = new FastAttributeList( mxTokenHandler );
while (true) while (true)
{ {
sal_Int32 nName = va_arg(args, sal_Int32); sal_Int32 nName = va_arg(args, sal_Int32);
if (nName == FSEND) if (nName == FSEND_internal)
break; break;
const char* pValue = va_arg(args, const char*); const char* pValue = va_arg(args, const char*);
if (pValue) if (pValue)
...@@ -63,16 +65,19 @@ void FastSerializerHelper::startElementV(sal_Int32 elementTokenId, va_list args) ...@@ -63,16 +65,19 @@ void FastSerializerHelper::startElementV(sal_Int32 elementTokenId, va_list args)
const com::sun::star::uno::Reference<com::sun::star::xml::sax::XFastAttributeList> xAttrList(pAttrList); const com::sun::star::uno::Reference<com::sun::star::xml::sax::XFastAttributeList> xAttrList(pAttrList);
mpSerializer->startFastElement(elementTokenId, xAttrList); mpSerializer->startFastElement(elementTokenId, xAttrList);
va_end( args );
} }
void FastSerializerHelper::singleElementV(sal_Int32 elementTokenId, va_list args) void FastSerializerHelper::singleElementInternal(sal_Int32 elementTokenId, ...)
{ {
va_list args;
va_start( args, elementTokenId );
FastAttributeList* pAttrList = new FastAttributeList( mxTokenHandler ); FastAttributeList* pAttrList = new FastAttributeList( mxTokenHandler );
while (true) while (true)
{ {
sal_Int32 nName = va_arg(args, sal_Int32); sal_Int32 nName = va_arg(args, sal_Int32);
if (nName == FSEND) if (nName == FSEND_internal)
break; break;
const char* pValue = va_arg(args, const char*); const char* pValue = va_arg(args, const char*);
if (pValue) if (pValue)
...@@ -81,6 +86,7 @@ void FastSerializerHelper::singleElementV(sal_Int32 elementTokenId, va_list args ...@@ -81,6 +86,7 @@ void FastSerializerHelper::singleElementV(sal_Int32 elementTokenId, va_list args
const com::sun::star::uno::Reference<com::sun::star::xml::sax::XFastAttributeList> xAttrList(pAttrList); const com::sun::star::uno::Reference<com::sun::star::xml::sax::XFastAttributeList> xAttrList(pAttrList);
mpSerializer->singleFastElement(elementTokenId, xAttrList); mpSerializer->singleFastElement(elementTokenId, xAttrList);
va_end( args );
} }
void FastSerializerHelper::endElement(sal_Int32 elementTokenId) void FastSerializerHelper::endElement(sal_Int32 elementTokenId)
...@@ -88,13 +94,13 @@ void FastSerializerHelper::endElement(sal_Int32 elementTokenId) ...@@ -88,13 +94,13 @@ void FastSerializerHelper::endElement(sal_Int32 elementTokenId)
mpSerializer->endFastElement(elementTokenId); mpSerializer->endFastElement(elementTokenId);
} }
void FastSerializerHelper::startElementV(sal_Int32 elementTokenId, XFastAttributeListRef xAttrList) void FastSerializerHelper::startElement(sal_Int32 elementTokenId, XFastAttributeListRef xAttrList)
{ {
mpSerializer->startFastElement(elementTokenId, xAttrList); mpSerializer->startFastElement(elementTokenId, xAttrList);
} }
void FastSerializerHelper::singleElementV(sal_Int32 elementTokenId, XFastAttributeListRef xAttrList) void FastSerializerHelper::singleElement(sal_Int32 elementTokenId, XFastAttributeListRef xAttrList)
{ {
mpSerializer->singleFastElement(elementTokenId, xAttrList); mpSerializer->singleFastElement(elementTokenId, xAttrList);
} }
......
...@@ -999,7 +999,7 @@ sax_fastparser::FSHelperPtr XclExpXmlStream::GetStreamForPath( const OUString& s ...@@ -999,7 +999,7 @@ sax_fastparser::FSHelperPtr XclExpXmlStream::GetStreamForPath( const OUString& s
return maOpenedStreamMap[ sPath ].second; return maOpenedStreamMap[ sPath ].second;
} }
sax_fastparser::FSHelperPtr& XclExpXmlStream::WriteAttributes( sal_Int32 nAttribute, ... ) sax_fastparser::FSHelperPtr& XclExpXmlStream::WriteAttributesInternal( sal_Int32 nAttribute, ... )
{ {
sax_fastparser::FSHelperPtr& rStream = GetCurrentStream(); sax_fastparser::FSHelperPtr& rStream = GetCurrentStream();
...@@ -1017,7 +1017,7 @@ sax_fastparser::FSHelperPtr& XclExpXmlStream::WriteAttributes( sal_Int32 nAttrib ...@@ -1017,7 +1017,7 @@ sax_fastparser::FSHelperPtr& XclExpXmlStream::WriteAttributes( sal_Int32 nAttrib
} }
nAttribute = va_arg( args, sal_Int32 ); nAttribute = va_arg( args, sal_Int32 );
if( nAttribute == FSEND ) if( nAttribute == FSEND_internal )
break; break;
} while( true ); } while( true );
va_end( args ); va_end( args );
......
...@@ -311,7 +311,10 @@ public: ...@@ -311,7 +311,10 @@ public:
sax_fastparser::FSHelperPtr GetStreamForPath( const ::rtl::OUString& rPath ); sax_fastparser::FSHelperPtr GetStreamForPath( const ::rtl::OUString& rPath );
sax_fastparser::FSHelperPtr& WriteAttributes( sal_Int32 nAttribute, ... ); sax_fastparser::FSHelperPtr& WriteAttributes( sal_Int32 nAttribute, const char* value, FSEND_t )
{ return WriteAttributesInternal( nAttribute, value, FSEND_internal ); }
sax_fastparser::FSHelperPtr& WriteAttributes( sal_Int32 nAttribute, const OString& value, FSEND_t )
{ return WriteAttributesInternal( nAttribute, value.getStr(), FSEND_internal ); }
sax_fastparser::FSHelperPtr CreateOutputStream ( sax_fastparser::FSHelperPtr CreateOutputStream (
const ::rtl::OUString& sFullStream, const ::rtl::OUString& sFullStream,
...@@ -331,10 +334,41 @@ public: ...@@ -331,10 +334,41 @@ public:
virtual const oox::drawingml::table::TableStyleListPtr getTableStyles(); virtual const oox::drawingml::table::TableStyleListPtr getTableStyles();
virtual oox::drawingml::chart::ChartConverter* getChartConverter(); virtual oox::drawingml::chart::ChartConverter* getChartConverter();
/*
Now create all the overloads in a typesafe way (i.e. without varargs) by creating a number of overloads
up to a certain reasonable limit (feel free to raise it). This would be a lot easier with C++11 vararg templates.
*/
// now overloads for 2 and more pairs
#define SAX_ARGS_FUNC_DECL( argsdecl, argsuse ) \
sax_fastparser::FSHelperPtr& WriteAttributes( argsdecl, FSEND_t ) \
{ return WriteAttributesInternal( argsuse, FSEND_internal ); }
#define SAX_ARGS_FUNC_NUM( decl1, decl2, use1, use2, convert, num ) \
SAX_ARGS_FUNC_DECL( SAX_ARGS_ARG##num( decl1, decl2, ), SAX_ARGS_ARG##num( use1, use2, convert ))
#define SAX_ARGS_FUNC_SUBST( type, convert, num ) \
SAX_ARGS_FUNC_NUM( sal_Int32 attribute, type value, attribute, value, convert, num )
#define SAX_ARGS_FUNC( arg, convert ) SAX_ARGS_FUNC_SUBST( arg, convert, 2 ) \
SAX_ARGS_FUNC_SUBST( arg, convert, 3 ) SAX_ARGS_FUNC_SUBST( arg, convert, 4 ) \
SAX_ARGS_FUNC_SUBST( arg, convert, 5 ) SAX_ARGS_FUNC_SUBST( arg, convert, 6 ) \
SAX_ARGS_FUNC_SUBST( arg, convert, 7 ) SAX_ARGS_FUNC_SUBST( arg, convert, 8 ) \
SAX_ARGS_FUNC_SUBST( arg, convert, 9 ) SAX_ARGS_FUNC_SUBST( arg, convert, 10 ) \
SAX_ARGS_FUNC_SUBST( arg, convert, 11 ) SAX_ARGS_FUNC_SUBST( arg, convert, 12 ) \
SAX_ARGS_FUNC_SUBST( arg, convert, 13 ) SAX_ARGS_FUNC_SUBST( arg, convert, 14 ) \
SAX_ARGS_FUNC_SUBST( arg, convert, 15 ) SAX_ARGS_FUNC_SUBST( arg, convert, 16 ) \
SAX_ARGS_FUNC_SUBST( arg, convert, 17 ) SAX_ARGS_FUNC_SUBST( arg, convert, 18 ) \
SAX_ARGS_FUNC_SUBST( arg, convert, 19 ) SAX_ARGS_FUNC_SUBST( arg, convert, 20 ) \
SAX_ARGS_FUNC_SUBST( arg, convert, 21 ) SAX_ARGS_FUNC_SUBST( arg, convert, 22 )
SAX_ARGS_FUNC( const char*, )
SAX_ARGS_FUNC( const OString&, .getStr() )
#undef SAX_ARGS_FUNC_DECL
#undef SAX_ARGS_FUNC_NUM
#undef SAX_ARGS_FUNC_SUBST
#undef SAX_ARGS_FUNC
private: private:
virtual ::oox::ole::VbaProject* implCreateVbaProject() const; virtual ::oox::ole::VbaProject* implCreateVbaProject() const;
virtual ::rtl::OUString implGetImplementationName() const; virtual ::rtl::OUString implGetImplementationName() const;
ScDocShell *getDocShell(); ScDocShell *getDocShell();
sax_fastparser::FSHelperPtr& WriteAttributesInternal( sal_Int32 nAttribute, ... );
typedef std::map< ::rtl::OUString, typedef std::map< ::rtl::OUString,
std::pair< ::rtl::OUString, std::pair< ::rtl::OUString,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment