22#include <osl/file.hxx>
25#include <com/sun/star/sdbc/XResultSet.hpp>
26#include <com/sun/star/ucb/XDynamicResultSet.hpp>
27#include <com/sun/star/sdbc/XRow.hpp>
28#include <com/sun/star/ucb/CommandAbortedException.hpp>
29#include <com/sun/star/ucb/XContentAccess.hpp>
30#include <com/sun/star/uno/XComponentContext.hpp>
31#include <com/sun/star/util/theOfficeInstallationDirectories.hpp>
33#include <osl/diagnose.h>
54 using namespace ::
utl;
82 sal_uInt16 hundredthSeconds;
100 struct TemplateContent;
122 void implResetDate( )
129 virtual ~TemplateContent()
override;
136 void setModDate(
const util::DateTime& _rDate ) {
m_aLastModified = _rDate; }
143 TemplateFolderContent::size_type
146 void push_back( const ::rtl::Reference< TemplateContent >& _rxNewElement )
160 TemplateContent::~TemplateContent()
170 struct TemplateContentURLLess
172 bool operator() ( const ::rtl::Reference< TemplateContent >& _rxLHS, const ::rtl::Reference< TemplateContent >& _rxRHS )
const
174 return _rxLHS->getURL() < _rxRHS->getURL();
180 struct SubContentSort
188 TemplateContentURLLess()
199 void operator() ( const ::rtl::Reference< TemplateContent >& _rxContent )
const
201 if ( _rxContent.is() && _rxContent->size() )
203 operator()( _rxContent->getSubContents() );
210 struct TemplateContentEqual
213 bool operator() (const ::rtl::Reference< TemplateContent >& _rLHS, const ::rtl::Reference< TemplateContent >& _rRHS )
215 if ( !_rLHS.is() || !_rRHS.is() )
217 OSL_FAIL(
"TemplateContentEqual::operator(): invalid contents!" );
222 if ( _rLHS->getURL() != _rRHS->getURL() )
225 if ( _rLHS->getModDate() != _rRHS->getModDate() )
228 if ( _rLHS->getSubContents().size() != _rRHS->getSubContents().size() )
231 if ( !_rLHS->getSubContents().empty() )
234 ::std::pair< FolderIterator, FolderIterator > aFirstDifferent = ::std::mismatch(
235 _rLHS->getSubContents().begin(),
236 _rLHS->getSubContents().end(),
237 _rRHS->getSubContents().begin(),
240 if ( aFirstDifferent.first != _rLHS->getSubContents().end() )
258 struct StoreContentURL :
public StorageHelper
262 StoreContentURL(
SvStream& _rStorage,
264 util::XOfficeInstallationDirectories > xOfficeInstDirs )
267 void operator() ( const ::rtl::Reference< TemplateContent >& _rxContent )
const
270 OUString sURL = _rxContent->getURL();
280 struct StoreFolderContent :
public StorageHelper
285 StoreFolderContent(
SvStream& _rStorage,
287 util::XOfficeInstallationDirectories > xOfficeInstDirs )
291 void operator() (
const TemplateContent& _rContent )
const
301 _rContent.getSubContents().begin(),
302 _rContent.getSubContents().end(),
307 _rContent.getSubContents().begin(),
308 _rContent.getSubContents().end(),
314 void operator() ( const ::rtl::Reference< TemplateContent >& _rxContent )
const
316 if ( _rxContent.is() )
318 operator()( *_rxContent );
325 struct ReadFolderContent :
public StorageHelper
329 ReadFolderContent(
SvStream& _rStorage,
331 util::XOfficeInstallationDirectories > xOfficeInstDirs )
335 void operator() ( TemplateContent& _rContent )
const
338 util::DateTime aModDate;
340 _rContent.setModDate( aModDate );
344 sal_Int32 nChildren = 0;
347 rChildren.resize( 0 );
348 rChildren.reserve( nChildren );
350 while ( nChildren-- )
354 rChildren.push_back(
new TemplateContent(
INetURLObject( sURL ) ) );
359 _rContent.getSubContents().begin(),
360 _rContent.getSubContents().end(),
366 void operator() ( const ::rtl::Reference< TemplateContent >& _rxContent )
const
368 if ( _rxContent.is() )
370 operator()( *_rxContent );
403 bool openCacheStream(
bool _bForRead );
404 void closeCacheStream( );
407 bool readPreviousState();
409 bool readCurrentState();
411 static OUString implParseSmart(
const OUString& _rPath );
413 bool implReadFolder( const ::rtl::Reference< TemplateContent >& _rxRoot );
415 static sal_Int32 getMagicNumber();
422 const uno::Reference< util::XOfficeInstallationDirectories >& getOfficeInstDirs();
426 TemplateFolderCacheImpl::TemplateFolderCacheImpl(
bool _bAutoStoreState )
427 :m_bNeedsUpdate ( true )
428 ,m_bKnowState ( false )
429 ,m_bValidCurrentState ( false )
430 ,m_bAutoStoreState ( _bAutoStoreState )
456 SubContentSort()( _rState );
462 if ( _rLHS.size() != _rRHS.size() )
468 ::std::pair< ConstFolderIterator, ConstFolderIterator > aFirstDifferent = ::std::mismatch(
472 TemplateContentEqual()
475 return aFirstDifferent.first == _rLHS.end();
513 if ( INetProtocol::NotValid == aParser.
GetProtocol() )
516 osl::FileBase::getFileURLFromSystemPath( _rPath, sURL );
545 if ( xDynResultSet.is() )
546 xResultSet = xDynResultSet->getStaticResultSet();
548 catch( CommandAbortedException& )
553 catch( css::uno::Exception& )
558 if ( xResultSet.is() )
563 while ( xResultSet->next() )
565 INetURLObject aSubContentURL( xContentAccess->queryContentIdentifierString() );
571 xChild->setModDate( xRow->getTimestamp( 2 ) );
572 if ( xRow->wasNull() )
573 xChild->setModDate( xRow->getTimestamp( 3 ) );
576 _rxRoot->push_back( xChild );
579 if ( xRow->getBoolean( 4 ) && !xRow->wasNull() )
612 OUString sTemplatePath( aDirs.getToken(0,
';',
nIndex) );
613 sTemplatePath = aPathOptions.
ExpandMacros( sTemplatePath );
660 sal_Int32 nRootDirectories = 0;
664 while ( nRootDirectories-- )
681 DBG_ASSERT( !
m_pCacheStream->GetErrorCode(),
"TemplateFolderCacheImpl::readPreviousState: unknown error during reading the state cache!" );
698 if ( INetProtocol::NotValid == aStorageURL.
GetProtocol() )
700 OSL_FAIL(
"TemplateFolderCacheImpl::openCacheStream: invalid storage path!" );
705 aStorageURL.
Append(
u".templdir.cache" );
709 _bForRead ? StreamMode::READ | StreamMode::NOCREATE : StreamMode::WRITE | StreamMode::TRUNC );
750 const uno::Reference< util::XOfficeInstallationDirectories >&
758 uno::Reference< uno::XComponentContext > xCtx(
770 TemplateFolderCache::TemplateFolderCache(
bool _bAutoStoreState )
776 TemplateFolderCache::~TemplateFolderCache( )
781 bool TemplateFolderCache::needsUpdate()
787 void TemplateFolderCache::storeState()
void SetSmartProtocol(INetProtocol eTheSmartScheme)
OUString GetMainURL(DecodeMechanism eMechanism, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
INetProtocol GetProtocol() const
bool Append(std::u16string_view rTheSegment, EncodeMechanism eMechanism=EncodeMechanism::WasEncoded, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8)
bool SetURL(std::u16string_view rTheAbsURIRef, EncodeMechanism eMechanism=EncodeMechanism::WasEncoded, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8)
SvStream & WriteInt32(sal_Int32 nInt32)
SvStream & WriteUniOrByteString(std::u16string_view rStr, rtl_TextEncoding eDestCharSet)
OUString ReadUniOrByteString(rtl_TextEncoding eSrcCharSet)
SvStream & ReadInt16(sal_Int16 &rInt16)
SvStream & WriteInt16(sal_Int16 nInt16)
SvStream & WriteUInt16(sal_uInt16 nUInt16)
SvStream & ReadInt32(sal_Int32 &rInt32)
rtl_TextEncoding GetStreamCharSet() const
SvStream & ReadUInt16(sal_uInt16 &rUInt16)
OUString ExpandMacros(const OUString &rPath) const
const OUString & GetTemplatePath() const
bool openCacheStream(bool _bForRead)
bool m_bValidCurrentState
static void normalize(TemplateFolderContent &_rState)
static OUString implParseSmart(const OUString &_rPath)
static bool equalStates(const TemplateFolderContent &_rLHS, const TemplateFolderContent &_rRHS)
TemplateFolderContent m_aPreviousState
bool implReadFolder(const ::rtl::Reference< TemplateContent > &_rxRoot)
std::unique_ptr< SvStream > m_pCacheStream
~TemplateFolderCacheImpl()
bool readCurrentState()
read the current state of the dirs
TemplateFolderContent m_aCurrentState
bool readPreviousState()
read the state of the dirs from the cache file
static sal_Int32 getMagicNumber()
const uno::Reference< util::XOfficeInstallationDirectories > & getOfficeInstDirs()
uno::Reference< util::XOfficeInstallationDirectories > m_xOfficeInstDirs
css::uno::Reference< css::ucb::XDynamicResultSet > createDynamicCursor(const css::uno::Sequence< OUString > &rPropertyNames, ResultSetInclude eMode=INCLUDE_FOLDERS_AND_DOCUMENTS)
#define DBG_ASSERT(sCon, aError)
#define TOOLS_WARN_EXCEPTION(area, stream)
bool normalize(sal_uInt16 &rDay, sal_uInt16 &rMonth, sal_Int16 &rYear)
Reference< XComponentContext > getProcessComponentContext()
static SvStream & WriteDateTime(SvStream &_rStorage, const util::DateTime &_rDate)
::std::vector< ::rtl::Reference< TemplateContent > > TemplateFolderContent
TemplateFolderContent::iterator FolderIterator
TemplateFolderContent::const_iterator ConstFolderIterator
static SvStream & operator>>(SvStream &_rStorage, util::DateTime &_rDate)
TemplateFolderContent m_aSubContents
uno::Reference< util::XOfficeInstallationDirectories > m_xOfficeInstDirs
util::DateTime m_aLastModified