Provide device info directly on server connection

This avoids to retrieve them in a separate step.
This commit is contained in:
Romain Vimont 2021-05-09 16:52:22 +02:00
parent 6a2cd089a1
commit 6adc97198b
6 changed files with 28 additions and 53 deletions

View file

@ -6,7 +6,6 @@ src = [
'src/control_msg.c', 'src/control_msg.c',
'src/controller.c', 'src/controller.c',
'src/decoder.c', 'src/decoder.c',
'src/device.c',
'src/device_msg.c', 'src/device_msg.c',
'src/event_converter.c', 'src/event_converter.c',
'src/file_handler.c', 'src/file_handler.c',

View file

@ -1,23 +0,0 @@
#include "device.h"
#include "util/log.h"
bool
device_read_info(socket_t device_socket, char *device_name, struct size *size) {
unsigned char buf[DEVICE_NAME_FIELD_LENGTH + 4];
int r = net_recv_all(device_socket, buf, sizeof(buf));
if (r < DEVICE_NAME_FIELD_LENGTH + 4) {
LOGE("Could not retrieve device information");
return false;
}
// in case the client sends garbage
buf[DEVICE_NAME_FIELD_LENGTH - 1] = '\0';
// strcpy is safe here, since name contains at least
// DEVICE_NAME_FIELD_LENGTH bytes and strlen(buf) < DEVICE_NAME_FIELD_LENGTH
strcpy(device_name, (char *) buf);
size->width = (buf[DEVICE_NAME_FIELD_LENGTH] << 8)
| buf[DEVICE_NAME_FIELD_LENGTH + 1];
size->height = (buf[DEVICE_NAME_FIELD_LENGTH + 2] << 8)
| buf[DEVICE_NAME_FIELD_LENGTH + 3];
return true;
}

View file

@ -1,17 +0,0 @@
#ifndef DEVICE_H
#define DEVICE_H
#include "common.h"
#include <stdbool.h>
#include "coords.h"
#include "util/net.h"
#define DEVICE_NAME_FIELD_LENGTH 64
// name must be at least DEVICE_NAME_FIELD_LENGTH bytes
bool
device_read_info(socket_t device_socket, char *device_name, struct size *size);
#endif

View file

@ -15,7 +15,6 @@
#include "controller.h" #include "controller.h"
#include "decoder.h" #include "decoder.h"
#include "device.h"
#include "events.h" #include "events.h"
#include "file_handler.h" #include "file_handler.h"
#include "input_manager.h" #include "input_manager.h"
@ -284,17 +283,10 @@ scrcpy(const struct scrcpy_options *options) {
goto end; goto end;
} }
if (!server_connect_to(&server)) {
goto end;
}
char device_name[DEVICE_NAME_FIELD_LENGTH]; char device_name[DEVICE_NAME_FIELD_LENGTH];
struct size frame_size; struct size frame_size;
// screenrecord does not send frames when the screen content does not if (!server_connect_to(&server, device_name, &frame_size)) {
// change therefore, we transmit the screen size before the video stream,
// to be able to init the window immediately
if (!device_read_info(server.video_socket, device_name, &frame_size)) {
goto end; goto end;
} }

View file

@ -464,8 +464,28 @@ error:
return false; return false;
} }
static bool
device_read_info(socket_t device_socket, char *device_name, struct size *size) {
unsigned char buf[DEVICE_NAME_FIELD_LENGTH + 4];
int r = net_recv_all(device_socket, buf, sizeof(buf));
if (r < DEVICE_NAME_FIELD_LENGTH + 4) {
LOGE("Could not retrieve device information");
return false;
}
// in case the client sends garbage
buf[DEVICE_NAME_FIELD_LENGTH - 1] = '\0';
// strcpy is safe here, since name contains at least
// DEVICE_NAME_FIELD_LENGTH bytes and strlen(buf) < DEVICE_NAME_FIELD_LENGTH
strcpy(device_name, (char *) buf);
size->width = (buf[DEVICE_NAME_FIELD_LENGTH] << 8)
| buf[DEVICE_NAME_FIELD_LENGTH + 1];
size->height = (buf[DEVICE_NAME_FIELD_LENGTH + 2] << 8)
| buf[DEVICE_NAME_FIELD_LENGTH + 3];
return true;
}
bool bool
server_connect_to(struct server *server) { server_connect_to(struct server *server, char *device_name, struct size *size) {
if (!server->tunnel_forward) { if (!server->tunnel_forward) {
server->video_socket = net_accept(server->server_socket); server->video_socket = net_accept(server->server_socket);
if (server->video_socket == INVALID_SOCKET) { if (server->video_socket == INVALID_SOCKET) {
@ -505,7 +525,8 @@ server_connect_to(struct server *server) {
disable_tunnel(server); // ignore failure disable_tunnel(server); // ignore failure
server->tunnel_enabled = false; server->tunnel_enabled = false;
return true; // The sockets will be closed on stop if device_read_info() fails
return device_read_info(server->video_socket, device_name, size);
} }
void void

View file

@ -8,6 +8,7 @@
#include <stdint.h> #include <stdint.h>
#include "adb.h" #include "adb.h"
#include "coords.h"
#include "scrcpy.h" #include "scrcpy.h"
#include "util/log.h" #include "util/log.h"
#include "util/net.h" #include "util/net.h"
@ -58,9 +59,11 @@ bool
server_start(struct server *server, const char *serial, server_start(struct server *server, const char *serial,
const struct server_params *params); const struct server_params *params);
#define DEVICE_NAME_FIELD_LENGTH 64
// block until the communication with the server is established // block until the communication with the server is established
// device_name must point to a buffer of at least DEVICE_NAME_FIELD_LENGTH bytes
bool bool
server_connect_to(struct server *server); server_connect_to(struct server *server, char *device_name, struct size *size);
// disconnect and kill the server process // disconnect and kill the server process
void void