utilities/downloadmanager/src/backgrounddownloadmanager.cpp
author hgs
Fri, 15 Oct 2010 17:30:59 -0400
changeset 16 3c88a81ff781
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16
hgs
parents:
diff changeset
     1
/**
hgs
parents:
diff changeset
     2
   This file is part of CWRT package **
hgs
parents:
diff changeset
     3
hgs
parents:
diff changeset
     4
   Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). **
hgs
parents:
diff changeset
     5
hgs
parents:
diff changeset
     6
   This program is free software: you can redistribute it and/or modify
hgs
parents:
diff changeset
     7
   it under the terms of the GNU (Lesser) General Public License as
hgs
parents:
diff changeset
     8
   published by the Free Software Foundation, version 2.1 of the License.
hgs
parents:
diff changeset
     9
   This program is distributed in the hope that it will be useful, but
hgs
parents:
diff changeset
    10
   WITHOUT ANY WARRANTY; without even the implied warranty of
hgs
parents:
diff changeset
    11
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
hgs
parents:
diff changeset
    12
   (Lesser) General Public License for more details. You should have
hgs
parents:
diff changeset
    13
   received a copy of the GNU (Lesser) General Public License along
hgs
parents:
diff changeset
    14
   with this program. If not, see <http://www.gnu.org/licenses/>.
hgs
parents:
diff changeset
    15
*/
hgs
parents:
diff changeset
    16
hgs
parents:
diff changeset
    17
#include "downloadmanager.h"
hgs
parents:
diff changeset
    18
#include "backgrounddownloadmanager.h"
hgs
parents:
diff changeset
    19
#include "download.h"
hgs
parents:
diff changeset
    20
#include "backgrounddownload.h"
hgs
parents:
diff changeset
    21
#include "downloadmanagerclient.h"
hgs
parents:
diff changeset
    22
#include "downloadevent.h"
hgs
parents:
diff changeset
    23
#include "downloadinfo.h"
hgs
parents:
diff changeset
    24
#include <QHash>
hgs
parents:
diff changeset
    25
#include <QCoreApplication>
hgs
parents:
diff changeset
    26
#include <QNetworkReply>
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
class BackgroundDownloadManagerPrivate
hgs
parents:
diff changeset
    29
{
hgs
parents:
diff changeset
    30
    //declare public implementation
hgs
parents:
diff changeset
    31
    DM_DECLARE_PUBLIC(BackgroundDownloadManager);
hgs
parents:
diff changeset
    32
public:
hgs
parents:
diff changeset
    33
    BackgroundDownloadManagerPrivate();
hgs
parents:
diff changeset
    34
    ~BackgroundDownloadManagerPrivate();
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
    QList<Download*> m_downloads; // list of downloads
hgs
parents:
diff changeset
    37
    QString m_clientName; // client name
hgs
parents:
diff changeset
    38
    QObject *m_receiver; // event reciever
hgs
parents:
diff changeset
    39
    DownloadManager* m_downloadMgr; // not owned
hgs
parents:
diff changeset
    40
    DownloadManagerClient* m_downloadMgrClient; // owned
hgs
parents:
diff changeset
    41
    DownloadInfo* m_dlInfo; // not owned
hgs
parents:
diff changeset
    42
};
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
BackgroundDownloadManagerPrivate::BackgroundDownloadManagerPrivate()
hgs
parents:
diff changeset
    45
{
hgs
parents:
diff changeset
    46
    m_clientName = "";
hgs
parents:
diff changeset
    47
    m_receiver = 0;
hgs
parents:
diff changeset
    48
    m_downloadMgr = 0;
hgs
parents:
diff changeset
    49
    m_downloadMgrClient = 0;
hgs
parents:
diff changeset
    50
}
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
BackgroundDownloadManagerPrivate::~BackgroundDownloadManagerPrivate()
hgs
parents:
diff changeset
    53
{
hgs
parents:
diff changeset
    54
    if (m_downloadMgrClient) {
hgs
parents:
diff changeset
    55
        delete m_downloadMgrClient;
hgs
parents:
diff changeset
    56
        m_downloadMgrClient = 0;
hgs
parents:
diff changeset
    57
    }
hgs
parents:
diff changeset
    58
    m_downloadMgr = 0;
hgs
parents:
diff changeset
    59
    m_downloads.clear();
hgs
parents:
diff changeset
    60
}
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
BackgroundDownloadManager::BackgroundDownloadManager(DownloadManager* downloadMgr)
hgs
parents:
diff changeset
    63
{
hgs
parents:
diff changeset
    64
    DM_INITIALIZE(BackgroundDownloadManager);
hgs
parents:
diff changeset
    65
    priv->m_downloadMgr = downloadMgr;
hgs
parents:
diff changeset
    66
    if (downloadMgr) {
hgs
parents:
diff changeset
    67
        priv->m_clientName = downloadMgr->getAttribute(DlMgrClientName).toString();
hgs
parents:
diff changeset
    68
        priv->m_dlInfo = downloadMgr->downloadInfo();
hgs
parents:
diff changeset
    69
    }
hgs
parents:
diff changeset
    70
}
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
// destructor for the download manager
hgs
parents:
diff changeset
    73
