diff -r 6aeb7a756187 -r 3c88a81ff781 utilities/downloadmanager/src/wmdrmdownloadbackend.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/utilities/downloadmanager/src/wmdrmdownloadbackend.cpp Fri Oct 15 17:30:59 2010 -0400 @@ -0,0 +1,288 @@ +/** + This file is part of CWRT package ** + + Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU (Lesser) General Public License as + published by the Free Software Foundation, version 2.1 of the License. + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + (Lesser) General Public License for more details. You should have + received a copy of the GNU (Lesser) General Public License along + with this program. If not, see . +*/ + +#include "downloadmanager.h" +#include "clientdownload.h" +#include "downloadcore.h" +#include "downloadevent.h" +#include "wmdrmdownloadbackend.h" +#include +#include +#include +#include + +WMDRMDownloadBackend::WMDRMDownloadBackend(DownloadCore *dlCore, ClientDownload *dl) + :DownloadBackend(dlCore, dl), CActive( EPriorityStandard ) +{ + m_downloadCore = dlCore; + m_download = dl; + m_contentDownload = NULL; + m_utility = NULL; + m_contentUrl = NULL; + + CActiveScheduler::Add( this ); +} + +WMDRMDownloadBackend::~WMDRMDownloadBackend() +{ + if (m_utility) { + delete m_utility; + m_utility = NULL; + } + if (m_contentUrl) { + delete m_contentUrl; + m_contentUrl = NULL; + } + if (m_contentDownload) { + m_contentDownload->unregisterEventReceiver(this); + delete m_contentDownload; + m_contentDownload = NULL; + } +} + +int WMDRMDownloadBackend::pause() +{ + if (m_contentDownload) { + m_contentDownload->pause(); + setDownloadState(DlPaused); + } + return 0; +} + +int WMDRMDownloadBackend::resume() +{ + if (m_contentDownload) + return (m_contentDownload->resume()); + return 0; +} + +int WMDRMDownloadBackend::cancel() +{ + if (m_contentDownload) + return (m_contentDownload->cancel()); + + return 0; +} + +QVariant WMDRMDownloadBackend::getAttribute(DownloadAttribute attr) +{ + switch(attr) { + case DlFileName: + { + if(m_contentDownload) + return m_contentDownload->getAttribute(DlFileName); + } + case DlContentType: + { + if(m_contentDownload) { + return m_contentDownload->getAttribute(DlContentType); + } + } + default: + return DownloadBackend::getAttribute(attr); + } + return QVariant(); +} + +int WMDRMDownloadBackend::setAttribute(DownloadAttribute attr, const QVariant& value) +{ + return DownloadBackend::setAttribute(attr, value); +} + +// stores the data in storage +void WMDRMDownloadBackend::store(QByteArray /*data*/, bool /*lastChunk=false*/) +{ + return; +} + +// deletes the storage +void WMDRMDownloadBackend::deleteStore() +{ + return; +} + +// returns the size of stored data +qint64 WMDRMDownloadBackend::storedDataSize() +{ + return 0; +} + +void WMDRMDownloadBackend::bytesRecieved(qint64 /*bytesRecieved*/, qint64 /*bytesTotal*/) +{ + //Do nothing. This is here to avoid this signal to reach to base class' slot. + return; +} + +void WMDRMDownloadBackend::handleFinished() +{ + QByteArray data = m_downloadCore->reply()->readAll(); + TPtrC8 drmHeader((TUint8 *)(data.constData())); + // delete the persistant information if saved any + deleteInfo(); + + TRAPD(err, m_utility = CCameseUtility::NewL()); + if (err != KErrNone) { + markDownloadFailed(tr("General Error")); + return; + } + // Use the Camese Interface, passing in + // the DRM header url. Camese uses it for + // error reporting. + ASSERT( !m_contentUrl ); + QByteArray url = m_downloadCore->reply()->url().toEncoded(); + TPtrC8 s60Url((TUint8 *)(url.constData())); + + m_contentUrl = s60Url.Alloc(); + if (!m_contentUrl) { + markDownloadFailed(tr("General Error")); + return; + } + // post the event + postEvent(WMDRMLicenseAcquiring, NULL); + m_requestResult = KErrNone; + m_utility->AcquireLicense( drmHeader, m_contentUrl, iStatus ); + SetActive(); + // Wait for completion of the license aquisition + m_wait.Start(); + + // Check request results + if ( !m_requestResult ) { + if (!m_contentUrl || (m_contentUrl->Length() == 0)) { + markDownloadFailed(tr("File is corrupt")); + return; + } + } + else if (m_requestResult == KErrCancel) { + // Check if the content URL was correctly set. + markDownloadFailed(tr("Cancelled")); + return; + } + else { + // Check if the content URL was correctly set. + markDownloadFailed(tr("General Error")); + return; + } + + if ( m_contentUrl && m_contentUrl->CompareF( s60Url ) ) { + HBufC* s60str; + TRAPD(error, s60str = CnvUtfConverter::ConvertToUnicodeFromUtf8L(m_contentUrl->Des())); + if (error != KErrNone) { + markDownloadFailed(tr("General Error")); + return; + } + QString contentUrl = QString::fromUtf16(s60str->Ptr(),s60str->Length()); + delete s60str; + + QUrl qtUrl(contentUrl); + if (qtUrl.isValid()) { + deleteInfo(); + m_contentDownload = new ClientDownload(m_download->downloadManager(), contentUrl, m_download->id()); + if (!m_contentDownload) { + markDownloadFailed(tr("General Error")); + return; + } + // set the file name + m_download->attributes().insert(DlFileName, m_contentDownload->getAttribute(DlFileName)); + m_contentDownload->registerEventReceiver(this); + m_contentDownload->start(); + } else { + markDownloadFailed(tr("Malformed Url")); + return; + } + } else { + markDownloadFailed(tr("No valid redirection Url")); + return; + } + + // reset + delete m_contentUrl; + m_contentUrl = NULL; + + return; +} + +bool WMDRMDownloadBackend::event(QEvent *event) +{ + DEventType type = (DEventType)event->type(); + switch(type) { + case Started: + case HeaderReceived: + break; + case Progress: + { + QVariant tSize = m_contentDownload->getAttribute(DlTotalSize); + setTotalSize(tSize.toInt()); + QVariant curDlsize = m_contentDownload->getAttribute(DlDownloadedSize); + setDownloadedDataSize(curDlsize.toInt()); + setDownloadState(DlInprogress); + postEvent(Progress, NULL); + break; + } + case NetworkLoss: + { + postEvent(NetworkLoss, NULL); + break; + } + case Cancelled: + { + setDownloadState(DlCancelled); + postEvent(Cancelled, NULL); + break; + } + case Completed: + { + setDownloadState(DlCompleted); + postEvent(Completed, NULL); + break; + } + case Error: + { + setDownloadState(DlFailed); + postEvent(Error, NULL); + break; + } + default: + break; + } + return true; +} + +void WMDRMDownloadBackend::markDownloadFailed(const QString& error) +{ + m_download->setError(error); + setDownloadState(DlFailed); + postEvent(Error, NULL); + return; +} + +void WMDRMDownloadBackend::RunL() +{ + TInt result( iStatus.Int() ); + // Handle request completion + m_requestResult = result; + // Stop Wait loop + m_wait.AsyncStop(); +} + +void WMDRMDownloadBackend::DoCancel() +{ + m_utility->Cancel(); + // Cleanup + m_requestResult = KErrCancel; + // Stop Wait loop + m_wait.AsyncStop(); +} +