aboutsummaryrefslogtreecommitdiffstats
path: root/android/protocol/core-connection.h
diff options
context:
space:
mode:
Diffstat (limited to 'android/protocol/core-connection.h')
-rw-r--r--android/protocol/core-connection.h169
1 files changed, 169 insertions, 0 deletions
diff --git a/android/protocol/core-connection.h b/android/protocol/core-connection.h
new file mode 100644
index 0000000..5701f8c
--- /dev/null
+++ b/android/protocol/core-connection.h
@@ -0,0 +1,169 @@
+/* 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