summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/dnbd3/DNBD3Server.java
blob: 4830010f39be53eeba170e2efa2b4585004a1563 (plain) (blame)
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
121
122
123
124
125
126
127
128
129
130
131
132
package org.openslx.dnbd3;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.util.List;

import org.openslx.dnbd3.xml.Client;
import org.openslx.dnbd3.xml.Image;
import org.openslx.dnbd3.xml.Info;
import org.simpleframework.xml.core.Persister;

public class DNBD3Server {

    private static final int CMDSTOP = 0;
    private static final int CMDRELOAD = 1;
    private static final int CMDINFO = 2;
    private static final int CMDADDIMG = 3;
    private static final int CMDDELIMG = 4;

    private static final String HOST = "127.0.0.1";
    private static final int PORT = 5004;

    public void doReload() throws IOException, DNBD3Exception {
        sndCommand(CMDRELOAD);
    }

    public void doShutdown() throws IOException, DNBD3Exception {
        sndCommand(CMDSTOP);
    }

    public void addImage(Image image) throws Exception {
        Info info = new Info();
        info.getImages().add(image);
        sndData(CMDADDIMG, info);
        doReload();
    }
    
    public void delImage(Image image) throws Exception {
        Info info = new Info();
        info.getImages().add(image);
        sndData(CMDDELIMG, info);
        doReload();
    }

    public List<Image> getImages() throws Exception {
        return rcvData().getImages();
    }

    public List<Client> getClients() throws Exception {
        return rcvData().getClients();
    }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    private void sndCommand(int cmd) throws IOException, DNBD3Exception {
        Socket sock = new Socket(HOST, PORT);
        sndHeader(sock, new DNBD3Header(cmd, 0, 0));
        rcvHeader(sock);
        sock.close();
    }
    
    private void sndData(int cmd, Info info) throws Exception {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        new Persister().write(info, os);
        Socket sock = new Socket(HOST, PORT);
        sndHeader(sock, new DNBD3Header(cmd, os.size(), 0));
        sock.getOutputStream().write(os.toByteArray());
        rcvHeader(sock);
        sock.close();
    }
    
    private Info rcvData() throws Exception {
        Socket sock = new Socket(HOST, PORT);
        sndHeader(sock, new DNBD3Header(CMDINFO, 0, 0));
        rcvHeader(sock);
        Info info = new Persister().read(Info.class, sock.getInputStream());
        sock.close();
        return info;
    }
    
    private void sndHeader(Socket sock, DNBD3Header header) throws IOException {
        OutputStream os = sock.getOutputStream();
        os.write(header.toByteArray());
    }

    private DNBD3Header rcvHeader(Socket sock) throws IOException, DNBD3Exception {
        DNBD3Header header = new DNBD3Header();
        InputStream is = sock.getInputStream();
        byte[] bytes = ByteBuffer.allocate(12).array();
        is.read(bytes, 0, 12);
        header.fromByteArray(bytes);

        switch (header.getError()) {

        case 0:
            return header;

        case DNBD3Header.ERROR_FILE_NOT_FOUND:
            throw new DNBD3Exception(DNBD3Header.ERROR_FILE_NOT_FOUND,
                    "Image file does not exist or is not readable");

        case DNBD3Header.ERROR_IMAGE_ALREADY_EXISTS:
            throw new DNBD3Exception(DNBD3Header.ERROR_IMAGE_ALREADY_EXISTS,
                    "Image with given vid and rid already exists");

        case DNBD3Header.ERROR_CONFIG_FILE_PERMISSIONS:
            throw new DNBD3Exception(DNBD3Header.ERROR_CONFIG_FILE_PERMISSIONS,
                    "Config file is not writable");
            
        case DNBD3Header.ERROR_IMAGE_NOT_FOUND:
            throw new DNBD3Exception(DNBD3Header.ERROR_IMAGE_NOT_FOUND,
                    "Image does not exist");
            
        case DNBD3Header.ERROR_RID:
            throw new DNBD3Exception(DNBD3Header.ERROR_RID,
                    "Delete with rid=0 is not allowed");
            
        case DNBD3Header.ERROR_IMAGE_IN_USE:
            throw new DNBD3Exception(DNBD3Header.ERROR_IMAGE_IN_USE,
                    "Image is in use");

        default:
            throw new DNBD3Exception(DNBD3Header.ERROR_UNKNOWN,
                    "Unknown error, something went horribly wrong...");
        }
    }

}