summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2009-09-05 22:30:11 -0400
committerJason A. Donenfeld <Jason@zx2c4.com>2009-09-05 22:30:11 -0400
commit04c5531ec85c6e5a4b9e8d2c166e93f32961e442 (patch)
treeed7d43f067d0b5309970d08418c969bdbee2bef7
parentSkeleton of job system. (diff)
downloadAnyRip-04c5531ec85c6e5a4b9e8d2c166e93f32961e442.tar.xz
AnyRip-04c5531ec85c6e5a4b9e8d2c166e93f32961e442.zip
Added dvd drive skeleton.
-rw-r--r--AnyRip.pro9
-rw-r--r--dvdimagejob.cpp23
-rw-r--r--dvdimagejob.h8
-rw-r--r--imagegui.cpp14
-rw-r--r--imagegui.h3
-rw-r--r--job.h2
-rw-r--r--main.cpp4
-rw-r--r--video.cpp15
-rw-r--r--video.h7
9 files changed, 60 insertions, 25 deletions
diff --git a/AnyRip.pro b/AnyRip.pro
index c25596f..a84415f 100644
--- a/AnyRip.pro
+++ b/AnyRip.pro
@@ -1,11 +1,14 @@
SOURCES += main.cpp \
- dvdimagejob.cpp \
+ dvdimagejob.cpp \
imagegui.cpp \
job.cpp \
- video.cpp
+ video.cpp \
+ dvddrive.cpp
HEADERS += dvdimagejob.h \
imagegui.h \
job.h \
- video.h
+ video.h \
+ dvddrive.h
LIBS += -ldvdcss \
-ldvdread
+QT += dbus
diff --git a/dvdimagejob.cpp b/dvdimagejob.cpp
index 89e89e0..98fe537 100644
--- a/dvdimagejob.cpp
+++ b/dvdimagejob.cpp
@@ -1,7 +1,5 @@
-// Much of the CSS logic comes from Bryan Ford's Netsteria
-// http://www.google.com/codesearch/p?hl=en&sa=N&cd=10&ct=rc#PY4_fj37fsw/uia/netsteria/dvd/read.cc&q=DVDCSS_SEEK_KEY
-
#include "dvdimagejob.h"
+#include "dvddrive.h"
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
@@ -12,10 +10,10 @@
#include <QIODevice>
#include <QFile>
-DVDImageJob::DVDImageJob(Video *video)
- : Job(video)
+DVDImageJob::DVDImageJob(Video *video, DVDDrive *dvdDrive)
+ : Job(video),
+ m_dvdDrive(dvdDrive)
{
- //Initialize something...
}
int DVDImageJob::cmpvob(const void *p1, const void *p2)
@@ -32,7 +30,7 @@ int DVDImageJob::cmpvob(const void *p1, const void *p2)
bool DVDImageJob::executeJob()
{
- return saveImageToPath(QLatin1String("/dev/dvd"), QLatin1String("image.iso")); //Fix up
+ return saveImageToPath(QLatin1String("image.iso")); //Fix up
}
Video::Jobs DVDImageJob::jobType()
@@ -40,17 +38,20 @@ Video::Jobs DVDImageJob::jobType()
return Video::DVDImage;
}
-bool DVDImageJob::saveImageToPath(const QString &dvdDevice, const QString &path)
+bool DVDImageJob::saveImageToPath(const QString &path)
{
QFile file(path);
file.open(QFile::WriteOnly);
- bool ret = saveImageToDevice(dvdDevice, file);
+ bool ret = saveImageToDevice(file);
file.close();
return ret;
}
-bool DVDImageJob::saveImageToDevice(const QString &dvdDevice, QIODevice &out)
+// Much of the CSS logic comes from Bryan Ford's Netsteria
+// http://www.google.com/codesearch/p?hl=en&sa=N&cd=10&ct=rc#PY4_fj37fsw/uia/netsteria/dvd/read.cc&q=DVDCSS_SEEK_KEY
+bool DVDImageJob::saveImageToDevice(QIODevice &out)
{
+ QString dvdDevice = m_dvdDrive->dvdDevice();
dvd_reader_t *dvdr = DVDOpen(dvdDevice.toStdString().c_str());
if (!dvdr) {
qDebug() << "can't open DVD (dvdread)";
@@ -121,7 +122,7 @@ bool DVDImageJob::saveImageToDevice(const QString &dvdDevice, QIODevice &out)
return false;
}
- int blkno = 3943433;
+ int blkno = 0;
int curvob = 0;
while (1) {
//printf("% 3d%%: block %d of %d (byte %lld of %lld)\r",
diff --git a/dvdimagejob.h b/dvdimagejob.h
index 6d97b6b..4a99f16 100644
--- a/dvdimagejob.h
+++ b/dvdimagejob.h
@@ -2,15 +2,16 @@
#define DVDIMAGEJOB_H
#include "job.h"
+class DVDDrive;
class QIODevice;
class DVDImageJob : public Job
{
Q_OBJECT
public:
- DVDImageJob(Video *video);
- bool saveImageToDevice(const QString &dvdDevice, QIODevice &out);
- bool saveImageToPath(const QString &dvdDevice, const QString &path);
+ DVDImageJob(Video *video, DVDDrive *dvdDrive);
+ bool saveImageToDevice(QIODevice &out);
+ bool saveImageToPath(const QString &path);
Video::Jobs jobType();
private:
@@ -18,6 +19,7 @@ private:
typedef struct vobfile {
int32_t start, end;
} vobfile;
+ DVDDrive *m_dvdDrive;
protected:
bool executeJob();
diff --git a/imagegui.cpp b/imagegui.cpp
index 5180c22..52c5790 100644
--- a/imagegui.cpp
+++ b/imagegui.cpp
@@ -1,5 +1,6 @@
#include "imagegui.h"
#include "dvdimagejob.h"
+#include "dvddrive.h"
#include <dvdcss/dvdcss.h>
#include <QPushButton>
#include <QProgressBar>
@@ -9,7 +10,18 @@
ImageGui::ImageGui()
{
- Video *video = new Video();
+ m_dvdDrive = new DVDDrive(this);
+ if (m_dvdDrive->dvdInserted()) {
+ startImaging();
+ } else {
+ setWindowTitle(tr("Please insert DVD..."));
+ connect(m_dvdDrive, SIGNAL(dvdAdded()), this, SLOT(startImaging()));
+ }
+}
+void ImageGui::startImaging()
+{
+ setWindowTitle(tr("Starting imaging..."));
+ Video *video = new Video(m_dvdDrive);
Job *job = video->nextJob();
m_first = true;
connect(job, SIGNAL(extractProgress(int,int)), this, SLOT(extractProgress(int,int)));
diff --git a/imagegui.h b/imagegui.h
index 98e91e1..ddd731e 100644
--- a/imagegui.h
+++ b/imagegui.h
@@ -3,6 +3,7 @@
#include <QProgressBar>
#include <QTime>
+class DVDDrive;
class ImageGui : public QProgressBar
{
@@ -14,9 +15,11 @@ public:
private:
QTime m_startTime;
bool m_first;
+ DVDDrive *m_dvdDrive;
private slots:
void extractProgress(int current, int maximum);
+ void startImaging();
};
#endif // IMAGEGUI_H
diff --git a/job.h b/job.h
index b5a7513..c0b1750 100644
--- a/job.h
+++ b/job.h
@@ -9,10 +9,10 @@ class Job : public QObject
{
Q_OBJECT
public:
- Job(QObject *parent = 0);
void runJob();
virtual Video::Jobs jobType() = 0;
protected:
+ Job(QObject *parent = 0);
virtual bool executeJob() = 0;
private:
QFutureWatcher<bool> *m_watcher;
diff --git a/main.cpp b/main.cpp
index b061ad0..9e8963d 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,9 +1,13 @@
#include "imagegui.h"
+#include "dvddrive.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
+
+ DVDDrive drive;
+ drive.eject();
a.setApplicationName(QLatin1String("AnyRip"));
a.setOrganizationName(QLatin1String("AnyClip"));
a.setOrganizationDomain(QLatin1String("anyclip.com"));
diff --git a/video.cpp b/video.cpp
index 0daccf2..9a8527e 100644
--- a/video.cpp
+++ b/video.cpp
@@ -1,10 +1,13 @@
#include "video.h"
#include "job.h"
#include "dvdimagejob.h"
+#include "dvddrive.h"
-Video::Video() : m_jobsCompleted(QBitArray(5))
+Video::Video(DVDDrive *dvdDrive) :
+ m_jobsCompleted(QBitArray(5)),
+ m_dvdDrive(dvdDrive)
{
- //Do something
+ m_title = dvdDrive->dvdName();
}
void Video::completedJob(bool success)
{
@@ -25,10 +28,14 @@ Job* Video::nextJob()
{
Job *job;
if (!m_jobsCompleted.at(Video::DVDImage)) {
- job = new DVDImageJob(this);
+ job = new DVDImageJob(this, m_dvdDrive);
} else {
- return job = 0; //Other jobs...
+ job = 0; //Other jobs...
}
connect(job, SIGNAL(completed(bool)), this, SLOT(completedJob(bool)));
return job;
}
+bool Video::isJobComplete(Jobs job) const
+{
+ return m_jobsCompleted.at(job);
+}
diff --git a/video.h b/video.h
index cf8cb73..4efee93 100644
--- a/video.h
+++ b/video.h
@@ -1,20 +1,23 @@
#ifndef VIDEO_H
#define VIDEO_H
-
#include <QObject>
#include <QBitArray>
class Job;
+class DVDDrive;
class Video : public QObject
{
Q_OBJECT
public:
- Video();
+ Video(DVDDrive *dvdDrive);
enum Jobs { DVDImage, EncodeMP4, Upload, Subtitle, Poster };
Job* nextJob();
+ bool isJobComplete(Jobs job) const;
private:
QBitArray m_jobsCompleted;
+ QString m_title;
+ DVDDrive *m_dvdDrive;
private slots:
void completedJob(bool success);
};