File: | ucbhelper/source/client/content.cxx |
Location: | line 470, column 5 |
Description: | Called C++ object pointer is null |
1 | /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
2 | /* |
3 | * This file is part of the LibreOffice project. |
4 | * |
5 | * This Source Code Form is subject to the terms of the Mozilla Public |
6 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
7 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
8 | * |
9 | * This file incorporates work covered by the following license notice: |
10 | * |
11 | * Licensed to the Apache Software Foundation (ASF) under one or more |
12 | * contributor license agreements. See the NOTICE file distributed |
13 | * with this work for additional information regarding copyright |
14 | * ownership. The ASF licenses this file to you under the Apache |
15 | * License, Version 2.0 (the "License"); you may not use this file |
16 | * except in compliance with the License. You may obtain a copy of |
17 | * the License at http://www.apache.org/licenses/LICENSE-2.0 . |
18 | */ |
19 | |
20 | |
21 | /************************************************************************** |
22 | TODO |
23 | ************************************************************************** |
24 | |
25 | *************************************************************************/ |
26 | #include <osl/diagnose.h> |
27 | #include <osl/mutex.hxx> |
28 | #include <salhelper/simplereferenceobject.hxx> |
29 | #include <cppuhelper/weak.hxx> |
30 | |
31 | #include <cppuhelper/implbase1.hxx> |
32 | #include <com/sun/star/ucb/ContentCreationError.hpp> |
33 | #include <com/sun/star/ucb/XCommandEnvironment.hpp> |
34 | #include <com/sun/star/ucb/XCommandInfo.hpp> |
35 | #include <com/sun/star/ucb/XCommandProcessor.hpp> |
36 | #include <com/sun/star/ucb/Command.hpp> |
37 | #include <com/sun/star/ucb/CommandInfo.hpp> |
38 | #include <com/sun/star/ucb/ContentAction.hpp> |
39 | #include <com/sun/star/ucb/OpenCommandArgument2.hpp> |
40 | #include <com/sun/star/ucb/InsertCommandArgument.hpp> |
41 | #include <com/sun/star/ucb/GlobalTransferCommandArgument.hpp> |
42 | #include <com/sun/star/ucb/NameClash.hpp> |
43 | #include <com/sun/star/ucb/OpenMode.hpp> |
44 | #include <com/sun/star/ucb/XContentCreator.hpp> |
45 | #include <com/sun/star/ucb/XContentEventListener.hpp> |
46 | #include <com/sun/star/ucb/XContentIdentifierFactory.hpp> |
47 | #include <com/sun/star/ucb/XContentProvider.hpp> |
48 | #include <com/sun/star/ucb/XContentProviderManager.hpp> |
49 | #include <com/sun/star/ucb/XDynamicResultSet.hpp> |
50 | #include <com/sun/star/ucb/XSortedDynamicResultSetFactory.hpp> |
51 | #include <com/sun/star/beans/XPropertySetInfo.hpp> |
52 | #include <com/sun/star/beans/Property.hpp> |
53 | #include <com/sun/star/beans/PropertyValue.hpp> |
54 | #include <com/sun/star/sdbc/XResultSet.hpp> |
55 | #include <com/sun/star/sdbc/XRow.hpp> |
56 | #include <com/sun/star/lang/IllegalArgumentException.hpp> |
57 | #include <com/sun/star/beans/UnknownPropertyException.hpp> |
58 | #include <ucbhelper/macros.hxx> |
59 | #include <ucbhelper/content.hxx> |
60 | #include <ucbhelper/contentbroker.hxx> |
61 | #include <ucbhelper/activedatasink.hxx> |
62 | #include <ucbhelper/activedatastreamer.hxx> |
63 | #include <ucbhelper/interactionrequest.hxx> |
64 | #include <ucbhelper/cancelcommandexecution.hxx> |
65 | |
66 | using namespace com::sun::star::container; |
67 | using namespace com::sun::star::beans; |
68 | using namespace com::sun::star::io; |
69 | using namespace com::sun::star::lang; |
70 | using namespace com::sun::star::sdbc; |
71 | using namespace com::sun::star::task; |
72 | using namespace com::sun::star::ucb; |
73 | using namespace com::sun::star::uno; |
74 | |
75 | namespace ucbhelper |
76 | { |
77 | |
78 | class EmptyInputStream : public ::cppu::WeakImplHelper1< XInputStream > |
79 | { |
80 | public: |
81 | virtual sal_Int32 SAL_CALL readBytes( |
82 | Sequence< sal_Int8 > & data, sal_Int32 nBytesToRead ) |
83 | throw (IOException, RuntimeException); |
84 | virtual sal_Int32 SAL_CALL readSomeBytes( |
85 | Sequence< sal_Int8 > & data, sal_Int32 nMaxBytesToRead ) |
86 | throw (IOException, RuntimeException); |
87 | virtual void SAL_CALL skipBytes( sal_Int32 nBytesToSkip ) |
88 | throw (IOException, RuntimeException); |
89 | virtual sal_Int32 SAL_CALL available() |
90 | throw (IOException, RuntimeException); |
91 | virtual void SAL_CALL closeInput() |
92 | throw (IOException, RuntimeException); |
93 | }; |
94 | |
95 | sal_Int32 EmptyInputStream::readBytes( |
96 | Sequence< sal_Int8 > & data, sal_Int32 ) |
97 | throw (IOException, RuntimeException) |
98 | { |
99 | data.realloc( 0 ); |
100 | return 0; |
101 | } |
102 | |
103 | sal_Int32 EmptyInputStream::readSomeBytes( |
104 | Sequence< sal_Int8 > & data, sal_Int32 ) |
105 | throw (IOException, RuntimeException) |
106 | { |
107 | data.realloc( 0 ); |
108 | return 0; |
109 | } |
110 | |
111 | void EmptyInputStream::skipBytes( sal_Int32 ) |
112 | throw (IOException, RuntimeException) |
113 | { |
114 | } |
115 | |
116 | sal_Int32 EmptyInputStream::available() |
117 | throw (IOException, RuntimeException) |
118 | { |
119 | return 0; |
120 | } |
121 | |
122 | void EmptyInputStream::closeInput() |
123 | throw (IOException, RuntimeException) |
124 | { |
125 | } |
126 | |
127 | |
128 | //========================================================================= |
129 | //========================================================================= |
130 | // |
131 | // class ContentEventListener_Impl. |
132 | // |
133 | //========================================================================= |
134 | //========================================================================= |
135 | |
136 | class ContentEventListener_Impl : public cppu::OWeakObject, |
137 | public XContentEventListener |
138 | { |
139 | Content_Impl& m_rContent; |
140 | |
141 | public: |
142 | ContentEventListener_Impl( Content_Impl& rContent ) |
143 | : m_rContent( rContent ) {} |
144 | |
145 | // XInterface |
146 | XINTERFACE_DECL()virtual com::sun::star::uno::Any queryInterface( const com::sun ::star::uno::Type & rType ) throw( com::sun::star::uno::RuntimeException ); virtual void acquire() throw(); virtual void release() throw (); |
147 | |
148 | // XContentEventListener |
149 | virtual void SAL_CALL contentEvent( const ContentEvent& evt ) |
150 | throw( RuntimeException ); |
151 | |
152 | // XEventListener ( base of XContentEventListener ) |
153 | virtual void SAL_CALL disposing( const EventObject& Source ) |
154 | throw( RuntimeException ); |
155 | }; |
156 | |
157 | //========================================================================= |
158 | //========================================================================= |
159 | // |
160 | // class Content_Impl. |
161 | // |
162 | //========================================================================= |
163 | //========================================================================= |
164 | |
165 | class Content_Impl : public salhelper::SimpleReferenceObject |
166 | { |
167 | friend class ContentEventListener_Impl; |
168 | |
169 | mutable rtl::OUString m_aURL; |
170 | Reference< XMultiServiceFactory > m_xSMgr; |
171 | Reference< XContent > m_xContent; |
172 | Reference< XCommandProcessor > m_xCommandProcessor; |
173 | Reference< XCommandEnvironment > m_xEnv; |
174 | Reference< XContentEventListener > m_xContentEventListener; |
175 | mutable osl::Mutex m_aMutex; |
176 | sal_Int32 m_nCommandId; |
177 | |
178 | private: |
179 | void reinit( const Reference< XContent >& xContent ); |
180 | void disposing(const EventObject& Source); |
181 | |
182 | public: |
183 | Content_Impl() : m_nCommandId( 0 ) {}; |
184 | Content_Impl( const Reference< XMultiServiceFactory >& rSMgr, |
185 | const Reference< XContent >& rContent, |
186 | const Reference< XCommandEnvironment >& rEnv ); |
187 | |
188 | virtual ~Content_Impl(); |
189 | |
190 | const rtl::OUString& getURL() const; |
191 | Reference< XContent > getContent(); |
192 | Reference< XCommandProcessor > getCommandProcessor(); |
193 | sal_Int32 getCommandId(); |
194 | Reference< XMultiServiceFactory > getServiceManager() { return m_xSMgr; } |
195 | |
196 | Any executeCommand( const Command& rCommand ); |
197 | |
198 | inline const Reference< XCommandEnvironment >& getEnvironment() const; |
199 | inline void setEnvironment( |
200 | const Reference< XCommandEnvironment >& xNewEnv ); |
201 | |
202 | void inserted(); |
203 | }; |
204 | |
205 | //========================================================================= |
206 | // Helpers. |
207 | //========================================================================= |
208 | |
209 | static void ensureContentProviderForURL( const ContentBroker & rBroker, |
210 | const rtl::OUString & rURL ) |
211 | throw ( ContentCreationException, RuntimeException ) |
212 | { |
213 | Reference< XContentProviderManager > xMgr |
214 | = rBroker.getContentProviderManagerInterface(); |
215 | if ( !xMgr.is() ) |
216 | { |
217 | throw RuntimeException( |
218 | rtl::OUString( |
219 | "UCB does not implement mandatory interface " |
220 | "XContentProviderManager!" ), |
221 | Reference< XInterface >() ); |
222 | } |
223 | else |
224 | { |
225 | Reference< XContentProvider > xProv |
226 | = xMgr->queryContentProvider( rURL ); |
227 | if ( !xProv.is() ) |
228 | { |
229 | throw ContentCreationException( |
230 | rtl::OUString( |
231 | "No Content Provider available for URL: ") + rURL, |
232 | Reference< XInterface >(), |
233 | ContentCreationError_NO_CONTENT_PROVIDER ); |
234 | } |
235 | } |
236 | } |
237 | |
238 | //========================================================================= |
239 | static ContentBroker* getContentBroker( bool bThrow ) |
240 | throw ( ContentCreationException, RuntimeException ) |
241 | { |
242 | ContentBroker* pBroker = ContentBroker::get(); |
243 | |
244 | if ( !pBroker ) |
245 | { |
246 | if ( bThrow ) |
247 | throw RuntimeException( |
248 | rtl::OUString("No Content Broker!"), |
249 | Reference< XInterface >() ); |
250 | } |
251 | else |
252 | { |
253 | #if OSL_DEBUG_LEVEL1 > 1 |
254 | Reference< XContentProviderManager > xMgr |
255 | = pBroker->getContentProviderManagerInterface(); |
256 | if ( !xMgr.is() ) |
257 | { |
258 | if ( bThrow ) |
259 | throw RuntimeException( |
260 | rtl::OUString( |
261 | "UCB does not implement mandatory interface " |
262 | "XContentProviderManager!" ), |
263 | Reference< XInterface >() ); |
264 | } |
265 | else |
266 | { |
267 | OSL_ENSURE( xMgr->queryContentProviders().getLength(),do { if (true && (!(xMgr->queryContentProviders(). getLength()))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "268" ": "), "%s", "Content Broker not configured (no providers)!" ); } } while (false) |
268 | "Content Broker not configured (no providers)!" )do { if (true && (!(xMgr->queryContentProviders(). getLength()))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "268" ": "), "%s", "Content Broker not configured (no providers)!" ); } } while (false); |
269 | } |
270 | #endif |
271 | } |
272 | |
273 | return pBroker; |
274 | } |
275 | |
276 | //========================================================================= |
277 | static Reference< XContentIdentifier > getContentIdentifier( |
278 | const ContentBroker & rBroker, |
279 | const rtl::OUString & rURL, |
280 | bool bThrow ) |
281 | throw ( ContentCreationException, RuntimeException ) |
282 | { |
283 | Reference< XContentIdentifierFactory > xIdFac |
284 | = rBroker.getContentIdentifierFactoryInterface(); |
285 | if ( xIdFac.is() ) |
286 | { |
287 | Reference< XContentIdentifier > xId |
288 | = xIdFac->createContentIdentifier( rURL ); |
289 | |
290 | if ( xId.is() ) |
291 | return xId; |
292 | |
293 | if ( bThrow ) |
294 | { |
295 | ensureContentProviderForURL( rBroker, rURL ); |
296 | |
297 | throw ContentCreationException( |
298 | rtl::OUString( |
299 | "Unable to create Content Identifier!" ), |
300 | Reference< XInterface >(), |
301 | ContentCreationError_IDENTIFIER_CREATION_FAILED ); |
302 | } |
303 | } |
304 | else |
305 | { |
306 | if ( bThrow ) |
307 | throw RuntimeException( |
308 | rtl::OUString( |
309 | "UCB does not implement mandatory interface " |
310 | "XContentIdentifierFactory!" ), |
311 | Reference< XInterface >() ); |
312 | } |
313 | |
314 | return Reference< XContentIdentifier >(); |
315 | } |
316 | |
317 | //========================================================================= |
318 | static Reference< XContent > getContent( |
319 | const ContentBroker & rBroker, |
320 | const Reference< XContentIdentifier > & xId, |
321 | bool bThrow ) |
322 | throw ( ContentCreationException, RuntimeException ) |
323 | { |
324 | Reference< XContentProvider > xProvider |
325 | = rBroker.getContentProviderInterface(); |
326 | if ( xProvider.is() ) |
327 | { |
328 | Reference< XContent > xContent; |
329 | rtl::OUString msg; |
330 | try |
331 | { |
332 | xContent = xProvider->queryContent( xId ); |
333 | } |
334 | catch ( IllegalIdentifierException const & e ) |
335 | { |
336 | msg = e.Message; |
337 | // handled below. |
338 | } |
339 | |
340 | if ( xContent.is() ) |
341 | return xContent; |
342 | |
343 | if ( bThrow ) |
344 | { |
345 | ensureContentProviderForURL( rBroker, xId->getContentIdentifier() ); |
346 | |
347 | throw ContentCreationException( |
348 | rtl::OUString( |
349 | "Unable to create Content! " ) + msg, |
350 | Reference< XInterface >(), |
351 | ContentCreationError_CONTENT_CREATION_FAILED ); |
352 | } |
353 | } |
354 | else |
355 | { |
356 | if ( bThrow ) |
357 | throw RuntimeException( |
358 | rtl::OUString( |
359 | "UCB does not implement mandatory interface " |
360 | "XContentProvider!" ), |
361 | Reference< XInterface >() ); |
362 | } |
363 | |
364 | return Reference< XContent >(); |
365 | } |
366 | |
367 | //========================================================================= |
368 | //========================================================================= |
369 | // |
370 | // Content Implementation. |
371 | // |
372 | //========================================================================= |
373 | //========================================================================= |
374 | |
375 | Content::Content() |
376 | : m_xImpl( new Content_Impl ) |
377 | { |
378 | } |
379 | |
380 | //========================================================================= |
381 | Content::Content( const rtl::OUString& rURL, |
382 | const Reference< XCommandEnvironment >& rEnv ) |
383 | throw ( ContentCreationException, RuntimeException ) |
384 | { |
385 | ContentBroker* pBroker = getContentBroker( true ); |
386 | |
387 | Reference< XContentIdentifier > xId |
388 | = getContentIdentifier( *pBroker, rURL, true ); |
389 | |
390 | Reference< XContent > xContent = getContent( *pBroker, xId, true ); |
391 | |
392 | m_xImpl = new Content_Impl( pBroker->getServiceManager(), xContent, rEnv ); |
393 | } |
394 | |
395 | //========================================================================= |
396 | Content::Content( const Reference< XContent >& rContent, |
397 | const Reference< XCommandEnvironment >& rEnv ) |
398 | throw ( ContentCreationException, RuntimeException ) |
399 | { |
400 | ContentBroker* pBroker = getContentBroker( true ); |
401 | |
402 | m_xImpl = new Content_Impl( pBroker->getServiceManager(), rContent, rEnv ); |
403 | } |
404 | |
405 | //========================================================================= |
406 | Content::Content( const Content& rOther ) |
407 | { |
408 | m_xImpl = rOther.m_xImpl; |
409 | } |
410 | |
411 | //========================================================================= |
412 | // static |
413 | sal_Bool Content::create( const rtl::OUString& rURL, |
414 | const Reference< XCommandEnvironment >& rEnv, |
415 | Content& rContent ) |
416 | { |
417 | ContentBroker* pBroker = getContentBroker( false ); |
418 | if ( !pBroker ) |
419 | return sal_False((sal_Bool)0); |
420 | |
421 | Reference< XContentIdentifier > xId |
422 | = getContentIdentifier( *pBroker, rURL, false ); |
423 | if ( !xId.is() ) |
424 | return sal_False((sal_Bool)0); |
425 | |
426 | Reference< XContent > xContent = getContent( *pBroker, xId, false ); |
427 | if ( !xContent.is() ) |
428 | return sal_False((sal_Bool)0); |
429 | |
430 | rContent.m_xImpl |
431 | = new Content_Impl( pBroker->getServiceManager(), xContent, rEnv ); |
432 | |
433 | return sal_True((sal_Bool)1); |
434 | } |
435 | |
436 | //========================================================================= |
437 | Content::~Content() |
438 | { |
439 | } |
440 | |
441 | //========================================================================= |
442 | Content& Content::operator=( const Content& rOther ) |
443 | { |
444 | m_xImpl = rOther.m_xImpl; |
445 | return *this; |
446 | } |
447 | |
448 | //========================================================================= |
449 | Reference< XContent > Content::get() const |
450 | { |
451 | return m_xImpl->getContent(); |
452 | } |
453 | |
454 | //========================================================================= |
455 | const rtl::OUString& Content::getURL() const |
456 | { |
457 | return m_xImpl->getURL(); |
458 | } |
459 | |
460 | //========================================================================= |
461 | const Reference< XCommandEnvironment >& Content::getCommandEnvironment() const |
462 | { |
463 | return m_xImpl->getEnvironment(); |
464 | } |
465 | |
466 | //========================================================================= |
467 | void Content::setCommandEnvironment( |
468 | const Reference< XCommandEnvironment >& xNewEnv ) |
469 | { |
470 | m_xImpl->setEnvironment( xNewEnv ); |
Called C++ object pointer is null | |
471 | } |
472 | |
473 | //========================================================================= |
474 | Reference< XCommandInfo > Content::getCommands() |
475 | throw( CommandAbortedException, RuntimeException, Exception ) |
476 | { |
477 | Command aCommand; |
478 | aCommand.Name = rtl::OUString("getCommandInfo"); |
479 | aCommand.Handle = -1; // n/a |
480 | aCommand.Argument = Any(); |
481 | |
482 | Any aResult = m_xImpl->executeCommand( aCommand ); |
483 | |
484 | Reference< XCommandInfo > xInfo; |
485 | aResult >>= xInfo; |
486 | return xInfo; |
487 | } |
488 | |
489 | //========================================================================= |
490 | Reference< XPropertySetInfo > Content::getProperties() |
491 | throw( CommandAbortedException, RuntimeException, Exception ) |
492 | { |
493 | Command aCommand; |
494 | aCommand.Name = rtl::OUString("getPropertySetInfo"); |
495 | aCommand.Handle = -1; // n/a |
496 | aCommand.Argument = Any(); |
497 | |
498 | Any aResult = m_xImpl->executeCommand( aCommand ); |
499 | |
500 | Reference< XPropertySetInfo > xInfo; |
501 | aResult >>= xInfo; |
502 | return xInfo; |
503 | } |
504 | |
505 | //========================================================================= |
506 | Any Content::getPropertyValue( const rtl::OUString& rPropertyName ) |
507 | throw( CommandAbortedException, RuntimeException, Exception ) |
508 | { |
509 | Sequence< rtl::OUString > aNames( 1 ); |
510 | aNames.getArray()[ 0 ] = rPropertyName; |
511 | |
512 | Sequence< Any > aRet = getPropertyValues( aNames ); |
513 | return aRet.getConstArray()[ 0 ]; |
514 | } |
515 | |
516 | //========================================================================= |
517 | Any Content::setPropertyValue( const rtl::OUString& rName, |
518 | const Any& rValue ) |
519 | throw( CommandAbortedException, RuntimeException, Exception ) |
520 | { |
521 | Sequence< rtl::OUString > aNames( 1 ); |
522 | aNames.getArray()[ 0 ] = rName; |
523 | |
524 | Sequence< Any > aValues( 1 ); |
525 | aValues.getArray()[ 0 ] = rValue; |
526 | |
527 | Sequence< Any > aErrors = setPropertyValues( aNames, aValues ); |
528 | return aErrors.getConstArray()[ 0 ]; |
529 | } |
530 | |
531 | //========================================================================= |
532 | Sequence< Any > Content::getPropertyValues( |
533 | const Sequence< rtl::OUString >& rPropertyNames ) |
534 | throw( CommandAbortedException, RuntimeException, Exception ) |
535 | { |
536 | Reference< XRow > xRow = getPropertyValuesInterface( rPropertyNames ); |
537 | |
538 | sal_Int32 nCount = rPropertyNames.getLength(); |
539 | Sequence< Any > aValues( nCount ); |
540 | |
541 | if ( xRow.is() ) |
542 | { |
543 | Any* pValues = aValues.getArray(); |
544 | |
545 | for ( sal_Int32 n = 0; n < nCount; ++n ) |
546 | pValues[ n ] = xRow->getObject( n + 1, Reference< XNameAccess >() ); |
547 | } |
548 | |
549 | return aValues; |
550 | } |
551 | |
552 | //========================================================================= |
553 | Reference< XRow > Content::getPropertyValuesInterface( |
554 | const Sequence< rtl::OUString >& rPropertyNames ) |
555 | throw( CommandAbortedException, RuntimeException, Exception ) |
556 | { |
557 | sal_Int32 nCount = rPropertyNames.getLength(); |
558 | Sequence< Property > aProps( nCount ); |
559 | Property* pProps = aProps.getArray(); |
560 | |
561 | const rtl::OUString* pNames = rPropertyNames.getConstArray(); |
562 | |
563 | for ( sal_Int32 n = 0; n< nCount; ++n ) |
564 | { |
565 | Property& rProp = pProps[ n ]; |
566 | |
567 | rProp.Name = pNames[ n ]; |
568 | rProp.Handle = -1; // n/a |
569 | // rProp.Type = |
570 | // rProp.Attributes = ; |
571 | } |
572 | |
573 | Command aCommand; |
574 | aCommand.Name = rtl::OUString("getPropertyValues"); |
575 | aCommand.Handle = -1; // n/a |
576 | aCommand.Argument <<= aProps; |
577 | |
578 | Any aResult = m_xImpl->executeCommand( aCommand ); |
579 | |
580 | Reference< XRow > xRow; |
581 | aResult >>= xRow; |
582 | return xRow; |
583 | } |
584 | |
585 | //========================================================================= |
586 | Sequence< Any > Content::setPropertyValues( |
587 | const Sequence< rtl::OUString >& rPropertyNames, |
588 | const Sequence< Any >& rValues ) |
589 | throw( CommandAbortedException, RuntimeException, Exception ) |
590 | { |
591 | if ( rPropertyNames.getLength() != rValues.getLength() ) |
592 | { |
593 | ucbhelper::cancelCommandExecution( |
594 | makeAny( IllegalArgumentException( |
595 | rtl::OUString( |
596 | "Length of property names sequence and value " |
597 | "sequence are unequal!" ), |
598 | get(), |
599 | -1 ) ), |
600 | m_xImpl->getEnvironment() ); |
601 | // Unreachable |
602 | } |
603 | |
604 | sal_Int32 nCount = rValues.getLength(); |
605 | Sequence< PropertyValue > aProps( nCount ); |
606 | PropertyValue* pProps = aProps.getArray(); |
607 | |
608 | const rtl::OUString* pNames = rPropertyNames.getConstArray(); |
609 | const Any* pValues = rValues.getConstArray(); |
610 | |
611 | for ( sal_Int32 n = 0; n< nCount; ++n ) |
612 | { |
613 | PropertyValue& rProp = pProps[ n ]; |
614 | |
615 | rProp.Name = pNames[ n ]; |
616 | rProp.Handle = -1; // n/a |
617 | rProp.Value = pValues[ n ]; |
618 | // rProp.State = ; |
619 | } |
620 | |
621 | Command aCommand; |
622 | aCommand.Name = rtl::OUString("setPropertyValues"); |
623 | aCommand.Handle = -1; // n/a |
624 | aCommand.Argument <<= aProps; |
625 | |
626 | Any aResult = m_xImpl->executeCommand( aCommand ); |
627 | |
628 | Sequence< Any > aErrors; |
629 | aResult >>= aErrors; |
630 | return aErrors; |
631 | } |
632 | |
633 | //========================================================================= |
634 | Any Content::executeCommand( const rtl::OUString& rCommandName, |
635 | const Any& rCommandArgument ) |
636 | throw( CommandAbortedException, RuntimeException, Exception ) |
637 | { |
638 | Command aCommand; |
639 | aCommand.Name = rCommandName; |
640 | aCommand.Handle = -1; // n/a |
641 | aCommand.Argument = rCommandArgument; |
642 | |
643 | return m_xImpl->executeCommand( aCommand ); |
644 | } |
645 | |
646 | //========================================================================= |
647 | Any Content::createCursorAny( const Sequence< rtl::OUString >& rPropertyNames, |
648 | ResultSetInclude eMode ) |
649 | throw( CommandAbortedException, RuntimeException, Exception ) |
650 | { |
651 | sal_Int32 nCount = rPropertyNames.getLength(); |
652 | Sequence< Property > aProps( nCount ); |
653 | Property* pProps = aProps.getArray(); |
654 | const rtl::OUString* pNames = rPropertyNames.getConstArray(); |
655 | for ( sal_Int32 n = 0; n < nCount; ++n ) |
656 | { |
657 | Property& rProp = pProps[ n ]; |
658 | rProp.Name = pNames[ n ]; |
659 | rProp.Handle = -1; // n/a |
660 | } |
661 | |
662 | OpenCommandArgument2 aArg; |
663 | aArg.Mode = ( eMode == INCLUDE_FOLDERS_ONLY ) |
664 | ? OpenMode::FOLDERS |
665 | : ( eMode == INCLUDE_DOCUMENTS_ONLY ) |
666 | ? OpenMode::DOCUMENTS : OpenMode::ALL; |
667 | aArg.Priority = 0; // unused |
668 | aArg.Sink = Reference< XInterface >(); // unused |
669 | aArg.Properties = aProps; |
670 | |
671 | Command aCommand; |
672 | aCommand.Name = rtl::OUString("open"); |
673 | aCommand.Handle = -1; // n/a |
674 | aCommand.Argument <<= aArg; |
675 | |
676 | return m_xImpl->executeCommand( aCommand ); |
677 | } |
678 | |
679 | //========================================================================= |
680 | Reference< XResultSet > Content::createCursor( |
681 | const Sequence< rtl::OUString >& rPropertyNames, |
682 | ResultSetInclude eMode ) |
683 | throw( CommandAbortedException, RuntimeException, Exception ) |
684 | { |
685 | Any aCursorAny = createCursorAny( rPropertyNames, eMode ); |
686 | |
687 | Reference< XDynamicResultSet > xDynSet; |
688 | Reference< XResultSet > aResult; |
689 | |
690 | aCursorAny >>= xDynSet; |
691 | if ( xDynSet.is() ) |
692 | aResult = xDynSet->getStaticResultSet(); |
693 | |
694 | OSL_ENSURE( aResult.is(), "Content::createCursor - no cursor!" )do { if (true && (!(aResult.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "694" ": "), "%s", "Content::createCursor - no cursor!") ; } } while (false); |
695 | |
696 | if ( !aResult.is() ) |
697 | { |
698 | // Former, the open command directly returned a XResultSet. |
699 | aCursorAny >>= aResult; |
700 | |
701 | OSL_ENSURE( !aResult.is(),do { if (true && (!(!aResult.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "703" ": "), "%s", "Content::createCursor - open-Command must " "return a Reference< XDynnamicResultSet >!"); } } while (false) |
702 | "Content::createCursor - open-Command must "do { if (true && (!(!aResult.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "703" ": "), "%s", "Content::createCursor - open-Command must " "return a Reference< XDynnamicResultSet >!"); } } while (false) |
703 | "return a Reference< XDynnamicResultSet >!" )do { if (true && (!(!aResult.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "703" ": "), "%s", "Content::createCursor - open-Command must " "return a Reference< XDynnamicResultSet >!"); } } while (false); |
704 | } |
705 | |
706 | return aResult; |
707 | } |
708 | |
709 | //========================================================================= |
710 | Reference< XDynamicResultSet > Content::createDynamicCursor( |
711 | const Sequence< rtl::OUString >& rPropertyNames, |
712 | ResultSetInclude eMode ) |
713 | throw( CommandAbortedException, RuntimeException, Exception ) |
714 | { |
715 | Reference< XDynamicResultSet > aResult; |
716 | createCursorAny( rPropertyNames, eMode ) >>= aResult; |
717 | |
718 | OSL_ENSURE( aResult.is(), "Content::createDynamicCursor - no cursor!" )do { if (true && (!(aResult.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "718" ": "), "%s", "Content::createDynamicCursor - no cursor!" ); } } while (false); |
719 | |
720 | return aResult; |
721 | } |
722 | |
723 | //========================================================================= |
724 | Reference< XResultSet > Content::createSortedCursor( |
725 | const Sequence< rtl::OUString >& rPropertyNames, |
726 | const Sequence< NumberedSortingInfo >& rSortInfo, |
727 | Reference< XAnyCompareFactory > rAnyCompareFactory, |
728 | ResultSetInclude eMode ) |
729 | throw( CommandAbortedException, RuntimeException, Exception ) |
730 | { |
731 | Reference< XResultSet > aResult; |
732 | Reference< XDynamicResultSet > aDynSet; |
733 | |
734 | Any aCursorAny = createCursorAny( rPropertyNames, eMode ); |
735 | |
736 | aCursorAny >>= aDynSet; |
737 | |
738 | if( aDynSet.is() ) |
739 | { |
740 | Reference< XDynamicResultSet > aDynResult; |
741 | Reference< XMultiServiceFactory > aServiceManager = m_xImpl->getServiceManager(); |
742 | |
743 | if( aServiceManager.is() ) |
744 | { |
745 | Reference< XSortedDynamicResultSetFactory > aSortFactory( aServiceManager->createInstance( |
746 | rtl::OUString("com.sun.star.ucb.SortedDynamicResultSetFactory")), |
747 | UNO_QUERY ); |
748 | |
749 | aDynResult = aSortFactory->createSortedDynamicResultSet( aDynSet, |
750 | rSortInfo, |
751 | rAnyCompareFactory ); |
752 | } |
753 | |
754 | OSL_ENSURE( aDynResult.is(), "Content::createSortedCursor - no sorted cursor!\n" )do { if (true && (!(aDynResult.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "754" ": "), "%s", "Content::createSortedCursor - no sorted cursor!\n" ); } } while (false); |
755 | |
756 | if( aDynResult.is() ) |
757 | aResult = aDynResult->getStaticResultSet(); |
758 | else |
759 | aResult = aDynSet->getStaticResultSet(); |
760 | } |
761 | |
762 | OSL_ENSURE( aResult.is(), "Content::createSortedCursor - no cursor!" )do { if (true && (!(aResult.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "762" ": "), "%s", "Content::createSortedCursor - no cursor!" ); } } while (false); |
763 | |
764 | if ( !aResult.is() ) |
765 | { |
766 | // Former, the open command directly returned a XResultSet. |
767 | aCursorAny >>= aResult; |
768 | |
769 | OSL_ENSURE( !aResult.is(),do { if (true && (!(!aResult.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "771" ": "), "%s", "Content::createCursor - open-Command must " "return a Reference< XDynnamicResultSet >!"); } } while (false) |
770 | "Content::createCursor - open-Command must "do { if (true && (!(!aResult.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "771" ": "), "%s", "Content::createCursor - open-Command must " "return a Reference< XDynnamicResultSet >!"); } } while (false) |
771 | "return a Reference< XDynnamicResultSet >!" )do { if (true && (!(!aResult.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "771" ": "), "%s", "Content::createCursor - open-Command must " "return a Reference< XDynnamicResultSet >!"); } } while (false); |
772 | } |
773 | |
774 | return aResult; |
775 | } |
776 | |
777 | //========================================================================= |
778 | Reference< XInputStream > Content::openStream() |
779 | throw( CommandAbortedException, RuntimeException, Exception ) |
780 | { |
781 | if ( !isDocument() ) |
782 | return Reference< XInputStream >(); |
783 | |
784 | Reference< XActiveDataSink > xSink = new ActiveDataSink; |
785 | |
786 | OpenCommandArgument2 aArg; |
787 | aArg.Mode = OpenMode::DOCUMENT; |
788 | aArg.Priority = 0; // unused |
789 | aArg.Sink = xSink; |
790 | aArg.Properties = Sequence< Property >( 0 ); // unused |
791 | |
792 | Command aCommand; |
793 | aCommand.Name = rtl::OUString("open"); |
794 | aCommand.Handle = -1; // n/a |
795 | aCommand.Argument <<= aArg; |
796 | |
797 | m_xImpl->executeCommand( aCommand ); |
798 | |
799 | return xSink->getInputStream(); |
800 | } |
801 | |
802 | //========================================================================= |
803 | Reference< XInputStream > Content::openStreamNoLock() |
804 | throw( CommandAbortedException, RuntimeException, Exception ) |
805 | { |
806 | if ( !isDocument() ) |
807 | return Reference< XInputStream >(); |
808 | |
809 | Reference< XActiveDataSink > xSink = new ActiveDataSink; |
810 | |
811 | OpenCommandArgument2 aArg; |
812 | aArg.Mode = OpenMode::DOCUMENT_SHARE_DENY_NONE; |
813 | aArg.Priority = 0; // unused |
814 | aArg.Sink = xSink; |
815 | aArg.Properties = Sequence< Property >( 0 ); // unused |
816 | |
817 | Command aCommand; |
818 | aCommand.Name = rtl::OUString("open"); |
819 | aCommand.Handle = -1; // n/a |
820 | aCommand.Argument <<= aArg; |
821 | |
822 | m_xImpl->executeCommand( aCommand ); |
823 | |
824 | return xSink->getInputStream(); |
825 | } |
826 | |
827 | //========================================================================= |
828 | Reference< XStream > Content::openWriteableStream() |
829 | throw( CommandAbortedException, RuntimeException, Exception ) |
830 | { |
831 | if ( !isDocument() ) |
832 | return Reference< XStream >(); |
833 | |
834 | Reference< XActiveDataStreamer > xStreamer = new ActiveDataStreamer; |
835 | |
836 | OpenCommandArgument2 aArg; |
837 | aArg.Mode = OpenMode::DOCUMENT; |
838 | aArg.Priority = 0; // unused |
839 | aArg.Sink = xStreamer; |
840 | aArg.Properties = Sequence< Property >( 0 ); // unused |
841 | |
842 | Command aCommand; |
843 | aCommand.Name = rtl::OUString("open"); |
844 | aCommand.Handle = -1; // n/a |
845 | aCommand.Argument <<= aArg; |
846 | |
847 | m_xImpl->executeCommand( aCommand ); |
848 | |
849 | return xStreamer->getStream(); |
850 | } |
851 | |
852 | //========================================================================= |
853 | Reference< XStream > Content::openWriteableStreamNoLock() |
854 | throw( CommandAbortedException, RuntimeException, Exception ) |
855 | { |
856 | if ( !isDocument() ) |
857 | return Reference< XStream >(); |
858 | |
859 | Reference< XActiveDataStreamer > xStreamer = new ActiveDataStreamer; |
860 | |
861 | OpenCommandArgument2 aArg; |
862 | aArg.Mode = OpenMode::DOCUMENT_SHARE_DENY_NONE; |
863 | aArg.Priority = 0; // unused |
864 | aArg.Sink = xStreamer; |
865 | aArg.Properties = Sequence< Property >( 0 ); // unused |
866 | |
867 | Command aCommand; |
868 | aCommand.Name = rtl::OUString("open"); |
869 | aCommand.Handle = -1; // n/a |
870 | aCommand.Argument <<= aArg; |
871 | |
872 | m_xImpl->executeCommand( aCommand ); |
873 | |
874 | return xStreamer->getStream(); |
875 | } |
876 | |
877 | //========================================================================= |
878 | sal_Bool Content::openStream( const Reference< XActiveDataSink >& rSink ) |
879 | throw( CommandAbortedException, RuntimeException, Exception ) |
880 | { |
881 | if ( !isDocument() ) |
882 | return sal_False((sal_Bool)0); |
883 | |
884 | OpenCommandArgument2 aArg; |
885 | aArg.Mode = OpenMode::DOCUMENT; |
886 | aArg.Priority = 0; // unused |
887 | aArg.Sink = rSink; |
888 | aArg.Properties = Sequence< Property >( 0 ); // unused |
889 | |
890 | Command aCommand; |
891 | aCommand.Name = rtl::OUString("open"); |
892 | aCommand.Handle = -1; // n/a |
893 | aCommand.Argument <<= aArg; |
894 | |
895 | m_xImpl->executeCommand( aCommand ); |
896 | |
897 | return sal_True((sal_Bool)1); |
898 | } |
899 | |
900 | //========================================================================= |
901 | sal_Bool Content::openStream( const Reference< XOutputStream >& rStream ) |
902 | throw( CommandAbortedException, RuntimeException, Exception ) |
903 | { |
904 | if ( !isDocument() ) |
905 | return sal_False((sal_Bool)0); |
906 | |
907 | OpenCommandArgument2 aArg; |
908 | aArg.Mode = OpenMode::DOCUMENT; |
909 | aArg.Priority = 0; // unused |
910 | aArg.Sink = rStream; |
911 | aArg.Properties = Sequence< Property >( 0 ); // unused |
912 | |
913 | Command aCommand; |
914 | aCommand.Name = rtl::OUString("open"); |
915 | aCommand.Handle = -1; // n/a |
916 | aCommand.Argument <<= aArg; |
917 | |
918 | m_xImpl->executeCommand( aCommand ); |
919 | |
920 | return sal_True((sal_Bool)1); |
921 | } |
922 | |
923 | //========================================================================= |
924 | void Content::writeStream( const Reference< XInputStream >& rStream, |
925 | sal_Bool bReplaceExisting ) |
926 | throw( CommandAbortedException, RuntimeException, Exception ) |
927 | { |
928 | InsertCommandArgument aArg; |
929 | aArg.Data = rStream.is() ? rStream : new EmptyInputStream; |
930 | aArg.ReplaceExisting = bReplaceExisting; |
931 | |
932 | Command aCommand; |
933 | aCommand.Name = rtl::OUString("insert"); |
934 | aCommand.Handle = -1; // n/a |
935 | aCommand.Argument <<= aArg; |
936 | |
937 | m_xImpl->executeCommand( aCommand ); |
938 | |
939 | m_xImpl->inserted(); |
940 | } |
941 | |
942 | //========================================================================= |
943 | Sequence< ContentInfo > Content::queryCreatableContentsInfo() |
944 | throw( CommandAbortedException, RuntimeException, Exception ) |
945 | { |
946 | // First, try it using "CreatableContentsInfo" property -> the "new" way. |
947 | Sequence< ContentInfo > aInfo; |
948 | if ( getPropertyValue( |
949 | rtl::OUString("CreatableContentsInfo") ) |
950 | >>= aInfo ) |
951 | return aInfo; |
952 | |
953 | // Second, try it using XContentCreator interface -> the "old" way (not |
954 | // providing the chance to supply an XCommandEnvironment. |
955 | Reference< XContentCreator > xCreator( m_xImpl->getContent(), UNO_QUERY ); |
956 | if ( xCreator.is() ) |
957 | aInfo = xCreator->queryCreatableContentsInfo(); |
958 | |
959 | return aInfo; |
960 | } |
961 | |
962 | //========================================================================= |
963 | sal_Bool Content::insertNewContent( const rtl::OUString& rContentType, |
964 | const Sequence< rtl::OUString >& |
965 | rPropertyNames, |
966 | const Sequence< Any >& rPropertyValues, |
967 | Content& rNewContent ) |
968 | throw( CommandAbortedException, RuntimeException, Exception ) |
969 | { |
970 | return insertNewContent( rContentType, |
971 | rPropertyNames, |
972 | rPropertyValues, |
973 | new EmptyInputStream, |
974 | rNewContent ); |
975 | } |
976 | |
977 | //========================================================================= |
978 | sal_Bool Content::insertNewContent( const rtl::OUString& rContentType, |
979 | const Sequence< rtl::OUString >& |
980 | rPropertyNames, |
981 | const Sequence< Any >& rPropertyValues, |
982 | const Reference< XInputStream >& rData, |
983 | Content& rNewContent ) |
984 | throw( CommandAbortedException, RuntimeException, Exception ) |
985 | { |
986 | if ( rContentType.isEmpty() ) |
987 | return sal_False((sal_Bool)0); |
988 | |
989 | // First, try it using "createNewContent" command -> the "new" way. |
990 | ContentInfo aInfo; |
991 | aInfo.Type = rContentType; |
992 | aInfo.Attributes = 0; |
993 | |
994 | Command aCommand; |
995 | aCommand.Name = rtl::OUString("createNewContent"); |
996 | aCommand.Handle = -1; // n/a |
997 | aCommand.Argument <<= aInfo; |
998 | |
999 | Reference< XContent > xNew; |
1000 | try |
1001 | { |
1002 | m_xImpl->executeCommand( aCommand ) >>= xNew; |
1003 | } |
1004 | catch ( RuntimeException const & ) |
1005 | { |
1006 | throw; |
1007 | } |
1008 | catch ( Exception const & ) |
1009 | { |
1010 | } |
1011 | |
1012 | if ( !xNew.is() ) |
1013 | { |
1014 | // Second, try it using XContentCreator interface -> the "old" |
1015 | // way (not providing the chance to supply an XCommandEnvironment. |
1016 | Reference< XContentCreator > xCreator( m_xImpl->getContent(), UNO_QUERY ); |
1017 | |
1018 | if ( !xCreator.is() ) |
1019 | return sal_False((sal_Bool)0); |
1020 | |
1021 | xNew = xCreator->createNewContent( aInfo ); |
1022 | |
1023 | if ( !xNew.is() ) |
1024 | return sal_False((sal_Bool)0); |
1025 | } |
1026 | |
1027 | Content aNewContent( xNew, m_xImpl->getEnvironment() ); |
1028 | aNewContent.setPropertyValues( rPropertyNames, rPropertyValues ); |
1029 | aNewContent.executeCommand( rtl::OUString("insert"), |
1030 | makeAny( |
1031 | InsertCommandArgument( |
1032 | rData.is() ? rData : new EmptyInputStream, |
1033 | sal_False((sal_Bool)0) /* ReplaceExisting */ ) ) ); |
1034 | aNewContent.m_xImpl->inserted(); |
1035 | |
1036 | rNewContent = aNewContent; |
1037 | return sal_True((sal_Bool)1); |
1038 | } |
1039 | |
1040 | //========================================================================= |
1041 | sal_Bool Content::transferContent( const Content& rSourceContent, |
1042 | InsertOperation eOperation, |
1043 | const rtl::OUString & rTitle, |
1044 | const sal_Int32 nNameClashAction ) |
1045 | throw( CommandAbortedException, RuntimeException, Exception ) |
1046 | { |
1047 | ContentBroker* pBroker = ContentBroker::get(); |
1048 | if ( !pBroker ) |
1049 | { |
1050 | OSL_FAIL( "Content::transferContent - No Content Broker!" )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "1050" ": "), "%s", "Content::transferContent - No Content Broker!" ); } } while (false); |
1051 | return sal_False((sal_Bool)0); |
1052 | } |
1053 | |
1054 | Reference< XCommandProcessor > xCmdProc( |
1055 | pBroker->getCommandProcessorInterface() ); |
1056 | if ( !xCmdProc.is() ) |
1057 | { |
1058 | OSL_FAIL( "Content::transferContent - No XCommandProcessor!" )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "1058" ": "), "%s", "Content::transferContent - No XCommandProcessor!" ); } } while (false); |
1059 | return sal_False((sal_Bool)0); |
1060 | } |
1061 | |
1062 | // Execute command "globalTransfer" at UCB. |
1063 | |
1064 | TransferCommandOperation eTransOp = TransferCommandOperation(); |
1065 | switch ( eOperation ) |
1066 | { |
1067 | case InsertOperation_COPY: |
1068 | eTransOp = TransferCommandOperation_COPY; |
1069 | break; |
1070 | |
1071 | case InsertOperation_MOVE: |
1072 | eTransOp = TransferCommandOperation_MOVE; |
1073 | break; |
1074 | |
1075 | case InsertOperation_LINK: |
1076 | eTransOp = TransferCommandOperation_LINK; |
1077 | break; |
1078 | |
1079 | default: |
1080 | ucbhelper::cancelCommandExecution( |
1081 | makeAny( IllegalArgumentException( |
1082 | rtl::OUString( |
1083 | "Unknown transfer operation!" ), |
1084 | get(), |
1085 | -1 ) ), |
1086 | m_xImpl->getEnvironment() ); |
1087 | // Unreachable |
1088 | } |
1089 | |
1090 | GlobalTransferCommandArgument aTransferArg( |
1091 | eTransOp, |
1092 | rSourceContent.getURL(), // SourceURL |
1093 | getURL(), // TargetFolderURL, |
1094 | rTitle, |
1095 | nNameClashAction ); |
1096 | Command aCommand; |
1097 | aCommand.Name = rtl::OUString("globalTransfer"); |
1098 | aCommand.Handle = -1; // n/a |
1099 | aCommand.Argument <<= aTransferArg; |
1100 | |
1101 | xCmdProc->execute( aCommand, 0, m_xImpl->getEnvironment() ); |
1102 | return sal_True((sal_Bool)1); |
1103 | } |
1104 | |
1105 | //========================================================================= |
1106 | sal_Bool Content::isFolder() |
1107 | throw( CommandAbortedException, RuntimeException, Exception ) |
1108 | { |
1109 | sal_Bool bFolder = sal_False((sal_Bool)0); |
1110 | if ( getPropertyValue( rtl::OUString("IsFolder") ) |
1111 | >>= bFolder ) |
1112 | return bFolder; |
1113 | |
1114 | ucbhelper::cancelCommandExecution( |
1115 | makeAny( UnknownPropertyException( |
1116 | rtl::OUString( |
1117 | "Unable to retreive value of property 'IsFolder'!" ), |
1118 | get() ) ), |
1119 | m_xImpl->getEnvironment() ); |
1120 | |
1121 | // Unreachable - cancelCommandExecution always throws an exception. |
1122 | // But some compilers complain... |
1123 | return sal_False((sal_Bool)0); |
1124 | } |
1125 | |
1126 | //========================================================================= |
1127 | sal_Bool Content::isDocument() |
1128 | throw( CommandAbortedException, RuntimeException, Exception ) |
1129 | { |
1130 | sal_Bool bDoc = sal_False((sal_Bool)0); |
1131 | if ( getPropertyValue( rtl::OUString("IsDocument") ) |
1132 | >>= bDoc ) |
1133 | return bDoc; |
1134 | |
1135 | ucbhelper::cancelCommandExecution( |
1136 | makeAny( UnknownPropertyException( |
1137 | rtl::OUString( |
1138 | "Unable to retreive value of property 'IsDocument'!" ), |
1139 | get() ) ), |
1140 | m_xImpl->getEnvironment() ); |
1141 | |
1142 | // Unreachable - cancelCommandExecution always throws an exception, |
1143 | // But some compilers complain... |
1144 | return sal_False((sal_Bool)0); |
1145 | } |
1146 | |
1147 | //========================================================================= |
1148 | //========================================================================= |
1149 | // |
1150 | // Content_Impl Implementation. |
1151 | // |
1152 | //========================================================================= |
1153 | //========================================================================= |
1154 | |
1155 | Content_Impl::Content_Impl( const Reference< XMultiServiceFactory >& rSMgr, |
1156 | const Reference< XContent >& rContent, |
1157 | const Reference< XCommandEnvironment >& rEnv ) |
1158 | : m_xSMgr( rSMgr ), |
1159 | m_xContent( rContent ), |
1160 | m_xEnv( rEnv ), |
1161 | m_nCommandId( 0 ) |
1162 | { |
1163 | if ( m_xContent.is() ) |
1164 | { |
1165 | m_xContentEventListener = new ContentEventListener_Impl( *this ); |
1166 | m_xContent->addContentEventListener( m_xContentEventListener ); |
1167 | |
1168 | #if OSL_DEBUG_LEVEL1 > 1 |
1169 | // Only done on demand in product version for performance reasons, |
1170 | // but a nice debug helper. |
1171 | getURL(); |
1172 | #endif |
1173 | } |
1174 | } |
1175 | |
1176 | //========================================================================= |
1177 | void Content_Impl::reinit( const Reference< XContent >& xContent ) |
1178 | { |
1179 | osl::MutexGuard aGuard( m_aMutex ); |
1180 | |
1181 | m_xCommandProcessor = 0; |
1182 | m_nCommandId = 0; |
1183 | |
1184 | // #92581# - Don't reset m_aURL!!! |
1185 | |
1186 | if ( m_xContent.is() ) |
1187 | { |
1188 | try |
1189 | { |
1190 | m_xContent->removeContentEventListener( m_xContentEventListener ); |
1191 | } |
1192 | catch ( RuntimeException const & ) |
1193 | { |
1194 | } |
1195 | } |
1196 | |
1197 | if ( xContent.is() ) |
1198 | { |
1199 | m_xContent = xContent; |
1200 | m_xContent->addContentEventListener( m_xContentEventListener ); |
1201 | |
1202 | #if OSL_DEBUG_LEVEL1 > 1 |
1203 | // Only done on demand in product version for performance reasons, |
1204 | // but a nice debug helper. |
1205 | getURL(); |
1206 | #endif |
1207 | } |
1208 | else |
1209 | { |
1210 | // We need m_xContent's URL in order to be able to create the |
1211 | // content object again if demanded ( --> Content_Impl::getContent() ) |
1212 | getURL(); |
1213 | |
1214 | m_xContent = 0; |
1215 | } |
1216 | } |
1217 | |
1218 | //========================================================================= |
1219 | // virtual |
1220 | Content_Impl::~Content_Impl() |
1221 | { |
1222 | if ( m_xContent.is() ) |
1223 | { |
1224 | try |
1225 | { |
1226 | m_xContent->removeContentEventListener( m_xContentEventListener ); |
1227 | } |
1228 | catch ( RuntimeException const & ) |
1229 | { |
1230 | } |
1231 | } |
1232 | } |
1233 | |
1234 | //========================================================================= |
1235 | void Content_Impl::disposing( const EventObject& Source ) |
1236 | { |
1237 | Reference<XContent> xContent; |
1238 | |
1239 | { |
1240 | osl::MutexGuard aGuard( m_aMutex ); |
1241 | if(Source.Source != m_xContent) |
1242 | return; |
1243 | |
1244 | xContent = m_xContent; |
1245 | |
1246 | m_nCommandId = 0; |
1247 | m_aURL = rtl::OUString(); |
1248 | m_xCommandProcessor = 0; |
1249 | m_xContent = 0; |
1250 | } |
1251 | |
1252 | if ( xContent.is() ) |
1253 | { |
1254 | try |
1255 | { |
1256 | xContent->removeContentEventListener( m_xContentEventListener ); |
1257 | } |
1258 | catch ( RuntimeException const & ) |
1259 | { |
1260 | } |
1261 | } |
1262 | } |
1263 | |
1264 | //========================================================================= |
1265 | const rtl::OUString& Content_Impl::getURL() const |
1266 | { |
1267 | if ( m_aURL.isEmpty() && m_xContent.is() ) |
1268 | { |
1269 | osl::MutexGuard aGuard( m_aMutex ); |
1270 | |
1271 | if ( m_aURL.isEmpty() && m_xContent.is() ) |
1272 | { |
1273 | Reference< XContentIdentifier > xId = m_xContent->getIdentifier(); |
1274 | if ( xId.is() ) |
1275 | m_aURL = xId->getContentIdentifier(); |
1276 | } |
1277 | } |
1278 | |
1279 | return m_aURL; |
1280 | } |
1281 | |
1282 | //========================================================================= |
1283 | Reference< XContent > Content_Impl::getContent() |
1284 | { |
1285 | if ( !m_xContent.is() && !m_aURL.isEmpty() ) |
1286 | { |
1287 | osl::MutexGuard aGuard( m_aMutex ); |
1288 | |
1289 | if ( !m_xContent.is() && !m_aURL.isEmpty() ) |
1290 | { |
1291 | ContentBroker* pBroker = ContentBroker::get(); |
1292 | |
1293 | OSL_ENSURE( pBroker, "No Content Broker!" )do { if (true && (!(pBroker))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "1293" ": "), "%s", "No Content Broker!"); } } while (false ); |
1294 | |
1295 | if ( pBroker ) |
1296 | { |
1297 | OSL_ENSURE( pBroker->getContentProviderManagerInterface()do { if (true && (!(pBroker->getContentProviderManagerInterface () ->queryContentProviders().getLength()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "1299" ": "), "%s", "Content Broker not configured (no providers)!" ); } } while (false) |
1298 | ->queryContentProviders().getLength(),do { if (true && (!(pBroker->getContentProviderManagerInterface () ->queryContentProviders().getLength()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "1299" ": "), "%s", "Content Broker not configured (no providers)!" ); } } while (false) |
1299 | "Content Broker not configured (no providers)!" )do { if (true && (!(pBroker->getContentProviderManagerInterface () ->queryContentProviders().getLength()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "1299" ": "), "%s", "Content Broker not configured (no providers)!" ); } } while (false); |
1300 | |
1301 | Reference< XContentIdentifierFactory > xIdFac |
1302 | = pBroker->getContentIdentifierFactoryInterface(); |
1303 | |
1304 | OSL_ENSURE( xIdFac.is(), "No Content Identifier factory!" )do { if (true && (!(xIdFac.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "1304" ": "), "%s", "No Content Identifier factory!"); } } while (false); |
1305 | |
1306 | if ( xIdFac.is() ) |
1307 | { |
1308 | Reference< XContentIdentifier > xId |
1309 | = xIdFac->createContentIdentifier( m_aURL ); |
1310 | |
1311 | OSL_ENSURE( xId.is(), "No Content Identifier!" )do { if (true && (!(xId.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "1311" ": "), "%s", "No Content Identifier!"); } } while (false); |
1312 | |
1313 | if ( xId.is() ) |
1314 | { |
1315 | Reference< XContentProvider > xProvider |
1316 | = pBroker->getContentProviderInterface(); |
1317 | |
1318 | OSL_ENSURE( xProvider.is(), "No Content Provider!" )do { if (true && (!(xProvider.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/ucbhelper/source/client/content.cxx" ":" "1318" ": "), "%s", "No Content Provider!"); } } while ( false); |
1319 | |
1320 | if ( xProvider.is() ) |
1321 | { |
1322 | try |
1323 | { |
1324 | m_xContent = xProvider->queryContent( xId ); |
1325 | } |
1326 | catch ( IllegalIdentifierException const & ) |
1327 | { |
1328 | } |
1329 | |
1330 | if ( m_xContent.is() ) |
1331 | m_xContent->addContentEventListener( |
1332 | m_xContentEventListener ); |
1333 | } |
1334 | } |
1335 | } |
1336 | } |
1337 | } |
1338 | } |
1339 | |
1340 | return m_xContent; |
1341 | } |
1342 | |
1343 | //========================================================================= |
1344 | Reference< XCommandProcessor > Content_Impl::getCommandProcessor() |
1345 | { |
1346 | if ( !m_xCommandProcessor.is() ) |
1347 | { |
1348 | osl::MutexGuard aGuard( m_aMutex ); |
1349 | |
1350 | if ( !m_xCommandProcessor.is() ) |
1351 | m_xCommandProcessor |
1352 | = Reference< XCommandProcessor >( getContent(), UNO_QUERY ); |
1353 | } |
1354 | |
1355 | return m_xCommandProcessor; |
1356 | } |
1357 | |
1358 | //========================================================================= |
1359 | sal_Int32 Content_Impl::getCommandId() |
1360 | { |
1361 | if ( m_nCommandId == 0 ) |
1362 | { |
1363 | osl::MutexGuard aGuard( m_aMutex ); |
1364 | |
1365 | if ( m_nCommandId == 0 ) |
1366 | { |
1367 | Reference< XCommandProcessor > xProc = getCommandProcessor(); |
1368 | if ( xProc.is() ) |
1369 | m_nCommandId = xProc->createCommandIdentifier(); |
1370 | } |
1371 | } |
1372 | |
1373 | return m_nCommandId; |
1374 | } |
1375 | |
1376 | //========================================================================= |
1377 | Any Content_Impl::executeCommand( const Command& rCommand ) |
1378 | { |
1379 | Reference< XCommandProcessor > xProc = getCommandProcessor(); |
1380 | if ( !xProc.is() ) |
1381 | return Any(); |
1382 | |
1383 | // Execute command |
1384 | return xProc->execute( rCommand, getCommandId(), m_xEnv ); |
1385 | } |
1386 | |
1387 | //========================================================================= |
1388 | inline const Reference< XCommandEnvironment >& |
1389 | Content_Impl::getEnvironment() const |
1390 | { |
1391 | return m_xEnv; |
1392 | } |
1393 | |
1394 | //========================================================================= |
1395 | inline void Content_Impl::setEnvironment( |
1396 | const Reference< XCommandEnvironment >& xNewEnv ) |
1397 | { |
1398 | osl::MutexGuard aGuard( m_aMutex ); |
1399 | m_xEnv = xNewEnv; |
1400 | } |
1401 | |
1402 | //========================================================================= |
1403 | void Content_Impl::inserted() |
1404 | { |
1405 | // URL might have changed during 'insert' => recalculate in next getURL() |
1406 | osl::MutexGuard aGuard( m_aMutex ); |
1407 | m_aURL = ::rtl::OUString(); |
1408 | } |
1409 | |
1410 | //========================================================================= |
1411 | //========================================================================= |
1412 | // |
1413 | // ContentEventListener_Impl Implementation. |
1414 | // |
1415 | //========================================================================= |
1416 | //========================================================================= |
1417 | |
1418 | //========================================================================= |
1419 | // |
1420 | // XInterface methods. |
1421 | // |
1422 | //========================================================================= |
1423 | |
1424 | XINTERFACE_IMPL_2( ContentEventListener_Impl,void ContentEventListener_Impl::acquire() throw() { OWeakObject ::acquire(); } void ContentEventListener_Impl::release() throw () { OWeakObject::release(); } com::sun::star::uno::Any ContentEventListener_Impl ::queryInterface( const com::sun::star::uno::Type & rType ) throw( com::sun::star::uno::RuntimeException ) { com::sun:: star::uno::Any aRet = cppu::queryInterface( rType, (static_cast < XContentEventListener* >(this)), (static_cast< XEventListener * >(this)) ); return aRet.hasValue() ? aRet : OWeakObject:: queryInterface( rType ); } |
1425 | XContentEventListener,void ContentEventListener_Impl::acquire() throw() { OWeakObject ::acquire(); } void ContentEventListener_Impl::release() throw () { OWeakObject::release(); } com::sun::star::uno::Any ContentEventListener_Impl ::queryInterface( const com::sun::star::uno::Type & rType ) throw( com::sun::star::uno::RuntimeException ) { com::sun:: star::uno::Any aRet = cppu::queryInterface( rType, (static_cast < XContentEventListener* >(this)), (static_cast< XEventListener * >(this)) ); return aRet.hasValue() ? aRet : OWeakObject:: queryInterface( rType ); } |
1426 | XEventListener )void ContentEventListener_Impl::acquire() throw() { OWeakObject ::acquire(); } void ContentEventListener_Impl::release() throw () { OWeakObject::release(); } com::sun::star::uno::Any ContentEventListener_Impl ::queryInterface( const com::sun::star::uno::Type & rType ) throw( com::sun::star::uno::RuntimeException ) { com::sun:: star::uno::Any aRet = cppu::queryInterface( rType, (static_cast < XContentEventListener* >(this)), (static_cast< XEventListener * >(this)) ); return aRet.hasValue() ? aRet : OWeakObject:: queryInterface( rType ); }; /* base of XContentEventListener */ |
1427 | |
1428 | //========================================================================= |
1429 | // |
1430 | // XContentEventListener methods. |
1431 | // |
1432 | //========================================================================= |
1433 | |
1434 | // virtual |
1435 | void SAL_CALL ContentEventListener_Impl::contentEvent( const ContentEvent& evt ) |
1436 | throw( RuntimeException ) |
1437 | { |
1438 | if ( evt.Source == m_rContent.m_xContent ) |
1439 | { |
1440 | switch ( evt.Action ) |
1441 | { |
1442 | case ContentAction::DELETED: |
1443 | m_rContent.reinit( Reference< XContent >() ); |
1444 | break; |
1445 | |
1446 | case ContentAction::EXCHANGED: |
1447 | m_rContent.reinit( evt.Content ); |
1448 | break; |
1449 | |
1450 | default: |
1451 | break; |
1452 | } |
1453 | } |
1454 | } |
1455 | |
1456 | //========================================================================= |
1457 | // |
1458 | // XEventListenr methods. |
1459 | // |
1460 | //========================================================================= |
1461 | |
1462 | // virtual |
1463 | void SAL_CALL ContentEventListener_Impl::disposing( const EventObject& Source ) |
1464 | throw( RuntimeException ) |
1465 | { |
1466 | m_rContent.disposing(Source); |
1467 | } |
1468 | |
1469 | } /* namespace ucbhelper */ |
1470 | |
1471 | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |