diff options
author | David 'Digit' Turner <digit@google.com> | 2014-07-12 03:40:11 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-07-12 03:40:11 +0000 |
commit | 006a174244e336c578f45bf78a9dbdbd890c217d (patch) | |
tree | 7857f7018b73fe8797101cdcaef5fd7ef7e1867c | |
parent | f5aeaf653d85fd44cb3eb4856e702096dcd211fd (diff) | |
parent | b244de10aac448aa9a51cf22d7bc420170dbf215 (diff) | |
download | qemu-lollipop-mr1-dev.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.
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; |