haiku/src/apps/installer/CopyEngine.h

125 lines
2.6 KiB
C++

/*
* Copyright 2008-2009, Stephan Aßmus <superstippi@gmx.de>
* All rights reserved. Distributed under the terms of the MIT License.
*/
#ifndef COPY_ENGINE_H
#define COPY_ENGINE_H
#include <stdlib.h>
#include <Entry.h>
#include <File.h>
#include <Messenger.h>
#include <String.h>
#include "BlockingQueue.h"
class BFile;
class ProgressReporter;
class CopyEngine {
public:
class EntryFilter;
public:
CopyEngine(ProgressReporter* reporter,
EntryFilter* entryFilter);
virtual ~CopyEngine();
void ResetTargets(const char* source);
status_t CollectTargets(const char* source,
sem_id cancelSemaphore = -1);
status_t Copy(const char* source,
const char* destination,
sem_id cancelSemaphore = -1,
bool copyAttributes = true);
static status_t RemoveFolder(BEntry& entry);
private:
status_t _CollectCopyInfo(const char* source,
sem_id cancelSemaphore, off_t& bytesToCopy,
uint64& itemsToCopy);
status_t _Copy(BEntry& source, BEntry& destination,
sem_id cancelSemaphore,
bool copyAttributes);
status_t _CopyData(const BEntry& entry,
const BEntry& destination,
sem_id cancelSemaphore = -1);
const char* _RelativeEntryPath(
const char* absoluteSourcePath) const;
void _UpdateProgress();
static int32 _WriteThreadEntry(void* cookie);
void _WriteThread();
private:
enum {
BUFFER_COUNT = 16,
BUFFER_SIZE = 1024 * 1024
};
struct Buffer {
Buffer(BFile* file)
:
file(file),
buffer(malloc(BUFFER_SIZE)),
size(BUFFER_SIZE),
validBytes(0),
deleteFile(false)
{
}
~Buffer()
{
if (deleteFile)
delete file;
free(buffer);
}
BFile* file;
void* buffer;
size_t size;
size_t validBytes;
bool deleteFile;
};
private:
BlockingQueue<Buffer> fBufferQueue;
thread_id fWriterThread;
volatile bool fQuitting;
BString fAbsoluteSourcePath;
off_t fBytesRead;
off_t fLastBytesRead;
uint64 fItemsCopied;
uint64 fLastItemsCopied;
bigtime_t fTimeRead;
off_t fBytesWritten;
bigtime_t fTimeWritten;
const char* fCurrentTargetFolder;
const char* fCurrentItem;
ProgressReporter* fProgressReporter;
EntryFilter* fEntryFilter;
};
class CopyEngine::EntryFilter {
public:
virtual ~EntryFilter();
virtual bool ShouldCopyEntry(const BEntry& entry,
const char* path,
const struct stat& statInfo) const = 0;
};
#endif // COPY_ENGINE_H