summaryrefslogtreecommitdiffstats
path: root/daemon/Controller.cpp
blob: c95e03c63ab895273213d5dbd06bbe85e665899f (plain) (blame)
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include "Controller.h"
#include <QDir>
#include <QFileInfo>
#include <QDirIterator>

Controller::Controller(QObject *parent) : QObject(parent),
#ifdef ENABLE_RIPPING
	m_ripTask(this),
#endif
	m_encodeTask(this),
	m_uploadTask(this)
{
#ifdef ENABLE_RIPPING
	connect(&m_ripTask, SIGNAL(completed(bool)), this, SLOT(runTasksIfTrue(bool)));
#endif
	connect(&m_encodeTask, SIGNAL(completed(bool)), this, SLOT(runTasksIfTrue(bool)));
	connect(&m_uploadTask, SIGNAL(completed(bool)), this, SLOT(runTasksIfTrue(bool)));
}
void Controller::runTasks()
{
	foreach(Movie* movie, m_movies)
		runTasks(movie);
}
void Controller::runTasksIfTrue(bool runThem)
{
	if (runThem)
		runTasks();
}

void Controller::runTasks(Movie *movie)
{
#ifdef ENABLE_RIPPING
	if (!m_ripTask.isRunning() && m_ripTask.canRunTask(movie))
		m_ripTask.runTask(movie);
#endif
	if (!m_encodeTask.isRunning() && m_encodeTask.canRunTask(movie))
		m_encodeTask.runTask(movie);
	if (!m_uploadTask.isRunning() && m_uploadTask.canRunTask(movie))
		m_uploadTask.runTask(movie);
}
bool Controller::addMovie(Movie *movie)
{
	foreach (Movie *existing, m_movies) {
		if (existing->title() == movie->title()) {
			delete movie;
			return false;
		}
	}
	connect(movie, SIGNAL(trackSet()), this, SLOT(runTasks()));
	m_movies.append(movie);
	movie->setParent(this);
	runTasks(movie);
	return true;
}
Movie* Controller::addISO(const QString &fileName)
{
	Movie *movie = new Movie(Movie::titleFromISOName(QFileInfo(fileName).baseName()), fileName, this);
	if (addMovie(movie))
		return movie;
	else
		return 0;
}
QLinkedList<Movie*> Controller::addRecursiveISOs(const QString &dirName)
{
	QLinkedList<Movie*> movies;
	QDirIterator dir(dirName, QStringList() << "*.iso" << "*.ISO", QDir::Files | QDir::Readable, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
	while (dir.hasNext()) {
		Movie *next = addISO(dir.next());
		if (next)
			movies << next;
	}
	return movies;
}

Movie* Controller::movieForTitle(const QString &title)
{
	foreach(Movie* movie, m_movies)
		if (movie->title() == title)
			return movie;
	return 0;
}
bool Controller::removeMovie(Movie *movie)
{
	if (!m_movies.removeOne(movie))
		return false;
	disconnect(movie, 0, 0, 0);
#ifdef ENABLE_RIPPING
	if (m_ripTask.currentMovie() == movie)
		m_ripTask.terminate();
#endif
	if (m_encodeTask.currentMovie() == movie)
		m_encodeTask.terminate();
	if (m_uploadTask.currentMovie() == movie)
		m_uploadTask.terminate();
	runTasks();
	movie->deleteLater();
	return true;
}

QLinkedList<Movie*> Controller::movies() const
{
	return m_movies;
}
#ifdef ENABLE_RIPPING
RipTask* Controller::ripTask() const
{
	return const_cast<RipTask*>(&m_ripTask);
}
#endif
EncodeTask* Controller::encodeTask() const
{
	return const_cast<EncodeTask*>(&m_encodeTask);
}
UploadTask* Controller::uploadTask() const
{
	return const_cast<UploadTask*>(&m_uploadTask);
}