1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sdext.hxx" 26 27 #include "pdfiadaptor.hxx" 28 #include "filterdet.hxx" 29 #include "treevisitorfactory.hxx" 30 31 #include <cppuhelper/factory.hxx> 32 #include <cppuhelper/implementationentry.hxx> 33 34 using namespace ::com::sun::star; 35 using namespace ::com::sun::star::uno; 36 using namespace ::com::sun::star::lang; 37 using namespace ::com::sun::star::registry; 38 39 40 namespace 41 { 42 static Reference< XInterface > Create_PDFIHybridAdaptor( const Reference< XComponentContext >& _rxContext ) 43 { 44 return *(new pdfi::PDFIHybridAdaptor( _rxContext )); 45 } 46 47 static Reference< XInterface > Create_PDFIRawAdaptor_Writer( const Reference< XComponentContext >& _rxContext ) 48 { 49 pdfi::PDFIRawAdaptor* pAdaptor = new pdfi::PDFIRawAdaptor( _rxContext ); 50 51 pAdaptor->setTreeVisitorFactory(pdfi::createWriterTreeVisitorFactory()); 52 pAdaptor->enableToplevelText(); // TEMP! TEMP! 53 54 return uno::Reference<uno::XInterface>(static_cast<xml::XImportFilter*>(pAdaptor)); 55 } 56 57 static Reference< XInterface > Create_PDFIRawAdaptor_Draw( const Reference< XComponentContext >& _rxContext ) 58 { 59 pdfi::PDFIRawAdaptor* pAdaptor = new pdfi::PDFIRawAdaptor( _rxContext ); 60 61 pAdaptor->setTreeVisitorFactory(pdfi::createDrawTreeVisitorFactory()); 62 63 return uno::Reference<uno::XInterface>(static_cast<xml::XImportFilter*>(pAdaptor)); 64 } 65 66 static Reference< XInterface > Create_PDFIRawAdaptor_Impress( const Reference< XComponentContext >& _rxContext ) 67 { 68 pdfi::PDFIRawAdaptor* pAdaptor = new pdfi::PDFIRawAdaptor( _rxContext ); 69 70 pAdaptor->setTreeVisitorFactory(pdfi::createImpressTreeVisitorFactory()); 71 72 return uno::Reference<uno::XInterface>(static_cast<xml::XImportFilter*>(pAdaptor)); 73 } 74 75 static Reference< XInterface > Create_PDFDetector( const Reference< XComponentContext >& _rxContext ) 76 { 77 return *(new pdfi::PDFDetector( _rxContext ) ); 78 } 79 } 80 81 extern "C" void SAL_CALL component_getImplementationEnvironment( 82 const sal_Char **ppEnvTypeName, uno_Environment ** /*ppEnv*/ ) 83 { 84 *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; 85 } 86 87 namespace 88 { 89 typedef Reference< XInterface > (SAL_CALL * ComponentFactory)( const Reference< XComponentContext >& ); 90 91 struct ComponentDescription 92 { 93 const sal_Char* pAsciiServiceName; 94 const sal_Char* pAsciiImplementationName; 95 ComponentFactory pFactory; 96 97 ComponentDescription() 98 :pAsciiServiceName( NULL ) 99 ,pAsciiImplementationName( NULL ) 100 ,pFactory( NULL ) 101 { 102 } 103 ComponentDescription( const sal_Char* _pAsciiServiceName, const sal_Char* _pAsciiImplementationName, ComponentFactory _pFactory ) 104 :pAsciiServiceName( _pAsciiServiceName ) 105 ,pAsciiImplementationName( _pAsciiImplementationName ) 106 ,pFactory( _pFactory ) 107 { 108 } 109 }; 110 111 static const ComponentDescription* lcl_getComponents() 112 { 113 static const ComponentDescription aDescriptions[] = { 114 ComponentDescription( "com.sun.star.document.ImportFilter", "com.sun.star.comp.documents.HybridPDFImport", Create_PDFIHybridAdaptor ), 115 ComponentDescription( "com.sun.star.document.ImportFilter", "com.sun.star.comp.documents.WriterPDFImport", Create_PDFIRawAdaptor_Writer ), 116 ComponentDescription( "com.sun.star.document.ImportFilter", "com.sun.star.comp.documents.DrawPDFImport", Create_PDFIRawAdaptor_Draw ), 117 ComponentDescription( "com.sun.star.document.ImportFilter", "com.sun.star.comp.documents.ImpressPDFImport", Create_PDFIRawAdaptor_Impress ), 118 ComponentDescription( "com.sun.star.document.ImportFilter", "com.sun.star.comp.documents.PDFDetector", Create_PDFDetector ), 119 ComponentDescription() 120 }; 121 return aDescriptions; 122 } 123 } 124 125 extern "C" sal_Bool SAL_CALL component_writeInfo( void* /*pServiceManager*/, void* pRegistryKey ) 126 { 127 Reference< XRegistryKey > xRootKey( static_cast< XRegistryKey* >( pRegistryKey ) ); 128 129 ::rtl::OUString sRootKey( "/", 1, RTL_TEXTENCODING_ASCII_US ); 130 131 const ComponentDescription* pComponents = lcl_getComponents(); 132 while ( pComponents->pAsciiServiceName != NULL ) 133 { 134 ::rtl::OUString sMainKeyName( sRootKey ); 135 sMainKeyName += ::rtl::OUString::createFromAscii( pComponents->pAsciiImplementationName ); 136 sMainKeyName += ::rtl::OUString::createFromAscii( "/UNO/SERVICES" ); 137 138 try 139 { 140 Reference< XRegistryKey > xNewKey( xRootKey->createKey( sMainKeyName ) ); 141 xNewKey->createKey( ::rtl::OUString::createFromAscii( pComponents->pAsciiServiceName ) ); 142 } 143 catch( Exception& ) 144 { 145 OSL_ASSERT( "OModule::writeComponentInfos: something went wrong while creating the keys!" ); 146 return sal_False; 147 } 148 ++pComponents; 149 } 150 return sal_True; 151 } 152 153 extern "C" void* SAL_CALL component_getFactory( 154 const sal_Char* pImplementationName, void* /*pServiceManager*/, void* /*pRegistryKey*/ ) 155 { 156 ::rtl::OUString sImplementationName( ::rtl::OUString::createFromAscii( pImplementationName ) ); 157 158 Reference< XSingleComponentFactory > xFactory; 159 160 const ComponentDescription* pComponents = lcl_getComponents(); 161 while ( pComponents->pAsciiServiceName != NULL ) 162 { 163 if ( 0 == sImplementationName.compareToAscii( pComponents->pAsciiImplementationName ) ) 164 { 165 Sequence< ::rtl::OUString > sServices(1); 166 sServices[0] = ::rtl::OUString::createFromAscii( pComponents->pAsciiServiceName ); 167 168 xFactory = ::cppu::createSingleComponentFactory( 169 pComponents->pFactory, 170 sImplementationName, 171 sServices, 172 NULL 173 ); 174 break; 175 } 176 177 ++pComponents; 178 } 179 180 // by definition, objects returned via this C API need to ber acquired once 181 xFactory->acquire(); 182 return xFactory.get(); 183 } 184 185