aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@google.com>2014-07-12 03:40:11 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-07-12 03:40:11 +0000
commit006a174244e336c578f45bf78a9dbdbd890c217d (patch)
tree7857f7018b73fe8797101cdcaef5fd7ef7e1867c
parentf5aeaf653d85fd44cb3eb4856e702096dcd211fd (diff)
parentb244de10aac448aa9a51cf22d7bc420170dbf215 (diff)
downloadqemu-android-cts-5.1_r22.tar.gz
am b244de10: Merge "Remove obsolete android/protocol/ directory."android-wear-5.0.0_r1android-l-preview_r2android-cts-5.1_r9android-cts-5.1_r8android-cts-5.1_r7android-cts-5.1_r6android-cts-5.1_r5android-cts-5.1_r4android-cts-5.1_r3android-cts-5.1_r28android-cts-5.1_r27android-cts-5.1_r26android-cts-5.1_r25android-cts-5.1_r24android-cts-5.1_r23android-cts-5.1_r22android-cts-5.1_r21android-cts-5.1_r20android-cts-5.1_r2android-cts-5.1_r19android-cts-5.1_r18android-cts-5.1_r17android-cts-5.1_r16android-cts-5.1_r15android-cts-5.1_r14android-cts-5.1_r13android-cts-5.1_r10android-cts-5.1_r1android-cts-5.0_r9android-cts-5.0_r8android-cts-5.0_r7android-cts-5.0_r6android-cts-5.0_r5android-cts-5.0_r4android-cts-5.0_r3android-5.1.1_r9android-5.1.1_r8android-5.1.1_r7android-5.1.1_r6android-5.1.1_r5android-5.1.1_r4android-5.1.1_r38android-5.1.1_r37android-5.1.1_r36android-5.1.1_r35android-5.1.1_r34android-5.1.1_r33android-5.1.1_r30android-5.1.1_r3android-5.1.1_r29android-5.1.1_r28android-5.1.1_r26android-5.1.1_r25android-5.1.1_r24android-5.1.1_r23android-5.1.1_r22android-5.1.1_r20android-5.1.1_r2android-5.1.1_r19android-5.1.1_r18android-5.1.1_r17android-5.1.1_r16android-5.1.1_r15android-5.1.1_r14android-5.1.1_r13android-5.1.1_r12android-5.1.1_r10android-5.1.1_r1android-5.1.0_r5android-5.1.0_r4android-5.1.0_r3android-5.1.0_r1android-5.0.2_r3android-5.0.2_r1android-5.0.1_r1android-5.0.0_r7android-5.0.0_r6android-5.0.0_r5.1android-5.0.0_r5android-5.0.0_r4android-5.0.0_r3android-5.0.0_r2android-5.0.0_r1lollipop-wear-releaselollipop-releaselollipop-mr1-wfc-releaselollipop-mr1-releaselollipop-mr1-fi-releaselollipop-mr1-devlollipop-mr1-cts-releaselollipop-devlollipop-cts-releasel-preview
* commit 'b244de10aac448aa9a51cf22d7bc420170dbf215': Remove obsolete android/protocol/ directory.
-rw-r--r--Makefile.target2
-rw-r--r--android/cmdline-options.h5
-rw-r--r--android/console.c10
-rw-r--r--android/help.c27
-rw-r--r--android/main-common-ui.c2
-rw-r--r--android/main-common.c230
-rw-r--r--android/opengles.c5
-rw-r--r--android/protocol/attach-ui-impl.c83
-rw-r--r--android/protocol/attach-ui-impl.h39
-rw-r--r--android/protocol/attach-ui-proxy.c110
-rw-r--r--android/protocol/attach-ui-proxy.h33
-rw-r--r--android/protocol/core-commands-api.h95
-rw-r--r--android/protocol/core-commands-impl.c440
-rw-r--r--android/protocol/core-commands-impl.h34
-rw-r--r--android/protocol/core-commands-proxy.c376
-rw-r--r--android/protocol/core-commands-proxy.h35
-rw-r--r--android/protocol/core-commands-qemu.c102
-rw-r--r--android/protocol/core-commands.h104
-rw-r--r--android/protocol/core-connection.c363
-rw-r--r--android/protocol/core-connection.h169
-rw-r--r--android/protocol/fb-updates-impl.c271
-rw-r--r--android/protocol/fb-updates-impl.h44
-rw-r--r--android/protocol/fb-updates-proxy.c346
-rw-r--r--android/protocol/fb-updates-proxy.h53
-rw-r--r--android/protocol/fb-updates.h45
-rw-r--r--android/protocol/ui-commands-api.h41
-rw-r--r--android/protocol/ui-commands-impl.c257
-rw-r--r--android/protocol/ui-commands-impl.h38
-rw-r--r--android/protocol/ui-commands-proxy.c209
-rw-r--r--android/protocol/ui-commands-proxy.h41
-rw-r--r--android/protocol/ui-commands-qemu.c40
-rw-r--r--android/protocol/ui-commands.h44
-rw-r--r--android/protocol/ui-common.h53
-rw-r--r--android/protocol/user-events-impl.c206
-rw-r--r--android/protocol/user-events-impl.h33
-rw-r--r--android/protocol/user-events-protocol.h58
-rw-r--r--android/protocol/user-events-proxy.c178
-rw-r--r--android/protocol/user-events-proxy.h33
-rw-r--r--android/qemulator.c23
-rw-r--r--android/qemulator.h3
-rw-r--r--android/skin/window.c6
-rw-r--r--ui/keymaps.c16
42 files changed, 24 insertions, 4278 deletions
diff --git a/Makefile.target b/Makefile.target
index 4b504203da..e68de282a7 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -309,8 +309,6 @@ common_LOCAL_SRC_FILES := \
android/main-common-ui.c \
android/main.c \
android/opengles.c \
- android/protocol/core-commands-qemu.c \
- android/protocol/ui-commands-qemu.c \
android/user-events-qemu.c \
hw/core/loader.c \
ui/keymaps.c \
diff --git a/android/cmdline-options.h b/android/cmdline-options.h
index 1009af646c..4653dfe43f 100644
--- a/android/cmdline-options.h
+++ b/android/cmdline-options.h
@@ -150,11 +150,6 @@ OPT_PARAM( shared_net_id, "<number>", "join the shared network, using IP address
OPT_PARAM( nand_limits, "<nlimits>", "enforce NAND/Flash read/write thresholds" )
#endif
-#ifdef CONFIG_STANDALONE_UI
-OPT_PARAM( list_cores, "<host>", "list running core process" )
-OPT_PARAM( attach_core, "<console socket>", "attach to a running core process" )
-#endif // CONFIG_STANDALONE_UI
-
OPT_PARAM( gpu, "<mode>", "set hardware OpenGLES emulation mode" )
OPT_PARAM( camera_back, "<mode>", "set emulation mode for a camera facing back" )
diff --git a/android/console.c b/android/console.c
index dc55646471..b033c1d372 100644
--- a/android/console.c
+++ b/android/console.c
@@ -53,17 +53,13 @@
#include "android/keycode-array.h"
#include "android/charmap.h"
#include "android/display-core.h"
-#include "android/protocol/fb-updates-proxy.h"
-#include "android/protocol/user-events-impl.h"
-#include "android/protocol/ui-commands-api.h"
-#include "android/protocol/core-commands-impl.h"
-#include "android/protocol/ui-commands-proxy.h"
-#include "android/protocol/attach-ui-proxy.h"
#if defined(CONFIG_SLIRP)
#include "libslirp.h"
#endif
+extern void android_emulator_set_window_scale(double, int);
+
#define DEBUG 1
#if 1
@@ -2616,7 +2612,7 @@ do_window_scale( ControlClient client, char* args )
}
}
- uicmd_set_window_scale( scale, is_dpi );
+ android_emulator_set_window_scale(scale, is_dpi);
return 0;
}
diff --git a/android/help.c b/android/help.c
index 3ba19bf5d7..acddfa8870 100644
--- a/android/help.c
+++ b/android/help.c
@@ -979,33 +979,6 @@ help_trace(stralloc_t* out)
);
}
-#ifdef CONFIG_STANDALONE_UI
-static void
-help_list_cores(stralloc_t* out)
-{
- PRINTF(
- " use '-list-cores localhost to list emulator core processes running on this machine.\n"
- " use '-list-cores host_name, or IP address to list emulator core processes running on\n"
- " a remote machine.\n"
- );
-}
-
-static void
-help_attach_core(stralloc_t* out)
-{
- PRINTF(
- " the -attach-core <console socket> options attaches the UI to a running emulator core process.\n\n"
-
- " the <console socket> parameter must be in the form [host:]port, where 'host' addresses the\n"
- " machine on which the core process is running, and 'port' addresses the console port number for\n"
- " the running core process. Note that 'host' value must be in the form that can be resolved\n"
- " into an IP address.\n\n"
-
- " Use -list-cores to enumerate console ports for all currently running core processes.\n"
- );
-}
-#endif // CONFIG_STANDALONE_UI
-
static void
help_show_kernel(stralloc_t* out)
{
diff --git a/android/main-common-ui.c b/android/main-common-ui.c
index 0a58edae4f..5689a111dd 100644
--- a/android/main-common-ui.c
+++ b/android/main-common-ui.c
@@ -281,9 +281,7 @@ void sdl_display_init(DisplayState *ds, int full_screen, int no_frame)
}
snprintf(buf, sizeof buf, "width=%d,height=%d", width, height);
-#if !defined(CONFIG_STANDALONE_UI) && !defined(CONFIG_STANDALONE_CORE)
android_display_init(ds, qframebuffer_fifo_get());
-#endif
}
typedef struct part_properties part_properties;
diff --git a/android/main-common.c b/android/main-common.c
index de51109735..ed3c584982 100644
--- a/android/main-common.c
+++ b/android/main-common.c
@@ -413,234 +413,6 @@ AvdInfo* createAVD(AndroidOptions* opts, int* inAndroidBuild)
return ret;
}
-
-
-
-#ifdef CONFIG_STANDALONE_UI
-
-#include "android/protocol/core-connection.h"
-#include "android/protocol/fb-updates-impl.h"
-#include "android/protocol/user-events-proxy.h"
-#include "android/protocol/core-commands-proxy.h"
-#include "android/protocol/ui-commands-impl.h"
-#include "android/protocol/attach-ui-impl.h"
-
-/* Emulator's core port. */
-int android_base_port = 0;
-
-// Base console port
-#define CORE_BASE_PORT 5554
-
-// Maximum number of core porocesses running simultaneously on a machine.
-#define MAX_CORE_PROCS 16
-
-// Socket timeout in millisec (set to 5 seconds)
-#define CORE_PORT_TIMEOUT_MS 5000
-
-#include "android/async-console.h"
-
-typedef struct {
- LoopIo io[1];
- int port;
- int ok;
- AsyncConsoleConnector connector[1];
-} CoreConsole;
-
-static void
-coreconsole_io_func(void* opaque, int fd, unsigned events)
-{
- CoreConsole* cc = opaque;
- AsyncStatus status;
- status = asyncConsoleConnector_run(cc->connector);
- if (status == ASYNC_COMPLETE) {
- cc->ok = 1;
- }
-}
-
-static void
-coreconsole_init(CoreConsole* cc, const SockAddress* address, Looper* looper)
-{
- int fd = socket_create_inet(SOCKET_STREAM);
- AsyncStatus status;
- cc->port = sock_address_get_port(address);
- cc->ok = 0;
- loopIo_init(cc->io, looper, fd, coreconsole_io_func, cc);
- if (fd >= 0) {
- status = asyncConsoleConnector_connect(cc->connector, address, cc->io);
- if (status == ASYNC_ERROR) {
- cc->ok = 0;
- }
- }
-}
-
-static void
-coreconsole_done(CoreConsole* cc)
-{
- socket_close(cc->io->fd);
- loopIo_done(cc->io);
-}
-
-/* List emulator core processes running on the given machine.
- * This routine is called from main() if -list-cores parameter is set in the
- * command line.
- * Param:
- * host Value passed with -list-core parameter. Must be either "localhost", or
- * an IP address of a machine where core processes must be enumerated.
- */
-static void
-list_running_cores(const char* host)
-{
- Looper* looper;
- CoreConsole cores[MAX_CORE_PROCS];
- SockAddress address;
- int nn, found;
-
- if (sock_address_init_resolve(&address, host, CORE_BASE_PORT, 0) < 0) {
- derror("Unable to resolve hostname %s: %s", host, errno_str);
- return;
- }
-
- looper = looper_newGeneric();
-
- for (nn = 0; nn < MAX_CORE_PROCS; nn++) {
- int port = CORE_BASE_PORT + nn*2;
- sock_address_set_port(&address, port);
- coreconsole_init(&cores[nn], &address, looper);
- }
-
- looper_runWithTimeout(looper, CORE_PORT_TIMEOUT_MS*2);
-
- found = 0;
- for (nn = 0; nn < MAX_CORE_PROCS; nn++) {
- int port = CORE_BASE_PORT + nn*2;
- if (cores[nn].ok) {
- if (found == 0) {
- fprintf(stdout, "Running emulator core processes:\n");
- }
- fprintf(stdout, "Emulator console port %d\n", port);
- found++;
- }
- coreconsole_done(&cores[nn]);
- }
- looper_free(looper);
-
- if (found == 0) {
- fprintf(stdout, "There were no running emulator core processes found on %s.\n",
- host);
- }
-}
-
-/* Attaches starting UI to a running core process.
- * This routine is called from main() when -attach-core parameter is set,
- * indicating that this UI instance should attach to a running core, rather than
- * start a new core process.
- * Param:
- * opts Android options containing non-NULL attach_core.
- * Return:
- * 0 on success, or -1 on failure.
- */
-static int
-attach_to_core(AndroidOptions* opts) {
- int iter;
- SockAddress console_socket;
- SockAddress** sockaddr_list;
- QEmulator* emulator;
-
- // Parse attach_core param extracting the host name, and the port name.
- char* console_address = strdup(opts->attach_core);
- char* host_name = console_address;
- char* port_num = strchr(console_address, ':');
- if (port_num == NULL) {
- // The host name is ommited, indicating the localhost
- host_name = "localhost";
- port_num = console_address;
- } else if (port_num == console_address) {
- // Invalid.
- derror("Invalid value %s for -attach-core parameter\n",
- opts->attach_core);
- return -1;
- } else {
- *port_num = '\0';
- port_num++;
- if (*port_num == '\0') {
- // Invalid.
- derror("Invalid value %s for -attach-core parameter\n",
- opts->attach_core);
- return -1;
- }
- }
-
- /* Create socket address list for the given address, and pull appropriate
- * address to use for connection. Note that we're fine copying that address
- * out of the list, since INET and IN6 will entirely fit into SockAddress
- * structure. */
- sockaddr_list =
- sock_address_list_create(host_name, port_num, SOCKET_LIST_FORCE_INET);
- free(console_address);
- if (sockaddr_list == NULL) {
- derror("Unable to resolve address %s: %s\n",
- opts->attach_core, errno_str);
- return -1;
- }
- for (iter = 0; sockaddr_list[iter] != NULL; iter++) {
- if (sock_address_get_family(sockaddr_list[iter]) == SOCKET_INET ||
- sock_address_get_family(sockaddr_list[iter]) == SOCKET_IN6) {
- memcpy(&console_socket, sockaddr_list[iter], sizeof(SockAddress));
- break;
- }
- }
- if (sockaddr_list[iter] == NULL) {
- derror("Unable to resolve address %s. Note that 'port' parameter passed to -attach-core\n"
- "must be resolvable into an IP address.\n", opts->attach_core);
- sock_address_list_free(sockaddr_list);
- return -1;
- }
- sock_address_list_free(sockaddr_list);
-
- if (attachUiImpl_create(&console_socket)) {
- return -1;
- }
-
- // Save core's port, and set the title.
- android_base_port = sock_address_get_port(&console_socket);
- emulator = qemulator_get();
- qemulator_set_title(emulator);
-
- return 0;
-}
-
-
-void handle_ui_options( AndroidOptions* opts )
-{
- // Lets see if user just wants to list core process.
- if (opts->list_cores) {
- fprintf(stdout, "Enumerating running core processes.\n");
- list_running_cores(opts->list_cores);
- exit(0);
- }
-}
-
-int attach_ui_to_core( AndroidOptions* opts )
-{
- // Lets see if we're attaching to a running core process here.
- if (opts->attach_core) {
- if (attach_to_core(opts)) {
- return -1;
- }
- // Connect to the core's UI control services.
- if (coreCmdProxy_create(attachUiImpl_get_console_socket())) {
- return -1;
- }
- // Connect to the core's user events service.
- if (userEventsProxy_create(attachUiImpl_get_console_socket())) {
- return -1;
- }
- }
- return 0;
-}
-
-#else /* !CONFIG_STANDALONE_UI */
-
void handle_ui_options( AndroidOptions* opts )
{
return;
@@ -650,5 +422,3 @@ int attach_ui_to_core( AndroidOptions* opts )
{
return 0;
}
-
-#endif /* CONFIG_STANDALONE_UI */
diff --git a/android/opengles.c b/android/opengles.c
index 25704299c7..0d7855ca01 100644
--- a/android/opengles.c
+++ b/android/opengles.c
@@ -110,10 +110,8 @@ RENDERER_FUNCTIONS_LIST
}
-#ifndef CONFIG_STANDALONE_UI
/* Defined in android/hw-pipe-net.c */
extern int android_init_opengles_pipes(void);
-#endif
static ADynamicLibrary* rendererLib;
static int rendererStarted;
@@ -135,10 +133,7 @@ android_initOpenglesEmulation(void)
return -1;
}
-#ifndef CONFIG_STANDALONE_UI
android_init_opengles_pipes();
-#endif
-
/* Resolve the functions */
if (initOpenglesEmulationFuncs(rendererLib) < 0) {
diff --git a/android/protocol/attach-ui-impl.c b/android/protocol/attach-ui-impl.c
deleted file mode 100644
index a61e546801..0000000000
--- a/android/protocol/attach-ui-impl.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the UI-side implementation of the "core-ui-control" service that is
- * part of the UI control protocol. Here we handle UI control commands received
- * from the Core.
- */
-
-#include "android/utils/debug.h"
-#include "android/utils/panic.h"
-#include "android/protocol/core-connection.h"
-#include "android/protocol/attach-ui-impl.h"
-
-/* Descriptor for the UI-side of the "attach-ui" service. */
-typedef struct AttachUIImpl {
- /* Address of the Core's console socket. */
- SockAddress console_socket;
-
- /* Core connection established for this service. */
- CoreConnection* core_connection;
-
- /* Socket descriptor for the UI service. */
- int sock;
-} AttachUIImpl;
-
-/* One and only one AttachUIImpl instance. */
-static AttachUIImpl _attachUiImpl;
-
-SockAddress*
-attachUiImpl_get_console_socket(void)
-{
- return &_attachUiImpl.console_socket;
-}
-
-int
-attachUiImpl_create(SockAddress* console_socket)
-{
- char* handshake = NULL;
-
- _attachUiImpl.console_socket = *console_socket;
-
- // Connect to the core-ui-control service.
- _attachUiImpl.core_connection =
- core_connection_create_and_switch(console_socket, "attach-UI",
- &handshake);
- if (_attachUiImpl.core_connection == NULL) {
- derror("Unable to connect to the attach-UI service: %s\n",
- errno_str);
- return -1;
- }
-
- fprintf(stdout, "UI is now attached to the core at %s.",
- sock_address_to_string(console_socket));
- if (handshake != NULL) {
- if (handshake[0] != '\0') {
- fprintf(stdout, " Handshake: %s", handshake);
- }
- free(handshake);
- }
- fprintf(stdout, "\n");
-
- return 0;
-}
-
-void
-attachUiImpl_destroy(void)
-{
- if (_attachUiImpl.core_connection != NULL) {
- core_connection_close(_attachUiImpl.core_connection);
- core_connection_free(_attachUiImpl.core_connection);
- _attachUiImpl.core_connection = NULL;
- }
-}
diff --git a/android/protocol/attach-ui-impl.h b/android/protocol/attach-ui-impl.h
deleted file mode 100644
index db63955788..0000000000
--- a/android/protocol/attach-ui-impl.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_ATTACH_UI_IMPL_H
-#define _ANDROID_PROTOCOL_ATTACH_UI_IMPL_H
-
-#include "android/sockets.h"
-
-/*
- * Contains the UI-side implementation of the "attach-ui" service that is
- * used to establish connection between the UI and the Core.
- */
-
-/* Creates and initializes descriptor for the UI-side of the "atatch-ui"
- * service. Note that there can be only one instance of this service in the core.
- * Param:
- * console_socket - Addresses Core's console.
- * Return:
- * 0 on success, or < 0 on failure.
- */
-extern int attachUiImpl_create(SockAddress* console_socket);
-
-/* Destroys the descriptor for the UI-side of the "attach-ui" service. */
-extern void attachUiImpl_destroy(void);
-
-/* Gets Core's console socket address for the attached UI. */
-extern SockAddress* attachUiImpl_get_console_socket(void);
-
-#endif /* _ANDROID_PROTOCOL_ATTACH_UI_IMPL_H */
-
diff --git a/android/protocol/attach-ui-proxy.c b/android/protocol/attach-ui-proxy.c
deleted file mode 100644
index a0bc7fcff3..0000000000
--- a/android/protocol/attach-ui-proxy.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the Core-side implementation of the "attach-ui" service that is
- * used to establish connection between the UI and the Core.
- */
-
-#include "android/android.h"
-#include "android/globals.h"
-#include "android/looper.h"
-#include "android/async-utils.h"
-#include "android/sync-utils.h"
-#include "android/utils/debug.h"
-#include "android/protocol/core-commands.h"
-#include "android/protocol/core-commands-impl.h"
-
-/* Descriptor for the UI attach-ui proxy. */
-typedef struct AttachUIProxy {
- /* Reader to detect UI disconnection. */
- AsyncReader async_reader;
-
- /* I/O associated with this descriptor. */
- LoopIo io;
-
- /* Looper used to communicate with the UI. */
- Looper* looper;
-
- /* Socket descriptor for this service. */
- int sock;
-} AttachUIProxy;
-
-/* One and only one AttachUIProxy instance. */
-static AttachUIProxy _attachUiProxy;
-
-/* Implemented in android/console.c */
-extern void destroy_attach_ui_client(void);
-
-/* Asynchronous I/O callback for AttachUIProxy instance.
- * We expect this callback to be called only on UI detachment condition. In this
- * case the event should be LOOP_IO_READ, and read should fail with errno set
- * to ECONNRESET.
- * Param:
- * opaque - AttachUIProxy instance.
- */
-static void
-_attachUiProxy_io_func(void* opaque, int fd, unsigned events)
-{
- AttachUIProxy* uicmd = (AttachUIProxy*)opaque;
- AsyncReader reader;
- AsyncStatus status;
- uint8_t read_buf[1];
-
- if (events & LOOP_IO_WRITE) {
- derror("Unexpected LOOP_IO_WRITE in _attachUiProxy_io_func.\n");
- return;
- }
-
- // Try to read
- asyncReader_init(&reader, read_buf, sizeof(read_buf), &uicmd->io);
- status = asyncReader_read(&reader);
- // We expect only error status here.
- if (status != ASYNC_ERROR) {
- derror("Unexpected read status %d in _attachUiProxy_io_func\n", status);
- return;
- }
- // We expect only socket disconnection error here.
- if (errno != ECONNRESET) {
- derror("Unexpected read error %d (%s) in _attachUiProxy_io_func.\n",
- errno, errno_str);
- return;
- }
-
- // Client got disconnectted.
- destroy_attach_ui_client();
-}
-
-int
-attachUiProxy_create(int fd)
-{
- // Initialize the only AttachUIProxy instance.
- _attachUiProxy.sock = fd;
- _attachUiProxy.looper = looper_newCore();
- loopIo_init(&_attachUiProxy.io, _attachUiProxy.looper, _attachUiProxy.sock,
- _attachUiProxy_io_func, &_attachUiProxy);
- loopIo_wantRead(&_attachUiProxy.io);
-
- return 0;
-}
-
-void
-attachUiProxy_destroy(void)
-{
- if (_attachUiProxy.looper != NULL) {
- // Stop all I/O that may still be going on.
- loopIo_done(&_attachUiProxy.io);
- looper_free(_attachUiProxy.looper);
- _attachUiProxy.looper = NULL;
- }
- _attachUiProxy.sock = -1;
-}
diff --git a/android/protocol/attach-ui-proxy.h b/android/protocol/attach-ui-proxy.h
deleted file mode 100644
index a7d54f4ab8..0000000000
--- a/android/protocol/attach-ui-proxy.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_ATTACH_UI_PROXY_H
-#define _ANDROID_PROTOCOL_ATTACH_UI_PROXY_H
-
-/*
- * Contains the Core-side implementation of the "attach-ui" service that is
- * used to establish connection between the UI and the Core.
- */
-
-/* Creates and initializes descriptor for the Core-side of the "atatch-ui"
- * service. Note that there can be only one instance of this service in the core.
- * Param:
- * fd - Socket descriptor for the proxy.
- * Return:
- * 0 on success, or < 0 on failure.
- */
-extern int attachUiProxy_create(int fd);
-
-/* Destroys the descriptor for the Core-side of the "attach-ui" service. */
-extern void attachUiProxy_destroy(void);
-
-#endif /* _ANDROID_PROTOCOL_ATTACH_UI_PROXY_H */
diff --git a/android/protocol/core-commands-api.h b/android/protocol/core-commands-api.h
deleted file mode 100644
index 93a569cb4f..0000000000
--- a/android/protocol/core-commands-api.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_CORE_COMMANDS_API_H
-#define _ANDROID_PROTOCOL_CORE_COMMANDS_API_H
-
-/*
- * Contains the API for calling into the Core with UI control commands.
- */
-
-#include "android/android.h"
-#include "android/hw-sensors.h"
-
-/* Instructs the Core to change the coarse orientation.
- * Return:
- * 0 on success, or < 0 on failure.
- */
-extern int corecmd_set_coarse_orientation(AndroidCoarseOrientation orient);
-
-/* Toggles the network in the Core.
- * Return:
- * 0 on success, or < 0 on failure.
- */
-extern int corecmd_toggle_network();
-
-/* Starts or stops tracing in the Core.
- * Param:
- * start - Starts (> 0), or stops (== 0) tracing.
- * Return:
- * 0 on success, or < 0 on failure.
- */
-extern int corecmd_trace_control(int start);
-
-/* Checks if network is disabled in the Core.
- * Return:
- * 0 if network is enabled, 1 if it is disabled, or < 0 on failure.
- */
-extern int corecmd_is_network_disabled();
-
-/* Requests a NetworkSpeed instance from the Core.
- * Param:
- * index - Index of an entry in the NetworkSpeed array.
- * netspeed - Upon success contains allocated and initialized NetworkSpeed
- * instance for the given index. Note that strings addressed by "name" and
- * "display" fileds in the returned NetworkSpeed instance are containd
- * inside the buffer allocated for the returned NetworkSpeed instance.
- * Caller of this routine must eventually free the buffer returned in this
- * parameter.
- * Return:
- * 0 on success, or < 0 on failure.
- */
-extern int corecmd_get_netspeed(int index, NetworkSpeed** netspeed);
-
-/* Requests a NetworkLatency instance from the Core.
- * Param:
- * index - Index of an entry in the NetworkLatency array.
- * netdelay - Upon success contains allocated and initialized NetworkLatency
- * instance for the given index. Note that strings addressed by "name" and
- * "display" fileds in the returned NetworkLatency instance are containd
- * inside the buffer allocated for the returned NetworkLatency instance.
- * Caller of this routine must eventually free the buffer returned in this
- * parameter.
- * Return:
- * 0 on success, or < 0 on failure.
- */
-extern int corecmd_get_netdelay(int index, NetworkLatency** netdelay);
-
-/* Requests a QEMU file path from the Core.
- * Param:
- * type, filename - Request parameters that define the file for which path is
- * requested.
- * Return:
- * 0 on success, or < 0 on failure.
- */
-extern int corecmd_get_qemu_path(int type,
- const char* filename,
- char* path,
- size_t path_buf_size);
-
-/* Gets LCD density property from the core properties.
- * Return:
- * LCD density on success, or < 0 on failure.
- */
-extern int corecmd_get_hw_lcd_density(void);
-
-#endif /* _ANDROID_PROTOCOL_CORE_COMMANDS_API_H */
diff --git a/android/protocol/core-commands-impl.c b/android/protocol/core-commands-impl.c
deleted file mode 100644
index 8ca18c01e2..0000000000
--- a/android/protocol/core-commands-impl.c
+++ /dev/null
@@ -1,440 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the Core-side implementation of the "ui-core-control" service that is
- * part of the UI control protocol. Here we handle UI control commands sent by
- * the UI to the Core.
- */
-
-#include "android/android.h"
-#include "android/globals.h"
-#include "telephony/modem_driver.h"
-#include "android/trace.h"
-#include "android/looper.h"
-#include "android/async-utils.h"
-#include "android/sync-utils.h"
-#include "android/utils/debug.h"
-#include "android/protocol/core-commands.h"
-#include "android/protocol/core-commands-impl.h"
-
-/* Enumerates state values for the command reader in the CoreCmdImpl descriptor.
- */
-typedef enum CoreCmdImplState {
- /* The reader is waiting on command header. */
- EXPECTS_HEADER,
-
- /* The reader is waiting on command parameters. */
- EXPECTS_PARAMETERS,
-} CoreCmdImplState;
-
-/* Descriptor for the Core-side implementation of the "ui-core-control" service.
- */
-typedef struct CoreCmdImpl {
- /* Reader to detect UI disconnection. */
- AsyncReader async_reader;
-
- /* I/O associated with this descriptor. */
- LoopIo io;
-
- /* Looper used to communicate with the UI. */
- Looper* looper;
-
- /* Writer to send responses to the UI commands. */
- SyncSocket* sync_writer;
-
- /* Socket descriptor for this service. */
- int sock;
-
- /* Command reader state. */
- CoreCmdImplState cmd_state;
-
- /* Incoming command header. */
- UICmdHeader cmd_header;
-
- /* A small preallocated buffer for command parameters. */
- uint8_t cmd_param[256];
-
- /* Buffer to use for reading command parameters. Depending on expected size
- * of the parameters this buffer can point to cmd_param field of this
- * structure (for small commands), or can be allocated for large commands. */
- void* cmd_param_buf;
-} CoreCmdImpl;
-
-/* One and only one CoreCmdImpl instance. */
-static CoreCmdImpl _coreCmdImpl;
-
-/* Implemented in android/console.c */
-extern void destroy_corecmd_client(void);
-/* Implemented in vl-android.c */
-extern char* qemu_find_file(int type, const char* filename);
-
-/* Properly initializes cmd_param_buf field in CoreCmdImpl instance to receive
- * the expected command parameters.
- */
-static uint8_t*
-_alloc_cmd_param_buf(CoreCmdImpl* corecmd, uint32_t size)
-{
- if (size < sizeof(corecmd->cmd_param)) {
- // cmd_param can contain all request data.
- corecmd->cmd_param_buf = &corecmd->cmd_param[0];
- } else {
- // Expected request us too large to fit into preallocated buffer.
- corecmd->cmd_param_buf = g_malloc(size);
- }
- return corecmd->cmd_param_buf;
-}
-
-/* Properly frees cmd_param_buf field in CoreCmdImpl instance.
- */
-static void
-_free_cmd_param_buf(CoreCmdImpl* corecmd)
-{
- if (corecmd->cmd_param_buf != &corecmd->cmd_param[0]) {
- g_free(corecmd->cmd_param_buf);
- corecmd->cmd_param_buf = &corecmd->cmd_param[0];
- }
-}
-
-/* Calculates timeout for transferring the given number of bytes via socket.
- * Return:
- * Number of milliseconds during which the entire number of bytes is expected
- * to be transferred via socket for this service.
- */
-static int
-_coreCmdImpl_get_timeout(size_t data_size)
-{
- // Min 2 seconds + 10 millisec for each transferring byte.
- // TODO: Come up with a better arithmetics here.
- return 2000 + data_size * 10;
-}
-
-/* Sends command response back to the UI.
- * Param:
- * corecmd - CoreCmdImpl instance to use to send the response.
- * resp - Response header.
- * resp_data - Response data. Data size is defined by the header.
- * Return:
- * 0 on success, or < 0 on failure.
- */
-static int
-_coreCmdImpl_respond(CoreCmdImpl* corecmd, UICmdRespHeader* resp, void* resp_data)
-{
- int status = syncsocket_start_write(corecmd->sync_writer);
- if (!status) {
- // Write the header
- status = syncsocket_write(corecmd->sync_writer, resp,
- sizeof(UICmdRespHeader),
- _coreCmdImpl_get_timeout(sizeof(UICmdRespHeader)));
- // Write response data (if any).
- if (status > 0 && resp_data != NULL && resp->resp_data_size != 0) {
- status = syncsocket_write(corecmd->sync_writer, resp_data,
- resp->resp_data_size,
- _coreCmdImpl_get_timeout(resp->resp_data_size));
- }
- status = syncsocket_result(status);
- syncsocket_stop_write(corecmd->sync_writer);
- }
- if (status < 0) {
- derror("Core is unable to respond with %u bytes to the UI control command: %s\n",
- resp->resp_data_size, errno_str);
- }
- return status;
-}
-
-/* Handles UI control command received from the UI.
- * Param:
- * corecmd - CoreCmdImpl instance that received the command.
- * cmd_header - Command header.
- * cmd_param - Command data.
- */
-static void
-_coreCmdImpl_handle_command(CoreCmdImpl* corecmd,
- const UICmdHeader* cmd_header,
- const uint8_t* cmd_param)
-{
- switch (cmd_header->cmd_type) {
- case AUICMD_SET_COARSE_ORIENTATION:
- {
- UICmdSetCoarseOrientation* cmd =
- (UICmdSetCoarseOrientation*)cmd_param;
- android_sensors_set_coarse_orientation(cmd->orient);
- break;
- }
-
- case AUICMD_TOGGLE_NETWORK:
- qemu_net_disable = !qemu_net_disable;
- if (android_modem) {
- amodem_set_data_registration(
- android_modem,
- qemu_net_disable ? A_REGISTRATION_UNREGISTERED
- : A_REGISTRATION_HOME);
- }
- break;
-
- case AUICMD_TRACE_CONTROL:
- {
- UICmdTraceControl* cmd = (UICmdTraceControl*)cmd_param;
- if (cmd->start) {
- start_tracing();
- } else {
- stop_tracing();
- }
- break;
- }
-
- case AUICMD_CHK_NETWORK_DISABLED:
- {
- UICmdRespHeader resp;
- resp.resp_data_size = 0;
- resp.result = qemu_net_disable;
- _coreCmdImpl_respond(corecmd, &resp, NULL);
- break;
- }
-
- case AUICMD_GET_NETSPEED:
- {
- UICmdRespHeader resp;
- UICmdGetNetSpeedResp* resp_data = NULL;
- UICmdGetNetSpeed* cmd = (UICmdGetNetSpeed*)cmd_param;
-
- resp.resp_data_size = 0;
- resp.result = 0;
-
- if (cmd->index >= android_netspeeds_count ||
- android_netspeeds[cmd->index].name == NULL) {
- resp.result = -1;
- } else {
- const NetworkSpeed* netspeed = &android_netspeeds[cmd->index];
- // Calculate size of the response data:
- // fixed header + zero-terminated netspeed name.
- resp.resp_data_size = sizeof(UICmdGetNetSpeedResp) +
- strlen(netspeed->name) + 1;
- // Count in zero-terminated netspeed display.
- if (netspeed->display != NULL) {
- resp.resp_data_size += strlen(netspeed->display) + 1;
- } else {
- resp.resp_data_size++;
- }
- // Allocate and initialize response data buffer.
- resp_data =
- (UICmdGetNetSpeedResp*)g_malloc(resp.resp_data_size);
- resp_data->upload = netspeed->upload;
- resp_data->download = netspeed->download;
- strcpy(resp_data->name, netspeed->name);
- if (netspeed->display != NULL) {
- strcpy(resp_data->name + strlen(resp_data->name) + 1,
- netspeed->display);
- } else {
- strcpy(resp_data->name + strlen(resp_data->name) + 1, "");
- }
- }
- _coreCmdImpl_respond(corecmd, &resp, resp_data);
- if (resp_data != NULL) {
- g_free(resp_data);
- }
- break;
- }
-
- case AUICMD_GET_NETDELAY:
- {
- UICmdRespHeader resp;
- UICmdGetNetDelayResp* resp_data = NULL;
- UICmdGetNetDelay* cmd = (UICmdGetNetDelay*)cmd_param;
-
- resp.resp_data_size = 0;
- resp.result = 0;
-
- if (cmd->index >= android_netdelays_count ||
- android_netdelays[cmd->index].name == NULL) {
- resp.result = -1;
- } else {
- const NetworkLatency* netdelay = &android_netdelays[cmd->index];
- // Calculate size of the response data:
- // fixed header + zero-terminated netdelay name.
- resp.resp_data_size = sizeof(UICmdGetNetDelayResp) +
- strlen(netdelay->name) + 1;
- // Count in zero-terminated netdelay display.
- if (netdelay->display != NULL) {
- resp.resp_data_size += strlen(netdelay->display) + 1;
- } else {
- resp.resp_data_size++;
- }
- // Allocate and initialize response data buffer.
- resp_data =
- (UICmdGetNetDelayResp*)g_malloc(resp.resp_data_size);
- resp_data->min_ms = netdelay->min_ms;
- resp_data->max_ms = netdelay->max_ms;
- strcpy(resp_data->name, netdelay->name);
- if (netdelay->display != NULL) {
- strcpy(resp_data->name + strlen(resp_data->name) + 1,
- netdelay->display);
- } else {
- strcpy(resp_data->name + strlen(resp_data->name) + 1, "");
- }
- }
- _coreCmdImpl_respond(corecmd, &resp, resp_data);
- if (resp_data != NULL) {
- g_free(resp_data);
- }
- break;
- }
-
- case AUICMD_GET_QEMU_PATH:
- {
- UICmdRespHeader resp;
- UICmdGetQemuPath* cmd = (UICmdGetQemuPath*)cmd_param;
- char* filepath = NULL;
-
- resp.resp_data_size = 0;
- resp.result = -1;
- filepath = qemu_find_file(cmd->type, cmd->filename);
- if (filepath != NULL) {
- resp.resp_data_size = strlen(filepath) + 1;
- }
- _coreCmdImpl_respond(corecmd, &resp, filepath);
- if (filepath != NULL) {
- g_free(filepath);
- }
- break;
- }
-
- case AUICMD_GET_LCD_DENSITY:
- {
- UICmdRespHeader resp;
- resp.resp_data_size = 0;
- resp.result = android_hw->hw_lcd_density;
- _coreCmdImpl_respond(corecmd, &resp, NULL);
- break;
- }
-
- default:
- derror("Unknown UI control command %d is received by the Core.\n",
- cmd_header->cmd_type);
- break;
- }
-}
-
-/* Asynchronous I/O callback reading UI control commands.
- * Param:
- * opaque - CoreCmdImpl instance.
- * events - Lists I/O event (read or write) this callback is called for.
- */
-static void
-_coreCmdImpl_io_func(void* opaque, int fd, unsigned events)
-{
- AsyncStatus status;
- CoreCmdImpl* corecmd;
-
- if (events & LOOP_IO_WRITE) {
- // We don't use async writer here, so we don't expect
- // any write callbacks.
- derror("Unexpected LOOP_IO_WRITE in _coreCmdImpl_io_func\n");
- return;
- }
-
- corecmd = (CoreCmdImpl*)opaque;
-
- // Read whatever is expected from the socket.
- status = asyncReader_read(&corecmd->async_reader);
- switch (status) {
- case ASYNC_COMPLETE:
- switch (corecmd->cmd_state) {
- case EXPECTS_HEADER:
- // We just read the command header. Now we expect the param.
- if (corecmd->cmd_header.cmd_param_size != 0) {
- corecmd->cmd_state = EXPECTS_PARAMETERS;
- // Setup the reader to read expected amount of data.
- _alloc_cmd_param_buf(corecmd,
- corecmd->cmd_header.cmd_param_size);
- asyncReader_init(&corecmd->async_reader,
- corecmd->cmd_param_buf,
- corecmd->cmd_header.cmd_param_size,
- &corecmd->io);
- } else {
- // Command doesn't have param. Go ahead and handle it.
- _coreCmdImpl_handle_command(corecmd, &corecmd->cmd_header,
- NULL);
- // Prepare for the next header.
- corecmd->cmd_state = EXPECTS_HEADER;
- asyncReader_init(&corecmd->async_reader,
- &corecmd->cmd_header,
- sizeof(corecmd->cmd_header),
- &corecmd->io);
- }
- break;
-
- case EXPECTS_PARAMETERS:
- // Entore command is received. Handle it.
- _coreCmdImpl_handle_command(corecmd, &corecmd->cmd_header,
- corecmd->cmd_param_buf);
- _free_cmd_param_buf(corecmd);
- // Prepare for the next command.
- corecmd->cmd_state = EXPECTS_HEADER;
- asyncReader_init(&corecmd->async_reader, &corecmd->cmd_header,
- sizeof(corecmd->cmd_header), &corecmd->io);
- break;
- }
- break;
-
- case ASYNC_ERROR:
- loopIo_dontWantRead(&corecmd->io);
- if (errno == ECONNRESET) {
- // UI has exited. We need to destroy the service.
- destroy_corecmd_client();
- }
- break;
-
- case ASYNC_NEED_MORE:
- // Transfer will eventually come back into this routine.
- return;
- }
-}
-
-int
-coreCmdImpl_create(int fd)
-{
- _coreCmdImpl.sock = fd;
- _coreCmdImpl.looper = looper_newCore();
- loopIo_init(&_coreCmdImpl.io, _coreCmdImpl.looper, _coreCmdImpl.sock,
- _coreCmdImpl_io_func, &_coreCmdImpl);
- _coreCmdImpl.cmd_state = EXPECTS_HEADER;
- _coreCmdImpl.cmd_param_buf = &_coreCmdImpl.cmd_param[0];
- asyncReader_init(&_coreCmdImpl.async_reader, &_coreCmdImpl.cmd_header,
- sizeof(_coreCmdImpl.cmd_header), &_coreCmdImpl.io);
- _coreCmdImpl.sync_writer = syncsocket_init(fd);
- if (_coreCmdImpl.sync_writer == NULL) {
- derror("Unable to create writer for CoreCmdImpl instance: %s\n",
- errno_str);
- coreCmdImpl_destroy();
- return -1;
- }
- return 0;
-}
-
-void
-coreCmdImpl_destroy()
-{
- // Destroy the writer
- if (_coreCmdImpl.sync_writer != NULL) {
- syncsocket_close(_coreCmdImpl.sync_writer);
- syncsocket_free(_coreCmdImpl.sync_writer);
- }
- if (_coreCmdImpl.looper != NULL) {
- // Stop all I/O that may still be going on.
- loopIo_done(&_coreCmdImpl.io);
- looper_free(_coreCmdImpl.looper);
- _coreCmdImpl.looper = NULL;
- }
- // Free allocated memory.
- _free_cmd_param_buf(&_coreCmdImpl);
-}
diff --git a/android/protocol/core-commands-impl.h b/android/protocol/core-commands-impl.h
deleted file mode 100644
index 8690613d61..0000000000
--- a/android/protocol/core-commands-impl.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_CORE_COMMANDS_IMPL_H
-#define _ANDROID_PROTOCOL_CORE_COMMANDS_IMPL_H
-
-/*
- * Contains the Core-side implementation of the "ui-core-control" service that is
- * part of the UI control protocol. Here we handle UI control commands sent by
- * the UI to the Core.
- */
-
-/* Creates and initializes descriptor for the Core-side of the "ui-core-control"
- * service. Note that there can be only one instance of this service in the core.
- * Param:
- * fd - Socket descriptor for the service.
- * Return:
- * 0 on success, or < 0 on failure.
- */
-extern int coreCmdImpl_create(int fd);
-
-/* Destroys the descriptor for the Core-side of the "ui-core-control" service. */
-extern void coreCmdImpl_destroy();
-
-#endif /* _ANDROID_PROTOCOL_CORE_COMMANDS_IMPL_H */
diff --git a/android/protocol/core-commands-proxy.c b/android/protocol/core-commands-proxy.c
deleted file mode 100644
index 34499520c6..0000000000
--- a/android/protocol/core-commands-proxy.c
+++ /dev/null
@@ -1,376 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the UI-side implementation of the "ui-core-control" service that is
- * part of the UI control protocol. Here we send UI control commands to the Core.
- */
-
-#include "ui/console.h"
-#include "android/looper.h"
-#include "android/async-utils.h"
-#include "android/sync-utils.h"
-#include "android/utils/debug.h"
-#include "android/utils/panic.h"
-#include "android/protocol/core-connection.h"
-#include "android/protocol/core-commands.h"
-#include "android/protocol/core-commands-proxy.h"
-#include "android/protocol/core-commands-api.h"
-
-/* Descriptor for the UI-side "ui-core-control" service. */
-typedef struct CoreCmdProxy {
- /* Core connection established for this service. */
- CoreConnection* core_connection;
-
- /* Socket descriptor for the UI service. */
- int sock;
-
- /* Socket wrapper for sync srites. */
- SyncSocket* sync_writer;
-
- /* Socket wrapper for sync reads. */
- SyncSocket* sync_reader;
-} CoreCmdProxy;
-
-/* One and only one CoreCmdProxy instance. */
-static CoreCmdProxy _coreCmdProxy = { 0 };
-
-/* Sends UI command to the core.
- * Param:
- * cmd_type, cmd_param, cmd_param_size - Define the command.
- * Return:
- * 0 On success, or < 0 on failure.
- */
-static int
-_coreCmdProxy_send_command(uint8_t cmd_type,
- void* cmd_param,
- uint32_t cmd_param_size)
-{
- int status;
- UICmdHeader header;
-
- // Prepare the command header.
- header.cmd_type = cmd_type;
- header.cmd_param_size = cmd_param_size;
- status = syncsocket_start_write(_coreCmdProxy.sync_writer);
- if (!status) {
- // Send the header.
- status = syncsocket_write(_coreCmdProxy.sync_writer, &header,
- sizeof(header),
- core_connection_get_timeout(sizeof(header)));
- // If there is request data, send it too.
- if (status > 0 && cmd_param != NULL && cmd_param_size > 0) {
- status = syncsocket_write(_coreCmdProxy.sync_writer, cmd_param,
- cmd_param_size,
- core_connection_get_timeout(cmd_param_size));
- }
- status = syncsocket_result(status);
- syncsocket_stop_write(_coreCmdProxy.sync_writer);
- }
- if (status < 0) {
- derror("Unable to send UI control command %d (size %u): %s\n",
- cmd_type, cmd_param_size, errno_str);
- }
- return status;
-}
-
-/* Reads UI control command response from the core.
- * Param:
- * resp - Upon success contains command response header.
- * resp_data - Upon success contains allocated reponse data (if any). The caller
- * is responsible for deallocating the memory returned here.
- * Return:
- * 0 on success, or < 0 on failure.
- */
-static int
-_coreCmdProxy_get_response(UICmdRespHeader* resp, void** resp_data)
-{
- int status = syncsocket_start_read(_coreCmdProxy.sync_reader);
- if (!status) {
- // Read the header.
- status = syncsocket_read(_coreCmdProxy.sync_reader, resp,
- sizeof(UICmdRespHeader),
- core_connection_get_timeout(sizeof(UICmdRespHeader)));
- // Read response data (if any).
- if (status > 0 && resp->resp_data_size) {
- *resp_data = malloc(resp->resp_data_size);
- if (*resp_data == NULL) {
- APANIC("_coreCmdProxy_get_response is unable to allocate response data buffer.\n");
- }
- status = syncsocket_read(_coreCmdProxy.sync_reader, *resp_data,
- resp->resp_data_size,
- core_connection_get_timeout(resp->resp_data_size));
- }
- status = syncsocket_result(status);
- syncsocket_stop_read(_coreCmdProxy.sync_reader);
- }
- if (status < 0) {
- derror("Unable to get UI command response from the Core: %s\n",
- errno_str);
- }
- return status;
-}
-
-int
-corecmd_set_coarse_orientation(AndroidCoarseOrientation orient)
-{
- UICmdSetCoarseOrientation cmd;
- cmd.orient = orient;
- return _coreCmdProxy_send_command(AUICMD_SET_COARSE_ORIENTATION,
- &cmd, sizeof(cmd));
-}
-
-int
-corecmd_toggle_network()
-{
- return _coreCmdProxy_send_command(AUICMD_TOGGLE_NETWORK, NULL, 0);
-}
-
-int
-corecmd_trace_control(int start)
-{
- UICmdTraceControl cmd;
- cmd.start = start;
- return _coreCmdProxy_send_command(AUICMD_TRACE_CONTROL,
- &cmd, sizeof(cmd));
-}
-
-int
-corecmd_is_network_disabled()
-{
- UICmdRespHeader resp;
- void* tmp = NULL;
- int status;
-
- status = _coreCmdProxy_send_command(AUICMD_CHK_NETWORK_DISABLED, NULL, 0);
- if (status < 0) {
- return status;
- }
- status = _coreCmdProxy_get_response(&resp, &tmp);
- if (status < 0) {
- return status;
- }
- return resp.result;
-}
-
-int
-corecmd_get_netspeed(int index, NetworkSpeed** netspeed)
-{
- UICmdGetNetSpeed req;
- UICmdRespHeader resp;
- UICmdGetNetSpeedResp* resp_data = NULL;
- int status;
-
- // Initialize and send the query.
- req.index = index;
- status = _coreCmdProxy_send_command(AUICMD_GET_NETSPEED, &req, sizeof(req));
- if (status < 0) {
- return status;
- }
-
- // Obtain the response from the core.
- status = _coreCmdProxy_get_response(&resp, (void**)&resp_data);
- if (status < 0) {
- return status;
- }
- if (!resp.result) {
- NetworkSpeed* ret;
- // Allocate memory for the returning NetworkSpeed instance.
- // It includes: NetworkSpeed structure +
- // size of zero-terminated "name" and "display" strings saved in
- // resp_data.
- *netspeed = malloc(sizeof(NetworkSpeed) + 1 +
- resp.resp_data_size - sizeof(UICmdGetNetSpeedResp));
- ret = *netspeed;
-
- // Copy data obtained from the core to the returning NetworkSpeed
- // instance.
- ret->upload = resp_data->upload;
- ret->download = resp_data->download;
- ret->name = (char*)ret + sizeof(NetworkSpeed);
- strcpy((char*)ret->name, resp_data->name);
- ret->display = ret->name + strlen(ret->name) + 1;
- strcpy((char*)ret->display, resp_data->name + strlen(resp_data->name) + 1);
- }
- if (resp_data != NULL) {
- free(resp_data);
- }
- return resp.result;
-}
-
-int
-corecmd_get_netdelay(int index, NetworkLatency** netdelay)
-{
- UICmdGetNetDelay req;
- UICmdRespHeader resp;
- UICmdGetNetDelayResp* resp_data = NULL;
- int status;
-
- // Initialize and send the query.
- req.index = index;
- status = _coreCmdProxy_send_command(AUICMD_GET_NETDELAY, &req, sizeof(req));
- if (status < 0) {
- return status;
- }
-
- // Obtain the response from the core.
- status = _coreCmdProxy_get_response(&resp, (void**)&resp_data);
- if (status < 0) {
- return status;
- }
- if (!resp.result) {
- NetworkLatency* ret;
- // Allocate memory for the returning NetworkLatency instance.
- // It includes: NetworkLatency structure +
- // size of zero-terminated "name" and "display" strings saved in
- // resp_data.
- *netdelay = malloc(sizeof(NetworkLatency) + 1 +
- resp.resp_data_size - sizeof(UICmdGetNetDelayResp));
- ret = *netdelay;
-
- // Copy data obtained from the core to the returning NetworkLatency
- // instance.
- ret->min_ms = resp_data->min_ms;
- ret->max_ms = resp_data->max_ms;
- ret->name = (char*)ret + sizeof(NetworkLatency);
- strcpy((char*)ret->name, resp_data->name);
- ret->display = ret->name + strlen(ret->name) + 1;
- strcpy((char*)ret->display, resp_data->name + strlen(resp_data->name) + 1);
- }
- if (resp_data != NULL) {
- free(resp_data);
- }
- return resp.result;
-}
-
-int
-corecmd_get_qemu_path(int type,
- const char* filename,
- char* path,
- size_t path_buf_size)
-{
- UICmdRespHeader resp;
- char* resp_data = NULL;
- int status;
-
- // Initialize and send the query.
- uint32_t cmd_data_size = sizeof(UICmdGetQemuPath) + strlen(filename) + 1;
- UICmdGetQemuPath* req = (UICmdGetQemuPath*)malloc(cmd_data_size);
- if (req == NULL) {
- APANIC("corecmd_get_qemu_path is unable to allocate %u bytes\n",
- cmd_data_size);
- }
- req->type = type;
- strcpy(req->filename, filename);
- status = _coreCmdProxy_send_command(AUICMD_GET_QEMU_PATH, req,
- cmd_data_size);
- if (status < 0) {
- return status;
- }
-
- // Obtain the response from the core.
- status = _coreCmdProxy_get_response(&resp, (void**)&resp_data);
- if (status < 0) {
- return status;
- }
- if (!resp.result && resp_data != NULL) {
- strncpy(path, resp_data, path_buf_size);
- path[path_buf_size - 1] = '\0';
- }
- if (resp_data != NULL) {
- free(resp_data);
- }
- return resp.result;
-}
-
-int
-corecmd_get_hw_lcd_density(void)
-{
- UICmdRespHeader resp;
- void* tmp = NULL;
- int status;
-
- status = _coreCmdProxy_send_command(AUICMD_GET_LCD_DENSITY, NULL, 0);
- if (status < 0) {
- return status;
- }
- status = _coreCmdProxy_get_response(&resp, &tmp);
- if (status < 0) {
- return status;
- }
- return resp.result;
-}
-
-int
-coreCmdProxy_create(SockAddress* console_socket)
-{
- char* handshake = NULL;
-
- // Connect to the ui-core-control service.
- _coreCmdProxy.core_connection =
- core_connection_create_and_switch(console_socket, "ui-core-control",
- &handshake);
- if (_coreCmdProxy.core_connection == NULL) {
- derror("Unable to connect to the ui-core-control service: %s\n",
- errno_str);
- return -1;
- }
-
- // Initialze command writer and response reader.
- _coreCmdProxy.sock = core_connection_get_socket(_coreCmdProxy.core_connection);
- _coreCmdProxy.sync_writer = syncsocket_init(_coreCmdProxy.sock);
- if (_coreCmdProxy.sync_writer == NULL) {
- derror("Unable to initialize CoreCmdProxy writer: %s\n", errno_str);
- coreCmdProxy_destroy();
- return -1;
- }
- _coreCmdProxy.sync_reader = syncsocket_init(_coreCmdProxy.sock);
- if (_coreCmdProxy.sync_reader == NULL) {
- derror("Unable to initialize CoreCmdProxy reader: %s\n", errno_str);
- coreCmdProxy_destroy();
- return -1;
- }
-
-
- fprintf(stdout, "ui-core-control is now connected to the core at %s.",
- sock_address_to_string(console_socket));
- if (handshake != NULL) {
- if (handshake[0] != '\0') {
- fprintf(stdout, " Handshake: %s", handshake);
- }
- free(handshake);
- }
- fprintf(stdout, "\n");
-
- return 0;
-}
-
-/* Destroys CoreCmdProxy instance. */
-void
-coreCmdProxy_destroy(void)
-{
- if (_coreCmdProxy.sync_writer != NULL) {
- syncsocket_close(_coreCmdProxy.sync_writer);
- syncsocket_free(_coreCmdProxy.sync_writer);
- _coreCmdProxy.sync_writer = NULL;
- }
- if (_coreCmdProxy.sync_reader != NULL) {
- syncsocket_close(_coreCmdProxy.sync_reader);
- syncsocket_free(_coreCmdProxy.sync_reader);
- _coreCmdProxy.sync_reader = NULL;
- }
- if (_coreCmdProxy.core_connection != NULL) {
- core_connection_close(_coreCmdProxy.core_connection);
- core_connection_free(_coreCmdProxy.core_connection);
- _coreCmdProxy.core_connection = NULL;
- }
-}
diff --git a/android/protocol/core-commands-proxy.h b/android/protocol/core-commands-proxy.h
deleted file mode 100644
index 289421f1d8..0000000000
--- a/android/protocol/core-commands-proxy.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_CORE_COMMANDS_PROXY_H
-#define _ANDROID_PROTOCOL_CORE_COMMANDS_PROXY_H
-
-#include "android/sockets.h"
-
-/*
- * Contains the UI-side implementation of the "ui-core-control" service that is
- * part of the UI control protocol. Here we send UI control commands to the Core.
- */
-
-/* Creates and initializes descriptor for the UI-side of the "ui-core-control"
- * service. Note that there can be only one instance of this service in the UI.
- * Param:
- * console_socket - Addresses Core's console.
- * Return:
- * 0 on success, or < 0 on failure.
- */
-extern int coreCmdProxy_create(SockAddress* console_socket);
-
-/* Destroys the UI-side of the "ui-core-control" */
-void coreCmdProxy_destroy(void);
-
-#endif /* _ANDROID_PROTOCOL_CORE_COMMANDS_PROXY_H */
diff --git a/android/protocol/core-commands-qemu.c b/android/protocol/core-commands-qemu.c
deleted file mode 100644
index d26840c641..0000000000
--- a/android/protocol/core-commands-qemu.c
+++ /dev/null
@@ -1,102 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains implementation of the API for calling into the Core with the UI
- * control commands for standalone (monolithic) emulator.
- */
-
-#include "android/android.h"
-#include "android/globals.h"
-#include "android/hw-sensors.h"
-#include "telephony/modem_driver.h"
-#include "audio/audio.h"
-#include "android/protocol/core-commands-api.h"
-
-/* Implemented in vl-android.c */
-extern char* qemu_find_file(int type, const char* filename);
-
-int
-corecmd_set_coarse_orientation(AndroidCoarseOrientation orient)
-{
- android_sensors_set_coarse_orientation(orient);
- return 0;
-}
-
-int
-corecmd_toggle_network()
-{
- qemu_net_disable = !qemu_net_disable;
- if (android_modem) {
- amodem_set_data_registration(
- android_modem,
- qemu_net_disable ? A_REGISTRATION_UNREGISTERED
- : A_REGISTRATION_HOME);
- }
- return 0;
-}
-
-int corecmd_trace_control(int start)
-{
- return 0;
-}
-
-int corecmd_is_network_disabled()
-{
- return qemu_net_disable;
-}
-
-int
-corecmd_get_netspeed(int index, NetworkSpeed** netspeed)
-{
- if (index >= android_netspeeds_count ||
- android_netspeeds[index].name == NULL) {
- return -1;
- }
- *netspeed = (NetworkSpeed*)malloc(sizeof(NetworkSpeed));
- memcpy(*netspeed, &android_netspeeds[index], sizeof(NetworkSpeed));
- return 0;
-}
-
-int
-corecmd_get_netdelay(int index, NetworkLatency** netdelay)
-{
- if (index >= android_netdelays_count ||
- android_netdelays[index].name == NULL) {
- return -1;
- }
- *netdelay = (NetworkLatency*)malloc(sizeof(NetworkLatency));
- memcpy(*netdelay, &android_netdelays[index], sizeof(NetworkLatency));
- return 0;
-}
-
-int
-corecmd_get_qemu_path(int type,
- const char* filename,
- char* path,
- size_t path_buf_size)
-{
- char* filepath = qemu_find_file(type, filename);
- if (filepath == NULL) {
- return -1;
- }
- strncpy(path, filepath, path_buf_size);
- path[path_buf_size - 1] = '\0';
- g_free(filepath);
- return 0;
-}
-
-int
-corecmd_get_hw_lcd_density(void)
-{
- return android_hw->hw_lcd_density;
-}
diff --git a/android/protocol/core-commands.h b/android/protocol/core-commands.h
deleted file mode 100644
index 3ac0ca5d34..0000000000
--- a/android/protocol/core-commands.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_CORE_COMMANDS_H
-#define _ANDROID_PROTOCOL_CORE_COMMANDS_H
-
-/*
- * Contains declarations related to the UI control commands sent by the UI and
- * handled by the Core.
- */
-
-#include "android/hw-sensors.h"
-#include "android/protocol/ui-common.h"
-
-/* Sets coarse orientation. */
-#define AUICMD_SET_COARSE_ORIENTATION 1
-
-/* Toggles the network. */
-#define AUICMD_TOGGLE_NETWORK 2
-
-/* Starts / stops the tracing. */
-#define AUICMD_TRACE_CONTROL 3
-
-/* Checks if network is disabled. */
-#define AUICMD_CHK_NETWORK_DISABLED 4
-
-/* Gets network speed. */
-#define AUICMD_GET_NETSPEED 5
-
-/* Gets network delays */
-#define AUICMD_GET_NETDELAY 6
-
-/* Gets path to a QEMU file on local host. */
-#define AUICMD_GET_QEMU_PATH 7
-
-/* Gets LCD density. */
-#define AUICMD_GET_LCD_DENSITY 8
-
-/* Formats AUICMD_SET_COARSE_ORIENTATION UI control command parameters. */
-typedef struct UICmdSetCoarseOrientation {
- AndroidCoarseOrientation orient;
-} UICmdSetCoarseOrientation;
-
-/* Formats AUICMD_TRACE_CONTROL UI control command parameters. */
-typedef struct UICmdTraceControl {
- int start;
-} UICmdTraceControl;
-
-/* Formats AUICMD_GET_NETSPEED UI control command parameters. */
-typedef struct UICmdGetNetSpeed {
- int index;
-} UICmdGetNetSpeed;
-
-/* Formats AUICMD_GET_NETSPEED UI control command response.
- * Instances of this structure contains content of the NetworkSpeed structure,
- * including actual "name" and "display" strings. */
-typedef struct UICmdGetNetSpeedResp {
- int upload;
- int download;
- /* Zero-terminated NetworkSpeed's "name" strings starts here. The "display"
- * string begins inside this structure, right after the "name"'s
- * zero-terminator. */
- char name[0];
-} UICmdGetNetSpeedResp;
-
-/* Formats AUICMD_GET_NETDELAY UI control command parameters. */
-typedef struct UICmdGetNetDelay {
- int index;
-} UICmdGetNetDelay;
-
-/* Formats AUICMD_GET_NETDELAY UI control command response.
- * Instances of this structure contains content of the NetworkLatency structure,
- * including actual "name" and "display" strings. */
-typedef struct UICmdGetNetDelayResp {
- int min_ms;
- int max_ms;
- /* Zero-terminated NetworkLatency's "name" strings starts here. The "display"
- * string begins inside this structure, right after the "name"'s
- * zero-terminator. */
- char name[0];
-} UICmdGetNetDelayResp;
-
-/* Formats AUICMD_GET_QEMU_PATH UI control command parameters. */
-typedef struct UICmdGetQemuPath {
- int type;
- char filename[0];
-} UICmdGetQemuPath;
-
-/* Formats AUICMD_GET_QEMU_PATH UI control command response. */
-typedef struct UICmdGetQemuPathResp {
- /* Queried qemu path begins here. */
- char path[0];
-} UICmdGetQemuPathResp;
-
-#endif /* _ANDROID_PROTOCOL_CORE_COMMANDS_H */
diff --git a/android/protocol/core-connection.c b/android/protocol/core-connection.c
deleted file mode 100644
index 68831d44ea..0000000000
--- a/android/protocol/core-connection.c
+++ /dev/null
@@ -1,363 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-#include <unistd.h>
-
-#include "android/sockets.h"
-#include "qemu-common.h"
-#include "errno.h"
-#include "android/iolooper.h"
-#include "android/android.h"
-#include "android/utils/debug.h"
-#include "android/globals.h"
-#include "android/utils/system.h"
-#include "android/protocol/core-connection.h"
-
-/* Descriptor for a client, connected to the core via console port. */
-struct CoreConnection {
- /* Socket address of the console. */
- SockAddress console_address;
-
- // Helper for performing sync I/O on the console socket.
- SyncSocket* ssocket;
-
- /* Stream name. Can be:
- * - NULL for the console itself.
- * - "attach-UI" for the attached UI client.
- */
- char* stream_name;
-};
-
-/*
- * Zero-terminates string buffer.
- * Param:
- * buf - Buffer containing the string.
- * buf_size - Buffer size.
- * eos - String size.
- */
-static inline void
-_zero_terminate(char* buf, size_t buf_size, size_t eos)
-{
- if (eos < buf_size) {
- buf[eos] = '\0';
- } else {
- buf[buf_size - 1] = '\0';
- }
-}
-
-/*
- * Checks if console has replied with "OK"
- * Param:
- * reply - String containing console's reply
- * Return:
- * boolean: true if reply was "OK", or false otherwise.
- */
-static int
-_is_reply_ok(const char* reply, int reply_size)
-{
- return (reply_size < 2) ? 0 : (reply[0] == 'O' && reply[1] == 'K');
-}
-
-/*
- * Checks if console has replied with "KO"
- * Param:
- * reply - String containing console's reply
- * Return:
- * boolean: true if reply was "KO", or false otherwise.
- */
-static int
-_is_reply_ko(const char* reply, int reply_size)
-{
- return (reply_size < 2) ? 0 : (reply[0] == 'K' && reply[1] == 'O');
-}
-
-SyncSocket*
-core_connection_open_socket(SockAddress* sockaddr)
-{
- SyncSocket* ssocket;
- int status;
- int64_t deadline;
- char buf[512];
-
- int fd = socket_create(sock_address_get_family(sockaddr), SOCKET_STREAM);
- if (fd < 0) {
- return NULL;
- }
-
- socket_set_xreuseaddr(fd);
-
- // Create sync connection to the console.
- ssocket = syncsocket_connect(fd, sockaddr, CORE_PORT_TIMEOUT_MS);
- if (ssocket == NULL) {
- derror("syncsocket_connect has failed: %s\n", errno_str);
- socket_close(fd);
- return NULL;
- }
-
- // Upon successful connection the console will reply with two strings:
- // "Android Console....", and "OK\r\n". Read them and check.
- status = syncsocket_start_read(ssocket);
- if (status < 0) {
- derror("syncsocket_start_read has failed: %s\n", errno_str);
- syncsocket_free(ssocket);
- return NULL;
- }
-
- deadline = iolooper_now() + CORE_PORT_TIMEOUT_MS;
- // Read first line.
- status = syncsocket_read_line_absolute(ssocket, buf, sizeof(buf), deadline);
- if (status <= 0) {
- derror("syncsocket_read_line_absolute has failed: %s\n", errno_str);
- syncsocket_free(ssocket);
- return NULL;
- }
- if (status < 15 || memcmp(buf, "Android Console", 15)) {
- _zero_terminate(buf, sizeof(buf), status);
- derror("console has failed the connection: %s\n", buf);
- syncsocket_free(ssocket);
- return NULL;
- }
- // Read second line
- status = syncsocket_read_line_absolute(ssocket, buf, sizeof(buf), deadline);
- syncsocket_stop_read(ssocket);
- if (status < 2 || !_is_reply_ok(buf, status)) {
- _zero_terminate(buf, sizeof(buf), status);
- derror("unexpected reply from the console: %s\n", buf);
- syncsocket_free(ssocket);
- return NULL;
- }
-
- return ssocket;
-}
-
-CoreConnection*
-core_connection_create(SockAddress* console_address)
-{
- CoreConnection* desc;
- ANEW0(desc);
- desc->console_address = console_address[0];
- desc->ssocket = NULL;
- desc->stream_name = NULL;
-
- return desc;
-}
-
-void
-core_connection_free(CoreConnection* desc)
-{
- if (desc == NULL) {
- return;
- }
- if (desc->ssocket != NULL) {
- syncsocket_free(desc->ssocket);
- }
- if (desc->stream_name != NULL) {
- free(desc->stream_name);
- }
- free(desc);
-}
-
-int
-core_connection_open(CoreConnection* desc)
-{
- if (desc == NULL) {
- errno = EINVAL;
- return -1;
- }
- if (desc->ssocket != NULL) {
- return 0;
- }
-
- desc->ssocket = core_connection_open_socket(&desc->console_address);
-
- return (desc->ssocket != NULL) ? 0 : -1;
-}
-
-void
-core_connection_close(CoreConnection* desc)
-{
- if (desc == NULL) {
- return;
- }
- if (desc->ssocket != NULL) {
- syncsocket_close(desc->ssocket);
- }
-}
-
-int
-core_connection_write(CoreConnection* desc,
- const void* buffer,
- size_t to_write,
- size_t* written_bytes)
-{
- ssize_t written;
-
- int status = syncsocket_start_write(desc->ssocket);
- if (status < 0) {
- derror("syncsocket_start_write failed: %s\n", errno_str);
- return status;
- }
-
- written =
- syncsocket_write(desc->ssocket, buffer, to_write, CORE_PORT_TIMEOUT_MS);
- syncsocket_stop_write(desc->ssocket);
- if (written <= 0) {
- derror("syncsocket_write failed: %s\n", errno_str);
- return -1;
- }
- if (written_bytes != NULL) {
- *written_bytes = written;
- }
-
- return 0;
-}
-
-int
-core_connection_read(CoreConnection* desc,
- void* buffer,
- size_t to_read,
- size_t* read_bytes)
-{
- ssize_t read_size;
-
- int status = syncsocket_start_read(desc->ssocket);
- if (status < 0) {
- derror("syncsocket_start_read failed: %s\n", errno_str);
- return status;
- }
-
- read_size =
- syncsocket_read(desc->ssocket, buffer, to_read, CORE_PORT_TIMEOUT_MS);
- syncsocket_stop_read(desc->ssocket);
- if (read_size <= 0) {
- derror("syncsocket_read failed: %s\n", errno_str);
- return -1;
- }
-
- if (read_bytes != NULL) {
- *read_bytes = read_size;
- }
- return 0;
-}
-
-int
-core_connection_switch_stream(CoreConnection* desc,
- const char* stream_name,
- char** handshake)
-{
- char buf[4096];
- int handshake_len;
- int status;
- int64_t deadline;
-
- *handshake = NULL;
- if (desc == NULL || desc->stream_name != NULL || stream_name == NULL) {
- errno = EINVAL;
- return -1;
- }
-
- // Prepare and write "switch" command.
- snprintf(buf, sizeof(buf), "qemu %s\r\n", stream_name);
- if (core_connection_write(desc, buf, strlen(buf), NULL)) {
- return -1;
- }
-
- // Read result / handshake
- status = syncsocket_start_read(desc->ssocket);
- if (status < 0) {
- return -1;
- }
- deadline = iolooper_now() + CORE_PORT_TIMEOUT_MS;
- handshake_len =
- syncsocket_read_line_absolute(desc->ssocket, buf, sizeof(buf), deadline);
- _zero_terminate(buf, sizeof(buf), handshake_len);
- // Replace terminating "\r\n" with 0
- if (handshake_len >= 1) {
- if (buf[handshake_len - 1] == '\r' || buf[handshake_len - 1] == '\n') {
- buf[handshake_len - 1] = '\0';
- if (handshake_len >= 2 && (buf[handshake_len - 2] == '\r' ||
- buf[handshake_len - 2] == '\n')) {
- buf[handshake_len - 2] = '\0';
- }
- }
- }
- // Lets see what kind of response we've got here.
- if (_is_reply_ok(buf, handshake_len)) {
- *handshake = strdup(buf + 3);
- desc->stream_name = strdup(stream_name);
- // We expect an "OK" string here
- status = syncsocket_read_line_absolute(desc->ssocket, buf, sizeof(buf),
- deadline);
- syncsocket_stop_read(desc->ssocket);
- if (status < 0) {
- derror("error reading console reply on stream switch: %s\n", errno_str);
- return -1;
- } else if (!_is_reply_ok(buf, status)) {
- _zero_terminate(buf, sizeof(buf), status);
- derror("unexpected console reply when switching streams: %s\n", buf);
- return -1;
- }
- return 0;
- } else if (_is_reply_ko(buf, handshake_len)) {
- derror("console has rejected stream switch: %s\n", buf);
- syncsocket_stop_read(desc->ssocket);
- *handshake = strdup(buf + 3);
- return -1;
- } else {
- // No OK, no KO? Should be an error!
- derror("unexpected console reply when switching streams: %s\n", buf);
- syncsocket_stop_read(desc->ssocket);
- *handshake = strdup(buf);
- return -1;
- }
-}
-
-CoreConnection*
-core_connection_create_and_switch(SockAddress* console_socket,
- const char* stream_name,
- char** handshake)
-{
- char switch_cmd[256];
- CoreConnection* connection = NULL;
-
- // Connect to the console service.
- connection = core_connection_create(console_socket);
- if (connection == NULL) {
- return NULL;
- }
- if (core_connection_open(connection)) {
- core_connection_free(connection);
- return NULL;
- }
-
- // Perform the switch.
- snprintf(switch_cmd, sizeof(switch_cmd), "%s", stream_name);
- if (core_connection_switch_stream(connection, switch_cmd, handshake)) {
- core_connection_close(connection);
- core_connection_free(connection);
- return NULL;
- }
-
- return connection;
-}
-
-void
-core_connection_detach(CoreConnection* desc)
-{
- core_connection_write(desc, "\n", 1, NULL);
-}
-
-int
-core_connection_get_socket(CoreConnection* desc)
-{
- return (desc != NULL) ? syncsocket_get_socket(desc->ssocket) : -1;
-}
diff --git a/android/protocol/core-connection.h b/android/protocol/core-connection.h
deleted file mode 100644
index 5701f8ca50..0000000000
--- a/android/protocol/core-connection.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-/*
- * This file contains declaration related to communication between emulator's
- * UI and core through a console port.
- */
-
-#ifndef QEMU_ANDROID_CORE_CONNECTION_H
-#define QEMU_ANDROID_CORE_CONNECTION_H
-
-#include "android/sync-utils.h"
-
-// Opaque CoreConnection structure.
-typedef struct CoreConnection CoreConnection;
-
-// Base console port
-#define CORE_BASE_PORT 5554
-
-// Maximum number of core porocesses running simultaneously on a machine.
-#define MAX_CORE_PROCS 16
-
-// Socket timeout in millisec (set to 5 seconds)
-#define CORE_PORT_TIMEOUT_MS 5000
-
-/* Opens core console socket.
- * Param:
- * sockaddr Socket address to the core console.
- * Return:
- * Sync socket descriptor on success, or -1 on failure, with errno appropriately
- * set.
- */
-SyncSocket* core_connection_open_socket(SockAddress* sockaddr);
-
-/* Creates descriptor for a console client.
- * Param:
- * console_socket Socket address for the console.
- * Return:
- * Allocated and initialized descriptor for the client on success, or NULL
- * on failure.
- */
-CoreConnection* core_connection_create(SockAddress* console_socket);
-
-/* Frees descriptor allocated with core_connection_create.
- * Param:
- * desc Descriptor to free. Note that this routine will simply free the memory
- * used by the descriptor.
- */
-void core_connection_free(CoreConnection* desc);
-
-/* Opens a socket handle to the console.
- * Param:
- * desc Console client descriptor. Note that if the descriptor has been already
- * opened, this routine will simply return with success.
- * Return:
- * 0 on success, or -1 on failure with errno properly set. This routine will
- * return in at most one second.
- */
-int core_connection_open(CoreConnection* desc);
-
-/* Closes a socket handle to the console opened with core_connection_open.
- * Param:
- * desc Console client descriptor opened with core_connection_open.
- */
-void core_connection_close(CoreConnection* desc);
-
-/* Synchronously writes to the console. See CORE_PORT_TIMEOUT_MS for the timeout
- * value used to wait for the write operation to complete.
- * Param:
- * desc Console client descriptor opened with core_connection_open.
- * buffer Buffer to write.
- * to_write Number of bytes to write.
- * written_bytes Upon success, contains number of bytes written. This parameter
- * is optional, and can be NULL.
- * Return:
- * 0 on success, or -1 on failure.
- */
-int core_connection_write(CoreConnection* desc,
- const void* buffer,
- size_t to_write,
- size_t* written_bytes);
-
-/* Synchronously reads from the console. See CORE_PORT_TIMEOUT_MS for the
- * timeout value used to wait for the read operation to complete.
- * Param:
- * desc Console client descriptor opened with core_connection_open.
- * buffer Buffer to read data to.
- * to_read Number of bytes to read.
- * read_bytes Upon success, contains number of bytes that have been actually
- * read. This parameter is optional, and can be NULL.
- * Return:
- * 0 on success, or -1 on failure.
- */
-int core_connection_read(CoreConnection* desc,
- void* buffer,
- size_t to_read,
- size_t* read_bytes);
-
-/* Switches opened console client to a given stream.
- * Param:
- * desc Console client descriptor opened with core_connection_open. Note
- * that this descriptor should represent console itself. In other words,
- * there must have been no previous calls to this routine for that
- * descriptor.
- * stream_name Name of the stream to switch to.
- * handshake Address of a string to allocate for a handshake message on
- * success, or an error message on failure. If upon return from this
- * routine that string is not NULL, its buffer must be freed with 'free'.
- * Return:
- * 0 on success, or -1 on failure.
- */
-int core_connection_switch_stream(CoreConnection* desc,
- const char* stream_name,
- char** handshake);
-
-/* Creates a console client, and switches it to a given stream.
- * console_socket Socket address for the console.
- * stream_name Name of the stream to switch to.
- * handshake Address of a string to allocate for a handshake message on
- * success, or an error message on failure. If upon return from this
- * routine that string is not NULL, its buffer must be freed with 'free'.
- * Return:
- * Allocated and initialized descriptor for the switched client on success, or
- * NULL on failure.
- */
-CoreConnection* core_connection_create_and_switch(SockAddress* console_socket,
- const char* stream_name,
- char** handshake);
-
-/* Detaches opened console client from the console.
- * By console protocol, writing "\r\n" string to the console will destroy the
- * console client.
- * Param:
- * desc Console client descriptor opened with core_connection_open.
- */
-void core_connection_detach(CoreConnection* desc);
-
-/* Gets socket descriptor associated with the core connection.
- * Param:
- * desc Console client descriptor opened with core_connection_open.
- * Return
- * Socket descriptor associated with the core connection.
- */
-int core_connection_get_socket(CoreConnection* desc);
-
-/* Calculates timeout for transferring the given number of bytes via core
- * connection.
- * Return:
- * Number of milliseconds during which the entire number of bytes is expected
- * to be transferred via core connection.
- */
-static inline int
-core_connection_get_timeout(size_t data_size)
-{
- // Min 2 seconds + 10 millisec for each transferring byte.
- // TODO: Come up with a better arithmetics here.
- return 2000 + data_size * 10;
-}
-
-#endif // QEMU_ANDROID_CORE_CONNECTION_H
diff --git a/android/protocol/fb-updates-impl.c b/android/protocol/fb-updates-impl.c
deleted file mode 100644
index e36c4bfe18..0000000000
--- a/android/protocol/fb-updates-impl.c
+++ /dev/null
@@ -1,271 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains UI-side framebuffer client that receives framebuffer updates
- * from the core.
- */
-
-#include "android/utils/system.h"
-#include "android/utils/debug.h"
-#include "android/utils/eintr_wrapper.h"
-#include "android/utils/panic.h"
-#include "android/sync-utils.h"
-#include "android/protocol/core-connection.h"
-#include "android/protocol/fb-updates.h"
-#include "android/protocol/fb-updates-impl.h"
-
-/*Enumerates states for the client framebuffer update reader. */
-typedef enum FbImplState {
- /* The reader is waiting on update header. */
- EXPECTS_HEADER,
-
- /* The reader is waiting on pixels. */
- EXPECTS_PIXELS,
-} FbImplState;
-
-/* Descriptor for the UI-side implementation of the "framebufer" service.
- */
-typedef struct FrameBufferImpl {
- /* Framebuffer for this client. */
- QFrameBuffer* fb;
-
- /* Core connection instance for the framebuffer client. */
- CoreConnection* core_connection;
-
- /* Current update header. */
- FBUpdateMessage update_header;
-
- /* Reader's buffer. */
- uint8_t* reader_buffer;
-
- /* Offset in the reader's buffer where to read next chunk of data. */
- size_t reader_offset;
-
- /* Total number of bytes the reader expects to read. */
- size_t reader_bytes;
-
- /* Current state of the update reader. */
- FbImplState fb_state;
-
- /* Socket descriptor for the framebuffer client. */
- int sock;
-
- /* Custom i/o handler */
- LoopIo io[1];
-
- /* Number of bits used to encode single pixel. */
- int bits_per_pixel;
-} FrameBufferImpl;
-
-/* One and the only FrameBufferImpl instance. */
-static FrameBufferImpl _fbImpl;
-
-/*
- * Updates a display rectangle.
- * Param
- * fb - Framebuffer where to update the rectangle.
- * x, y, w, and h define rectangle to update.
- * bits_per_pixel define number of bits used to encode a single pixel.
- * pixels contains pixels for the rectangle. Buffer addressed by this parameter
- * must be eventually freed with free()
- */
-static void
-_update_rect(QFrameBuffer* fb, uint16_t x, uint16_t y, uint16_t w, uint16_t h,
- uint8_t bits_per_pixel, uint8_t* pixels)
-{
- if (fb != NULL) {
- uint16_t n;
- const uint8_t* src = pixels;
- const uint16_t src_line_size = w * ((bits_per_pixel + 7) / 8);
- uint8_t* dst = (uint8_t*)fb->pixels + y * fb->pitch + x *
- fb->bytes_per_pixel;
- for (n = 0; n < h; n++) {
- memcpy(dst, src, src_line_size);
- src += src_line_size;
- dst += fb->pitch;
- }
- qframebuffer_update(fb, x, y, w, h);
- }
- free(pixels);
-}
-
-/*
- * Asynchronous I/O callback launched when framebuffer notifications are ready
- * to be read.
- * Param:
- * opaque - FrameBufferImpl instance.
- */
-static void
-_fbUpdatesImpl_io_callback(void* opaque, int fd, unsigned events)
-{
- FrameBufferImpl* fbi = opaque;
- int ret;
-
- // Read updates while they are immediately available.
- for (;;) {
- // Read next chunk of data.
- ret = HANDLE_EINTR(
- socket_recv(fbi->sock,
- fbi->reader_buffer + fbi->reader_offset,
- fbi->reader_bytes - fbi->reader_offset));
- if (ret < 0 && (errno == EWOULDBLOCK || errno == EAGAIN)) {
- // Chunk is not avalable at this point. Come back later.
- return;
- }
- if (ret <= 0) {
- /* disconnection ! */
- derror("Unable to receive framebuffer data: %s\n",
- ret < 0 ? strerror(errno), "unexpected disconnection");
- fbUpdatesImpl_destroy();
- return;
- }
-
- fbi->reader_offset += ret;
- if (fbi->reader_offset != fbi->reader_bytes) {
- // There are still some data left in the pipe.
- continue;
- }
-
- // All expected data has been read. Time to change the state.
- if (fbi->fb_state == EXPECTS_HEADER) {
- // Update header has been read. Prepare for the pixels.
- fbi->fb_state = EXPECTS_PIXELS;
- fbi->reader_offset = 0;
- fbi->reader_bytes = fbi->update_header.w *
- fbi->update_header.h *
- (fbi->bits_per_pixel / 8);
- fbi->reader_buffer = malloc(fbi->reader_bytes);
- if (fbi->reader_buffer == NULL) {
- APANIC("Unable to allocate memory for framebuffer update\n");
- }
- } else {
- // Pixels have been read. Prepare for the header.
- uint8_t* pixels = fbi->reader_buffer;
-
- fbi->fb_state = EXPECTS_HEADER;
- fbi->reader_offset = 0;
- fbi->reader_bytes = sizeof(FBUpdateMessage);
- fbi->reader_buffer = (uint8_t*)&fbi->update_header;
-
- // Perform the update. Note that pixels buffer must be freed there.
- _update_rect(fbi->fb, fbi->update_header.x,
- fbi->update_header.y, fbi->update_header.w,
- fbi->update_header.h, fbi->bits_per_pixel,
- pixels);
- }
- }
-}
-
-int
-fbUpdatesImpl_create(SockAddress* console_socket,
- const char* protocol,
- QFrameBuffer* fb,
- Looper* looper)
-{
- FrameBufferImpl* fbi = &_fbImpl;
- char* handshake = NULL;
- char switch_cmd[256];
-
- // Initialize descriptor.
- fbi->fb = fb;
- fbi->reader_buffer = (uint8_t*)&fbi->update_header;
- fbi->reader_offset = 0;
- fbi->reader_bytes = sizeof(FBUpdateMessage);
-
- // Connect to the framebuffer service.
- snprintf(switch_cmd, sizeof(switch_cmd), "framebuffer %s", protocol);
- fbi->core_connection =
- core_connection_create_and_switch(console_socket, switch_cmd, &handshake);
- if (fbi->core_connection == NULL) {
- derror("Unable to connect to the framebuffer service: %s\n",
- errno_str);
- return -1;
- }
-
- // We expect core framebuffer to return us bits per pixel property in
- // the handshake message.
- fbi->bits_per_pixel = 0;
- if (handshake != NULL) {
- char* bpp = strstr(handshake, "bitsperpixel=");
- if (bpp != NULL) {
- char* end;
- bpp += strlen("bitsperpixel=");
- end = strchr(bpp, ' ');
- if (end == NULL) {
- end = bpp + strlen(bpp);
- }
- fbi->bits_per_pixel = strtol(bpp, &end, 0);
- }
- }
- if (!fbi->bits_per_pixel) {
- derror("Unexpected core framebuffer reply: %s\n"
- "Bits per pixel property is not there, or is invalid\n",
- handshake);
- fbUpdatesImpl_destroy();
- return -1;
- }
-
- fbi->sock = core_connection_get_socket(fbi->core_connection);
-
- // At last setup read callback, and start receiving the updates.
- loopIo_init(fbi->io, looper, fbi->sock,
- _fbUpdatesImpl_io_callback, &_fbImpl);
- loopIo_wantRead(fbi->io);
- {
- // Force the core to send us entire framebuffer now, when we're prepared
- // to receive it.
- FBRequestHeader hd;
- SyncSocket* sk = syncsocket_init(fbi->sock);
-
- hd.request_type = AFB_REQUEST_REFRESH;
- syncsocket_start_write(sk);
- syncsocket_write(sk, &hd, sizeof(hd), 5000);
- syncsocket_stop_write(sk);
- syncsocket_free(sk);
- }
-
- fprintf(stdout, "framebuffer is now connected to the core at %s.",
- sock_address_to_string(console_socket));
- if (handshake != NULL) {
- if (handshake[0] != '\0') {
- fprintf(stdout, " Handshake: %s", handshake);
- }
- free(handshake);
- }
- fprintf(stdout, "\n");
-
- return 0;
-}
-
-void
-fbUpdatesImpl_destroy(void)
-{
- FrameBufferImpl* fbi = &_fbImpl;
-
- if (fbi->core_connection != NULL) {
- // Disable the reader callback.
- loopIo_done(fbi->io);
-
- // Close framebuffer connection.
- core_connection_close(fbi->core_connection);
- core_connection_free(fbi->core_connection);
- fbi->core_connection = NULL;
- }
-
- fbi->fb = NULL;
- if (fbi->reader_buffer != NULL &&
- fbi->reader_buffer != (uint8_t*)&fbi->update_header) {
- free(fbi->reader_buffer);
- fbi->reader_buffer = (uint8_t*)&fbi->update_header;
- }
-}
diff --git a/android/protocol/fb-updates-impl.h b/android/protocol/fb-updates-impl.h
deleted file mode 100644
index 56d48600b4..0000000000
--- a/android/protocol/fb-updates-impl.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains UI-side "framebuffer" client that receives framebuffer updates
- * from the Core.
- */
-
-#ifndef _ANDROID_FRAMEBUFFER_UI_H
-#define _ANDROID_FRAMEBUFFER_UI_H
-
-#include "android/looper.h"
-#include "android/framebuffer.h"
-#include "android/looper.h"
-#include "android/async-utils.h"
-
-/* Creates framebuffer client, and connects it with the core.
- * Param:
- * console_socket Address of the core's console socket.
- * protocol Protocol to use for the updates:
- * -raw Stream pixels over socket
- * -shared Use shared memory for pixels.
- * fb - Framebuffer associated with this FB client.
- * Return:
- * 0 on success, or < 0 on failure.
- */
-int fbUpdatesImpl_create(SockAddress* console_socket,
- const char* protocol,
- QFrameBuffer* fb,
- Looper* looper);
-
-/* Disconnects and destroys framebuffer client. */
-void fbUpdatesImpl_destroy(void);
-
-#endif /* _ANDROID_FRAMEBUFFER_UI_H */
diff --git a/android/protocol/fb-updates-proxy.c b/android/protocol/fb-updates-proxy.c
deleted file mode 100644
index 10d1e716d7..0000000000
--- a/android/protocol/fb-updates-proxy.c
+++ /dev/null
@@ -1,346 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains core-side framebuffer service that sends framebuffer updates
- * to the UI connected to the core.
- */
-
-#include "ui/console.h"
-#include "android/looper.h"
-#include "android/display-core.h"
-#include "android/async-utils.h"
-#include "android/protocol/fb-updates.h"
-#include "android/protocol/fb-updates-proxy.h"
-#include "android/utils/system.h"
-#include "android/utils/debug.h"
-
-/* Descriptor for the Core-side implementation of the "framebufer" service.
- */
-struct ProxyFramebuffer {
- /* Writer used to send FB update notification messages. */
- AsyncWriter fb_update_writer;
-
- /* Reader used to read FB requests from the client. */
- AsyncReader fb_req_reader;
-
- /* I/O associated with this descriptor. */
- LoopIo io;
-
- /* Display state used for this service */
- DisplayState* ds;
- DisplayUpdateListener* ds_listener;
-
- /* Looper used to communicate framebuffer updates. */
- Looper* looper;
-
- /* Head of the list of pending FB update notifications. */
- struct FBUpdateNotify* fb_update_head;
-
- /* Tail of the list of pending FB update notifications. */
- struct FBUpdateNotify* fb_update_tail;
-
- /* Socket used to communicate framebuffer updates. */
- int sock;
-
- /* Framebuffer request header. */
- FBRequestHeader fb_req_header;
-};
-
-/* Framebuffer update notification descriptor. */
-typedef struct FBUpdateNotify {
- /* Links all pending FB update notifications. */
- struct FBUpdateNotify* next_fb_update;
-
- /* Core framebuffer instance that owns the message. */
- ProxyFramebuffer* proxy_fb;
-
- /* Size of the message to transfer. */
- size_t message_size;
-
- /* Update message. */
- FBUpdateMessage message;
-} FBUpdateNotify;
-
-/*
- * Gets pointer in framebuffer's pixels for the given pixel.
- * Param:
- * fb Framebuffer containing pixels.
- * x, and y identify the pixel to get pointer for.
- * Return:
- * Pointer in framebuffer's pixels for the given pixel.
- */
-static const uint8_t*
-_pixel_offset(const DisplaySurface* dsu, int x, int y)
-{
- return (const uint8_t*)dsu->data + y * dsu->linesize + x * dsu->pf.bytes_per_pixel;
-}
-
-/*
- * Copies pixels from a framebuffer rectangle.
- * Param:
- * rect - Buffer where to copy pixel.
- * fb - Framebuffer containing the rectangle to copy.
- * x, y, w, and h - dimensions of the rectangle to copy.
- */
-static void
-_copy_fb_rect(uint8_t* rect, const DisplaySurface* dsu, int x, int y, int w, int h)
-{
- const uint8_t* start = _pixel_offset(dsu, x, y);
- for (; h > 0; h--) {
- memcpy(rect, start, w * dsu->pf.bytes_per_pixel);
- start += dsu->linesize;
- rect += w * dsu->pf.bytes_per_pixel;
- }
-}
-
-/*
- * Allocates and initializes framebuffer update notification descriptor.
- * Param:
- * ds - Display state for the framebuffer.
- * fb Framebuffer containing pixels.
- * x, y, w, and h identify the rectangle that is being updated.
- * Return:
- * Initialized framebuffer update notification descriptor.
- */
-static FBUpdateNotify*
-fbupdatenotify_create(ProxyFramebuffer* proxy_fb,
- int x, int y, int w, int h)
-{
- const size_t rect_size = w * h * proxy_fb->ds->surface->pf.bytes_per_pixel;
- FBUpdateNotify* ret = malloc(sizeof(FBUpdateNotify) + rect_size);
-
- ret->next_fb_update = NULL;
- ret->proxy_fb = proxy_fb;
- ret->message_size = sizeof(FBUpdateMessage) + rect_size;
- ret->message.x = x;
- ret->message.y = y;
- ret->message.w = w;
- ret->message.h = h;
- _copy_fb_rect(ret->message.rect, proxy_fb->ds->surface, x, y, w, h);
- return ret;
-}
-
-/*
- * Deletes FBUpdateNotify descriptor, created with fbupdatenotify_create.
- * Param:
- * desc - Descreptor to delete.
- */
-static void
-fbupdatenotify_delete(FBUpdateNotify* desc)
-{
- if (desc != NULL) {
- free(desc);
- }
-}
-
-/*
- * Asynchronous write I/O callback launched when writing framebuffer
- * notifications to the socket.
- * Param:
- * proxy_fb - ProxyFramebuffer instance.
- */
-static void
-_proxyFb_io_write(ProxyFramebuffer* proxy_fb)
-{
- while (proxy_fb->fb_update_head != NULL) {
- FBUpdateNotify* current_update = proxy_fb->fb_update_head;
- // Lets continue writing of the current notification.
- const AsyncStatus status =
- asyncWriter_write(&proxy_fb->fb_update_writer);
- switch (status) {
- case ASYNC_COMPLETE:
- // Done with the current update. Move on to the next one.
- break;
- case ASYNC_ERROR:
- // Done with the current update. Move on to the next one.
- loopIo_dontWantWrite(&proxy_fb->io);
- break;
-
- case ASYNC_NEED_MORE:
- // Transfer will eventually come back into this routine.
- return;
- }
-
- // Advance the list of updates
- proxy_fb->fb_update_head = current_update->next_fb_update;
- if (proxy_fb->fb_update_head == NULL) {
- proxy_fb->fb_update_tail = NULL;
- }
- fbupdatenotify_delete(current_update);
-
- if (proxy_fb->fb_update_head != NULL) {
- // Schedule the next one.
- asyncWriter_init(&proxy_fb->fb_update_writer,
- &proxy_fb->fb_update_head->message,
- proxy_fb->fb_update_head->message_size,
- &proxy_fb->io);
- }
- }
-}
-
-static void proxyFb_update(void* opaque, int x, int y, int w, int h);
-
-/*
- * Asynchronous read I/O callback launched when reading framebuffer requests
- * from the socket.
- * Param:
- * proxy_fb - ProxyFramebuffer instance.
- */
-static void
-_proxyFb_io_read(ProxyFramebuffer* proxy_fb)
-{
- // Read the request header.
- DisplaySurface* dsu;
- const AsyncStatus status =
- asyncReader_read(&proxy_fb->fb_req_reader);
- switch (status) {
- case ASYNC_COMPLETE:
- // Request header is received
- switch (proxy_fb->fb_req_header.request_type) {
- case AFB_REQUEST_REFRESH:
- // Force full screen update to be sent
- dsu = proxy_fb->ds->surface;
- proxyFb_update(proxy_fb,
- 0, 0, dsu->width, dsu->height);
- break;
- default:
- derror("Unknown framebuffer request %d\n",
- proxy_fb->fb_req_header.request_type);
- break;
- }
- proxy_fb->fb_req_header.request_type = -1;
- asyncReader_init(&proxy_fb->fb_req_reader, &proxy_fb->fb_req_header,
- sizeof(proxy_fb->fb_req_header), &proxy_fb->io);
- break;
- case ASYNC_ERROR:
- loopIo_dontWantRead(&proxy_fb->io);
- if (errno == ECONNRESET) {
- // UI has exited. We need to destroy framebuffer service.
- proxyFb_destroy(proxy_fb);
- }
- break;
-
- case ASYNC_NEED_MORE:
- // Transfer will eventually come back into this routine.
- return;
- }
-}
-
-/*
- * Asynchronous I/O callback launched when writing framebuffer notifications
- * to the socket.
- * Param:
- * opaque - ProxyFramebuffer instance.
- */
-static void
-_proxyFb_io_fun(void* opaque, int fd, unsigned events)
-{
- if (events & LOOP_IO_READ) {
- _proxyFb_io_read((ProxyFramebuffer*)opaque);
- } else if (events & LOOP_IO_WRITE) {
- _proxyFb_io_write((ProxyFramebuffer*)opaque);
- }
-}
-
-ProxyFramebuffer*
-proxyFb_create(int sock, const char* protocol)
-{
- // At this point we're implementing the -raw protocol only.
- ProxyFramebuffer* ret;
- DisplayState* ds = get_displaystate();
- DisplayUpdateListener* dul;
-
- ANEW0(ret);
- ret->sock = sock;
- ret->looper = looper_newCore();
- ret->ds = ds;
-
- ANEW0(dul);
- dul->opaque = ret;
- dul->dpy_update = proxyFb_update;
- register_displayupdatelistener(ds, dul);
- ret->ds_listener = dul;
-
- ret->fb_update_head = NULL;
- ret->fb_update_tail = NULL;
- loopIo_init(&ret->io, ret->looper, sock, _proxyFb_io_fun, ret);
- asyncReader_init(&ret->fb_req_reader, &ret->fb_req_header,
- sizeof(ret->fb_req_header), &ret->io);
- return ret;
-}
-
-void
-proxyFb_destroy(ProxyFramebuffer* proxy_fb)
-{
- if (proxy_fb != NULL) {
- unregister_displayupdatelistener(proxy_fb->ds, proxy_fb->ds_listener);
- if (proxy_fb->looper != NULL) {
- // Stop all I/O that may still be going on.
- loopIo_done(&proxy_fb->io);
- // Delete all pending frame updates.
- while (proxy_fb->fb_update_head != NULL) {
- FBUpdateNotify* pending_update = proxy_fb->fb_update_head;
- proxy_fb->fb_update_head = pending_update->next_fb_update;
- fbupdatenotify_delete(pending_update);
- }
- proxy_fb->fb_update_tail = NULL;
- looper_free(proxy_fb->looper);
- proxy_fb->looper = NULL;
- }
- AFREE(proxy_fb);
- }
-}
-
-static void
-proxyFb_update(void* opaque, int x, int y, int w, int h)
-{
- ProxyFramebuffer* proxy_fb = opaque;
- AsyncStatus status;
- FBUpdateNotify* descr = fbupdatenotify_create(proxy_fb, x, y, w, h);
-
- // Lets see if we should list it behind other pending updates.
- if (proxy_fb->fb_update_tail != NULL) {
- proxy_fb->fb_update_tail->next_fb_update = descr;
- proxy_fb->fb_update_tail = descr;
- return;
- }
-
- // We're first in the list. Just send it now.
- proxy_fb->fb_update_head = proxy_fb->fb_update_tail = descr;
- asyncWriter_init(&proxy_fb->fb_update_writer,
- &proxy_fb->fb_update_head->message,
- proxy_fb->fb_update_head->message_size, &proxy_fb->io);
- status = asyncWriter_write(&proxy_fb->fb_update_writer);
- switch (status) {
- case ASYNC_COMPLETE:
- fbupdatenotify_delete(descr);
- proxy_fb->fb_update_head = proxy_fb->fb_update_tail = NULL;
- return;
- case ASYNC_ERROR:
- fbupdatenotify_delete(descr);
- proxy_fb->fb_update_head = proxy_fb->fb_update_tail = NULL;
- return;
- case ASYNC_NEED_MORE:
- // Update transfer will eventually complete in _proxyFb_io_fun
- return;
- }
-}
-
-int
-proxyFb_get_bits_per_pixel(ProxyFramebuffer* proxy_fb)
-{
- if (proxy_fb == NULL || proxy_fb->ds == NULL)
- return -1;
-
- return proxy_fb->ds->surface->pf.bits_per_pixel;
-}
diff --git a/android/protocol/fb-updates-proxy.h b/android/protocol/fb-updates-proxy.h
deleted file mode 100644
index 15b1d5bc4b..0000000000
--- a/android/protocol/fb-updates-proxy.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains core-side framebuffer service that sends framebuffer updates
- * to the UI connected to the core.
- */
-
-#ifndef _ANDROID_PROTOCOL_FB_UPDATES_PROXY_H
-#define _ANDROID_PROTOCOL_FB_UPDATES_PROXY_H
-
-/* Descriptor for a framebuffer core service instance */
-typedef struct ProxyFramebuffer ProxyFramebuffer;
-
-/*
- * Creates framebuffer service.
- * Param:
- * sock - Socket descriptor for the service
- * protocol - Defines protocol to use when sending FB updates to the UI. The
- * supported values ar:
- * -raw Transfers the updating rectangle buffer over the socket.
- * -shared Used a shared memory to transfer the updating rectangle buffer.
- * Return:
- * Framebuffer service descriptor.
- */
-ProxyFramebuffer* proxyFb_create(int sock, const char* protocol);
-
-/*
- * Destroys framebuffer service created with proxyFb_create.
- * Param:
- * core_fb - Framebuffer service descriptor created with proxyFb_create
- */
-void proxyFb_destroy(ProxyFramebuffer* core_fb);
-
-/*
- * Gets number of bits used to encode a single pixel.
- * Param:
- * core_fb - Framebuffer service descriptor created with proxyFb_create
- * Return:
- * Number of bits used to encode a single pixel.
- */
-int proxyFb_get_bits_per_pixel(ProxyFramebuffer* core_fb);
-
-#endif /* _ANDROID_PROTOCOL_FB_UPDATES_PROXY_H */
diff --git a/android/protocol/fb-updates.h b/android/protocol/fb-updates.h
deleted file mode 100644
index 9142599f89..0000000000
--- a/android/protocol/fb-updates.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the API for calling into the UI with Core's framebuffer updates.
- */
-
-#ifndef _ANDROID_PROTOCOL_FB_UPDATES_H
-#define _ANDROID_PROTOCOL_FB_UPDATES_H
-
-#include "sysemu/sysemu.h"
-
-/* Requests the Core to refresh framebuffer.
- * This message is sent by the UI to the Core right after the UI is initialized.
- * This message forces the Core to send a full display update back to the UI. */
-#define AFB_REQUEST_REFRESH 1
-
-/* Header of framebuffer update message sent from the core to the UI. */
-typedef struct FBUpdateMessage {
- /* x, y, w, and h identify the rectangle that is being updated. */
- uint16_t x;
- uint16_t y;
- uint16_t w;
- uint16_t h;
-
- /* Contains updating rectangle copied over from the framebuffer's pixels. */
- uint8_t rect[0];
-} FBUpdateMessage;
-
-/* Header for framebuffer requests sent from the UI to the Core. */
-typedef struct FBRequestHeader {
- /* Request type. See AFB_REQUEST_XXX for the values. */
- uint8_t request_type;
-} FBRequestHeader;
-
-#endif /* _ANDROID_PROTOCOL_FB_UPDATES_H */
diff --git a/android/protocol/ui-commands-api.h b/android/protocol/ui-commands-api.h
deleted file mode 100644
index d9fe6b0870..0000000000
--- a/android/protocol/ui-commands-api.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_UI_COMMANDS_API_H
-#define _ANDROID_PROTOCOL_UI_COMMANDS_API_H
-
-/*
- * Contains the API for calling into the UI with the Core control commands.
- */
-
-/* Changes the scale of the emulator window at runtime.
- * Param:
- * scale, is_dpi - New window scale parameters
- * Return:
- * 0 on success, or < 0 on failure.
- */
-extern int uicmd_set_window_scale(double scale, int is_dpi);
-
-/* This is temporary redeclaration for AndroidHwLightBrightnessFunc declared
- * in android/hw-control.h We redeclare it here in order to keep type
- * consistency between android_core_set_brightness_change_callback and
- * light_brightness field of AndroidHwControlFuncs structure.
- */
-typedef void (*AndroidHwLightBrightnessCallback)(void* opaque,
- const char* light,
- int brightness);
-
-/* Registers a UI callback to be called when brightness is changed by the core. */
-extern int uicmd_set_brightness_change_callback(AndroidHwLightBrightnessCallback callback,
- void* opaque);
-
-#endif /* _ANDROID_PROTOCOL_UI_COMMANDS_API_H */
diff --git a/android/protocol/ui-commands-impl.c b/android/protocol/ui-commands-impl.c
deleted file mode 100644
index 307e7c729d..0000000000
--- a/android/protocol/ui-commands-impl.c
+++ /dev/null
@@ -1,257 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the UI-side implementation of the "core-ui-control" service that is
- * part of the UI control protocol. Here we handle UI control commands received
- * from the Core.
- */
-
-#include <unistd.h>
-#include "android/looper.h"
-#include "android/async-utils.h"
-#include "android/sync-utils.h"
-#include "android/utils/system.h"
-#include "android/utils/debug.h"
-#include "android/utils/eintr_wrapper.h"
-#include "android/utils/panic.h"
-#include "android/protocol/core-connection.h"
-#include "android/protocol/ui-commands-impl.h"
-#include "android/protocol/ui-commands-api.h"
-
-/* Enumerates states for the command reader in UICmdImpl instance. */
-typedef enum UICmdImplState {
- /* The reader is waiting on command header. */
- EXPECTS_HEADER,
-
- /* The reader is waiting on command parameters. */
- EXPECTS_PARAMETERS,
-} UICmdImplState;
-
-/* Descriptor for the UI-side of the "core-ui-control" service. */
-typedef struct UICmdImpl {
- /* Core connection established for this service. */
- CoreConnection* core_connection;
-
- /* Socket descriptor for the UI service. */
- int sock;
-
- /* Custom i/o handler */
- LoopIo io[1];
-
- /* Command reader state. */
- UICmdImplState reader_state;
-
- /* Incoming command header. */
- UICmdHeader cmd_header;
-
- /* Reader's buffer. This field can point to the cmd_header field of this
- * structure (when we expect a command header), or to a buffer allocated for
- * the (when we expect command parameters). */
- uint8_t* reader_buffer;
-
- /* Offset in the reader's buffer where to read next chunk of data. */
- size_t reader_offset;
-
- /* Total number of bytes the reader expects to read. */
- size_t reader_bytes;
-} UICmdImpl;
-
-/* Implemented in android/qemulator.c */
-extern void android_emulator_set_window_scale(double scale, int is_dpi);
-
-/* One and only one UICmdImpl instance. */
-static UICmdImpl _uiCmdImpl;
-
-/* Display brightness change callback. */
-static AndroidHwLightBrightnessCallback _brightness_change_callback = NULL;
-static void* _brightness_change_callback_param = NULL;
-
-/* Handles UI control command received from the core.
- * Param:
- * uicmd - UICmdImpl instance that received the command.
- * header - UI control command header.
- * data - Command parameters formatted accordingly to the command type.
- */
-static void
-_uiCmdImpl_handle_command(UICmdImpl* uicmd,
- const UICmdHeader* header,
- const uint8_t* data)
-{
- switch (header->cmd_type) {
- case AUICMD_SET_WINDOWS_SCALE:
- {
- UICmdSetWindowsScale* cmd = (UICmdSetWindowsScale*)data;
- android_emulator_set_window_scale(cmd->scale, cmd->is_dpi);
- break;
- }
-
- case AUICMD_CHANGE_DISP_BRIGHTNESS:
- {
- UICmdChangeDispBrightness* cmd = (UICmdChangeDispBrightness*)data;
- if (_brightness_change_callback != NULL) {
- _brightness_change_callback(_brightness_change_callback_param,
- cmd->light, cmd->brightness);
- }
- break;
- }
-
- default:
- derror("Unknown command %d is received from the Core\n",
- header->cmd_type);
- break;
- }
-}
-
-/* Asynchronous I/O callback reading UI control commands.
- * Param:
- * opaque - UICmdImpl instance.
- */
-static void
-_uiCmdImpl_io_callback(void* opaque, int fd, unsigned events)
-{
- UICmdImpl* uicmd = opaque;
- int status;
-
- // Read requests while they are immediately available.
- for (;;) {
- // Read next chunk of data.
- status = HANDLE_EINTR(
- socket_recv(uicmd->sock,
- uicmd->reader_buffer + uicmd->reader_offset,
- uicmd->reader_bytes - uicmd->reader_offset));
- if (status < 0 && (errno == EWOULDBLOCK || errno == EGAIN) {
- // Chunk is not avalable at this point. Come back later.
- return;
- }
- if (status <= 0) {
- /* Disconnection, meaning that the core process got terminated. */
- fprintf(stderr,
- "core-ui-control service got disconnected: %s\n",
- status < 0 ?
- strerror(errno) :
- "unexpected disconnection");
- uiCmdImpl_destroy();
- return;
- }
-
- uicmd->reader_offset += status;
- if (uicmd->reader_offset != uicmd->reader_bytes) {
- // There are still some data left in the pipe.
- continue;
- }
-
- // All expected data has been read. Time to change the state.
- if (uicmd->reader_state == EXPECTS_HEADER) {
- // Header has been read.
- if (uicmd->cmd_header.cmd_param_size) {
- // Prepare for the command parameters.
- uicmd->reader_state = EXPECTS_PARAMETERS;
- uicmd->reader_offset = 0;
- uicmd->reader_bytes = uicmd->cmd_header.cmd_param_size;
- uicmd->reader_buffer = malloc(uicmd->reader_bytes);
- if (uicmd->reader_buffer == NULL) {
- APANIC("Unable to allocate memory for UI command parameters.\n");
- }
- } else {
- // This command doesn't have any parameters. Handle it now.
- _uiCmdImpl_handle_command(uicmd, &uicmd->cmd_header, NULL);
- // Prepare for the next command header.
- uicmd->reader_state = EXPECTS_HEADER;
- uicmd->reader_offset = 0;
- uicmd->reader_bytes = sizeof(uicmd->cmd_header);
- uicmd->reader_buffer = (uint8_t*)&uicmd->cmd_header;
- }
- } else {
- // All command data is in. Handle it.
- _uiCmdImpl_handle_command(uicmd, &uicmd->cmd_header,
- uicmd->reader_buffer);
- // Prepare for the next command header.
- free(uicmd->reader_buffer);
- uicmd->reader_state = EXPECTS_HEADER;
- uicmd->reader_offset = 0;
- uicmd->reader_bytes = sizeof(uicmd->cmd_header);
- uicmd->reader_buffer = (uint8_t*)&uicmd->cmd_header;
- }
- }
-}
-
-int
-uiCmdImpl_create(SockAddress* console_socket, Looper* looper)
-{
- UICmdImpl* uicmd = &_uiCmdImpl;
- char* handshake = NULL;
-
- // Setup command reader.
- uicmd->reader_buffer = (uint8_t*)&uicmd->cmd_header;
- uicmd->reader_state = EXPECTS_HEADER;
- uicmd->reader_offset = 0;
- uicmd->reader_bytes = sizeof(UICmdHeader);
-
- // Connect to the core-ui-control service.
- uicmd->core_connection =
- core_connection_create_and_switch(console_socket, "core-ui-control",
- &handshake);
- if (uicmd->core_connection == NULL) {
- derror("Unable to connect to the core-ui-control service: %s\n",
- errno_str);
- return -1;
- }
-
- // Initialize UI command reader.
- uicmd->sock = core_connection_get_socket(uicmd->core_connection);
- loopIo_init(uicmd->io, looper, uicmd->sock,
- _uiCmdImpl_io_callback,
- &_uiCmdImpl);
- loopIo_wantRead(uicmd->io);
-
- fprintf(stdout, "core-ui-control is now connected to the core at %s.",
- sock_address_to_string(console_socket));
- if (handshake != NULL) {
- if (handshake[0] != '\0') {
- fprintf(stdout, " Handshake: %s", handshake);
- }
- free(handshake);
- }
- fprintf(stdout, "\n");
-
- return 0;
-}
-
-void
-uiCmdImpl_destroy(void)
-{
- UICmdImpl* uicmd = &_uiCmdImpl;
-
- if (uicmd->core_connection != NULL) {
- // Disable I/O callbacks.
- loopIo_done(uicmd->io);
- core_connection_close(uicmd->core_connection);
- core_connection_free(uicmd->core_connection);
- uicmd->core_connection = NULL;
- }
- // Properly deallocate the reader buffer.
- if (uicmd->reader_buffer != NULL &&
- uicmd->reader_buffer != (uint8_t*)&uicmd->cmd_header) {
- free(uicmd->reader_buffer);
- uicmd->reader_buffer = (uint8_t*)&uicmd->cmd_header;
- }
-}
-
-int
-uicmd_set_brightness_change_callback(AndroidHwLightBrightnessCallback callback,
- void* opaque)
-{
- _brightness_change_callback = callback;
- _brightness_change_callback_param = opaque;
- return 0;
-}
diff --git a/android/protocol/ui-commands-impl.h b/android/protocol/ui-commands-impl.h
deleted file mode 100644
index 717f6b64bb..0000000000
--- a/android/protocol/ui-commands-impl.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_UI_COMMANDS_IMPL_H
-#define _ANDROID_PROTOCOL_UI_COMMANDS_IMPL_H
-
-#include "android/sockets.h"
-#include "android/looper.h"
-#include "android/protocol/ui-commands.h"
-
-/*
- * Contains the UI-side implementation of the "core-ui-control" service that is
- * part of the UI control protocol. Here we handle UI control commands sent by
- * the Core to the UI.
- */
-
-/* Creates and initializes descriptor for the UI-side of the "core-ui-control"
- * service. Note that there can be only one instance of this service in the UI.
- * Param:
- * console_socket - Addresses Core's console.
- * Return:
- * 0 on success, or < 0 on failure.
- */
-extern int uiCmdImpl_create(SockAddress* console_socket, Looper* looper);
-
-/* Destroys UI-side of the "core-ui-control" service. */
-extern void uiCmdImpl_destroy();
-
-#endif /* _ANDROID_PROTOCOL_UI_COMMANDS_IMPL_H */
diff --git a/android/protocol/ui-commands-proxy.c b/android/protocol/ui-commands-proxy.c
deleted file mode 100644
index 22994c5f3d..0000000000
--- a/android/protocol/ui-commands-proxy.c
+++ /dev/null
@@ -1,209 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the Core-side implementation of the "core-ui-control" service that is
- * part of the UI control protocol. Here we send UI control commands to the UI.
- */
-
-#include "android/android.h"
-#include "android/hw-control.h"
-#include "android/looper.h"
-#include "android/async-utils.h"
-#include "android/sync-utils.h"
-#include "android/utils/debug.h"
-#include "android/protocol/ui-commands.h"
-#include "android/protocol/ui-commands-proxy.h"
-#include "android/protocol/ui-commands-api.h"
-
-/* Descriptor for the UI commands proxy. */
-typedef struct UICmdProxy {
- /* I/O associated with this descriptor. */
- LoopIo io;
-
- /* Looper associated with this descriptor. */
- Looper* looper;
-
- /* Writer to send UI commands. */
- SyncSocket* sync_writer;
-
- /* Socket descriptor for this service. */
- int sock;
-} UICmdProxy;
-
-/* One and only one UICmdProxy instance. */
-static UICmdProxy _uiCmdProxy;
-
-/* Implemented in android/console.c */
-extern void destroy_uicmd_client(void);
-
-/* Calculates timeout for transferring the given number of bytes via socket.
- * Return:
- * Number of milliseconds during which the entire number of bytes is expected
- * to be transferred via socket.
- */
-static int
-_uiCmdProxy_get_timeout(size_t data_size)
-{
- // Min 2 seconds + 10 millisec for each transferring byte.
- // TODO: Come up with a better arithmetics here.
- return 2000 + data_size * 10;
-}
-
-/* Sends request to the UI client of this service.
- * Param:
- * cmd_type, cmd_param, cmd_param_size - Define the command to send.
- * Return:
- * 0 on success, or < 0 on failure.
- */
-static int
-_uiCmdProxy_send_command(uint8_t cmd_type,
- void* cmd_param,
- uint32_t cmd_param_size)
-{
- UICmdHeader header;
- int status = syncsocket_start_write(_uiCmdProxy.sync_writer);
- if (!status) {
- // Initialize and send the header.
- header.cmd_type = cmd_type;
- header.cmd_param_size = cmd_param_size;
- status = syncsocket_write(_uiCmdProxy.sync_writer, &header, sizeof(header),
- _uiCmdProxy_get_timeout(sizeof(header)));
- // If there are command parameters, send them too.
- if (status > 0 && cmd_param != NULL && cmd_param_size > 0) {
- status = syncsocket_write(_uiCmdProxy.sync_writer, cmd_param,
- cmd_param_size,
- _uiCmdProxy_get_timeout(cmd_param_size));
- }
- status = syncsocket_result(status);
- syncsocket_stop_write(_uiCmdProxy.sync_writer);
- }
- if (status < 0) {
- derror("Send UI command %d (%u bytes) has failed: %s\n",
- cmd_type, cmd_param_size, errno_str);
- }
- return status;
-}
-
-/* Asynchronous I/O callback for UICmdProxy instance.
- * We expect this callback to be called only on UI detachment condition. In this
- * case the event should be LOOP_IO_READ, and read should fail with errno set
- * to ECONNRESET.
- * Param:
- * opaque - UICmdProxy instance.
- */
-static void
-_uiCmdProxy_io_func(void* opaque, int fd, unsigned events)
-{
- UICmdProxy* uicmd = (UICmdProxy*)opaque;
- AsyncReader reader;
- AsyncStatus status;
- uint8_t read_buf[1];
-
- if (events & LOOP_IO_WRITE) {
- derror("Unexpected LOOP_IO_WRITE in _uiCmdProxy_io_func.\n");
- return;
- }
-
- // Try to read
- asyncReader_init(&reader, read_buf, sizeof(read_buf), &uicmd->io);
- status = asyncReader_read(&reader);
- // We expect only error status here.
- if (status != ASYNC_ERROR) {
- derror("Unexpected read status %d in _uiCmdProxy_io_func\n", status);
- return;
- }
- // We expect only socket disconnection error here.
- if (errno != ECONNRESET) {
- derror("Unexpected read error %d (%s) in _uiCmdProxy_io_func.\n",
- errno, errno_str);
- return;
- }
-
- // Client got disconnectted.
- destroy_uicmd_client();
-}
-/* a callback function called when the system wants to change the brightness
- * of a given light. 'light' is a string which can be one of:
- * 'lcd_backlight', 'button_backlight' or 'Keyboard_backlight'
- *
- * brightness is an integer (acceptable range are 0..255), however the
- * default is around 105, and we probably don't want to dim the emulator's
- * output at that level.
- */
-static void
-_uiCmdProxy_brightness_change_callback(void* opaque,
- const char* light,
- int brightness)
-{
- // Calculate size of the command parameters.
- const size_t cmd_size = sizeof(UICmdChangeDispBrightness) + strlen(light) + 1;
- // Allocate and initialize parameters.
- UICmdChangeDispBrightness* cmd =
- (UICmdChangeDispBrightness*)g_malloc(cmd_size);
- cmd->brightness = brightness;
- strcpy(cmd->light, light);
- // Send the command.
- _uiCmdProxy_send_command(AUICMD_CHANGE_DISP_BRIGHTNESS, cmd, cmd_size);
- g_free(cmd);
-}
-
-int
-uiCmdProxy_create(int fd)
-{
- // Initialize the only UICmdProxy instance.
- _uiCmdProxy.sock = fd;
- _uiCmdProxy.looper = looper_newCore();
- loopIo_init(&_uiCmdProxy.io, _uiCmdProxy.looper, _uiCmdProxy.sock,
- _uiCmdProxy_io_func, &_uiCmdProxy);
- loopIo_wantRead(&_uiCmdProxy.io);
- _uiCmdProxy.sync_writer = syncsocket_init(fd);
- if (_uiCmdProxy.sync_writer == NULL) {
- derror("Unable to initialize UICmdProxy writer: %s\n", errno_str);
- uiCmdProxy_destroy();
- return -1;
- }
- {
- // Set brighness change callback, so we can notify
- // the UI about the event.
- AndroidHwControlFuncs funcs;
- funcs.light_brightness = _uiCmdProxy_brightness_change_callback;
- android_hw_control_set(&_uiCmdProxy, &funcs);
- }
- return 0;
-}
-
-void
-uiCmdProxy_destroy()
-{
- // Destroy the sync writer.
- if (_uiCmdProxy.sync_writer != NULL) {
- syncsocket_close(_uiCmdProxy.sync_writer);
- syncsocket_free(_uiCmdProxy.sync_writer);
- }
- if (_uiCmdProxy.looper != NULL) {
- // Stop all I/O that may still be going on.
- loopIo_done(&_uiCmdProxy.io);
- looper_free(_uiCmdProxy.looper);
- _uiCmdProxy.looper = NULL;
- }
- _uiCmdProxy.sock = -1;
-}
-
-int
-uicmd_set_window_scale(double scale, int is_dpi)
-{
- UICmdSetWindowsScale cmd;
- cmd.scale = scale;
- cmd.is_dpi = is_dpi;
- return _uiCmdProxy_send_command(AUICMD_SET_WINDOWS_SCALE, &cmd, sizeof(cmd));
-}
diff --git a/android/protocol/ui-commands-proxy.h b/android/protocol/ui-commands-proxy.h
deleted file mode 100644
index 8627537b06..0000000000
--- a/android/protocol/ui-commands-proxy.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_UI_COMMANDS_PROXY_H
-#define _ANDROID_PROTOCOL_UI_COMMANDS_PROXY_H
-
-/*
- * Contains the Core-side implementation of the "core-ui-control" service that is
- * part of the UI control protocol. Here we send UI control commands to the UI.
- */
-
-/* Creates and initializes descriptor for the Core-side of the "core-ui-control"
- * service. Note that there can be only one instance of this service in the core.
- * Param:
- * fd - Socket descriptor for the proxy.
- * Return:
- * 0 on success, or < 0 on failure.
- */
-extern int uiCmdProxy_create(int fd);
-
-/* Destroys the descriptor for the Core-side of the "core-ui-control" service. */
-extern void uiCmdProxy_destroy();
-
-/* Changes the scale of the emulator window at runtime.
- * Param:
- * scale, is_dpi - New window scale parameters
- * Return:
- * 0 on success, or < 0 on failure.
- */
-extern int uicmd_set_window_scale(double scale, int is_dpi);
-
-#endif /* _ANDROID_PROTOCOL_UI_COMMANDS_PROXY_H */
diff --git a/android/protocol/ui-commands-qemu.c b/android/protocol/ui-commands-qemu.c
deleted file mode 100644
index 2bb22c9782..0000000000
--- a/android/protocol/ui-commands-qemu.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains implementation of the API for calling into the UI with the Core
- * control commands for standalone (monolithic) emulator.
- */
-
-#include "android/android.h"
-#include "android/hw-control.h"
-#include "android/protocol/ui-commands-api.h"
-
-/* Implemented in android/qemulator.c */
-extern void android_emulator_set_window_scale(double scale, int is_dpi);
-
-int
-uicmd_set_window_scale(double scale, int is_dpi)
-{
- android_emulator_set_window_scale(scale, is_dpi);
- return 0;
-}
-
-int
-uicmd_set_brightness_change_callback(AndroidHwLightBrightnessCallback callback,
- void* opaque)
-{
- AndroidHwControlFuncs funcs;
- funcs.light_brightness = callback;
- android_hw_control_set(opaque, &funcs);
- return 0;
-}
diff --git a/android/protocol/ui-commands.h b/android/protocol/ui-commands.h
deleted file mode 100644
index 4e47b8302b..0000000000
--- a/android/protocol/ui-commands.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_UI_COMMANDS_H
-#define _ANDROID_PROTOCOL_UI_COMMANDS_H
-
-/*
- * Contains declarations related to the UI control commands sent by the Core and
- * handled by the UI.
- */
-
-#include "android/protocol/ui-common.h"
-
-/* Sets window scale. */
-#define AUICMD_SET_WINDOWS_SCALE 1
-
-/* Changes display brightness. */
-#define AUICMD_CHANGE_DISP_BRIGHTNESS 2
-
-/* Formats AUICMD_SET_WINDOWS_SCALE UI control command parameters.
- * Contains parameters required by android_emulator_set_window_scale routine.
- */
-typedef struct UICmdSetWindowsScale {
- double scale;
- int is_dpi;
-} UICmdSetWindowsScale;
-
-/* Formats AUICMD_CHANGE_DISP_BRIGHTNESS UI control command parameters.
- */
-typedef struct UICmdChangeDispBrightness {
- int brightness;
- char light[0];
-} UICmdChangeDispBrightness;
-
-#endif /* _ANDROID_PROTOCOL_UI_COMMANDS_H */
diff --git a/android/protocol/ui-common.h b/android/protocol/ui-common.h
deleted file mode 100644
index 003ed6d3ae..0000000000
--- a/android/protocol/ui-common.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_UI_COMMON_H
-#define _ANDROID_PROTOCOL_UI_COMMON_H
-
-/*
- * Contains declarations for UI control protocol used by both the Core,
- * and the UI.
- */
-
-/* UI control command header.
- * Every UI control command sent by the Core, or by the UI begins with this
- * header, immediately followed by the command parameters (if there are any).
- * Command type is defined by cmd_type field of this header. If command doesn't
- * have any command-specific parameters, cmd_param_size field of this header
- * must be 0.
- */
-typedef struct UICmdHeader {
- /* Command type. */
- uint8_t cmd_type;
-
- /* Byte size of the buffer containing parameters for the comand defined by
- * the cmd_type field. The buffer containing parameters must immediately
- * follow this header. If command doesn't have any parameters, this field
- * must be 0 */
- uint32_t cmd_param_size;
-} UICmdHeader;
-
-/* UI control command response header.
- * If UI control command assumes a response from the remote end, the response
- * must start with this header, immediately followed by the response data buffer.
- */
-typedef struct UICmdRespHeader {
- /* Result of the command handling. */
- int result;
-
- /* Byte size of the buffer containing response data immediately following
- * this header. If there are no response data for the command, this field
- * must be 0. */
- uint32_t resp_data_size;
-} UICmdRespHeader;
-
-#endif /* _ANDROID_PROTOCOL_UI_COMMON_H */
diff --git a/android/protocol/user-events-impl.c b/android/protocol/user-events-impl.c
deleted file mode 100644
index f45169a82a..0000000000
--- a/android/protocol/user-events-impl.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the Core-side of the "user events" service. Here we receive and
- * handle user events sent from the UI.
- */
-
-#include "android/user-events.h"
-#include "android/globals.h"
-#include "android/android.h"
-#include "android/looper.h"
-#include "android/async-utils.h"
-#include "android/sync-utils.h"
-#include "android/utils/system.h"
-#include "android/utils/debug.h"
-#include "android/protocol/user-events-protocol.h"
-#include "android/protocol/user-events-impl.h"
-
-/* Enumerates state values for the event reader in the UserEventsImpl descriptor.
- */
-typedef enum UserEventsImplState {
- /* The reader is waiting on event header. */
- EXPECTS_HEADER,
-
- /* The reader is waiting on event parameters. */
- EXPECTS_PARAMETERS,
-} UserEventsImplState;
-
-
-/* Core user events service descriptor. */
-typedef struct UserEventsImpl {
- /* Reader to receive user events. */
- AsyncReader user_events_reader;
-
- /* I/O associated with this descriptor. */
- LoopIo io;
-
- /* Looper used to communicate user events. */
- Looper* looper;
-
- /* Socket for this service. */
- int sock;
-
- /* State of the service (see UE_STATE_XXX for possible values). */
- UserEventsImplState state;
-
- /* Current event header. */
- UserEventHeader event_header;
-
- /* Current event parameters. */
- union {
- UserEventGeneric generic_event;
- UserEventMouse mouse_event;
- UserEventKeycode keycode_event;
- };
-} UserEventsImpl;
-
-/* Implemented in android/console.c */
-extern void destroy_user_events_client(void);
-
-/* One and only one UserEventsImpl instance. */
-static UserEventsImpl _UserEventsImpl;
-
-/* Asynchronous I/O callback reading user events.
- * Param:
- * opaque - UserEventsImpl instance.
- */
-static void
-_userEventsImpl_io_func(void* opaque, int fd, unsigned events)
-{
- UserEventsImpl* ueimpl;
- AsyncStatus status;
-
- if (events & LOOP_IO_WRITE) {
- // We don't use async writer here, so we don't expect
- // any write callbacks.
- derror("Unexpected LOOP_IO_WRITE in _userEventsImpl_io_func\n");
- return;
- }
-
- ueimpl = (UserEventsImpl*)opaque;
- // Read whatever is expected from the socket.
- status = asyncReader_read(&ueimpl->user_events_reader);
-
-
- switch (status) {
- case ASYNC_COMPLETE:
- switch (ueimpl->state) {
- case EXPECTS_HEADER:
- // We just read event header. Now we expect event parameters.
- ueimpl->state = EXPECTS_PARAMETERS;
- // Setup the reader depending on the event type.
- switch (ueimpl->event_header.event_type) {
- case AUSER_EVENT_MOUSE:
- asyncReader_init(&ueimpl->user_events_reader,
- &ueimpl->mouse_event,
- sizeof(ueimpl->mouse_event),
- &ueimpl->io);
- break;
-
- case AUSER_EVENT_KEYCODE:
- asyncReader_init(&ueimpl->user_events_reader,
- &ueimpl->keycode_event,
- sizeof(ueimpl->keycode_event),
- &ueimpl->io);
- break;
-
- case AUSER_EVENT_GENERIC:
- asyncReader_init(&ueimpl->user_events_reader,
- &ueimpl->generic_event,
- sizeof(ueimpl->generic_event),
- &ueimpl->io);
- break;
-
- default:
- derror("Unexpected user event type %d\n",
- ueimpl->event_header.event_type);
- break;
- }
- break;
-
- case EXPECTS_PARAMETERS:
- // We just read event parameters. Lets fire the event.
- switch (ueimpl->event_header.event_type) {
- case AUSER_EVENT_MOUSE:
- user_event_mouse(ueimpl->mouse_event.dx,
- ueimpl->mouse_event.dy,
- ueimpl->mouse_event.dz,
- ueimpl->mouse_event.buttons_state);
- break;
-
- case AUSER_EVENT_KEYCODE:
- user_event_keycode(ueimpl->keycode_event.keycode);
- break;
-
- case AUSER_EVENT_GENERIC:
- user_event_generic(ueimpl->generic_event.type,
- ueimpl->generic_event.code,
- ueimpl->generic_event.value);
- break;
-
- default:
- derror("Unexpected user event type %d\n",
- ueimpl->event_header.event_type);
- break;
- }
- // Prepare to receive the next event header.
- ueimpl->event_header.event_type = -1;
- ueimpl->state = EXPECTS_HEADER;
- asyncReader_init(&ueimpl->user_events_reader,
- &ueimpl->event_header,
- sizeof(ueimpl->event_header), &ueimpl->io);
- break;
- }
- break;
- case ASYNC_ERROR:
- loopIo_dontWantRead(&ueimpl->io);
- if (errno == ECONNRESET) {
- // UI has exited. We need to destroy user event service.
- destroy_user_events_client();
- } else {
- derror("User event read error %d -> %s\n", errno, errno_str);
- }
- break;
-
- case ASYNC_NEED_MORE:
- // Transfer will eventually come back into this routine.
- return;
- }
-}
-
-int
-userEventsImpl_create(int fd)
-{
- _UserEventsImpl.sock = fd;
- _UserEventsImpl.event_header.event_type = -1;
- _UserEventsImpl.state = EXPECTS_HEADER;
- _UserEventsImpl.looper = looper_newCore();
- loopIo_init(&_UserEventsImpl.io, _UserEventsImpl.looper, _UserEventsImpl.sock,
- _userEventsImpl_io_func, &_UserEventsImpl);
- asyncReader_init(&_UserEventsImpl.user_events_reader,
- &_UserEventsImpl.event_header,
- sizeof(_UserEventsImpl.event_header), &_UserEventsImpl.io);
- return 0;
-}
-
-void
-userEventsImpl_destroy(void)
-{
- if (_UserEventsImpl.looper != NULL) {
- // Stop all I/O that may still be going on.
- loopIo_done(&_UserEventsImpl.io);
- looper_free(_UserEventsImpl.looper);
- _UserEventsImpl.looper = NULL;
- }
-}
diff --git a/android/protocol/user-events-impl.h b/android/protocol/user-events-impl.h
deleted file mode 100644
index af5d5a4db8..0000000000
--- a/android/protocol/user-events-impl.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the Core-side of the "user events" service. Here we receive and
- * handle user events sent from the UI.
- */
-
-#ifndef _ANDROID_PROTOCOL_USER_EVENTS_IMPL_H
-#define _ANDROID_PROTOCOL_USER_EVENTS_IMPL_H
-
-/* Creates and initializes descriptor for the Core-side of the "user-events"
- * service. Note that there can be only one instance of this service in the core.
- * Param:
- * fd - Socket descriptor for the service.
- * Return:
- * 0 on success, or < 0 on failure.
- */
-extern int userEventsImpl_create(int fd);
-
-/* Destroys the descriptor for the Core-side of the "user-events" service. */
-extern void userEventsImpl_destroy(void);
-
-#endif /* _ANDROID_PROTOCOL_USER_EVENTS_IMPL_H */
diff --git a/android/protocol/user-events-protocol.h b/android/protocol/user-events-protocol.h
deleted file mode 100644
index c1e64e2b25..0000000000
--- a/android/protocol/user-events-protocol.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-#ifndef _ANDROID_PROTOCOL_USER_EVENTS_H
-#define _ANDROID_PROTOCOL_USER_EVENTS_H
-
-/*
- * Contains declarations related to the UI events handled by the Core.
- */
-
-#include "android/globals.h"
-
-/* Mouse event. */
-#define AUSER_EVENT_MOUSE 0
-/* Keycode event. */
-#define AUSER_EVENT_KEYCODE 1
-/* Generic event. */
-#define AUSER_EVENT_GENERIC 2
-
-/* Header for user event message sent from the UI to the Core.
- * Every user event sent by the UI begins with this header, immediately followed
- * by the event parameters (if there are any).
- */
-typedef struct UserEventHeader {
- /* Event type. See AUSER_EVENT_XXX for possible values. */
- uint8_t event_type;
-} UserEventHeader;
-
-/* Formats mouse event message (AUSER_EVENT_MOUSE) */
-typedef struct UserEventMouse {
- int dx;
- int dy;
- int dz;
- unsigned buttons_state;
-} UserEventMouse;
-
-/* Formats keycode event message (AUSER_EVENT_KEYCODE) */
-typedef struct UserEventKeycode {
- int keycode;
-} UserEventKeycode;
-
-/* Formats generic event message (AUSER_EVENT_GENERIC) */
-typedef struct UserEventGeneric {
- int type;
- int code;
- int value;
-} UserEventGeneric;
-
-#endif /* _ANDROID_PROTOCOL_USER_EVENTS_H */
diff --git a/android/protocol/user-events-proxy.c b/android/protocol/user-events-proxy.c
deleted file mode 100644
index 3bd0bee579..0000000000
--- a/android/protocol/user-events-proxy.c
+++ /dev/null
@@ -1,178 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-#include "android/user-events.h"
-#include "ui/console.h"
-#include "android/looper.h"
-#include "android/async-utils.h"
-#include "android/utils/debug.h"
-#include "android/protocol/core-connection.h"
-#include "android/protocol/user-events-protocol.h"
-#include "android/protocol/user-events-proxy.h"
-
-/* Descriptor for the user events client. */
-typedef struct UserEventsProxy {
- /* Core connection instance for the user events client. */
- CoreConnection* core_connection;
-
- /* Socket for the client. */
- int sock;
-
- /* Writes user events to the socket. */
- SyncSocket* sync_writer;
-} UserEventsProxy;
-
-/* One and only one user events client instance. */
-static UserEventsProxy _userEventsProxy = { 0 };
-
-/* Sends an event to the core.
- * Parameters:
- * event - Event type. Must be one of the AUSER_EVENT_XXX.
- * event_param - Event parameters.
- * size - Byte size of the event parameters buffer.
- * Return:
- * 0 on success, or -1 on failure.
- */
-static int
-_userEventsProxy_send(uint8_t event, const void* event_param, size_t size)
-{
- int res;
- UserEventHeader header;
-
- header.event_type = event;
- res = syncsocket_start_write(_userEventsProxy.sync_writer);
- if (!res) {
- // Send event type first (event header)
- res = syncsocket_write(_userEventsProxy.sync_writer, &header,
- sizeof(header),
- core_connection_get_timeout(sizeof(header)));
- if (res > 0) {
- // Send event param next.
- res = syncsocket_write(_userEventsProxy.sync_writer, event_param,
- size,
- core_connection_get_timeout(sizeof(size)));
- }
- res = syncsocket_result(res);
- syncsocket_stop_write(_userEventsProxy.sync_writer);
- }
- if (res < 0) {
- derror("Unable to send user event: %s\n", errno_str);
- }
- return res;
-}
-
-int
-userEventsProxy_create(SockAddress* console_socket)
-{
- char* handshake = NULL;
-
- // Connect to the user-events service.
- _userEventsProxy.core_connection =
- core_connection_create_and_switch(console_socket, "user-events",
- &handshake);
- if (_userEventsProxy.core_connection == NULL) {
- derror("Unable to connect to the user-events service: %s\n",
- errno_str);
- return -1;
- }
-
- // Initialze event writer.
- _userEventsProxy.sock =
- core_connection_get_socket(_userEventsProxy.core_connection);
- _userEventsProxy.sync_writer = syncsocket_init(_userEventsProxy.sock);
- if (_userEventsProxy.sync_writer == NULL) {
- derror("Unable to initialize UserEventsProxy writer: %s\n", errno_str);
- userEventsProxy_destroy();
- return -1;
- }
-
- fprintf(stdout, "user-events is now connected to the core at %s.",
- sock_address_to_string(console_socket));
- if (handshake != NULL) {
- if (handshake[0] != '\0') {
- fprintf(stdout, " Handshake: %s", handshake);
- }
- free(handshake);
- }
- fprintf(stdout, "\n");
-
- return 0;
-}
-
-void
-userEventsProxy_destroy(void)
-{
- if (_userEventsProxy.sync_writer != NULL) {
- syncsocket_close(_userEventsProxy.sync_writer);
- syncsocket_free(_userEventsProxy.sync_writer);
- _userEventsProxy.sync_writer = NULL;
- }
- if (_userEventsProxy.core_connection != NULL) {
- core_connection_close(_userEventsProxy.core_connection);
- core_connection_free(_userEventsProxy.core_connection);
- _userEventsProxy.core_connection = NULL;
- }
-}
-void
-user_event_keycodes(int *kcodes, int count)
-{
- int nn;
- for (nn = 0; nn < count; nn++)
- user_event_keycode(kcodes[nn]);
-}
-
-void
-user_event_keycode(int kcode)
-{
- UserEventKeycode message;
- message.keycode = kcode;
- _userEventsProxy_send(AUSER_EVENT_KEYCODE, &message, sizeof(message));
-}
-
-void
-user_event_key(unsigned code, unsigned down)
-{
- if(code == 0) {
- return;
- }
- if (VERBOSE_CHECK(keys))
- printf(">> KEY [0x%03x,%s]\n", (code & 0x1ff), down ? "down" : " up " );
-
- user_event_keycode((code & 0x1ff) | (down ? 0x200 : 0));
-}
-
-
-void
-user_event_mouse(int dx, int dy, int dz, unsigned buttons_state)
-{
- UserEventMouse message;
- message.dx = dx;
- message.dy = dy;
- message.dz = dz;
- message.buttons_state = buttons_state;
- _userEventsProxy_send(AUSER_EVENT_MOUSE, &message, sizeof(message));
-}
-
-void
-user_event_register_generic(void* opaque, QEMUPutGenericEvent *callback)
-{
-}
-
-void
-user_event_generic(int type, int code, int value)
-{
- UserEventGeneric message;
- message.type = type;
- message.code = code;
- message.value = value;
- _userEventsProxy_send(AUSER_EVENT_GENERIC, &message, sizeof(message));
-}
diff --git a/android/protocol/user-events-proxy.h b/android/protocol/user-events-proxy.h
deleted file mode 100644
index 08a80cfc6f..0000000000
--- a/android/protocol/user-events-proxy.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Copyright (C) 2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains the UI-side of the "user events" service. Here we send user events
- * to the Core.
- */
-
-#ifndef _ANDROID_PROTOCOL_USER_EVENTS_PROXY_H
-#define _ANDROID_PROTOCOL_USER_EVENTS_PROXY_H
-
-/* Creates and initializes descriptor for the UI-side of the "user-events"
- * service. Note that there can be only one instance of this service in the UI.
- * Param:
- * console_socket - Addresses Core's console.
- * Return:
- * 0 on success, or < 0 on failure.
- */
-extern int userEventsProxy_create(SockAddress* console_socket);
-
-/* Destroys the UI-side of the "user-events". */
-extern void userEventsProxy_destroy(void);
-
-#endif /* _ANDROID_PROTOCOL_USER_EVENTS_PROXY_H */
diff --git a/android/qemulator.c b/android/qemulator.c
index ffd547b597..8c8aa0d315 100644
--- a/android/qemulator.c
+++ b/android/qemulator.c
@@ -13,10 +13,10 @@
#include "android/utils/debug.h"
#include "android/utils/bufprint.h"
#include "android/globals.h"
+#include "android/hw-control.h"
#include "android/qemulator.h"
-#include "android/protocol/core-commands-api.h"
-#include "android/protocol/ui-commands-api.h"
#include "android/user-events.h"
+#include "telephony/modem_driver.h"
#define D(...) do { if (VERBOSE_CHECK(init)) dprint(__VA_ARGS__); } while (0)
static double get_default_scale( AndroidOptions* opts );
@@ -89,8 +89,9 @@ qemulator_setup( QEmulator* emulator )
}
/* initialize hardware control support */
- uicmd_set_brightness_change_callback(qemulator_light_brightness,
- emulator);
+ AndroidHwControlFuncs funcs;
+ funcs.light_brightness = qemulator_light_brightness;
+ android_hw_control_set(emulator, &funcs);
}
static void
@@ -252,7 +253,7 @@ qemulator_set_title(QEmulator* emulator)
static int
get_device_dpi( AndroidOptions* opts )
{
- int dpi_device = corecmd_get_hw_lcd_density();
+ int dpi_device = android_hw->hw_lcd_density;
if (opts->dpi_device != NULL) {
char* end;
@@ -393,8 +394,14 @@ handle_key_command( void* opaque, SkinKeyCommand command, int down )
{
case SKIN_KEY_COMMAND_TOGGLE_NETWORK:
{
- corecmd_toggle_network();
- D( "network is now %s", corecmd_is_network_disabled() ?
+ qemu_net_disable = !qemu_net_disable;
+ if (android_modem) {
+ amodem_set_data_registration(
+ android_modem,
+ qemu_net_disable ? A_REGISTRATION_UNREGISTERED
+ : A_REGISTRATION_HOME);
+ }
+ D( "network is now %s", qemu_net_disable ?
"disconnected" : "connected" );
}
break;
@@ -588,7 +595,7 @@ android_emulator_get_keyboard(void)
}
void
-android_emulator_set_window_scale( double scale, int is_dpi )
+android_emulator_set_window_scale(double scale, int is_dpi)
{
QEmulator* emulator = qemulator;
diff --git a/android/qemulator.h b/android/qemulator.h
index 16cafcfe67..c3dce633e9 100644
--- a/android/qemulator.h
+++ b/android/qemulator.h
@@ -41,6 +41,9 @@ typedef struct {
QEmulator*
qemulator_get(void);
+void
+android_emulator_set_window_scale(double scale, int is_dpi);
+
/* Initializes QEmulator structure instance. */
int
qemulator_init( QEmulator* emulator,
diff --git a/android/skin/window.c b/android/skin/window.c
index 23f2090f9b..fd0d1645fb 100644
--- a/android/skin/window.c
+++ b/android/skin/window.c
@@ -13,10 +13,10 @@
#include "android/skin/image.h"
#include "android/skin/scaler.h"
#include "android/charmap.h"
+#include "android/hw-sensors.h"
#include "android/utils/debug.h"
#include "android/utils/system.h"
#include "android/utils/duff.h"
-#include "android/protocol/core-commands-api.h"
#include <SDL_syswm.h>
#include "android/user-events.h"
#include <math.h>
@@ -1465,9 +1465,9 @@ skin_window_reset_internal ( SkinWindow* window, SkinLayout* slayout )
user_event_generic( slayout->event_type, slayout->event_code, slayout->event_value );
/* XXX: hack, replace by better code here */
if (slayout->event_value != 0)
- corecmd_set_coarse_orientation( ANDROID_COARSE_PORTRAIT );
+ android_sensors_set_coarse_orientation(ANDROID_COARSE_PORTRAIT);
else
- corecmd_set_coarse_orientation( ANDROID_COARSE_LANDSCAPE );
+ android_sensors_set_coarse_orientation(ANDROID_COARSE_LANDSCAPE);
}
return 0;
diff --git a/ui/keymaps.c b/ui/keymaps.c
index feb360f41c..bab4b29232 100644
--- a/ui/keymaps.c
+++ b/ui/keymaps.c
@@ -67,29 +67,16 @@ static kbd_layout_t *parse_keyboard_layout(const name2keysym_t *table,
/* This file is used by both, UI and core components. There are differences
* in the way how keymap file path is obtained for these two different
* configurations. */
-#if defined(CONFIG_STANDALONE_UI)
- char filename[2048];
-#else
char * filename;
-#endif // CONFIG_STANDALONE_UI
char line[1024];
int len;
-#if defined(CONFIG_STANDALONE_UI)
- if (android_core_qemu_find_file(QEMU_FILE_TYPE_KEYMAP, language,
- filename, sizeof(filename))) {
- fprintf(stderr,
- "Could not read keymap file: '%s'\n", language);
- return NULL;
- }
-#else
filename = qemu_find_file(QEMU_FILE_TYPE_KEYMAP, language);
if (!filename) {
fprintf(stderr,
"Could not read keymap file: '%s'\n", language);
return NULL;
}
-#endif // CONFIG_STANDALONE_UI
if (!k)
k = g_malloc0(sizeof(kbd_layout_t));
@@ -98,9 +85,6 @@ static kbd_layout_t *parse_keyboard_layout(const name2keysym_t *table,
"Could not read keymap file: '%s'\n", language);
return NULL;
}
-#if defined(CONFIG_STANDALONE_UI)
- g_free(filename);
-#endif // CONFIG_STANDALONE_UI
for(;;) {
if (fgets(line, 1024, f) == NULL)
break;