utilities/downloadmanager/src/backgrounddownloadmanager.cpp
author hgs
Fri, 15 Oct 2010 17:30:59 -0400
changeset 16 3c88a81ff781
permissions -rw-r--r--
201041

/**
   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 <http://www.gnu.org/licenses/>.
*/

#include "downloadmanager.h"
#include "backgrounddownloadmanager.h"
#include "download.h"
#include "backgrounddownload.h"
#include "downloadmanagerclient.h"
#include "downloadevent.h"
#include "downloadinfo.h"
#include <QHash>
#include <QCoreApplication>
#include <QNetworkReply>

class BackgroundDownloadManagerPrivate
{
    //declare public implementation
    DM_DECLARE_PUBLIC(BackgroundDownloadManager);
public:
    BackgroundDownloadManagerPrivate();
    ~BackgroundDownloadManagerPrivate();

    QList<Download*> m_downloads; // list of downloads
    QString m_clientName; // client name
    QObject *m_receiver; // event reciever
    DownloadManager* m_downloadMgr; // not owned
    DownloadManagerClient* m_downloadMgrClient; // owned
    DownloadInfo* m_dlInfo; // not owned
};

BackgroundDownloadManagerPrivate::BackgroundDownloadManagerPrivate()
{
    m_clientName = "";
    m_receiver = 0;
    m_downloadMgr = 0;
    m_downloadMgrClient = 0;
}

BackgroundDownloadManagerPrivate::~BackgroundDownloadManagerPrivate()
{
    if (m_downloadMgrClient) {
        delete m_downloadMgrClient;
        m_downloadMgrClient = 0;
    }
    m_downloadMgr = 0;
    m_downloads.clear();
}

BackgroundDownloadManager::BackgroundDownloadManager(DownloadManager* downloadMgr)
{
    DM_INITIALIZE(BackgroundDownloadManager);
    priv->m_downloadMgr = downloadMgr;
    if (downloadMgr) {
        priv->m_clientName = downloadMgr->getAttribute(DlMgrClientName).toString();
        priv->m_dlInfo = downloadMgr->downloadInfo();
    }
}

// destructor for the download manager
BackgroundDownloadManager::~BackgroundDownloadManager()
{
    DM_UNINITIALIZE(BackgroundDownloadManager);
}

// initialises all the downloads which belongs to last download manager session
void BackgroundDownloadManager::init()
{
    //load all downloads which were created in the last session
    return;
}

// returns new download
// url indicates download url
Download* BackgroundDownloadManager::createDownload(const QString& url, DownloadType type)
{
    if (url.isEmpty())
        return NULL;

    DM_PRIVATE(BackgroundDownloadManager);
    // connection to server will be established whrn DownloadManagerClient object is created
    // so we delay the constructon of this object till client calls some function
    if (!priv->m_downloadMgrClient)
        priv->m_downloadMgrClient = new DownloadManagerClient(priv->m_downloadMgr);
    // create downlaod at server
    int downloadId = priv->m_downloadMgrClient->createDownload(url, type);
    if (downloadId == INVALID_DL_ID)
        return NULL;
    Download* dl = new BackgroundDownload(priv->m_downloadMgr, url, downloadId);
    if (dl)
        priv->m_downloads.append(dl);
    return dl;
}

// creates the background download from the persistantly stored download info
Download* BackgroundDownloadManager::createDownload(int id)
{
    DM_PRIVATE(BackgroundDownloadManager);

    if ((id == INVALID_DL_ID) || (!priv->m_dlInfo))
        return NULL;

    // connection to server will be established when DownloadManagerClient object is created
    // so we delay the constructon of this object till client calls some function
    if (!priv->m_downloadMgrClient)
        priv->m_downloadMgrClient = new DownloadManagerClient(priv->m_downloadMgr);
    QString url;
    priv->m_dlInfo->getValue(id, DownloadInfo::EUrl, url);
    // create downlaod at server
    bool status = priv->m_downloadMgrClient->attachToDownload(id);
    if (status == false) {
        // this means, download no more exists in server side
        priv->m_dlInfo->remove(id);
        return NULL;
    }
    Download* dl = new BackgroundDownload(priv->m_downloadMgr, url, id);
    if (dl)               
        priv->m_downloads.append(dl);
    return dl;
}

