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; 18f827b016SStephan Aßmus class BMessage; 19f827b016SStephan Aßmus class BMessenger; 20f827b016SStephan Aßmus 21f827b016SStephan Aßmus class CopyEngine { 22f827b016SStephan Aßmus public: 23f827b016SStephan Aßmus CopyEngine(const BMessenger& messenger, 24f827b016SStephan Aßmus BMessage* message); 25f827b016SStephan Aßmus virtual ~CopyEngine(); 26f827b016SStephan Aßmus 2792cd10f4SStephan Aßmus void ResetTargets(); 28*d7737cc8SStephan Aßmus status_t CollectTargets(const char* source, 29*d7737cc8SStephan Aßmus sem_id cancelSemaphore = -1); 3092cd10f4SStephan Aßmus 31f827b016SStephan Aßmus status_t CopyFolder(const char* source, 32f827b016SStephan Aßmus const char* destination, 33*d7737cc8SStephan Aßmus sem_id cancelSemaphore = -1); 34f827b016SStephan Aßmus 35f827b016SStephan Aßmus status_t CopyFile(const BEntry& entry, 36f827b016SStephan Aßmus const BEntry& destination, 37*d7737cc8SStephan Aßmus sem_id cancelSemaphore = -1); 38f827b016SStephan Aßmus 39f827b016SStephan Aßmus private: 40f827b016SStephan Aßmus status_t _CollectCopyInfo(const char* source, 41*d7737cc8SStephan Aßmus int32& level, sem_id cancelSemaphore); 42f827b016SStephan Aßmus status_t _CopyFolder(const char* source, 43f827b016SStephan Aßmus const char* destination, 44*d7737cc8SStephan Aßmus int32& level, sem_id cancelSemaphore); 45f827b016SStephan Aßmus 46f827b016SStephan Aßmus bool _ShouldCopyEntry(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) 68f827b016SStephan Aßmus : file(file) 69f827b016SStephan Aßmus , buffer(malloc(BUFFER_SIZE)) 70f827b016SStephan Aßmus , size(BUFFER_SIZE) 71f827b016SStephan Aßmus , validBytes(0) 72f827b016SStephan Aßmus , deleteFile(false) 73f827b016SStephan Aßmus { 74f827b016SStephan Aßmus } 75f827b016SStephan Aßmus ~Buffer() 76f827b016SStephan Aßmus { 77f827b016SStephan Aßmus if (deleteFile) 78f827b016SStephan Aßmus delete file; 79f827b016SStephan Aßmus free(buffer); 80f827b016SStephan Aßmus } 81f827b016SStephan Aßmus BFile* file; 82f827b016SStephan Aßmus void* buffer; 83f827b016SStephan Aßmus size_t size; 84f827b016SStephan Aßmus size_t validBytes; 85f827b016SStephan Aßmus bool deleteFile; 86f827b016SStephan Aßmus }; 87f827b016SStephan Aßmus 88f827b016SStephan Aßmus BlockingQueue<Buffer> fBufferQueue; 89f827b016SStephan Aßmus 90f827b016SStephan Aßmus thread_id fWriterThread; 91f827b016SStephan Aßmus volatile bool fQuitting; 92f827b016SStephan Aßmus 93f827b016SStephan Aßmus off_t fBytesRead; 94f827b016SStephan Aßmus uint64 fItemsCopied; 95f827b016SStephan Aßmus bigtime_t fTimeRead; 96f827b016SStephan Aßmus 97f827b016SStephan Aßmus off_t fBytesWritten; 98f827b016SStephan Aßmus bigtime_t fTimeWritten; 99f827b016SStephan Aßmus 100f827b016SStephan Aßmus off_t fBytesToCopy; 101f827b016SStephan Aßmus uint64 fItemsToCopy; 102f827b016SStephan Aßmus 103f827b016SStephan Aßmus const char* fCurrentTargetFolder; 104f827b016SStephan Aßmus const char* fCurrentItem; 105f827b016SStephan Aßmus 106f827b016SStephan Aßmus BMessenger fMessenger; 107f827b016SStephan Aßmus BMessage* fMessage; 108f827b016SStephan Aßmus }; 109f827b016SStephan Aßmus 110f827b016SStephan Aßmus 111f827b016SStephan Aßmus #endif // COPY_ENGINE_2_H 112