xref: /haiku/src/apps/installer/ProgressReporter.cpp (revision 5421c7d682a251f1cbcdfa1bf870ca1170584135)
1 /*
2  * Copyright 2009-2010, Stephan Aßmus <superstippi@gmx.de>
3  * All rights reserved. Distributed under the terms of the MIT License.
4  */
5 
6 #include "ProgressReporter.h"
7 
8 #include <stdio.h>
9 
10 #include <Catalog.h>
11 #include <Locale.h>
12 
13 
14 #undef B_TRANSLATE_CONTEXT
15 #define B_TRANSLATE_CONTEXT "InstallProgress"
16 
17 
18 ProgressReporter::ProgressReporter(const BMessenger& messenger,
19 		BMessage* message)
20 	:
21 	fStartTime(0),
22 
23 	fBytesToWrite(0),
24 	fBytesWritten(0),
25 
26 	fItemsToWrite(0),
27 	fItemsWritten(0),
28 
29 	fMessenger(messenger),
30 	fMessage(message)
31 {
32 }
33 
34 
35 ProgressReporter::~ProgressReporter()
36 {
37 	delete fMessage;
38 }
39 
40 
41 void
42 ProgressReporter::Reset()
43 {
44 	fBytesToWrite = 0;
45 	fBytesWritten = 0;
46 
47 	fItemsToWrite = 0;
48 	fItemsWritten = 0;
49 
50 	if (fMessage) {
51 		BMessage message(*fMessage);
52 		message.AddString("status",
53 			B_TRANSLATE("Collecting copy information."));
54 		fMessenger.SendMessage(&message);
55 	}
56 }
57 
58 
59 void
60 ProgressReporter::AddItems(uint64 count, off_t bytes)
61 {
62 	fBytesToWrite += bytes;
63 	fItemsToWrite += count;
64 }
65 
66 
67 void
68 ProgressReporter::StartTimer()
69 {
70 	fStartTime = system_time();
71 
72 	printf("%lld bytes to write in %lld files\n", fBytesToWrite,
73 		fItemsToWrite);
74 
75 	if (fMessage) {
76 		BMessage message(*fMessage);
77 		message.AddString("status", B_TRANSLATE("Performing installation."));
78 		fMessenger.SendMessage(&message);
79 	}
80 }
81 
82 
83 void
84 ProgressReporter::ItemsWritten(uint64 items, off_t bytes,
85 	const char* itemName, const char* targetFolder)
86 {
87 	fItemsWritten += items;
88 	fBytesWritten += bytes;
89 
90 	_UpdateProgress(itemName, targetFolder);
91 }
92 
93 
94 void
95 ProgressReporter::_UpdateProgress(const char* itemName,
96 	const char* targetFolder)
97 {
98 	if (fMessage == NULL)
99 		return;
100 
101 	// TODO: Could add time to finish calculation here...
102 
103 	BMessage message(*fMessage);
104 	float progress = 100.0 * fBytesWritten / fBytesToWrite;
105 	message.AddFloat("progress", progress);
106 	message.AddInt32("current", fItemsWritten);
107 	message.AddInt32("maximum", fItemsToWrite);
108 	message.AddString("item", itemName);
109 	message.AddString("folder", targetFolder);
110 	fMessenger.SendMessage(&message);
111 }
112