utilities/downloadmanager/src/sequentialdownloadmanager.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 "sequentialdownloadmanager.h"
hgs
parents:
diff changeset
    20
#include "downloadevent.h"
hgs
parents:
diff changeset
    21
#include "clientdownload.h"
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
class SequentialDownloadManagerPrivate
hgs
parents:
diff changeset
    24
{
hgs
parents:
diff changeset
    25
    //declare public implementation
hgs
parents:
diff changeset
    26
    DM_DECLARE_PUBLIC(SequentialDownloadManager);
hgs
parents:
diff changeset
    27
public:
hgs
parents:
diff changeset
    28
    SequentialDownloadManagerPrivate();
hgs
parents:
diff changeset
    29
    ~SequentialDownloadManagerPrivate();
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
    QList<Download*> m_createdDownloads; // list of downloads which have been created by the client and owns them
hgs
parents:
diff changeset
    32
    QQueue<Download*> m_downloadsQueue; // queue of downloads scheduled for downloading and owns them
hgs
parents:
diff changeset
    33
    QList<Download*> m_completedDownloads; // list of downloads which have been completed and owns them
hgs
parents:
diff changeset
    34
    QList<Download*> m_failedDownloads; // list of failed downloads
hgs
parents:
diff changeset
    35
    QList<Download*> m_totalDownloads; // total of all the above downloads, but this doesnt own downloads
hgs
parents:
diff changeset
    36
};
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
SequentialDownloadManagerPrivate::SequentialDownloadManagerPrivate()
hgs
parents:
diff changeset
    39
{ }
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
SequentialDownloadManagerPrivate::~SequentialDownloadManagerPrivate()
hgs
parents:
diff changeset
    42
{
hgs
parents:
diff changeset
    43
    int createdSize = m_createdDownloads.size();
hgs
parents:
diff changeset
    44
    for (int i = 0; i < createdSize; i++)
hgs
parents:
diff changeset
    45
        delete m_createdDownloads[i];
hgs
parents:
diff changeset
    46
    m_createdDownloads.clear();
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
    int completedSize = m_completedDownloads.size();
hgs
parents:
diff changeset
    49
    for (int i = 0; i < completedSize; i++)
hgs
parents:
diff changeset
    50
        delete m_completedDownloads[i];
hgs
parents:
diff changeset
    51
    m_completedDownloads.clear();
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
    int size = m_downloadsQueue.size();
hgs
parents:
diff changeset
    54
    for (int i = 0; i < size; i++) {
hgs
parents:
diff changeset
    55
        DownloadState state = (DownloadState)((m_downloadsQueue[i]->getAttribute(DlDownloadState)).toInt());
hgs
parents:
diff changeset
    56
        if (state == DlInprogress) {
hgs
parents:
diff changeset
    57
            // pause the download if it is in progress
hgs
parents:
diff changeset
    58
            m_downloadsQueue[i]->pause();
hgs
parents:
diff changeset
    59
        } else if (state == DlFailed) {
hgs
parents:
diff changeset
    60
            // cancel the download if it has failed
hgs
parents:
diff changeset
    61
            m_downloadsQueue[i]->cancel();
hgs
parents:
diff changeset
    62
        }
hgs
parents:
diff changeset
    63
        delete (m_downloadsQueue[i]);
hgs
parents:
diff changeset
    64
    }
hgs
parents:
diff changeset
    65
    m_downloadsQueue.clear();
hgs
parents:
diff changeset
    66
}
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
/*
hgs
parents:
diff changeset
    69
  constructor
hgs
parents:
diff changeset
    70
*/
hgs
parents:
diff changeset
    71
SequentialDownloadManager::SequentialDownloadManager()
hgs
parents:
diff changeset
    72
{
hgs
parents:
diff changeset
    73
    DM_INITIALIZE(SequentialDownloadManager);
hgs
parents:
diff changeset
    74
}
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
/*
hgs
parents:
diff changeset
    77
  destructor
hgs
parents:
diff changeset
    78
*/
hgs
parents:
diff changeset
    79
SequentialDownloadManager::~SequentialDownloadManager()
hgs
parents:
diff changeset
    80
{
hgs
parents:
diff changeset
    81
    DM_UNINITIALIZE(SequentialDownloadManager);
hgs
parents:
diff changeset
    82
}
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
/*
hgs
parents:
diff changeset
    85
  returns all the current downloads
hgs
parents:
diff changeset
    86
*/
hgs
parents:
diff changeset
    87
