QGIS API Documentation 3.30.0-'s-Hertogenbosch (f186b8efe0)
qgscapabilitiescache.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgscapabilitiescache.h
3 ----------------------
4 begin : May 11th, 2011
5 copyright : (C) 2011 by Marco Hugentobler
6 email : marco dot hugentobler at sourcepole dot ch
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
19
20#include <QCoreApplication>
21#include <QFileInfo>
22
23#if defined(Q_OS_LINUX)
24#include <sys/vfs.h>
25#endif
26
27#include "qgslogger.h"
28
29
31{
32 QObject::connect( &mFileSystemWatcher, &QFileSystemWatcher::fileChanged, this, &QgsCapabilitiesCache::removeChangedEntry );
33
34#if defined(Q_OS_LINUX)
35 QObject::connect( &mTimer, &QTimer::timeout, this, &QgsCapabilitiesCache::removeOutdatedEntries );
36#endif
37}
38
39const QDomDocument *QgsCapabilitiesCache::searchCapabilitiesDocument( const QString &configFilePath, const QString &key )
40{
41 QCoreApplication::processEvents(); //get updates from file system watcher
42
43 if ( mCachedCapabilities.contains( configFilePath ) && mCachedCapabilities[ configFilePath ].contains( key ) )
44 {
45 return &mCachedCapabilities[ configFilePath ][ key ];
46 }
47 else
48 {
49 return nullptr;
50 }
51}
52
53void QgsCapabilitiesCache::insertCapabilitiesDocument( const QString &configFilePath, const QString &key, const QDomDocument *doc )
54{
55 if ( mCachedCapabilities.size() > 40 )
56 {
57 //remove another cache entry to avoid memory problems
58 const QHash<QString, QHash<QString, QDomDocument> >::iterator capIt = mCachedCapabilities.begin();
59 mFileSystemWatcher.removePath( capIt.key() );
60 mCachedCapabilities.erase( capIt );
61 }
62
63 if ( !mCachedCapabilities.contains( configFilePath ) )
64 {
65 mFileSystemWatcher.addPath( configFilePath );
66 mCachedCapabilities.insert( configFilePath, QHash<QString, QDomDocument>() );
67 }
68
69 mCachedCapabilities[ configFilePath ].insert( key, doc->cloneNode().toDocument() );
70
71#if defined(Q_OS_LINUX)
72 struct statfs sStatFS;
73 if ( statfs( configFilePath.toUtf8().constData(), &sStatFS ) == 0 &&
74 ( sStatFS.f_type == 0x6969 /* NFS */ ||
75 sStatFS.f_type == 0x517b /* SMB */ ||
76 sStatFS.f_type == 0xff534d42ul /* CIFS */ ||
77 sStatFS.f_type == 0xfe534d42ul /* CIFS */ ) )
78 {
79 const QFileInfo fi( configFilePath );
80 mCachedCapabilitiesTimestamps[ configFilePath ] = fi.lastModified();
81 mTimer.start( 1000 );
82 }
83#endif
84}
85
87{
88 mCachedCapabilities.remove( path );
89 mCachedCapabilitiesTimestamps.remove( path );
90 mFileSystemWatcher.removePath( path );
91}
92
93void QgsCapabilitiesCache::removeChangedEntry( const QString &path )
94{
95 QgsDebugMsg( QStringLiteral( "Remove capabilities cache entry because file changed" ) );
97}
98
99void QgsCapabilitiesCache::removeOutdatedEntries()
100{
101 QgsDebugMsg( QStringLiteral( "Checking for outdated entries" ) );
102 for ( auto it = mCachedCapabilitiesTimestamps.constBegin(); it != mCachedCapabilitiesTimestamps.constEnd(); it++ )
103 {
104 const QString configFilePath = it.key();
105 const QFileInfo fi( configFilePath );
106 if ( !fi.exists() || it.value() < fi.lastModified() )
107 removeChangedEntry( configFilePath );
108 }
109
110 if ( !mCachedCapabilitiesTimestamps.isEmpty() )
111 {
112 mTimer.start( 1000 );
113 }
114}
void removeCapabilitiesDocument(const QString &path)
Remove capabilities document.
const QDomDocument * searchCapabilitiesDocument(const QString &configFilePath, const QString &key)
Returns cached capabilities document (or 0 if document for configuration file not in cache)
void insertCapabilitiesDocument(const QString &configFilePath, const QString &key, const QDomDocument *doc)
Inserts new capabilities document (creates a copy of the document, does not take ownership)
#define QgsDebugMsg(str)
Definition: qgslogger.h:38