1 /* Copyright (C) 2010 The Android Open Source Project
2 **
3 ** This software is licensed under the terms of the GNU General Public
4 ** License version 2, as published by the Free Software Foundation, and
5 ** may be copied, distributed, and modified under those terms.
6 **
7 ** This program is distributed in the hope that it will be useful,
8 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
9 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 ** GNU General Public License for more details.
11 */
12
13 /*
14 * Contains the UI-side implementation of the "core-ui-control" service that is
15 * part of the UI control protocol. Here we handle UI control commands received
16 * from the Core.
17 */
18
19 #include "android/utils/debug.h"
20 #include "android/utils/panic.h"
21 #include "android/protocol/core-connection.h"
22 #include "android/protocol/attach-ui-impl.h"
23
24 /* Descriptor for the UI-side of the "attach-ui" service. */
25 typedef struct AttachUIImpl {
26 /* Address of the Core's console socket. */
27 SockAddress console_socket;
28
29 /* Core connection established for this service. */
30 CoreConnection* core_connection;
31
32 /* Socket descriptor for the UI service. */
33 int sock;
34 } AttachUIImpl;
35
36 /* One and only one AttachUIImpl instance. */
37 static AttachUIImpl _attachUiImpl;
38
39 SockAddress*
attachUiImpl_get_console_socket(void)40 attachUiImpl_get_console_socket(void)
41 {
42 return &_attachUiImpl.console_socket;
43 }
44
45 int
attachUiImpl_create(SockAddress * console_socket)46 attachUiImpl_create(SockAddress* console_socket)
47 {
48 char* handshake = NULL;
49
50 _attachUiImpl.console_socket = *console_socket;
51
52 // Connect to the core-ui-control service.
53 _attachUiImpl.core_connection =
54 core_connection_create_and_switch(console_socket, "attach-UI",
55 &handshake);
56 if (_attachUiImpl.core_connection == NULL) {
57 derror("Unable to connect to the attach-UI service: %s\n",
58 errno_str);
59 return -1;
60 }
61
62 fprintf(stdout, "UI is now attached to the core at %s.",
63 sock_address_to_string(console_socket));
64 if (handshake != NULL) {
65 if (handshake[0] != '\0') {
66 fprintf(stdout, " Handshake: %s", handshake);
67 }
68 free(handshake);
69 }
70 fprintf(stdout, "\n");
71
72 return 0;
73 }
74
75 void
attachUiImpl_destroy(void)76 attachUiImpl_destroy(void)
77 {
78 if (_attachUiImpl.core_connection != NULL) {
79 core_connection_close(_attachUiImpl.core_connection);
80 core_connection_free(_attachUiImpl.core_connection);
81 _attachUiImpl.core_connection = NULL;
82 }
83 }
84