1 /* Copyright (C) 2007-2008 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 #ifndef _android_qemud_h 13 #define _android_qemud_h 14 15 #include "qemu-common.h" 16 17 /* Support for the qemud-based 'services' in the emulator. 18 * Please read docs/ANDROID-QEMUD.TXT to understand what this is about. 19 */ 20 21 /* initialize the qemud support code in the emulator 22 */ 23 24 extern void android_qemud_init( void ); 25 26 /* return the character driver state object that needs to be connected to the 27 * emulated serial port where all multiplexed channels go through. 28 */ 29 extern CharDriverState* android_qemud_get_cs( void ); 30 31 /* returns in '*pcs' a CharDriverState object that will be connected to 32 * a single client in the emulated system for a given named service. 33 * 34 * this is only used to connect GPS and GSM service clients to the 35 * implementation that requires a CharDriverState object for legacy 36 * reasons. 37 * 38 * returns 0 on success, or -1 in case of error 39 */ 40 extern int android_qemud_get_channel( const char* name, CharDriverState* *pcs ); 41 42 /* set an explicit CharDriverState object for a given qemud communication channel. this 43 * is used to attach the channel to an external char driver device (e.g. one 44 * created with "-serial <device>") directly. 45 * 46 * returns 0 on success, -1 on error 47 */ 48 extern int android_qemud_set_channel( const char* name, CharDriverState* peer_cs ); 49 50 /* list of known qemud channel names */ 51 #define ANDROID_QEMUD_GSM "gsm" 52 #define ANDROID_QEMUD_GPS "gps" 53 #define ANDROID_QEMUD_CONTROL "control" 54 #define ANDROID_QEMUD_SENSORS "sensors" 55 56 /* A QemudService service is used to connect one or more clients to 57 * a given emulator facility. Only one client can be connected at any 58 * given time, but the connection can be closed periodically. 59 */ 60 61 typedef struct QemudClient QemudClient; 62 typedef struct QemudService QemudService; 63 64 65 /* A function that will be called when the client running in the emulated 66 * system has closed its connection to qemud. 67 */ 68 typedef void (*QemudClientClose)( void* opaque ); 69 70 /* A function that will be called when the client sends a message to the 71 * service through qemud. 72 */ 73 typedef void (*QemudClientRecv) ( void* opaque, uint8_t* msg, int msglen, QemudClient* client ); 74 75 /* A function that will be called when the state of the client should be 76 * saved to a snapshot. 77 */ 78 typedef void (*QemudClientSave) ( QEMUFile* f, QemudClient* client, void* opaque ); 79 80 /* A function that will be called when the state of the client should be 81 * restored from a snapshot. 82 */ 83 typedef int (*QemudClientLoad) ( QEMUFile* f, QemudClient* client, void* opaque ); 84 85 /* Register a new client for a given service. 86 * 'clie_opaque' will be sent as the first argument to 'clie_recv' and 'clie_close' 87 * 'clie_recv' and 'clie_close' are both optional and may be NULL. 88 * 89 * You should typically use this function within a QemudServiceConnect callback 90 * (see below). 91 */ 92 extern QemudClient* qemud_client_new( QemudService* service, 93 int channel_id, 94 const char* client_param, 95 void* clie_opaque, 96 QemudClientRecv clie_recv, 97 QemudClientClose clie_close, 98 QemudClientSave clie_save, 99 QemudClientLoad clie_load ); 100 101 /* Enable framing on a given client channel. 102 */ 103 extern void qemud_client_set_framing( QemudClient* client, int enabled ); 104 105 /* Send a message to a given qemud client 106 */ 107 extern void qemud_client_send ( QemudClient* client, const uint8_t* msg, int msglen ); 108 109 /* Force-close the connection to a given qemud client. 110 */ 111 extern void qemud_client_close( QemudClient* client ); 112 113 114 /* A function that will be called each time a new client in the emulated 115 * system tries to connect to a given qemud service. This should typically 116 * call qemud_client_new() to register a new client. 117 */ 118 typedef QemudClient* (*QemudServiceConnect)( void* opaque, 119 QemudService* service, 120 int channel, 121 const char* client_param ); 122 123 /* A function that will be called when the state of the service should be 124 * saved to a snapshot. 125 */ 126 typedef void (*QemudServiceSave) ( QEMUFile* f, QemudService* service, void* opaque ); 127 128 /* A function that will be called when the state of the service should be 129 * restored from a snapshot. 130 */ 131 typedef int (*QemudServiceLoad) ( QEMUFile* f, QemudService* service, void* opaque ); 132 133 /* Register a new qemud service. 134 * 'serv_opaque' is the first parameter to 'serv_connect' 135 */ 136 extern QemudService* qemud_service_register( const char* serviceName, 137 int max_clients, 138 void* serv_opaque, 139 QemudServiceConnect serv_connect, 140 QemudServiceSave serv_save, 141 QemudServiceLoad serv_load); 142 143 /* Sends a message to all clients of a given service. 144 */ 145 extern void qemud_service_broadcast( QemudService* sv, 146 const uint8_t* msg, 147 int msglen ); 148 149 #endif /* _android_qemud_h */ 150