QList<Download*>& SequentialDownloadManager::currentDownloads()
hgs
parents:
diff changeset
    88
{
hgs
parents:
diff changeset
    89
    DM_PRIVATE(SequentialDownloadManager);
hgs
parents:
diff changeset
    90
    priv->m_totalDownloads.clear();
hgs
parents:
diff changeset
    91
    for (int i = 0; i < priv->m_completedDownloads.size(); ++i)
hgs
parents:
diff changeset
    92
         priv->m_totalDownloads.append(priv->m_completedDownloads[i]);
hgs
parents:
diff changeset
    93
    for (int i = 0; i < priv->m_downloadsQueue.size(); ++i)
hgs
parents:
diff changeset
    94
        priv->m_totalDownloads.append(priv->m_downloadsQueue[i]);
hgs
parents:
diff changeset
    95
    for (int i = 0; i < priv->m_createdDownloads.size(); ++i)
hgs
parents:
diff changeset
    96
        priv->m_totalDownloads.append(priv->m_createdDownloads[i]);
hgs
parents:
diff changeset
    97
    for (int i = 0; i < priv->m_failedDownloads.size(); ++i)
hgs
parents:
diff changeset
    98
        priv->m_totalDownloads.append(priv->m_failedDownloads[i]);
hgs
parents:
diff changeset
    99
    return priv->m_totalDownloads;
hgs
parents:
diff changeset
   100
}
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
/*
hgs
parents:
diff changeset
   103
  finds a download provided id if exists
hgs
parents:
diff changeset
   104
  \a id indicates identifier for download
hgs
parents:
diff changeset
   105
*/
hgs
parents:
diff changeset
   106
Download* SequentialDownloadManager::findDownload(int dlId)
hgs
parents:
diff changeset
   107
{
hgs
parents:
diff changeset
   108
    DM_PRIVATE(SequentialDownloadManager);
hgs
parents:
diff changeset
   109
    for (int i = 0; i < priv->m_completedDownloads.size(); ++i) {
hgs
parents:
diff changeset
   110
        if (priv->m_completedDownloads[i]->id() == dlId)
hgs
parents:
diff changeset
   111
            return priv->m_completedDownloads[i];
hgs
parents:
diff changeset
   112
    }
hgs
parents:
diff changeset
   113
    for (int i = 0; i < priv->m_downloadsQueue.size(); ++i) {
hgs
parents:
diff changeset
   114
        if (priv->m_downloadsQueue[i]->id() == dlId)
hgs
parents:
diff changeset
   115
            return priv->m_downloadsQueue[i];
hgs
parents:
diff changeset
   116
    }
hgs
parents:
diff changeset
   117
    for (int i = 0; i < priv->m_createdDownloads.size(); ++i) {
hgs
parents:
diff changeset
   118
        if (priv->m_createdDownloads[i]->id() == dlId)
hgs
parents:
diff changeset
   119
            return priv->m_createdDownloads[i];
hgs
parents:
diff changeset
   120
    }
hgs
parents:
diff changeset
   121
    return 0;
hgs
parents:
diff changeset
   122
}
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
/*
hgs
parents:
diff changeset
   125
  cancels all the downloads
hgs
parents:
diff changeset
   126
*/
hgs
parents:
diff changeset
   127
