/*
 * Copyright 2010-2017, Haiku, Inc. All Rights Reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		Pier Luigi Fiorini, pierluigi.fiorini@gmail.com
 */
 
 
#include "NotificationServer.h"
 
#include <stdlib.h>
 
#include <Alert.h>
#include <Beep.h>
#include <Notifications.h>
#include <PropertyInfo.h>
#include <Roster.h>
 
#include "NotificationWindow.h"
 
 
const char* kSoundNames[] = {
	"Information notification",
	"Important notification",
	"Error notification",
	"Progress notification",
	NULL
};
 
 
NotificationServer::NotificationServer(status_t& error)
	:
	BServer(kNotificationServerSignature, true, &error)
{
}
 
 
NotificationServer::~NotificationServer()
{
}
 
 
void
NotificationServer::ReadyToRun()
{
	fWindow = new NotificationWindow();
}
 
 
void
NotificationServer::MessageReceived(BMessage* message)
{
	switch (message->what) {
		case kNotificationMessage:
		{
			// Skip this message if we don't have the window
			if (!fWindow)
				return;
 
			// Emit a sound for this event
			int32 type = 0;
			if (message->FindInt32("type", &type) == B_OK) {
				if (type < (int32)(sizeof(kSoundNames) / sizeof(const char*)))
					system_beep(kSoundNames[type]);
			}
 
			// Let the notification window handle this message
			BMessenger(fWindow).SendMessage(message);
			break;
		}
		default:
			BApplication::MessageReceived(message);
	}
}
 
 
status_t
NotificationServer::GetSupportedSuites(BMessage* msg)
{
	msg->AddString("suites", "suite/x-vnd.Haiku-notification_server");
 
	BPropertyInfo info(main_prop_list);
	msg->AddFlat("messages", &info);
 
	return BApplication::GetSupportedSuites(msg);
}
 
 
BHandler*
NotificationServer::ResolveSpecifier(BMessage* msg, int32 index,
	BMessage* spec, int32 from, const char* prop)
{
	BPropertyInfo info(main_prop_list);
 
	if (strcmp(prop, "message") == 0) {
		BMessenger messenger(fWindow);
		messenger.SendMessage(msg, fWindow);
		return NULL;
	}
 
	return BApplication::ResolveSpecifier(msg, index, spec, from, prop);
}
 
 
// #pragma mark -
 
 
int
main(int argc, char* argv[])
{
	int32 i = 0;
 
	// Add system sounds
	while (kSoundNames[i] != NULL)
		add_system_beep_event(kSoundNames[i++], 0);
 
	// Start!
	status_t error;
	NotificationServer server(error);
	if (error == B_OK)
		server.Run();
 
	return error == B_OK ? EXIT_SUCCESS : EXIT_FAILURE;
}

V614 Uninitialized variable 'error' used.

V730 Not all members of a class are initialized inside the constructor. Consider inspecting: fWindow.