BackgroundDownloadManager::~BackgroundDownloadManager()
hgs
parents:
diff changeset
    74
{
hgs
parents:
diff changeset
    75
    DM_UNINITIALIZE(BackgroundDownloadManager);
hgs
parents:
diff changeset
    76
}
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
// initialises all the downloads which belongs to last download manager session
hgs
parents:
diff changeset
    79
void BackgroundDownloadManager::init()
hgs
parents:
diff changeset
    80
{
hgs
parents:
diff changeset
    81
    //load all downloads which were created in the last session
hgs
parents:
diff changeset
    82
    return;
hgs
parents:
diff changeset
    83
}
hgs
parents:
diff changeset
    84
hgs
parents:
diff changeset
    85
// returns new download
hgs
parents:
diff changeset
    86
// url indicates download url
hgs
parents:
diff changeset
    87
Download* BackgroundDownloadManager::createDownload(const QString& url, DownloadType type)
hgs
parents:
diff changeset
    88
{
hgs
parents:
diff changeset
    89
    if (url.isEmpty())
hgs
parents:
diff changeset
    90
        return NULL;
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
    DM_PRIVATE(BackgroundDownloadManager);
hgs
parents:
diff changeset
    93
    // connection to server will be established whrn DownloadManagerClient object is created
hgs
parents:
diff changeset
    94
    // so we delay the constructon of this object till client calls some function
hgs
parents:
diff changeset
    95
    if (!priv->m_downloadMgrClient)
hgs
parents:
diff changeset
    96
        priv->m_downloadMgrClient = new DownloadManagerClient(priv->m_downloadMgr);
hgs
parents:
diff changeset
    97
    // create downlaod at server
hgs
parents:
diff changeset
    98
    int downloadId = priv->m_downloadMgrClient->createDownload(url, type);
hgs
parents:
diff changeset
    99
    if (downloadId == INVALID_DL_ID)
hgs
parents:
diff changeset
   100
        return NULL;
hgs
parents:
diff changeset
   101
    Download* dl = new BackgroundDownload(priv->m_downloadMgr, url, downloadId);
hgs
parents:
diff changeset
   102
    if (dl)
hgs
parents:
diff changeset
   103
        priv->m_downloads.append(dl);
hgs
parents:
diff changeset
   104
    return dl;
hgs
parents:
diff changeset
   105
}
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
// creates the background download from the persistantly stored download info
hgs
parents:
diff changeset
   108
Download* BackgroundDownloadManager::createDownload(int id)
hgs
parents:
diff changeset
   109
{
hgs
parents:
diff changeset
   110
    DM_PRIVATE(BackgroundDownloadManager);
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
    if ((id == INVALID_DL_ID) || (!priv->m_dlInfo))
hgs
parents:
diff changeset
   113
        return NULL;
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
    // connection to server will be established when DownloadManagerClient object is created
hgs
parents:
diff changeset
   116
    // so we delay the constructon of this object till client calls some function
hgs
parents:
diff changeset
   117
    if (!priv->m_downloadMgrClient)
hgs
parents:
diff changeset
   118
        priv->m_downloadMgrClient = new DownloadManagerClient(priv->m_downloadMgr);
hgs
parents:
diff changeset
   119
    QString url;
hgs
parents:
diff changeset
   120
    priv->m_dlInfo->getValue(id, DownloadInfo::EUrl, url);
hgs
parents:
diff changeset
   121
    // create downlaod at server
hgs
parents:
diff changeset
   122
    bool status = priv->m_downloadMgrClient->attachToDownload(id);
hgs
parents:
diff changeset
   123
    if (status == false) {
hgs
parents:
diff changeset
   124
        // this means, download no more exists in server side
hgs
parents:
diff changeset
   125
        priv->m_dlInfo->remove(id);
hgs
parents:
diff changeset
   126
        return NULL;
hgs
parents:
diff changeset
   127
    }
hgs
parents:
diff changeset
   128
    Download* dl = new BackgroundDownload(priv->m_downloadMgr, url, id);
hgs
parents:
diff changeset
   129
    if (dl)               
hgs
parents:
diff changeset
   130
        priv->m_downloads.append(dl);
hgs
parents:
diff changeset
   131
    return dl;
hgs
parents:
diff changeset
   132
}
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
// sets the proxy
hgs
parents:
diff changeset
   135
