/* * Created by LuaView. * Copyright (c) 2017, Alibaba Group. All rights reserved. * * This source code is licensed under the MIT. * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree. */ package com.taobao.luaview.debug; import android.os.Build; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; /** * Created by lamo on 16/2/16. */ public class DebugConnection extends Socket { private static final String EMULATOR_LOCALHOST = "10.0.2.2"; private static final String GENYMOTION_LOCALHOST = "10.0.3.2"; private static final String DEVICE_LOCALHOST = "localhost"; private static final int PORT = 9876; private DataInputStream input = null; private DataOutputStream output = null; public boolean sendingEnabled = true; private static String getDebugServerHost() { // Since genymotion runs in vbox it use different hostname to refer to adb host. // We detect whether app runs on genymotion and replace js bundle server hostname accordingly if (isRunningOnGenymotion()) { return GENYMOTION_LOCALHOST; } if (isRunningOnStockEmulator()) { return EMULATOR_LOCALHOST; } return DEVICE_LOCALHOST; } private static boolean isRunningOnGenymotion() { return Build.FINGERPRINT.contains("vbox"); } private static boolean isRunningOnStockEmulator() { return Build.FINGERPRINT.contains("generic"); } public static DebugConnection create() { String host = getDebugServerHost(); try { return new DebugConnection(host, PORT); } catch (IOException e) { return null; } } public DebugConnection(String host, int port) throws IOException { super(host, port); input = new DataInputStream(getInputStream()); output = new DataOutputStream(getOutputStream()); } public boolean sendScript(byte[] content, String fileName) { return sendCmd("loadfile", fileName, content); } public boolean sendCmd(String cmd, String fileName, String info) { return sendCmd(cmd, fileName, info != null ? info.getBytes() : null); } public boolean sendCmd(String cmd, String fileName, byte[] info) { String header = "Cmd-Name:" + cmd + "\n"; if (fileName != null) { header += "File-Name:" + fileName + "\n"; } header += "\n"; if (info == null) { return sendBytes(header.getBytes()); } else { return sendBytes(header.getBytes(), info); } } public boolean sendBytes(byte[]... pieces) { if (!sendingEnabled) { return false; } try { int length = 0; for (byte[] bytes: pieces) { length += bytes.length; } output.writeByte(length >> 24); output.writeByte(length >> 16); output.writeByte(length >> 8); output.writeByte(length); for (byte[] bytes: pieces) { output.write(bytes); } return true; } catch (IOException e) { return false; } } public String reciveCMD() { try { int length = 0; length |= input.readByte() << 24; length |= input.readByte() << 16; length |= input.readByte() << 8; length |= input.readByte(); byte[] buffer = new byte[length]; input.read(buffer); return new String(buffer); } catch (IOException e) { return null; } } }