package mobi.monaca.framework.plugin; import mobi.monaca.framework.MonacaApplication; import mobi.monaca.framework.bootloader.LocalFileBootloader; import mobi.monaca.framework.util.MyLog; import mobi.monaca.framework.util.NetworkUtils; import org.apache.cordova.api.CallbackContext; import org.apache.cordova.api.CordovaPlugin; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public class HttpServerPlugin extends CordovaPlugin{ private static final String TAG = HttpServerPlugin.class.getSimpleName(); private static MonacaLocalServer localServer; @Override public boolean execute(String action, final JSONArray args, final CallbackContext callbackContext) throws JSONException { MyLog.v(TAG, "HttpServerPlugin exec action:" + action + ", args:" + args); if(action.equalsIgnoreCase("getRootDirectoryAbsolutePath")){ if(localServer != null){ callbackContext.success(localServer.getServerRoot()); }else{ callbackContext.error("Error server is not started yet. Plesae start the server before lcalling this"); } return true; } if(action.equalsIgnoreCase("getAddress")){ JSONObject addressJSON = createAddressJSON(); callbackContext.success(addressJSON); return true; } if(action.equalsIgnoreCase("getStatus")){ if(localServer == null){ JSONObject statusJSON = new JSONObject(); statusJSON.put("status", "stopped"); callbackContext.success(statusJSON); }else{ JSONObject statusJSON = createAddressJSON(); statusJSON.put("status", "started"); statusJSON.put("rootDirectoryAbsolutePath", localServer.getServerRoot()); callbackContext.success(statusJSON); } return true; } if(action.equalsIgnoreCase("start")){ if(localServer != null){ localServer.stop(); } if (args.length() < 2) { callbackContext.error("either documentRoot or params is not supplied"); } else { Runnable serverRunner = new Runnable(){ @Override public void run() { try{ String rootDir = args.getString(0); JSONObject params = args.getJSONObject(1); int port = params.getInt("port"); localServer = new MonacaLocalServer(cordova.getActivity(), rootDir, port); localServer.start(); JSONObject result = new JSONObject(); result.put("networks", NetworkUtils.getIPAddresses()); result.put("port", port); callbackContext.success(result); }catch (JSONException e) { callbackContext.error(e.getMessage()); e.printStackTrace(); } catch (Exception e) { callbackContext.error("Cannot start server. error: " + e.getMessage()); e.printStackTrace(); } }}; Runnable fail = new Runnable(){ @Override public void run() { callbackContext.error("Cannot start server."); }}; if (((MonacaApplication)cordova.getActivity().getApplication()).enablesBootloader()) { LocalFileBootloader.setup(cordova.getActivity(), serverRunner, fail); } else { serverRunner.run(); } } return true; }else if(action.equalsIgnoreCase("stop")){ if(localServer != null){ localServer.stop(); localServer = null; callbackContext.success(); } return true; }else{ return false; } } private JSONObject createAddressJSON() throws JSONException { JSONObject result = new JSONObject(); result.put("ip", NetworkUtils.getIPAddress(true)); result.put("port", localServer.getPort()); return result; } @Override public void onDestroy() { MyLog.i(TAG, "Monaca HttpServer plugin onDestroy"); if(localServer != null){ MyLog.i(TAG, "closing local server"); localServer.stop(); } super.onDestroy(); } }