edits
[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         
12         CloudComm(String _baseurl, Cipher _encrypt, Cipher _decrypt) {
13                 this.baseurl=_baseurl;
14                 this.encryptcipher = _encrypt;
15                 this.decryptcipher = _decrypt;
16         }
17         
18         private URL buildRequest(boolean isput, long sequencenumber, long maxentries) throws IOException {
19                 String reqstring=isput?"req=putslot":"req=getslot";
20                 String urlstr=baseurl+"?"+reqstring+"&seq="+sequencenumber;
21                 if (maxentries != 0)
22                         urlstr += "&max="+maxentries;
23                 return new URL(urlstr);
24         }
25
26         public Slot[] putSlot(Slot slot, int max) throws IOException{
27                 long sequencenumber=slot.getSequenceNumber();
28                 URL url=buildRequest(true, sequencenumber, max);
29                 URLConnection con=url.openConnection();
30                 HttpURLConnection http = (HttpURLConnection) con;
31                 http.setRequestMethod("POST");
32                 http.setFixedLengthStreamingMode(slot.getBytes().length);
33                 http.setDoOutput(true);
34                 http.connect();
35                 OutputStream os=http.getOutputStream();
36                 os.write(slot.getBytes());
37                 System.out.println(http.getResponseMessage());
38
39                 InputStream is=http.getInputStream();
40                 DataInputStream dis=new DataInputStream(is);
41                 byte[] resptype=new byte[7];
42                 dis.readFully(resptype);
43                 if (Arrays.equals(resptype, "getslot".getBytes()))
44                         return processSlots(dis, sequencenumber);
45                 else if (Arrays.equals(resptype, "putslot".getBytes()))
46                         return null;
47                 else
48                         throw new Error("Bad response to putslot");
49         }
50         
51         public Slot[] getSlots(long sequencenumber) throws IOException {
52                 URL url=buildRequest(false, sequencenumber, 0);
53                 URLConnection con=url.openConnection();
54                 HttpURLConnection http = (HttpURLConnection) con;
55                 http.setRequestMethod("POST");
56                 http.connect();
57                 System.out.println(http.getResponseMessage());
58                 InputStream is=http.getInputStream();
59
60                 DataInputStream dis=new DataInputStream(is);
61                 byte[] resptype=new byte[7];
62                 dis.readFully(resptype);
63                 if (!Arrays.equals(resptype, "getslot".getBytes()))
64                         throw new Error("Bad Response: "+new String(resptype));
65                 else
66                         return processSlots(dis, sequencenumber);
67         }
68                 
69         Slot[] processSlots(DataInputStream dis, long sequencenumber) throws IOException {
70                 int numberofslots=dis.readInt();
71                 int[] sizesofslots=new int[numberofslots];
72                 Slot[] slots=new Slot[numberofslots];
73                 System.out.println(numberofslots);
74                 for(int i=0;i<numberofslots;i++)
75                         sizesofslots[i]=dis.readInt();
76
77                 for(int i=0;i<numberofslots;i++) {
78                         byte[] data=new byte[sizesofslots[i]];
79                         dis.readFully(data);
80                         slots[i]=new Slot(sequencenumber+i, data);
81                 }
82                 dis.close();
83                 return slots;
84         }
85 }