utilities/downloadmanager/src/downloadmanager.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 "download.h"
hgs
parents:
diff changeset
    19
#include "clientdownload.h"
hgs
parents:
diff changeset
    20
#include "downloadevent.h"
hgs
parents:
diff changeset
    21
#include "downloadinfo.h"
hgs
parents:
diff changeset
    22
#include "downloadcoremanager.h"
hgs
parents:
diff changeset
    23
#include "backgrounddownloadmanager.h"
hgs
parents:
diff changeset
    24
#include "paralleldownloadmanager.h"
hgs
parents:
diff changeset
    25
#include "sequentialdownloadmanager.h"
hgs
parents:
diff changeset
    26
#include <QNetworkReply>
hgs
parents:
diff changeset
    27
#include <QNetworkProxy>
hgs
parents:
diff changeset
    28
#include <QList>
hgs
parents:
diff changeset
    29
#include <QDir>
hgs
parents:
diff changeset
    30
#include <QCoreApplication>
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
// defualt download path
hgs
parents:
diff changeset
    33
#define DOWNLOAD_PATH QDir::homePath() + QObject::tr("/Downloads")
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
class DownloadManagerPrivate
hgs
parents:
diff changeset
    36
{
hgs
parents:
diff changeset
    37
    //declare public implementation
hgs
parents:
diff changeset
    38
    DM_DECLARE_PUBLIC(DownloadManager);
hgs
parents:
diff changeset
    39
public:
hgs
parents:
diff changeset
    40
    DownloadManagerPrivate();
hgs
parents:
diff changeset
    41
    ~DownloadManagerPrivate();
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
    QString m_clientName; // client name
hgs
parents:
diff changeset
    44
    QNetworkProxy *m_proxy;
hgs
parents:
diff changeset
    45
    QObject *m_receiver; // event reciever
hgs
parents:
diff changeset
    46
    DownloadInfo *m_dlInfo;
hgs
parents:
diff changeset
    47
    DownloadCoreManager *m_dlCoreManager; // manages all the download cores
hgs
parents:
diff changeset
    48
    QString m_destPath; // download destination path
hgs
parents:
diff changeset
    49
    BackgroundDownloadManager* m_backgroundManager;
hgs
parents:
diff changeset
    50
    ParallelDownloadManager *m_parallelManager; // manages parallel downloads
hgs
parents:
diff changeset
    51
    SequentialDownloadManager *m_sequentialManager; // manages sequential downloads
hgs
parents:
diff changeset
    52
    QList<Download*> m_totalDownloads; // has a list of both parallel and sequential downloads, but doesnt own it
hgs
parents:
diff changeset
    53
    DownloadMgrProgressMode m_progressMode;
hgs
parents:
diff changeset
    54
    DownloadMgrPersistantMode m_persistantMode;
hgs
parents:
diff changeset
    55
};
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
DownloadManagerPrivate::DownloadManagerPrivate()
hgs
parents:
diff changeset
    58
{
hgs
parents:
diff changeset
    59
    m_clientName = "";
hgs
parents:
diff changeset
    60
    m_proxy = 0;
hgs
parents:
diff changeset
    61
    m_receiver = 0;
hgs
parents:
diff changeset
    62
    m_dlInfo = 0;
hgs
parents:
diff changeset
    63
    m_dlCoreManager = 0;
hgs
parents:
diff changeset
    64
    // set the download destination path to default path
hgs
parents:
diff changeset
    65
    m_destPath = DOWNLOAD_PATH;
hgs
parents:
diff changeset
    66
    m_backgroundManager = 0;
hgs
parents:
diff changeset
    67
    m_parallelManager = 0;
hgs
parents:
diff changeset
    68
    m_sequentialManager = 0;
hgs
parents:
diff changeset
    69
    m_progressMode = NonQuiet;
hgs
parents:
diff changeset
    70
    m_persistantMode = Active;
hgs
parents:
diff changeset
    71
}
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
DownloadManagerPrivate::~DownloadManagerPrivate()
hgs
parents:
diff changeset
    74
{
hgs
parents:
diff changeset
    75
    if(m_sequentialManager)
hgs
parents:
diff changeset
    76
    {
hgs
parents:
diff changeset
    77
        delete m_sequentialManager;
hgs
parents:
diff changeset
    78
        m_sequentialManager = 0;
hgs
parents:
diff changeset
    79
    }
hgs
parents:
diff changeset
    80
    if(m_parallelManager)
hgs
parents:
diff changeset
    81
    {
hgs
parents:
diff changeset
    82
        delete m_parallelManager;
hgs
parents:
diff changeset
    83
        m_parallelManager = 0;
hgs
parents:
diff changeset
    84
    }
hgs
parents:
diff changeset
    85
    if (m_backgroundManager)
hgs
parents:
diff changeset
    86
    {
hgs
parents:
diff changeset
    87
        delete m_backgroundManager;
hgs
parents:
diff changeset
    88
        m_backgroundManager = 0;
hgs
parents:
diff changeset
    89
    }
hgs
parents:
diff changeset
    90
    if(m_proxy)
hgs
parents:
diff changeset
    91
    {
hgs
parents:
diff changeset
    92
        delete m_proxy;
hgs
parents:
diff changeset
    93
        m_proxy = 0;
hgs
parents:
diff changeset
    94
    }
hgs
parents:
diff changeset
    95
    if(m_dlInfo)
hgs
parents:
diff changeset
    96
    {
hgs
parents:
diff changeset
    97
        m_dlInfo->update();
hgs
parents:
diff changeset
    98
        delete m_dlInfo;
hgs
parents:
diff changeset
    99
        m_dlInfo = 0;
hgs
parents:
diff changeset
   100
    }
hgs
parents:
diff changeset
   101
    if(m_dlCoreManager)
hgs
parents:
diff changeset
   102
    {
hgs
parents:
diff changeset
   103
        delete m_dlCoreManager;
hgs
parents:
diff changeset
   104
        m_dlCoreManager = 0;
hgs
parents:
diff changeset
   105
    }
hgs
parents:
diff changeset
   106
}
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
/*!
hgs
parents:
diff changeset
   109
 * \class DownloadManager
hgs
parents:
diff changeset
   110
 *
hgs
parents:
diff changeset
   111
 * \brief The public APIs for managing the downloads
hgs
parents:
diff changeset
   112
 *
hgs
parents:
diff changeset
   113
 * This class has the public APIs for managing the downloads
hgs
parents:
diff changeset
   114
 */
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
/*!
hgs
parents:
diff changeset
   117
  creates an instance of download manager
hgs
parents:
diff changeset
   118
  \a clientName indicates the name of the client
hgs
parents:
diff changeset
   119
*/
hgs
parents:
diff changeset
   120
