1*cdf0e10cSrcweir #include <sax/fshelper.hxx> 2*cdf0e10cSrcweir #include "fastserializer.hxx" 3*cdf0e10cSrcweir #include <com/sun/star/xml/sax/XFastTokenHandler.hpp> 4*cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 5*cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 6*cdf0e10cSrcweir 7*cdf0e10cSrcweir using namespace ::com::sun::star; 8*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 9*cdf0e10cSrcweir 10*cdf0e10cSrcweir namespace sax_fastparser { 11*cdf0e10cSrcweir 12*cdf0e10cSrcweir FastSerializerHelper::FastSerializerHelper(const Reference< io::XOutputStream >& xOutputStream ) : 13*cdf0e10cSrcweir mpSerializer(new FastSaxSerializer()) 14*cdf0e10cSrcweir { 15*cdf0e10cSrcweir Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext(), UNO_SET_THROW ); 16*cdf0e10cSrcweir Reference< lang::XMultiComponentFactory > xFactory( xContext->getServiceManager(), UNO_SET_THROW ); 17*cdf0e10cSrcweir mxTokenHandler.set( xFactory->createInstanceWithContext( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.sax.FastTokenHandler") ), xContext ), UNO_QUERY_THROW ); 18*cdf0e10cSrcweir 19*cdf0e10cSrcweir mpSerializer->setFastTokenHandler( mxTokenHandler ); 20*cdf0e10cSrcweir mpSerializer->setOutputStream( xOutputStream ); 21*cdf0e10cSrcweir mpSerializer->startDocument(); 22*cdf0e10cSrcweir } 23*cdf0e10cSrcweir 24*cdf0e10cSrcweir FastSerializerHelper::~FastSerializerHelper() 25*cdf0e10cSrcweir { 26*cdf0e10cSrcweir mpSerializer->endDocument(); 27*cdf0e10cSrcweir delete mpSerializer; 28*cdf0e10cSrcweir } 29*cdf0e10cSrcweir 30*cdf0e10cSrcweir void FastSerializerHelper::startElement(const char* elementName, ...) 31*cdf0e10cSrcweir { 32*cdf0e10cSrcweir FastAttributeList* pAttrList = new FastAttributeList( mxTokenHandler ); 33*cdf0e10cSrcweir va_list args; 34*cdf0e10cSrcweir va_start(args, elementName); 35*cdf0e10cSrcweir while (true) 36*cdf0e10cSrcweir { 37*cdf0e10cSrcweir const char* pName = va_arg(args, const char*); 38*cdf0e10cSrcweir if (!pName) 39*cdf0e10cSrcweir break; 40*cdf0e10cSrcweir const char* pValue = va_arg(args, const char*); 41*cdf0e10cSrcweir if (pValue) 42*cdf0e10cSrcweir pAttrList->addUnknown(pName, pValue); 43*cdf0e10cSrcweir } 44*cdf0e10cSrcweir va_end(args); 45*cdf0e10cSrcweir const com::sun::star::uno::Reference<com::sun::star::xml::sax::XFastAttributeList> xAttrList(pAttrList); 46*cdf0e10cSrcweir mpSerializer->startUnknownElement(::rtl::OUString(), ::rtl::OUString::createFromAscii(elementName), xAttrList); 47*cdf0e10cSrcweir } 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir void FastSerializerHelper::singleElement(const char* elementName, ...) 50*cdf0e10cSrcweir { 51*cdf0e10cSrcweir FastAttributeList* pAttrList = new FastAttributeList( mxTokenHandler ); 52*cdf0e10cSrcweir va_list args; 53*cdf0e10cSrcweir va_start(args, elementName); 54*cdf0e10cSrcweir while (true) 55*cdf0e10cSrcweir { 56*cdf0e10cSrcweir const char* pName = va_arg(args, const char*); 57*cdf0e10cSrcweir if (!pName) 58*cdf0e10cSrcweir break; 59*cdf0e10cSrcweir const char* pValue = va_arg(args, const char*); 60*cdf0e10cSrcweir if (pValue) 61*cdf0e10cSrcweir pAttrList->addUnknown(pName, pValue); 62*cdf0e10cSrcweir } 63*cdf0e10cSrcweir va_end(args); 64*cdf0e10cSrcweir const com::sun::star::uno::Reference<com::sun::star::xml::sax::XFastAttributeList> xAttrList(pAttrList); 65*cdf0e10cSrcweir mpSerializer->singleUnknownElement(::rtl::OUString(), ::rtl::OUString::createFromAscii(elementName), xAttrList); 66*cdf0e10cSrcweir } 67*cdf0e10cSrcweir 68*cdf0e10cSrcweir void FastSerializerHelper::endElement(const char* elementName) 69*cdf0e10cSrcweir { 70*cdf0e10cSrcweir mpSerializer->endUnknownElement(::rtl::OUString(), ::rtl::OUString::createFromAscii(elementName)); 71*cdf0e10cSrcweir } 72*cdf0e10cSrcweir 73*cdf0e10cSrcweir void FastSerializerHelper::startElementV(sal_Int32 elementTokenId, va_list args) 74*cdf0e10cSrcweir { 75*cdf0e10cSrcweir FastAttributeList* pAttrList = new FastAttributeList( mxTokenHandler ); 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir while (true) 78*cdf0e10cSrcweir { 79*cdf0e10cSrcweir sal_Int32 nName = va_arg(args, sal_Int32); 80*cdf0e10cSrcweir if (nName == FSEND) 81*cdf0e10cSrcweir break; 82*cdf0e10cSrcweir const char* pValue = va_arg(args, const char*); 83*cdf0e10cSrcweir if (pValue) 84*cdf0e10cSrcweir pAttrList->add(nName, pValue); 85*cdf0e10cSrcweir } 86*cdf0e10cSrcweir 87*cdf0e10cSrcweir const com::sun::star::uno::Reference<com::sun::star::xml::sax::XFastAttributeList> xAttrList(pAttrList); 88*cdf0e10cSrcweir mpSerializer->startFastElement(elementTokenId, xAttrList); 89*cdf0e10cSrcweir } 90*cdf0e10cSrcweir 91*cdf0e10cSrcweir void FastSerializerHelper::singleElementV(sal_Int32 elementTokenId, va_list args) 92*cdf0e10cSrcweir { 93*cdf0e10cSrcweir FastAttributeList* pAttrList = new FastAttributeList( mxTokenHandler ); 94*cdf0e10cSrcweir 95*cdf0e10cSrcweir while (true) 96*cdf0e10cSrcweir { 97*cdf0e10cSrcweir sal_Int32 nName = va_arg(args, sal_Int32); 98*cdf0e10cSrcweir if (nName == FSEND) 99*cdf0e10cSrcweir break; 100*cdf0e10cSrcweir const char* pValue = va_arg(args, const char*); 101*cdf0e10cSrcweir if (pValue) 102*cdf0e10cSrcweir pAttrList->add(nName, pValue); 103*cdf0e10cSrcweir } 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir const com::sun::star::uno::Reference<com::sun::star::xml::sax::XFastAttributeList> xAttrList(pAttrList); 106*cdf0e10cSrcweir mpSerializer->singleFastElement(elementTokenId, xAttrList); 107*cdf0e10cSrcweir } 108*cdf0e10cSrcweir 109*cdf0e10cSrcweir void FastSerializerHelper::endElement(sal_Int32 elementTokenId) 110*cdf0e10cSrcweir { 111*cdf0e10cSrcweir mpSerializer->endFastElement(elementTokenId); 112*cdf0e10cSrcweir } 113*cdf0e10cSrcweir 114*cdf0e10cSrcweir void FastSerializerHelper::startElementV(sal_Int32 elementTokenId, XFastAttributeListRef xAttrList) 115*cdf0e10cSrcweir { 116*cdf0e10cSrcweir mpSerializer->startFastElement(elementTokenId, xAttrList); 117*cdf0e10cSrcweir } 118*cdf0e10cSrcweir 119*cdf0e10cSrcweir 120*cdf0e10cSrcweir void FastSerializerHelper::singleElement(const char* elementName, XFastAttributeListRef xAttrList) 121*cdf0e10cSrcweir { 122*cdf0e10cSrcweir mpSerializer->singleUnknownElement(::rtl::OUString(), ::rtl::OUString::createFromAscii(elementName), xAttrList); 123*cdf0e10cSrcweir } 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir void FastSerializerHelper::singleElementV(sal_Int32 elementTokenId, XFastAttributeListRef xAttrList) 126*cdf0e10cSrcweir { 127*cdf0e10cSrcweir mpSerializer->singleFastElement(elementTokenId, xAttrList); 128*cdf0e10cSrcweir } 129*cdf0e10cSrcweir 130*cdf0e10cSrcweir FastSerializerHelper* FastSerializerHelper::write(const char* value) 131*cdf0e10cSrcweir { 132*cdf0e10cSrcweir return write(rtl::OUString::createFromAscii(value)); 133*cdf0e10cSrcweir } 134*cdf0e10cSrcweir 135*cdf0e10cSrcweir FastSerializerHelper* FastSerializerHelper::write(const rtl::OUString& value) 136*cdf0e10cSrcweir { 137*cdf0e10cSrcweir mpSerializer->characters(value); 138*cdf0e10cSrcweir return this; 139*cdf0e10cSrcweir } 140*cdf0e10cSrcweir 141*cdf0e10cSrcweir FastSerializerHelper* FastSerializerHelper::write(sal_Int32 value) 142*cdf0e10cSrcweir { 143*cdf0e10cSrcweir return write(::rtl::OUString::valueOf(value)); 144*cdf0e10cSrcweir } 145*cdf0e10cSrcweir 146*cdf0e10cSrcweir FastSerializerHelper* FastSerializerHelper::write(sal_Int64 value) 147*cdf0e10cSrcweir { 148*cdf0e10cSrcweir return write(::rtl::OUString::valueOf(value)); 149*cdf0e10cSrcweir } 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir FastSerializerHelper* FastSerializerHelper::write(float value) 152*cdf0e10cSrcweir { 153*cdf0e10cSrcweir return write(::rtl::OUString::valueOf(value)); 154*cdf0e10cSrcweir } 155*cdf0e10cSrcweir 156*cdf0e10cSrcweir FastSerializerHelper* FastSerializerHelper::write(double value) 157*cdf0e10cSrcweir { 158*cdf0e10cSrcweir return write(::rtl::OUString::valueOf(value)); 159*cdf0e10cSrcweir } 160*cdf0e10cSrcweir 161*cdf0e10cSrcweir FastSerializerHelper* FastSerializerHelper::writeEscaped(const char* value) 162*cdf0e10cSrcweir { 163*cdf0e10cSrcweir return writeEscaped(::rtl::OUString::createFromAscii(value)); 164*cdf0e10cSrcweir } 165*cdf0e10cSrcweir 166*cdf0e10cSrcweir FastSerializerHelper* FastSerializerHelper::writeEscaped(const ::rtl::OUString& value) 167*cdf0e10cSrcweir { 168*cdf0e10cSrcweir return write(FastSaxSerializer::escapeXml(value)); 169*cdf0e10cSrcweir } 170*cdf0e10cSrcweir 171*cdf0e10cSrcweir FastSerializerHelper* FastSerializerHelper::writeId(sal_Int32 tokenId) 172*cdf0e10cSrcweir { 173*cdf0e10cSrcweir mpSerializer->writeId(tokenId); 174*cdf0e10cSrcweir return this; 175*cdf0e10cSrcweir } 176*cdf0e10cSrcweir 177*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > FastSerializerHelper::getOutputStream() 178*cdf0e10cSrcweir { 179*cdf0e10cSrcweir return mpSerializer->getOutputStream(); 180*cdf0e10cSrcweir } 181*cdf0e10cSrcweir 182*cdf0e10cSrcweir void FastSerializerHelper::mark() 183*cdf0e10cSrcweir { 184*cdf0e10cSrcweir mpSerializer->mark(); 185*cdf0e10cSrcweir } 186*cdf0e10cSrcweir 187*cdf0e10cSrcweir void FastSerializerHelper::mergeTopMarks( MergeMarksEnum eMergeType ) 188*cdf0e10cSrcweir { 189*cdf0e10cSrcweir mpSerializer->mergeTopMarks( eMergeType ); 190*cdf0e10cSrcweir } 191*cdf0e10cSrcweir 192*cdf0e10cSrcweir FastAttributeList * FastSerializerHelper::createAttrList() 193*cdf0e10cSrcweir { 194*cdf0e10cSrcweir return new FastAttributeList( mxTokenHandler ); 195*cdf0e10cSrcweir } 196*cdf0e10cSrcweir 197*cdf0e10cSrcweir 198*cdf0e10cSrcweir } 199