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