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