Q_DECL_EXPORT DownloadManager::DownloadManager(const QString& clientName)
hgs
parents:
diff changeset
   121
{
hgs
parents:
diff changeset
   122
    DM_INITIALIZE(DownloadManager);
hgs
parents:
diff changeset
   123
    priv->m_clientName = clientName;
hgs
parents:
diff changeset
   124
    //create a download info to save download informations
hgs
parents:
diff changeset
   125
    priv->m_dlInfo = new DownloadInfo(clientName);
hgs
parents:
diff changeset
   126
    // create download core manager
hgs
parents:
diff changeset
   127
    priv->m_dlCoreManager = new DownloadCoreManager(clientName);
hgs
parents:
diff changeset
   128
    // create background download manager
hgs
parents:
diff changeset
   129
    priv->m_backgroundManager = new BackgroundDownloadManager(this);
hgs
parents:
diff changeset
   130
    // create parallel download manager
hgs
parents:
diff changeset
   131
    priv->m_parallelManager = new ParallelDownloadManager();
hgs
parents:
diff changeset
   132
    // create sequential download manager
hgs
parents:
diff changeset
   133
    priv->m_sequentialManager = new SequentialDownloadManager();
hgs
parents:
diff changeset
   134
}
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
/*!
hgs
parents:
diff changeset
   137
  destructor for the download manager
hgs
parents:
diff changeset
   138
*/
hgs
parents:
diff changeset
   139
Q_DECL_EXPORT DownloadManager::~DownloadManager()
hgs
parents:
diff changeset
   140
{
hgs
parents:
diff changeset
   141
    DM_UNINITIALIZE(DownloadManager);
hgs
parents:
diff changeset
   142
}
hgs
parents:
diff changeset
   143
hgs
parents:
diff changeset
   144
/*!
hgs
parents:
diff changeset
   145
  initialises all the downloads which belongs to last download manager session
hgs
parents:
diff changeset
   146
*/
hgs
parents:
diff changeset
   147
Q_DECL_EXPORT void DownloadManager::init()
hgs
parents:
diff changeset
   148
{
hgs
parents:
diff changeset
   149
    //load all downloads which were created in the last session
hgs
parents:
diff changeset
   150
    loadAllDownloads();
hgs
parents:
diff changeset
   151
}
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
/*!
hgs
parents:
diff changeset
   154
  returns new download
hgs
parents:
diff changeset
   155
  \a url indicates download url
hgs
parents:
diff changeset
   156
  \a type indicates whether it is sequential or parallel download
hgs
parents:
diff changeset
   157
*/
hgs
parents:
diff changeset
   158
