Funkcje

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 argumencie Return<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 zwraca Return<void>.
  • Jeśli nie ma instrukcji generates, funkcja zwraca Return<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>