add makefile
[iotcloud.git] / src / java / iotcloud / CloudComm.java
1 package iotcloud;
2 import java.io.*;
3 import java.net.*;
4 import java.util.Arrays;
5 import javax.crypto.*;
6
7 class CloudComm {
8         String baseurl;
9         Cipher encryptcipher;
10         Cipher decryptcipher;
11         Mac mac;
12         
13         CloudComm(String _baseurl, Cipher _encrypt, Cipher _decrypt, Mac _mac) {
14                 this.baseurl=_baseurl;
15                 this.encryptcipher = _encrypt;
16                 this.decryptcipher = _decrypt;
17                 this.mac = _mac;
18         }
19         
20         private URL buildRequest(boolean isput, long sequencenumber, long maxentries) throws IOException {
21                 String reqstring=isput?"req=putslot":"req=getslot";
22                 String urlstr=baseurl+"?"+reqstring+"&seq="+sequencenumber;
23                 if (maxentries != 0)
24                         urlstr += "&max="+maxentries;
25                 return new URL(urlstr);
26         }
27
28         public Slot[] putSlot(Slot slot, int max) throws IOException{
29                 try {
30                         long sequencenumber=slot.getSequenceNumber();
31                         byte[] bytes=slot.encode(mac);
32                         
33                         URL url=buildRequest(true, sequencenumber, max);
34                         URLConnection con=url.openConnection();
35                         HttpURLConnection http = (HttpURLConnection) con;
36                         http.setRequestMethod("POST");
37                         http.setFixedLengthStreamingMode(bytes.length);
38                         http.setDoOutput(true);
39                         http.connect();
40                         OutputStream os=http.getOutputStream();
41                         os.write(bytes);
42                         System.out.println(http.getResponseMessage());
43                         
44                         InputStream is=http.getInputStream();
45                         DataInputStream dis=new DataInputStream(is);
46                         byte[] resptype=new byte[7];
47                         dis.readFully(resptype);
48                         if (Arrays.equals(resptype, "getslot".getBytes()))
49                                 return processSlots(dis);
50                         else if (Arrays.equals(resptype, "putslot".getBytes()))
51                                 return null;
52                         else
53                                 throw new Error("Bad response to putslot");
54                 } catch (Exception e) {
55                         throw new Error("putSlot failed");
56                 }
57         }
58         
59         public Slot[] getSlots(long sequencenumber) {
60                 try {
61                         URL url=buildRequest(false, sequencenumber, 0);
62                         URLConnection con=url.openConnection();
63                         HttpURLConnection http = (HttpURLConnection) con;
64                         http.setRequestMethod("POST");
65                         http.connect();
66                         System.out.println(http.getResponseMessage());
67                         InputStream is=http.getInputStream();
68                         
69                         DataInputStream dis=new DataInputStream(is);
70                         byte[] resptype=new byte[7];
71                         dis.readFully(resptype);
72                         if (!Arrays.equals(resptype, "getslot".getBytes()))
73                                 throw new Error("Bad Response: "+new String(resptype));
74                         else
75                                 return processSlots(dis);
76                 } catch (Exception e) {
77                         throw new Error("getSlots failed");
78                 }
79         }
80                 
81         Slot[] processSlots(DataInputStream dis) throws IOException {
82                 int numberofslots=dis.readInt();
83                 int[] sizesofslots=new int[numberofslots];
84                 Slot[] slots=new Slot[numberofslots];
85                 for(int i=0;i<numberofslots;i++)
86                         sizesofslots[i]=dis.readInt();
87
88                 for(int i=0;i<numberofslots;i++) {
89                         byte[] data=new byte[sizesofslots[i]];
90                         dis.readFully(data);
91                         slots[i]=Slot.decode(data, mac);
92                 }
93                 dis.close();
94                 return slots;
95         }
96 }