void SequentialDownloadManager::removeAll()
hgs
parents:
diff changeset
   128
{
hgs
parents:
diff changeset
   129
    DM_PRIVATE(SequentialDownloadManager);
hgs
parents:
diff changeset
   130
    //traverse the list and delete each download in the list
hgs
parents:
diff changeset
   131
    for(int i = 0; i < priv->m_downloadsQueue.count(); ) {
hgs
parents:
diff changeset
   132
        // cancel the download
hgs
parents:
diff changeset
   133
        priv->m_downloadsQueue[0]->cancel();
hgs
parents:
diff changeset
   134
        delete (priv->m_downloadsQueue[0]);
hgs
parents:
diff changeset
   135
        priv->m_downloadsQueue.removeAt(0);
hgs
parents:
diff changeset
   136
    }
hgs
parents:
diff changeset
   137
    priv->m_downloadsQueue.clear();
hgs
parents:
diff changeset
   138
hgs
parents:
diff changeset
   139
    int createdDownloadsCount = priv->m_createdDownloads.count();
hgs
parents:
diff changeset
   140
    //traverse the list and delete each download in the list
hgs
parents:
diff changeset
   141
    for(int i = 0; i < createdDownloadsCount; i++)
hgs
parents:
diff changeset
   142
        delete (priv->m_createdDownloads[i]);
hgs
parents:
diff changeset
   143
    priv->m_createdDownloads.clear();
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
    int completedDownloadsCount = priv->m_completedDownloads.count();
hgs
parents:
diff changeset
   146
    //traverse the list and delete each download in the list
hgs
parents:
diff changeset
   147
    for(int i = 0; i < completedDownloadsCount; i++)
hgs
parents:
diff changeset
   148
        delete (priv->m_completedDownloads[i]);
hgs
parents:
diff changeset
   149
    priv->m_completedDownloads.clear();
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
    int failedDownloadsCount = priv->m_failedDownloads.count();
hgs
parents:
diff changeset
   152
    //traverse the list and delete each download in the list
hgs
parents:
diff changeset
   153
    for(int i = 0; i < failedDownloadsCount; i++)
hgs
parents:
diff changeset
   154
        delete (priv->m_failedDownloads[i]);
hgs
parents:
diff changeset
   155
    priv->m_failedDownloads.clear();
hgs
parents:
diff changeset
   156
}
hgs
parents:
diff changeset
   157
hgs
parents:
diff changeset
   158
/*
hgs
parents:
diff changeset
   159
  cancels and removes the download
hgs
parents:
diff changeset
   160
  \a dl indicates the download to be canceled and removed
hgs
parents:
diff changeset
   161
*/
hgs
parents:
diff changeset
   162
void SequentialDownloadManager::removeOne(Download *dl)
hgs
parents:
diff changeset
   163
{
hgs
parents:
diff changeset
   164
    if(!dl)
hgs
parents:
diff changeset
   165
        return;
hgs
parents:
diff changeset
   166
    DM_PRIVATE(SequentialDownloadManager);
hgs
parents:
diff changeset
   167
    if (currentDownloads().contains(dl)) {
hgs
parents:
diff changeset
   168
        dl->cancel();
hgs
parents:
diff changeset
   169
        // download might be there in any of the following list
hgs
parents:
diff changeset
   170
        priv->m_downloadsQueue.removeOne(dl);
hgs
parents:
diff changeset
   171
        priv->m_createdDownloads.removeOne(dl);
hgs
parents:
diff changeset
   172
        priv->m_completedDownloads.removeOne(dl);
hgs
parents:
diff changeset
   173
        delete dl;
hgs
parents:
diff changeset
   174
        dl = 0;
hgs
parents:
diff changeset
   175
    }
hgs
parents:
diff changeset
   176
}
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
/*
hgs
parents:
diff changeset
   179
  pauses all the downloads which are in progress
hgs
parents:
diff changeset
   180
*/
hgs
parents:
diff changeset
   181
void SequentialDownloadManager::pauseAll()
hgs
parents:
diff changeset
   182
{
hgs
parents:
diff changeset
   183
    DM_PRIVATE(SequentialDownloadManager);
hgs
parents:
diff changeset
   184
    if (!priv->m_downloadsQueue.isEmpty()) {
hgs
parents:
diff changeset
   185
        QQueue<Download*>::iterator i;
hgs
parents:
diff changeset
   186
        i = priv->m_downloadsQueue.begin();
hgs
parents:
diff changeset
   187
        DownloadState state = (DownloadState)(((*i)->getAttribute(DlDownloadState)).toInt());
hgs
parents:
diff changeset
   188
        if ((state == DlInprogress || state == DlStarted))
hgs
parents:
diff changeset
   189
            dynamic_cast<ClientDownload*>(*i)->pauseDownload();
hgs
parents:
diff changeset
   190
    }
hgs
parents:
diff changeset
   191
}
hgs
parents:
diff changeset
   192
hgs
parents:
diff changeset
   193
/*
hgs
parents:
diff changeset
   194
  resumes all the downloads which are paused
hgs
parents:
diff changeset
   195
*/
hgs
parents:
diff changeset
   196
void SequentialDownloadManager::resumeAll()
hgs
parents:
diff changeset
   197
{
hgs
parents:
diff changeset
   198
    DM_PRIVATE(SequentialDownloadManager);
hgs
parents:
diff changeset
   199
    if (!priv->m_downloadsQueue.isEmpty()) {
hgs
parents:
diff changeset
   200
        QQueue<Download*>::iterator i;
hgs
parents:
diff changeset
   201
        i = priv->m_downloadsQueue.begin();
hgs
parents:
diff changeset
   202
        DownloadState state = (DownloadState)(((*i)->getAttribute(DlDownloadState)).toInt());
hgs
parents:
diff changeset
   203
        if (state == DlPaused)
hgs
parents:
diff changeset
   204
            dynamic_cast<ClientDownload*>(*i)->resumeDownload();
hgs
parents:
diff changeset
   205
    }
hgs
parents:
diff changeset
   206
}
hgs
parents:
diff changeset
   207