Q_DECL_EXPORT Download* DownloadManager::createDownload(const QString& url, DownloadType type/*=Parallel*/, DownloadScope scope/*=Normal*/)
hgs
parents:
diff changeset
   159
{
hgs
parents:
diff changeset
   160
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   161
    if(url == "")
hgs
parents:
diff changeset
   162
        return NULL;
hgs
parents:
diff changeset
   163
    Download* dl(0);
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
    if (scope == Normal) {
hgs
parents:
diff changeset
   166
        dl = new ClientDownload(this, url, generateDlId());
hgs
parents:
diff changeset
   167
        if(type == Parallel)
hgs
parents:
diff changeset
   168
            priv->m_parallelManager->addToParallelDownload(dl);
hgs
parents:
diff changeset
   169
        else if(type == Sequential) {
hgs
parents:
diff changeset
   170
            // by default the priority is low
hgs
parents:
diff changeset
   171
            dl->setAttribute(DlPriority, (int)Low);
hgs
parents:
diff changeset
   172
            priv->m_sequentialManager->addToSequentialDownload(dl);
hgs
parents:
diff changeset
   173
        }
hgs
parents:
diff changeset
   174
        postEvent(DownloadCreated, NULL);
hgs
parents:
diff changeset
   175
    }
hgs
parents:
diff changeset
   176
    else if (scope == Background) {
hgs
parents:
diff changeset
   177
        dl = priv->m_backgroundManager->createDownload(url, type);
hgs
parents:
diff changeset
   178
    }
hgs
parents:
diff changeset
   179
    return dl;
hgs
parents:
diff changeset
   180
}
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
/*!
hgs
parents:
diff changeset
   183
  returns new download
hgs
parents:
diff changeset
   184
  \a reply indicates network reply which is already initiated
hgs
parents:
diff changeset
   185
*/
hgs
parents:
diff changeset
   186
Q_DECL_EXPORT Download* DownloadManager::createDownload(QNetworkReply *reply)
hgs
parents:
diff changeset
   187
{
hgs
parents:
diff changeset
   188
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   189
    if(!reply)
hgs
parents:
diff changeset
   190
        return NULL;
hgs
parents:
diff changeset
   191
    ClientDownload *dl = new ClientDownload(this, reply, generateDlId());
hgs
parents:
diff changeset
   192
    priv->m_parallelManager->addToParallelDownload(dl);
hgs
parents:
diff changeset
   193
    postEvent(DownloadCreated, NULL);
hgs
parents:
diff changeset
   194
    return dl;
hgs
parents:
diff changeset
   195
}
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
Download* DownloadManager::createDownload(int dlId, DownloadScope scope)
hgs
parents:
diff changeset
   198
{
hgs
parents:
diff changeset
   199
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   200
    if(dlId == INVALID_DL_ID)
hgs
parents:
diff changeset
   201
        return NULL;
hgs
parents:
diff changeset
   202
    Download *dl = NULL;
hgs
parents:
diff changeset
   203
    if (scope == Normal){
hgs
parents:
diff changeset
   204
        dl = new ClientDownload(this, dlId);
hgs
parents:
diff changeset
   205
        DownloadType type = (DownloadType)(dl->getAttribute(DlDownloadType).toInt());
hgs
parents:
diff changeset
   206
        if(type == Parallel)
hgs
parents:
diff changeset
   207
            priv->m_parallelManager->addToParallelDownload(dl);
hgs
parents:
diff changeset
   208
        else
hgs
parents:
diff changeset
   209
            priv->m_sequentialManager->addToSequentialDownload(dl);
hgs
parents:
diff changeset
   210
    } else if (scope == Background){
hgs
parents:
diff changeset
   211
        dl = priv->m_backgroundManager->createDownload(dlId);
hgs
parents:
diff changeset
   212
    } else
hgs
parents:
diff changeset
   213
        return NULL;
hgs
parents:
diff changeset
   214
     
hgs
parents:
diff changeset
   215
    if (dl)
hgs
parents:
diff changeset
   216
         postEvent(DownloadCreated, NULL);
hgs
parents:
diff changeset
   217
    return dl;
hgs
parents:
diff changeset
   218
}
hgs
parents:
diff changeset
   219
hgs
parents:
diff changeset
   220
/*!
hgs
parents:
diff changeset
   221
  sets the proxy
hgs
parents:
diff changeset
   222
  \a proxyServer indicates proxy server name
hgs
parents:
diff changeset
   223
  \a port indicates port number
hgs
parents:
diff changeset
   224
*/
hgs
parents:
diff changeset
   225
