1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package net.sf.beep4j.internal;
17
18 import java.nio.ByteBuffer;
19
20 import net.sf.beep4j.internal.util.Assert;
21 import net.sf.beep4j.transport.Transport;
22
23 public class Frame {
24 private DataHeader header;
25 private ByteBuffer payload;
26
27 public Frame(DataHeader header, ByteBuffer payload) {
28 Assert.notNull("header", header);
29 Assert.notNull("payload", payload);
30 this.header = header;
31 this.payload = payload;
32 }
33
34 public DataHeader getHeader() {
35 return header;
36 }
37
38 public MessageType getType() {
39 return header.getType();
40 }
41
42 public int getChannelNumber() {
43 return header.getChannel();
44 }
45
46 public boolean isIntermediate() {
47 return header.isIntermediate();
48 }
49
50 public int getMessageNumber() {
51 return header.getMessageNumber();
52 }
53
54 public long getSequenceNumber() {
55 return header.getSequenceNumber();
56 }
57
58 public int getSize() {
59 return header.getPayloadSize();
60 }
61
62 public ByteBuffer getPayload() {
63 return payload;
64 }
65
66 public Frame[] split(int size) {
67 Frame[] result = new Frame[2];
68
69 DataHeader[] headers = header.split(size);
70 ByteBuffer[] buffers = splitPayload(getPayload(), size);
71
72 result[0] = new Frame(headers[0], buffers[0]);
73 result[1] = new Frame(headers[1], buffers[1]);
74
75 return result;
76 }
77
78 private ByteBuffer[] splitPayload(ByteBuffer payload, int size) {
79 ByteBuffer[] result = new ByteBuffer[2];
80
81 payload.position(0).limit(size);
82 result[0] = payload.slice();
83
84 payload.position(size);
85 payload.limit(payload.capacity());
86 result[1] = payload.slice();
87
88 return result;
89 }
90
91 public void send(Transport transport) {
92 ByteBuffer headerBuffer = header.asByteBuffer();
93
94 ByteBuffer buffer = ByteBuffer.allocate(headerBuffer.remaining() + getSize() + 5);
95 buffer.put(headerBuffer);
96 buffer.put(getPayload());
97 buffer.put(Constants.TRAILER_BYTES);
98 buffer.flip();
99
100 transport.sendBytes(buffer);
101 }
102
103 @Override
104 public boolean equals(Object obj) {
105 if (this == obj) {
106 return true;
107 } else if (obj == null) {
108 return false;
109 } else if (obj.getClass().equals(getClass())) {
110 Frame frame = (Frame) obj;
111 return header.equals(frame.header)
112 && payload.equals(frame.payload);
113 } else {
114 return false;
115 }
116 }
117
118 @Override
119 public String toString() {
120 return "Frame[header=" + getHeader() + "]";
121 }
122
123 }