hgs
parents:
diff changeset
   208
void SequentialDownloadManager::addToSequentialDownload(Download* dl)
hgs
parents:
diff changeset
   209
{
hgs
parents:
diff changeset
   210
    // Here the downloads are added first to a download list. When the downloads are in this list,
hgs
parents:
diff changeset
   211
    // the client can set some attributes on the download.
hgs
parents:
diff changeset
   212
    // Later the client has to explicitly call start() on the download after which,
hgs
parents:
diff changeset
   213
    // download gets added to the downloadsQueue and the download starts.
hgs
parents:
diff changeset
   214
hgs
parents:
diff changeset
   215
    DM_PRIVATE(SequentialDownloadManager);
hgs
parents:
diff changeset
   216
hgs
parents:
diff changeset
   217
    // set the download type
hgs
parents:
diff changeset
   218
    ClientDownload* download = dynamic_cast<ClientDownload*>(dl);
hgs
parents:
diff changeset
   219
    if(download)
hgs
parents:
diff changeset
   220
        download->attributes().insert(DlDownloadType, (int)Sequential);
hgs
parents:
diff changeset
   221
hgs
parents:
diff changeset
   222
    // if the download is already in queue but the prority has been changed
hgs
parents:
diff changeset
   223
    if( findDownload(dl->id()))
hgs
parents:
diff changeset
   224
        priv->m_createdDownloads.removeOne(dl);
hgs
parents:
diff changeset
   225
hgs
parents:
diff changeset
   226
    DownloadPriority priority = (DownloadPriority)(dl->getAttribute(DlPriority)).toInt();
hgs
parents:
diff changeset
   227
    if (priority == High) {
hgs
parents:
diff changeset
   228
        QList<Download*>::iterator i;
hgs
parents:
diff changeset
   229
        for (i = priv->m_createdDownloads.begin(); i != priv->m_createdDownloads.end(); i++) {
hgs
parents:
diff changeset
   230
            if ((*i)->getAttribute(DlPriority).toInt() == Low) {
hgs
parents:
diff changeset
   231
                priv->m_createdDownloads.insert(i, dl);
hgs
parents:
diff changeset
   232
                return;
hgs
parents:
diff changeset
   233
            }
hgs
parents:
diff changeset
   234
        }
hgs
parents:
diff changeset
   235
        priv->m_createdDownloads.insert(i, dl); // if no low priority download is found then just insert the high priority download
hgs
parents:
diff changeset
   236
    }
hgs
parents:
diff changeset
   237
    else
hgs
parents:
diff changeset
   238
        priv->m_createdDownloads.append(dl);
hgs
parents:
diff changeset
   239
}
hgs
parents:
diff changeset
   240
hgs
parents:
diff changeset
   241
void SequentialDownloadManager::addToDownloadQueue(Download* dl)
hgs
parents:
diff changeset
   242
{
hgs
parents:
diff changeset
   243
    DM_PRIVATE(SequentialDownloadManager);
hgs
parents:
diff changeset
   244
    priv->m_downloadsQueue.append(dl);
hgs
parents:
diff changeset
   245
}
hgs
parents:
diff changeset
   246
hgs
parents:
diff changeset
   247
void SequentialDownloadManager::addToCompletedList(Download* dl)
hgs
parents:
diff changeset
   248
{
hgs
parents:
diff changeset
   249
    DM_PRIVATE(SequentialDownloadManager);
hgs
parents:
diff changeset
   250
    priv->m_completedDownloads.append(dl);
hgs
parents:
diff changeset
   251
}
hgs
parents:
diff changeset
   252
hgs
parents:
diff changeset
   253
