-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmain.hh
120 lines (102 loc) · 2.97 KB
/
main.hh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#ifndef P2PAPP_MAIN_HH
#define P2PAPP_MAIN_HH
#include <QDialog>
#include <QTextEdit>
#include <QLineEdit>
#include <QtNetwork/QUdpSocket>
#include <QTimer>
#include <QElapsedTimer>
#include <tuple>
#define REQUEST_VOTE "RequestVote"
#define APPEND_ENTRIES "AppendEntries"
#define VOTE_REPLY "VoteReply"
#define ACK "ACK"
#define MSG_ACK "MSGACK"
#define MSG "MSG"
// enum for status of a node
enum node_status { WAITING, FOLLOWER, CANDIDATE, LEADER };
struct node_state {
quint32 currentTerm; // init to 0
QString votedFor;
QString id; // init to node id
// origin, message
QList<QMap<QString, QVariant>> messageList;
// index, term, command
QMap<quint32, QMap<QString, QVariant>> logEntries; // empty on start
// index of highest log entry known commited
quint32 commitIndex; // init to 0
// index of highest log entry applied
quint32 lastApplied; // init to 0
quint32 nextPending;
quint16 leaderPort;
};
struct leader_state {
QMap<QString, QVariant> nextIndex; // init to leader last log+1
QMap<QString, QVariant> matchIndex; // init to 0
};
class AppendEntryRPC
{
public:
AppendEntryRPC();
quint32 term;
QString leaderId;
quint32 prevLogIndex;
quint32 prevLogTerm;
QMap<quint32, QMap<QString, QVariant>> entries;
quint32 leaderCommit;
QByteArray serializeObject();
void deserializeStream(QByteArray receivedData);
};
class NetSocket : public QUdpSocket
{
Q_OBJECT
public:
NetSocket();
QList<quint16> PeerList();
bool bind();
private:
int myPortMin, myPortMax;
};
class ChatDialog : public QDialog
{
Q_OBJECT
public:
ChatDialog();
NetSocket *socket;
QString local_origin;
QList<QString> droppedNodes;
QTimer *heartbeatTimer;
QTimer *leaderTimeout;
void sendHeartbeat(quint16 port);
QTimer *electionTimeout;
void processRequestVote(QMap<QString, QVariant> voteRequest, quint16 senderPort);
void processAppendEntries(AppendEntryRPC appendEntry, quint16 port);
void sendVote(quint8 vote, quint16 senderPort);
int generateRandomTimeRange(int min, int max);
public slots:
void gotReturnPressed();
void readPendingMessages();
void handleHeartbeatTimeout();
void handleElectionTimeout();
void handleLeaderTimeout();
private:
QTextEdit *textview;
QLineEdit *textline;
quint16 numberOfVotes;
quint16 numberOfMsgVotes;
quint32 getLastTerm();
void checkCommand(QString command);
void sendRequestVoteRPC();
void addVoteCount(quint8 vote);
void sendMsgACK(quint16 senderPort, QString origin);
void addMsgVoteCount(quint8 msgSuccess, QString origin);
void sendMessage(QByteArray buffer, quint16 senderPort);
void processIncomingData(QByteArray datagramReceived, NetSocket *socket, quint16 senderPort);
void processACK(QMap<QString, QVariant> ack, quint16 senderPort);
void getNodeCommand();
void processDropNode(QString dropNodeMessage);
void restoreDroppedNode(QString restoreNodeMessage);
void processMessageReceived(QString messageReceived, QString origin);
void sendAckToLeader(quint8 success, quint16 senderPort);
};
#endif // P2PAPP_MAIN_HH