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