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