haiku/src/servers/mail/DefaultNotifier.cpp

162 lines
3.5 KiB
C++

/*
* Copyright 2011-2012, Haiku, Inc. All rights reserved.
* Copyright 2011, Clemens Zeidler <haiku@clemens-zeidler.de>
*
* Distributed under the terms of the MIT License.
*/
#include "DefaultNotifier.h"
#include <Catalog.h>
#include <IconUtils.h>
#include <MailDaemon.h>
#include <Roster.h>
#include <MailPrivate.h>
#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "Notifier"
DefaultNotifier::DefaultNotifier(const char* accountName, bool inbound,
ErrorLogWindow* errorWindow, uint32 showMode)
:
fAccountName(accountName),
fIsInbound(inbound),
fErrorWindow(errorWindow),
fNotification(B_PROGRESS_NOTIFICATION),
fShowMode(showMode),
fTotalItems(0),
fItemsDone(0),
fTotalSize(0),
fSizeDone(0)
{
BString desc(fIsInbound ? B_TRANSLATE("Fetching mail for %name")
: B_TRANSLATE("Sending mail for %name"));
desc.ReplaceFirst("%name", fAccountName);
BString identifier;
identifier << accountName << inbound;
// Two windows for each acocunt : one for sending and the other for
// receiving mails
fNotification.SetMessageID(identifier);
fNotification.SetGroup(B_TRANSLATE("Mail status"));
fNotification.SetTitle(desc);
app_info info;
be_roster->GetAppInfo(B_MAIL_DAEMON_SIGNATURE, &info);
BBitmap icon(BRect(0, 0, 32, 32), B_RGBA32);
BNode node(&info.ref);
BIconUtils::GetVectorIcon(&node, "BEOS:ICON", &icon);
fNotification.SetIcon(&icon);
}
DefaultNotifier::~DefaultNotifier()
{
}
BMailNotifier*
DefaultNotifier::Clone()
{
return new DefaultNotifier(fAccountName, fIsInbound, fErrorWindow,
fShowMode);
}
void
DefaultNotifier::ShowError(const char* error)
{
fErrorWindow->AddError(B_WARNING_ALERT, error, fAccountName);
}
void
DefaultNotifier::ShowMessage(const char* message)
{
fErrorWindow->AddError(B_INFO_ALERT, message, fAccountName);
}
void
DefaultNotifier::SetTotalItems(uint32 items)
{
fTotalItems = items;
BString progress;
progress << fItemsDone << "/" << fTotalItems;
fNotification.SetContent(progress);
}
void
DefaultNotifier::SetTotalItemsSize(uint64 size)
{
fTotalSize = size;
fNotification.SetProgress(fSizeDone / (float)fTotalSize);
}
void
DefaultNotifier::ReportProgress(uint32 messages, uint64 bytes,
const char* message)
{
fSizeDone += bytes;
fItemsDone += messages;
if (fTotalSize > 0)
fNotification.SetProgress(fSizeDone / (float)fTotalSize);
else if (fTotalItems > 0) {
// No size information available
// Report progress in terms of message count instead
fNotification.SetProgress(fItemsDone / (float)fTotalItems);
} else {
// No message count information either
// TODO: we should use a B_INFORMATION_NOTIFICATION here, but it is not
// possible to change the BNotification type after creating it...
fNotification.SetProgress(0);
}
BString progress;
progress << message << "\t";
if (fTotalItems > 0)
progress << fItemsDone << "/" << fTotalItems;
fNotification.SetContent(progress);
int timeout = 0; // Default timeout
if (fItemsDone >= fTotalItems && fTotalItems != 0)
timeout = 1; // We're done, make the window go away faster
_NotifyIfAllowed(timeout);
}
void
DefaultNotifier::ResetProgress(const char* message)
{
fSizeDone = 0;
fItemsDone = 0;
fNotification.SetProgress(0);
if (message != NULL)
fNotification.SetTitle(message);
_NotifyIfAllowed(1); // go away faster
}
void
DefaultNotifier::_NotifyIfAllowed(int timeout)
{
int32 flag;
if (fIsInbound)
flag = B_MAIL_SHOW_STATUS_WINDOW_WHEN_ACTIVE;
else
flag = B_MAIL_SHOW_STATUS_WINDOW_WHEN_SENDING;
if ((fShowMode & flag) != 0)
fNotification.Send(timeout);
}