root/src/directoryscanner.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "directoryscanner.h"
#include <QDir>
#include <iostream>

DirectoryScanner::DirectoryScanner() {

}

DirectoryScanner::~DirectoryScanner()
{
    foreach (MediaScanner* scanner, mediaScanners) {
        delete scanner;
    }
}

void DirectoryScanner::addScanner(MediaScanner *scanner) {
    if (scanner) {
        this->mediaScanners.append(scanner);
        connect(scanner, SIGNAL(machingFile(QString)), this, SIGNAL(machingFile(QString)));
    }
}

void DirectoryScanner::scan(const QString& path, QStringList& handledDirs, const QString& rootPath) {
    QDir dir(path);
    QStringList dirs = dir.entryList(QDir::Dirs);
    foreach (QString d, dirs) {
        if (d == "." || d == "..") {
            continue;
        }

        QString dirPath = dir.absoluteFilePath(d);
        //std::cout << dirPath.toStdString() << std::endl;
        if (dirPath.startsWith(rootPath) && !handledDirs.contains(dirPath)) {
            handledDirs.append(dirPath);
            this->scan(dirPath, handledDirs, rootPath);
        }
    }

    const QStringList files = dir.entryList(QDir::Files);
    foreach (MediaScanner* scanner, mediaScanners) {
        scanner->scanFiles(files, dir);
    }
}

void DirectoryScanner::scan(QString path) {
    QStringList handledDirs;
    this->scan(path, handledDirs, QDir(path).absolutePath());
}

DirectoryScannerThread::DirectoryScannerThread(DirectoryScanner *scanner, const QList<SearchDirectory> dirs, QObject *parent) :
    QThread(parent),
    scanner(scanner),
    dirs(dirs)
{
    connect(scanner, SIGNAL(machingFile(QString)), this, SIGNAL(machingFile(QString)));
}

DirectoryScannerThread::~DirectoryScannerThread()
{
    delete this->scanner;
}

void DirectoryScannerThread::run() {
    for (int i=0; i < dirs.length(); ++i) {
        scanner->scan(dirs.at(i).dir.absolutePath());
    }
    emit done();
}