1 /* 2 * Copyright (C) 2010 Nicolas Bonnefon and other contributors 3 * 4 * This file is part of glogg. 5 * 6 * glogg is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, either version 3 of the License, or 9 * (at your option) any later version. 10 * 11 * glogg is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with glogg. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 #include "log.h" 21 22 #include "qtfilewatcher.h" 23 24 #include <QStringList> 25 #include <QFileInfo> 26 27 QtFileWatcher::QtFileWatcher() : FileWatcher(), qtFileWatcher_( this ) 28 { 29 monitoringState_ = None; 30 31 connect( &qtFileWatcher_, SIGNAL( fileChanged( const QString& ) ), 32 this, SLOT( fileChangedOnDisk( const QString& ) ) ); 33 34 connect( &qtFileWatcher_, SIGNAL( directoryChanged( const QString& ) ), 35 this, SLOT( directoryChangedOnDisk( const QString& ) ) ); 36 } 37 38 QtFileWatcher::~QtFileWatcher() 39 { 40 disconnect( &qtFileWatcher_ ); 41 } 42 43 void QtFileWatcher::addFile( const QString& fileName ) 44 { 45 LOG(logDEBUG) << "QtFileWatcher::addFile " << fileName.toStdString(); 46 47 QFileInfo fileInfo = QFileInfo( fileName ); 48 49 if ( fileMonitored_.isEmpty() ) { 50 fileMonitored_ = fileName; 51 52 // Initialise the Qt file watcher 53 qtFileWatcher_.addPath( fileInfo.path() ); 54 55 if ( fileInfo.exists() ) { 56 LOG(logDEBUG) << "QtFileWatcher::addFile: file exists."; 57 qtFileWatcher_.addPath( fileName ); 58 monitoringState_ = FileExists; 59 } 60 else { 61 LOG(logDEBUG) << "QtFileWatcher::addFile: file doesn't exist."; 62 monitoringState_ = FileRemoved; 63 } 64 } 65 else { 66 LOG(logWARNING) << "QtFileWatcher::addFile " << fileName.toStdString() 67 << "- Already watching a file (" << fileMonitored_.toStdString() 68 << ")!"; 69 } 70 } 71 72 void QtFileWatcher::removeFile( const QString& fileName ) 73 { 74 LOG(logDEBUG) << "QtFileWatcher::removeFile " << fileName.toStdString(); 75 76 QFileInfo fileInfo = QFileInfo( fileName ); 77 78 if ( fileName == fileMonitored_ ) { 79 if ( monitoringState_ == FileExists ) 80 qtFileWatcher_.removePath( fileName ); 81 qtFileWatcher_.removePath( fileInfo.path() ); 82 fileMonitored_.clear(); 83 monitoringState_ = None; 84 } 85 else { 86 LOG(logWARNING) << "QtFileWatcher::removeFile - The file is not watched!"; 87 } 88 89 // For debug purpose: 90 foreach (QString str, qtFileWatcher_.files()) { 91 LOG(logERROR) << "File still watched: " << str.toStdString(); 92 } 93 foreach (QString str, qtFileWatcher_.directories()) { 94 LOG(logERROR) << "Directories still watched: " << str.toStdString(); 95 } 96 } 97 98 // 99 // Slots 100 // 101 102 void QtFileWatcher::fileChangedOnDisk( const QString& filename ) 103 { 104 LOG(logDEBUG) << "QtFileWatcher::fileChangedOnDisk " << filename.toStdString(); 105 106 if ( ( monitoringState_ == FileExists ) && ( filename == fileMonitored_ ) ) 107 { 108 emit fileChanged( filename ); 109 110 // If the file has been removed... 111 if ( !QFileInfo( filename ).exists() ) 112 monitoringState_ = FileRemoved; 113 } 114 else 115 LOG(logWARNING) << "QtFileWatcher::fileChangedOnDisk - call from Qt but no file monitored"; 116 } 117 118 void QtFileWatcher::directoryChangedOnDisk( const QString& filename ) 119 { 120 LOG(logDEBUG) << "QtFileWatcher::directoryChangedOnDisk " << filename.toStdString(); 121 122 if ( monitoringState_ == FileRemoved ) { 123 if ( QFileInfo( fileMonitored_ ).exists() ) { 124 LOG(logDEBUG) << "QtFileWatcher::directoryChangedOnDisk - our file reappeared!"; 125 126 // The file has been recreated, we have to watch it again. 127 monitoringState_ = FileExists; 128 129 // Restore the Qt file watcher (automatically cancelled 130 // when the file is deleted) 131 qtFileWatcher_.addPath( fileMonitored_ ); 132 133 emit fileChanged( fileMonitored_ ); 134 } 135 else { 136 LOG(logWARNING) << "QtFileWatcher::directoryChangedOnDisk - not the file we are watching"; 137 } 138 } 139 else if ( monitoringState_ == FileExists ) 140 { 141 if ( ! QFileInfo( fileMonitored_ ).exists() ) { 142 LOG(logDEBUG) << "QtFileWatcher::directoryChangedOnDisk - our file disappeared!"; 143 144 monitoringState_ = FileRemoved; 145 146 emit fileChanged( filename ); 147 } 148 else { 149 LOG(logWARNING) << "QtFileWatcher::directoryChangedOnDisk - not the file we are watching"; 150 } 151 } 152 153 } 154