/** * This file is part of DroidPHP * * (c) 2013 Shushant Kumar * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ package net.pocketmine.server; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.Charset; import android.content.Context; import android.util.Log; public final class ServerUtils { final static String TAG = "com.MrARM.DroidPocketMine.ServerUtils"; static Context mContext; private static java.io.OutputStream stdin; private static java.io.InputStream stdout; final public static void setContext(Context mContext) { ServerUtils.mContext = mContext; } final public static String getAppDirectory() { return mContext.getApplicationInfo().dataDir; } final public static String getDataDirectory() { return android.os.Environment.getExternalStorageDirectory().getPath() + "/PocketMine"; } /** * Instead of killing process by its PID you can use this method to kill * process by specifying its name * * @param mProcessName * Name Of Process that you want to kill * @return boolean */ final public static Boolean killProcessByName(String mProcessName) { return execCommand(getAppDirectory() + "/killall " + mProcessName); } final public static void stopServer() { killProcessByName("php"); } static Process serverProc; public static Boolean isRunning() { try { serverProc.exitValue(); } catch (Exception e) { // do there the rest return true; } return false; } final public static void runServer() { File f = new File(getDataDirectory(), "tmp/"); if (!f.exists()) { f.mkdir(); } else if (!f.isDirectory()) { f.delete(); f.mkdir(); } setPermission(); String file = "/PocketMine-MP.php"; if (new File(getDataDirectory() + "/PocketMine-MP.phar").exists()) { file = "/PocketMine-MP.phar"; } String[] serverCmd = { getAppDirectory() + "/php", // getAppDirectory() + "/php_data/PocketMine-MP.php" getDataDirectory() + file }; ProcessBuilder builder = new ProcessBuilder(serverCmd); builder.redirectErrorStream(true); builder.directory(new File(getDataDirectory())); builder.environment().put("TMPDIR", getDataDirectory() + "/tmp"); try { serverProc = builder.start(); stdout = serverProc.getInputStream(); stdin = serverProc.getOutputStream(); LogActivity.log("[PocketMine] Server is starting..."); Thread tMonitor = new Thread() { public void run() { InputStreamReader reader = new InputStreamReader(stdout, Charset.forName("UTF-8")); BufferedReader br = new BufferedReader(reader); LogActivity.log("[PocketMine] Server was started."); while (isRunning()) { try { char[] buffer = new char[8192]; int size = 0; while ((size = br.read(buffer, 0, buffer.length)) != -1) { StringBuilder s = new StringBuilder(); for (int i = 0; i < size; i++) { char c = buffer[i]; if (c == '\r') { } // else if (c == '\n' || c == '\u0007') { String line = s.toString(); Log.d(TAG, line); String lineNoDate = ""; int iof = line.indexOf(" "); if (iof != -1) lineNoDate = line .substring(iof + 1); if (lineNoDate .startsWith("[CMD] There are ") && requestPlayerRefresh && requestPlayerRefreshCount == -1) { try { String num = lineNoDate .substring("[CMD] There are " .length()); num = num.substring(0, num.indexOf("/")); requestPlayerRefreshCount = Integer .parseInt(num); if (requestPlayerRefreshCount == 0) { HomeActivity .updatePlayerList(null); requestPlayerRefresh = false; } } catch (Exception e) { e.printStackTrace(); } } else if (lineNoDate .startsWith("[CMD] ") && requestPlayerRefresh && requestPlayerRefreshCount != -1) { String player = lineNoDate .substring(6); String[] players = player .split(", "); HomeActivity .updatePlayerList(players); requestPlayerRefresh = false; } else if (c == '\u0007' && line.startsWith("\u001B]0;")) { line = line.substring(4); System.out .println("[Stat] " + line); HomeActivity.setStats( getStat(line, "Online"), getStat(line, "RAM"), getStat(line, "U"), getStat(line, "D"), getStat(line, "TPS")); } else { LogActivity.log("[Server] " + (line.replace("&", "&").replace( "<", "<") .replace(">", ">"))); if (line.contains("] logged in with entity id ") || line.contains("] logged out due to ")) { refreshPlayers(); } } s = new StringBuilder(); } else { s.append(buffer[i]); } } } } catch (Exception e) { e.printStackTrace(); } finally { try { br.close(); } catch (Exception e) { e.printStackTrace(); } } } LogActivity.log("[PocketMine] Server was stopped."); HomeActivity.stopNotifyService(); HomeActivity.hideStats(); } }; tMonitor.start(); Log.i(TAG, "PHP is started"); } catch (java.lang.Exception e) { Log.e(TAG, "Unable to start PHP", e); LogActivity.log("[PocketMine] Unable to start PHP."); HomeActivity.stopNotifyService(); HomeActivity.hideStats(); killProcessByName("php"); } return; } public static String getStat(String line, String stat) { stat = stat + " "; String result = line.substring(line.indexOf(stat) + stat.length()); int iof = result.indexOf(" "); if (iof != -1) { result = result.substring(0, iof); } return result; } private static Boolean requestPlayerRefresh = false; private static int requestPlayerRefreshCount = -1; public static void refreshPlayers() { System.out.println("Refreshing player list"); requestPlayerRefreshCount = -1; requestPlayerRefresh = true; executeCMD("list"); } /** * * @param mCommand * hold the command which will be executed by invoking {@link * Runtime.getRuntime.exec(...)} * @return boolean * @throws IOException * if it unable to execute the command */ final public static boolean execCommand(String mCommand) { /* * Create a new Instance of Runtime */ Runtime r = Runtime.getRuntime(); try { /** * Executes the command */ r.exec(mCommand); } catch (java.io.IOException e) { Log.e(TAG, "execCommand", e); r = null; return false; } return true; } final static private void setPermission() { try { execCommand("/system/bin/chmod 777 " + getAppDirectory() + "/php"); execCommand("/system/bin/chmod 777 " + getAppDirectory() + "/killall"); } catch (java.lang.Exception e) { Log.e(TAG, "setPermission", e); } } public static boolean checkIfInstalled() { File mPhp = new File(getAppDirectory() + "/php"); File mPM = new File(getDataDirectory() + "/PocketMine-MP.php"); File mPMPhar = new File(getDataDirectory() + "/PocketMine-MP.phar"); int saveVer = HomeActivity.prefs != null ? HomeActivity.prefs.getInt( "filesVersion", 0) : 0; // File mMySql = new File(getAppDirectory() + "/mysqld"); // File mLighttpd = new File(getAppDirectory() + "/lighttpd"); // File mMySqlMon = new File(getAppDirectory() + "/mysql-monitor"); if (mPhp.exists() && (mPM.exists() || mPMPhar.exists()) && saveVer == 6) { return true; } return false; } public static void executeCMD(String CCmd) { try { stdin.write((CCmd + "\r\n").getBytes()); stdin.flush(); } catch (Exception e) { // stdin.close(); Log.e(TAG, "Cannot execute: " + CCmd, e); } } }