Disable clipboardsharing in view only mode.
[kdenetwork.git] / kget / core / datasourcefactory.cpp
blobc628a4699504c6337ed1a356d0884b66eaaf062e
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.
9 */
10 #include "datasourcefactory.h"
12 #include "transferdatasource.h"
14 #include <kio/filejob.h>
16 #include <KDebug>
18 DataSourceFactory::DataSourceFactory(const KUrl &dest, const KIO::fileoffset_t &size,
19 const KIO::fileoffset_t &segSize, QObject *parent)
20 : QObject(parent),
21 m_dest(dest),
22 m_size(size),
23 m_segSize(segSize),
24 m_chunks(0),
25 m_putJob(0)
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);
30 else
31 m_chunks = new BitSet(size / segSize);
33 m_chunks->clear();
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())
45 source->start();
48 void DataSourceFactory::stop()
50 foreach (TransferDataSource *source, m_dataSources.keys())
51 source->stop();
53 if (m_putJob)
54 m_putJob->close();
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)
68 source->stop();
69 m_dataSources.remove(source);
70 disconnect(source, 0, 0, 0);
73 void DataSourceFactory::assignSegment(TransferDataSource *source)
75 if (!source)
77 source = qobject_cast<TransferDataSource*>(QObject::sender());
78 if (!source)
79 return;
81 //TODO: Grep a _random_ chunk
82 if (m_chunks->allOn())
83 return;
85 int newchunk = 0;
86 for (uint i = 0; i != m_chunks->getNumBits(); i++)
88 if (m_chunks->get(i) == 0)
90 newchunk = i;
91 continue;
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);