Fonctions

Dans une interface HIDL, les fonctions sont mappées à des méthodes dans l'interface générée automatiquement Déclaration de la classe C++ IFoo. Le nom de chaque fonction reste Il en va de même en C++. les sections suivantes décrivent comment les arguments HIDL et renvoient les valeurs sont traduites en C++.

Paramètres de la fonction

Les arguments répertoriés dans le fichier .hal correspondent aux types de données C++. La constante const transmet les arguments qui ne correspondent pas à un type C++ primitif référence.

Pour chaque fonction HIDL ayant une valeur renvoyée (avec un generates ), la liste de paramètres C++ pour cette fonction comporte un argument supplémentaire: Une fonction de rappel qui est appelée avec les valeurs renvoyées par la fonction HIDL Il existe une exception: si la clause generates contient un seul paramètre qui est directement mappé à une primitive C++, un rappel La méthode elision est utilisée (le rappel est supprimé et la valeur renvoyée est renvoyé par la fonction via une instruction return normale).

Valeurs renvoyées par la fonction

Les fonctions suivantes ont des valeurs renvoyées.

Erreurs de transport et type renvoyé

L'instruction generates peut donner trois types de fonctions signatures:

  • Pour une seule valeur renvoyée, à savoir une primitive C++, le La valeur renvoyée generates est renvoyée par la valeur de la fonction dans une Return<T>.
  • Dans les cas plus complexes, la ou les valeurs renvoyées generates sont les suivantes : renvoyé via le paramètre de rappel fourni avec l'appel de fonction lui-même ; et la fonction renvoie Return<void>.
  • Si aucune instruction generates n'existe, la fonction renvoie Return<void>

Les appels RPC peuvent parfois rencontrer des erreurs de transport, par exemple lorsque le serveur lorsque les ressources de transport sont insuffisantes pour effectuer l'appel, ou lorsque les paramètres transmis ne permettent pas de terminer l'appel (par exemple, l'absence d'un fonction de rappel requise). Erreur de transport pour le magasin d'objets Return d'instructions, ainsi qu'une valeur T (sauf Return<void>).

Étant donné que les fonctions côté client et côté serveur ont la même signature, la fonction côté serveur doit renvoyer un type Return même si son ne signale aucune erreur de transport. Return<T> objets sont construits avec Return(myTValue) (ou peuvent être implicitement construit à partir de mTValue, comme dans return ) et les objets Return<void> sont construits avec Void()

Les objets Return<T> ont une conversion implicite vers et depuis leur valeur T. Vous pouvez vérifier l'objet Return les erreurs de transport en appelant sa méthode isOk(). Cette vérification n'est pas obligatoire ; Toutefois, si une erreur se produit et qu'elle n'est pas vérifiée au moment où L'objet Return est détruit, ou une conversion de la valeur T est le processus client sera arrêté et une erreur sera consignée. Si isOk() indique une erreur de transport ou un échec d'appel dû à une logique. erreur dans le code du développeur (par exemple, la transmission de nullptr en tant que ), alors description() peut être appelé sur l'objet Return pour renvoyer une chaîne adaptée à la journalisation. Dans ce cas, il n’y a aucun moyen de déterminer la quantité de code qui a pu être exécutée sur le serveur suite à échec de l'appel. La méthode isDeadObject() est également fournie. Ce indique que !isOk() est dû au fait que l'objet distant a a planté ou n'existe plus. isDeadObject() implique toujours !isOk()

Renvoi par valeur

Si l'instruction generates correspond à une seule primitive C++, aucune de rappel se trouve dans la liste des paramètres. À la place, une implémentation fournit la valeur renvoyée T dans un objet Return<T>, qui peuvent être générées implicitement à partir du type primitif T. Exemple :

Return<uint32_t> someMethod() {
    uint32_t return_data = ...; // Compute return_data
    return return_data;
};

La méthode Return<*>::withDefault est également fournie. Ce fournit une valeur dans les cas où la valeur renvoyée est !isOk(). Cette méthode marque aussi automatiquement l'objet renvoyé comme correct afin que le client ne sera pas arrêté.

Retourner à l'aide du paramètre de rappel

Un rappel peut renvoyer la valeur renvoyée par la fonction HIDL à l'appelant. Le prototype du rappel est un objet std::function avec Paramètres (issus de l'instruction generates) mappés en C++ de données. Sa valeur renvoyée est nulle : le rappel lui-même ne renvoie pas de valeur.

La valeur renvoyée par une fonction C++ avec un paramètre de rappel a le type Return<void> La mise en œuvre du serveur n'est responsable que pour fournir la valeur renvoyée. Comme les valeurs de retour sont déjà transférées Avec le rappel, le paramètre de modèle T est void:

Return<void> someMethod(someMethod_cb _cb);

À partir de leur implémentation C++, les implémentations de serveur doivent renvoyer Void(), qui est une fonction intégrée statique renvoyant une Return<void>. Exemple de méthode de serveur type avec un paramètre de rappel:

Return<void> someMethod(someMethod_cb _cb) {
    // Do some processing, then call callback with return data
    hidl_vec<uint32_t> vec = ...
    _cb(vec);
    return Void();
};

Fonctions sans valeurs renvoyées

Signature C++ d'une fonction sans instruction generates ne comportera pas de paramètre de rappel dans la liste des paramètres. Son type renvoyé Être Return<void>.

Fonctions unidirectionnelles

Les fonctions comportant le mot clé oneway sont asynchrones (les clients ne bloquent pas leur exécution) et n'ont pas de fonction valeurs. La signature C++ d'une fonction oneway n'a pas de de rappel dans la liste des paramètres, et sa valeur renvoyée C++ sera Return<void>