Subversion Repositories Scribus

Rev

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