20#include <QCoreApplication>
23#include "moc_qgscapabilitiescache.cpp"
25#if defined( Q_OS_LINUX )
37 QObject::connect( &mFileSystemWatcher, &QFileSystemWatcher::fileChanged,
this, &QgsCapabilitiesCache::removeChangedEntry );
39#if defined( Q_OS_LINUX )
40 QObject::connect( &mTimer, &QTimer::timeout,
this, &QgsCapabilitiesCache::removeOutdatedEntries );
46 QCoreApplication::processEvents();
48 if ( mCachedCapabilities.contains( configFilePath ) && mCachedCapabilities[configFilePath].contains( key ) )
50 return &mCachedCapabilities[configFilePath][key];
60 if ( mCachedCapabilities.size() > mCacheSize )
63 const QHash<QString, QHash<QString, QDomDocument>>::iterator capIt = mCachedCapabilities.begin();
64 mFileSystemWatcher.removePath( capIt.key() );
65 mCachedCapabilities.erase( capIt );
67 QgsMessageLog::logMessage( QStringLiteral(
"Removed cached WMS capabilities document because all %1 cache slots were taken" ).arg( mCacheSize ), QStringLiteral(
"Server" ) );
70 if ( !mCachedCapabilities.contains( configFilePath ) )
72 mFileSystemWatcher.addPath( configFilePath );
73 mCachedCapabilities.insert( configFilePath, QHash<QString, QDomDocument>() );
76 mCachedCapabilities[configFilePath].insert( key, doc->cloneNode().toDocument() );
78#if defined( Q_OS_LINUX )
79 struct statfs sStatFS;
80 if ( statfs( configFilePath.toUtf8().constData(), &sStatFS ) == 0 && ( sStatFS.f_type == 0x6969 || sStatFS.f_type == 0x517b || sStatFS.f_type == 0xff534d42ul || sStatFS.f_type == 0xfe534d42ul ) )
82 const QFileInfo fi( configFilePath );
83 mCachedCapabilitiesTimestamps[configFilePath] = fi.lastModified();
91 mCachedCapabilities.remove( path );
92 mCachedCapabilitiesTimestamps.remove( path );
93 mFileSystemWatcher.removePath( path );
96void QgsCapabilitiesCache::removeChangedEntry(
const QString &path )
98 QgsDebugMsgLevel( QStringLiteral(
"Remove capabilities cache entry because file changed" ), 2 );
102void QgsCapabilitiesCache::removeOutdatedEntries()
105 for (
auto it = mCachedCapabilitiesTimestamps.constBegin(); it != mCachedCapabilitiesTimestamps.constEnd(); it++ )
107 const QString configFilePath = it.key();
108 const QFileInfo fi( configFilePath );
109 if ( !fi.exists() || it.value() < fi.lastModified() )
110 removeChangedEntry( configFilePath );
113 if ( !mCachedCapabilitiesTimestamps.isEmpty() )
115 mTimer.start( 1000 );
void removeCapabilitiesDocument(const QString &path)
Removes 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).
QgsCapabilitiesCache(int size)
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).
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE())
Adds a message to the log instance (and creates it if necessary).
#define QgsDebugMsgLevel(str, level)