Mixxx

/home/maxime/Projets/Mixxx/1.10/mixxx/src/library/songdownloader.cpp

Go to the documentation of this file.
00001 #include <QtCore>
00002 #include <QtGui>
00003 #include "defs_version.h"
00004 #include "songdownloader.h"
00005 
00006 #define TEMP_EXTENSION ".tmp"
00007 
00008 SongDownloader::SongDownloader(QObject* parent) : QObject(parent)
00009 {
00010     qDebug() << "SongDownloader constructed";
00011     
00012     m_pNetwork = new QNetworkAccessManager();
00013     m_pDownloadedFile = NULL;
00014     m_pRequest = NULL;
00015     //connect(m_pNetwork, SIGNAL(finished(QNetworkReply*)),
00016     //     this, SLOT(finishedSlot(QNetworkReply*)));
00017 
00018 }
00019 
00020 SongDownloader::~SongDownloader()
00021 {
00022     delete m_pNetwork;
00023     
00024     delete m_pDownloadedFile;
00025     m_pDownloadedFile = NULL;
00026     delete m_pRequest;
00027     m_pRequest = NULL;
00028 }
00029 
00030 bool SongDownloader::downloadSongFromURL(QUrl& url)
00031 {
00032     qDebug() << "SongDownloader::downloadSongFromURL()";
00033 
00034     m_downloadQueue.enqueue(url);
00035     downloadFromQueue();
00036 
00037     return true;
00038 }
00039 
00040 
00041 bool SongDownloader::downloadFromQueue()
00042 {
00043     QUrl downloadUrl = m_downloadQueue.dequeue();
00044     //Extract the filename from the URL path
00045     QString filename = downloadUrl.path();
00046     QFileInfo fileInfo(filename);
00047     filename = fileInfo.fileName();
00048 
00049     m_pDownloadedFile = new QFile(filename + TEMP_EXTENSION);
00050     if (!m_pDownloadedFile->open(QIODevice::WriteOnly))
00051     {
00052         //TODO: Error
00053         qDebug() << "Failed to open" << m_pDownloadedFile->fileName();
00054         return false;
00055     }
00056    
00057     qDebug() << "SongDownloader: setting up download stuff";
00058     m_pRequest = new QNetworkRequest(downloadUrl);
00059 
00060     //Set up user agent for great justice
00061     QString mixxxUA = QString("%1 %2").arg(QApplication::applicationName()).arg(VERSION);
00062     QByteArray mixxxUABA = mixxxUA.toAscii();
00063     m_pRequest->setRawHeader("User-Agent", mixxxUABA);
00064     m_pReply = m_pNetwork->get(*m_pRequest);
00065 
00066     connect(m_pReply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
00067     connect(m_pReply, SIGNAL(error(QNetworkReply::NetworkError)),
00068          this, SLOT(slotError(QNetworkReply::NetworkError)));   
00069     connect(m_pReply, SIGNAL(downloadProgress(qint64, qint64)),
00070             this, SLOT(slotProgress(qint64, qint64)));
00071     connect(m_pReply, SIGNAL(downloadProgress(qint64, qint64)),
00072             this, SIGNAL(downloadProgress(qint64, qint64)));
00073     connect(m_pReply, SIGNAL(finished()),
00074             this, SLOT(slotDownloadFinished()));    
00075 
00076     return true;
00077 }
00078 
00079 void SongDownloader::slotReadyRead()
00080 {
00081     //Magic. Isn't this how C++ is supposed to work?
00082     //m_pDownloadedFile << m_pReply;
00083     //Update: :( 
00084     
00085     //QByteArray buffer;
00086     while (m_pReply->bytesAvailable() > 0)
00087     {
00088         qDebug() << "downloading...";
00089         m_pDownloadedFile->write(m_pReply->read(512));
00090     }
00091 }
00092 
00093 void SongDownloader::slotError(QNetworkReply::NetworkError error)
00094 {
00095     qDebug() << "SongDownloader: Network error while trying to download a plugin.";
00096     
00097     //Delete partial file
00098     m_pDownloadedFile->remove();
00099 
00100     emit(downloadError());
00101 }
00102 
00103 void SongDownloader::slotProgress( qint64 bytesReceived, qint64 bytesTotal )
00104 {
00105     qDebug() << bytesReceived << "/" << bytesTotal;
00106     emit(downloadProgress(bytesReceived, bytesTotal));
00107 }
00108 
00109 void SongDownloader::slotDownloadFinished()
00110 {
00111     qDebug() << "SongDownloader: Download finished!";
00112     //Finish up with the reply and close the file handle
00113     m_pReply->deleteLater();
00114     m_pDownloadedFile->close();
00115 
00116     //Chop off the .tmp from the filename 
00117     QFileInfo info(*m_pDownloadedFile);
00118     QString filenameWithoutTmp = info.absoluteFilePath();
00119     filenameWithoutTmp.chop(QString(TEMP_EXTENSION).length());
00120     m_pDownloadedFile->rename(filenameWithoutTmp);
00121     delete m_pDownloadedFile;
00122     m_pDownloadedFile = NULL;
00123     delete m_pRequest;
00124     m_pRequest = NULL;
00125 
00126     if (m_downloadQueue.count() > 0) {
00127         downloadFromQueue();
00128     }
00129 
00130     {
00131         //XXX: Add the song to the My Downloads crate
00132 
00133 
00134         //Emit this signal when all the files have been downloaded.
00135         emit(downloadFinished());
00136     }
00137 }
00138 
00139 /*
00140 void SongDownloader::finishedSlot(QNetworkReply* reply)
00141 {
00142     if (reply->error() == QNetworkReply::NoError)
00143     {
00144         qDebug() << "SongDownloader: finishedSlot, no error";
00145     }
00146     else
00147         qDebug() << "SongDownloader: NAM error :-/";
00148 }*/
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines