1/*
2 * Copyright 2011-2012, Haiku, Inc. All rights reserved.
3 * Copyright 2011, Clemens Zeidler <haiku@clemens-zeidler.de>
4 *
5 * Distributed under the terms of the MIT License.
6 */
7
8
9#include "DefaultNotifier.h"
10
11#include <Catalog.h>
12#include <IconUtils.h>
13#include <MailDaemon.h>
14#include <Roster.h>
15
16#include <MailPrivate.h>
17
18
19#undef B_TRANSLATION_CONTEXT
20#define B_TRANSLATION_CONTEXT "Notifier"
21
22
23DefaultNotifier::DefaultNotifier(const char* accountName, bool inbound,
24	ErrorLogWindow* errorWindow, uint32 showMode)
25	:
26	fAccountName(accountName),
27	fIsInbound(inbound),
28	fErrorWindow(errorWindow),
29	fNotification(B_PROGRESS_NOTIFICATION),
30	fShowMode(showMode),
31	fTotalItems(0),
32	fItemsDone(0),
33	fTotalSize(0),
34	fSizeDone(0)
35{
36	BString desc(fIsInbound ? B_TRANSLATE("Fetching mail for %name")
37		: B_TRANSLATE("Sending mail for %name"));
38	desc.ReplaceFirst("%name", fAccountName);
39
40	BString identifier;
41	identifier << accountName << inbound;
42		// Two windows for each acocunt : one for sending and the other for
43		// receiving mails
44	fNotification.SetMessageID(identifier);
45	fNotification.SetGroup(B_TRANSLATE("Mail status"));
46	fNotification.SetTitle(desc);
47
48	app_info info;
49	be_roster->GetAppInfo(B_MAIL_DAEMON_SIGNATURE, &info);
50	BBitmap icon(BRect(0, 0, 32, 32), B_RGBA32);
51	BNode node(&info.ref);
52	BIconUtils::GetVectorIcon(&node, "BEOS:ICON", &icon);
53	fNotification.SetIcon(&icon);
54}
55
56
57DefaultNotifier::~DefaultNotifier()
58{
59}
60
61
62BMailNotifier*
63DefaultNotifier::Clone()
64{
65	return new DefaultNotifier(fAccountName, fIsInbound, fErrorWindow,
66		fShowMode);
67}
68
69
70void
71DefaultNotifier::ShowError(const char* error)
72{
73	fErrorWindow->AddError(B_WARNING_ALERT, error, fAccountName);
74}
75
76
77void
78DefaultNotifier::ShowMessage(const char* message)
79{
80	fErrorWindow->AddError(B_INFO_ALERT, message, fAccountName);
81}
82
83
84void
85DefaultNotifier::SetTotalItems(uint32 items)
86{
87	fTotalItems = items;
88	BString progress;
89	progress << fItemsDone << "/" << fTotalItems;
90	fNotification.SetContent(progress);
91}
92
93
94void
95DefaultNotifier::SetTotalItemsSize(uint64 size)
96{
97	fTotalSize = size;
98	fNotification.SetProgress(fSizeDone / (float)fTotalSize);
99}
100
101
102void
103DefaultNotifier::ReportProgress(uint32 messages, uint64 bytes,
104	const char* message)
105{
106	fSizeDone += bytes;
107	fItemsDone += messages;
108
109	if (fTotalSize > 0)
110		fNotification.SetProgress(fSizeDone / (float)fTotalSize);
111	else if (fTotalItems > 0) {
112		// No size information available
113		// Report progress in terms of message count instead
114		fNotification.SetProgress(fItemsDone / (float)fTotalItems);
115	} else {
116		// No message count information either
117		// TODO: we should use a B_INFORMATION_NOTIFICATION here, but it is not
118		// possible to change the BNotification type after creating it...
119		fNotification.SetProgress(0);
120	}
121
122	BString progress;
123	progress << message << "\t";
124
125	if (fTotalItems > 0)
126		progress << fItemsDone << "/" << fTotalItems;
127
128	fNotification.SetContent(progress);
129
130	int timeout = 0; // Default timeout
131	if (fItemsDone >= fTotalItems && fTotalItems != 0)
132		timeout = 1; // We're done, make the window go away faster
133
134	_NotifyIfAllowed(timeout);
135}
136
137
138void
139DefaultNotifier::ResetProgress(const char* message)
140{
141	fSizeDone = 0;
142	fItemsDone = 0;
143	fNotification.SetProgress(0);
144	if (message != NULL)
145		fNotification.SetTitle(message);
146	_NotifyIfAllowed(1); // go away faster
147}
148
149
150void
151DefaultNotifier::_NotifyIfAllowed(int timeout)
152{
153	int32 flag;
154	if (fIsInbound)
155		flag = B_MAIL_SHOW_STATUS_WINDOW_WHEN_ACTIVE;
156	else
157		flag = B_MAIL_SHOW_STATUS_WINDOW_WHEN_SENDING;
158
159	if ((fShowMode & flag) != 0)
160		fNotification.Send(timeout);
161}
162