blob: 6a2cc660da60aa049d72184e39a6664b7f02c0c0 [file] [log] [blame]
/* Copyright (C) 2007-2008 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.
*/
#ifndef _android_qemud_h
#define _android_qemud_h
#include "qemu-common.h"
/* Support for the qemud-based 'services' in the emulator.
* Please read docs/ANDROID-QEMUD.TXT to understand what this is about.
*/
/* initialize the qemud support code in the emulator
*/
extern void android_qemud_init( void );
/* return the character driver state object that needs to be connected to the
* emulated serial port where all multiplexed channels go through.
*/
extern CharDriverState* android_qemud_get_cs( void );
/* returns in '*pcs' a CharDriverState object that will be connected to
* a single client in the emulated system for a given named service.
*
* this is only used to connect GPS and GSM service clients to the
* implementation that requires a CharDriverState object for legacy
* reasons.
*
* returns 0 on success, or -1 in case of error
*/
extern int android_qemud_get_channel( const char* name, CharDriverState* *pcs );
/* set an explicit CharDriverState object for a given qemud communication channel. this
* is used to attach the channel to an external char driver device (e.g. one
* created with "-serial <device>") directly.
*
* returns 0 on success, -1 on error
*/
extern int android_qemud_set_channel( const char* name, CharDriverState* peer_cs );
/* list of known qemud channel names */
#define ANDROID_QEMUD_GSM "gsm"
#define ANDROID_QEMUD_GPS "gps"
#define ANDROID_QEMUD_CONTROL "control"
#define ANDROID_QEMUD_SENSORS "sensors"
/* A QemudService service is used to connect one or more clients to
* a given emulator facility. Only one client can be connected at any
* given time, but the connection can be closed periodically.
*/
typedef struct QemudClient QemudClient;
typedef struct QemudService QemudService;
/* A function that will be called when the client running in the emulated
* system has closed its connection to qemud.
*/
typedef void (*QemudClientClose)( void* opaque );
/* A function that will be called when the client sends a message to the
* service through qemud.
*/
typedef void (*QemudClientRecv) ( void* opaque, uint8_t* msg, int msglen, QemudClient* client );
/* A function that will be called when the state of the client should be
* saved to a snapshot.
*/
typedef void (*QemudClientSave) ( QEMUFile* f, QemudClient* client, void* opaque );
/* A function that will be called when the state of the client should be
* restored from a snapshot.
*/
typedef int (*QemudClientLoad) ( QEMUFile* f, QemudClient* client, void* opaque );
/* Register a new client for a given service.
* 'clie_opaque' will be sent as the first argument to 'clie_recv' and 'clie_close'
* 'clie_recv' and 'clie_close' are both optional and may be NULL.
*
* You should typically use this function within a QemudServiceConnect callback
* (see below).
*/
extern QemudClient* qemud_client_new( QemudService* service,
int channel_id,
const char* client_param,
void* clie_opaque,
QemudClientRecv clie_recv,
QemudClientClose clie_close,
QemudClientSave clie_save,
QemudClientLoad clie_load );
/* Enable framing on a given client channel.
*/
extern void qemud_client_set_framing( QemudClient* client, int enabled );
/* Send a message to a given qemud client
*/
extern void qemud_client_send ( QemudClient* client, const uint8_t* msg, int msglen );
/* Force-close the connection to a given qemud client.
*/
extern void qemud_client_close( QemudClient* client );
/* A function that will be called each time a new client in the emulated
* system tries to connect to a given qemud service. This should typically
* call qemud_client_new() to register a new client.
*/
typedef QemudClient* (*QemudServiceConnect)( void* opaque,
QemudService* service,
int channel,
const char* client_param );
/* A function that will be called when the state of the service should be
* saved to a snapshot.
*/
typedef void (*QemudServiceSave) ( QEMUFile* f, QemudService* service, void* opaque );
/* A function that will be called when the state of the service should be
* restored from a snapshot.
*/
typedef int (*QemudServiceLoad) ( QEMUFile* f, QemudService* service, void* opaque );
/* Register a new qemud service.
* 'serv_opaque' is the first parameter to 'serv_connect'
*/
extern QemudService* qemud_service_register( const char* serviceName,
int max_clients,
void* serv_opaque,
QemudServiceConnect serv_connect,
QemudServiceSave serv_save,
QemudServiceLoad serv_load);
/* Sends a message to all clients of a given service.
*/
extern void qemud_service_broadcast( QemudService* sv,
const uint8_t* msg,
int msglen );
#endif /* _android_qemud_h */