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