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