Send device name on the socket

Make the server send the device name along with the width and height, so
that the client may use it as the window title.
This commit is contained in:
Romain Vimont 2017-12-12 15:06:49 +01:00
commit 39fd6ce518
6 changed files with 42 additions and 20 deletions

View file

@ -5,9 +5,12 @@ import android.net.LocalSocketAddress;
import java.io.Closeable;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class DesktopConnection implements Closeable {
private static final int DEVICE_NAME_FIELD_LENGTH = 64;
private static final String SOCKET_NAME = "scrcpy";
private final LocalSocket socket;
@ -22,9 +25,9 @@ public class DesktopConnection implements Closeable {
return localSocket;
}
public static DesktopConnection open(int width, int height) throws IOException {
public static DesktopConnection open(String deviceName, int width, int height) throws IOException {
LocalSocket socket = connect(SOCKET_NAME);
send(socket, width, height);
send(socket, deviceName, width, height);
return new DesktopConnection(socket);
}
@ -34,15 +37,21 @@ public class DesktopConnection implements Closeable {
socket.close();
}
private static void send(LocalSocket socket, int width, int height) throws IOException {
private static void send(LocalSocket socket, String deviceName, int width, int height) throws IOException {
assert width < 0x10000 : "width may not be stored on 16 bits";
assert height < 0x10000 : "height may not be stored on 16 bits";
byte[] buffer = new byte[4];
buffer[0] = (byte) (width >> 8);
buffer[1] = (byte) width;
buffer[2] = (byte) (height >> 8);
buffer[3] = (byte) height;
socket.getOutputStream().write(buffer, 0, 4);
byte[] buffer = new byte[DEVICE_NAME_FIELD_LENGTH + 4];
byte[] deviceNameBytes = deviceName.getBytes(StandardCharsets.UTF_8);
int len = Math.min(DEVICE_NAME_FIELD_LENGTH - 1, deviceNameBytes.length);
System.arraycopy(deviceNameBytes, 0, buffer, 0, len);
// byte[] are always 0-initialized in java, no need to set '\0' explicitly
buffer[DEVICE_NAME_FIELD_LENGTH] = (byte) (width >> 8);
buffer[DEVICE_NAME_FIELD_LENGTH + 1] = (byte) width;
buffer[DEVICE_NAME_FIELD_LENGTH + 2] = (byte) (height >> 8);
buffer[DEVICE_NAME_FIELD_LENGTH + 3] = (byte) height;
socket.getOutputStream().write(buffer, 0, buffer.length);
}
public void sendVideoStream(byte[] videoStreamBuffer, int len) throws IOException {

View file

@ -1,12 +1,13 @@
package com.genymobile.scrcpy;
import android.os.Build;
import android.os.IBinder;
import android.os.IInterface;
import android.view.IRotationWatcher;
import java.lang.reflect.Method;
public class ScreenUtil {
public class DeviceUtil {
private static final ServiceManager serviceManager = new ServiceManager();
@ -18,6 +19,10 @@ public class ScreenUtil {
serviceManager.getWindowManager().registerRotationWatcher(rotationWatcher);
}
public static String getDeviceName() {
return Build.MODEL;
}
private static class ServiceManager {
private Method getServiceMethod;

View file

@ -5,10 +5,11 @@ import java.io.IOException;
public class ScrCpyServer {
public static void scrcpy() throws IOException {
ScreenInfo initialScreenInfo = ScreenUtil.getScreenInfo();
String deviceName = DeviceUtil.getDeviceName();
ScreenInfo initialScreenInfo = DeviceUtil.getScreenInfo();
int width = initialScreenInfo.getLogicalWidth();
int height = initialScreenInfo.getLogicalHeight();
try (DesktopConnection connection = DesktopConnection.open(width, height)) {
try (DesktopConnection connection = DesktopConnection.open(deviceName, width, height)) {
try {
new ScreenStreamer(connection).streamScreen();
} catch (IOException e) {

View file

@ -13,7 +13,7 @@ public class ScreenStreamer {
public ScreenStreamer(DesktopConnection connection) {
this.connection = connection;
ScreenUtil.registerRotationWatcher(new IRotationWatcher.Stub() {
DeviceUtil.registerRotationWatcher(new IRotationWatcher.Stub() {
@Override
public void onRotationChanged(int rotation) throws RemoteException {
reset();