Funkcje w interfejsie HIDL są zmapowane na metody w automatycznie generowanym
IFoo
deklaracja klasy C++. Nazwa każdej funkcji pozostaje ciągiem
tak samo w C++, w kolejnych sekcjach opisano sposób, w jaki argumenty i zwroty HIDL
są przetłumaczone na język C++.
Parametry funkcji
Argumenty wymienione w pliku .hal
są mapowane na typy danych w języku C++.
Argumenty, które nie są mapowane na podstawowy typ C++, są przekazywane przez stałą
odwołania.
Dla każdej funkcji HIDL, która ma wartość zwracaną (ma generates
instrukcja), lista parametrów C++ dla tej funkcji zawiera dodatkowy argument:
funkcja wywołania zwrotnego, która jest wywoływana z zwracanymi wartościami funkcji HIDL.
Jest jeden wyjątek: jeśli klauzula generates
zawiera pojedynczy parametr, który jest mapowany bezpośrednio na podstawowy element C++ z wywołaniem zwrotnym
jest używany elision (wywołanie zwrotne jest usuwane, a zwracana wartość to
zwracanych z funkcji przez normalną instrukcję return
).
Funkcja zwraca wartości
Te funkcje zwracają wartości.
Błędy transportu i typ zwrotu
Instrukcja generates
może skutkować 3 typami funkcji
podpisy:
- W przypadku tylko jednej zwracanej wartości, która jest podstawowym obiektem C++, para klucz-wartość
Zwracana wartość
generates
jest zwracana przez wartość z funkcji w argumencieReturn<T>
obiekt. - W bardziej skomplikowanych przypadkach wartości zwracane przez funkcję
generates
to: zwracanych przez parametr wywołania zwrotnego dostarczony z własnym wywołaniem funkcji, , a funkcja zwracaReturn<void>
. - Jeśli nie ma instrukcji
generates
, funkcja zwracaReturn<void>
Wywołania RPC mogą czasami napotkać błędy transportu, np. gdy serwer
umiera, gdy zasoby transportowe są niewystarczające, aby wykonać połączenie,
przekazywane parametry nie pozwalają na zakończenie wywołania (np. brak
wymaganej funkcji wywołania zwrotnego). Błąd transportu w magazynie Return
obiektów
oraz wartości T
(z wyjątkiem
Return<void>
).
Ponieważ funkcje po stronie klienta i po stronie serwera mają ten sam podpis,
funkcja po stronie serwera musi zwrócić typ Return
, mimo że jego
nie sygnalizuje błędów transportu. Return<T>
obiekty są tworzone za pomocą funkcji Return(myTValue)
(lub mogą być niejawnie
utworzono na podstawie mTValue
, na przykład w return
instrukcji), a obiekty Return<void>
są zbudowane za pomocą
Void()
.
Return<T>
obiektu ma domyślną konwersję z i do
ich wartość T
. Można sprawdzić obiekt Return
pod kątem:
przez wywołanie metody isOk()
. Ta weryfikacja nie jest
wymagane; jeśli jednak wystąpi błąd i nie zostanie sprawdzony przed
Obiekt Return
został zniszczony lub konwersja o wartości T
podjęta zostanie próba wykonania polecenia przez klienta, proces klienta zostanie zatrzymany, a błąd zostanie zarejestrowany. Jeśli
isOk()
oznacza błąd transportu lub niepowodzenie połączenia spowodowane logiką.
w kodzie programisty (np. przez przekazanie elementu nullptr
jako synchronicznej).
wywołanie zwrotne), należy wywołać metodę description()
dla obiektu Return do
zwraca ciąg odpowiedni do logowania. W takich przypadkach nie ma możliwości
określać, ile kodu mogło zostać wykonane na serwerze w wyniku
nieudane połączenie. Dostępna jest także metoda isDeadObject()
. Ten
wskazuje, że !isOk()
, ponieważ obiekt zdalny
uległ awarii lub już nie istnieje. isDeadObject()
zawsze zakłada
!isOk()
Zwracanie według wartości
Jeśli instrukcja generates
jest mapowana na pojedynczy obiekt podstawowy C++, nie
parametr wywołania zwrotnego jest na liście parametrów. Zamiast tego implementacja zapewnia
zwracaną wartość T
w obiekcie Return<T>
, która
można ją wygenerować niejawnie na podstawie typu podstawowego T
. Dla:
przykład:
Return<uint32_t> someMethod() { uint32_t return_data = ...; // Compute return_data return return_data; };
Dostępna jest także metoda Return<*>::withDefault
. Ten
podaje wartość w przypadkach, gdy zwrócona wartość wynosi !isOk()
.
Ta metoda automatycznie oznacza również zwracany obiekt jako „w porządku”, dzięki czemu klient
nie zakończy się.
Zwróć z użyciem parametru wywołania zwrotnego
Wywołanie zwrotne może przekazać wartość zwrotną funkcji HIDL z powrotem do elementu wywołującego.
Prototypowym wywołaniem zwrotnym jest obiekt std::function
z parametrem
parametry (pobrane z instrukcji generates
) zmapowane na język C++
. Jego zwrócona wartość jest nieważna – samo wywołanie zwrotne nie zwraca żadnej wartości.
Wartość zwrotna funkcji C++ z parametrem wywołania zwrotnego ma typ
Return<void>
Wdrożenie serwera odpowiada wyłącznie
. Ponieważ zwracane wartości zostały już przeniesione
za pomocą wywołania zwrotnego parametr szablonu T
ma wartość void
:
Return<void> someMethod(someMethod_cb _cb);
Po implementacji w języku C++ implementacje serwera powinny zwracać
Void()
, czyli statyczną funkcję wbudowaną zwracającą
Return<void>
obiekt. Przykład typowej metody serwerowej
implementacja z parametrem wywołania zwrotnego:
Return<void> someMethod(someMethod_cb _cb) { // Do some processing, then call callback with return data hidl_vec<uint32_t> vec = ... _cb(vec); return Void(); };
Funkcje bez zwracanych wartości
Podpis w C++ funkcji bez instrukcji generates
nie będzie zawierać parametru wywołania zwrotnego. Jego zwracany typ będzie
być Return<void>.
Funkcje jednokierunkowe
Funkcje oznaczone słowem kluczowym oneway
są asynchroniczne
funkcji (klienci nie będą blokować ich wykonania) i nie mają zwracanych
. Podpis funkcji oneway
w C++ nie będzie zawierał prefiksu
wywołania zwrotnego na liście parametrów, a jego wartością zwrotną w języku C++ będzie
Return<void>