Funções

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 objeto Return<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 retorna Return<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>.