// proxyServer indicates proxy server name
hgs
parents:
diff changeset
   136
// port indicates port number
hgs
parents:
diff changeset
   137
void BackgroundDownloadManager::setProxy(const QString& proxyServer, int port)
hgs
parents:
diff changeset
   138
{
hgs
parents:
diff changeset
   139
    if (!proxyServer.isEmpty()) {
hgs
parents:
diff changeset
   140
        DM_PRIVATE(BackgroundDownloadManager);
hgs
parents:
diff changeset
   141
        // connection to server will be established whrn DownloadManagerClient object is created
hgs
parents:
diff changeset
   142
    // so we delay the constructon of this object till client calls some function
hgs
parents:
diff changeset
   143
        if (!priv->m_downloadMgrClient)
hgs
parents:
diff changeset
   144
            priv->m_downloadMgrClient = new DownloadManagerClient(priv->m_downloadMgr);
hgs
parents:
diff changeset
   145
        priv->m_downloadMgrClient->setProxy(proxyServer, port);
hgs
parents:
diff changeset
   146
    }
hgs
parents:
diff changeset
   147
}
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
// sets download manager attribute
hgs
parents:
diff changeset
   150
// attr indicates download manager attribute
hgs
parents:
diff changeset
   151
// value indicates value to be set
hgs
parents:
diff changeset
   152
int BackgroundDownloadManager::setAttribute(DownloadManagerAttribute attr, const QVariant& value)
hgs
parents:
diff changeset
   153
{
hgs
parents:
diff changeset
   154
    // remove build warnings
hgs
parents:
diff changeset
   155
    DM_PRIVATE(BackgroundDownloadManager);
hgs
parents:
diff changeset
   156
    if (!priv->m_downloadMgrClient)
hgs
parents:
diff changeset
   157
        return -1;
hgs
parents:
diff changeset
   158
    int returnValue = priv->m_downloadMgrClient->setDownloadManagerAttribute(attr, value);
hgs
parents:
diff changeset
   159
    return returnValue;
hgs
parents:
diff changeset
   160
}
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
// fetches download manager attribute
hgs
parents:
diff changeset
   163
// attr indicates download manager attribute whos value to be returned
hgs
parents:
diff changeset
   164
QVariant BackgroundDownloadManager::getAttribute(DownloadManagerAttribute attr)
hgs
parents:
diff changeset
   165
{
hgs
parents:
diff changeset
   166
    DM_PRIVATE(BackgroundDownloadManager);
hgs
parents:
diff changeset
   167
    if (!priv->m_downloadMgrClient)
hgs
parents:
diff changeset
   168
        return QVariant();
hgs
parents:
diff changeset
   169
hgs
parents:
diff changeset
   170
    // if download manager error, return the last client-server error
hgs
parents:
diff changeset
   171
    switch(attr) {
hgs
parents:
diff changeset
   172
    case DlMgrServerError:
hgs
parents:
diff changeset
   173
        return QVariant(priv->m_downloadMgrClient->serverError());
hgs
parents:
diff changeset
   174
    default:
hgs
parents:
diff changeset
   175
        break;
hgs
parents:
diff changeset
   176
    }
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
    QVariant value = priv->m_downloadMgrClient->getDownloadManagerAttribute(attr);
hgs
parents:
diff changeset
   179
    return value;
hgs
parents:
diff changeset
   180
}
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
// returns all the current downloads
hgs
parents:
diff changeset
   183
QList<Download*>& BackgroundDownloadManager::currentDownloads()
hgs
parents:
diff changeset
   184
{
hgs
parents:
diff changeset
   185
    DM_PRIVATE(BackgroundDownloadManager);
hgs
parents:
diff changeset
   186
    return priv->m_downloads;
hgs
parents:
diff changeset
   187
}
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
// finds a download provided id if exists
hgs
parents:
diff changeset
   190
// id indicates identifier for download
hgs
parents:
diff changeset
   191
Download* BackgroundDownloadManager::findDownload(int dlId)
hgs
parents:
diff changeset
   192
{
hgs
parents:
diff changeset
   193
    DM_PRIVATE(BackgroundDownloadManager);
hgs
parents:
diff changeset
   194
    for (int i=0; i<priv->m_downloads.count(); ++i) {
hgs
parents:
diff changeset
   195
        if (priv->m_downloads[i]->id() == dlId) {
hgs
parents:
diff changeset
   196
            return priv->m_downloads[i];
hgs
parents:
diff changeset
   197
        }
hgs
parents:
diff changeset
   198
    }
hgs
parents:
diff changeset
   199
    return 0;
hgs
parents:
diff changeset
   200
}
hgs
parents:
diff changeset
   201
