/* This file is part of the KDE project.
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
This library 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, either version 2.1 or 3 of the License.
This library 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 library. If not, see .
*/
#include "download.h"
#include "utils.h"
#include
#include
QT_BEGIN_NAMESPACE
using namespace Phonon;
using namespace Phonon::MMF;
static const TBool InheritDownloads = EFalse;
DownloadPrivate::DownloadPrivate(Download *parent)
: QObject(parent)
, m_parent(parent)
, m_download(0)
, m_length(0)
{
}
DownloadPrivate::~DownloadPrivate()
{
m_downloadManager.Disconnect();
m_downloadManager.Close();
}
bool DownloadPrivate::start()
{
TRACE_CONTEXT(DownloadPrivate::start, EVideoApi);
Q_ASSERT(!m_download);
// Connect to download manager
RProcess process;
const TUid uid3 = process.SecureId();
TRAPD(err, m_downloadManager.ConnectL(uid3, *this, InheritDownloads));
TRACE("connect err %d", err);
if (KErrNone == err) {
// Start download
QHBufC url(m_parent->sourceUrl().toString());
TPtr8 url8 = url->Des().Collapse();
TRAP(err, m_download = &m_downloadManager.CreateDownloadL(url8));
TRACE("start err %d", err);
if (KErrNone == err)
m_download->Start();
}
return (KErrNone == err);
}
void DownloadPrivate::resume()
{
}
void DownloadPrivate::HandleDMgrEventL(RHttpDownload &aDownload, THttpDownloadEvent aEvent)
{
TRACE_CONTEXT(DownloadPrivate::HandleDMgrEventL, EVideoApi);
Q_ASSERT(&aDownload == m_download);
switch (aEvent.iDownloadState) {
case EHttpDlPaused:
if (EHttpContentTypeReceived == aEvent.iProgressState) {
TRACE_0("paused, content type received");
m_download->Start();
}
break;
case EHttpDlInprogress:
switch (aEvent.iProgressState) {
case EHttpProgResponseHeaderReceived:
{
TFileName fileName;
m_download->GetStringAttribute(EDlAttrDestFilename, fileName);
TRACE("in progress, response header received, filename %S", &fileName);
const QString fileNameQt = QDir::fromNativeSeparators(qt_TDesC2QString(fileName));
m_parent->downloadStarted(fileNameQt);
}
break;
case EHttpProgResponseBodyReceived:
{
TInt32 length = 0;
m_download->GetIntAttribute(EDlAttrDownloadedSize, length);
if (length != m_length) {
TRACE("in progress, length %d", length);
m_length = length;
emit lengthChanged(m_length);
}
}
break;
}
break;
case EHttpDlCompleted:
TRACE_0("complete");
m_parent->complete();
break;
case EHttpDlFailed:
TRACE_0("failed");
m_parent->error();
break;
}
}
Download::Download(const QUrl &url, QObject *parent)
: QObject(parent)
, m_private(new DownloadPrivate(this))
, m_sourceUrl(url)
, m_state(Idle)
{
qRegisterMetaType();
connect(m_private, SIGNAL(lengthChanged(qint64)), this, SIGNAL(lengthChanged(qint64)));
}
Download::~Download()
{
}
const QUrl &Download::sourceUrl() const
{
return m_sourceUrl;
}
const QString &Download::targetFileName() const
{
return m_targetFileName;
}
void Download::start()
{
TRACE_CONTEXT(Download::start, EVideoApi);
TRACE_ENTRY_0();
Q_ASSERT(Idle == m_state);
const bool ok = m_private->start();
setState(ok ? Initializing : Error);
TRACE_EXIT_0();
}
void Download::resume()
{
TRACE_CONTEXT(Download::resume, EVideoApi);
TRACE_ENTRY_0();
m_private->resume();
TRACE_EXIT_0();
}
void Download::setState(State state)
{
TRACE_CONTEXT(Download::setState, EVideoApi);
TRACE("oldState %d newState %d", m_state, state);
const State oldState = m_state;
m_state = state;
if (oldState != m_state)
emit stateChanged(m_state);
}
void Download::error()
{
TRACE_CONTEXT(Download::error, EVideoApi);
TRACE_0("");
setState(Error);
}
void Download::downloadStarted(const QString &targetFileName)
{
TRACE_CONTEXT(Download::downloadStarted, EVideoApi);
TRACE_0("downloadStarted");
m_targetFileName = targetFileName;
setState(Downloading);
}
void Download::complete()
{
TRACE_CONTEXT(Download::complete, EVideoApi);
TRACE_0("");
setState(Complete);
}
QT_END_NAMESPACE