1*f827b016SStephan Aßmus /* 2*f827b016SStephan Aßmus * Copyright 2008-2009, Stephan Aßmus <superstippi@gmx.de> 3*f827b016SStephan Aßmus * All rights reserved. Distributed under the terms of the MIT License. 4*f827b016SStephan Aßmus */ 5*f827b016SStephan Aßmus #ifndef COPY_ENGINE_H 6*f827b016SStephan Aßmus #define COPY_ENGINE_H 7*f827b016SStephan Aßmus 8*f827b016SStephan Aßmus 9*f827b016SStephan Aßmus #include <stdlib.h> 10*f827b016SStephan Aßmus 11*f827b016SStephan Aßmus #include <Entry.h> 12*f827b016SStephan Aßmus #include <File.h> 13*f827b016SStephan Aßmus #include <Messenger.h> 14*f827b016SStephan Aßmus 15*f827b016SStephan Aßmus #include "BlockingQueue.h" 16*f827b016SStephan Aßmus 17*f827b016SStephan Aßmus class BFile; 18*f827b016SStephan Aßmus class BLocker; 19*f827b016SStephan Aßmus class BMessage; 20*f827b016SStephan Aßmus class BMessenger; 21*f827b016SStephan Aßmus 22*f827b016SStephan Aßmus class CopyEngine { 23*f827b016SStephan Aßmus public: 24*f827b016SStephan Aßmus CopyEngine(const BMessenger& messenger, 25*f827b016SStephan Aßmus BMessage* message); 26*f827b016SStephan Aßmus virtual ~CopyEngine(); 27*f827b016SStephan Aßmus 28*f827b016SStephan Aßmus status_t CopyFolder(const char* source, 29*f827b016SStephan Aßmus const char* destination, 30*f827b016SStephan Aßmus BLocker* locker = NULL); 31*f827b016SStephan Aßmus 32*f827b016SStephan Aßmus status_t CopyFile(const BEntry& entry, 33*f827b016SStephan Aßmus const BEntry& destination, 34*f827b016SStephan Aßmus BLocker* locker = NULL); 35*f827b016SStephan Aßmus 36*f827b016SStephan Aßmus private: 37*f827b016SStephan Aßmus status_t _CollectCopyInfo(const char* source, 38*f827b016SStephan Aßmus int32& level); 39*f827b016SStephan Aßmus status_t _CopyFolder(const char* source, 40*f827b016SStephan Aßmus const char* destination, 41*f827b016SStephan Aßmus int32& level, 42*f827b016SStephan Aßmus BLocker* locker = NULL); 43*f827b016SStephan Aßmus 44*f827b016SStephan Aßmus bool _ShouldCopyEntry(const char* name, 45*f827b016SStephan Aßmus const struct stat& statInfo, 46*f827b016SStephan Aßmus int32 level) const; 47*f827b016SStephan Aßmus 48*f827b016SStephan Aßmus void _UpdateProgress(); 49*f827b016SStephan Aßmus 50*f827b016SStephan Aßmus static int32 _WriteThreadEntry(void* cookie); 51*f827b016SStephan Aßmus void _WriteThread(); 52*f827b016SStephan Aßmus 53*f827b016SStephan Aßmus private: 54*f827b016SStephan Aßmus enum { 55*f827b016SStephan Aßmus BUFFER_COUNT = 16, 56*f827b016SStephan Aßmus BUFFER_SIZE = 1024 * 1024 57*f827b016SStephan Aßmus }; 58*f827b016SStephan Aßmus struct Buffer { 59*f827b016SStephan Aßmus Buffer(BFile* file) 60*f827b016SStephan Aßmus : file(file) 61*f827b016SStephan Aßmus , buffer(malloc(BUFFER_SIZE)) 62*f827b016SStephan Aßmus , size(BUFFER_SIZE) 63*f827b016SStephan Aßmus , validBytes(0) 64*f827b016SStephan Aßmus , deleteFile(false) 65*f827b016SStephan Aßmus { 66*f827b016SStephan Aßmus } 67*f827b016SStephan Aßmus ~Buffer() 68*f827b016SStephan Aßmus { 69*f827b016SStephan Aßmus if (deleteFile) 70*f827b016SStephan Aßmus delete file; 71*f827b016SStephan Aßmus free(buffer); 72*f827b016SStephan Aßmus } 73*f827b016SStephan Aßmus BFile* file; 74*f827b016SStephan Aßmus void* buffer; 75*f827b016SStephan Aßmus size_t size; 76*f827b016SStephan Aßmus size_t validBytes; 77*f827b016SStephan Aßmus bool deleteFile; 78*f827b016SStephan Aßmus }; 79*f827b016SStephan Aßmus 80*f827b016SStephan Aßmus BlockingQueue<Buffer> fBufferQueue; 81*f827b016SStephan Aßmus 82*f827b016SStephan Aßmus thread_id fWriterThread; 83*f827b016SStephan Aßmus volatile bool fQuitting; 84*f827b016SStephan Aßmus 85*f827b016SStephan Aßmus off_t fBytesRead; 86*f827b016SStephan Aßmus uint64 fItemsCopied; 87*f827b016SStephan Aßmus bigtime_t fTimeRead; 88*f827b016SStephan Aßmus 89*f827b016SStephan Aßmus off_t fBytesWritten; 90*f827b016SStephan Aßmus bigtime_t fTimeWritten; 91*f827b016SStephan Aßmus 92*f827b016SStephan Aßmus off_t fBytesToCopy; 93*f827b016SStephan Aßmus uint64 fItemsToCopy; 94*f827b016SStephan Aßmus 95*f827b016SStephan Aßmus const char* fCurrentTargetFolder; 96*f827b016SStephan Aßmus const char* fCurrentItem; 97*f827b016SStephan Aßmus 98*f827b016SStephan Aßmus BMessenger fMessenger; 99*f827b016SStephan Aßmus BMessage* fMessage; 100*f827b016SStephan Aßmus }; 101*f827b016SStephan Aßmus 102*f827b016SStephan Aßmus 103*f827b016SStephan Aßmus #endif // COPY_ENGINE_2_H 104