Home | History | Annotate | Download | only in android
      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