Q_DECL_EXPORT void DownloadManager::setProxy(const QString& proxyServer, int port)
hgs
parents:
diff changeset
   226
{
hgs
parents:
diff changeset
   227
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   228
    if(priv->m_proxy)
hgs
parents:
diff changeset
   229
    {
hgs
parents:
diff changeset
   230
        delete priv->m_proxy;
hgs
parents:
diff changeset
   231
        priv->m_proxy = 0;
hgs
parents:
diff changeset
   232
    }
hgs
parents:
diff changeset
   233
    priv->m_proxy = new QNetworkProxy(QNetworkProxy::HttpCachingProxy, proxyServer, port );
hgs
parents:
diff changeset
   234
    return;
hgs
parents:
diff changeset
   235
}
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
/*!
hgs
parents:
diff changeset
   238
  registers event listener
hgs
parents:
diff changeset
   239
  \a reciever indicates reciever object to be registered for download events
hgs
parents:
diff changeset
   240
*/
hgs
parents:
diff changeset
   241
Q_DECL_EXPORT void DownloadManager::registerEventReceiver(QObject *receiver)
hgs
parents:
diff changeset
   242
{
hgs
parents:
diff changeset
   243
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   244
    if (receiver)
hgs
parents:
diff changeset
   245
        priv->m_receiver = receiver;
hgs
parents:
diff changeset
   246
    return;
hgs
parents:
diff changeset
   247
}
hgs
parents:
diff changeset
   248
hgs
parents:
diff changeset
   249
/*!
hgs
parents:
diff changeset
   250
  unregister event listener
hgs
parents:
diff changeset
   251
  \a reciever indicates reciever object to be unregistered
hgs
parents:
diff changeset
   252
*/
hgs
parents:
diff changeset
   253
Q_DECL_EXPORT void DownloadManager::unregisterEventReceiver(QObject *receiver)
hgs
parents:
diff changeset
   254
{
hgs
parents:
diff changeset
   255
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   256
    if(receiver == priv->m_receiver)
hgs
parents:
diff changeset
   257
    {
hgs
parents:
diff changeset
   258
        priv->m_receiver = 0;
hgs
parents:
diff changeset
   259
    }
hgs
parents:
diff changeset
   260
    return;
hgs
parents:
diff changeset
   261
}
hgs
parents:
diff changeset
   262
hgs
parents:
diff changeset
   263
/*!
hgs
parents:
diff changeset
   264
  sets download manager attribute
hgs
parents:
diff changeset
   265
  \a attr indicates download manager attribute
hgs
parents:
diff changeset
   266
  \a value indicates value to be set
hgs
parents:
diff changeset
   267
*/
hgs
parents:
diff changeset
   268
Q_DECL_EXPORT int DownloadManager::setAttribute(DownloadManagerAttribute attr, const QVariant& value)
hgs
parents:
diff changeset
   269
{
hgs
parents:
diff changeset
   270
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   271
    switch(attr)
hgs
parents:
diff changeset
   272
    {
hgs
parents:
diff changeset
   273
        case DlMgrDestPath:
hgs
parents:
diff changeset
   274
        {
hgs
parents:
diff changeset
   275
            priv->m_destPath = value.toString();
hgs
parents:
diff changeset
   276
            return 0;
hgs
parents:
diff changeset
   277
        }
hgs
parents:
diff changeset
   278
        case DlMgrProgressMode:
hgs
parents:
diff changeset
   279
        {
hgs
parents:
diff changeset
   280
            priv->m_progressMode = (DownloadMgrProgressMode)value.toInt();
hgs
parents:
diff changeset
   281
            return 0;
hgs
parents:
diff changeset
   282
        }
hgs
parents:
diff changeset
   283
        case DlMgrPersistantMode:
hgs
parents:
diff changeset
   284
        {
hgs
parents:
diff changeset
   285
            priv->m_persistantMode = (DownloadMgrPersistantMode)value.toInt();
hgs
parents:
diff changeset
   286
            return 0;
hgs
parents:
diff changeset
   287
        }
hgs
parents:
diff changeset
   288
        default :
hgs
parents:
diff changeset
   289
            return -1;
hgs
parents:
diff changeset
   290
    }
hgs
parents:
diff changeset
   291
    return -1;
hgs
parents:
diff changeset
   292
}
hgs
parents:
diff changeset
   293
hgs
parents:
diff changeset
   294
/*!
hgs
parents:
diff changeset
   295
  fetches download manager attribute
hgs
parents:
diff changeset
   296
  \a attr indicates download manager attribute whos value to be returned
hgs
parents:
diff changeset
   297
*/
hgs
parents:
diff changeset
   298
