/**
*
*/
package info.guardianproject.util;
import info.guardianproject.iocipher.File;
import info.guardianproject.iocipher.FileInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import android.net.Uri;
import android.util.Log;
/**
* Copyright (C) 2014. All rights reserved.
*
* @author liorsaar
*
*/
public class HttpMediaStreamer {
private static final String TAG = HttpMediaStreamer.class.getSimpleName();
private Uri uri;
private ServerSocket serverSocket;
public HttpMediaStreamer(String filename, String mimeType) throws IOException {
uri = create(filename, mimeType);
}
public Uri getUri() {
return uri;
}
public void destroy() {
try {
if (serverSocket != null)
serverSocket.close();
} catch (Exception e) {
}
}
private Uri create(final String filename, final String mimeType) throws IOException {
// FIXME generate a random token for security
final File file = new File(filename);
if (!file.exists()) {
throw new IOException("File not found " + filename);
}
try {
if (serverSocket != null)
serverSocket.close();
} catch (Exception e) {
}
serverSocket = new ServerSocket(0); // use random free port
new Thread() {
public void run() {
try {
while (true) {
Socket socket = serverSocket.accept();
byte[] b = new byte[8192];
int len;
InputStream is = socket.getInputStream();
StringBuilder isb = new StringBuilder();
len = is.read(b);
isb.append(new String(b));
//Log.i(TAG, "request: " + isb.toString());
StringBuilder sb = new StringBuilder();
sb.append("HTTP/1.1 200\r\n");
sb.append("Content-Type: " + mimeType + "\r\n");
sb.append("Content-Length: " + file.length() + "\r\n\r\n");
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
bos.write(sb.toString().getBytes());
FileInputStream fis = new FileInputStream(file);
int idx = 0;
while ((len = fis.read(b)) != -1) {
bos.write(b, 0, len);
idx += len;
Log.d(TAG, "sharing via stream: " + idx);
}
fis.close();
bos.flush();
bos.close();
socket.close();
}
} catch (IOException e) {
Log.d(TAG, "web share error", e);
}
}
}.start();
Uri uri = Uri.parse("http://localhost:" + serverSocket.getLocalPort() + file.getAbsolutePath());
return uri;
}
}