Project

General

Profile

Statistics
| Revision:

root / src / Message.java

History | View | Annotate | Download (2.77 KB)

1 3 up20160792
import java.net.DatagramPacket;
2
import java.net.InetAddress;
3
4
public class Message {
5
6
    private static final String CRLF = "\r\n";
7
8
    public String header;
9
    public byte[] body;
10
11
    public enum MessageType {
12
        PUTCHUNK, STORED, GETCHUNK, CHUNK, DELETE, REMOVED
13
    };
14
15
    public MessageType type;
16
17
    public Message() {
18
    }
19
20
    // Build a message
21
    public Message(MessageType type, String senderId, String fileId, int chunkN, int replicationDeg, byte[] bytes) {
22
23
        // Reset body
24
        body = new byte[0];
25
26
        // Add chunk
27
        body = bytes;
28
29
        // Assign type
30
        this.type = type;
31
32
        // Prepare type
33
        switch (type) {
34
        case PUTCHUNK:
35
            header = "PUTCHUNK";
36
            break;
37
        case STORED:
38
            header = "STORED";
39
            break;
40
        case GETCHUNK:
41
            header = "GETCHUNK";
42
            break;
43
        case CHUNK:
44
            header = "CHUNK";
45
            break;
46
        case DELETE:
47
            header = "DELETE";
48
            break;
49
        case REMOVED:
50
            header = "REMOVED";
51
            break;
52
        default:
53
            break;
54
        }
55
56
        // Version, SenderId and FileId are shared
57
        // TODO hardcoded version 1.0
58
        header += " 1.0";
59
        header += " " + senderId;
60
        header += " " + fileId;
61
62
        // Remaining message header
63
        // Technically it would be more efficient to add chunkN to all types and remove
64
        // in DELETE but eh
65
        switch (type) {
66
        case PUTCHUNK:
67
            header += " " + Integer.toString(chunkN);
68
            header += " " + Integer.toString(replicationDeg);
69
            break;
70
        case STORED:
71
            header += " " + Integer.toString(chunkN);
72
            break;
73
        case GETCHUNK:
74
            header += " " + Integer.toString(chunkN);
75
            break;
76
        case CHUNK:
77
            header += " " + Integer.toString(chunkN);
78
            break;
79
        case DELETE:
80
            // Nothing to add
81
            break;
82
        case REMOVED:
83
            header += " " + Integer.toString(chunkN);
84
            break;
85
        default:
86
            break;
87
        }
88
89
        // Finalize with double CRLF
90
        header += CRLF + CRLF;
91
92
    }
93
94
    // Pack a datagram from message
95
    public DatagramPacket packit(InetAddress address, int port) {
96
97
        byte[] headerBytes = header.getBytes();
98
99
        byte[] full = new byte[headerBytes.length + body.length];
100
101
        System.arraycopy(headerBytes, 0, full, 0, headerBytes.length);
102
        System.arraycopy(body, 0, full, headerBytes.length, body.length);
103
104
        DatagramPacket packet = new DatagramPacket(full, full.length, address, port);
105
106
        return packet;
107
108
    }
109
110
}