void SequentialDownloadManager::process(int dlId)
hgs
parents:
diff changeset
   254
{
hgs
parents:
diff changeset
   255
    DM_PRIVATE(SequentialDownloadManager);
hgs
parents:
diff changeset
   256
    // Start() has been called on a download present in the createdDownloads list. Move that download from the list to the queue
hgs
parents:
diff changeset
   257
    ClientDownload* dl = dynamic_cast<ClientDownload*>(findDownload(dlId));
hgs
parents:
diff changeset
   258
    dl->registerEventReceiver(this);
hgs
parents:
diff changeset
   259
    priv->m_createdDownloads.removeOne(dl); // Once start() is called on download, add it to downloadQueue & remove it from createdDownloads list
hgs
parents:
diff changeset
   260
    if (priv->m_downloadsQueue.isEmpty()) {
hgs
parents:
diff changeset
   261
        addToDownloadQueue(dl);
hgs
parents:
diff changeset
   262
        dl->startDownload();
hgs
parents:
diff changeset
   263
        return;
hgs
parents:
diff changeset
   264
    }
hgs
parents:
diff changeset
   265
    DownloadPriority priority = (DownloadPriority)((dl->getAttribute(DlPriority)).toInt());
hgs
parents:
diff changeset
   266
    // checking for priority
hgs
parents:
diff changeset
   267
    if (priority == High) {
hgs
parents:
diff changeset
   268
        // Add the download before the first low priority item
hgs
parents:
diff changeset
   269
        QQueue<Download*>::iterator i;
hgs
parents:
diff changeset
   270
        for (i = priv->m_downloadsQueue.begin(); i != priv->m_downloadsQueue.end(); i++) {
hgs
parents:
diff changeset
   271
            if ((*i)->getAttribute(DlPriority).toInt() == Low) {
hgs
parents:
diff changeset
   272
                if (i == priv->m_downloadsQueue.begin()) {
hgs
parents:
diff changeset
   273
                    dynamic_cast<ClientDownload*>(*i)->pauseDownload();
hgs
parents:
diff changeset
   274
                    priv->m_downloadsQueue.insert(i, dl); // low priority dl is in progress so pause it, insert the high priority dl and start it.
hgs
parents:
diff changeset
   275
                    dl->startDownload();
hgs
parents:
diff changeset
   276
                }
hgs
parents:
diff changeset
   277
                else {
hgs
parents:
diff changeset
   278
                    // low priority download is present in the queue but it's not the first one as it is not yet started,
hgs
parents:
diff changeset
   279
                    // so there's already a high priority dl in progress. So this high priority dl should just be inserted into the queue.
hgs
parents:
diff changeset
   280
                    priv->m_downloadsQueue.insert(i, dl);
hgs
parents:
diff changeset
   281
                }
hgs
parents:
diff changeset
   282
                return;
hgs
parents:
diff changeset
   283
            }
hgs
parents:
diff changeset
   284
        }
hgs
parents:
diff changeset
   285
        priv->m_downloadsQueue.insert(i, dl); // insert the high priority download if there are no low priority downloads in the queue
hgs
parents:
diff changeset
   286
    }
hgs
parents:
diff changeset
   287
    else
hgs
parents:
diff changeset
   288
        addToDownloadQueue(dl); // If priority is low then just append to the queue.
hgs
parents:
diff changeset
   289
}
hgs
parents:
diff changeset
   290
hgs
parents:
diff changeset
   291
bool SequentialDownloadManager::event(QEvent *event)
hgs
parents:
diff changeset
   292
{
hgs
parents:
diff changeset
   293
    DM_PRIVATE(SequentialDownloadManager);
hgs
parents:
diff changeset
   294
    DEventType type = (DEventType)event->type();
hgs
parents:
diff changeset
   295
    switch(type) {
hgs
parents:
diff changeset
   296
    case Completed:
hgs
parents:
diff changeset
   297
    {
hgs
parents:
diff changeset
   298
        int dlId = ((DownloadEvent*)event)->getId();
hgs
parents:
diff changeset
   299
        ClientDownload *dl = dynamic_cast<ClientDownload*>(findDownload(dlId));
hgs
parents:
diff changeset
   300
        addToCompletedList(dl);
hgs
parents:
diff changeset
   301
        // After adding the download to completed list, remove it from downloadQueue
hgs
parents:
diff changeset
   302
        priv->m_downloadsQueue.removeOne(dl);
hgs
parents:
diff changeset
   303
        startNext();
hgs
parents:
diff changeset
   304
        break;
hgs
parents:
diff changeset
   305
    }
hgs
parents:
diff changeset
   306
    case Error:
hgs
parents:
diff changeset
   307
    {
hgs
parents:
diff changeset
   308
        int dlId = ((DownloadEvent*)event)->getId();
hgs
parents:
diff changeset
   309
        ClientDownload *dl = dynamic_cast<ClientDownload*>(findDownload(dlId));
hgs
parents:
diff changeset
   310
        priv->m_failedDownloads.append(dl);
hgs
parents:
diff changeset
   311
        priv->m_downloadsQueue.removeOne(dl);
hgs
parents:
diff changeset
   312
        startNext();
hgs
parents:
diff changeset
   313
        break;
hgs
parents:
diff changeset
   314
    }
hgs
parents:
diff changeset
   315
    default:
hgs
parents:
diff changeset
   316
        break;
hgs
parents:
diff changeset
   317
    }
hgs
parents:
diff changeset
   318
    return true;
hgs
parents:
diff changeset
   319
}
hgs
parents:
diff changeset
   320
