162 lines
3.5 KiB
C++
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);
|
|
}
|