1 // Copyright 2006 Alp Toker <alp@atoker.com>
2 // This software is made available under the MIT License
3 // See COPYING for details
4 
5 using System;
6 using System.Collections.Generic;
7 using System.IO;
8 
9 namespace DBus.Protocol
10 {
11 	public class Message
12 	{
13 		Header header = new Header ();
14 		Connection connection;
15 		byte[] body;
16 
Message()17 		public Message ()
18 		{
19 			header.Endianness = Connection.NativeEndianness;
20 			header.MessageType = MessageType.MethodCall;
21 			header.Flags = HeaderFlag.NoReplyExpected; //TODO: is this the right place to do this?
22 			header.MajorVersion = ProtocolInformation.Version;
23 		}
24 
FromReceivedBytes(Connection connection, byte[] header, byte[] body)25 		public static Message FromReceivedBytes (Connection connection, byte[] header, byte[] body)
26 		{
27 			Message message = new Message ();
28 			message.connection = connection;
29 			message.body = body;
30 			message.SetHeaderData (header);
31 
32 			return message;
33 		}
34 
35 		public byte[] Body {
36 			get {
37 				return body;
38 			}
39 		}
40 
41 		public Header Header {
42 			get {
43 				return header;
44 			}
45 		}
46 
47 		public Connection Connection {
48 			get {
49 				return connection;
50 			}
51 		}
52 
53 		public Signature Signature {
54 			get {
55 				object o = Header[FieldCode.Signature];
56 				if (o == null)
57 					return Signature.Empty;
58 				else
59 					return (Signature)o;
60 			}
61 			set {
62 				if (value == Signature.Empty)
63 					Header[FieldCode.Signature] = null;
64 				else
65 					Header[FieldCode.Signature] = value;
66 			}
67 		}
68 
69 		public bool ReplyExpected {
70 			get {
71 				return (Header.Flags & HeaderFlag.NoReplyExpected) == HeaderFlag.None;
72 			}
73 			set {
74 				if (value)
75 					Header.Flags &= ~HeaderFlag.NoReplyExpected; //flag off
76 				else
77 					Header.Flags |= HeaderFlag.NoReplyExpected; //flag on
78 			}
79 		}
80 
AttachBodyTo(MessageWriter writer)81 		public void AttachBodyTo (MessageWriter writer)
82 		{
83 			body = writer.ToArray ();
84 			header.Length = (uint)body.Length;
85 		}
86 
HandleHeader(Header headerIn)87 		public void HandleHeader (Header headerIn)
88 		{
89 			header = headerIn;
90 		}
91 
SetHeaderData(byte[] data)92 		public void SetHeaderData (byte[] data)
93 		{
94 			header = Header.FromBytes (data);
95 		}
96 
GetHeaderData()97 		public byte[] GetHeaderData ()
98 		{
99 			MessageWriter writer = new MessageWriter (header.Endianness);
100 			header.WriteHeaderToMessage (writer);
101 			return writer.ToArray ();
102 		}
103 	}
104 }
105