![]() |
Mixxx
|
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 }*/