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 uneReturn<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 renvoieReturn<void>
. - Si aucune instruction
generates
n'existe, la fonction renvoieReturn<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>