xref: /haiku/src/apps/installer/CopyEngine.h (revision dfb36b35b94318fa81319ce25a0b6288901b9b24)
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>
14ba6f7c8cSIngo Weinhold #include <String.h>
15f827b016SStephan Aßmus 
16f827b016SStephan Aßmus #include "BlockingQueue.h"
17f827b016SStephan Aßmus 
18f827b016SStephan Aßmus class BFile;
1972586154SStephan Aßmus class ProgressReporter;
20f827b016SStephan Aßmus 
218e3916f8SStephan Aßmus 
22f827b016SStephan Aßmus class CopyEngine {
23f827b016SStephan Aßmus public:
24c2be967eSIngo Weinhold 			class EntryFilter;
25c2be967eSIngo Weinhold 
26c2be967eSIngo Weinhold public:
27c2be967eSIngo Weinhold 								CopyEngine(ProgressReporter* reporter,
28c2be967eSIngo Weinhold 									EntryFilter* entryFilter);
29f827b016SStephan Aßmus 	virtual						~CopyEngine();
30f827b016SStephan Aßmus 
317f78035bSJérôme Duval 			void				ResetTargets(const char* source);
32d7737cc8SStephan Aßmus 			status_t			CollectTargets(const char* source,
33d7737cc8SStephan Aßmus 									sem_id cancelSemaphore = -1);
3492cd10f4SStephan Aßmus 
35bf551d38SLeorize 			status_t			Copy(const char* source,
36f827b016SStephan Aßmus 									const char* destination,
37bf551d38SLeorize 									sem_id cancelSemaphore = -1,
38bf551d38SLeorize 									bool copyAttributes = true);
39f827b016SStephan Aßmus 
40*dfb36b35SNiels Sascha Reedijk 	static	status_t			RemoveFolder(BEntry& entry);
41*dfb36b35SNiels Sascha Reedijk 
42f827b016SStephan Aßmus private:
43f827b016SStephan Aßmus 			status_t			_CollectCopyInfo(const char* source,
443f7f9896SNiels Sascha Reedijk 									sem_id cancelSemaphore, off_t& bytesToCopy,
453f7f9896SNiels Sascha Reedijk 									uint64& itemsToCopy);
463f7f9896SNiels Sascha Reedijk 			status_t			_Copy(BEntry& source, BEntry& destination,
473f7f9896SNiels Sascha Reedijk 									sem_id cancelSemaphore,
48bf551d38SLeorize 									bool copyAttributes);
49bf551d38SLeorize 			status_t			_CopyData(const BEntry& entry,
50bf551d38SLeorize 									const BEntry& destination,
51bf551d38SLeorize 									sem_id cancelSemaphore = -1);
52f827b016SStephan Aßmus 
53ba6f7c8cSIngo Weinhold 			const char*			_RelativeEntryPath(
54ba6f7c8cSIngo Weinhold 									const char* absoluteSourcePath) const;
55ba6f7c8cSIngo Weinhold 
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 {
BufferBuffer67f827b016SStephan 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 				}
~BufferBuffer76f827b016SStephan 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 
89ba6f7c8cSIngo Weinhold private:
90f827b016SStephan Aßmus 	BlockingQueue<Buffer>		fBufferQueue;
91f827b016SStephan Aßmus 
92f827b016SStephan Aßmus 			thread_id			fWriterThread;
93f827b016SStephan Aßmus 	volatile bool				fQuitting;
94f827b016SStephan Aßmus 
95ba6f7c8cSIngo Weinhold 			BString				fAbsoluteSourcePath;
96ba6f7c8cSIngo Weinhold 
97f827b016SStephan Aßmus 			off_t				fBytesRead;
98224c9ca6SStephan Aßmus 			off_t				fLastBytesRead;
99f827b016SStephan Aßmus 			uint64				fItemsCopied;
10072586154SStephan Aßmus 			uint64				fLastItemsCopied;
101f827b016SStephan Aßmus 			bigtime_t			fTimeRead;
102f827b016SStephan Aßmus 
103f827b016SStephan Aßmus 			off_t				fBytesWritten;
104f827b016SStephan Aßmus 			bigtime_t			fTimeWritten;
105f827b016SStephan Aßmus 
106f827b016SStephan Aßmus 			const char*			fCurrentTargetFolder;
107f827b016SStephan Aßmus 			const char*			fCurrentItem;
108f827b016SStephan Aßmus 
10972586154SStephan Aßmus 			ProgressReporter*	fProgressReporter;
110c2be967eSIngo Weinhold 			EntryFilter*		fEntryFilter;
111c2be967eSIngo Weinhold };
1126ff00ae7SStephan Aßmus 
113c2be967eSIngo Weinhold 
114c2be967eSIngo Weinhold class CopyEngine::EntryFilter {
115c2be967eSIngo Weinhold public:
116c2be967eSIngo Weinhold 	virtual						~EntryFilter();
117c2be967eSIngo Weinhold 
118c2be967eSIngo Weinhold 	virtual	bool				ShouldCopyEntry(const BEntry& entry,
119ba6f7c8cSIngo Weinhold 									const char* path,
1203f7f9896SNiels Sascha Reedijk 									const struct stat& statInfo) const = 0;
121f827b016SStephan Aßmus };
122f827b016SStephan Aßmus 
123f827b016SStephan Aßmus 
1248e3916f8SStephan Aßmus #endif // COPY_ENGINE_H
125