1/*
2 * Copyright 2004-2015, Haiku, Inc. All rights reserved.
3 * Copyright 2001, Dr. Zoidberg Enterprises. All rights reserved.
4 * Copyright 2011, Clemens Zeidler <haiku@clemens-zeidler.de>
5 *
6 * Distributed under the terms of the MIT License.
7 */
8
9
10//!	Notifies incoming e-mail
11
12
13#include <Alert.h>
14#include <Application.h>
15#include <Beep.h>
16#include <Catalog.h>
17#include <Message.h>
18#include <Path.h>
19#include <String.h>
20#include <StringFormat.h>
21
22#include <MailFilter.h>
23
24#include "NotifierConfigView.h"
25
26
27#undef B_TRANSLATION_CONTEXT
28#define B_TRANSLATION_CONTEXT "NotifierFilter"
29
30
31class NotifyFilter : public BMailFilter {
32public:
33								NotifyFilter(BMailProtocol& protocol,
34									const BMailAddOnSettings& settings);
35
36			BMailFilterAction	HeaderFetched(entry_ref& ref,
37									BFile& file, BMessage& attributes);
38			void				MailboxSynchronized(status_t status);
39
40private:
41			int32				fStrategy;
42			int32				fNNewMessages;
43};
44
45
46NotifyFilter::NotifyFilter(BMailProtocol& protocol,
47	const BMailAddOnSettings& settings)
48	:
49	BMailFilter(protocol, &settings),
50	fNNewMessages(0)
51{
52	fStrategy = settings.FindInt32("notification_method");
53}
54
55
56BMailFilterAction
57NotifyFilter::HeaderFetched(entry_ref& ref, BFile& file,
58	BMessage& attributes)
59{
60	// TODO: do not use MAIL:status here!
61	char statusString[256];
62	if (file.ReadAttr("MAIL:status", B_STRING_TYPE, 0, statusString, 256) < 0)
63		return B_NO_MAIL_ACTION;
64	if (BString(statusString).Compare("Read") != 0)
65		fNNewMessages++;
66	return B_NO_MAIL_ACTION;
67}
68
69
70void
71NotifyFilter::MailboxSynchronized(status_t status)
72{
73	if (fNNewMessages == 0)
74		return;
75
76	if ((fStrategy & NOTIFY_BEEP) != 0)
77		system_beep("New E-mail");
78
79	if ((fStrategy & NOTIFY_ALERT) != 0) {
80		BStringFormat format(B_TRANSLATE(
81			"You have {0, plural, one{one new message} other{# new messages}} "
82			"for %account."));
83
84		BString text;
85		format.Format(text, fNNewMessages);
86		text.ReplaceFirst("%account", fMailProtocol.AccountSettings().Name());
87
88		BAlert *alert = new BAlert(B_TRANSLATE("New messages"), text.String(),
89			B_TRANSLATE("OK"), NULL, NULL, B_WIDTH_AS_USUAL);
90		alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
91		alert->SetFeel(B_NORMAL_WINDOW_FEEL);
92		alert->Go(NULL);
93	}
94
95	if ((fStrategy & NOTIFY_BLINK_LEDS) != 0)
96		be_app->PostMessage('mblk');
97
98	if ((fStrategy & NOTIFY_CENTRAL_BEEP) != 0)
99		be_app->PostMessage('mcbp');
100
101	if ((fStrategy & NOTIFY_CENTRAL_ALERT) != 0) {
102		BMessage msg('numg');
103		msg.AddInt32("num_messages", fNNewMessages);
104		msg.AddString("name", fMailProtocol.AccountSettings().Name());
105
106		be_app->PostMessage(&msg);
107	}
108
109	if ((fStrategy & NOTIFY_NOTIFICATION) != 0) {
110		BStringFormat format(B_TRANSLATE("{0, plural, "
111			"one{One new message} other{# new messages}}"));
112
113		BString message;
114		format.Format(message, fNNewMessages);
115		fMailProtocol.ShowMessage(message.String());
116	}
117
118	fNNewMessages = 0;
119}
120
121
122// #pragma mark -
123
124
125BString
126filter_name(const BMailAccountSettings& accountSettings,
127	const BMailAddOnSettings* addOnSettings)
128{
129	return B_TRANSLATE("New mail notification");
130}
131
132
133BMailFilter*
134instantiate_filter(BMailProtocol& protocol, const BMailAddOnSettings& settings)
135{
136	return new NotifyFilter(protocol, settings);
137}
138
139