xref: /haiku/src/apps/installer/CopyEngine.h (revision f827b0168a3712e37c0d31d783a26baa92c05411)
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