189dcb3daSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 389dcb3daSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 489dcb3daSAndrew Rist * or more contributor license agreements. See the NOTICE file 589dcb3daSAndrew Rist * distributed with this work for additional information 689dcb3daSAndrew Rist * regarding copyright ownership. The ASF licenses this file 789dcb3daSAndrew Rist * to you under the Apache License, Version 2.0 (the 889dcb3daSAndrew Rist * "License"); you may not use this file except in compliance 989dcb3daSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 1189dcb3daSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 1389dcb3daSAndrew Rist * Unless required by applicable law or agreed to in writing, 1489dcb3daSAndrew Rist * software distributed under the License is distributed on an 1589dcb3daSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 1689dcb3daSAndrew Rist * KIND, either express or implied. See the License for the 1789dcb3daSAndrew Rist * specific language governing permissions and limitations 1889dcb3daSAndrew Rist * under the License. 19cdf0e10cSrcweir * 2089dcb3daSAndrew Rist *************************************************************/ 2189dcb3daSAndrew Rist 2289dcb3daSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_xmlhelp.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #define WORKAROUND_98119 28cdf0e10cSrcweir 29cdf0e10cSrcweir #ifdef WORKAROUND_98119 30cdf0e10cSrcweir #include "bufferedinputstream.hxx" 31cdf0e10cSrcweir #endif 32cdf0e10cSrcweir 33cdf0e10cSrcweir #include <string.h> 34cdf0e10cSrcweir #ifndef _VOS_DIAGNOSE_HXX_ 35cdf0e10cSrcweir #include <vos/diagnose.hxx> 36cdf0e10cSrcweir #endif 37cdf0e10cSrcweir #include <osl/thread.h> 38cdf0e10cSrcweir #include <rtl/memory.h> 39cdf0e10cSrcweir #include <osl/file.hxx> 40cdf0e10cSrcweir #include <cppuhelper/weak.hxx> 41cdf0e10cSrcweir #include <cppuhelper/queryinterface.hxx> 42cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 43cdf0e10cSrcweir #include <rtl/uri.hxx> 44cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 45cdf0e10cSrcweir #include <libxslt/xslt.h> 46cdf0e10cSrcweir #include <libxslt/transform.h> 47cdf0e10cSrcweir #include <libxslt/xsltutils.h> 48cdf0e10cSrcweir #include "db.hxx" 49cdf0e10cSrcweir #include <com/sun/star/io/XActiveDataSink.hpp> 50cdf0e10cSrcweir #include <com/sun/star/io/XInputStream.hpp> 51cdf0e10cSrcweir #include <com/sun/star/io/XSeekable.hpp> 52cdf0e10cSrcweir #include <com/sun/star/ucb/OpenCommandArgument2.hpp> 53cdf0e10cSrcweir #include <com/sun/star/ucb/OpenMode.hpp> 54cdf0e10cSrcweir #include <com/sun/star/ucb/XCommandProcessor.hpp> 55cdf0e10cSrcweir #include <com/sun/star/ucb/XCommandEnvironment.hpp> 56cdf0e10cSrcweir #include <com/sun/star/ucb/XContentIdentifier.hpp> 57cdf0e10cSrcweir #include <com/sun/star/ucb/XContentProvider.hpp> 58cdf0e10cSrcweir #include <com/sun/star/ucb/XContentIdentifierFactory.hpp> 59cdf0e10cSrcweir #include <com/sun/star/container/XHierarchicalNameAccess.hpp> 60cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 61cdf0e10cSrcweir 62cdf0e10cSrcweir #include "urlparameter.hxx" 63cdf0e10cSrcweir #include "databases.hxx" 64cdf0e10cSrcweir 65cdf0e10cSrcweir namespace chelp { 66cdf0e10cSrcweir 67cdf0e10cSrcweir inline bool ascii_isDigit( sal_Unicode ch ) 68cdf0e10cSrcweir { 69cdf0e10cSrcweir return ((ch >= 0x0030) && (ch <= 0x0039)); 70cdf0e10cSrcweir } 71cdf0e10cSrcweir 72cdf0e10cSrcweir inline bool ascii_isLetter( sal_Unicode ch ) 73cdf0e10cSrcweir { 74cdf0e10cSrcweir return ( ( (ch >= 0x0041) && (ch <= 0x005A) ) || 75cdf0e10cSrcweir ( (ch >= 0x0061) && (ch <= 0x007A) ) ); 76cdf0e10cSrcweir } 77cdf0e10cSrcweir 78cdf0e10cSrcweir inline bool isLetterOrDigit( sal_Unicode ch ) 79cdf0e10cSrcweir { 80cdf0e10cSrcweir return ascii_isLetter( ch ) || ascii_isDigit( ch ); 81cdf0e10cSrcweir } 82cdf0e10cSrcweir 83cdf0e10cSrcweir } 84cdf0e10cSrcweir 85cdf0e10cSrcweir using namespace cppu; 86cdf0e10cSrcweir using namespace com::sun::star::io; 87cdf0e10cSrcweir using namespace com::sun::star::uno; 88cdf0e10cSrcweir using namespace com::sun::star::lang; 89cdf0e10cSrcweir using namespace com::sun::star::ucb; 90cdf0e10cSrcweir using namespace com::sun::star::beans; 91cdf0e10cSrcweir using namespace com::sun::star::container; 92cdf0e10cSrcweir using namespace chelp; 93cdf0e10cSrcweir 94cdf0e10cSrcweir 95cdf0e10cSrcweir URLParameter::URLParameter( const rtl::OUString& aURL, 96cdf0e10cSrcweir Databases* pDatabases ) 97cdf0e10cSrcweir throw( com::sun::star::ucb::IllegalIdentifierException ) 98cdf0e10cSrcweir : m_pDatabases( pDatabases ), 99cdf0e10cSrcweir m_aURL( aURL ) 100cdf0e10cSrcweir { 101cdf0e10cSrcweir init( false ); 102cdf0e10cSrcweir parse(); 103cdf0e10cSrcweir } 104cdf0e10cSrcweir 105cdf0e10cSrcweir 106cdf0e10cSrcweir bool URLParameter::isErrorDocument() 107cdf0e10cSrcweir { 108cdf0e10cSrcweir bool bErrorDoc = false; 109cdf0e10cSrcweir 110cdf0e10cSrcweir if( isFile() ) 111cdf0e10cSrcweir { 112cdf0e10cSrcweir Reference< XHierarchicalNameAccess > xNA = 113cdf0e10cSrcweir m_pDatabases->findJarFileForPath( get_jar(), get_language(), get_path() ); 114cdf0e10cSrcweir bErrorDoc = !xNA.is(); 115cdf0e10cSrcweir } 116cdf0e10cSrcweir 117cdf0e10cSrcweir return bErrorDoc; 118cdf0e10cSrcweir } 119cdf0e10cSrcweir 120cdf0e10cSrcweir 121cdf0e10cSrcweir rtl::OString URLParameter::getByName( const char* par ) 122cdf0e10cSrcweir { 123cdf0e10cSrcweir rtl::OUString val; 124cdf0e10cSrcweir 125cdf0e10cSrcweir if( strcmp( par,"Program" ) == 0 ) 126cdf0e10cSrcweir val = get_program(); 127cdf0e10cSrcweir else if( strcmp( par,"Database" ) == 0 ) 128cdf0e10cSrcweir val = get_module(); 129cdf0e10cSrcweir else if( strcmp( par,"DatabasePar" ) == 0 ) 130cdf0e10cSrcweir val = get_dbpar(); 131cdf0e10cSrcweir else if( strcmp( par,"Id" ) == 0 ) 132cdf0e10cSrcweir val = get_id(); 133cdf0e10cSrcweir else if( strcmp( par,"Path" ) == 0 ) 134cdf0e10cSrcweir val = get_path(); 135cdf0e10cSrcweir else if( strcmp( par,"Language" ) == 0 ) 136cdf0e10cSrcweir val = get_language(); 137cdf0e10cSrcweir else if( strcmp( par,"System" ) == 0 ) 138cdf0e10cSrcweir val = get_system(); 139cdf0e10cSrcweir else if( strcmp( par,"HelpPrefix" ) == 0 ) 140cdf0e10cSrcweir val = get_prefix(); 141cdf0e10cSrcweir 142cdf0e10cSrcweir return rtl::OString( val.getStr(),val.getLength(),RTL_TEXTENCODING_UTF8 ); 143cdf0e10cSrcweir } 144cdf0e10cSrcweir 145cdf0e10cSrcweir 146cdf0e10cSrcweir rtl::OUString URLParameter::get_id() 147cdf0e10cSrcweir { 148cdf0e10cSrcweir if( m_aId.compareToAscii("start") == 0 ) 149cdf0e10cSrcweir { // module is set 150cdf0e10cSrcweir StaticModuleInformation* inf = 151cdf0e10cSrcweir m_pDatabases->getStaticInformationForModule( get_module(), 152cdf0e10cSrcweir get_language() ); 153cdf0e10cSrcweir if( inf ) 154cdf0e10cSrcweir m_aId = inf->get_id(); 155cdf0e10cSrcweir 156cdf0e10cSrcweir m_bStart = true; 157cdf0e10cSrcweir } 158cdf0e10cSrcweir 159cdf0e10cSrcweir return m_aId; 160cdf0e10cSrcweir } 161cdf0e10cSrcweir 162cdf0e10cSrcweir rtl::OUString URLParameter::get_tag() 163cdf0e10cSrcweir { 164cdf0e10cSrcweir if( isFile() ) 165cdf0e10cSrcweir return get_the_tag(); 166cdf0e10cSrcweir else 167cdf0e10cSrcweir return m_aTag; 168cdf0e10cSrcweir } 169cdf0e10cSrcweir 170cdf0e10cSrcweir 171cdf0e10cSrcweir rtl::OUString URLParameter::get_title() 172cdf0e10cSrcweir { 173cdf0e10cSrcweir if( isFile() ) 174cdf0e10cSrcweir return get_the_title(); 175cdf0e10cSrcweir else if( m_aModule.compareToAscii("") != 0 ) 176cdf0e10cSrcweir { 177cdf0e10cSrcweir StaticModuleInformation* inf = 178cdf0e10cSrcweir m_pDatabases->getStaticInformationForModule( get_module(), 179cdf0e10cSrcweir get_language() ); 180cdf0e10cSrcweir if( inf ) 181cdf0e10cSrcweir m_aTitle = inf->get_title(); 182cdf0e10cSrcweir } 183cdf0e10cSrcweir else // This must be the root 184cdf0e10cSrcweir m_aTitle = rtl::OUString::createFromAscii("root"); 185cdf0e10cSrcweir 186cdf0e10cSrcweir return m_aTitle; 187cdf0e10cSrcweir } 188cdf0e10cSrcweir 189cdf0e10cSrcweir 190cdf0e10cSrcweir rtl::OUString URLParameter::get_language() 191cdf0e10cSrcweir { 192cdf0e10cSrcweir if( m_aLanguage.getLength() == 0 ) 193cdf0e10cSrcweir return m_aDefaultLanguage; 194cdf0e10cSrcweir 195cdf0e10cSrcweir return m_aLanguage; 196cdf0e10cSrcweir } 197cdf0e10cSrcweir 198cdf0e10cSrcweir 199cdf0e10cSrcweir rtl::OUString URLParameter::get_program() 200cdf0e10cSrcweir { 201cdf0e10cSrcweir if( ! m_aProgram.getLength() ) 202cdf0e10cSrcweir { 203cdf0e10cSrcweir StaticModuleInformation* inf = 204cdf0e10cSrcweir m_pDatabases->getStaticInformationForModule( get_module(), 205cdf0e10cSrcweir get_language() ); 206cdf0e10cSrcweir if( inf ) 207cdf0e10cSrcweir m_aProgram = inf->get_program(); 208cdf0e10cSrcweir } 209cdf0e10cSrcweir return m_aProgram; 210cdf0e10cSrcweir } 211cdf0e10cSrcweir 212cdf0e10cSrcweir 213cdf0e10cSrcweir void URLParameter::init( bool bDefaultLanguageIsInitialized ) 214cdf0e10cSrcweir { 215cdf0e10cSrcweir (void)bDefaultLanguageIsInitialized; 216cdf0e10cSrcweir 217*70e197d9SHerbert Dürr m_bHelpDataFileRead = false; 218cdf0e10cSrcweir m_bStart = false; 219cdf0e10cSrcweir m_bUseDB = true; 220cdf0e10cSrcweir m_nHitCount = 100; // The default maximum hitcount 221cdf0e10cSrcweir } 222cdf0e10cSrcweir 223cdf0e10cSrcweir 224cdf0e10cSrcweir rtl::OUString URLParameter::get_the_tag() 225cdf0e10cSrcweir { 226cdf0e10cSrcweir if(m_bUseDB) { 227*70e197d9SHerbert Dürr if( ! m_bHelpDataFileRead ) 228*70e197d9SHerbert Dürr readHelpDataFile(); 229cdf0e10cSrcweir 230*70e197d9SHerbert Dürr m_bHelpDataFileRead = true; 231cdf0e10cSrcweir 232cdf0e10cSrcweir return m_aTag; 233cdf0e10cSrcweir } 234cdf0e10cSrcweir else 235cdf0e10cSrcweir return rtl::OUString(); 236cdf0e10cSrcweir } 237cdf0e10cSrcweir 238cdf0e10cSrcweir 239cdf0e10cSrcweir 240cdf0e10cSrcweir rtl::OUString URLParameter::get_the_path() 241cdf0e10cSrcweir { 242cdf0e10cSrcweir if(m_bUseDB) { 243*70e197d9SHerbert Dürr if( ! m_bHelpDataFileRead ) 244*70e197d9SHerbert Dürr readHelpDataFile(); 245*70e197d9SHerbert Dürr m_bHelpDataFileRead = true; 246cdf0e10cSrcweir 247cdf0e10cSrcweir return m_aPath; 248cdf0e10cSrcweir } 249cdf0e10cSrcweir else 250cdf0e10cSrcweir return get_id(); 251cdf0e10cSrcweir } 252cdf0e10cSrcweir 253cdf0e10cSrcweir 254cdf0e10cSrcweir 255cdf0e10cSrcweir rtl::OUString URLParameter::get_the_title() 256cdf0e10cSrcweir { 257cdf0e10cSrcweir if(m_bUseDB) { 258*70e197d9SHerbert Dürr if( ! m_bHelpDataFileRead ) 259*70e197d9SHerbert Dürr readHelpDataFile(); 260*70e197d9SHerbert Dürr m_bHelpDataFileRead = true; 261cdf0e10cSrcweir 262cdf0e10cSrcweir return m_aTitle; 263cdf0e10cSrcweir } 264cdf0e10cSrcweir else 265cdf0e10cSrcweir return rtl::OUString(); 266cdf0e10cSrcweir } 267cdf0e10cSrcweir 268cdf0e10cSrcweir 269cdf0e10cSrcweir rtl::OUString URLParameter::get_the_jar() 270cdf0e10cSrcweir { 271cdf0e10cSrcweir if(m_bUseDB) { 272*70e197d9SHerbert Dürr if( ! m_bHelpDataFileRead ) 273*70e197d9SHerbert Dürr readHelpDataFile(); 274*70e197d9SHerbert Dürr m_bHelpDataFileRead = true; 275cdf0e10cSrcweir 276cdf0e10cSrcweir return m_aJar; 277cdf0e10cSrcweir } 278cdf0e10cSrcweir else 279cdf0e10cSrcweir return get_module() + rtl::OUString::createFromAscii(".jar"); 280cdf0e10cSrcweir } 281cdf0e10cSrcweir 282cdf0e10cSrcweir 283cdf0e10cSrcweir 284cdf0e10cSrcweir 285*70e197d9SHerbert Dürr void URLParameter::readHelpDataFile() 286cdf0e10cSrcweir { 287cdf0e10cSrcweir static rtl::OUString aQuestionMark( rtl::OUString::createFromAscii( "?" ) ); 288cdf0e10cSrcweir 289cdf0e10cSrcweir if( get_id().compareToAscii("") == 0 ) 290cdf0e10cSrcweir return; 291cdf0e10cSrcweir 292cdf0e10cSrcweir rtl::OUString aModule = get_module(); 293cdf0e10cSrcweir rtl::OUString aLanguage = get_language(); 294cdf0e10cSrcweir 295cdf0e10cSrcweir DataBaseIterator aDbIt( *m_pDatabases, aModule, aLanguage, false ); 296cdf0e10cSrcweir bool bSuccess = false; 297cdf0e10cSrcweir 298cdf0e10cSrcweir int nSize = 0; 299cdf0e10cSrcweir const sal_Char* pData = NULL; 300cdf0e10cSrcweir 301*70e197d9SHerbert Dürr helpdatafileproxy::HDFData aHDFData; 302cdf0e10cSrcweir rtl::OUString aExtensionPath; 303cdf0e10cSrcweir rtl::OUString aExtensionRegistryPath; 304cdf0e10cSrcweir while( true ) 305cdf0e10cSrcweir { 306*70e197d9SHerbert Dürr helpdatafileproxy::Hdf* pHdf = aDbIt.nextHdf( &aExtensionPath, &aExtensionRegistryPath ); 307*70e197d9SHerbert Dürr if( !pHdf ) 308cdf0e10cSrcweir break; 309cdf0e10cSrcweir 310cdf0e10cSrcweir rtl::OString keyStr( m_aId.getStr(),m_aId.getLength(),RTL_TEXTENCODING_UTF8 ); 311cdf0e10cSrcweir 312*70e197d9SHerbert Dürr bSuccess = pHdf->getValueForKey( keyStr, aHDFData ); 313cdf0e10cSrcweir if( bSuccess ) 314cdf0e10cSrcweir { 315*70e197d9SHerbert Dürr nSize = aHDFData.getSize(); 316*70e197d9SHerbert Dürr pData = aHDFData.getData(); 317cdf0e10cSrcweir break; 318cdf0e10cSrcweir } 319cdf0e10cSrcweir } 320cdf0e10cSrcweir 321cdf0e10cSrcweir if( bSuccess ) 322cdf0e10cSrcweir { 323cdf0e10cSrcweir DbtToStringConverter converter( pData, nSize ); 324cdf0e10cSrcweir m_aTitle = converter.getTitle(); 325cdf0e10cSrcweir m_pDatabases->replaceName( m_aTitle ); 326cdf0e10cSrcweir m_aPath = converter.getFile(); 327cdf0e10cSrcweir m_aJar = converter.getDatabase(); 328cdf0e10cSrcweir if( aExtensionPath.getLength() > 0 ) 329cdf0e10cSrcweir { 330cdf0e10cSrcweir rtl::OUStringBuffer aExtendedJarStrBuf; 331cdf0e10cSrcweir aExtendedJarStrBuf.append( aQuestionMark ); 332cdf0e10cSrcweir aExtendedJarStrBuf.append( aExtensionPath ); 333cdf0e10cSrcweir aExtendedJarStrBuf.append( aQuestionMark ); 334cdf0e10cSrcweir aExtendedJarStrBuf.append( m_aJar ); 335cdf0e10cSrcweir m_aJar = aExtendedJarStrBuf.makeStringAndClear(); 336cdf0e10cSrcweir m_aExtensionRegistryPath = aExtensionRegistryPath; 337cdf0e10cSrcweir } 338cdf0e10cSrcweir m_aTag = converter.getHash(); 339cdf0e10cSrcweir } 340cdf0e10cSrcweir } 341cdf0e10cSrcweir 342cdf0e10cSrcweir 343cdf0e10cSrcweir 344cdf0e10cSrcweir // Class encapsulating the transformation of the XInputStream to XHTML 345cdf0e10cSrcweir 346cdf0e10cSrcweir 347cdf0e10cSrcweir class InputStreamTransformer 348cdf0e10cSrcweir : public OWeakObject, 349cdf0e10cSrcweir public XInputStream, 350cdf0e10cSrcweir public XSeekable 351cdf0e10cSrcweir { 352cdf0e10cSrcweir public: 353cdf0e10cSrcweir 354cdf0e10cSrcweir InputStreamTransformer( URLParameter* urlParam, 355cdf0e10cSrcweir Databases* pDatatabases, 356cdf0e10cSrcweir bool isRoot = false ); 357cdf0e10cSrcweir 358cdf0e10cSrcweir ~InputStreamTransformer(); 359cdf0e10cSrcweir 360cdf0e10cSrcweir virtual Any SAL_CALL queryInterface( const Type& rType ) throw( RuntimeException ); 361cdf0e10cSrcweir virtual void SAL_CALL acquire( void ) throw(); 362cdf0e10cSrcweir virtual void SAL_CALL release( void ) throw(); 363cdf0e10cSrcweir 364cdf0e10cSrcweir virtual sal_Int32 SAL_CALL readBytes( Sequence< sal_Int8 >& aData,sal_Int32 nBytesToRead ) 365cdf0e10cSrcweir throw( NotConnectedException, 366cdf0e10cSrcweir BufferSizeExceededException, 367cdf0e10cSrcweir IOException, 368cdf0e10cSrcweir RuntimeException); 369cdf0e10cSrcweir 370cdf0e10cSrcweir virtual sal_Int32 SAL_CALL readSomeBytes( Sequence< sal_Int8 >& aData,sal_Int32 nMaxBytesToRead ) 371cdf0e10cSrcweir throw( NotConnectedException, 372cdf0e10cSrcweir BufferSizeExceededException, 373cdf0e10cSrcweir IOException, 374cdf0e10cSrcweir RuntimeException); 375cdf0e10cSrcweir 376cdf0e10cSrcweir virtual void SAL_CALL skipBytes( sal_Int32 nBytesToSkip ) throw( NotConnectedException, 377cdf0e10cSrcweir BufferSizeExceededException, 378cdf0e10cSrcweir IOException, 379cdf0e10cSrcweir RuntimeException ); 380cdf0e10cSrcweir 381cdf0e10cSrcweir virtual sal_Int32 SAL_CALL available( void ) throw( NotConnectedException, 382cdf0e10cSrcweir IOException, 383cdf0e10cSrcweir RuntimeException ); 384cdf0e10cSrcweir 385cdf0e10cSrcweir virtual void SAL_CALL closeInput( void ) throw( NotConnectedException, 386cdf0e10cSrcweir IOException, 387cdf0e10cSrcweir RuntimeException ); 388cdf0e10cSrcweir 389cdf0e10cSrcweir virtual void SAL_CALL seek( sal_Int64 location ) throw( IllegalArgumentException, 390cdf0e10cSrcweir IOException, 391cdf0e10cSrcweir RuntimeException ); 392cdf0e10cSrcweir 393cdf0e10cSrcweir virtual sal_Int64 SAL_CALL getPosition( void ) throw( IOException,RuntimeException ); 394cdf0e10cSrcweir 395cdf0e10cSrcweir virtual sal_Int64 SAL_CALL getLength( void ) throw( IOException,RuntimeException ); 396cdf0e10cSrcweir 397cdf0e10cSrcweir void addToBuffer( const char* buffer,int len ); 398cdf0e10cSrcweir 399cdf0e10cSrcweir sal_Int8* getData() const { return (sal_Int8*) buffer; } 400cdf0e10cSrcweir 401cdf0e10cSrcweir sal_Int32 getLen() const { return sal_Int32( len ); } 402cdf0e10cSrcweir 403cdf0e10cSrcweir private: 404cdf0e10cSrcweir 405cdf0e10cSrcweir osl::Mutex m_aMutex; 406cdf0e10cSrcweir 407cdf0e10cSrcweir int len,pos; 408cdf0e10cSrcweir char *buffer; 409cdf0e10cSrcweir }; 410cdf0e10cSrcweir 411cdf0e10cSrcweir 412cdf0e10cSrcweir 413cdf0e10cSrcweir void URLParameter::open( const Reference< XMultiServiceFactory >& rxSMgr, 414cdf0e10cSrcweir const Command& aCommand, 415cdf0e10cSrcweir sal_Int32 CommandId, 416cdf0e10cSrcweir const Reference< XCommandEnvironment >& Environment, 417cdf0e10cSrcweir const Reference< XOutputStream >& xDataSink ) 418cdf0e10cSrcweir { 419cdf0e10cSrcweir (void)rxSMgr; 420cdf0e10cSrcweir (void)aCommand; 421cdf0e10cSrcweir (void)CommandId; 422cdf0e10cSrcweir (void)Environment; 423cdf0e10cSrcweir 424cdf0e10cSrcweir if( ! xDataSink.is() ) 425cdf0e10cSrcweir return; 426cdf0e10cSrcweir 427cdf0e10cSrcweir if( isPicture() ) 428cdf0e10cSrcweir { 429cdf0e10cSrcweir Reference< XInputStream > xStream; 430cdf0e10cSrcweir Reference< XHierarchicalNameAccess > xNA = 431cdf0e10cSrcweir m_pDatabases->jarFile( rtl::OUString::createFromAscii( "picture.jar" ), 432cdf0e10cSrcweir get_language() ); 433cdf0e10cSrcweir 434cdf0e10cSrcweir rtl::OUString path = get_path(); 435cdf0e10cSrcweir if( xNA.is() ) 436cdf0e10cSrcweir { 437cdf0e10cSrcweir try 438cdf0e10cSrcweir { 439cdf0e10cSrcweir Any aEntry = xNA->getByHierarchicalName( path ); 440cdf0e10cSrcweir Reference< XActiveDataSink > xSink; 441cdf0e10cSrcweir if( ( aEntry >>= xSink ) && xSink.is() ) 442cdf0e10cSrcweir xStream = xSink->getInputStream(); 443cdf0e10cSrcweir } 444cdf0e10cSrcweir catch ( NoSuchElementException & ) 445cdf0e10cSrcweir { 446cdf0e10cSrcweir } 447cdf0e10cSrcweir } 448cdf0e10cSrcweir if( xStream.is() ) 449cdf0e10cSrcweir { 450cdf0e10cSrcweir sal_Int32 ret; 451cdf0e10cSrcweir Sequence< sal_Int8 > aSeq( 4096 ); 452cdf0e10cSrcweir while( true ) 453cdf0e10cSrcweir { 454cdf0e10cSrcweir try 455cdf0e10cSrcweir { 456cdf0e10cSrcweir ret = xStream->readBytes( aSeq,4096 ); 457cdf0e10cSrcweir xDataSink->writeBytes( aSeq ); 458cdf0e10cSrcweir if( ret < 4096 ) 459cdf0e10cSrcweir break; 460cdf0e10cSrcweir } 461cdf0e10cSrcweir catch( const Exception& ) 462cdf0e10cSrcweir { 463cdf0e10cSrcweir break; 464cdf0e10cSrcweir } 465cdf0e10cSrcweir } 466cdf0e10cSrcweir } 467cdf0e10cSrcweir } 468cdf0e10cSrcweir else 469cdf0e10cSrcweir { 470cdf0e10cSrcweir // a standard document or else an active help text, plug in the new input stream 471cdf0e10cSrcweir InputStreamTransformer* p = new InputStreamTransformer( this,m_pDatabases,isRoot() ); 472cdf0e10cSrcweir try 473cdf0e10cSrcweir { 474cdf0e10cSrcweir xDataSink->writeBytes( Sequence< sal_Int8 >( p->getData(),p->getLen() ) ); 475cdf0e10cSrcweir } 476cdf0e10cSrcweir catch( const Exception& ) 477cdf0e10cSrcweir { 478cdf0e10cSrcweir } 479cdf0e10cSrcweir delete p; 480cdf0e10cSrcweir } 481cdf0e10cSrcweir xDataSink->closeOutput(); 482cdf0e10cSrcweir } 483cdf0e10cSrcweir 484cdf0e10cSrcweir 485cdf0e10cSrcweir 486cdf0e10cSrcweir void URLParameter::open( const Reference< XMultiServiceFactory >& rxSMgr, 487cdf0e10cSrcweir const Command& aCommand, 488cdf0e10cSrcweir sal_Int32 CommandId, 489cdf0e10cSrcweir const Reference< XCommandEnvironment >& Environment, 490cdf0e10cSrcweir const Reference< XActiveDataSink >& xDataSink ) 491cdf0e10cSrcweir { 492cdf0e10cSrcweir (void)rxSMgr; 493cdf0e10cSrcweir (void)aCommand; 494cdf0e10cSrcweir (void)CommandId; 495cdf0e10cSrcweir (void)Environment; 496cdf0e10cSrcweir 497cdf0e10cSrcweir if( isPicture() ) 498cdf0e10cSrcweir { 499cdf0e10cSrcweir Reference< XInputStream > xStream; 500cdf0e10cSrcweir Reference< XHierarchicalNameAccess > xNA = 501cdf0e10cSrcweir m_pDatabases->jarFile( rtl::OUString::createFromAscii( "picture.jar" ), 502cdf0e10cSrcweir get_language() ); 503cdf0e10cSrcweir 504cdf0e10cSrcweir rtl::OUString path = get_path(); 505cdf0e10cSrcweir if( xNA.is() ) 506cdf0e10cSrcweir { 507cdf0e10cSrcweir try 508cdf0e10cSrcweir { 509cdf0e10cSrcweir Any aEntry = xNA->getByHierarchicalName( path ); 510cdf0e10cSrcweir Reference< XActiveDataSink > xSink; 511cdf0e10cSrcweir if( ( aEntry >>= xSink ) && xSink.is() ) 512cdf0e10cSrcweir xStream = xSink->getInputStream(); 513cdf0e10cSrcweir } 514cdf0e10cSrcweir catch ( NoSuchElementException & ) 515cdf0e10cSrcweir { 516cdf0e10cSrcweir } 517cdf0e10cSrcweir } 518cdf0e10cSrcweir #ifdef WORKAROUND_98119 519cdf0e10cSrcweir xDataSink->setInputStream( turnToSeekable(xStream) ); 520cdf0e10cSrcweir #else 521cdf0e10cSrcweir xDataSink->setInputStream( xStream ); 522cdf0e10cSrcweir #endif 523cdf0e10cSrcweir } 524cdf0e10cSrcweir else 525cdf0e10cSrcweir // a standard document or else an active help text, plug in the new input stream 526cdf0e10cSrcweir xDataSink->setInputStream( new InputStreamTransformer( this,m_pDatabases,isRoot() ) ); 527cdf0e10cSrcweir } 528cdf0e10cSrcweir 529cdf0e10cSrcweir 530cdf0e10cSrcweir // #include <stdio.h> 531cdf0e10cSrcweir 532cdf0e10cSrcweir void URLParameter::parse() throw( com::sun::star::ucb::IllegalIdentifierException ) 533cdf0e10cSrcweir { 534cdf0e10cSrcweir // fprintf(stdout,"url send to xmlhelp: %s\n",(rtl::OUStringToOString(m_aURL,RTL_TEXTENCODING_UTF8).getStr())); 535cdf0e10cSrcweir m_aExpr = m_aURL; 536cdf0e10cSrcweir 537cdf0e10cSrcweir sal_Int32 lstIdx = m_aExpr.lastIndexOf( sal_Unicode( '#' ) ); 538cdf0e10cSrcweir if( lstIdx != -1 ) 539cdf0e10cSrcweir m_aExpr = m_aExpr.copy( 0,lstIdx ); 540cdf0e10cSrcweir 541cdf0e10cSrcweir if( ! scheme() || 542cdf0e10cSrcweir ! name( module() ) || 543cdf0e10cSrcweir ! query() || 544cdf0e10cSrcweir ! m_aLanguage.getLength() || 545cdf0e10cSrcweir ! m_aSystem.getLength() ) 546cdf0e10cSrcweir throw com::sun::star::ucb::IllegalIdentifierException(); 547cdf0e10cSrcweir } 548cdf0e10cSrcweir 549cdf0e10cSrcweir 550cdf0e10cSrcweir bool URLParameter::scheme() 551cdf0e10cSrcweir { 552cdf0e10cSrcweir // Correct extension help links as sometimes the 553cdf0e10cSrcweir // module is missing resulting in a misformed URL 554cdf0e10cSrcweir if( m_aExpr.compareToAscii( "vnd.sun.star.help:///", 21 ) == 0 ) 555cdf0e10cSrcweir { 556cdf0e10cSrcweir sal_Int32 nLen = m_aExpr.getLength(); 557cdf0e10cSrcweir rtl::OUString aLastStr = m_aExpr.copy( nLen - 6 ); 558cdf0e10cSrcweir if( aLastStr.compareToAscii( "DbPAR=" ) == 0 ) 559cdf0e10cSrcweir { 560cdf0e10cSrcweir rtl::OUString aNewExpr = m_aExpr.copy( 0, 20 ); 561cdf0e10cSrcweir rtl::OUString aSharedStr = rtl::OUString::createFromAscii( "shared" ); 562cdf0e10cSrcweir aNewExpr += aSharedStr; 563cdf0e10cSrcweir aNewExpr += m_aExpr.copy( 20 ); 564cdf0e10cSrcweir aNewExpr += aSharedStr; 565cdf0e10cSrcweir m_aExpr = aNewExpr; 566cdf0e10cSrcweir } 567cdf0e10cSrcweir } 568cdf0e10cSrcweir 569cdf0e10cSrcweir for( sal_Int32 nPrefixLen = 20 ; nPrefixLen >= 18 ; --nPrefixLen ) 570cdf0e10cSrcweir { 571cdf0e10cSrcweir if( m_aExpr.compareToAscii( "vnd.sun.star.help://", nPrefixLen ) == 0 ) 572cdf0e10cSrcweir { 573cdf0e10cSrcweir m_aExpr = m_aExpr.copy( nPrefixLen ); 574cdf0e10cSrcweir return true; 575cdf0e10cSrcweir } 576cdf0e10cSrcweir } 577cdf0e10cSrcweir return false; 578cdf0e10cSrcweir } 579cdf0e10cSrcweir 580cdf0e10cSrcweir 581cdf0e10cSrcweir bool URLParameter::module() 582cdf0e10cSrcweir { 583cdf0e10cSrcweir sal_Int32 idx = 0,length = m_aExpr.getLength(); 584cdf0e10cSrcweir 585cdf0e10cSrcweir while( idx < length && isLetterOrDigit( (m_aExpr.getStr())[idx] ) ) 586cdf0e10cSrcweir ++idx; 587cdf0e10cSrcweir 588cdf0e10cSrcweir if( idx != 0 ) 589cdf0e10cSrcweir { 590cdf0e10cSrcweir m_aModule = m_aExpr.copy( 0,idx ); 591cdf0e10cSrcweir m_aExpr = m_aExpr.copy( idx ); 592cdf0e10cSrcweir return true; 593cdf0e10cSrcweir } 594cdf0e10cSrcweir else 595cdf0e10cSrcweir return false; 596cdf0e10cSrcweir } 597cdf0e10cSrcweir 598cdf0e10cSrcweir 599cdf0e10cSrcweir 600cdf0e10cSrcweir bool URLParameter::name( bool modulePresent ) 601cdf0e10cSrcweir { 602cdf0e10cSrcweir // if modulepresent, a name may be present, but must not 603cdf0e10cSrcweir 604cdf0e10cSrcweir sal_Int32 length = m_aExpr.getLength(); 605cdf0e10cSrcweir 606cdf0e10cSrcweir if( length != 0 && (m_aExpr.getStr())[0] == sal_Unicode( '/' ) ) 607cdf0e10cSrcweir { 608cdf0e10cSrcweir sal_Int32 idx = 1; 609cdf0e10cSrcweir while( idx < length && (m_aExpr.getStr())[idx] != '?' ) 610cdf0e10cSrcweir // ( isLetterOrDigit( (m_aExpr.getStr())[idx] ) 611cdf0e10cSrcweir // || (m_aExpr.getStr())[idx] == '/' 612cdf0e10cSrcweir // || (m_aExpr.getStr())[idx] == '.' )) 613cdf0e10cSrcweir ++idx; 614cdf0e10cSrcweir 615cdf0e10cSrcweir if( idx != 1 && ! modulePresent ) 616cdf0e10cSrcweir return false; 617cdf0e10cSrcweir else 618cdf0e10cSrcweir { 619cdf0e10cSrcweir m_aId = m_aExpr.copy( 1,idx-1 ); 620cdf0e10cSrcweir m_aExpr = m_aExpr.copy( idx ); 621cdf0e10cSrcweir } 622cdf0e10cSrcweir } 623cdf0e10cSrcweir 624cdf0e10cSrcweir // fprintf(stdout,"id %s\n",(rtl::OUStringToOString(m_aId,RTL_TEXTENCODING_UTF8).getStr())); 625cdf0e10cSrcweir return true; 626cdf0e10cSrcweir } 627cdf0e10cSrcweir 628cdf0e10cSrcweir 629cdf0e10cSrcweir bool URLParameter::query() 630cdf0e10cSrcweir { 631cdf0e10cSrcweir rtl::OUString query_; 632cdf0e10cSrcweir 633cdf0e10cSrcweir if( ! m_aExpr.getLength() ) 634cdf0e10cSrcweir return true; 635cdf0e10cSrcweir else if( (m_aExpr.getStr())[0] == sal_Unicode( '?' ) ) 636cdf0e10cSrcweir query_ = m_aExpr.copy( 1 ).trim(); 637cdf0e10cSrcweir else 638cdf0e10cSrcweir return false; 639cdf0e10cSrcweir 640cdf0e10cSrcweir 641cdf0e10cSrcweir bool ret = true; 642cdf0e10cSrcweir sal_Int32 delimIdx,equalIdx; 643cdf0e10cSrcweir rtl::OUString parameter,value; 644cdf0e10cSrcweir 645cdf0e10cSrcweir while( query_.getLength() != 0 ) 646cdf0e10cSrcweir { 647cdf0e10cSrcweir delimIdx = query_.indexOf( sal_Unicode( '&' ) ); 648cdf0e10cSrcweir equalIdx = query_.indexOf( sal_Unicode( '=' ) ); 649cdf0e10cSrcweir parameter = query_.copy( 0,equalIdx ).trim(); 650cdf0e10cSrcweir if( delimIdx == -1 ) 651cdf0e10cSrcweir { 652cdf0e10cSrcweir value = query_.copy( equalIdx + 1 ).trim(); 653cdf0e10cSrcweir query_ = rtl::OUString(); 654cdf0e10cSrcweir } 655cdf0e10cSrcweir else 656cdf0e10cSrcweir { 657cdf0e10cSrcweir value = query_.copy( equalIdx+1,delimIdx - equalIdx - 1 ).trim(); 658cdf0e10cSrcweir query_ = query_.copy( delimIdx+1 ).trim(); 659cdf0e10cSrcweir } 660cdf0e10cSrcweir 661cdf0e10cSrcweir if( parameter.compareToAscii( "Language" ) == 0 ) 662cdf0e10cSrcweir m_aLanguage = value; 663cdf0e10cSrcweir else if( parameter.compareToAscii( "Device" ) == 0 ) 664cdf0e10cSrcweir m_aDevice = value; 665cdf0e10cSrcweir else if( parameter.compareToAscii( "Program" ) == 0 ) 666cdf0e10cSrcweir m_aProgram = value; 667cdf0e10cSrcweir else if( parameter.compareToAscii( "Eid" ) == 0 ) 668cdf0e10cSrcweir m_aEid = value; 669cdf0e10cSrcweir else if( parameter.compareToAscii( "UseDB" ) == 0 ) 670cdf0e10cSrcweir m_bUseDB = ! ( value.compareToAscii("no") == 0 ); 671cdf0e10cSrcweir else if( parameter.compareToAscii( "DbPAR" ) == 0 ) 672cdf0e10cSrcweir m_aDbPar = value; 673cdf0e10cSrcweir else if( parameter.compareToAscii( "Query" ) == 0 ) 674cdf0e10cSrcweir { 675cdf0e10cSrcweir if( ! m_aQuery.getLength() ) 676cdf0e10cSrcweir m_aQuery = value; 677cdf0e10cSrcweir else 678cdf0e10cSrcweir m_aQuery += ( rtl::OUString::createFromAscii( " " ) + value ); 679cdf0e10cSrcweir } 680cdf0e10cSrcweir else if( parameter.compareToAscii( "Scope" ) == 0 ) 681cdf0e10cSrcweir m_aScope = value; 682cdf0e10cSrcweir else if( parameter.compareToAscii( "System" ) == 0 ) 683cdf0e10cSrcweir m_aSystem = value; 684cdf0e10cSrcweir else if( parameter.compareToAscii( "HelpPrefix" ) == 0 ) 685cdf0e10cSrcweir m_aPrefix = rtl::Uri::decode( 686cdf0e10cSrcweir value, 687cdf0e10cSrcweir rtl_UriDecodeWithCharset, 688cdf0e10cSrcweir RTL_TEXTENCODING_UTF8 ); 689cdf0e10cSrcweir else if( parameter.compareToAscii( "HitCount" ) == 0 ) 690cdf0e10cSrcweir m_nHitCount = value.toInt32(); 691cdf0e10cSrcweir else if( parameter.compareToAscii( "Active" ) == 0 ) 692cdf0e10cSrcweir m_aActive = value; 693cdf0e10cSrcweir else 694cdf0e10cSrcweir ret = false; 695cdf0e10cSrcweir } 696cdf0e10cSrcweir 697cdf0e10cSrcweir return ret; 698cdf0e10cSrcweir } 699cdf0e10cSrcweir 700cdf0e10cSrcweir struct UserData { 701cdf0e10cSrcweir 702cdf0e10cSrcweir UserData( InputStreamTransformer* pTransformer, 703cdf0e10cSrcweir URLParameter* pInitial, 704cdf0e10cSrcweir Databases* pDatabases ) 705cdf0e10cSrcweir : m_pTransformer( pTransformer ), 706cdf0e10cSrcweir m_pDatabases( pDatabases ), 707cdf0e10cSrcweir m_pInitial( pInitial ) 708cdf0e10cSrcweir { 709cdf0e10cSrcweir } 710cdf0e10cSrcweir 711cdf0e10cSrcweir InputStreamTransformer* m_pTransformer; 712cdf0e10cSrcweir Databases* m_pDatabases; 713cdf0e10cSrcweir URLParameter* m_pInitial; 714cdf0e10cSrcweir }; 715cdf0e10cSrcweir 716cdf0e10cSrcweir UserData *ugblData = 0; 717cdf0e10cSrcweir 718cdf0e10cSrcweir extern "C" { 719cdf0e10cSrcweir 720cdf0e10cSrcweir static int 721cdf0e10cSrcweir fileMatch(const char * URI) { 722cdf0e10cSrcweir if ((URI != NULL) && !strncmp(URI, "file:/", 6)) 723cdf0e10cSrcweir return 1; 724cdf0e10cSrcweir return 0; 725cdf0e10cSrcweir } 726cdf0e10cSrcweir 727cdf0e10cSrcweir static int 728cdf0e10cSrcweir zipMatch(const char * URI) { 729cdf0e10cSrcweir if ((URI != NULL) && !strncmp(URI, "vnd.sun.star.zip:/", 18)) 730cdf0e10cSrcweir return 1; 731cdf0e10cSrcweir return 0; 732cdf0e10cSrcweir } 733cdf0e10cSrcweir 734cdf0e10cSrcweir static int 735cdf0e10cSrcweir helpMatch(const char * URI) { 736cdf0e10cSrcweir if ((URI != NULL) && !strncmp(URI, "vnd.sun.star.help:/", 19)) 737cdf0e10cSrcweir return 1; 738cdf0e10cSrcweir return 0; 739cdf0e10cSrcweir } 740cdf0e10cSrcweir 741cdf0e10cSrcweir static void * 742cdf0e10cSrcweir fileOpen(const char *URI) { 743cdf0e10cSrcweir osl::File *pRet = new osl::File(rtl::OUString(URI, strlen(URI), RTL_TEXTENCODING_UTF8)); 744cdf0e10cSrcweir pRet->open(OpenFlag_Read); 745cdf0e10cSrcweir return pRet; 746cdf0e10cSrcweir } 747cdf0e10cSrcweir 748cdf0e10cSrcweir static void * 749cdf0e10cSrcweir zipOpen(const char * /*URI*/) { 750cdf0e10cSrcweir rtl::OUString language,jar,path; 751cdf0e10cSrcweir 752cdf0e10cSrcweir if( ugblData->m_pInitial->get_eid().getLength() ) 753cdf0e10cSrcweir return (void*)(new Reference< XHierarchicalNameAccess >); 754cdf0e10cSrcweir else 755cdf0e10cSrcweir { 756cdf0e10cSrcweir jar = ugblData->m_pInitial->get_jar(); 757cdf0e10cSrcweir language = ugblData->m_pInitial->get_language(); 758cdf0e10cSrcweir path = ugblData->m_pInitial->get_path(); 759cdf0e10cSrcweir } 760cdf0e10cSrcweir 761cdf0e10cSrcweir Reference< XHierarchicalNameAccess > xNA = 762cdf0e10cSrcweir ugblData->m_pDatabases->findJarFileForPath( jar, language, path ); 763cdf0e10cSrcweir 764cdf0e10cSrcweir Reference< XInputStream > xInputStream; 765cdf0e10cSrcweir 766cdf0e10cSrcweir if( xNA.is() ) 767cdf0e10cSrcweir { 768cdf0e10cSrcweir try 769cdf0e10cSrcweir { 770cdf0e10cSrcweir Any aEntry = xNA->getByHierarchicalName( path ); 771cdf0e10cSrcweir Reference< XActiveDataSink > xSink; 772cdf0e10cSrcweir if( ( aEntry >>= xSink ) && xSink.is() ) 773cdf0e10cSrcweir xInputStream = xSink->getInputStream(); 774cdf0e10cSrcweir } 775cdf0e10cSrcweir catch ( NoSuchElementException & ) 776cdf0e10cSrcweir { 777cdf0e10cSrcweir } 778cdf0e10cSrcweir } 779cdf0e10cSrcweir 780cdf0e10cSrcweir if( xInputStream.is() ) 781cdf0e10cSrcweir { 782cdf0e10cSrcweir return new Reference<XInputStream>(xInputStream); 783cdf0e10cSrcweir } 784cdf0e10cSrcweir return 0; 785cdf0e10cSrcweir } 786cdf0e10cSrcweir 787cdf0e10cSrcweir static void * 788cdf0e10cSrcweir helpOpen(const char * URI) { 789cdf0e10cSrcweir rtl::OUString language,jar,path; 790cdf0e10cSrcweir 791cdf0e10cSrcweir URLParameter urlpar( rtl::OUString::createFromAscii( URI ), 792cdf0e10cSrcweir ugblData->m_pDatabases ); 793cdf0e10cSrcweir 794cdf0e10cSrcweir jar = urlpar.get_jar(); 795cdf0e10cSrcweir language = urlpar.get_language(); 796cdf0e10cSrcweir path = urlpar.get_path(); 797cdf0e10cSrcweir 798cdf0e10cSrcweir Reference< XHierarchicalNameAccess > xNA = 799cdf0e10cSrcweir ugblData->m_pDatabases->findJarFileForPath( jar, language, path ); 800cdf0e10cSrcweir 801cdf0e10cSrcweir Reference< XInputStream > xInputStream; 802cdf0e10cSrcweir 803cdf0e10cSrcweir if( xNA.is() ) 804cdf0e10cSrcweir { 805cdf0e10cSrcweir try 806cdf0e10cSrcweir { 807cdf0e10cSrcweir Any aEntry = xNA->getByHierarchicalName( path ); 808cdf0e10cSrcweir Reference< XActiveDataSink > xSink; 809cdf0e10cSrcweir if( ( aEntry >>= xSink ) && xSink.is() ) 810cdf0e10cSrcweir xInputStream = xSink->getInputStream(); 811cdf0e10cSrcweir } 812cdf0e10cSrcweir catch ( NoSuchElementException & ) 813cdf0e10cSrcweir { 814cdf0e10cSrcweir } 815cdf0e10cSrcweir } 816cdf0e10cSrcweir 817cdf0e10cSrcweir if( xInputStream.is() ) 818cdf0e10cSrcweir return new Reference<XInputStream>(xInputStream); 819cdf0e10cSrcweir return 0; 820cdf0e10cSrcweir } 821cdf0e10cSrcweir 822cdf0e10cSrcweir static int 823cdf0e10cSrcweir helpRead(void * context, char * buffer, int len) { 824cdf0e10cSrcweir Reference< XInputStream > *pRef = (Reference< XInputStream >*)context; 825cdf0e10cSrcweir 826cdf0e10cSrcweir Sequence< sal_Int8 > aSeq; 827cdf0e10cSrcweir len = (*pRef)->readBytes( aSeq,len); 828cdf0e10cSrcweir memcpy(buffer, aSeq.getConstArray(), len); 829cdf0e10cSrcweir 830cdf0e10cSrcweir return len; 831cdf0e10cSrcweir } 832cdf0e10cSrcweir 833cdf0e10cSrcweir static int 834cdf0e10cSrcweir zipRead(void * context, char * buffer, int len) { 835cdf0e10cSrcweir if( ugblData->m_pInitial->get_eid().getLength() ) 836cdf0e10cSrcweir { 837cdf0e10cSrcweir ugblData->m_pDatabases->popupDocument( ugblData->m_pInitial,&buffer,&len); 838cdf0e10cSrcweir return len; 839cdf0e10cSrcweir } 840cdf0e10cSrcweir else 841cdf0e10cSrcweir return helpRead(context, buffer, len); 842cdf0e10cSrcweir } 843cdf0e10cSrcweir 844cdf0e10cSrcweir static int 845cdf0e10cSrcweir fileRead(void * context, char * buffer, int len) { 846cdf0e10cSrcweir int nRead = 0; 847cdf0e10cSrcweir osl::File *pFile = (osl::File*)context; 848cdf0e10cSrcweir if (pFile) 849cdf0e10cSrcweir { 850cdf0e10cSrcweir sal_uInt64 uRead = 0; 851cdf0e10cSrcweir if (osl::FileBase::E_None == pFile->read(buffer, len, uRead)) 852cdf0e10cSrcweir nRead = static_cast<int>(uRead); 853cdf0e10cSrcweir } 854cdf0e10cSrcweir return nRead; 855cdf0e10cSrcweir } 856cdf0e10cSrcweir 857cdf0e10cSrcweir static int 858cdf0e10cSrcweir uriClose(void * context) { 859cdf0e10cSrcweir Reference< XInputStream > *pRef = (Reference< XInputStream >*)context; 860cdf0e10cSrcweir delete pRef; 861cdf0e10cSrcweir return 0; 862cdf0e10cSrcweir } 863cdf0e10cSrcweir 864cdf0e10cSrcweir static int 865cdf0e10cSrcweir fileClose(void * context) { 866cdf0e10cSrcweir osl::File *pFile = (osl::File*)context; 867cdf0e10cSrcweir if (pFile) 868cdf0e10cSrcweir { 869cdf0e10cSrcweir pFile->close(); 870cdf0e10cSrcweir delete pFile; 871cdf0e10cSrcweir } 872cdf0e10cSrcweir return 0; 873cdf0e10cSrcweir } 874cdf0e10cSrcweir 875cdf0e10cSrcweir } // extern "C" 876cdf0e10cSrcweir 877cdf0e10cSrcweir /* 878cdf0e10cSrcweir // For debugging only 879cdf0e10cSrcweir extern "C" void StructuredXMLErrorFunction(void *userData, xmlErrorPtr error) 880cdf0e10cSrcweir { 881cdf0e10cSrcweir (void)userData; 882cdf0e10cSrcweir (void)error; 883cdf0e10cSrcweir 884cdf0e10cSrcweir // Reset error handler 885cdf0e10cSrcweir xmlSetStructuredErrorFunc( NULL, NULL ); 886cdf0e10cSrcweir } 887cdf0e10cSrcweir */ 888cdf0e10cSrcweir 889cdf0e10cSrcweir InputStreamTransformer::InputStreamTransformer( URLParameter* urlParam, 890cdf0e10cSrcweir Databases* pDatabases, 891cdf0e10cSrcweir bool isRoot ) 892cdf0e10cSrcweir : len( 0 ), 893cdf0e10cSrcweir pos( 0 ), 894cdf0e10cSrcweir buffer( new char[1] ) // Initializing with one element to avoid gcc compiler warning 895cdf0e10cSrcweir { 896cdf0e10cSrcweir if( isRoot ) 897cdf0e10cSrcweir { 898cdf0e10cSrcweir delete[] buffer; 899cdf0e10cSrcweir pDatabases->cascadingStylesheet( urlParam->get_language(), 900cdf0e10cSrcweir &buffer, 901cdf0e10cSrcweir &len ); 902cdf0e10cSrcweir } 903cdf0e10cSrcweir else if( urlParam->isActive() ) 904cdf0e10cSrcweir { 905cdf0e10cSrcweir delete[] buffer; 906cdf0e10cSrcweir pDatabases->setActiveText( urlParam->get_module(), 907cdf0e10cSrcweir urlParam->get_language(), 908cdf0e10cSrcweir urlParam->get_id(), 909cdf0e10cSrcweir &buffer, 910cdf0e10cSrcweir &len ); 911cdf0e10cSrcweir } 912cdf0e10cSrcweir else 913cdf0e10cSrcweir { 914cdf0e10cSrcweir UserData userData( this,urlParam,pDatabases ); 915cdf0e10cSrcweir 916cdf0e10cSrcweir // Uses the implementation detail, that rtl::OString::getStr returns a zero terminated character-array 917cdf0e10cSrcweir 918cdf0e10cSrcweir const char* parameter[47]; 919cdf0e10cSrcweir rtl::OString parString[46]; 920cdf0e10cSrcweir int last = 0; 921cdf0e10cSrcweir 922cdf0e10cSrcweir parString[last++] = "Program"; 923cdf0e10cSrcweir rtl::OString aPureProgramm( urlParam->getByName( "Program" ) ); 924cdf0e10cSrcweir parString[last++] = rtl::OString('\'') + aPureProgramm + rtl::OString('\''); 925cdf0e10cSrcweir parString[last++] = "Database"; 926cdf0e10cSrcweir parString[last++] = rtl::OString('\'') + urlParam->getByName( "DatabasePar" ) + rtl::OString('\''); 927cdf0e10cSrcweir parString[last++] = "Id"; 928cdf0e10cSrcweir parString[last++] = rtl::OString('\'') + urlParam->getByName( "Id" ) + rtl::OString('\''); 929cdf0e10cSrcweir parString[last++] = "Path"; 930cdf0e10cSrcweir rtl::OString aPath( urlParam->getByName( "Path" ) ); 931cdf0e10cSrcweir parString[last++] = rtl::OString('\'') + aPath + rtl::OString('\''); 932cdf0e10cSrcweir 933cdf0e10cSrcweir rtl::OString aPureLanguage = urlParam->getByName( "Language" ); 934cdf0e10cSrcweir parString[last++] = "Language"; 935cdf0e10cSrcweir parString[last++] = rtl::OString('\'') + aPureLanguage + rtl::OString('\''); 936cdf0e10cSrcweir parString[last++] = "System"; 937cdf0e10cSrcweir parString[last++] = rtl::OString('\'') + urlParam->getByName( "System" ) + rtl::OString('\''); 938cdf0e10cSrcweir parString[last++] = "productname"; 939cdf0e10cSrcweir parString[last++] = rtl::OString('\'') + rtl::OString( 940cdf0e10cSrcweir pDatabases->getProductName().getStr(), 941cdf0e10cSrcweir pDatabases->getProductName().getLength(), 942cdf0e10cSrcweir RTL_TEXTENCODING_UTF8 ) + rtl::OString('\''); 943cdf0e10cSrcweir parString[last++] = "productversion"; 944cdf0e10cSrcweir parString[last++] = rtl::OString('\'') + 945cdf0e10cSrcweir rtl::OString( pDatabases->getProductVersion().getStr(), 946cdf0e10cSrcweir pDatabases->getProductVersion().getLength(), 947cdf0e10cSrcweir RTL_TEXTENCODING_UTF8 ) + rtl::OString('\''); 948cdf0e10cSrcweir 949cdf0e10cSrcweir parString[last++] = "imgrepos"; 950cdf0e10cSrcweir parString[last++] = rtl::OString('\'') + pDatabases->getImagesZipFileURL() + rtl::OString('\''); 951cdf0e10cSrcweir parString[last++] = "hp"; 952cdf0e10cSrcweir parString[last++] = rtl::OString('\'') + urlParam->getByName( "HelpPrefix" ) + rtl::OString('\''); 953cdf0e10cSrcweir 954cdf0e10cSrcweir if( parString[last-1].getLength() ) 955cdf0e10cSrcweir { 956cdf0e10cSrcweir parString[last++] = "sm"; 957cdf0e10cSrcweir parString[last++] = "'vnd.sun.star.help%3A%2F%2F'"; 958cdf0e10cSrcweir parString[last++] = "qm"; 959cdf0e10cSrcweir parString[last++] = "'%3F'"; 960cdf0e10cSrcweir parString[last++] = "es"; 961cdf0e10cSrcweir parString[last++] = "'%3D'"; 962cdf0e10cSrcweir parString[last++] = "am"; 963cdf0e10cSrcweir parString[last++] = "'%26'"; 964cdf0e10cSrcweir parString[last++] = "cl"; 965cdf0e10cSrcweir parString[last++] = "'%3A'"; 966cdf0e10cSrcweir parString[last++] = "sl"; 967cdf0e10cSrcweir parString[last++] = "'%2F'"; 968cdf0e10cSrcweir parString[last++] = "hm"; 969cdf0e10cSrcweir parString[last++] = "'%23'"; 970cdf0e10cSrcweir parString[last++] = "cs"; 971cdf0e10cSrcweir parString[last++] = "'css'"; 972cdf0e10cSrcweir 973cdf0e10cSrcweir parString[last++] = "vendorname"; 974cdf0e10cSrcweir parString[last++] = rtl::OString("''"); 975cdf0e10cSrcweir parString[last++] = "vendorversion"; 976cdf0e10cSrcweir parString[last++] = rtl::OString("''"); 977cdf0e10cSrcweir parString[last++] = "vendorshort"; 978cdf0e10cSrcweir parString[last++] = rtl::OString("''"); 979cdf0e10cSrcweir } 980cdf0e10cSrcweir 981cdf0e10cSrcweir // Do we need to add extension path? 982cdf0e10cSrcweir ::rtl::OUString aExtensionPath; 983cdf0e10cSrcweir rtl::OUString aJar = urlParam->get_jar(); 984cdf0e10cSrcweir 985cdf0e10cSrcweir bool bAddExtensionPath = false; 986cdf0e10cSrcweir rtl::OUString aExtensionRegistryPath; 987cdf0e10cSrcweir sal_Int32 nQuestionMark1 = aJar.indexOf( sal_Unicode('?') ); 988cdf0e10cSrcweir sal_Int32 nQuestionMark2 = aJar.lastIndexOf( sal_Unicode('?') ); 989cdf0e10cSrcweir if( nQuestionMark1 != -1 && nQuestionMark2 != -1 && nQuestionMark1 != nQuestionMark2 ) 990cdf0e10cSrcweir { 991cdf0e10cSrcweir aExtensionPath = aJar.copy( nQuestionMark1 + 1, nQuestionMark2 - nQuestionMark1 - 1 ); 992cdf0e10cSrcweir aExtensionRegistryPath = urlParam->get_ExtensionRegistryPath(); 993cdf0e10cSrcweir bAddExtensionPath = true; 994cdf0e10cSrcweir } 995cdf0e10cSrcweir else 996cdf0e10cSrcweir { 997cdf0e10cSrcweir // Path not yet specified, search directly 998cdf0e10cSrcweir Reference< XHierarchicalNameAccess > xNA = pDatabases->findJarFileForPath 999cdf0e10cSrcweir ( aJar, urlParam->get_language(), urlParam->get_path(), &aExtensionPath, &aExtensionRegistryPath ); 1000cdf0e10cSrcweir if( xNA.is() && aExtensionPath.getLength() ) 1001cdf0e10cSrcweir bAddExtensionPath = true; 1002cdf0e10cSrcweir } 1003cdf0e10cSrcweir 1004cdf0e10cSrcweir if( bAddExtensionPath ) 1005cdf0e10cSrcweir { 1006cdf0e10cSrcweir Reference< XMultiServiceFactory > xFactory = comphelper::getProcessServiceFactory(); 1007cdf0e10cSrcweir Reference< XPropertySet > xProps( xFactory, UNO_QUERY ); 1008cdf0e10cSrcweir OSL_ASSERT( xProps.is() ); 1009cdf0e10cSrcweir Reference< XComponentContext > xContext; 1010cdf0e10cSrcweir if (xProps.is()) 1011cdf0e10cSrcweir { 1012cdf0e10cSrcweir xProps->getPropertyValue( 1013cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("DefaultContext") ) ) >>= xContext; 1014cdf0e10cSrcweir } 1015cdf0e10cSrcweir if( !xContext.is() ) 1016cdf0e10cSrcweir { 1017cdf0e10cSrcweir throw RuntimeException( 1018cdf0e10cSrcweir ::rtl::OUString::createFromAscii( "InputStreamTransformer::InputStreamTransformer(), no XComponentContext" ), 1019cdf0e10cSrcweir Reference< XInterface >() ); 1020cdf0e10cSrcweir } 1021cdf0e10cSrcweir 1022cdf0e10cSrcweir rtl::OUString aOUExpandedExtensionPath = Databases::expandURL( aExtensionRegistryPath, xContext ); 1023cdf0e10cSrcweir rtl::OString aExpandedExtensionPath = rtl::OUStringToOString( aOUExpandedExtensionPath, osl_getThreadTextEncoding() ); 1024cdf0e10cSrcweir 1025cdf0e10cSrcweir parString[last++] = "ExtensionPath"; 1026cdf0e10cSrcweir parString[last++] = rtl::OString('\'') + aExpandedExtensionPath + rtl::OString('\''); 1027cdf0e10cSrcweir 1028cdf0e10cSrcweir // ExtensionId 1029cdf0e10cSrcweir rtl::OString aPureExtensionId; 1030cdf0e10cSrcweir sal_Int32 iSlash = aPath.indexOf( '/' ); 1031cdf0e10cSrcweir if( iSlash != -1 ) 1032cdf0e10cSrcweir aPureExtensionId = aPath.copy( 0, iSlash ); 1033cdf0e10cSrcweir 1034cdf0e10cSrcweir parString[last++] = "ExtensionId"; 1035cdf0e10cSrcweir parString[last++] = rtl::OString('\'') + aPureExtensionId + rtl::OString('\''); 1036cdf0e10cSrcweir } 1037cdf0e10cSrcweir 1038cdf0e10cSrcweir for( int i = 0; i < last; ++i ) 1039cdf0e10cSrcweir parameter[i] = parString[i].getStr(); 1040cdf0e10cSrcweir parameter[last] = 0; 1041cdf0e10cSrcweir 1042cdf0e10cSrcweir rtl::OUString xslURL = pDatabases->getInstallPathAsURL(); 1043cdf0e10cSrcweir 1044cdf0e10cSrcweir rtl::OString xslURLascii( 1045cdf0e10cSrcweir xslURL.getStr(), 1046cdf0e10cSrcweir xslURL.getLength(), 1047cdf0e10cSrcweir RTL_TEXTENCODING_UTF8); 1048cdf0e10cSrcweir xslURLascii += "main_transform.xsl"; 1049cdf0e10cSrcweir 1050cdf0e10cSrcweir ugblData = &userData; 1051cdf0e10cSrcweir 1052cdf0e10cSrcweir xmlInitParser(); 1053cdf0e10cSrcweir xmlRegisterInputCallbacks(zipMatch, zipOpen, zipRead, uriClose); 1054cdf0e10cSrcweir xmlRegisterInputCallbacks(helpMatch, helpOpen, helpRead, uriClose); 1055cdf0e10cSrcweir xmlRegisterInputCallbacks(fileMatch, fileOpen, fileRead, fileClose); 1056cdf0e10cSrcweir //xmlSetStructuredErrorFunc( NULL, (xmlStructuredErrorFunc)StructuredXMLErrorFunction ); 1057cdf0e10cSrcweir 1058cdf0e10cSrcweir xsltStylesheetPtr cur = 1059cdf0e10cSrcweir xsltParseStylesheetFile((const xmlChar *)xslURLascii.getStr()); 1060cdf0e10cSrcweir 1061cdf0e10cSrcweir xmlDocPtr doc = xmlParseFile("vnd.sun.star.zip:/"); 1062cdf0e10cSrcweir 1063cdf0e10cSrcweir xmlDocPtr res = xsltApplyStylesheet(cur, doc, parameter); 1064cdf0e10cSrcweir if (res) 1065cdf0e10cSrcweir { 1066cdf0e10cSrcweir xmlChar *doc_txt_ptr=0; 1067cdf0e10cSrcweir int doc_txt_len; 1068cdf0e10cSrcweir xsltSaveResultToString(&doc_txt_ptr, &doc_txt_len, res, cur); 1069cdf0e10cSrcweir addToBuffer((const char*)doc_txt_ptr, doc_txt_len); 1070cdf0e10cSrcweir xmlFree(doc_txt_ptr); 1071cdf0e10cSrcweir } 1072cdf0e10cSrcweir xmlPopInputCallbacks(); //filePatch 1073cdf0e10cSrcweir xmlPopInputCallbacks(); //helpPatch 1074cdf0e10cSrcweir xmlPopInputCallbacks(); //zipMatch 1075cdf0e10cSrcweir xmlFreeDoc(res); 1076cdf0e10cSrcweir xmlFreeDoc(doc); 1077cdf0e10cSrcweir xsltFreeStylesheet(cur); 1078cdf0e10cSrcweir } 1079cdf0e10cSrcweir } 1080cdf0e10cSrcweir 1081cdf0e10cSrcweir 1082cdf0e10cSrcweir InputStreamTransformer::~InputStreamTransformer() 1083cdf0e10cSrcweir { 1084cdf0e10cSrcweir delete[] buffer; 1085cdf0e10cSrcweir } 1086cdf0e10cSrcweir 1087cdf0e10cSrcweir 1088cdf0e10cSrcweir Any SAL_CALL InputStreamTransformer::queryInterface( const Type& rType ) throw( RuntimeException ) 1089cdf0e10cSrcweir { 1090cdf0e10cSrcweir Any aRet = ::cppu::queryInterface( rType, 1091cdf0e10cSrcweir SAL_STATIC_CAST( XInputStream*,this ), 1092cdf0e10cSrcweir SAL_STATIC_CAST( XSeekable*,this ) ); 1093cdf0e10cSrcweir 1094cdf0e10cSrcweir return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ); 1095cdf0e10cSrcweir } 1096cdf0e10cSrcweir 1097cdf0e10cSrcweir 1098cdf0e10cSrcweir 1099cdf0e10cSrcweir void SAL_CALL InputStreamTransformer::acquire( void ) throw() 1100cdf0e10cSrcweir { 1101cdf0e10cSrcweir OWeakObject::acquire(); 1102cdf0e10cSrcweir } 1103cdf0e10cSrcweir 1104cdf0e10cSrcweir 1105cdf0e10cSrcweir 1106cdf0e10cSrcweir void SAL_CALL InputStreamTransformer::release( void ) throw() 1107cdf0e10cSrcweir { 1108cdf0e10cSrcweir OWeakObject::release(); 1109cdf0e10cSrcweir } 1110cdf0e10cSrcweir 1111cdf0e10cSrcweir 1112cdf0e10cSrcweir 1113cdf0e10cSrcweir sal_Int32 SAL_CALL InputStreamTransformer::readBytes( Sequence< sal_Int8 >& aData,sal_Int32 nBytesToRead ) 1114cdf0e10cSrcweir throw( NotConnectedException, 1115cdf0e10cSrcweir BufferSizeExceededException, 1116cdf0e10cSrcweir IOException, 1117cdf0e10cSrcweir RuntimeException) 1118cdf0e10cSrcweir { 1119cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 1120cdf0e10cSrcweir 1121cdf0e10cSrcweir int curr,available_ = len-pos; 1122cdf0e10cSrcweir if( nBytesToRead <= available_ ) 1123cdf0e10cSrcweir curr = nBytesToRead; 1124cdf0e10cSrcweir else 1125cdf0e10cSrcweir curr = available_; 1126cdf0e10cSrcweir 1127cdf0e10cSrcweir if( 0 <= curr && aData.getLength() < curr ) 1128cdf0e10cSrcweir aData.realloc( curr ); 1129cdf0e10cSrcweir 1130cdf0e10cSrcweir for( int k = 0; k < curr; ++k ) 1131cdf0e10cSrcweir aData[k] = buffer[pos++]; 1132cdf0e10cSrcweir 1133cdf0e10cSrcweir return curr > 0 ? curr : 0; 1134cdf0e10cSrcweir } 1135cdf0e10cSrcweir 1136cdf0e10cSrcweir 1137cdf0e10cSrcweir sal_Int32 SAL_CALL InputStreamTransformer::readSomeBytes( Sequence< sal_Int8 >& aData,sal_Int32 nMaxBytesToRead ) 1138cdf0e10cSrcweir throw( NotConnectedException, 1139cdf0e10cSrcweir BufferSizeExceededException, 1140cdf0e10cSrcweir IOException, 1141cdf0e10cSrcweir RuntimeException) 1142cdf0e10cSrcweir { 1143cdf0e10cSrcweir return readBytes( aData,nMaxBytesToRead ); 1144cdf0e10cSrcweir } 1145cdf0e10cSrcweir 1146cdf0e10cSrcweir 1147cdf0e10cSrcweir 1148cdf0e10cSrcweir void SAL_CALL InputStreamTransformer::skipBytes( sal_Int32 nBytesToSkip ) throw( NotConnectedException, 1149cdf0e10cSrcweir BufferSizeExceededException, 1150cdf0e10cSrcweir IOException, 1151cdf0e10cSrcweir RuntimeException ) 1152cdf0e10cSrcweir { 1153cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 1154cdf0e10cSrcweir while( nBytesToSkip-- ) ++pos; 1155cdf0e10cSrcweir } 1156cdf0e10cSrcweir 1157cdf0e10cSrcweir 1158cdf0e10cSrcweir 1159cdf0e10cSrcweir sal_Int32 SAL_CALL InputStreamTransformer::available( void ) throw( NotConnectedException, 1160cdf0e10cSrcweir IOException, 1161cdf0e10cSrcweir RuntimeException ) 1162cdf0e10cSrcweir { 1163cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 1164cdf0e10cSrcweir return len-pos > 0 ? len - pos : 0 ; 1165cdf0e10cSrcweir } 1166cdf0e10cSrcweir 1167cdf0e10cSrcweir 1168cdf0e10cSrcweir 1169cdf0e10cSrcweir void SAL_CALL InputStreamTransformer::closeInput( void ) throw( NotConnectedException, 1170cdf0e10cSrcweir IOException, 1171cdf0e10cSrcweir RuntimeException ) 1172cdf0e10cSrcweir { 1173cdf0e10cSrcweir } 1174cdf0e10cSrcweir 1175cdf0e10cSrcweir 1176cdf0e10cSrcweir 1177cdf0e10cSrcweir void SAL_CALL InputStreamTransformer::seek( sal_Int64 location ) throw( IllegalArgumentException, 1178cdf0e10cSrcweir IOException, 1179cdf0e10cSrcweir RuntimeException ) 1180cdf0e10cSrcweir { 1181cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 1182cdf0e10cSrcweir if( location < 0 ) 1183cdf0e10cSrcweir throw IllegalArgumentException(); 1184cdf0e10cSrcweir else 1185cdf0e10cSrcweir pos = sal::static_int_cast<sal_Int32>( location ); 1186cdf0e10cSrcweir 1187cdf0e10cSrcweir if( pos > len ) 1188cdf0e10cSrcweir pos = len; 1189cdf0e10cSrcweir } 1190cdf0e10cSrcweir 1191cdf0e10cSrcweir 1192cdf0e10cSrcweir 1193cdf0e10cSrcweir sal_Int64 SAL_CALL InputStreamTransformer::getPosition( void ) throw( IOException, 1194cdf0e10cSrcweir RuntimeException ) 1195cdf0e10cSrcweir { 1196cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 1197cdf0e10cSrcweir return sal_Int64( pos ); 1198cdf0e10cSrcweir } 1199cdf0e10cSrcweir 1200cdf0e10cSrcweir 1201cdf0e10cSrcweir 1202cdf0e10cSrcweir sal_Int64 SAL_CALL InputStreamTransformer::getLength( void ) throw( IOException,RuntimeException ) 1203cdf0e10cSrcweir { 1204cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 1205cdf0e10cSrcweir 1206cdf0e10cSrcweir return len; 1207cdf0e10cSrcweir } 1208cdf0e10cSrcweir 1209cdf0e10cSrcweir 1210cdf0e10cSrcweir void InputStreamTransformer::addToBuffer( const char* buffer_,int len_ ) 1211cdf0e10cSrcweir { 1212cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 1213cdf0e10cSrcweir 1214cdf0e10cSrcweir char* tmp = buffer; 1215cdf0e10cSrcweir buffer = new char[ len+len_ ]; 1216cdf0e10cSrcweir rtl_copyMemory( (void*)(buffer),(void*)(tmp),sal_uInt32( len ) ); 1217cdf0e10cSrcweir rtl_copyMemory( (void*)(buffer+len),(void*)(buffer_),sal_uInt32( len_ ) ); 1218cdf0e10cSrcweir delete[] tmp; 1219cdf0e10cSrcweir len += len_; 1220cdf0e10cSrcweir } 1221