Subversion Repositories Scribus

Rev

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