Las funciones de una interfaz HIDL se asignan a métodos en el
Declaración de la clase C++ IFoo
. El nombre de cada función sigue siendo el
lo mismo en C++; En las siguientes secciones, se describe cómo los argumentos HIDL y
los valores se traducen a C++.
Parámetros de la función
Los argumentos enumerados en el archivo .hal
se asignan a tipos de datos C++.
Los argumentos que no se asignan a un tipo primitivo de C++ se pasan por const.
referencia.
Por cada función HIDL que tiene un valor de retorno (tiene un generates
sentencia), la lista de parámetros de C++ para esa función tiene un argumento adicional:
una función de devolución de llamada que se llama con los valores de retorno de la función HIDL.
Hay una excepción: si la cláusula generates
contiene un parámetro único que se asigna directamente a una primitiva de C++, la devolución de llamada
Se usa elision (se quita la devolución de llamada y se muestra el valor
que muestra la función a través de una sentencia return
normal).
Valores que se devuelven de la función
Las siguientes funciones tienen valores que se muestran.
Errores de transporte y tipo de datos que se muestra
La sentencia generates
puede dar como resultado tres tipos de función
firmas:
- Si solo se muestra un valor de muestra que es un primitivo de C++, el
El valor que se muestra de
generates
es el valor que muestra la función en unReturn<T>
. - Para casos más complicados, los valores que se devuelven de
generates
son los siguientes: con el parámetro de devolución de llamada proporcionado con la propia llamada a función y la función muestraReturn<void>
. - Cuando no existe una sentencia
generates
, la función muestraReturn<void>
En ocasiones, las llamadas RPC pueden encontrar errores de transporte, p.ej., cuando el servidor
falle, cuando los recursos de transporte son insuficientes para completar la llamada o
los parámetros pasados no permiten completar la llamada (por ejemplo, si falta un
función de devolución de llamada requerida). Error de transporte del almacén de objetos Return
así como un valor T
(excepto
Return<void>
).
Como las funciones del cliente y del servidor tienen la misma firma, el
la función del servidor debe mostrar un tipo Return
a pesar de que su
no indica errores de transporte. Return<T>
Los objetos se construyen con Return(myTValue)
(o pueden
construido a partir de mTValue
, como en return
sentencias) y los objetos Return<void>
se construyen con
Void()
Return<T>
objetos tienen conversiones implícitas desde y hacia este.
su valor de T
. El objeto Return
se puede verificar
de transporte público llamando a su método isOk()
. Esta verificación no es
obligatorio; Sin embargo, si se produce un error y no se verifica en el momento en que
Se destruye el objeto Return
o se produce una conversión de valor T
el proceso del cliente se cerrará y se registrará un error. Si
isOk()
indica un error de transporte o una falla de llamada debido a una lógica.
en el código del desarrollador (por ejemplo, pasar nullptr
como una secuencia
devolución de llamada), se puede llamar a description()
en el objeto Return a
mostrar una cadena adecuada para el registro. En esos casos, no hay forma de
determinar la cantidad de código que se puede haber ejecutado en el servidor como resultado del
llamada fallida. También se proporciona el método isDeadObject()
. Esta
indica que !isOk()
se debe a que el objeto remoto tiene
falló o ya no existe. isDeadObject()
siempre implica
!isOk()
Devolución por valor
Si la sentencia generates
se asigna a un solo primitivo C++, no
el parámetro de devolución de llamada está en la lista de parámetros. En cambio, una implementación proporciona
el valor que se devuelve T
en un objeto Return<T>
, que
se puede generar de manera implícita a partir del tipo primitivo T
. Por ejemplo:
Return<uint32_t> someMethod() { uint32_t return_data = ...; // Compute return_data return return_data; };
También se proporciona el método Return<*>::withDefault
. Esta
proporciona un valor en casos en los que el valor que se muestra es !isOk()
.
Este método también marca automáticamente
el objeto devuelto como correcto para que el cliente
el proceso no se finalizará.
Muestra con un parámetro de devolución de llamada
Una devolución de llamada puede pasar el valor de retorno de la función HIDL al emisor.
El prototipo de la devolución de llamada es un objeto std::function
con
parámetros (tomados de la sentencia generates
) asignados a C++
de tipos de datos. El valor que se muestra es nulo, es decir, la devolución de llamada en sí no muestra un valor.
El valor de retorno de una función de C++ con un parámetro de devolución de llamada tiene tipo
Return<void>
La implementación del servidor es responsable únicamente
para proporcionar el valor de retorno. Como los valores de retorno ya se transfirieron
Si usas la devolución de llamada, el parámetro de la plantilla T
es void
:
Return<void> someMethod(someMethod_cb _cb);
Desde su implementación de C++, las implementaciones de servidor deben mostrar
Void()
, que es una función intercalada estática que muestra un
Return<void>
. Ejemplo de un método de servidor típico
con un parámetro de devolución de llamada:
Return<void> someMethod(someMethod_cb _cb) { // Do some processing, then call callback with return data hidl_vec<uint32_t> vec = ... _cb(vec); return Void(); };
Funciones sin valores de retorno
La firma C++ de una función sin una declaración generates
no tendrá un parámetro de devolución de llamada en la lista de parámetros. El tipo de datos que se muestra
ser Return<void>.
Funciones unidireccionales
Las funciones marcadas con la palabra clave oneway
son asíncronas
funciones (los clientes no se bloquearán en su ejecución) y no tendrán retorno
de salida. La firma C++ de una función oneway
no tendrá un
de devolución de llamada en la lista de parámetros, y su valor de retorno de C++ será
Return<void>