~george-edison55/twistload/trunk

« back to all changes in this revision

Viewing changes to src/download/download.cpp

  • Committer: Nathan Osman
  • Date: 2017-07-21 19:02:24 UTC
  • Revision ID: git-v1:dc9f552f566f371322850cb781c53413250107a0
Nearly finish initial implementation of Download class.

Show diffs side-by-side

added added

removed removed

Lines of Context:
34
34
#include "download.h"
35
35
#include "fragment.h"
36
36
 
 
37
const int FragmentCount = 5;
 
38
 
37
39
Download::Download(QNetworkAccessManager *manager, const QString &url, const QString &filename)
38
40
    : mManager(manager),
39
41
      mReply(nullptr),
120
122
    }
121
123
}
122
124
 
123
 
void Download::onFinished()
 
125
void Download::onProbeFinished()
124
126
{
125
127
    // If the probe request succeeded, continue with allocation
126
128
    if (mReply->error() == QNetworkReply::NoError) {
152
154
    mFile.write(data, offset);
153
155
}
154
156
 
 
157
void Download::onFragmentError(const QString &message)
 
158
{
 
159
    // TODO: stop the download
 
160
}
 
161
 
 
162
void Download::onFragmentFinished()
 
163
{
 
164
    Fragment *fragment = qobject_cast<Fragment*>(sender());
 
165
    mFragments.removeAll(fragment);
 
166
    delete fragment;
 
167
 
 
168
    // If no fragments remain, the download is complete
 
169
    if (!mFragments.count()) {
 
170
        mState = Succeeded;
 
171
        emit stateChanged();
 
172
    }
 
173
}
 
174
 
155
175
void Download::init()
156
176
{
157
177
    connect(&mFile, &File::error, this, &Download::onError);
165
185
    emit stateChanged();
166
186
 
167
187
    mReply = mManager->head(QNetworkRequest(QUrl(mUrl)));
168
 
    connect(mReply, &QNetworkReply::finished, this, &Download::onFinished);
 
188
    connect(mReply, &QNetworkReply::finished, this, &Download::onProbeFinished);
169
189
}
170
190
 
171
191
void Download::alloc()
181
201
    mState = Downloading;
182
202
    emit stateChanged();
183
203
 
184
 
    // TODO: set up downloads
 
204
    // Create the fragments for downloading the file
185
205
    if (!mFragments.count()) {
186
 
        //...
 
206
        if (mSize) {
 
207
            qint64 fragmentSize = mSize / FragmentCount;
 
208
            for (int i = 0; i < FragmentCount - 1; ++i) {
 
209
                qint64 start = i * fragmentSize;
 
210
                qint64 end = start + fragmentSize - 1;
 
211
                newFragment(start, end)->start();
 
212
            }
 
213
            newFragment((FragmentCount - 1) * fragmentSize, mSize - 1);
 
214
        } else {
 
215
            newFragment(0, 0)->start();
 
216
        }
187
217
    }
188
218
}
189
219
 
200
230
{
201
231
    Fragment *fragment = new Fragment(mManager, mUrl, start, end);
202
232
    connect(fragment, &Fragment::dataReceived, this, &Download::onDataReceived);
 
233
    connect(fragment, &Fragment::error, this, &Download::onFragmentError);
 
234
    connect(fragment, &Fragment::finished, this, &Download::onFragmentFinished);
203
235
    mFragments.append(fragment);
204
236
    return fragment;
205
237
}