Subversion Repositories Scribus

Rev

Rev 1155 | Rev 2702 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1151 fschmid 1
#include "filewatcher.h"
2
#include "filewatcher.moc"
3
#include <unistd.h>
4
 
5
FileWatcher::FileWatcher( QWidget* parent) : QObject(parent)
6
{
7
        watchedFiles.clear();
8
        watchTimer = new QTimer(this);
9
        connect(watchTimer, SIGNAL(timeout()), this, SLOT(checkFiles()));
10
        watchTimer->start(10000, true);
11
        blockAddRemove = false;
12
}
13
 
14
FileWatcher::~FileWatcher()
15
{
16
        watchTimer->stop();
17
        disconnect(watchTimer, SIGNAL(timeout()), this, SLOT(checkFiles()));
18
        watchedFiles.clear();
19
        delete watchTimer;
20
}
21
 
22
void FileWatcher::addFile(QString fileName)
23
{
1172 fschmid 24
        watchTimer->stop();
25
        if (!watchedFiles.contains(fileName))
1151 fschmid 26
        {
1172 fschmid 27
                struct fileMod fi;
28
                fi.info = QFileInfo(fileName);
29
                fi.timeInfo = fi.info.lastModified();
30
                watchedFiles.insert(fileName, fi);
1151 fschmid 31
        }
1172 fschmid 32
        watchTimer->start(10000, true);
1151 fschmid 33
}
34
 
35
void FileWatcher::removeFile(QString fileName)
36
{
1172 fschmid 37
        watchTimer->stop();
1151 fschmid 38
        watchedFiles.remove(fileName);
1172 fschmid 39
        watchTimer->start(10000, true);
1151 fschmid 40
}
41
 
1172 fschmid 42
void FileWatcher::addDir(QString fileName)
1151 fschmid 43
{
1172 fschmid 44
        addFile(fileName);
1151 fschmid 45
}
46
 
1172 fschmid 47
void FileWatcher::removeDir(QString fileName)
48
{
49
        removeFile(fileName);
50
}
51
 
52
void FileWatcher::start()
53
{
54
        watchTimer->stop();
55
        watchTimer->start(10000, true);
56
}
57
 
58
void FileWatcher::stop()
59
{
60
        watchTimer->stop();
61
}
62
 
63
void FileWatcher::forceScan()
64
{
65
        checkFiles();
66
}
67
 
1155 fschmid 68
bool FileWatcher::isActive()
69
{
70
        return blockAddRemove;
71
}
72
 
1172 fschmid 73
QValueList<QString> FileWatcher::files()
74
{
75
        return watchedFiles.keys();
76
}
77
 
1151 fschmid 78
void FileWatcher::checkFiles()
79
{
80
        blockAddRemove = true;
81
        watchTimer->stop();
82
        QDateTime time;
83
        QMap<QString, fileMod>::Iterator it;
84
        for ( it = watchedFiles.begin(); it != watchedFiles.end(); ++it )
85
        {
86
                it.data().info.refresh();
1155 fschmid 87
                if (!it.data().info.exists())
88
                {
1172 fschmid 89
                        if (it.data().info.isDir())
90
                                emit dirDeleted(it.key());
91
                        else
92
                                emit fileDeleted(it.key());
1155 fschmid 93
                        watchedFiles.remove(it);
94
                        continue;
95
                }
1151 fschmid 96
                time = it.data().info.lastModified();
97
                if (time != it.data().timeInfo)
98
                {
1172 fschmid 99
                        if (it.data().info.isDir())
100
                                emit dirChanged(it.key());
101
                        else
1155 fschmid 102
                        {
1172 fschmid 103
                                uint sizeo = it.data().info.size();
1155 fschmid 104
                                usleep(100);
105
                                it.data().info.refresh();
1172 fschmid 106
                                uint sizen = it.data().info.size();
107
                                while (sizen != sizeo)
108
                                {
109
                                        sizeo = sizen;
110
                                        usleep(100);
111
                                        it.data().info.refresh();
112
                                        sizen = it.data().info.size();
113
                                }
114
                                it.data().timeInfo = time;
115
                                emit fileChanged(it.key());
1155 fschmid 116
                        }
1151 fschmid 117
                }
118
        }
119
        blockAddRemove = false;
120
        watchTimer->start(10000, true);
121
}
122