1/* 2 * Copyright 2010-2017, 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 10#include "NotificationServer.h" 11 12#include <stdlib.h> 13 14#include <Alert.h> 15#include <Beep.h> 16#include <Notifications.h> 17#include <PropertyInfo.h> 18#include <Roster.h> 19 20#include "NotificationWindow.h" 21 22 23const char* kSoundNames[] = { 24 "Information notification", 25 "Important notification", 26 "Error notification", 27 "Progress notification", 28 NULL 29}; 30 31 32NotificationServer::NotificationServer(status_t& error) 33 : 34 BServer(kNotificationServerSignature, true, &error) 35{ 36} 37 38 39NotificationServer::~NotificationServer() 40{ 41} 42 43 44void 45NotificationServer::ReadyToRun() 46{ 47 fWindow = new NotificationWindow(); 48} 49 50 51void 52NotificationServer::MessageReceived(BMessage* message) 53{ 54 switch (message->what) { 55 case kNotificationMessage: 56 { 57 // Skip this message if we don't have the window 58 if (!fWindow) 59 return; 60 61 // Emit a sound for this event 62 int32 type = 0; 63 if (message->FindInt32("type", &type) == B_OK) { 64 if (type < (int32)(sizeof(kSoundNames) / sizeof(const char*))) 65 system_beep(kSoundNames[type]); 66 } 67 68 // Let the notification window handle this message 69 BMessenger(fWindow).SendMessage(message); 70 break; 71 } 72 default: 73 BApplication::MessageReceived(message); 74 } 75} 76 77 78status_t 79NotificationServer::GetSupportedSuites(BMessage* msg) 80{ 81 msg->AddString("suites", "suite/x-vnd.Haiku-notification_server"); 82 83 BPropertyInfo info(main_prop_list); 84 msg->AddFlat("messages", &info); 85 86 return BApplication::GetSupportedSuites(msg); 87} 88 89 90BHandler* 91NotificationServer::ResolveSpecifier(BMessage* msg, int32 index, 92 BMessage* spec, int32 from, const char* prop) 93{ 94 BPropertyInfo info(main_prop_list); 95 96 if (strcmp(prop, "message") == 0) { 97 BMessenger messenger(fWindow); 98 messenger.SendMessage(msg, fWindow); 99 return NULL; 100 } 101 102 return BApplication::ResolveSpecifier(msg, index, spec, from, prop); 103} 104 105 106// #pragma mark - 107 108 109int 110main(int argc, char* argv[]) 111{ 112 int32 i = 0; 113 114 // Add system sounds 115 while (kSoundNames[i] != NULL) 116 add_system_beep_event(kSoundNames[i++], 0); 117 118 // Start! 119 status_t error; 120 NotificationServer server(error); 121 if (error == B_OK) 122 server.Run(); 123 124 return error == B_OK ? EXIT_SUCCESS : EXIT_FAILURE; 125} 126