xref: /haiku/src/servers/notification/NotificationServer.cpp (revision 220d04022750f40f8bac8f01fa551211e28d04f2)
1 /*
2  * Copyright 2010, Haiku, Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Pier Luigi Fiorini, pierluigi.fiorini@gmail.com
7  */
8 
9 #include <Beep.h>
10 #include <Notifications.h>
11 #include <PropertyInfo.h>
12 
13 #include "NotificationWindow.h"
14 #include "NotificationServer.h"
15 
16 const char* kSoundNames[] = {
17 	"Information notification",
18 	"Important notification",
19 	"Error notification",
20 	"Progress notification",
21 	NULL
22 };
23 
24 
25 NotificationServer::NotificationServer()
26 	: BApplication(kNotificationServerSignature)
27 {
28 }
29 
30 
31 NotificationServer::~NotificationServer()
32 {
33 }
34 
35 
36 void
37 NotificationServer::ReadyToRun()
38 {
39 	fWindow = new NotificationWindow();
40 }
41 
42 
43 void
44 NotificationServer::MessageReceived(BMessage* message)
45 {
46 	switch (message->what) {
47 		case kNotificationMessage:
48 		{
49 			// Skip this message if we don't have the window
50 			if (!fWindow)
51 				return;
52 
53 			int32 type = 0;
54 
55 			// Emit a sound for this event
56 			if (message->FindInt32("type", &type) == B_OK) {
57 				if (type < (int32)(sizeof(kSoundNames) / sizeof(const char*)))
58 					system_beep(kSoundNames[type]);
59 			}
60 
61 			// Let the notification window handle this message
62 			BMessenger(fWindow).SendMessage(message);
63 			break;
64 		}
65 		default:
66 			BApplication::MessageReceived(message);
67 	}
68 }
69 
70 
71 status_t
72 NotificationServer::GetSupportedSuites(BMessage* msg)
73 {
74 	msg->AddString("suites", "suite/x-vnd.Haiku-notification_server");
75 
76 	BPropertyInfo info(main_prop_list);
77 	msg->AddFlat("messages", &info);
78 
79 	return BApplication::GetSupportedSuites(msg);
80 }
81 
82 
83 BHandler*
84 NotificationServer::ResolveSpecifier(BMessage* msg, int32 index,
85 	BMessage* spec, int32 from, const char* prop)
86 {
87 	BPropertyInfo info(main_prop_list);
88 
89 	if (strcmp(prop, "message") == 0) {
90 		BMessenger messenger(fWindow);
91 		messenger.SendMessage(msg, fWindow);
92 		return NULL;
93 	}
94 
95 	return BApplication::ResolveSpecifier(msg, index, spec, from, prop);
96 }
97 
98 
99 int
100 main(int argc, char* argv[])
101 {
102 	int32 i = 0;
103 
104 	// Add system sounds
105 	while (kSoundNames[i] != NULL)
106 		add_system_beep_event(kSoundNames[i++], 0);
107 
108 	// Start!
109 	NotificationServer server;
110 	server.Run();
111 
112 	return 0;
113 }
114