1 /* This file is part of the KDE project
3 Copyright (C) 2008 Lukas Appelhans <l.appelhans@gmx.de>
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
10 #include "datasourcefactory.h"
12 #include "transferdatasource.h"
14 #include <kio/filejob.h>
18 DataSourceFactory::DataSourceFactory(const KUrl
&dest
, const KIO::fileoffset_t
&size
,
19 const KIO::fileoffset_t
&segSize
, QObject
*parent
)
27 kDebug(5001) << "Initialize DataSourceFactory: Dest: " + m_dest
.url() + "Size: " + QString::number(size
) + "SegSize: " + QString::number(segSize
);
28 if ((float) size
/ segSize
!= (int) size
/ segSize
)
29 m_chunks
= new BitSet((size
/ segSize
) + 1);
31 m_chunks
= new BitSet(size
/ segSize
);
36 DataSourceFactory::~DataSourceFactory()
40 void DataSourceFactory::start()
42 kDebug(5001) << "Start DataSourceFactory";
43 m_putJob
= KIO::open(m_dest
, QIODevice::WriteOnly
| QIODevice::ReadOnly
);
44 foreach (TransferDataSource
*source
, m_dataSources
.keys())
48 void DataSourceFactory::stop()
50 foreach (TransferDataSource
*source
, m_dataSources
.keys())
57 void DataSourceFactory::addDataSource(TransferDataSource
*source
, const KUrl
&url
)
59 m_dataSources
.insert(source
, url
);
60 assignSegment(source
);
61 connect(source
, SIGNAL(broken()), SLOT(assignSegment()));
62 connect(source
, SIGNAL(finished()), SLOT(assignSegment()));
63 connect(source
, SIGNAL(data(const KIO::fileoffset_t
&, const QByteArray
&)), SLOT(writeData(const KIO::fileoffset_t
&, const QByteArray
&)));
66 void DataSourceFactory::removeDataSource(TransferDataSource
*source
)
69 m_dataSources
.remove(source
);
70 disconnect(source
, 0, 0, 0);
73 void DataSourceFactory::assignSegment(TransferDataSource
*source
)
77 source
= qobject_cast
<TransferDataSource
*>(QObject::sender());
81 //TODO: Grep a _random_ chunk
82 if (m_chunks
->allOn())
86 for (uint i
= 0; i
!= m_chunks
->getNumBits(); i
++)
88 if (m_chunks
->get(i
) == 0)
94 KIO::fileoffset_t newoff
= KIO::fileoffset_t(newchunk
* m_segSize
);
95 m_chunks
->set(newchunk
, true);
96 source
->addSegment(m_dataSources
.value(source
), newoff
, m_segSize
);
99 void DataSourceFactory::writeData(const KIO::fileoffset_t
&offset
, const QByteArray
&data
)
101 kDebug(5001) << "Offset: " << offset
<< " Data: " << data
;
102 m_putJob
->seek(offset
);
103 m_putJob
->write(data
);