Start port
[iotcloud.git] / version2 / src / java / iotcloud / RejectedMessage.java
1 package iotcloud;
2 import java.nio.ByteBuffer;
3 import java.util.HashSet;
4
5 /**
6  * Entry for tracking messages that the server rejected.  We have to
7  * make sure that all clients know that this message was rejected to
8  * prevent the server from reusing these messages in an attack.
9  * @author Brian Demsky
10  * @version 1.0
11  */
12
13
14 class RejectedMessage extends Entry {
15         /* Sequence number */
16         private long sequencenum;
17         
18
19         /* Machine identifier */
20         private long machineid;
21         /* Oldest sequence number in range */
22         private long oldseqnum;
23         /* Newest sequence number in range */
24         private long newseqnum;
25         /* Is the machine identifier of the relevant slots equal to (or not
26          * equal to) the specified machine identifier. */
27         private boolean equalto;
28         /* Set of machines that have not received notification. */
29         private HashSet<Long> watchset;
30
31         RejectedMessage(Slot slot, long _sequencenum, long _machineid, long _oldseqnum, long _newseqnum, boolean _equalto) {
32                 super(slot);
33                 sequencenum = _sequencenum;
34                 machineid=_machineid;
35                 oldseqnum=_oldseqnum;
36                 newseqnum=_newseqnum;
37                 equalto=_equalto;
38         }
39
40         long getOldSeqNum() {
41                 return oldseqnum;
42         }
43
44         long getNewSeqNum() {
45                 return newseqnum;
46         }
47
48         boolean getEqual() {
49                 return equalto;
50         }
51
52         long getMachineID() {
53                 return machineid;
54         }
55
56
57         long getSequenceNumber() {
58                 return sequencenum;
59         }
60
61         static Entry decode(Slot slot, ByteBuffer bb) {
62                 long sequencenum=bb.getLong();
63                 long machineid=bb.getLong();
64                 long oldseqnum=bb.getLong();
65                 long newseqnum=bb.getLong();
66                 byte equalto=bb.get();
67                 return new RejectedMessage(slot,sequencenum, machineid, oldseqnum, newseqnum, equalto==1);
68         }
69
70         void setWatchSet(HashSet<Long> _watchset) {
71                 watchset=_watchset;
72         }
73
74         void removeWatcher(long machineid) {
75                 if (watchset.remove(machineid))
76                         if (watchset.isEmpty())
77                                 setDead();
78         }
79
80         void encode(ByteBuffer bb) {
81                 bb.put(Entry.TypeRejectedMessage);
82                 bb.putLong(sequencenum);
83                 bb.putLong(machineid);
84                 bb.putLong(oldseqnum);
85                 bb.putLong(newseqnum);
86                 bb.put(equalto?(byte)1:(byte)0);
87         }
88
89         int getSize() {
90                 return 4*Long.BYTES + 2*Byte.BYTES;
91         }
92
93         byte getType() {
94                 return Entry.TypeRejectedMessage;
95         }
96         
97         Entry getCopy(Slot s) {
98                 return new RejectedMessage(s,sequencenum, machineid, oldseqnum, newseqnum, equalto);
99         }
100 }