-
Notifications
You must be signed in to change notification settings - Fork 244
Expand file tree
/
Copy pathMessageStructure.cs
More file actions
105 lines (85 loc) · 2.83 KB
/
MessageStructure.cs
File metadata and controls
105 lines (85 loc) · 2.83 KB
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
using System;
using kOS.Safe.Encapsulation;
using kOS.Safe.Encapsulation.Suffixes;
using kOS.Suffixed;
using kOS.Safe;
using kOS.Serialization;
using kOS.Safe.Serialization;
using kOS.Safe.Exceptions;
namespace kOS.Communication
{
[kOS.Safe.Utilities.KOSNomenclature("Message")]
public class MessageStructure : SerializableStructure, IHasSharedObjects
{
private static string DumpMessage = "message";
public Message Message { get; private set; }
private SharedObjects shared;
public SharedObjects Shared
{
set
{
shared = value;
}
}
public MessageStructure()
{
InitializeSuffixes();
}
public MessageStructure(Message message, SharedObjects shared)
{
Message = message;
this.shared = shared;
InitializeSuffixes();
}
private void InitializeSuffixes()
{
AddSuffix("SENTAT", new Suffix<kOS.Suffixed.TimeSpan>(() => new kOS.Suffixed.TimeSpan(Message.SentAt)));
AddSuffix("RECEIVEDAT", new Suffix<kOS.Suffixed.TimeSpan>(() => new kOS.Suffixed.TimeSpan(Message.ReceivedAt)));
AddSuffix("SENDER", new Suffix<Structure>(GetVesselTarget));
AddSuffix("HASSENDER", new Suffix<BooleanValue>(GetVesselExists));
AddSuffix("CONTENT", new Suffix<Structure>(DeserializeContent));
}
public Vessel GetVessel()
{
return (FlightGlobals.Vessels.Find((v) => v.id.ToString().Equals(Message.Vessel)));
}
public Structure GetVesselTarget()
{
Vessel vessel = GetVessel();
if (vessel == null)
{
return new BooleanValue(KscTarget.Instance.GetGuid().ToString().Equals(Message.Vessel));
}
return new VesselTarget(vessel, shared);
}
public BooleanValue GetVesselExists()
{
return new BooleanValue((GetVessel() != null));
}
public Structure DeserializeContent()
{
if (Message.Content is Dump)
{
return new SerializationMgr(shared).CreateFromDump(Message.Content as Dump) as SerializableStructure;
}
return Structure.FromPrimitiveWithAssert(Message.Content);
}
public override string ToString()
{
return "Message(" + Message.Vessel.ToString() + ")";
}
public override Dump Dump()
{
Dump dump = new DumpWithHeader
{
Header = "Message"
};
dump.Add(DumpMessage, Message);
return dump;
}
public override void LoadDump(Dump dump)
{
Message = dump[DumpMessage] as Message;
}
}
}