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