Funciones

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 un Return<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 muestra Return<void>.
  • Cuando no existe una sentencia generates, la función muestra Return<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>