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_embeddedobj.hxx" 26 #include <com/sun/star/embed/ElementModes.hpp> 27 #include <com/sun/star/embed/EntryInitModes.hpp> 28 #include <com/sun/star/beans/PropertyValue.hpp> 29 #include <com/sun/star/beans/XPropertySet.hpp> 30 #include <com/sun/star/container/XNameAccess.hpp> 31 #include <com/sun/star/embed/Aspects.hpp> 32 33 #include <rtl/logfile.hxx> 34 35 36 #include "xolefactory.hxx" 37 #include "oleembobj.hxx" 38 39 40 using namespace ::com::sun::star; 41 42 // TODO: do not create OLE objects that represent OOo documents 43 44 //------------------------------------------------------------------------- 45 uno::Sequence< ::rtl::OUString > SAL_CALL OleEmbeddedObjectFactory::impl_staticGetSupportedServiceNames() 46 { 47 uno::Sequence< ::rtl::OUString > aRet(2); 48 aRet[0] = ::rtl::OUString::createFromAscii("com.sun.star.embed.OLEEmbeddedObjectFactory"); 49 aRet[1] = ::rtl::OUString::createFromAscii("com.sun.star.comp.embed.OLEEmbeddedObjectFactory"); 50 return aRet; 51 } 52 53 //------------------------------------------------------------------------- 54 ::rtl::OUString SAL_CALL OleEmbeddedObjectFactory::impl_staticGetImplementationName() 55 { 56 return ::rtl::OUString::createFromAscii("com.sun.star.comp.embed.OLEEmbeddedObjectFactory"); 57 } 58 59 //------------------------------------------------------------------------- 60 uno::Reference< uno::XInterface > SAL_CALL OleEmbeddedObjectFactory::impl_staticCreateSelfInstance( 61 const uno::Reference< lang::XMultiServiceFactory >& xServiceManager ) 62 { 63 return uno::Reference< uno::XInterface >( *new OleEmbeddedObjectFactory( xServiceManager ) ); 64 } 65 66 //------------------------------------------------------------------------- 67 uno::Reference< uno::XInterface > SAL_CALL OleEmbeddedObjectFactory::createInstanceInitFromEntry( 68 const uno::Reference< embed::XStorage >& xStorage, 69 const ::rtl::OUString& sEntName, 70 const uno::Sequence< beans::PropertyValue >& aMedDescr, 71 const uno::Sequence< beans::PropertyValue >& lObjArgs ) 72 throw ( lang::IllegalArgumentException, 73 container::NoSuchElementException, 74 io::IOException, 75 uno::Exception, 76 uno::RuntimeException) 77 { 78 RTL_LOGFILE_CONTEXT( aLog, "embeddedobj (mv76033) OleEmbeddedObjectFactory::createInstanceInitFromEntry" ); 79 80 if ( !xStorage.is() ) 81 throw lang::IllegalArgumentException( ::rtl::OUString::createFromAscii( "No parent storage is provided!\n" ), 82 uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ), 83 1 ); 84 85 if ( !sEntName.getLength() ) 86 throw lang::IllegalArgumentException( ::rtl::OUString::createFromAscii( "Empty element name is provided!\n" ), 87 uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ), 88 2 ); 89 90 uno::Reference< container::XNameAccess > xNameAccess( xStorage, uno::UNO_QUERY ); 91 if ( !xNameAccess.is() ) 92 throw uno::RuntimeException(); //TODO 93 94 // detect entry existence 95 if ( !xNameAccess->hasByName( sEntName ) ) 96 throw container::NoSuchElementException(); 97 98 if ( !xStorage->isStreamElement( sEntName ) ) 99 { 100 // if it is not an OLE object throw an exception 101 throw io::IOException(); // TODO: 102 } 103 104 uno::Reference< uno::XInterface > xResult( 105 static_cast< ::cppu::OWeakObject* > ( new OleEmbeddedObject( m_xFactory, sal_False ) ), 106 uno::UNO_QUERY ); 107 108 uno::Reference< embed::XEmbedPersist > xPersist( xResult, uno::UNO_QUERY ); 109 110 if ( !xPersist.is() ) 111 throw uno::RuntimeException(); // TODO: the interface must be supported by own document objects 112 113 xPersist->setPersistentEntry( xStorage, 114 sEntName, 115 embed::EntryInitModes::DEFAULT_INIT, 116 aMedDescr, 117 lObjArgs ); 118 119 for ( sal_Int32 nInd = 0; nInd < lObjArgs.getLength(); nInd++ ) 120 { 121 if ( lObjArgs[nInd].Name.equalsAscii( "CloneFrom" ) ) 122 { 123 try 124 { 125 uno::Reference < embed::XEmbeddedObject > xObj; 126 uno::Reference < embed::XEmbeddedObject > xNew( xResult, uno::UNO_QUERY ); 127 lObjArgs[nInd].Value >>= xObj; 128 if ( xObj.is() ) 129 xNew->setVisualAreaSize( embed::Aspects::MSOLE_CONTENT, xObj->getVisualAreaSize( embed::Aspects::MSOLE_CONTENT ) ); 130 } 131 catch ( uno::Exception& ) {}; 132 break; 133 } 134 } 135 136 return xResult; 137 } 138 139 //------------------------------------------------------------------------- 140 uno::Reference< uno::XInterface > SAL_CALL OleEmbeddedObjectFactory::createInstanceInitFromMediaDescriptor( 141 const uno::Reference< embed::XStorage >& xStorage, 142 const ::rtl::OUString& sEntName, 143 const uno::Sequence< beans::PropertyValue >& aMediaDescr, 144 const uno::Sequence< beans::PropertyValue >& lObjArgs ) 145 throw ( lang::IllegalArgumentException, 146 io::IOException, 147 uno::Exception, 148 uno::RuntimeException) 149 { 150 RTL_LOGFILE_CONTEXT( aLog, "embeddedobj (mv76033) OleEmbeddedObjectFactory::createInstanceInitFromMediaDescriptor" ); 151 152 if ( !xStorage.is() ) 153 throw lang::IllegalArgumentException( ::rtl::OUString::createFromAscii( "No parent storage is provided!\n" ), 154 uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ), 155 1 ); 156 157 if ( !sEntName.getLength() ) 158 throw lang::IllegalArgumentException( ::rtl::OUString::createFromAscii( "Empty element name is provided!\n" ), 159 uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ), 160 2 ); 161 162 uno::Reference< uno::XInterface > xResult( 163 static_cast< ::cppu::OWeakObject* > ( new OleEmbeddedObject( m_xFactory, sal_False ) ), 164 uno::UNO_QUERY ); 165 166 uno::Reference< embed::XEmbedPersist > xPersist( xResult, uno::UNO_QUERY ); 167 168 if ( !xPersist.is() ) 169 throw uno::RuntimeException(); // TODO: the interface must be supported ( what about applets? ) 170 171 xPersist->setPersistentEntry( xStorage, 172 sEntName, 173 embed::EntryInitModes::MEDIA_DESCRIPTOR_INIT, 174 aMediaDescr, 175 lObjArgs ); 176 177 return xResult; 178 } 179 180 //------------------------------------------------------------------------- 181 uno::Reference< uno::XInterface > SAL_CALL OleEmbeddedObjectFactory::createInstanceInitNew( 182 const uno::Sequence< sal_Int8 >& aClassID, 183 const ::rtl::OUString& aClassName, 184 const uno::Reference< embed::XStorage >& xStorage, 185 const ::rtl::OUString& sEntName, 186 const uno::Sequence< beans::PropertyValue >& lObjArgs ) 187 throw ( lang::IllegalArgumentException, 188 io::IOException, 189 uno::Exception, 190 uno::RuntimeException) 191 { 192 RTL_LOGFILE_CONTEXT( aLog, "embeddedobj (mv76033) OleEmbeddedObjectFactory::createInstanceInitNew" ); 193 194 if ( !xStorage.is() ) 195 throw lang::IllegalArgumentException( ::rtl::OUString::createFromAscii( "No parent storage is provided!\n" ), 196 uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ), 197 3 ); 198 199 if ( !sEntName.getLength() ) 200 throw lang::IllegalArgumentException( ::rtl::OUString::createFromAscii( "Empty element name is provided!\n" ), 201 uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ), 202 4 ); 203 204 uno::Reference< uno::XInterface > xResult( 205 static_cast< ::cppu::OWeakObject* > ( new OleEmbeddedObject( m_xFactory, aClassID, aClassName ) ), 206 uno::UNO_QUERY ); 207 208 uno::Reference< embed::XEmbedPersist > xPersist( xResult, uno::UNO_QUERY ); 209 210 if ( !xPersist.is() ) 211 throw uno::RuntimeException(); // TODO: the interface must be supported by own document objects 212 213 xPersist->setPersistentEntry( xStorage, 214 sEntName, 215 embed::EntryInitModes::TRUNCATE_INIT, 216 uno::Sequence< beans::PropertyValue >(), 217 lObjArgs ); 218 219 return xResult; 220 } 221 222 //------------------------------------------------------------------------- 223 uno::Reference< uno::XInterface > SAL_CALL OleEmbeddedObjectFactory::createInstanceLink( 224 const uno::Reference< embed::XStorage >& xStorage, 225 const ::rtl::OUString& sEntName, 226 const uno::Sequence< beans::PropertyValue >& aMediaDescr, 227 const uno::Sequence< beans::PropertyValue >& lObjArgs ) 228 throw ( lang::IllegalArgumentException, 229 io::IOException, 230 uno::Exception, 231 uno::RuntimeException ) 232 { 233 RTL_LOGFILE_CONTEXT( aLog, "embeddedobj (mv76033) OleEmbeddedObjectFactory::createInstanceLink" ); 234 235 if ( !xStorage.is() ) 236 throw lang::IllegalArgumentException( ::rtl::OUString::createFromAscii( "No parent storage is provided!\n" ), 237 uno::Reference< uno::XInterface >( 238 static_cast< ::cppu::OWeakObject* >(this) ), 239 1 ); 240 241 if ( !sEntName.getLength() ) 242 throw lang::IllegalArgumentException( ::rtl::OUString::createFromAscii( "Empty element name is provided!\n" ), 243 uno::Reference< uno::XInterface >( 244 static_cast< ::cppu::OWeakObject* >(this) ), 245 2 ); 246 247 uno::Reference< uno::XInterface > xResult( 248 static_cast< ::cppu::OWeakObject* > ( new OleEmbeddedObject( m_xFactory, sal_True ) ), 249 uno::UNO_QUERY ); 250 251 uno::Reference< embed::XEmbedPersist > xPersist( xResult, uno::UNO_QUERY ); 252 253 if ( !xPersist.is() ) 254 throw uno::RuntimeException(); // TODO: the interface must be supported by own document objects 255 256 xPersist->setPersistentEntry( xStorage, 257 sEntName, 258 embed::EntryInitModes::MEDIA_DESCRIPTOR_INIT, 259 aMediaDescr, 260 lObjArgs ); 261 262 return xResult; 263 } 264 265 //------------------------------------------------------------------------- 266 uno::Reference< uno::XInterface > SAL_CALL OleEmbeddedObjectFactory::createInstanceUserInit( 267 const uno::Sequence< sal_Int8 >& aClassID, 268 const ::rtl::OUString& aClassName, 269 const uno::Reference< embed::XStorage >& xStorage, 270 const ::rtl::OUString& sEntName, 271 sal_Int32 /*nEntryConnectionMode*/, 272 const uno::Sequence< beans::PropertyValue >& /*lArguments*/, 273 const uno::Sequence< beans::PropertyValue >& lObjArgs ) 274 throw ( lang::IllegalArgumentException, 275 io::IOException, 276 uno::Exception, 277 uno::RuntimeException ) 278 { 279 RTL_LOGFILE_CONTEXT( aLog, "embeddedobj (mv76033) OleEmbeddedObjectFactory::createInstanceUserInit" ); 280 281 // the initialization is completelly controlled by user 282 if ( !xStorage.is() ) 283 throw lang::IllegalArgumentException( ::rtl::OUString::createFromAscii( "No parent storage is provided!\n" ), 284 uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ), 285 1 ); 286 287 if ( !sEntName.getLength() ) 288 throw lang::IllegalArgumentException( ::rtl::OUString::createFromAscii( "Empty element name is provided!\n" ), 289 uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ), 290 2 ); 291 292 uno::Reference< uno::XInterface > xResult( 293 static_cast< ::cppu::OWeakObject* > ( new OleEmbeddedObject( m_xFactory, aClassID, aClassName ) ), 294 uno::UNO_QUERY ); 295 296 uno::Reference< embed::XEmbedPersist > xPersist( xResult, uno::UNO_QUERY ); 297 if ( xPersist.is() ) 298 { 299 xPersist->setPersistentEntry( xStorage, 300 sEntName, 301 embed::EntryInitModes::DEFAULT_INIT, 302 uno::Sequence< beans::PropertyValue >(), 303 lObjArgs ); 304 305 } 306 else 307 throw uno::RuntimeException(); // TODO: 308 309 return xResult; 310 } 311 312 //------------------------------------------------------------------------- 313 ::rtl::OUString SAL_CALL OleEmbeddedObjectFactory::getImplementationName() 314 throw ( uno::RuntimeException ) 315 { 316 return impl_staticGetImplementationName(); 317 } 318 319 //------------------------------------------------------------------------- 320 sal_Bool SAL_CALL OleEmbeddedObjectFactory::supportsService( const ::rtl::OUString& ServiceName ) 321 throw ( uno::RuntimeException ) 322 { 323 uno::Sequence< ::rtl::OUString > aSeq = impl_staticGetSupportedServiceNames(); 324 325 for ( sal_Int32 nInd = 0; nInd < aSeq.getLength(); nInd++ ) 326 if ( ServiceName.compareTo( aSeq[nInd] ) == 0 ) 327 return sal_True; 328 329 return sal_False; 330 } 331 332 //------------------------------------------------------------------------- 333 uno::Sequence< ::rtl::OUString > SAL_CALL OleEmbeddedObjectFactory::getSupportedServiceNames() 334 throw ( uno::RuntimeException ) 335 { 336 return impl_staticGetSupportedServiceNames(); 337 } 338 339