| /* 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; |
| } |
| } |