summaryrefslogtreecommitdiff
path: root/Runtime/BaseClasses/MessageIdentifier.cpp
blob: fc555098c90d95c79d7a57a512bc3c33e08d5be6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "UnityPrefix.h"
#include "MessageIdentifier.h"
using namespace std;

MessageIdentifier::RegisteredMessages* gRegisteredMessageIdentifiers = NULL;

MessageIdentifier::MessageIdentifier (const char* name, Options opts, int classId, const char* scriptParamName)
{
	AssertIf (name == NULL);
		
	messageName = name;
	parameterClassId = classId;
	scriptParameterName = scriptParamName;
	messageID = -1;
	options = (int)opts;
	if (gRegisteredMessageIdentifiers == NULL)
		gRegisteredMessageIdentifiers = new RegisteredMessages();
	
	gRegisteredMessageIdentifiers->push_back (this);
}

MessageIdentifier::RegisteredMessages& MessageIdentifier::GetRegisteredMessages ()
{
	AssertIf (gRegisteredMessageIdentifiers == NULL);
	return *gRegisteredMessageIdentifiers;
}

MessageIdentifier::SortedMessages MessageIdentifier::GetSortedMessages (bool notificationMessages)
{
	// Build sorted Messages map. Which contains all messages sorted by name.
	SortedMessages sortedMessages;
	RegisteredMessages& messages = GetRegisteredMessages();
	RegisteredMessages::iterator j;
	for (j = messages.begin ();j != messages.end ();j++)
	{
		MessageIdentifier& identifier = **j;
		AssertIf (identifier.messageName == NULL);
		
		bool usesNotifications = identifier.options & kUseNotificationManager;
		if (usesNotifications != notificationMessages)
			continue;
		
		SortedMessages::iterator found = sortedMessages.find (identifier.messageName);
		if (found == sortedMessages.end ())
		{
			sortedMessages.insert (make_pair (string (identifier.messageName), identifier));
		}
		else
		{
			if (identifier.parameterClassId != found->second.parameterClassId)
			{
				string error = "There are conflicting definitions of the message: ";
				error += identifier.messageName;
				error += ". The parameter of one message has to be the same across all definitions of that message.";
				ErrorString (error);
			}

			if (identifier.scriptParameterName != found->second.scriptParameterName)
			{
				string error = "There are conflicting definitions of the message: ";
				error += identifier.messageName;
				error += ". The parameter of one message has to be the same across all definitions of that message.";
				ErrorString (error);
			}

			if (identifier.options != found->second.options)
			{
				string error = "There are conflicting options of the message: ";
				error += identifier.messageName;
				ErrorString (error);
			}
		}
	}
	return sortedMessages;
}

void MessageIdentifier::Cleanup ()
{
	delete gRegisteredMessageIdentifiers;
}

#include "Runtime/Dynamics/Collider.h"
#undef MESSAGE_IDENTIFIER
#define MESSAGE_IDENTIFIER(n,p) const EXPORT_COREMODULE MessageIdentifier n p
#include "MessageIdentifiers.h"