Line data Source code
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 : #include <limits.h>
22 : #include <com/sun/star/uno/Any.h>
23 : #include <osl/mutex.hxx>
24 : #include <osl/thread.hxx>
25 :
26 : #include <vcl/svapp.hxx>
27 : #include <vcl/settings.hxx>
28 : #include <unotools/localedatawrapper.hxx>
29 : #include <unotools/pathoptions.hxx>
30 : #include <tools/resary.hxx>
31 : #include <tools/string.hxx>
32 : #include <tools/urlobj.hxx>
33 : #include <svtools/ehdl.hxx>
34 : #include <svtools/sfxecode.hxx>
35 : #include <comphelper/processfactory.hxx>
36 : #include <ucbhelper/content.hxx>
37 : #include <com/sun/star/beans/PropertyAttribute.hpp>
38 : #include <com/sun/star/beans/PropertyValue.hpp>
39 : #include <com/sun/star/beans/XPropertyContainer.hpp>
40 : #include <com/sun/star/beans/XPropertySet.hpp>
41 : #include <com/sun/star/beans/XPropertySetInfo.hpp>
42 : #include <com/sun/star/document/XTypeDetection.hpp>
43 : #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
44 : #include <com/sun/star/frame/Desktop.hpp>
45 : #include <com/sun/star/frame/XComponentLoader.hpp>
46 : #include <com/sun/star/frame/DocumentTemplates.hpp>
47 : #include <com/sun/star/frame/XDocumentTemplates.hpp>
48 : #include <com/sun/star/io/XInputStream.hpp>
49 : #include <com/sun/star/io/XPersist.hpp>
50 : #include <com/sun/star/lang/XLocalizable.hpp>
51 : #include <com/sun/star/sdbc/XResultSet.hpp>
52 : #include <com/sun/star/sdbc/XRow.hpp>
53 : #include <com/sun/star/ucb/ContentInfo.hpp>
54 : #include <com/sun/star/ucb/InsertCommandArgument.hpp>
55 : #include <com/sun/star/ucb/NameClash.hpp>
56 : #include <com/sun/star/ucb/TransferInfo.hpp>
57 : #include <com/sun/star/ucb/XCommandProcessor.hpp>
58 : #include <com/sun/star/ucb/XContent.hpp>
59 : #include <com/sun/star/ucb/XContentAccess.hpp>
60 : #include <com/sun/star/ucb/XAnyCompareFactory.hpp>
61 : #include <com/sun/star/ucb/XAnyCompare.hpp>
62 : #include <com/sun/star/ucb/NumberedSortingInfo.hpp>
63 : #include <com/sun/star/embed/ElementModes.hpp>
64 : #include <com/sun/star/embed/XTransactedObject.hpp>
65 :
66 : #include "sfxurlrelocator.hxx"
67 :
68 : using namespace ::com::sun::star;
69 : using namespace ::com::sun::star::beans;
70 : using namespace ::com::sun::star::frame;
71 : using namespace ::com::sun::star::io;
72 : using namespace ::com::sun::star::lang;
73 : using namespace ::com::sun::star::sdbc;
74 : using namespace ::com::sun::star::uno;
75 : using namespace ::com::sun::star::ucb;
76 : using namespace ::com::sun::star::document;
77 : using namespace ::rtl;
78 : using namespace ::ucbhelper;
79 :
80 :
81 : #include <sfx2/doctempl.hxx>
82 : #include <sfx2/docfac.hxx>
83 : #include <sfx2/docfile.hxx>
84 : #include <sfx2/objsh.hxx>
85 : #include "sfxtypes.hxx"
86 : #include <sfx2/app.hxx>
87 : #include "sfx2/sfxresid.hxx"
88 : #include <sfx2/templatelocnames.hrc>
89 : #include "doc.hrc"
90 : #include <sfx2/fcontnr.hxx>
91 : #include <svtools/templatefoldercache.hxx>
92 :
93 : #include <comphelper/storagehelper.hxx>
94 : #include <unotools/ucbhelper.hxx>
95 :
96 : #include <vector>
97 : using ::std::vector;
98 : using ::std::advance;
99 :
100 : //========================================================================
101 :
102 : #define TITLE "Title"
103 : #define TARGET_URL "TargetURL"
104 :
105 : #define TARGET_DIR_URL "TargetDirURL"
106 : #define COMMAND_TRANSFER "transfer"
107 :
108 : #define SERVICENAME_DOCINFO "com.sun.star.document.DocumentProperties"
109 :
110 : //========================================================================
111 :
112 : class RegionData_Impl;
113 :
114 : namespace DocTempl {
115 :
116 0 : class DocTempl_EntryData_Impl
117 : {
118 : RegionData_Impl* mpParent;
119 :
120 : // the following member must be SfxObjectShellLock since it controlls that SfxObjectShell lifetime by design
121 : // and users of this class expect it to be so.
122 : SfxObjectShellLock mxObjShell;
123 :
124 : OUString maTitle;
125 : OUString maOwnURL;
126 : OUString maTargetURL;
127 : sal_Bool mbIsOwner : 1;
128 : sal_Bool mbDidConvert: 1;
129 :
130 : private:
131 0 : RegionData_Impl* GetParent() const { return mpParent; }
132 :
133 : public:
134 : DocTempl_EntryData_Impl( RegionData_Impl* pParent,
135 : const OUString& rTitle );
136 :
137 0 : const OUString& GetTitle() const { return maTitle; }
138 : const OUString& GetTargetURL();
139 : const OUString& GetHierarchyURL();
140 :
141 0 : void SetTitle( const OUString& rTitle ) { maTitle = rTitle; }
142 0 : void SetTargetURL( const OUString& rURL ) { maTargetURL = rURL; }
143 0 : void SetHierarchyURL( const OUString& rURL) { maOwnURL = rURL; }
144 :
145 : int Compare( const OUString& rTitle ) const;
146 :
147 : SfxObjectShellRef CreateObjectShell();
148 : sal_Bool DeleteObjectShell();
149 : };
150 :
151 : }
152 :
153 : using namespace ::DocTempl;
154 :
155 : // ------------------------------------------------------------------------
156 :
157 : class RegionData_Impl
158 : {
159 : const SfxDocTemplate_Impl* mpParent;
160 : vector< DocTempl_EntryData_Impl* > maEntries;
161 : OUString maTitle;
162 : OUString maOwnURL;
163 : OUString maTargetURL;
164 :
165 : private:
166 : size_t GetEntryPos( const OUString& rTitle,
167 : sal_Bool& rFound ) const;
168 0 : const SfxDocTemplate_Impl* GetParent() const { return mpParent; }
169 :
170 : public:
171 : RegionData_Impl( const SfxDocTemplate_Impl* pParent,
172 : const OUString& rTitle );
173 : ~RegionData_Impl();
174 :
175 0 : void SetTargetURL( const OUString& rURL ) { maTargetURL = rURL; }
176 0 : void SetHierarchyURL( const OUString& rURL) { maOwnURL = rURL; }
177 :
178 : DocTempl_EntryData_Impl* GetEntry( size_t nIndex ) const;
179 : DocTempl_EntryData_Impl* GetEntry( const OUString& rName ) const;
180 :
181 0 : const OUString& GetTitle() const { return maTitle; }
182 : const OUString& GetTargetURL();
183 : const OUString& GetHierarchyURL();
184 :
185 : size_t GetCount() const;
186 :
187 0 : void SetTitle( const OUString& rTitle ) { maTitle = rTitle; }
188 :
189 : void AddEntry( const OUString& rTitle,
190 : const OUString& rTargetURL,
191 : size_t *pPos = NULL );
192 : void DeleteEntry( size_t nIndex );
193 :
194 : int Compare( const OUString& rTitle ) const
195 : { return maTitle.compareTo( rTitle ); }
196 : int Compare( RegionData_Impl* pCompareWith ) const;
197 : };
198 :
199 : typedef vector< RegionData_Impl* > RegionList_Impl;
200 :
201 : // ------------------------------------------------------------------------
202 :
203 : class SfxDocTemplate_Impl : public SvRefBase
204 : {
205 : uno::Reference< XPersist > mxInfo;
206 : uno::Reference< XDocumentTemplates > mxTemplates;
207 :
208 : ::osl::Mutex maMutex;
209 : OUString maRootURL;
210 : OUString maStandardGroup;
211 : RegionList_Impl maRegions;
212 : sal_Bool mbConstructed;
213 :
214 : uno::Reference< XAnyCompareFactory > m_rCompareFactory;
215 :
216 : // the following member is intended to prevent clearing of the global data when it is in use
217 : // TODO/LATER: it still does not make the implementation complete thread-safe
218 : sal_Int32 mnLockCounter;
219 :
220 : private:
221 : void Clear();
222 :
223 : public:
224 : SfxDocTemplate_Impl();
225 : ~SfxDocTemplate_Impl();
226 :
227 : void IncrementLock();
228 : void DecrementLock();
229 :
230 : sal_Bool Construct( );
231 : void CreateFromHierarchy( Content &rTemplRoot );
232 : void ReInitFromComponent();
233 : void AddRegion( const OUString& rTitle,
234 : Content& rContent );
235 :
236 : void Rescan();
237 :
238 : void DeleteRegion( size_t nIndex );
239 :
240 0 : size_t GetRegionCount() const
241 0 : { return maRegions.size(); }
242 : RegionData_Impl* GetRegion( const OUString& rName ) const;
243 : RegionData_Impl* GetRegion( size_t nIndex ) const;
244 :
245 : sal_Bool GetTitleFromURL( const OUString& rURL, OUString& aTitle );
246 : sal_Bool InsertRegion( RegionData_Impl *pData, size_t nPos = size_t(-1) );
247 0 : OUString GetRootURL() const { return maRootURL; }
248 :
249 0 : uno::Reference< XDocumentTemplates > getDocTemplates() { return mxTemplates; }
250 : };
251 :
252 : // ------------------------------------------------------------------------
253 :
254 : class DocTemplLocker_Impl
255 : {
256 : SfxDocTemplate_Impl& m_aDocTempl;
257 : public:
258 4 : DocTemplLocker_Impl( SfxDocTemplate_Impl& aDocTempl )
259 4 : : m_aDocTempl( aDocTempl )
260 : {
261 4 : m_aDocTempl.IncrementLock();
262 4 : }
263 :
264 4 : ~DocTemplLocker_Impl()
265 : {
266 4 : m_aDocTempl.DecrementLock();
267 4 : }
268 : };
269 :
270 : // ------------------------------------------------------------------------
271 :
272 : #ifndef SFX_DECL_DOCTEMPLATES_DEFINED
273 : #define SFX_DECL_DOCTEMPLATES_DEFINED
274 : SV_DECL_REF(SfxDocTemplate_Impl)
275 : #endif
276 :
277 31 : SV_IMPL_REF(SfxDocTemplate_Impl)
278 :
279 : // ------------------------------------------------------------------------
280 :
281 : SfxDocTemplate_Impl *gpTemplateData = 0;
282 :
283 : // -----------------------------------------------------------------------
284 :
285 : static sal_Bool getTextProperty_Impl( Content& rContent,
286 : const OUString& rPropName,
287 : OUString& rPropValue );
288 :
289 : //========================================================================
290 :
291 0 : String SfxDocumentTemplates::GetFullRegionName
292 : (
293 : sal_uInt16 nIdx // Region Index
294 : ) const
295 :
296 : /* [Description]
297 :
298 : Returns the logical name of a region and its path
299 :
300 : [Return value] Reference to the Region name
301 :
302 : */
303 :
304 : {
305 : // First: find the RegionData for the index
306 0 : String aName;
307 :
308 0 : DocTemplLocker_Impl aLocker( *pImp );
309 :
310 0 : if ( pImp->Construct() )
311 : {
312 0 : RegionData_Impl *pData1 = pImp->GetRegion( nIdx );
313 :
314 0 : if ( pData1 )
315 0 : aName = pData1->GetTitle();
316 :
317 : // --**-- here was some code which appended the path to the
318 : // group if there was more than one with the same name.
319 : // this should not happen anymore
320 : }
321 :
322 0 : return aName;
323 : }
324 :
325 : //------------------------------------------------------------------------
326 :
327 0 : const String& SfxDocumentTemplates::GetRegionName
328 : (
329 : sal_uInt16 nIdx // Region Index
330 : ) const
331 :
332 : /* [Description]
333 :
334 : Returns the logical name of a region
335 :
336 : [Return value]
337 :
338 : const String& Reference to the Region name
339 :
340 : */
341 : {
342 0 : static String maTmpString;
343 :
344 0 : DocTemplLocker_Impl aLocker( *pImp );
345 :
346 0 : if ( pImp->Construct() )
347 : {
348 0 : RegionData_Impl *pData = pImp->GetRegion( nIdx );
349 :
350 0 : if ( pData )
351 0 : maTmpString = pData->GetTitle();
352 : else
353 0 : maTmpString.Erase();
354 : }
355 : else
356 0 : maTmpString.Erase();
357 :
358 0 : return maTmpString;
359 : }
360 :
361 : //------------------------------------------------------------------------
362 :
363 0 : sal_uInt16 SfxDocumentTemplates::GetRegionCount() const
364 :
365 : /* [Description]
366 :
367 : Returns the number of Regions
368 :
369 : [Return value]
370 :
371 : sal_uInt16 Number of Regions
372 : */
373 : {
374 0 : DocTemplLocker_Impl aLocker( *pImp );
375 :
376 0 : if ( !pImp->Construct() )
377 0 : return 0;
378 :
379 0 : sal_uIntPtr nCount = pImp->GetRegionCount();
380 :
381 0 : return (sal_uInt16) nCount;
382 : }
383 :
384 : //------------------------------------------------------------------------
385 :
386 0 : sal_Bool SfxDocumentTemplates::IsRegionLoaded( sal_uInt16 nIdx ) const
387 : {
388 0 : DocTemplLocker_Impl aLocker( *pImp );
389 :
390 0 : if ( !pImp->Construct() )
391 0 : return sal_False;
392 :
393 0 : RegionData_Impl *pData = pImp->GetRegion( nIdx );
394 :
395 0 : if ( pData )
396 0 : return sal_True;
397 : else
398 0 : return sal_False;
399 : }
400 :
401 : //------------------------------------------------------------------------
402 :
403 0 : sal_uInt16 SfxDocumentTemplates::GetCount
404 : (
405 : sal_uInt16 nRegion /* Region index whose number is
406 : to be determined */
407 :
408 : ) const
409 :
410 : /* [Description]
411 :
412 : Number of entries in Region
413 :
414 : [Return value] Number of entries
415 : */
416 :
417 : {
418 0 : DocTemplLocker_Impl aLocker( *pImp );
419 :
420 0 : if ( !pImp->Construct() )
421 0 : return 0;
422 :
423 0 : RegionData_Impl *pData = pImp->GetRegion( nRegion );
424 0 : sal_uIntPtr nCount = 0;
425 :
426 0 : if ( pData )
427 0 : nCount = pData->GetCount();
428 :
429 0 : return (sal_uInt16) nCount;
430 : }
431 :
432 : //------------------------------------------------------------------------
433 :
434 0 : const String& SfxDocumentTemplates::GetName
435 : (
436 : sal_uInt16 nRegion, // Region Index, in which the entry lies
437 : sal_uInt16 nIdx // Index of the entry
438 : ) const
439 :
440 : /* [Description]
441 :
442 : Returns the logical name of an entry in Region
443 :
444 : [Return value]
445 :
446 : const String& Entry Name
447 : */
448 :
449 : {
450 0 : DocTemplLocker_Impl aLocker( *pImp );
451 :
452 0 : static String maTmpString;
453 :
454 0 : if ( pImp->Construct() )
455 : {
456 0 : DocTempl_EntryData_Impl *pEntry = NULL;
457 0 : RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
458 :
459 0 : if ( pRegion )
460 0 : pEntry = pRegion->GetEntry( nIdx );
461 :
462 0 : if ( pEntry )
463 0 : maTmpString = pEntry->GetTitle();
464 : else
465 0 : maTmpString.Erase();
466 : }
467 : else
468 0 : maTmpString.Erase();
469 :
470 0 : return maTmpString;
471 : }
472 :
473 : //------------------------------------------------------------------------
474 :
475 0 : String SfxDocumentTemplates::GetFileName
476 : (
477 : sal_uInt16 nRegion, // Region Index, in which the entry lies
478 : sal_uInt16 nIdx // Index of the entry
479 : ) const
480 :
481 : /* [Description]
482 :
483 : Returns the file name of an entry in Region
484 :
485 : [Return value] File name of the entry
486 : */
487 : {
488 0 : DocTemplLocker_Impl aLocker( *pImp );
489 :
490 0 : if ( !pImp->Construct() )
491 0 : return String();
492 :
493 0 : DocTempl_EntryData_Impl *pEntry = NULL;
494 0 : RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
495 :
496 0 : if ( pRegion )
497 0 : pEntry = pRegion->GetEntry( nIdx );
498 :
499 0 : if ( pEntry )
500 : {
501 0 : INetURLObject aURLObj( pEntry->GetTargetURL() );
502 : return aURLObj.getName( INetURLObject::LAST_SEGMENT, true,
503 0 : INetURLObject::DECODE_WITH_CHARSET );
504 : }
505 : else
506 0 : return String();
507 : }
508 :
509 : //------------------------------------------------------------------------
510 :
511 0 : String SfxDocumentTemplates::GetPath
512 : (
513 : sal_uInt16 nRegion, // Region Index, in which the entry lies
514 : sal_uInt16 nIdx // Index of the entry
515 : ) const
516 :
517 : /* [Description]
518 :
519 : Returns the file name with full path to the file assigned to an entry
520 :
521 : [Return value]
522 :
523 : String File name with full path
524 : */
525 : {
526 0 : DocTemplLocker_Impl aLocker( *pImp );
527 :
528 0 : if ( !pImp->Construct() )
529 0 : return String();
530 :
531 0 : DocTempl_EntryData_Impl *pEntry = NULL;
532 0 : RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
533 :
534 0 : if ( pRegion )
535 0 : pEntry = pRegion->GetEntry( nIdx );
536 :
537 0 : if ( pEntry )
538 0 : return pEntry->GetTargetURL();
539 : else
540 0 : return String();
541 : }
542 :
543 : //------------------------------------------------------------------------
544 :
545 0 : ::rtl::OUString SfxDocumentTemplates::GetTemplateTargetURLFromComponent( const ::rtl::OUString& aGroupName,
546 : const ::rtl::OUString& aTitle )
547 : {
548 0 : DocTemplLocker_Impl aLocker( *pImp );
549 :
550 0 : INetURLObject aTemplateObj( pImp->GetRootURL() );
551 :
552 : aTemplateObj.insertName( aGroupName, false,
553 : INetURLObject::LAST_SEGMENT, true,
554 0 : INetURLObject::ENCODE_ALL );
555 :
556 : aTemplateObj.insertName( aTitle, false,
557 : INetURLObject::LAST_SEGMENT, true,
558 0 : INetURLObject::ENCODE_ALL );
559 :
560 :
561 0 : ::rtl::OUString aResult;
562 0 : Content aTemplate;
563 0 : uno::Reference< XCommandEnvironment > aCmdEnv;
564 0 : if ( Content::create( aTemplateObj.GetMainURL( INetURLObject::NO_DECODE ), aCmdEnv, comphelper::getProcessComponentContext(), aTemplate ) )
565 : {
566 0 : OUString aPropName( TARGET_URL );
567 0 : getTextProperty_Impl( aTemplate, aPropName, aResult );
568 0 : aResult = SvtPathOptions().SubstituteVariable( aResult );
569 : }
570 :
571 0 : return aResult;
572 : }
573 :
574 : //------------------------------------------------------------------------
575 :
576 : /** Convert a resource string - a template name - to its localised pair if it exists.
577 : @param nSourceResIds
578 : Resource ID where the list of original en-US template names begin.
579 : @param nDestResIds
580 : Resource ID where the list of localised template names begin.
581 : @param nCount
582 : The number of names that have been localised.
583 : @param rString
584 : Name to be translated.
585 : @return
586 : The localised pair of rString or rString if the former does not exist.
587 : */
588 0 : OUString SfxDocumentTemplates::ConvertResourceString (
589 : int nSourceResIds, int nDestResIds, int nCount, const OUString& rString )
590 : {
591 0 : for( int i = 0; i < nCount; ++i )
592 : {
593 0 : if( rString == SFX2_RESSTR(nSourceResIds + i))
594 0 : return SFX2_RESSTR(nDestResIds + i);
595 : }
596 0 : return rString;
597 : }
598 :
599 : //------------------------------------------------------------------------
600 :
601 0 : sal_Bool SfxDocumentTemplates::CopyOrMove
602 : (
603 : sal_uInt16 nTargetRegion, // Target Region Index
604 : sal_uInt16 nTargetIdx, // Target position Index
605 : sal_uInt16 nSourceRegion, // Source Region Index
606 : sal_uInt16 nSourceIdx, /* Index to be copied / to moved template */
607 : sal_Bool bMove // Copy / Move
608 : )
609 :
610 : /* [Description]
611 :
612 : Copy or move a document template
613 :
614 : [Return value]
615 :
616 : sal_Bool sal_True, Action could be performed
617 : sal_False, Action could not be performed
618 :
619 : [Cross-references]
620 :
621 : <SfxDocumentTemplates::Move(sal_uInt16,sal_uInt16,sal_uInt16,sal_uInt16)>
622 : <SfxDocumentTemplates::Copy(sal_uInt16,sal_uInt16,sal_uInt16,sal_uInt16)>
623 : */
624 :
625 : {
626 : /* to perform a copy or move, we need to send a transfer command to
627 : the destination folder with the URL of the source as parameter.
628 : ( If the destination content doesn't support the transfer command,
629 : we could try a copy ( and delete ) instead. )
630 : We need two transfers ( one for the real template and one for its
631 : representation in the hierarchy )
632 : ...
633 : */
634 :
635 0 : DocTemplLocker_Impl aLocker( *pImp );
636 :
637 0 : if ( !pImp->Construct() )
638 0 : return sal_False;
639 :
640 : // Don't copy or move any folders
641 0 : if( nSourceIdx == USHRT_MAX )
642 0 : return sal_False ;
643 :
644 0 : if ( nSourceRegion == nTargetRegion )
645 : {
646 : SAL_WARN( "sfx2.doc", "Don't know, what to do!" );
647 0 : return sal_False;
648 : }
649 :
650 0 : RegionData_Impl *pSourceRgn = pImp->GetRegion( nSourceRegion );
651 0 : if ( !pSourceRgn )
652 0 : return sal_False;
653 :
654 0 : DocTempl_EntryData_Impl *pSource = pSourceRgn->GetEntry( nSourceIdx );
655 0 : if ( !pSource )
656 0 : return sal_False;
657 :
658 0 : RegionData_Impl *pTargetRgn = pImp->GetRegion( nTargetRegion );
659 0 : if ( !pTargetRgn )
660 0 : return sal_False;
661 :
662 0 : OUString aTitle = pSource->GetTitle();
663 :
664 0 : uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
665 :
666 0 : if ( xTemplates->addTemplate( pTargetRgn->GetTitle(),
667 : aTitle,
668 0 : pSource->GetTargetURL() ) )
669 : {
670 :
671 0 : INetURLObject aSourceObj( pSource->GetTargetURL() );
672 :
673 0 : ::rtl::OUString aNewTargetURL = GetTemplateTargetURLFromComponent( pTargetRgn->GetTitle(), aTitle );
674 0 : if ( aNewTargetURL.isEmpty() )
675 0 : return sal_False;
676 :
677 0 : if ( bMove )
678 : {
679 : // --**-- delete the original file
680 0 : sal_Bool bDeleted = xTemplates->removeTemplate( pSourceRgn->GetTitle(),
681 0 : pSource->GetTitle() );
682 0 : if ( bDeleted )
683 0 : pSourceRgn->DeleteEntry( nSourceIdx );
684 : else
685 : {
686 0 : if ( xTemplates->removeTemplate( pTargetRgn->GetTitle(), aTitle ) )
687 0 : return sal_False; // will trigger tetry with copy instead of move
688 :
689 : // if it is not possible to remove just created template ( must be possible! )
690 : // it is better to report success here, since at least the copy has succeeded
691 : // TODO/LATER: solve it more gracefully in future
692 : }
693 : }
694 :
695 : // todo: fix SfxDocumentTemplates to handle size_t instead of sal_uInt16
696 0 : size_t temp_nTargetIdx = nTargetIdx;
697 0 : pTargetRgn->AddEntry( aTitle, aNewTargetURL, &temp_nTargetIdx );
698 :
699 0 : return sal_True;
700 : }
701 :
702 : // --**-- if the current file is opened,
703 : // it must be re-opened afterwards.
704 :
705 0 : return sal_False;
706 : }
707 :
708 : //------------------------------------------------------------------------
709 :
710 0 : sal_Bool SfxDocumentTemplates::Move
711 : (
712 : sal_uInt16 nTargetRegion, // Target Region Index
713 : sal_uInt16 nTargetIdx, // Target position Index
714 : sal_uInt16 nSourceRegion, // Source Region Index
715 : sal_uInt16 nSourceIdx /* Index to be copied / to moved template */
716 : )
717 :
718 : /* [Description]
719 :
720 : Moving a template
721 :
722 : [Return value]
723 :
724 : sal_Bool sal_True, Action could be performed
725 : sal_False, Action could not be performed
726 :
727 : [Cross-references]
728 :
729 : <SfxDocumentTemplates::CopyOrMove(sal_uInt16,sal_uInt16,sal_uInt16,sal_uInt16,sal_Bool)>
730 : */
731 : {
732 0 : DocTemplLocker_Impl aLocker( *pImp );
733 :
734 : return CopyOrMove( nTargetRegion, nTargetIdx,
735 0 : nSourceRegion, nSourceIdx, sal_True );
736 : }
737 :
738 : //------------------------------------------------------------------------
739 :
740 0 : sal_Bool SfxDocumentTemplates::Copy
741 : (
742 : sal_uInt16 nTargetRegion, // Target Region Index
743 : sal_uInt16 nTargetIdx, // Target position Index
744 : sal_uInt16 nSourceRegion, // Source Region Index
745 : sal_uInt16 nSourceIdx /* Index to be copied / to moved template */
746 : )
747 :
748 : /* [Description]
749 :
750 : Copying a template
751 :
752 : [Return value]
753 :
754 : sal_Bool sal_True, Action could be performed
755 : sal_False, Action could not be performed
756 :
757 : [Cross-references]
758 :
759 : <SfxDocumentTemplates::CopyOrMove(sal_uInt16,sal_uInt16,sal_uInt16,sal_uInt16,sal_Bool)>
760 : */
761 :
762 : {
763 0 : DocTemplLocker_Impl aLocker( *pImp );
764 :
765 : return CopyOrMove( nTargetRegion, nTargetIdx,
766 0 : nSourceRegion, nSourceIdx, sal_False );
767 : }
768 :
769 : //------------------------------------------------------------------------
770 :
771 0 : sal_Bool SfxDocumentTemplates::CopyTo
772 : (
773 : sal_uInt16 nRegion, // Region of the template to be exported
774 : sal_uInt16 nIdx, // Index of the template to be exported
775 : const String& rName /* File name under which the template is to
776 : be created */
777 : ) const
778 :
779 : /* [Description]
780 :
781 : Exporting a template into the file system
782 :
783 : [Return value]
784 :
785 : sal_Bool sal_True, Action could be performed
786 : sal_False, Action could not be performed
787 :
788 : [Cross-references]
789 :
790 : <SfxDocumentTemplates::CopyFrom(sal_uInt16,sal_uInt16,String&)>
791 : */
792 :
793 : {
794 0 : DocTemplLocker_Impl aLocker( *pImp );
795 :
796 0 : if ( ! pImp->Construct() )
797 0 : return sal_False;
798 :
799 0 : RegionData_Impl *pSourceRgn = pImp->GetRegion( nRegion );
800 0 : if ( !pSourceRgn )
801 0 : return sal_False;
802 :
803 0 : DocTempl_EntryData_Impl *pSource = pSourceRgn->GetEntry( nIdx );
804 0 : if ( !pSource )
805 0 : return sal_False;
806 :
807 0 : INetURLObject aTargetURL( rName );
808 :
809 : OUString aTitle( aTargetURL.getName( INetURLObject::LAST_SEGMENT, true,
810 0 : INetURLObject::DECODE_WITH_CHARSET ) );
811 0 : aTargetURL.removeSegment();
812 :
813 0 : OUString aParentURL = aTargetURL.GetMainURL( INetURLObject::NO_DECODE );
814 :
815 0 : uno::Reference< XCommandEnvironment > aCmdEnv;
816 0 : Content aTarget;
817 :
818 : try
819 : {
820 0 : aTarget = Content( aParentURL, aCmdEnv, comphelper::getProcessComponentContext() );
821 :
822 0 : TransferInfo aTransferInfo;
823 0 : aTransferInfo.MoveData = sal_False;
824 0 : aTransferInfo.SourceURL = pSource->GetTargetURL();
825 0 : aTransferInfo.NewTitle = aTitle;
826 0 : aTransferInfo.NameClash = NameClash::OVERWRITE;
827 :
828 0 : Any aArg = makeAny( aTransferInfo );
829 0 : OUString aCmd( COMMAND_TRANSFER );
830 :
831 0 : aTarget.executeCommand( aCmd, aArg );
832 : }
833 0 : catch ( ContentCreationException& )
834 0 : { return sal_False; }
835 0 : catch ( Exception& )
836 0 : { return sal_False; }
837 :
838 0 : return sal_True;
839 : }
840 :
841 : //------------------------------------------------------------------------
842 :
843 0 : sal_Bool SfxDocumentTemplates::CopyFrom
844 : (
845 : sal_uInt16 nRegion, /* Region in which the template is to be
846 : imported */
847 : sal_uInt16 nIdx, // Index of the new template in this Region
848 : String& rName /* File name of the template to be imported
849 : as an out parameter of the (automatically
850 : generated from the file name) logical name
851 : of the template */
852 : )
853 :
854 : /* [Description]
855 :
856 : Import a template from the file system
857 :
858 : [Return value] Sucess (sal_True) or serfpTargetDirectory->GetContent());
859 :
860 : sal_Bool sal_True, Action could be performed
861 : sal_False, Action could not be performed
862 :
863 : [Cross-references]
864 :
865 : <SfxDocumentTemplates::CopyTo(sal_uInt16,sal_uInt16,const String&)>
866 : */
867 :
868 : {
869 0 : DocTemplLocker_Impl aLocker( *pImp );
870 :
871 0 : if ( ! pImp->Construct() )
872 0 : return sal_False;
873 :
874 0 : RegionData_Impl *pTargetRgn = pImp->GetRegion( nRegion );
875 :
876 0 : if ( !pTargetRgn )
877 0 : return sal_False;
878 :
879 0 : uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
880 0 : if ( !xTemplates.is() )
881 0 : return sal_False;
882 :
883 0 : OUString aTitle;
884 0 : sal_Bool bTemplateAdded = sal_False;
885 :
886 0 : if( pImp->GetTitleFromURL( rName, aTitle ) )
887 : {
888 0 : bTemplateAdded = xTemplates->addTemplate( pTargetRgn->GetTitle(), aTitle, rName );
889 : }
890 : else
891 : {
892 0 : uno::Reference< XDesktop2 > xDesktop = Desktop::create( ::comphelper::getProcessComponentContext() );;
893 :
894 0 : Sequence< PropertyValue > aArgs( 1 );
895 0 : aArgs[0].Name = ::rtl::OUString("Hidden");
896 0 : aArgs[0].Value <<= sal_True;
897 :
898 0 : INetURLObject aTemplURL( rName );
899 0 : uno::Reference< XDocumentPropertiesSupplier > xDocPropsSupplier;
900 0 : uno::Reference< XStorable > xStorable;
901 : try
902 : {
903 : xStorable = uno::Reference< XStorable >(
904 0 : xDesktop->loadComponentFromURL( aTemplURL.GetMainURL(INetURLObject::NO_DECODE),
905 : OUString("_blank"),
906 : 0,
907 0 : aArgs ),
908 0 : UNO_QUERY );
909 :
910 : xDocPropsSupplier = uno::Reference< XDocumentPropertiesSupplier >(
911 0 : xStorable, UNO_QUERY );
912 : }
913 0 : catch( Exception& )
914 : {
915 : }
916 :
917 0 : if( xStorable.is() )
918 : {
919 : // get Title from XDocumentPropertiesSupplier
920 0 : if( xDocPropsSupplier.is() )
921 : {
922 : uno::Reference< XDocumentProperties > xDocProps
923 0 : = xDocPropsSupplier->getDocumentProperties();
924 0 : if (xDocProps.is() ) {
925 0 : aTitle = xDocProps->getTitle();
926 0 : }
927 : }
928 :
929 0 : if( aTitle.isEmpty() )
930 : {
931 0 : INetURLObject aURL( aTemplURL );
932 0 : aURL.CutExtension();
933 : aTitle = aURL.getName( INetURLObject::LAST_SEGMENT, true,
934 0 : INetURLObject::DECODE_WITH_CHARSET );
935 : }
936 :
937 : // write a template using XStorable interface
938 0 : bTemplateAdded = xTemplates->storeTemplate( pTargetRgn->GetTitle(), aTitle, xStorable );
939 0 : }
940 : }
941 :
942 :
943 0 : if( bTemplateAdded )
944 : {
945 0 : INetURLObject aTemplObj( pTargetRgn->GetHierarchyURL() );
946 : aTemplObj.insertName( aTitle, false,
947 : INetURLObject::LAST_SEGMENT, true,
948 0 : INetURLObject::ENCODE_ALL );
949 0 : OUString aTemplURL = aTemplObj.GetMainURL( INetURLObject::NO_DECODE );
950 :
951 0 : uno::Reference< XCommandEnvironment > aCmdEnv;
952 0 : Content aTemplCont;
953 :
954 0 : if( Content::create( aTemplURL, aCmdEnv, comphelper::getProcessComponentContext(), aTemplCont ) )
955 : {
956 0 : OUString aTemplName;
957 0 : OUString aPropName( TARGET_URL );
958 :
959 0 : if( getTextProperty_Impl( aTemplCont, aPropName, aTemplName ) )
960 : {
961 0 : if ( nIdx == USHRT_MAX )
962 0 : nIdx = 0;
963 : else
964 0 : nIdx += 1;
965 :
966 : // todo: fix SfxDocumentTemplates to handle size_t instead of sal_uInt16
967 0 : size_t temp_nIdx = nIdx;
968 0 : pTargetRgn->AddEntry( aTitle, aTemplName, &temp_nIdx );
969 0 : rName = aTitle;
970 0 : return sal_True;
971 : }
972 : else
973 : {
974 : DBG_ASSERT( sal_False, "CopyFrom(): The content should contain target URL!" );
975 0 : }
976 : }
977 : else
978 : {
979 : DBG_ASSERT( sal_False, "CopyFrom(): The content just was created!" );
980 0 : }
981 : }
982 :
983 0 : return sal_False;
984 : }
985 :
986 : //------------------------------------------------------------------------
987 :
988 0 : sal_Bool SfxDocumentTemplates::Delete
989 : (
990 : sal_uInt16 nRegion, // Region Index
991 : sal_uInt16 nIdx /* Index of the entry or USHRT_MAX,
992 : if a directory is meant. */
993 : )
994 :
995 : /* [Description]
996 :
997 : Deleting an entry or a directory
998 :
999 : [Return value]
1000 :
1001 : sal_Bool sal_True, Action could be performed
1002 : sal_False, Action could not be performed
1003 :
1004 : [Cross-references]
1005 :
1006 : <SfxDocumentTemplates::InsertDir(const String&,sal_uInt16)>
1007 : <SfxDocumentTemplates::KillDir(SfxTemplateDir&)>
1008 : */
1009 :
1010 : {
1011 0 : DocTemplLocker_Impl aLocker( *pImp );
1012 :
1013 : /* delete the template or folder in the hierarchy and in the
1014 : template folder by sending a delete command to the content.
1015 : Then remove the data from the lists
1016 : */
1017 0 : if ( ! pImp->Construct() )
1018 0 : return sal_False;
1019 :
1020 0 : RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
1021 :
1022 0 : if ( !pRegion )
1023 0 : return sal_False;
1024 :
1025 : sal_Bool bRet;
1026 0 : uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
1027 :
1028 0 : if ( nIdx == USHRT_MAX )
1029 : {
1030 0 : bRet = xTemplates->removeGroup( pRegion->GetTitle() );
1031 0 : if ( bRet )
1032 0 : pImp->DeleteRegion( nRegion );
1033 : }
1034 : else
1035 : {
1036 0 : DocTempl_EntryData_Impl *pEntry = pRegion->GetEntry( nIdx );
1037 :
1038 0 : if ( !pEntry )
1039 0 : return sal_False;
1040 :
1041 0 : bRet = xTemplates->removeTemplate( pRegion->GetTitle(),
1042 0 : pEntry->GetTitle() );
1043 0 : if( bRet )
1044 0 : pRegion->DeleteEntry( nIdx );
1045 : }
1046 :
1047 0 : return bRet;
1048 : }
1049 :
1050 : //------------------------------------------------------------------------
1051 :
1052 0 : sal_Bool SfxDocumentTemplates::InsertDir
1053 : (
1054 : const String& rText, // the logical name of the new Region
1055 : sal_uInt16 nRegion // Region Index
1056 : )
1057 :
1058 : /* [Description]
1059 :
1060 : Insert an index
1061 :
1062 : [Return value]
1063 :
1064 : sal_Bool sal_True, Action could be performed
1065 : sal_False, Action could not be performed
1066 :
1067 : [Cross-references]
1068 :
1069 : <SfxDocumentTemplates::KillDir(SfxTemplateDir&)>
1070 : */
1071 : {
1072 0 : DocTemplLocker_Impl aLocker( *pImp );
1073 :
1074 0 : if ( ! pImp->Construct() )
1075 0 : return sal_False;
1076 :
1077 0 : RegionData_Impl *pRegion = pImp->GetRegion( rText );
1078 :
1079 0 : if ( pRegion )
1080 0 : return sal_False;
1081 :
1082 0 : uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
1083 :
1084 0 : if ( xTemplates->addGroup( rText ) )
1085 : {
1086 0 : RegionData_Impl* pNewRegion = new RegionData_Impl( pImp, rText );
1087 :
1088 0 : if ( ! pImp->InsertRegion( pNewRegion, nRegion ) )
1089 : {
1090 0 : delete pNewRegion;
1091 0 : return sal_False;
1092 : }
1093 0 : return sal_True;
1094 : }
1095 :
1096 0 : return sal_False;
1097 : }
1098 :
1099 : //------------------------------------------------------------------------
1100 :
1101 0 : sal_Bool SfxDocumentTemplates::SetName
1102 : (
1103 : const String& rName, // Der zu setzende Name
1104 : sal_uInt16 nRegion, // Region Index
1105 : sal_uInt16 nIdx /* Index of the entry oder USHRT_MAX,
1106 : if a directory is meant. */
1107 : )
1108 :
1109 : /* [Description]
1110 :
1111 : Change the name of an entry or a directory
1112 :
1113 : [Return value]
1114 :
1115 : sal_Bool sal_True, Action could be performed
1116 : sal_False, Action could not be performed
1117 :
1118 : */
1119 :
1120 : {
1121 0 : DocTemplLocker_Impl aLocker( *pImp );
1122 :
1123 0 : if ( ! pImp->Construct() )
1124 0 : return sal_False;
1125 :
1126 0 : RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
1127 0 : DocTempl_EntryData_Impl *pEntry = NULL;
1128 :
1129 0 : if ( !pRegion )
1130 0 : return sal_False;
1131 :
1132 0 : uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
1133 0 : OUString aEmpty;
1134 :
1135 0 : if ( nIdx == USHRT_MAX )
1136 : {
1137 0 : if ( pRegion->GetTitle() == OUString( rName ) )
1138 0 : return sal_True;
1139 :
1140 : // we have to rename a region
1141 0 : if ( xTemplates->renameGroup( pRegion->GetTitle(), rName ) )
1142 : {
1143 0 : pRegion->SetTitle( rName );
1144 0 : pRegion->SetTargetURL( aEmpty );
1145 0 : pRegion->SetHierarchyURL( aEmpty );
1146 0 : return sal_True;
1147 : }
1148 : }
1149 : else
1150 : {
1151 0 : pEntry = pRegion->GetEntry( nIdx );
1152 :
1153 0 : if ( !pEntry )
1154 0 : return sal_False;
1155 :
1156 0 : if ( pEntry->GetTitle() == OUString( rName ) )
1157 0 : return sal_True;
1158 :
1159 0 : if ( xTemplates->renameTemplate( pRegion->GetTitle(),
1160 0 : pEntry->GetTitle(),
1161 0 : rName ) )
1162 : {
1163 0 : pEntry->SetTitle( rName );
1164 0 : pEntry->SetTargetURL( aEmpty );
1165 0 : pEntry->SetHierarchyURL( aEmpty );
1166 0 : return sal_True;
1167 : }
1168 : }
1169 :
1170 0 : return sal_False;
1171 : }
1172 :
1173 : //------------------------------------------------------------------------
1174 :
1175 0 : sal_Bool SfxDocumentTemplates::Rescan()
1176 :
1177 : /* [Description]
1178 :
1179 : Comparison of administrative data with the current state on disk.
1180 : The logical name for which no file exists, will be removed from the
1181 : administrative structure. Files for which no record exists will be included.
1182 :
1183 : [Return value]
1184 :
1185 : sal_Bool sal_True, Action could be performed
1186 : sal_False, Action could not be performed
1187 :
1188 : [Cross-references]
1189 :
1190 : <SfxTemplateDir::Scan(sal_Bool bDirectory, sal_Bool bSave)>
1191 : <SfxTemplateDir::Freshen(const SfxTemplateDir &rNew)>
1192 : */
1193 : {
1194 0 : if ( !pImp->Construct() )
1195 0 : return sal_False;
1196 :
1197 0 : pImp->Rescan();
1198 :
1199 0 : return sal_True;
1200 : }
1201 :
1202 : //------------------------------------------------------------------------
1203 :
1204 0 : SfxObjectShellRef SfxDocumentTemplates::CreateObjectShell
1205 : (
1206 : sal_uInt16 nRegion, // Region Index
1207 : sal_uInt16 nIdx // Index of the entry
1208 : )
1209 :
1210 : /* [Description]
1211 :
1212 : Access to the document shell of an entry
1213 :
1214 : [Return value]
1215 :
1216 : SfxObjectShellRef Referece to the ObjectShell
1217 :
1218 : [Cross-references]
1219 :
1220 : <SfxTemplateDirEntry::CreateObjectShell()>
1221 : <SfxDocumentTemplates::DeleteObjectShell(sal_uInt16, sal_uInt16)>
1222 : */
1223 :
1224 : {
1225 0 : DocTemplLocker_Impl aLocker( *pImp );
1226 :
1227 0 : if ( !pImp->Construct() )
1228 0 : return NULL;
1229 :
1230 0 : RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
1231 0 : DocTempl_EntryData_Impl *pEntry = NULL;
1232 :
1233 0 : if ( pRegion )
1234 0 : pEntry = pRegion->GetEntry( nIdx );
1235 :
1236 0 : if ( pEntry )
1237 0 : return pEntry->CreateObjectShell();
1238 : else
1239 0 : return NULL;
1240 : }
1241 :
1242 : //------------------------------------------------------------------------
1243 :
1244 0 : sal_Bool SfxDocumentTemplates::DeleteObjectShell
1245 : (
1246 : sal_uInt16 nRegion, // Region Index
1247 : sal_uInt16 nIdx // Index of the entry
1248 : )
1249 :
1250 : /* [Description]
1251 :
1252 : Releasing the ObjectShell of an entry
1253 :
1254 : [Return value]
1255 :
1256 : sal_Bool sal_True, Action could be performed
1257 : sal_False, Action could not be performed
1258 :
1259 : [Cross-references]
1260 :
1261 : <SfxTemplateDirEntry::DeleteObjectShell()>
1262 : <SfxDocumentTemplates::CreateObjectShell(sal_uInt16, sal_uInt16)>
1263 : */
1264 :
1265 : {
1266 0 : DocTemplLocker_Impl aLocker( *pImp );
1267 :
1268 0 : if ( ! pImp->Construct() )
1269 0 : return sal_True;
1270 :
1271 0 : RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
1272 0 : DocTempl_EntryData_Impl *pEntry = NULL;
1273 :
1274 0 : if ( pRegion )
1275 0 : pEntry = pRegion->GetEntry( nIdx );
1276 :
1277 0 : if ( pEntry )
1278 0 : return pEntry->DeleteObjectShell();
1279 : else
1280 0 : return sal_True;
1281 : }
1282 :
1283 : //------------------------------------------------------------------------
1284 :
1285 4 : sal_Bool SfxDocumentTemplates::GetFull
1286 : (
1287 : const String &rRegion, // Region Name
1288 : const String &rName, // Template Name
1289 : String &rPath // Out: Path + File name
1290 : )
1291 :
1292 : /* [Description]
1293 :
1294 : Returns Path + File name of the template specified by rRegion and rName.
1295 :
1296 : [Return value]
1297 :
1298 : sal_Bool sal_True, Action could be performed
1299 : sal_False, Action could not be performed
1300 :
1301 : [Cross-references]
1302 :
1303 : <SfxDocumentTemplates::GetLogicNames(const String&,String&,String&)>
1304 : */
1305 :
1306 : {
1307 4 : DocTemplLocker_Impl aLocker( *pImp );
1308 :
1309 : // We don't search for empty names!
1310 4 : if ( ! rName.Len() )
1311 0 : return sal_False;
1312 :
1313 4 : if ( ! pImp->Construct() )
1314 4 : return sal_False;
1315 :
1316 0 : DocTempl_EntryData_Impl* pEntry = NULL;
1317 0 : const sal_uInt16 nCount = GetRegionCount();
1318 :
1319 0 : for ( sal_uInt16 i = 0; i < nCount; ++i )
1320 : {
1321 0 : RegionData_Impl *pRegion = pImp->GetRegion( i );
1322 :
1323 0 : if( pRegion &&
1324 0 : ( !rRegion.Len() || ( rRegion == String( pRegion->GetTitle() ) ) ) )
1325 : {
1326 0 : pEntry = pRegion->GetEntry( rName );
1327 :
1328 0 : if ( pEntry )
1329 : {
1330 0 : rPath = pEntry->GetTargetURL();
1331 0 : break;
1332 : }
1333 : }
1334 : }
1335 :
1336 0 : return ( pEntry != NULL );
1337 : }
1338 :
1339 : //------------------------------------------------------------------------
1340 :
1341 0 : sal_Bool SfxDocumentTemplates::GetLogicNames
1342 : (
1343 : const String &rPath, // Full Path to the template
1344 : String &rRegion, // Out: Region name
1345 : String &rName // Out: Template name
1346 : ) const
1347 :
1348 : /* [Description]
1349 :
1350 : Returns and logical path name to the template specified by rPath
1351 :
1352 : [Return value]
1353 :
1354 : sal_Bool sal_True, Action could be performed
1355 : sal_False, Action could not be performed
1356 :
1357 : [Cross-references]
1358 :
1359 : <SfxDocumentTemplates::GetFull(const String&,const String&,DirEntry&)>
1360 : */
1361 :
1362 : {
1363 0 : DocTemplLocker_Impl aLocker( *pImp );
1364 :
1365 0 : if ( ! pImp->Construct() )
1366 0 : return sal_False;
1367 :
1368 0 : INetURLObject aFullPath;
1369 :
1370 0 : aFullPath.SetSmartProtocol( INET_PROT_FILE );
1371 0 : aFullPath.SetURL( rPath );
1372 0 : OUString aPath( aFullPath.GetMainURL( INetURLObject::NO_DECODE ) );
1373 :
1374 0 : RegionData_Impl *pData = NULL;
1375 0 : DocTempl_EntryData_Impl *pEntry = NULL;
1376 0 : sal_Bool bFound = sal_False;
1377 :
1378 0 : sal_uIntPtr nCount = GetRegionCount();
1379 :
1380 0 : for ( sal_uIntPtr i=0; !bFound && (i<nCount); i++ )
1381 : {
1382 0 : pData = pImp->GetRegion( i );
1383 0 : if ( pData )
1384 : {
1385 0 : sal_uIntPtr nChildCount = pData->GetCount();
1386 :
1387 0 : for ( sal_uIntPtr j=0; !bFound && (j<nChildCount); j++ )
1388 : {
1389 0 : pEntry = pData->GetEntry( j );
1390 0 : if ( pEntry->GetTargetURL() == aPath )
1391 : {
1392 0 : bFound = sal_True;
1393 : }
1394 : }
1395 : }
1396 : }
1397 :
1398 0 : if ( bFound )
1399 : {
1400 0 : rRegion = pData->GetTitle();
1401 0 : rName = pEntry->GetTitle();
1402 : }
1403 :
1404 0 : return bFound;
1405 : }
1406 :
1407 : //------------------------------------------------------------------------
1408 :
1409 4 : SfxDocumentTemplates::SfxDocumentTemplates()
1410 :
1411 : /* [Description]
1412 :
1413 : Constructor
1414 : */
1415 : {
1416 4 : if ( !gpTemplateData )
1417 4 : gpTemplateData = new SfxDocTemplate_Impl;
1418 :
1419 4 : pImp = gpTemplateData;
1420 4 : }
1421 :
1422 : //-------------------------------------------------------------------------
1423 :
1424 3 : void SfxDocumentTemplates::Construct()
1425 :
1426 : // Delayed build-up of administrative data
1427 :
1428 : {
1429 3 : }
1430 :
1431 : //------------------------------------------------------------------------
1432 :
1433 6 : SfxDocumentTemplates::~SfxDocumentTemplates()
1434 :
1435 : /* [Description]
1436 :
1437 : Destructor
1438 : Release of administrative data
1439 : */
1440 :
1441 : {
1442 3 : pImp = NULL;
1443 3 : }
1444 :
1445 0 : void SfxDocumentTemplates::Update( sal_Bool _bSmart )
1446 : {
1447 0 : if ( !_bSmart // don't be smart
1448 0 : || ::svt::TemplateFolderCache( sal_True ).needsUpdate() // update is really necessary
1449 : )
1450 : {
1451 0 : if ( pImp->Construct() )
1452 0 : pImp->Rescan();
1453 : }
1454 0 : }
1455 :
1456 0 : void SfxDocumentTemplates::ReInitFromComponent()
1457 : {
1458 0 : pImp->ReInitFromComponent();
1459 0 : }
1460 :
1461 :
1462 0 : sal_Bool SfxDocumentTemplates::HasUserContents( sal_uInt16 nRegion, sal_uInt16 nIdx ) const
1463 : {
1464 0 : DocTemplLocker_Impl aLocker( *pImp );
1465 :
1466 0 : sal_Bool bResult = sal_False;
1467 :
1468 0 : RegionData_Impl* pRegion = pImp->GetRegion( nRegion );
1469 :
1470 0 : if ( pRegion )
1471 : {
1472 0 : ::rtl::OUString aRegionTargetURL = pRegion->GetTargetURL();
1473 0 : if ( !aRegionTargetURL.isEmpty() )
1474 : {
1475 0 : sal_uInt16 nLen = 0;
1476 0 : sal_uInt16 nStartInd = 0;
1477 :
1478 0 : if( nIdx == USHRT_MAX )
1479 : {
1480 : // this is a folder
1481 : // check whether there is at least one editable template
1482 0 : nLen = ( sal_uInt16 )pRegion->GetCount();
1483 0 : nStartInd = 0;
1484 0 : if ( nLen == 0 )
1485 0 : bResult = sal_True; // the writing part of empty folder with writing URL can be removed
1486 : }
1487 : else
1488 : {
1489 : // this is a template
1490 : // check whether the template is inserted by user
1491 0 : nLen = 1;
1492 0 : nStartInd = nIdx;
1493 : }
1494 :
1495 0 : for ( sal_uInt16 nInd = nStartInd; nInd < nStartInd + nLen; nInd++ )
1496 : {
1497 0 : DocTempl_EntryData_Impl* pEntryData = pRegion->GetEntry( nInd );
1498 0 : if ( pEntryData )
1499 : {
1500 0 : ::rtl::OUString aEntryTargetURL = pEntryData->GetTargetURL();
1501 0 : if ( !aEntryTargetURL.isEmpty()
1502 0 : && ::utl::UCBContentHelper::IsSubPath( aRegionTargetURL, aEntryTargetURL ) )
1503 : {
1504 0 : bResult = sal_True;
1505 : break;
1506 0 : }
1507 : }
1508 : }
1509 0 : }
1510 : }
1511 :
1512 0 : return bResult;
1513 : }
1514 :
1515 : // -----------------------------------------------------------------------
1516 0 : DocTempl_EntryData_Impl::DocTempl_EntryData_Impl( RegionData_Impl* pParent,
1517 0 : const OUString& rTitle )
1518 : {
1519 0 : mpParent = pParent;
1520 : maTitle = SfxDocumentTemplates::ConvertResourceString(
1521 0 : STR_TEMPLATE_NAME1_DEF, STR_TEMPLATE_NAME1, NUM_TEMPLATE_NAMES, rTitle );
1522 0 : mbIsOwner = sal_False;
1523 0 : mbDidConvert= sal_False;
1524 0 : }
1525 :
1526 : // -----------------------------------------------------------------------
1527 0 : int DocTempl_EntryData_Impl::Compare( const OUString& rTitle ) const
1528 : {
1529 0 : return maTitle.compareTo( rTitle );
1530 : }
1531 :
1532 : // -----------------------------------------------------------------------
1533 0 : SfxObjectShellRef DocTempl_EntryData_Impl::CreateObjectShell()
1534 : {
1535 0 : if( ! mxObjShell.Is() )
1536 : {
1537 0 : mbIsOwner = sal_False;
1538 0 : sal_Bool bDum = sal_False;
1539 0 : SfxApplication *pSfxApp = SFX_APP();
1540 0 : String aTargetURL = GetTargetURL();
1541 :
1542 0 : mxObjShell = pSfxApp->DocAlreadyLoaded( aTargetURL, sal_True, bDum );
1543 :
1544 0 : if( ! mxObjShell.Is() )
1545 : {
1546 0 : mbIsOwner = sal_True;
1547 : SfxMedium *pMed=new SfxMedium(
1548 0 : aTargetURL,(STREAM_STD_READWRITE | STREAM_SHARE_DENYALL) );
1549 0 : const SfxFilter* pFilter = NULL;
1550 0 : pMed->UseInteractionHandler(sal_True);
1551 0 : if( pSfxApp->GetFilterMatcher().GuessFilter(
1552 0 : *pMed, &pFilter, SFX_FILTER_TEMPLATE, 0 ) ||
1553 0 : (pFilter && !pFilter->IsOwnFormat()) ||
1554 0 : (pFilter && !pFilter->UsesStorage()) )
1555 : {
1556 : SfxErrorContext aEc( ERRCTX_SFX_LOADTEMPLATE,
1557 0 : aTargetURL );
1558 0 : delete pMed;
1559 0 : mbDidConvert=sal_True;
1560 : sal_uIntPtr lErr;
1561 0 : if ( mxObjShell.Is() ) {
1562 0 : lErr = pSfxApp->LoadTemplate( mxObjShell,aTargetURL);
1563 0 : if( lErr != ERRCODE_NONE )
1564 0 : ErrorHandler::HandleError(lErr);
1565 0 : }
1566 :
1567 : }
1568 0 : else if (pFilter)
1569 : {
1570 0 : mbDidConvert=sal_False;
1571 0 : mxObjShell = SfxObjectShell::CreateObject( pFilter->GetServiceName(), SFX_CREATE_MODE_ORGANIZER );
1572 0 : if ( mxObjShell.Is() )
1573 : {
1574 0 : mxObjShell->DoInitNew(0);
1575 : // TODO/LATER: make sure that we don't use binary templates!
1576 0 : if( mxObjShell->LoadFrom( *pMed ) )
1577 : {
1578 0 : mxObjShell->DoSaveCompleted( pMed );
1579 : }
1580 : else
1581 0 : mxObjShell.Clear();
1582 : }
1583 : }
1584 0 : }
1585 : }
1586 :
1587 0 : return (SfxObjectShellRef)(SfxObjectShell*) mxObjShell;
1588 : }
1589 :
1590 : //------------------------------------------------------------------------
1591 0 : sal_Bool DocTempl_EntryData_Impl::DeleteObjectShell()
1592 : {
1593 0 : sal_Bool bRet = sal_True;
1594 :
1595 0 : if ( mxObjShell.Is() )
1596 : {
1597 0 : if( mxObjShell->IsModified() )
1598 : {
1599 : // Here we also save, if the Template is being processed ...
1600 0 : bRet = sal_False;
1601 :
1602 0 : if ( mbIsOwner )
1603 : {
1604 0 : if( mbDidConvert )
1605 : {
1606 : bRet=mxObjShell->PreDoSaveAs_Impl(
1607 0 : GetTargetURL(),
1608 0 : mxObjShell->GetFactory().GetFilterContainer()->GetAnyFilter( SFX_FILTER_EXPORT | SFX_FILTER_IMPORT, SFX_FILTER_INTERNAL )->GetFilterName(), 0 );
1609 : }
1610 : else
1611 : {
1612 0 : if( mxObjShell->Save() )
1613 : {
1614 0 : uno::Reference< embed::XTransactedObject > xTransacted( mxObjShell->GetStorage(), uno::UNO_QUERY );
1615 : DBG_ASSERT( xTransacted.is(), "Storage must implement XTransactedObject!\n" );
1616 0 : if ( xTransacted.is() )
1617 : {
1618 : try
1619 : {
1620 0 : xTransacted->commit();
1621 0 : bRet = sal_True;
1622 : }
1623 0 : catch( uno::Exception& )
1624 : {
1625 : }
1626 0 : }
1627 : }
1628 : }
1629 : }
1630 : }
1631 :
1632 0 : if( bRet )
1633 : {
1634 0 : mxObjShell.Clear();
1635 : }
1636 : }
1637 0 : return bRet;
1638 : }
1639 :
1640 : // -----------------------------------------------------------------------
1641 0 : const OUString& DocTempl_EntryData_Impl::GetHierarchyURL()
1642 : {
1643 0 : if ( maOwnURL.isEmpty() )
1644 : {
1645 0 : INetURLObject aTemplateObj( GetParent()->GetHierarchyURL() );
1646 :
1647 0 : aTemplateObj.insertName( GetTitle(), false,
1648 : INetURLObject::LAST_SEGMENT, true,
1649 0 : INetURLObject::ENCODE_ALL );
1650 :
1651 0 : maOwnURL = aTemplateObj.GetMainURL( INetURLObject::NO_DECODE );
1652 0 : DBG_ASSERT( !maOwnURL.isEmpty(), "GetHierarchyURL(): Could not create URL!" );
1653 : }
1654 :
1655 0 : return maOwnURL;
1656 : }
1657 :
1658 : // -----------------------------------------------------------------------
1659 0 : const OUString& DocTempl_EntryData_Impl::GetTargetURL()
1660 : {
1661 0 : if ( maTargetURL.isEmpty() )
1662 : {
1663 0 : uno::Reference< XCommandEnvironment > aCmdEnv;
1664 0 : Content aRegion;
1665 :
1666 0 : if ( Content::create( GetHierarchyURL(), aCmdEnv, comphelper::getProcessComponentContext(), aRegion ) )
1667 : {
1668 0 : OUString aPropName( TARGET_URL );
1669 :
1670 0 : getTextProperty_Impl( aRegion, aPropName, maTargetURL );
1671 : }
1672 : else
1673 : {
1674 : SAL_WARN( "sfx2.doc", "GetTargetURL(): Could not create hierarchy content!" );
1675 0 : }
1676 : }
1677 :
1678 0 : return maTargetURL;
1679 : }
1680 :
1681 : // -----------------------------------------------------------------------
1682 0 : RegionData_Impl::RegionData_Impl( const SfxDocTemplate_Impl* pParent,
1683 0 : const OUString& rTitle )
1684 : {
1685 0 : maTitle = rTitle;
1686 0 : mpParent = pParent;
1687 0 : }
1688 :
1689 : // -----------------------------------------------------------------------
1690 0 : RegionData_Impl::~RegionData_Impl()
1691 : {
1692 0 : for ( size_t i = 0, n = maEntries.size(); i < n; ++i )
1693 0 : delete maEntries[ i ];
1694 0 : maEntries.clear();
1695 0 : }
1696 :
1697 : // -----------------------------------------------------------------------
1698 0 : size_t RegionData_Impl::GetEntryPos( const OUString& rTitle, sal_Bool& rFound ) const
1699 : {
1700 : #if 1 // Don't use binary search today
1701 : size_t i;
1702 0 : size_t nCount = maEntries.size();
1703 :
1704 0 : for ( i=0; i<nCount; i++ )
1705 : {
1706 0 : DocTempl_EntryData_Impl *pData = maEntries[ i ];
1707 :
1708 0 : if ( pData->Compare( rTitle ) == 0 )
1709 : {
1710 0 : rFound = sal_True;
1711 0 : return i;
1712 : }
1713 : }
1714 :
1715 0 : rFound = sal_False;
1716 0 : return i;
1717 :
1718 : #else
1719 : // use binary search to find the correct position
1720 : // in the maEntries list
1721 :
1722 : int nCompVal = 1;
1723 : size_t nStart = 0;
1724 : size_t nEnd = maEntries.size() - 1;
1725 : size_t nMid;
1726 :
1727 : DocTempl_EntryData_Impl* pMid;
1728 :
1729 : rFound = sal_False;
1730 :
1731 : while ( nCompVal && ( nStart <= nEnd ) )
1732 : {
1733 : nMid = ( nEnd - nStart ) / 2 + nStart;
1734 : pMid = maEntries[ nMid ];
1735 :
1736 : nCompVal = pMid->Compare( rTitle );
1737 :
1738 : if ( nCompVal < 0 ) // pMid < pData
1739 : nStart = nMid + 1;
1740 : else
1741 : nEnd = nMid - 1;
1742 : }
1743 :
1744 : if ( nCompVal == 0 )
1745 : {
1746 : rFound = sal_True;
1747 : }
1748 : else
1749 : {
1750 : if ( nCompVal < 0 ) // pMid < pData
1751 : nMid++;
1752 : }
1753 :
1754 : return nMid;
1755 : #endif
1756 : }
1757 :
1758 : // -----------------------------------------------------------------------
1759 0 : void RegionData_Impl::AddEntry( const OUString& rTitle,
1760 : const OUString& rTargetURL,
1761 : size_t *pPos )
1762 : {
1763 0 : INetURLObject aLinkObj( GetHierarchyURL() );
1764 : aLinkObj.insertName( rTitle, false,
1765 : INetURLObject::LAST_SEGMENT, true,
1766 0 : INetURLObject::ENCODE_ALL );
1767 0 : OUString aLinkURL = aLinkObj.GetMainURL( INetURLObject::NO_DECODE );
1768 :
1769 : DocTempl_EntryData_Impl* pEntry;
1770 0 : sal_Bool bFound = sal_False;
1771 0 : size_t nPos = GetEntryPos( rTitle, bFound );
1772 :
1773 0 : if ( bFound )
1774 : {
1775 0 : pEntry = maEntries[ nPos ];
1776 : }
1777 : else
1778 : {
1779 0 : if ( pPos )
1780 0 : nPos = *pPos;
1781 :
1782 0 : pEntry = new DocTempl_EntryData_Impl( this, rTitle );
1783 0 : pEntry->SetTargetURL( rTargetURL );
1784 0 : pEntry->SetHierarchyURL( aLinkURL );
1785 0 : if ( nPos < maEntries.size() ) {
1786 0 : vector< DocTempl_EntryData_Impl* >::iterator it = maEntries.begin();
1787 0 : advance( it, nPos );
1788 0 : maEntries.insert( it, pEntry );
1789 : }
1790 : else
1791 0 : maEntries.push_back( pEntry );
1792 0 : }
1793 0 : }
1794 :
1795 : // -----------------------------------------------------------------------
1796 0 : size_t RegionData_Impl::GetCount() const
1797 : {
1798 0 : return maEntries.size();
1799 : }
1800 :
1801 : // -----------------------------------------------------------------------
1802 0 : const OUString& RegionData_Impl::GetHierarchyURL()
1803 : {
1804 0 : if ( maOwnURL.isEmpty() )
1805 : {
1806 0 : INetURLObject aRegionObj( GetParent()->GetRootURL() );
1807 :
1808 0 : aRegionObj.insertName( GetTitle(), false,
1809 : INetURLObject::LAST_SEGMENT, true,
1810 0 : INetURLObject::ENCODE_ALL );
1811 :
1812 0 : maOwnURL = aRegionObj.GetMainURL( INetURLObject::NO_DECODE );
1813 0 : DBG_ASSERT( !maOwnURL.isEmpty(), "GetHierarchyURL(): Could not create URL!" );
1814 : }
1815 :
1816 0 : return maOwnURL;
1817 : }
1818 :
1819 : // -----------------------------------------------------------------------
1820 0 : const OUString& RegionData_Impl::GetTargetURL()
1821 : {
1822 0 : if ( maTargetURL.isEmpty() )
1823 : {
1824 0 : uno::Reference< XCommandEnvironment > aCmdEnv;
1825 0 : Content aRegion;
1826 :
1827 0 : if ( Content::create( GetHierarchyURL(), aCmdEnv, comphelper::getProcessComponentContext(), aRegion ) )
1828 : {
1829 0 : OUString aPropName( TARGET_DIR_URL );
1830 :
1831 0 : getTextProperty_Impl( aRegion, aPropName, maTargetURL );
1832 : // The targeturl must be substituted: $(baseinsturl) (#i32656#)
1833 0 : maTargetURL = SvtPathOptions().SubstituteVariable( maTargetURL );
1834 : }
1835 : else
1836 : {
1837 : SAL_WARN( "sfx2.doc", "GetTargetURL(): Could not create hierarchy content!" );
1838 0 : }
1839 : }
1840 :
1841 0 : return maTargetURL;
1842 : }
1843 :
1844 : // -----------------------------------------------------------------------
1845 0 : DocTempl_EntryData_Impl* RegionData_Impl::GetEntry( const OUString& rName ) const
1846 : {
1847 0 : sal_Bool bFound = sal_False;
1848 0 : long nPos = GetEntryPos( rName, bFound );
1849 :
1850 0 : if ( bFound )
1851 0 : return maEntries[ nPos ];
1852 : else
1853 0 : return NULL;
1854 : }
1855 :
1856 : // -----------------------------------------------------------------------
1857 0 : DocTempl_EntryData_Impl* RegionData_Impl::GetEntry( size_t nIndex ) const
1858 : {
1859 0 : if ( nIndex < maEntries.size() )
1860 0 : return maEntries[ nIndex ];
1861 0 : return NULL;
1862 : }
1863 :
1864 : // -----------------------------------------------------------------------
1865 0 : void RegionData_Impl::DeleteEntry( size_t nIndex )
1866 : {
1867 0 : if ( nIndex < maEntries.size() )
1868 : {
1869 0 : delete maEntries[ nIndex ];
1870 0 : vector< DocTempl_EntryData_Impl*>::iterator it = maEntries.begin();
1871 0 : advance( it, nIndex );
1872 0 : maEntries.erase( it );
1873 : }
1874 0 : }
1875 :
1876 : // -----------------------------------------------------------------------
1877 0 : int RegionData_Impl::Compare( RegionData_Impl* pCompare ) const
1878 : {
1879 0 : int nCompare = maTitle.compareTo( pCompare->maTitle );
1880 :
1881 0 : return nCompare;
1882 : }
1883 :
1884 : // -----------------------------------------------------------------------
1885 :
1886 4 : SfxDocTemplate_Impl::SfxDocTemplate_Impl()
1887 : : mbConstructed( sal_False )
1888 4 : , mnLockCounter( 0 )
1889 : {
1890 4 : }
1891 :
1892 : // -----------------------------------------------------------------------
1893 9 : SfxDocTemplate_Impl::~SfxDocTemplate_Impl()
1894 : {
1895 3 : Clear();
1896 :
1897 3 : gpTemplateData = NULL;
1898 6 : }
1899 :
1900 : // -----------------------------------------------------------------------
1901 4 : void SfxDocTemplate_Impl::IncrementLock()
1902 : {
1903 4 : ::osl::MutexGuard aGuard( maMutex );
1904 4 : mnLockCounter++;
1905 4 : }
1906 :
1907 : // -----------------------------------------------------------------------
1908 4 : void SfxDocTemplate_Impl::DecrementLock()
1909 : {
1910 4 : ::osl::MutexGuard aGuard( maMutex );
1911 4 : if ( mnLockCounter )
1912 4 : mnLockCounter--;
1913 4 : }
1914 :
1915 : // -----------------------------------------------------------------------
1916 0 : RegionData_Impl* SfxDocTemplate_Impl::GetRegion( size_t nIndex ) const
1917 : {
1918 0 : if ( nIndex < maRegions.size() )
1919 0 : return maRegions[ nIndex ];
1920 0 : return NULL;
1921 : }
1922 :
1923 : // -----------------------------------------------------------------------
1924 0 : RegionData_Impl* SfxDocTemplate_Impl::GetRegion( const OUString& rName )
1925 : const
1926 : {
1927 0 : for ( size_t i = 0, n = maRegions.size(); i < n; ++i )
1928 : {
1929 0 : RegionData_Impl* pData = maRegions[ i ];
1930 0 : if( pData->GetTitle() == rName )
1931 0 : return pData;
1932 : }
1933 0 : return NULL;
1934 : }
1935 :
1936 : // -----------------------------------------------------------------------
1937 0 : void SfxDocTemplate_Impl::DeleteRegion( size_t nIndex )
1938 : {
1939 0 : if ( nIndex < maRegions.size() )
1940 : {
1941 0 : delete maRegions[ nIndex ];
1942 0 : RegionList_Impl::iterator it = maRegions.begin();
1943 0 : advance( it, nIndex );
1944 0 : maRegions.erase( it );
1945 : }
1946 0 : }
1947 :
1948 : // -----------------------------------------------------------------------
1949 : /* AddRegion adds a Region to the RegionList
1950 : */
1951 0 : void SfxDocTemplate_Impl::AddRegion( const OUString& rTitle,
1952 : Content& rContent )
1953 : {
1954 : RegionData_Impl* pRegion;
1955 0 : pRegion = new RegionData_Impl( this, rTitle );
1956 :
1957 0 : if ( ! InsertRegion( pRegion ) )
1958 : {
1959 0 : delete pRegion;
1960 0 : return;
1961 : }
1962 :
1963 : // now get the content of the region
1964 0 : uno::Reference< XResultSet > xResultSet;
1965 0 : Sequence< OUString > aProps(2);
1966 0 : aProps[0] = OUString(TITLE );
1967 0 : aProps[1] = OUString(TARGET_URL );
1968 :
1969 : try
1970 : {
1971 0 : ResultSetInclude eInclude = INCLUDE_DOCUMENTS_ONLY;
1972 0 : Sequence< NumberedSortingInfo > aSortingInfo(1);
1973 0 : aSortingInfo.getArray()->ColumnIndex = 1;
1974 0 : aSortingInfo.getArray()->Ascending = sal_True;
1975 0 : xResultSet = rContent.createSortedCursor( aProps, aSortingInfo, m_rCompareFactory, eInclude );
1976 : }
1977 0 : catch ( Exception& ) {}
1978 :
1979 0 : if ( xResultSet.is() )
1980 : {
1981 0 : uno::Reference< XContentAccess > xContentAccess( xResultSet, UNO_QUERY );
1982 0 : uno::Reference< XRow > xRow( xResultSet, UNO_QUERY );
1983 :
1984 : try
1985 : {
1986 0 : while ( xResultSet->next() )
1987 : {
1988 0 : OUString aTitle( xRow->getString( 1 ) );
1989 0 : OUString aTargetDir( xRow->getString( 2 ) );
1990 :
1991 0 : pRegion->AddEntry( aTitle, aTargetDir );
1992 0 : }
1993 : }
1994 0 : catch ( Exception& ) {}
1995 0 : }
1996 : }
1997 :
1998 : // -----------------------------------------------------------------------
1999 0 : void SfxDocTemplate_Impl::CreateFromHierarchy( Content &rTemplRoot )
2000 : {
2001 0 : uno::Reference< XResultSet > xResultSet;
2002 0 : Sequence< OUString > aProps(1);
2003 0 : aProps[0] = OUString(TITLE );
2004 :
2005 : try
2006 : {
2007 0 : ResultSetInclude eInclude = INCLUDE_FOLDERS_ONLY;
2008 0 : Sequence< NumberedSortingInfo > aSortingInfo(1);
2009 0 : aSortingInfo.getArray()->ColumnIndex = 1;
2010 0 : aSortingInfo.getArray()->Ascending = sal_True;
2011 0 : xResultSet = rTemplRoot.createSortedCursor( aProps, aSortingInfo, m_rCompareFactory, eInclude );
2012 : }
2013 0 : catch ( Exception& ) {}
2014 :
2015 0 : if ( xResultSet.is() )
2016 : {
2017 0 : uno::Reference< XCommandEnvironment > aCmdEnv;
2018 0 : uno::Reference< XContentAccess > xContentAccess( xResultSet, UNO_QUERY );
2019 0 : uno::Reference< XRow > xRow( xResultSet, UNO_QUERY );
2020 :
2021 : try
2022 : {
2023 0 : while ( xResultSet->next() )
2024 : {
2025 0 : OUString aTitle( xRow->getString( 1 ) );
2026 :
2027 0 : OUString aId = xContentAccess->queryContentIdentifierString();
2028 0 : Content aContent = Content( aId, aCmdEnv, comphelper::getProcessComponentContext() );
2029 :
2030 0 : AddRegion( aTitle, aContent );
2031 0 : }
2032 : }
2033 0 : catch ( Exception& ) {}
2034 0 : }
2035 0 : }
2036 :
2037 : // ------------------------------------------------------------------------
2038 4 : sal_Bool SfxDocTemplate_Impl::Construct( )
2039 : {
2040 4 : ::osl::MutexGuard aGuard( maMutex );
2041 :
2042 4 : if ( mbConstructed )
2043 0 : return sal_True;
2044 :
2045 4 : uno::Reference< XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory();
2046 4 : uno::Reference< XComponentContext > xContext = ::comphelper::getProcessComponentContext();
2047 :
2048 4 : OUString aService( SERVICENAME_DOCINFO );
2049 4 : uno::Reference< XPersist > xInfo( xFactory->createInstance( aService ), UNO_QUERY );
2050 4 : mxInfo = xInfo;
2051 :
2052 4 : mxTemplates = frame::DocumentTemplates::create(xContext);
2053 :
2054 4 : uno::Reference< XLocalizable > xLocalizable( mxTemplates, UNO_QUERY );
2055 :
2056 4 : Sequence< Any > aCompareArg(1);
2057 4 : *(aCompareArg.getArray()) <<= xLocalizable->getLocale();
2058 : m_rCompareFactory = uno::Reference< XAnyCompareFactory >(
2059 4 : xFactory->createInstanceWithArguments( OUString("com.sun.star.ucb.AnyCompareFactory"),
2060 4 : aCompareArg ),
2061 4 : UNO_QUERY );
2062 :
2063 4 : uno::Reference < XContent > aRootContent = mxTemplates->getContent();
2064 4 : uno::Reference < XCommandEnvironment > aCmdEnv;
2065 :
2066 4 : if ( ! aRootContent.is() )
2067 4 : return sal_False;
2068 :
2069 0 : mbConstructed = sal_True;
2070 0 : maRootURL = aRootContent->getIdentifier()->getContentIdentifier();
2071 :
2072 0 : ResStringArray aLongNames( SfxResId( TEMPLATE_LONG_NAMES_ARY ) );
2073 :
2074 0 : if ( aLongNames.Count() )
2075 0 : maStandardGroup = aLongNames.GetString( 0 );
2076 :
2077 0 : Content aTemplRoot( aRootContent, aCmdEnv, comphelper::getProcessComponentContext() );
2078 0 : CreateFromHierarchy( aTemplRoot );
2079 :
2080 0 : return sal_True;
2081 : }
2082 :
2083 : // -----------------------------------------------------------------------
2084 0 : void SfxDocTemplate_Impl::ReInitFromComponent()
2085 : {
2086 0 : uno::Reference< XDocumentTemplates > xTemplates = getDocTemplates();
2087 0 : if ( xTemplates.is() )
2088 : {
2089 0 : uno::Reference < XContent > aRootContent = xTemplates->getContent();
2090 0 : uno::Reference < XCommandEnvironment > aCmdEnv;
2091 0 : Content aTemplRoot( aRootContent, aCmdEnv, comphelper::getProcessComponentContext() );
2092 0 : Clear();
2093 0 : CreateFromHierarchy( aTemplRoot );
2094 0 : }
2095 0 : }
2096 :
2097 : // -----------------------------------------------------------------------
2098 0 : sal_Bool SfxDocTemplate_Impl::InsertRegion( RegionData_Impl *pNew, size_t nPos )
2099 : {
2100 0 : ::osl::MutexGuard aGuard( maMutex );
2101 :
2102 : // return false (not inserted) if the entry already exists
2103 0 : for ( size_t i = 0, n = maRegions.size(); i < n; ++i )
2104 0 : if ( maRegions[ i ]->Compare( pNew ) == 0 )
2105 0 : return sal_False;
2106 :
2107 0 : size_t newPos = nPos;
2108 0 : if ( pNew->GetTitle() == maStandardGroup )
2109 0 : newPos = 0;
2110 :
2111 0 : if ( newPos < maRegions.size() )
2112 : {
2113 0 : RegionList_Impl::iterator it = maRegions.begin();
2114 0 : advance( it, newPos );
2115 0 : maRegions.insert( it, pNew );
2116 : }
2117 : else
2118 0 : maRegions.push_back( pNew );
2119 :
2120 0 : return sal_True;
2121 : }
2122 :
2123 : // -----------------------------------------------------------------------
2124 0 : void SfxDocTemplate_Impl::Rescan()
2125 : {
2126 0 : Clear();
2127 :
2128 : try
2129 : {
2130 0 : uno::Reference< XDocumentTemplates > xTemplates = getDocTemplates();
2131 : DBG_ASSERT( xTemplates.is(), "SfxDocTemplate_Impl::Rescan:invalid template instance!" );
2132 0 : if ( xTemplates.is() )
2133 : {
2134 0 : xTemplates->update();
2135 :
2136 0 : uno::Reference < XContent > aRootContent = xTemplates->getContent();
2137 0 : uno::Reference < XCommandEnvironment > aCmdEnv;
2138 :
2139 0 : Content aTemplRoot( aRootContent, aCmdEnv, comphelper::getProcessComponentContext() );
2140 0 : CreateFromHierarchy( aTemplRoot );
2141 0 : }
2142 : }
2143 0 : catch( const Exception& )
2144 : {
2145 : SAL_WARN( "sfx2.doc", "SfxDocTemplate_Impl::Rescan: caught an exception while doing the update!" );
2146 : }
2147 0 : }
2148 :
2149 : // -----------------------------------------------------------------------
2150 0 : sal_Bool SfxDocTemplate_Impl::GetTitleFromURL( const OUString& rURL,
2151 : OUString& aTitle )
2152 : {
2153 0 : if ( mxInfo.is() )
2154 : {
2155 : try
2156 : {
2157 0 : mxInfo->read( rURL );
2158 : }
2159 0 : catch ( Exception& )
2160 : {
2161 : // the document is not a StarOffice document
2162 0 : return sal_False;
2163 : }
2164 :
2165 :
2166 : try
2167 : {
2168 0 : uno::Reference< XPropertySet > aPropSet( mxInfo, UNO_QUERY );
2169 0 : if ( aPropSet.is() )
2170 : {
2171 0 : OUString aPropName( TITLE );
2172 0 : Any aValue = aPropSet->getPropertyValue( aPropName );
2173 0 : aValue >>= aTitle;
2174 0 : }
2175 : }
2176 0 : catch ( IOException& ) {}
2177 0 : catch ( UnknownPropertyException& ) {}
2178 0 : catch ( Exception& ) {}
2179 : }
2180 :
2181 0 : if ( aTitle.isEmpty() )
2182 : {
2183 0 : INetURLObject aURL( rURL );
2184 0 : aURL.CutExtension();
2185 : aTitle = aURL.getName( INetURLObject::LAST_SEGMENT, true,
2186 0 : INetURLObject::DECODE_WITH_CHARSET );
2187 : }
2188 :
2189 0 : return sal_True;
2190 : }
2191 :
2192 :
2193 : // -----------------------------------------------------------------------
2194 3 : void SfxDocTemplate_Impl::Clear()
2195 : {
2196 3 : ::osl::MutexGuard aGuard( maMutex );
2197 3 : if ( mnLockCounter )
2198 3 : return;
2199 :
2200 3 : for ( size_t i = 0, n = maRegions.size(); i < n; ++i )
2201 0 : delete maRegions[ i ];
2202 3 : maRegions.clear();
2203 : }
2204 :
2205 : // -----------------------------------------------------------------------
2206 0 : sal_Bool getTextProperty_Impl( Content& rContent,
2207 : const OUString& rPropName,
2208 : OUString& rPropValue )
2209 : {
2210 0 : sal_Bool bGotProperty = sal_False;
2211 :
2212 : // Get the property
2213 : try
2214 : {
2215 0 : uno::Reference< XPropertySetInfo > aPropInfo = rContent.getProperties();
2216 :
2217 : // check, whether or not the property exists
2218 0 : if ( !aPropInfo.is() || !aPropInfo->hasPropertyByName( rPropName ) )
2219 : {
2220 0 : return sal_False;
2221 : }
2222 :
2223 : // now get the property
2224 0 : Any aAnyValue;
2225 :
2226 0 : aAnyValue = rContent.getPropertyValue( rPropName );
2227 0 : aAnyValue >>= rPropValue;
2228 :
2229 0 : if ( SfxURLRelocator_Impl::propertyCanContainOfficeDir( rPropName ) )
2230 : {
2231 0 : SfxURLRelocator_Impl aRelocImpl( ::comphelper::getProcessServiceFactory() );
2232 0 : aRelocImpl.makeAbsoluteURL( rPropValue );
2233 : }
2234 :
2235 0 : bGotProperty = sal_True;
2236 : }
2237 0 : catch ( RuntimeException& ) {}
2238 0 : catch ( Exception& ) {}
2239 :
2240 0 : return bGotProperty;
2241 : }
2242 :
2243 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|