/* * Copyright (C) 2010 Nicolas Bonnefon and other contributors * * This file is part of glogg. * * glogg is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * glogg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with glogg. If not, see . */ #include "log.h" #include "qtfilewatcher.h" #include #include QtFileWatcher::QtFileWatcher() : FileWatcher(), qtFileWatcher_( this ) { monitoringState_ = None; connect( &qtFileWatcher_, SIGNAL( fileChanged( const QString& ) ), this, SLOT( fileChangedOnDisk( const QString& ) ) ); connect( &qtFileWatcher_, SIGNAL( directoryChanged( const QString& ) ), this, SLOT( directoryChangedOnDisk( const QString& ) ) ); } QtFileWatcher::~QtFileWatcher() { disconnect( &qtFileWatcher_ ); } void QtFileWatcher::addFile( const QString& fileName ) { LOG(logDEBUG) << "QtFileWatcher::addFile " << fileName.toStdString(); QFileInfo fileInfo = QFileInfo( fileName ); if ( fileMonitored_.isEmpty() ) { fileMonitored_ = fileName; // Initialise the Qt file watcher qtFileWatcher_.addPath( fileInfo.path() ); if ( fileInfo.exists() ) { LOG(logDEBUG) << "QtFileWatcher::addFile: file exists."; qtFileWatcher_.addPath( fileName ); monitoringState_ = FileExists; } else { LOG(logDEBUG) << "QtFileWatcher::addFile: file doesn't exist."; monitoringState_ = FileRemoved; } } else { LOG(logWARNING) << "QtFileWatcher::addFile " << fileName.toStdString() << "- Already watching a file (" << fileMonitored_.toStdString() << ")!"; } } void QtFileWatcher::removeFile( const QString& fileName ) { LOG(logDEBUG) << "QtFileWatcher::removeFile " << fileName.toStdString(); QFileInfo fileInfo = QFileInfo( fileName ); if ( fileName == fileMonitored_ ) { if ( monitoringState_ == FileExists ) qtFileWatcher_.removePath( fileName ); qtFileWatcher_.removePath( fileInfo.path() ); fileMonitored_.clear(); monitoringState_ = None; } else { LOG(logWARNING) << "QtFileWatcher::removeFile - The file is not watched!"; } // For debug purpose: foreach (QString str, qtFileWatcher_.files()) { LOG(logERROR) << "File still watched: " << str.toStdString(); } foreach (QString str, qtFileWatcher_.directories()) { LOG(logERROR) << "Directories still watched: " << str.toStdString(); } } // // Slots // void QtFileWatcher::fileChangedOnDisk( const QString& filename ) { LOG(logDEBUG) << "QtFileWatcher::fileChangedOnDisk " << filename.toStdString(); if ( ( monitoringState_ == FileExists ) && ( filename == fileMonitored_ ) ) { emit fileChanged( filename ); // If the file has been removed... if ( !QFileInfo( filename ).exists() ) monitoringState_ = FileRemoved; } else LOG(logWARNING) << "QtFileWatcher::fileChangedOnDisk - call from Qt but no file monitored"; } void QtFileWatcher::directoryChangedOnDisk( const QString& filename ) { LOG(logDEBUG) << "QtFileWatcher::directoryChangedOnDisk " << filename.toStdString(); if ( monitoringState_ == FileRemoved ) { if ( QFileInfo( fileMonitored_ ).exists() ) { LOG(logDEBUG) << "QtFileWatcher::directoryChangedOnDisk - our file reappeared!"; // The file has been recreated, we have to watch it again. monitoringState_ = FileExists; // Restore the Qt file watcher (automatically cancelled // when the file is deleted) qtFileWatcher_.addPath( fileMonitored_ ); emit fileChanged( fileMonitored_ ); } else { LOG(logWARNING) << "QtFileWatcher::directoryChangedOnDisk - not the file we are watching"; } } else if ( monitoringState_ == FileExists ) { if ( ! QFileInfo( fileMonitored_ ).exists() ) { LOG(logDEBUG) << "QtFileWatcher::directoryChangedOnDisk - our file disappeared!"; monitoringState_ = FileRemoved; emit fileChanged( filename ); } else { LOG(logWARNING) << "QtFileWatcher::directoryChangedOnDisk - not the file we are watching"; } } }