hgs
parents:
diff changeset
   202
// cancels all the downloads
hgs
parents:
diff changeset
   203
void BackgroundDownloadManager::removeAll()
hgs
parents:
diff changeset
   204
{
hgs
parents:
diff changeset
   205
    DM_PRIVATE(BackgroundDownloadManager);
hgs
parents:
diff changeset
   206
    if (!priv->m_downloadMgrClient)
hgs
parents:
diff changeset
   207
        return;
hgs
parents:
diff changeset
   208
hgs
parents:
diff changeset
   209
    // before removing all downloads, remove their downloadinfo
hgs
parents:
diff changeset
   210
    for (int i=0; i<priv->m_downloads.count(); ++i) {
hgs
parents:
diff changeset
   211
        BackgroundDownload* download = dynamic_cast<BackgroundDownload*>(priv->m_downloads[i]);
hgs
parents:
diff changeset
   212
        if (download)
hgs
parents:
diff changeset
   213
            download->removeDownloadInfo();
hgs
parents:
diff changeset
   214
    }
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
    priv->m_downloadMgrClient->removeAll();
hgs
parents:
diff changeset
   217
    for (int i=0; i<priv->m_downloads.count(); ++i) {
hgs
parents:
diff changeset
   218
        delete (priv->m_downloads[i]);
hgs
parents:
diff changeset
   219
        priv->m_downloads[i] = 0;
hgs
parents:
diff changeset
   220
    }
hgs
parents:
diff changeset
   221
    priv->m_downloads.clear();
hgs
parents:
diff changeset
   222
}
hgs
parents:
diff changeset
   223
hgs
parents:
diff changeset
   224
// cancels and removes the download
hgs
parents:
diff changeset
   225
// dl indicates the download to be canceled and removed
hgs
parents:
diff changeset
   226
void BackgroundDownloadManager::removeOne(Download* dl)
hgs
parents:
diff changeset
   227
{
hgs
parents:
diff changeset
   228
    // check if download exists
hgs
parents:
diff changeset
   229
    if (!dl)
hgs
parents:
diff changeset
   230
        return;
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
    DM_PRIVATE(BackgroundDownloadManager);
hgs
parents:
diff changeset
   233
    // return if download manager client does not exist yet
hgs
parents:
diff changeset
   234
    if (!priv->m_downloadMgrClient)
hgs
parents:
diff changeset
   235
        return;
hgs
parents:
diff changeset
   236
    // if this is a background download, remove it
hgs
parents:
diff changeset
   237
    if (priv->m_downloads.contains(dl)) {
hgs
parents:
diff changeset
   238
        priv->m_downloadMgrClient->removeDownload(dl->id());
hgs
parents:
diff changeset
   239
        priv->m_downloads.removeOne(dl);
hgs
parents:
diff changeset
   240
    }
hgs
parents:
diff changeset
   241
}
hgs
parents:
diff changeset
   242
hgs
parents:
diff changeset
   243
// pauses all the downloads which are in progress
hgs
parents:
diff changeset
   244
void BackgroundDownloadManager::pauseAll()
hgs
parents:
diff changeset
   245
{
hgs
parents:
diff changeset
   246
    DM_PRIVATE(BackgroundDownloadManager);
hgs
parents:
diff changeset
   247
    if (priv->m_downloadMgrClient)
hgs
parents:
diff changeset
   248
        priv->m_downloadMgrClient->pauseAll();
hgs
parents:
diff changeset
   249
}
hgs
parents:
diff changeset
   250
hgs
parents:
diff changeset
   251
// resumes all the downloads which are paused
hgs
parents:
diff changeset
   252
void BackgroundDownloadManager::resumeAll()
hgs
parents:
diff changeset
   253
{
hgs
parents:
diff changeset
   254
    DM_PRIVATE(BackgroundDownloadManager);
hgs
parents:
diff changeset
   255
    if (priv->m_downloadMgrClient)
hgs
parents:
diff changeset
   256
        priv->m_downloadMgrClient->resumeAll();
hgs
parents:
diff changeset
   257
}
hgs
parents:
diff changeset
   258
hgs
parents:
diff changeset
   259
// get download manager client object
hgs
parents:
diff changeset
   260
DownloadManagerClient* BackgroundDownloadManager::downloadManagerClient()
hgs
parents:
diff changeset
   261
{
hgs
parents:
diff changeset
   262
    DM_PRIVATE(BackgroundDownloadManager);
hgs
parents:
diff changeset
   263
    return priv->m_downloadMgrClient;
hgs
parents:
diff changeset
   264
}