As funções em uma interface HIDL são mapeadas para métodos na interface HIDL
Declaração de classe C++ IFoo
. O nome de cada função permanece o
o mesmo em C++. as seções a seguir descrevem como argumentos HIDL e retornam
são convertidos em C++.
Parâmetros de função
Os argumentos listados no arquivo .hal
são mapeados para os tipos de dados C++.
Argumentos que não mapeiam para um tipo C++ primitivo são passados por const
de referência.
Para cada função HIDL que tem um valor de retorno (tem um generates
)
a lista de parâmetros C++ dessa função tem um argumento adicional:
uma função de retorno de chamada que é chamada com os valores de retorno da função HIDL.
Há uma exceção: se a cláusula generates
contém um único parâmetro que mapeia diretamente para um primitivo de C++, callback
elision é usado (o retorno de chamada é removido e o valor de retorno é
retornados da função usando uma instrução return
normal).
Valores de retorno da função
As funções a seguir têm valores de retorno.
Erros de transporte e tipo de retorno
A instrução generates
pode resultar em três tipos de função
assinaturas:
- Para apenas um valor de retorno que é um primitivo C++, a função
O valor de retorno
generates
é retornado pelo valor da função em uma objetoReturn<T>
. - Para casos mais complicados, os valores de retorno de
generates
são retornado por meio do parâmetro de callback fornecido com a própria chamada de função, e a função retornaReturn<void>
. - Quando não houver instrução
generates
, a função retornaráReturn<void>
.
Às vezes, chamadas RPC podem encontrar erros de transporte, por exemplo, quando o servidor
falha, quando os recursos de transporte são insuficientes para completar a chamada ou quando
os parâmetros passados não permitem completar a chamada (como perder um
função de callback necessária). Erro de transporte do armazenamento de Return
objetos
indicações, bem como um valor T
(exceto
Return<void>
).
Como as funções do lado do cliente e do servidor têm a mesma assinatura, a
a função do lado do servidor precisa retornar um tipo Return
, mesmo que
não indica erros de transporte. Return<T>
objetos são construídos com Return(myTValue)
(ou podem ser implicitamente
construído com base em mTValue
, como em return
instruções) e os objetos Return<void>
são construídos com
Void()
.
Objetos Return<T>
têm conversão implícita de e para
o valor de T
. É possível verificar se o objeto Return
erros de transporte chamando o método isOk()
. Essa verificação não é
obrigatório No entanto, se ocorrer um erro e não for verificado no momento
O objeto Return
é destruído ou uma conversão de valor T
é
o processo do cliente será encerrado e um erro será registrado. Se
isOk()
indica um erro de transporte ou uma falha na chamada devido a uma lógica
erro no código do desenvolvedor (por exemplo, transmitir nullptr
como um
callback), description()
poderá ser chamado no objeto Return para
retornam uma string adequada para a geração de registros. Nesses casos, não é possível
determinar a quantidade de código que pode ter sido executada no servidor como resultado da
falhou. O método isDeadObject()
também é fornecido. Isso
indica que !isOk()
ocorre porque o objeto remoto tem
falhou ou não existe mais. isDeadObject()
sempre implica
!isOk()
.
Retorno por valor
Se a instrução generates
mapear para um único primitivo C++, nenhuma
callback está na lista de parâmetros. Em vez disso, uma implementação fornece
o valor de retorno T
em um objeto Return<T>
, que
pode ser gerado implicitamente a partir do tipo primitivo T
. Por
exemplo:
Return<uint32_t> someMethod() { uint32_t return_data = ...; // Compute return_data return return_data; };
O método Return<*>::withDefault
também é fornecido. Isso
fornece um valor nos casos em que o valor de retorno é !isOk()
.
Esse método também marca automaticamente o objeto de retorno como correto, para que o cliente
processo não será encerrado.
Retorne usando o parâmetro de callback
Um callback pode retornar o valor de retorno da função HIDL ao autor da chamada.
O protótipo do callback é um objeto std::function
com
parâmetros (retirados da instrução generates
) mapeados para C++
tipos Seu valor de retorno é nulo, ou seja, o próprio callback não retorna um valor.
O valor de retorno de uma função C++ com um parâmetro de callback tem tipo
Return<void>
: A implementação do servidor é responsável apenas
por fornecer o valor de retorno. Como os valores de retorno já foram transferidos
Usando o callback, o parâmetro do modelo T
será void
:
Return<void> someMethod(someMethod_cb _cb);
A partir da implementação em C++, as implementações do servidor precisam retornar
Void()
, que é uma função inline estática que retorna um
objeto Return<void>
. Exemplo de um método de servidor típico
com um parâmetro de callback:
Return<void> someMethod(someMethod_cb _cb) { // Do some processing, then call callback with return data hidl_vec<uint32_t> vec = ... _cb(vec); return Void(); };
Funções sem valores de retorno
A assinatura C++ de uma função sem uma instrução generates
não terá um parâmetro de callback na lista de parâmetros. Seu tipo de retorno
ser Return<void>.
Funções de ida
As funções marcadas com a palavra-chave oneway
são assíncronas
(os clientes não bloquearão sua execução) e não terão retorno
e a distribuição dos valores dos dados. A assinatura C++ de uma função oneway
não terá uma
callback na lista de parâmetros, e seu valor de retorno C++ será
Return<void>
.