source: trunk/examples/network/torrent/filemanager.h

Last change on this file was 846, checked in by Dmitry A. Kuminov, 14 years ago

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

File size: 4.3 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation (qt-info@nokia.com)
6**
7** This file is part of the examples of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:BSD$
10** You may use this file under the terms of the BSD license as follows:
11**
12** "Redistribution and use in source and binary forms, with or without
13** modification, are permitted provided that the following conditions are
14** met:
15** * Redistributions of source code must retain the above copyright
16** notice, this list of conditions and the following disclaimer.
17** * Redistributions in binary form must reproduce the above copyright
18** notice, this list of conditions and the following disclaimer in
19** the documentation and/or other materials provided with the
20** distribution.
21** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
22** the names of its contributors may be used to endorse or promote
23** products derived from this software without specific prior written
24** permission.
25**
26** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
37** $QT_END_LICENSE$
38**
39****************************************************************************/
40
41#ifndef FILEMANAGER_H
42#define FILEMANAGER_H
43
44#include <QBitArray>
45#include <QList>
46#include <QMutex>
47#include <QThread>
48#include <QWaitCondition>
49
50#include "metainfo.h"
51
52QT_BEGIN_NAMESPACE
53class QByteArray;
54class QFile;
55class QTimerEvent;
56QT_END_NAMESPACE
57
58class FileManager : public QThread
59{
60 Q_OBJECT
61
62public:
63 FileManager(QObject *parent = 0);
64 virtual ~FileManager();
65
66 inline void setMetaInfo(const MetaInfo &info) { metaInfo = info; }
67 inline void setDestinationFolder(const QString &directory) { destinationPath = directory; }
68
69 int read(int pieceIndex, int offset, int length);
70 void write(int pieceIndex, int offset, const QByteArray &data);
71 void verifyPiece(int pieceIndex);
72 inline qint64 totalSize() const { return totalLength; }
73
74 inline int pieceCount() const { return numPieces; }
75 int pieceLengthAt(int pieceIndex) const;
76
77 QBitArray completedPieces() const;
78 void setCompletedPieces(const QBitArray &pieces);
79
80 QString errorString() const;
81
82public slots:
83 void startDataVerification();
84
85signals:
86 void dataRead(int id, int pieceIndex, int offset, const QByteArray &data);
87 void error();
88 void verificationProgress(int percent);
89 void verificationDone();
90 void pieceVerified(int pieceIndex, bool verified);
91
92protected:
93 void run();
94
95private slots:
96 bool verifySinglePiece(int pieceIndex);
97 void wakeUp();
98
99private:
100 bool generateFiles();
101 QByteArray readBlock(int pieceIndex, int offset, int length);
102 bool writeBlock(int pieceIndex, int offset, const QByteArray &data);
103 void verifyFileContents();
104
105 struct WriteRequest {
106 int pieceIndex;
107 int offset;
108 QByteArray data;
109 };
110 struct ReadRequest {
111 int pieceIndex;
112 int offset;
113 int length;
114 int id;
115 };
116
117 QString errString;
118 QString destinationPath;
119 MetaInfo metaInfo;
120 QList<QFile *> files;
121 QList<QByteArray> sha1s;
122 QBitArray verifiedPieces;
123
124 bool newFile;
125 int pieceLength;
126 qint64 totalLength;
127 int numPieces;
128 int readId;
129 bool startVerification;
130 bool quit;
131 bool wokeUp;
132
133 QList<WriteRequest> writeRequests;
134 QList<ReadRequest> readRequests;
135 QList<int> pendingVerificationRequests;
136 QList<int> newPendingVerificationRequests;
137 QList<qint64> fileSizes;
138
139 mutable QMutex mutex;
140 mutable QWaitCondition cond;
141};
142
143#endif
Note: See TracBrowser for help on using the repository browser.