1f827b016SStephan Aßmus /* 2f827b016SStephan Aßmus * Copyright 2008-2009, Stephan Aßmus <superstippi@gmx.de> 3f827b016SStephan Aßmus * All rights reserved. Distributed under the terms of the MIT License. 4f827b016SStephan Aßmus */ 5f827b016SStephan Aßmus #ifndef COPY_ENGINE_H 6f827b016SStephan Aßmus #define COPY_ENGINE_H 7f827b016SStephan Aßmus 8f827b016SStephan Aßmus 9f827b016SStephan Aßmus #include <stdlib.h> 10f827b016SStephan Aßmus 11f827b016SStephan Aßmus #include <Entry.h> 12f827b016SStephan Aßmus #include <File.h> 13f827b016SStephan Aßmus #include <Messenger.h> 14ba6f7c8cSIngo Weinhold #include <String.h> 15f827b016SStephan Aßmus 16f827b016SStephan Aßmus #include "BlockingQueue.h" 17f827b016SStephan Aßmus 18f827b016SStephan Aßmus class BFile; 1972586154SStephan Aßmus class ProgressReporter; 20f827b016SStephan Aßmus 218e3916f8SStephan Aßmus 22f827b016SStephan Aßmus class CopyEngine { 23f827b016SStephan Aßmus public: 24c2be967eSIngo Weinhold class EntryFilter; 25c2be967eSIngo Weinhold 26c2be967eSIngo Weinhold public: 27c2be967eSIngo Weinhold CopyEngine(ProgressReporter* reporter, 28c2be967eSIngo Weinhold EntryFilter* entryFilter); 29f827b016SStephan Aßmus virtual ~CopyEngine(); 30f827b016SStephan Aßmus 317f78035bSJérôme Duval void ResetTargets(const char* source); 32d7737cc8SStephan Aßmus status_t CollectTargets(const char* source, 33d7737cc8SStephan Aßmus sem_id cancelSemaphore = -1); 3492cd10f4SStephan Aßmus 35bf551d38SLeorize status_t Copy(const char* source, 36f827b016SStephan Aßmus const char* destination, 37bf551d38SLeorize sem_id cancelSemaphore = -1, 38bf551d38SLeorize bool copyAttributes = true); 39f827b016SStephan Aßmus 40*dfb36b35SNiels Sascha Reedijk static status_t RemoveFolder(BEntry& entry); 41*dfb36b35SNiels Sascha Reedijk 42f827b016SStephan Aßmus private: 43f827b016SStephan Aßmus status_t _CollectCopyInfo(const char* source, 443f7f9896SNiels Sascha Reedijk sem_id cancelSemaphore, off_t& bytesToCopy, 453f7f9896SNiels Sascha Reedijk uint64& itemsToCopy); 463f7f9896SNiels Sascha Reedijk status_t _Copy(BEntry& source, BEntry& destination, 473f7f9896SNiels Sascha Reedijk sem_id cancelSemaphore, 48bf551d38SLeorize bool copyAttributes); 49bf551d38SLeorize status_t _CopyData(const BEntry& entry, 50bf551d38SLeorize const BEntry& destination, 51bf551d38SLeorize sem_id cancelSemaphore = -1); 52f827b016SStephan Aßmus 53ba6f7c8cSIngo Weinhold const char* _RelativeEntryPath( 54ba6f7c8cSIngo Weinhold const char* absoluteSourcePath) const; 55ba6f7c8cSIngo Weinhold 56f827b016SStephan Aßmus void _UpdateProgress(); 57f827b016SStephan Aßmus 58f827b016SStephan Aßmus static int32 _WriteThreadEntry(void* cookie); 59f827b016SStephan Aßmus void _WriteThread(); 60f827b016SStephan Aßmus 61f827b016SStephan Aßmus private: 62f827b016SStephan Aßmus enum { 63f827b016SStephan Aßmus BUFFER_COUNT = 16, 64f827b016SStephan Aßmus BUFFER_SIZE = 1024 * 1024 65f827b016SStephan Aßmus }; 66f827b016SStephan Aßmus struct Buffer { BufferBuffer67f827b016SStephan Aßmus Buffer(BFile* file) 68da268834SStephan Aßmus : 69da268834SStephan Aßmus file(file), 70da268834SStephan Aßmus buffer(malloc(BUFFER_SIZE)), 71da268834SStephan Aßmus size(BUFFER_SIZE), 72da268834SStephan Aßmus validBytes(0), 73da268834SStephan Aßmus deleteFile(false) 74f827b016SStephan Aßmus { 75f827b016SStephan Aßmus } ~BufferBuffer76f827b016SStephan Aßmus ~Buffer() 77f827b016SStephan Aßmus { 78f827b016SStephan Aßmus if (deleteFile) 79f827b016SStephan Aßmus delete file; 80f827b016SStephan Aßmus free(buffer); 81f827b016SStephan Aßmus } 82f827b016SStephan Aßmus BFile* file; 83f827b016SStephan Aßmus void* buffer; 84f827b016SStephan Aßmus size_t size; 85f827b016SStephan Aßmus size_t validBytes; 86f827b016SStephan Aßmus bool deleteFile; 87f827b016SStephan Aßmus }; 88f827b016SStephan Aßmus 89ba6f7c8cSIngo Weinhold private: 90f827b016SStephan Aßmus BlockingQueue<Buffer> fBufferQueue; 91f827b016SStephan Aßmus 92f827b016SStephan Aßmus thread_id fWriterThread; 93f827b016SStephan Aßmus volatile bool fQuitting; 94f827b016SStephan Aßmus 95ba6f7c8cSIngo Weinhold BString fAbsoluteSourcePath; 96ba6f7c8cSIngo Weinhold 97f827b016SStephan Aßmus off_t fBytesRead; 98224c9ca6SStephan Aßmus off_t fLastBytesRead; 99f827b016SStephan Aßmus uint64 fItemsCopied; 10072586154SStephan Aßmus uint64 fLastItemsCopied; 101f827b016SStephan Aßmus bigtime_t fTimeRead; 102f827b016SStephan Aßmus 103f827b016SStephan Aßmus off_t fBytesWritten; 104f827b016SStephan Aßmus bigtime_t fTimeWritten; 105f827b016SStephan Aßmus 106f827b016SStephan Aßmus const char* fCurrentTargetFolder; 107f827b016SStephan Aßmus const char* fCurrentItem; 108f827b016SStephan Aßmus 10972586154SStephan Aßmus ProgressReporter* fProgressReporter; 110c2be967eSIngo Weinhold EntryFilter* fEntryFilter; 111c2be967eSIngo Weinhold }; 1126ff00ae7SStephan Aßmus 113c2be967eSIngo Weinhold 114c2be967eSIngo Weinhold class CopyEngine::EntryFilter { 115c2be967eSIngo Weinhold public: 116c2be967eSIngo Weinhold virtual ~EntryFilter(); 117c2be967eSIngo Weinhold 118c2be967eSIngo Weinhold virtual bool ShouldCopyEntry(const BEntry& entry, 119ba6f7c8cSIngo Weinhold const char* path, 1203f7f9896SNiels Sascha Reedijk const struct stat& statInfo) const = 0; 121f827b016SStephan Aßmus }; 122f827b016SStephan Aßmus 123f827b016SStephan Aßmus 1248e3916f8SStephan Aßmus #endif // COPY_ENGINE_H 125