Q_DECL_EXPORT QVariant DownloadManager::getAttribute(DownloadManagerAttribute attr)
hgs
parents:
diff changeset
   299
{
hgs
parents:
diff changeset
   300
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   301
    switch(attr)
hgs
parents:
diff changeset
   302
    {
hgs
parents:
diff changeset
   303
        case DlMgrDlCount:
hgs
parents:
diff changeset
   304
        {
hgs
parents:
diff changeset
   305
            int count(0);
hgs
parents:
diff changeset
   306
            if(priv->m_parallelManager)
hgs
parents:
diff changeset
   307
                count += priv->m_parallelManager->currentDownloads().count();
hgs
parents:
diff changeset
   308
            if(priv->m_sequentialManager)
hgs
parents:
diff changeset
   309
                count += priv->m_sequentialManager->currentDownloads().count();
hgs
parents:
diff changeset
   310
            if(priv->m_backgroundManager)
hgs
parents:
diff changeset
   311
                count += priv->m_backgroundManager->currentDownloads().count();
hgs
parents:
diff changeset
   312
            return QVariant(count);
hgs
parents:
diff changeset
   313
        }
hgs
parents:
diff changeset
   314
        case DlMgrClientName:
hgs
parents:
diff changeset
   315
        {
hgs
parents:
diff changeset
   316
            return QVariant(priv->m_clientName);
hgs
parents:
diff changeset
   317
        }
hgs
parents:
diff changeset
   318
        case DlMgrDestPath:
hgs
parents:
diff changeset
   319
        {
hgs
parents:
diff changeset
   320
            return QVariant(priv->m_destPath);
hgs
parents:
diff changeset
   321
        }
hgs
parents:
diff changeset
   322
        case DlMgrServerError:
hgs
parents:
diff changeset
   323
        {
hgs
parents:
diff changeset
   324
            // These cases apply only for Background Download Manager as this attribute
hgs
parents:
diff changeset
   325
            // is for getting download manager client-server communication related errors
hgs
parents:
diff changeset
   326
            QVariant value;
hgs
parents:
diff changeset
   327
            if(priv->m_backgroundManager)
hgs
parents:
diff changeset
   328
                value = priv->m_backgroundManager->getAttribute(attr);
hgs
parents:
diff changeset
   329
            return value;
hgs
parents:
diff changeset
   330
        }
hgs
parents:
diff changeset
   331
        case DlMgrProgressMode:
hgs
parents:
diff changeset
   332
        {
hgs
parents:
diff changeset
   333
            return QVariant(priv->m_progressMode);
hgs
parents:
diff changeset
   334
        }
hgs
parents:
diff changeset
   335
        case DlMgrPersistantMode:
hgs
parents:
diff changeset
   336
        {
hgs
parents:
diff changeset
   337
            return QVariant(priv->m_persistantMode);
hgs
parents:
diff changeset
   338
        }
hgs
parents:
diff changeset
   339
        default :
hgs
parents:
diff changeset
   340
            return QVariant();
hgs
parents:
diff changeset
   341
    }
hgs
parents:
diff changeset
   342
    return QVariant();
hgs
parents:
diff changeset
   343
}
hgs
parents:
diff changeset
   344
hgs
parents:
diff changeset
   345
/*!
hgs
parents:
diff changeset
   346
  returns all the current downloads
hgs
parents:
diff changeset
   347
*/
hgs
parents:
diff changeset
   348
Q_DECL_EXPORT QList<Download*>& DownloadManager::currentDownloads()
hgs
parents:
diff changeset
   349
{
hgs
parents:
diff changeset
   350
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   351
    priv->m_totalDownloads.clear();
hgs
parents:
diff changeset
   352
    if(priv->m_parallelManager) {
hgs
parents:
diff changeset
   353
        for(int i = 0;i < priv->m_parallelManager->currentDownloads().size(); ++i)
hgs
parents:
diff changeset
   354
            priv->m_totalDownloads.append(priv->m_parallelManager->currentDownloads()[i]);
hgs
parents:
diff changeset
   355
    }
hgs
parents:
diff changeset
   356
    if(priv->m_sequentialManager) {
hgs
parents:
diff changeset
   357
        for(int i = 0;i < priv->m_sequentialManager->currentDownloads().size(); ++i)
hgs
parents:
diff changeset
   358
            priv->m_totalDownloads.append(priv->m_sequentialManager->currentDownloads()[i]);
hgs
parents:
diff changeset
   359
    }
hgs
parents:
diff changeset
   360
    if(priv->m_backgroundManager) {
hgs
parents:
diff changeset
   361
        for(int i = 0;i < priv->m_backgroundManager->currentDownloads().size(); ++i)
hgs
parents:
diff changeset
   362
            priv->m_totalDownloads.append(priv->m_backgroundManager->currentDownloads()[i]);
hgs
parents:
diff changeset
   363
    }
hgs
parents:
diff changeset
   364
    return priv->m_totalDownloads;
hgs
parents:
diff changeset
   365
}
hgs
parents:
diff changeset
   366