hgs
parents:
diff changeset
   321
void SequentialDownloadManager::startNext()
hgs
parents:
diff changeset
   322
{
hgs
parents:
diff changeset
   323
    DM_PRIVATE(SequentialDownloadManager);
hgs
parents:
diff changeset
   324
    QQueue<Download*>::iterator i;
hgs
parents:
diff changeset
   325
    if (!priv->m_downloadsQueue.isEmpty()) {
hgs
parents:
diff changeset
   326
        i = priv->m_downloadsQueue.begin();
hgs
parents:
diff changeset
   327
        DownloadState state = (DownloadState)(((*i)->getAttribute(DlDownloadState)).toInt());
hgs
parents:
diff changeset
   328
        if (state == DlPaused)
hgs
parents:
diff changeset
   329
            (*i)->resume();
hgs
parents:
diff changeset
   330
        else
hgs
parents:
diff changeset
   331
            dynamic_cast<ClientDownload*>(*i)->startDownload();
hgs
parents:
diff changeset
   332
    }
hgs
parents:
diff changeset
   333
}
hgs
parents:
diff changeset
   334
hgs
parents:
diff changeset
   335
void SequentialDownloadManager::pauseDownload(int dlId)
hgs
parents:
diff changeset
   336
{
hgs
parents:
diff changeset
   337
    DM_PRIVATE(SequentialDownloadManager);
hgs
parents:
diff changeset
   338
    QQueue<Download*>::iterator i;
hgs
parents:
diff changeset
   339
    if (!priv->m_downloadsQueue.isEmpty()) {
hgs
parents:
diff changeset
   340
        i = priv->m_downloadsQueue.begin();
hgs
parents:
diff changeset
   341
        if (dlId == (*i)->id())
hgs
parents:
diff changeset
   342
            dynamic_cast<ClientDownload*>(*i)->pauseDownload();
hgs
parents:
diff changeset
   343
    }
hgs
parents:
diff changeset
   344
}
hgs
parents:
diff changeset
   345
hgs
parents:
diff changeset
   346
void SequentialDownloadManager::resumeDownload(int dlId)
hgs
parents:
diff changeset
   347
{
hgs
parents:
diff changeset
   348
    DM_PRIVATE(SequentialDownloadManager);
hgs
parents:
diff changeset
   349
    QQueue<Download*>::iterator i;
hgs
parents:
diff changeset
   350
    if (!priv->m_downloadsQueue.isEmpty()) {
hgs
parents:
diff changeset
   351
        i = priv->m_downloadsQueue.begin();
hgs
parents:
diff changeset
   352
        if (dlId == (*i)->id())
hgs
parents:
diff changeset
   353
            dynamic_cast<ClientDownload*>(*i)->resumeDownload();
hgs
parents:
diff changeset
   354
    }
hgs
parents:
diff changeset
   355
}
hgs
parents:
diff changeset
   356
hgs
parents:
diff changeset
   357
void SequentialDownloadManager::cancelDownload(int dlId)
hgs
parents:
diff changeset
   358
{
hgs
parents:
diff changeset
   359
    DM_PRIVATE(SequentialDownloadManager);
hgs
parents:
diff changeset
   360
    QQueue<Download*>::iterator i;
hgs
parents:
diff changeset
   361
    if (!priv->m_downloadsQueue.isEmpty()) {
hgs
parents:
diff changeset
   362
        i = priv->m_downloadsQueue.begin();
hgs
parents:
diff changeset
   363
        if (dlId == (*i)->id())
hgs
parents:
diff changeset
   364
            dynamic_cast<ClientDownload*>(*i)->cancelDownload();
hgs
parents:
diff changeset
   365
    }
hgs
parents:
diff changeset
   366
}