package de.fun2code.android.piratebox.handler; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Locale; import sunlabs.brazil.server.Handler; import sunlabs.brazil.server.Request; import sunlabs.brazil.server.Server; import android.app.Service; import android.content.SharedPreferences; import android.net.Uri; import android.preference.PreferenceManager; import de.fun2code.android.piratebox.Constants; import de.fun2code.android.piratebox.PirateBoxService; import de.fun2code.android.piratebox.R; import de.fun2code.android.piratebox.database.DatabaseHandler; /** * Handler that delivers files from the storage directory if * the URL matches the specified {@code prefix} specified in {@literal handerl.xml} * * @author joschi * */ public class StorageHandler implements Handler { private static final String URL_PREFIX = "prefix"; private String storageDir; private String urlPrefix; private Server server; private DatabaseHandler db; private SharedPreferences prefs; private static final String MIME_OCTET_STREAM = "application/octet-stream"; @Override public boolean init(Server server, String prefix) { this.server = server; try { // Init database db = new DatabaseHandler(PirateBoxService.getService()); // Get preferences prefs = PreferenceManager.getDefaultSharedPreferences(PirateBoxService.getService()); /* * Read the storage location and get the URL prefix */ Service service = PirateBoxService.getService(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(service); String storageDefault = service.getResources().getString(R.string.pref_storage_dir_default); storageDir = prefs.getString(Constants.PREF_STORAGE_DIR, storageDefault); urlPrefix = server.props.getProperty(prefix + URL_PREFIX, "/"); } catch(Exception e) { e.printStackTrace(); return false; } return true; } @Override public boolean respond(Request request) throws IOException { File file = new File(storageDir + Uri.decode(request.url)); /* * If the URl does not start with the prefix, skipt the handler */ if(!request.url.startsWith(urlPrefix) || !file.exists()) { return false; } try { String ext = file.getName().toLowerCase(Locale.US).substring(file.getName().lastIndexOf(".") + 1); String mime = (String) server.props.get("mime." + ext); /* * Unlike the standard Brazil handler files with unknown mime types * are also delivered. In such a case the mimetype is set to * 'application/octet-stream'. */ if(mime == null) { mime = MIME_OCTET_STREAM; } if(mime.equals(MIME_OCTET_STREAM)) { request.responseHeaders.put("Content-disposition", "attachment; filename=\"" + file.getName() + "\""); } InputStream fis = new FileInputStream(file); request.sendResponse(fis, (int)file.length(), mime, 200); fis.close(); /* * Write url to db if statistics are eanabled */ if(prefs.getBoolean(Constants.PREF_ENABLE_STATISTICS, true)) { db.insertUrl(request.url); } } catch(Exception e) { return false; } return true; } }