hgs
parents:
diff changeset
   367
/*!
hgs
parents:
diff changeset
   368
  finds a download provided id if exists
hgs
parents:
diff changeset
   369
  \a id indicates identifier for download
hgs
parents:
diff changeset
   370
*/
hgs
parents:
diff changeset
   371
Q_DECL_EXPORT Download* DownloadManager::findDownload(int dlId)
hgs
parents:
diff changeset
   372
{
hgs
parents:
diff changeset
   373
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   374
    Download* dl = NULL;
hgs
parents:
diff changeset
   375
    if(priv->m_parallelManager)
hgs
parents:
diff changeset
   376
    {
hgs
parents:
diff changeset
   377
        dl = priv->m_parallelManager->findDownload(dlId);
hgs
parents:
diff changeset
   378
        if(dl)
hgs
parents:
diff changeset
   379
            return dl;
hgs
parents:
diff changeset
   380
    }
hgs
parents:
diff changeset
   381
    if(priv->m_sequentialManager)
hgs
parents:
diff changeset
   382
    {
hgs
parents:
diff changeset
   383
        dl = priv->m_sequentialManager->findDownload(dlId);
hgs
parents:
diff changeset
   384
        if(dl)
hgs
parents:
diff changeset
   385
            return dl;
hgs
parents:
diff changeset
   386
    }
hgs
parents:
diff changeset
   387
    if(priv->m_backgroundManager)
hgs
parents:
diff changeset
   388
    {
hgs
parents:
diff changeset
   389
        dl = priv->m_backgroundManager->findDownload(dlId);
hgs
parents:
diff changeset
   390
        if(dl)
hgs
parents:
diff changeset
   391
            return dl;
hgs
parents:
diff changeset
   392
    }
hgs
parents:
diff changeset
   393
    return NULL;
hgs
parents:
diff changeset
   394
}
hgs
parents:
diff changeset
   395
hgs
parents:
diff changeset
   396
/*!
hgs
parents:
diff changeset
   397
  cancels all the downloads
hgs
parents:
diff changeset
   398
*/
hgs
parents:
diff changeset
   399
Q_DECL_EXPORT void DownloadManager::removeAll()
hgs
parents:
diff changeset
   400
{
hgs
parents:
diff changeset
   401
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   402
    if(priv->m_parallelManager)
hgs
parents:
diff changeset
   403
        priv->m_parallelManager->removeAll();
hgs
parents:
diff changeset
   404
    if(priv->m_sequentialManager)
hgs
parents:
diff changeset
   405
        priv->m_sequentialManager->removeAll();
hgs
parents:
diff changeset
   406
    if(priv->m_backgroundManager)
hgs
parents:
diff changeset
   407
        priv->m_backgroundManager->removeAll();
hgs
parents:
diff changeset
   408
    postEvent(DownloadsCleared, NULL);
hgs
parents:
diff changeset
   409
    return;
hgs
parents:
diff changeset
   410
}
hgs
parents:
diff changeset
   411
hgs
parents:
diff changeset
   412
/*!
hgs
parents:
diff changeset
   413
  cancels and removes the download
hgs
parents:
diff changeset
   414
  \a dl indicates the download to be canceled and removed
hgs
parents:
diff changeset
   415
*/
hgs
parents:
diff changeset
   416
Q_DECL_EXPORT void DownloadManager::removeOne(Download *dl)
hgs
parents:
diff changeset
   417
{
hgs
parents:
diff changeset
   418
    if (!dl)
hgs
parents:
diff changeset
   419
        return;
hgs
parents:
diff changeset
   420
hgs
parents:
diff changeset
   421
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   422
    if(priv->m_parallelManager)
hgs
parents:
diff changeset
   423
        priv->m_parallelManager->removeOne(dl);
hgs
parents:
diff changeset
   424
    if(priv->m_sequentialManager)
hgs
parents:
diff changeset
   425
        priv->m_sequentialManager->removeOne(dl);
hgs
parents:
diff changeset
   426
    if(priv->m_backgroundManager)
hgs
parents:
diff changeset
   427
        priv->m_backgroundManager->removeOne(dl);
hgs
parents:
diff changeset
   428
hgs
parents:
diff changeset
   429
    if((priv->m_parallelManager->currentDownloads().count() == 0) &&
hgs
parents:
diff changeset
   430
        (priv->m_sequentialManager->currentDownloads().count() == 0) &&
hgs
parents:
diff changeset
   431
        (priv->m_backgroundManager->currentDownloads().count() == 0))
hgs
parents:
diff changeset
   432
        postEvent(DownloadsCleared, NULL);
hgs
parents:
diff changeset
   433
    return;
hgs
parents:
diff changeset
   434
}
hgs
parents:
diff changeset
   435
