summaryrefslogtreecommitdiffstats
path: root/libktorrent/torrent/singlefilecache.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libktorrent/torrent/singlefilecache.cpp')
-rw-r--r--libktorrent/torrent/singlefilecache.cpp232
1 files changed, 0 insertions, 232 deletions
diff --git a/libktorrent/torrent/singlefilecache.cpp b/libktorrent/torrent/singlefilecache.cpp
deleted file mode 100644
index c89c0be..0000000
--- a/libktorrent/torrent/singlefilecache.cpp
+++ /dev/null
@@ -1,232 +0,0 @@
-/***************************************************************************
- * Copyright (C) 2005 by Joris Guisson *
- * joris.guisson@gmail.com *
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
- ***************************************************************************/
-#include <tdelocale.h>
-#include <tqfileinfo.h>
-#include <tqstringlist.h>
-#include <util/fileops.h>
-#include <util/error.h>
-#include <util/functions.h>
-#include <util/log.h>
-#include "torrent.h"
-#include "chunk.h"
-#include "globals.h"
-#include "cachefile.h"
-#include "singlefilecache.h"
-#include "preallocationthread.h"
-
-
-namespace bt
-{
-
- SingleFileCache::SingleFileCache(Torrent& tor,const TQString & tmpdir,const TQString & datadir)
- : Cache(tor,tmpdir,datadir),fd(0)
- {
- cache_file = tmpdir + "cache";
- output_file = TQFileInfo(cache_file).readLink();
- }
-
-
- SingleFileCache::~SingleFileCache()
- {}
-
- void SingleFileCache::changeTmpDir(const TQString & ndir)
- {
- Cache::changeTmpDir(ndir);
- cache_file = tmpdir + "cache";
- }
-
- TDEIO::Job* SingleFileCache::moveDataFiles(const TQString & ndir)
- {
- return TDEIO::move(KURL::fromPathOrURL(output_file),KURL::fromPathOrURL(ndir));
- }
-
- void SingleFileCache::moveDataFilesCompleted(TDEIO::Job* /*job*/)
- {
- }
-
- void bt::SingleFileCache::changeOutputPath(const TQString & outputpath)
- {
- bt::Delete(cache_file);
- output_file = outputpath;
- datadir = output_file.left(output_file.findRev(bt::DirSeparator()));
-
- bt::SymLink(output_file, cache_file);
- }
-
- bool SingleFileCache::prep(Chunk* c)
- {
- if (mmap_failures >= 3)
- {
- // mmap continuously fails, so stop using it
- c->allocate();
- c->setStatus(Chunk::BUFFERED);
- }
- else
- {
- Uint64 off = c->getIndex() * tor.getChunkSize();
- Uint8* buf = (Uint8*)fd->map(c,off,c->getSize(),CacheFile::RW);
- if (!buf)
- {
- mmap_failures++;
- // buffer it if mmapping fails
- Out(SYS_GEN|LOG_IMPORTANT) << "Warning : mmap failure, falling back to buffered mode" << endl;
- c->allocate();
- c->setStatus(Chunk::BUFFERED);
- }
- else
- {
- c->setData(buf,Chunk::MMAPPED);
- }
- }
- return true;
- }
-
- void SingleFileCache::load(Chunk* c)
- {
- Uint64 off = c->getIndex() * tor.getChunkSize();
- Uint8* buf = 0;
- if (mmap_failures >= 3 || !(buf = (Uint8*)fd->map(c,off,c->getSize(),CacheFile::READ)))
- {
- c->allocate();
- c->setStatus(Chunk::BUFFERED);
- fd->read(c->getData(),c->getSize(),off);
- if (mmap_failures < 3)
- mmap_failures++;
- }
- else
- {
- c->setData(buf,Chunk::MMAPPED);
- }
- }
-
- void SingleFileCache::save(Chunk* c)
- {
- // unmap the chunk if it is mapped
- if (c->getStatus() == Chunk::MMAPPED)
- {
- fd->unmap(c->getData(),c->getSize());
- c->clear();
- c->setStatus(Chunk::ON_DISK);
- }
- else if (c->getStatus() == Chunk::BUFFERED)
- {
- Uint64 off = c->getIndex() * tor.getChunkSize();
- fd->write(c->getData(),c->getSize(),off);
- c->clear();
- c->setStatus(Chunk::ON_DISK);
- }
- }
-
- void SingleFileCache::create()
- {
- TQFileInfo fi(cache_file);
- if (!fi.exists())
- {
- TQString out_file = fi.readLink();
-
- if (out_file.isNull())
- out_file = datadir + tor.getNameSuggestion();
-
- if (!bt::Exists(out_file))
- bt::Touch(out_file);
- else
- preexisting_files = true;
-
- if (bt::Exists(cache_file))
- bt::Delete(cache_file);
-
- bt::SymLink(out_file,cache_file);
- output_file = out_file;
- }
- else
- {
- TQString out_file = fi.readLink();
- if (!bt::Exists(out_file))
- bt::Touch(out_file);
- else
- preexisting_files = true;
- }
- }
-
- void SingleFileCache::close()
- {
- if (fd)
- {
- fd->close();
- delete fd;
- fd = 0;
- }
- }
-
- void SingleFileCache::open()
- {
- if (fd)
- return;
-
- try
- {
- fd = new CacheFile();
- fd->open(cache_file,tor.getFileLength());
- }
- catch (...)
- {
- fd->close();
- delete fd;
- fd = 0;
- throw;
- }
- }
-
- void SingleFileCache::preallocateDiskSpace(PreallocationThread* prealloc)
- {
- if (!fd)
- open();
-
- if (!prealloc->isStopped())
- fd->preallocate(prealloc);
- else
- prealloc->setNotFinished();
- }
-
- bool SingleFileCache::hasMissingFiles(TQStringList & sl)
- {
- TQFileInfo fi(cache_file);
- if (!fi.exists())
- {
- TQString out_file = fi.readLink();
- sl.append(fi.readLink());
- return true;
- }
- return false;
- }
-
- void SingleFileCache::deleteDataFiles()
- {
- bt::Delete(output_file);
- }
-
- Uint64 SingleFileCache::diskUsage()
- {
- if (!fd)
- open();
-
- return fd->diskUsage();
- }
-}