package co.flyver.httpserver;
import android.os.Environment;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import co.flyver.utils.JSONUtils;
import co.flyver.utils.flyvermq.FlyverMQ;
import co.flyver.utils.flyvermq.FlyverMQMessage;
import co.flyver.utils.flyvermq.exceptions.FlyverMQException;
import co.flyver.utils.flyvermq.interfaces.FlyverMQConsumer;
import fi.iki.elonen.NanoHTTPD;
import fi.iki.elonen.WebSocketResponseHandler;
/**
* Created by Petar Petrov on 1/6/15.
*/
/**
* Subclass of NanoHTTPD, used to serve webpages from the smartphone
*/
public class NanoHTTPDServer extends NanoHTTPD implements FlyverMQConsumer {
WebSocketResponseHandler responseHandler;
public static final String MIME_JS = "application/javascript";
public static final String MIME_CSS = "text/css";
public static final String MIME_PNG = "image/png";
public NanoHTTPDServer() {
super(8080);
responseHandler = new WebSocketResponseHandler(WebSocketsWrapper.getWebSocketFactory());
try {
FlyverMQ.getInstance().registerConsumer(this, "airquality.mapped");
} catch (FlyverMQException e) {
e.printStackTrace();
}
}
@Override
public Response serve(IHTTPSession session) {
Response ws = responseHandler.serve(session);
if (ws == null) {
final String sourcePath = "/co.flyver/webpage";
String mime_type = NanoHTTPD.MIME_HTML;
Method method = session.getMethod();
String uri = session.getUri();
Map<String, String> files = new HashMap<>();
BufferedReader bufferedReader;
try {
session.parseBody(files);
} catch (IOException e) {
e.printStackTrace();
} catch (ResponseException e) {
e.printStackTrace();
}
if (method.toString().equalsIgnoreCase("GET")) {
File sdcard = Environment.getExternalStorageDirectory();
File resource = new File(sdcard, sourcePath.concat("/index.html"));
InputStream stream = null;
if (uri.endsWith(".html")) {
mime_type = NanoHTTPD.MIME_HTML;
} else if (uri.endsWith(".js")) {
mime_type = MIME_JS;
resource = new File(sdcard, sourcePath.concat(uri));
} else if (uri.endsWith(".css")) {
resource = new File(sdcard, sourcePath.concat(uri));
mime_type = MIME_CSS;
} else if(uri.endsWith(".png")) {
resource = new File(sdcard, sourcePath.concat(uri));
mime_type = MIME_PNG;
}
try {
stream = new FileInputStream(resource);
// String line;
// while ((line = bufferedReader.readLine()) != null) {
// html.append(line);
// html.append("\n");
// }
} catch (IOException e) {
e.printStackTrace();
}
return new Response(Response.Status.OK, mime_type, stream);
}
if (method.toString().equalsIgnoreCase("POST")) {
switch (files.get("postData")) {
case "file": {
File file = new File(Environment.getExternalStorageDirectory().getPath().concat("/co.flyver/airQualityData.csv"));
StringBuilder sb = new StringBuilder();
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
sb.append(line.concat("|"));
}
} catch (IOException e) {
e.printStackTrace();
}
return new Response(Response.Status.OK, MIME_PLAINTEXT, sb.toString());
}
case "reset": {
File file = new File(Environment.getExternalStorageDirectory().getPath().concat("/co.flyver/airQualityData.csv"));
file.delete();
}
default: {
return new Response(Response.Status.OK, MIME_PLAINTEXT, "DEFAULT!");
}
}
}
return new Response(Response.Status.NOT_FOUND, MIME_HTML, "UNAVAILABLE!!!");
} else {
return ws;
}
}
@Override
public void dataReceived(FlyverMQMessage message) {
try {
if(!WebSocketsWrapper.openSockets.isEmpty()) {
WebSocketsWrapper.openSockets.getFirst().send(JSONUtils.serialize(message.data));
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void unregistered() {
}
@Override
public void paused() {
}
@Override
public void resumed() {
}
}