hgs
parents:
diff changeset
   436
/*!
hgs
parents:
diff changeset
   437
  pauses all the downloads which are in progress
hgs
parents:
diff changeset
   438
*/
hgs
parents:
diff changeset
   439
Q_DECL_EXPORT void DownloadManager::pauseAll()
hgs
parents:
diff changeset
   440
{
hgs
parents:
diff changeset
   441
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   442
    if(priv->m_parallelManager)
hgs
parents:
diff changeset
   443
        priv->m_parallelManager->pauseAll();
hgs
parents:
diff changeset
   444
    if(priv->m_sequentialManager)
hgs
parents:
diff changeset
   445
        priv->m_sequentialManager->pauseAll();
hgs
parents:
diff changeset
   446
    if(priv->m_backgroundManager)
hgs
parents:
diff changeset
   447
        priv->m_backgroundManager->pauseAll();
hgs
parents:
diff changeset
   448
    return;
hgs
parents:
diff changeset
   449
}
hgs
parents:
diff changeset
   450
hgs
parents:
diff changeset
   451
/*!
hgs
parents:
diff changeset
   452
  resumes all the downloads which are paused
hgs
parents:
diff changeset
   453
*/
hgs
parents:
diff changeset
   454
Q_DECL_EXPORT void DownloadManager::resumeAll()
hgs
parents:
diff changeset
   455
{
hgs
parents:
diff changeset
   456
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   457
    if(priv->m_parallelManager)
hgs
parents:
diff changeset
   458
        priv->m_parallelManager->resumeAll();
hgs
parents:
diff changeset
   459
    if(priv->m_sequentialManager)
hgs
parents:
diff changeset
   460
        priv->m_sequentialManager->resumeAll();
hgs
parents:
diff changeset
   461
    if(priv->m_backgroundManager)
hgs
parents:
diff changeset
   462
        priv->m_backgroundManager->resumeAll();
hgs
parents:
diff changeset
   463
    return;
hgs
parents:
diff changeset
   464
}
hgs
parents:
diff changeset
   465
hgs
parents:
diff changeset
   466
/*!
hgs
parents:
diff changeset
   467
  returns the proxy used
hgs
parents:
diff changeset
   468
*/
hgs
parents:
diff changeset
   469
Q_DECL_EXPORT QNetworkProxy* DownloadManager::proxy()
hgs
parents:
diff changeset
   470
{
hgs
parents:
diff changeset
   471
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   472
    return priv->m_proxy;
hgs
parents:
diff changeset
   473
}
hgs
parents:
diff changeset
   474
hgs
parents:
diff changeset
   475
DownloadInfo* DownloadManager::downloadInfo()
hgs
parents:
diff changeset
   476
{
hgs
parents:
diff changeset
   477
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   478
    return priv->m_dlInfo;
hgs
parents:
diff changeset
   479
}
hgs
parents:
diff changeset
   480
hgs
parents:
diff changeset
   481
DownloadCoreManager* DownloadManager::downloadCoreManager()
hgs
parents:
diff changeset
   482
{
hgs
parents:
diff changeset
   483
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   484
    return priv->m_dlCoreManager;
hgs
parents:
diff changeset
   485
}
hgs
parents:
diff changeset
   486
hgs
parents:
diff changeset
   487
SequentialDownloadManager* DownloadManager::sequentialManager()
hgs
parents:
diff changeset
   488
{
hgs
parents:
diff changeset
   489
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   490
    return priv->m_sequentialManager;
hgs
parents:
diff changeset
   491
}
hgs
parents:
diff changeset
   492
hgs
parents:
diff changeset
   493
BackgroundDownloadManager* DownloadManager::backgroundManager()
hgs
parents:
diff changeset
   494
{
hgs
parents:
diff changeset
   495
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   496
    return priv->m_backgroundManager;
hgs
parents:
diff changeset
   497
}
hgs
parents:
diff changeset
   498
hgs
parents:
diff changeset
   499
