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> 14f827b016SStephan Aßmus 15f827b016SStephan Aßmus #include "BlockingQueue.h" 16f827b016SStephan Aßmus 17f827b016SStephan Aßmus class BFile; 1872586154SStephan Aßmus class ProgressReporter; 19f827b016SStephan Aßmus 208e3916f8SStephan Aßmus 21f827b016SStephan Aßmus class CopyEngine { 22f827b016SStephan Aßmus public: 2372586154SStephan Aßmus CopyEngine(ProgressReporter* reporter); 24f827b016SStephan Aßmus virtual ~CopyEngine(); 25f827b016SStephan Aßmus 26*7f78035bSJérôme Duval void ResetTargets(const char* source); 27d7737cc8SStephan Aßmus status_t CollectTargets(const char* source, 28d7737cc8SStephan Aßmus sem_id cancelSemaphore = -1); 2992cd10f4SStephan Aßmus 30f827b016SStephan Aßmus status_t CopyFolder(const char* source, 31f827b016SStephan Aßmus const char* destination, 32d7737cc8SStephan Aßmus sem_id cancelSemaphore = -1); 33f827b016SStephan Aßmus 34f827b016SStephan Aßmus status_t CopyFile(const BEntry& entry, 35f827b016SStephan Aßmus const BEntry& destination, 36d7737cc8SStephan Aßmus sem_id cancelSemaphore = -1); 37f827b016SStephan Aßmus 38f827b016SStephan Aßmus private: 39f827b016SStephan Aßmus status_t _CollectCopyInfo(const char* source, 40d7737cc8SStephan Aßmus int32& level, sem_id cancelSemaphore); 41f827b016SStephan Aßmus status_t _CopyFolder(const char* source, 42f827b016SStephan Aßmus const char* destination, 43d7737cc8SStephan Aßmus int32& level, sem_id cancelSemaphore); 44f827b016SStephan Aßmus 456ff00ae7SStephan Aßmus bool _ShouldCopyEntry(const BEntry& entry, 466ff00ae7SStephan Aßmus const char* name, 47f827b016SStephan Aßmus const struct stat& statInfo, 48f827b016SStephan Aßmus int32 level) const; 49f827b016SStephan Aßmus 50f76e944eSStephan Aßmus bool _ShouldClobberFolder(const char* name, 51f76e944eSStephan Aßmus const struct stat& statInfo, 52f76e944eSStephan Aßmus int32 level) const; 53f76e944eSStephan Aßmus 54f76e944eSStephan Aßmus status_t _RemoveFolder(BEntry& entry); 55f76e944eSStephan Aßmus 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 { 67f827b016SStephan 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 } 76f827b016SStephan 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 89f827b016SStephan Aßmus BlockingQueue<Buffer> fBufferQueue; 90f827b016SStephan Aßmus 91f827b016SStephan Aßmus thread_id fWriterThread; 92f827b016SStephan Aßmus volatile bool fQuitting; 93f827b016SStephan Aßmus 94f827b016SStephan Aßmus off_t fBytesRead; 95224c9ca6SStephan Aßmus off_t fLastBytesRead; 96f827b016SStephan Aßmus uint64 fItemsCopied; 9772586154SStephan Aßmus uint64 fLastItemsCopied; 98f827b016SStephan Aßmus bigtime_t fTimeRead; 99f827b016SStephan Aßmus 100f827b016SStephan Aßmus off_t fBytesWritten; 101f827b016SStephan Aßmus bigtime_t fTimeWritten; 102f827b016SStephan Aßmus 103f827b016SStephan Aßmus off_t fBytesToCopy; 104f827b016SStephan Aßmus uint64 fItemsToCopy; 105f827b016SStephan Aßmus 106f827b016SStephan Aßmus const char* fCurrentTargetFolder; 107f827b016SStephan Aßmus const char* fCurrentItem; 108f827b016SStephan Aßmus 10972586154SStephan Aßmus ProgressReporter* fProgressReporter; 1106ff00ae7SStephan Aßmus 1116ff00ae7SStephan Aßmus // TODO: Should be made into a list of BEntris to be ignored, perhaps. 11251f50b12SStephan Aßmus // settable by method... 1136ff00ae7SStephan Aßmus BEntry fVarDirectory; 114f827b016SStephan Aßmus }; 115f827b016SStephan Aßmus 116f827b016SStephan Aßmus 1178e3916f8SStephan Aßmus #endif // COPY_ENGINE_H 118