// sets the proxy
// proxyServer indicates proxy server name
// port indicates port number
void BackgroundDownloadManager::setProxy(const QString& proxyServer, int port)
{
    if (!proxyServer.isEmpty()) {
        DM_PRIVATE(BackgroundDownloadManager);
        // connection to server will be established whrn DownloadManagerClient object is created
    // so we delay the constructon of this object till client calls some function
        if (!priv->m_downloadMgrClient)
            priv->m_downloadMgrClient = new DownloadManagerClient(priv->m_downloadMgr);
        priv->m_downloadMgrClient->setProxy(proxyServer, port);
    }
}

// sets download manager attribute
// attr indicates download manager attribute
// value indicates value to be set
int BackgroundDownloadManager::setAttribute(DownloadManagerAttribute attr, const QVariant& value)
{
    // remove build warnings
    DM_PRIVATE(BackgroundDownloadManager);
    if (!priv->m_downloadMgrClient)
        return -1;
    int returnValue = priv->m_downloadMgrClient->setDownloadManagerAttribute(attr, value);
    return returnValue;
}

// fetches download manager attribute
// attr indicates download manager attribute whos value to be returned
QVariant BackgroundDownloadManager::getAttribute(DownloadManagerAttribute attr)
{
    DM_PRIVATE(BackgroundDownloadManager);
    if (!priv->m_downloadMgrClient)
        return QVariant();

    // if download manager error, return the last client-server error
    switch(attr) {
    case DlMgrServerError:
        return QVariant(priv->m_downloadMgrClient->serverError());
    default:
        break;
    }

    QVariant value = priv->m_downloadMgrClient->getDownloadManagerAttribute(attr);
    return value;
}

// returns all the current downloads
QList<Download*>& BackgroundDownloadManager::currentDownloads()
{
    DM_PRIVATE(BackgroundDownloadManager);
    return priv->m_downloads;
}

// finds a download provided id if exists
// id indicates identifier for download
Download* BackgroundDownloadManager::findDownload(int dlId)
{
    DM_PRIVATE(BackgroundDownloadManager);
    for (int i=0; i<priv->m_downloads.count(); ++i) {
        if (priv->m_downloads[i]->id() == dlId) {
            return priv->m_downloads[i];
        }
    }
    return 0;
}

// cancels all the downloads
void BackgroundDownloadManager::removeAll()
{
    DM_PRIVATE(BackgroundDownloadManager);
    if (!priv->m_downloadMgrClient)
        return;

    // before removing all downloads, remove their downloadinfo
    for (int i=0; i<priv->m_downloads.count(); ++i) {
        BackgroundDownload* download = dynamic_cast<BackgroundDownload*>(priv->m_downloads[i]);
        if (download)
            download->removeDownloadInfo();
    }

    priv->m_downloadMgrClient->removeAll();
    for (int i=0; i<priv->m_downloads.count(); ++i) {
        delete (priv->m_downloads[i]);
        priv->m_downloads[i] = 0;
    }
    priv->m_downloads.clear();
}

// cancels and removes the download
// dl indicates the download to be canceled and removed
void BackgroundDownloadManager::removeOne(Download* dl)
{
    // check if download exists
    if (!dl)
        return;

    DM_PRIVATE(BackgroundDownloadManager);
    // return if download manager client does not exist yet
    if (!priv->m_downloadMgrClient)
        return;
    // if this is a background download, remove it
    if (priv->m_downloads.contains(dl)) {
        priv->m_downloadMgrClient->removeDownload(dl->id());
        priv->m_downloads.removeOne(dl);
    }
}

// pauses all the downloads which are in progress
void BackgroundDownloadManager::pauseAll()
{
    DM_PRIVATE(BackgroundDownloadManager);
    if (priv->m_downloadMgrClient)
        priv->m_downloadMgrClient->pauseAll();
}

// resumes all the downloads which are paused
void BackgroundDownloadManager::resumeAll()
{
    DM_PRIVATE(BackgroundDownloadManager);
    if (priv->m_downloadMgrClient)
        priv->m_downloadMgrClient->resumeAll();
}

// get download manager client object
DownloadManagerClient* BackgroundDownloadManager::downloadManagerClient()
{
    DM_PRIVATE(BackgroundDownloadManager);
    return priv->m_downloadMgrClient;
}