void DownloadManager::loadAllDownloads()
hgs
parents:
diff changeset
   500
{
hgs
parents:
diff changeset
   501
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   502
    // read the saved downloads information and create download
hgs
parents:
diff changeset
   503
    QVector<int> ids = DownloadInfo::getAllDownloads(priv->m_clientName);
hgs
parents:
diff changeset
   504
    for(int i=0; i<ids.size(); i++)
hgs
parents:
diff changeset
   505
    {
hgs
parents:
diff changeset
   506
        if(!findDownload(ids[i])) {
hgs
parents:
diff changeset
   507
            long scope;
hgs
parents:
diff changeset
   508
            priv->m_dlInfo->getValue(ids[i], DownloadInfo::EScope, scope);
hgs
parents:
diff changeset
   509
            createDownload(ids[i], (DownloadScope)scope);
hgs
parents:
diff changeset
   510
        }
hgs
parents:
diff changeset
   511
    }
hgs
parents:
diff changeset
   512
    return;
hgs
parents:
diff changeset
   513
}
hgs
parents:
diff changeset
   514
hgs
parents:
diff changeset
   515
// generate unique id for download
hgs
parents:
diff changeset
   516
long DownloadManager::generateDlId()
hgs
parents:
diff changeset
   517
{
hgs
parents:
diff changeset
   518
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   519
    long id = 1;
hgs
parents:
diff changeset
   520
    long totDls = (priv->m_parallelManager->currentDownloads().count() + 
hgs
parents:
diff changeset
   521
                priv->m_sequentialManager->currentDownloads().count() +
hgs
parents:
diff changeset
   522
                priv->m_backgroundManager->currentDownloads().count());
hgs
parents:
diff changeset
   523
hgs
parents:
diff changeset
   524
    if(totDls <= 0)
hgs
parents:
diff changeset
   525
    {
hgs
parents:
diff changeset
   526
        return id;
hgs
parents:
diff changeset
   527
    }
hgs
parents:
diff changeset
   528
    while(1)
hgs
parents:
diff changeset
   529
    {
hgs
parents:
diff changeset
   530
        int i;
hgs
parents:
diff changeset
   531
        for(i = 0; i <= totDls ; ++i)
hgs
parents:
diff changeset
   532
        {
hgs
parents:
diff changeset
   533
            Download* parallelDl = NULL;
hgs
parents:
diff changeset
   534
            parallelDl = priv->m_parallelManager ? priv->m_parallelManager->findDownload(i) : NULL;
hgs
parents:
diff changeset
   535
            Download* sequentialDl = NULL;
hgs
parents:
diff changeset
   536
            sequentialDl = priv->m_sequentialManager ? priv->m_sequentialManager->findDownload(i) : NULL;
hgs
parents:
diff changeset
   537
            Download* backgroundDl = NULL;
hgs
parents:
diff changeset
   538
            backgroundDl = priv->m_backgroundManager ? priv->m_backgroundManager->findDownload(i) : NULL;
hgs
parents:
diff changeset
   539
            if((parallelDl && (parallelDl->id() == id)) ||
hgs
parents:
diff changeset
   540
                (sequentialDl && (sequentialDl->id() == id)) ||
hgs
parents:
diff changeset
   541
                (backgroundDl && (backgroundDl->id() == id)))
hgs
parents:
diff changeset
   542
            {
hgs
parents:
diff changeset
   543
                break;
hgs
parents:
diff changeset
   544
            }
hgs
parents:
diff changeset
   545
        }
hgs
parents:
diff changeset
   546
        if(i>totDls)
hgs
parents:
diff changeset
   547
        {
hgs
parents:
diff changeset
   548
            return id;
hgs
parents:
diff changeset
   549
        }
hgs
parents:
diff changeset
   550
        id++;
hgs
parents:
diff changeset
   551
    }
hgs
parents:
diff changeset
   552
    return -1;
hgs
parents:
diff changeset
   553
}
hgs
parents:
diff changeset
   554
hgs
parents:
diff changeset
   555
void DownloadManager::postEvent(DEventType type, DlManagerEventAttributeMap* attrMap)
hgs
parents:
diff changeset
   556
{
hgs
parents:
diff changeset
   557
    DM_PRIVATE(DownloadManager);
hgs
parents:
diff changeset
   558
    if(priv->m_receiver)
hgs
parents:
diff changeset
   559
    {
hgs
parents:
diff changeset
   560
        DownloadManagerEvent *event = new DownloadManagerEvent(type, attrMap);
hgs
parents:
diff changeset
   561
        QCoreApplication::postEvent(priv->m_receiver, event);
hgs
parents:
diff changeset
   562
    }
hgs
parents:
diff changeset
   563
}
hgs
parents:
diff changeset
   564