add some comments
[iotcloud.git] / src / java / iotcloud / RejectedMessage.java
1 package iotcloud;
2 import java.nio.ByteBuffer;
3
4 /**
5  * Entry for tracking messages that the server rejected.  We have to
6  * make sure that all clients know that this message was rejected to
7  * prevent the server from reusing these messages in an attack.
8  * @author Brian Demsky
9  * @version 1.0
10  */
11
12
13 class RejectedMessage extends Entry {
14         /* Machine identifier */
15         private long machineid;
16         /* Oldest sequence number in range */
17         private long oldseqnum;
18         /* Newest sequence number in range */
19         private long newseqnum;
20         /* Is the machine identifier of the relevant slots equal to (or not
21          * equal to) the specified machine identifier. */
22         private boolean equalto;
23
24         RejectedMessage(Slot slot, long _machineid, long _oldseqnum, long _newseqnum, boolean _equalto) {
25                 super(slot);
26                 machineid=_machineid;
27                 oldseqnum=_oldseqnum;
28                 newseqnum=_newseqnum;
29                 equalto=_equalto;
30         }
31
32         long getOldSeqNum() {
33                 return oldseqnum;
34         }
35
36         long getNewSeqNum() {
37                 return newseqnum;
38         }
39
40         boolean getEqual() {
41                 return equalto;
42         }
43
44         long getMachineID() {
45                 return machineid;
46         }
47
48         static Entry decode(Slot slot, ByteBuffer bb) {
49                 long machineid=bb.getLong();
50                 long oldseqnum=bb.getLong();
51                 long newseqnum=bb.getLong();
52                 byte equalto=bb.get();
53                 return new RejectedMessage(slot, machineid, oldseqnum, newseqnum, equalto==1);
54         }
55
56         void encode(ByteBuffer bb) {
57                 bb.put(Entry.TypeRejectedMessage);
58                 bb.putLong(machineid);
59                 bb.putLong(oldseqnum);
60                 bb.putLong(newseqnum);
61                 bb.put(equalto?(byte)1:(byte)0);
62         }
63
64         int getSize() {
65                 return 3*Long.BYTES + 2*Byte.BYTES;
66         }
67
68         byte getType() {
69                 return Entry.TypeRejectedMessage;
70         }
71 }