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_TRANSLATION_CONTEXT
15#define B_TRANSLATION_CONTEXT "InstallProgress"
16
17
18ProgressReporter::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
35ProgressReporter::~ProgressReporter()
36{
37	delete fMessage;
38}
39
40
41void
42ProgressReporter::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
59void
60ProgressReporter::AddItems(uint64 count, off_t bytes)
61{
62	fBytesToWrite += bytes;
63	fItemsToWrite += count;
64}
65
66
67void
68ProgressReporter::StartTimer()
69{
70	fStartTime = system_time();
71
72	printf("%" B_PRIdOFF " bytes to write in %" B_PRId64 " files\n",
73		fBytesToWrite, 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
83void
84ProgressReporter::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
94void
95ProgressReporter::_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