İşlevler

HIDL arayüzündeki işlevler, otomatik olarak oluşturulan IFoo C++ sınıf beyanı yöntemleriyle eşlenir. Her işlevin adı C++'ta aynı kalır. Aşağıdaki bölümlerde, HIDL bağımsız değişkenlerinin ve döndürülen değerlerin C++'ya nasıl çevrildiği açıklanmaktadır.

İşlev parametreleri

.hal dosyasında listelenen bağımsız değişkenler C++ veri türleriyle eşlenir. Basit bir C++ türüne eşlenmeyen bağımsız değişkenler, const referansıyla iletilir.

Döndürülen değeri olan (generates ifadesi bulunan) her HIDL işlevi için söz konusu işlevin C++ parametre listesinde ek bir bağımsız değişken bulunur: HIDL işlevinin döndürülen değerleriyle çağrılan bir geri çağırma işlevi. Bir istisna vardır: generates yan tümcesi doğrudan bir C++ ilkeliyle eşleşen tek bir parametre içeriyorsa geri çağırma atlama kullanılır (geri çağırma kaldırılır ve döndürülen değer normal bir return ifadesi aracılığıyla işlevden döndürülür).

İşlev döndürülen değerleri

Aşağıdaki işlevler döndürülen değerlere sahiptir.

Aktarım hataları ve döndürülen tür

generates ifadesi üç tür işlev imzasıyla sonuçlanabilir:

  • Yalnızca C++ ilkel olan tek bir döndürülen değer için generates döndürülen değeri, işlevden Return<T> nesnesinde değer olarak döndürülür.
  • Daha karmaşık durumlarda, generates dönüş değerleri, işlev çağrısıyla birlikte sağlanan geri çağırma parametresi aracılığıyla döndürülür ve işlev Return<void> döndürür.
  • generates ifadesi olmadığında işlev Return<void> değerini döndürür.

RPC çağrıları bazen aktarım hatalarıyla karşılaşabilir.Örneğin, sunucu kapandığında, aktarım kaynakları çağrıyı tamamlamak için yeterli olmadığında veya iletilen parametreler çağrının tamamlanmasına izin vermediğinde (ör. gerekli bir geri çağırma işlevi eksik olduğunda) aktarım hataları görülebilir. Return nesneleri, taşıma hatası göstergelerinin yanı sıra bir T değeri de depolar (Return<void> hariç).

İstemci tarafı ve sunucu tarafı işlevler aynı imzaya sahip olduğundan, sunucu tarafı işlev, uygulaması aktarım hatalarını işaret etmese bile bir Return türü döndürmelidir. Return<T> nesneleri Return(myTValue) ile oluşturulur (veya return ifadelerinde olduğu gibi mTValue ile dolaylı olarak oluşturulabilir) ve Return<void> nesneleri Void() ile oluşturulur.

Return<T> nesneleri, T değerlerinden kendi değerlerine ve kendi değerlerinden T değerlerine gizli dönüşümlere sahiptir. Return nesnesi, isOk() yöntemi çağrılarak aktarım hataları açısından kontrol edilebilir. Bu kontrol zorunlu değildir. Ancak bir hata meydana gelirse ve Return nesnesi yok edilene kadar kontrol edilmezse veya T değer dönüşümü denenirse istemci işlemi sonlandırılır ve bir hata günlüğe kaydedilir. isOk(), geliştirici kodundaki mantık hatasından (ör. nullptr'un senkron geri çağırma olarak iletilmesi) kaynaklanan bir aktarım hatası veya çağrı hatası gösteriyorsa günlük kaydına uygun bir dize döndürmek için Return nesnesinde description() çağrılabilir. Bu tür durumlarda, başarısız çağrı sonucunda sunucuda ne kadar kod çalıştırılmış olabileceğini belirlemek mümkün değildir. isDeadObject() yöntemi de sağlanır. Bu yöntem, !isOk() değerinin uzak nesnenin kilitlenmesi veya artık mevcut olmaması nedeniyle olduğunu belirtir. isDeadObject() her zaman !isOk() anlamına gelir.

Değere göre döndürme

generates ifadesi tek bir C++ ilkeliyle eşlenirse parametre listesinde geri çağırma parametresi bulunmaz. Bunun yerine, bir uygulama, T temel türünden dolaylı olarak oluşturulabilen Return<T> nesnesinde T döndürür. Örneğin:

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

Return<*>::withDefault yöntemi de sağlanır. Bu yöntem, döndürülen değerin !isOk() olduğu durumlarda bir değer sağlar. Bu yöntem, istemci işleminin sonlandırılmaması için iade nesnesini otomatik olarak "tamam" olarak da işaretler.

Geri çağırma parametresini kullanarak döndürme

Geri çağırma, HIDL işlevinin dönüş değerini arayana geri iletebilir. Geri çağırma işlevinin prototipi, C++ türleriyle eşlenen parametrelere (generates ifadesinden alınır) sahip bir std::function nesnesi. Döndürülen değeri geçersizdir. Geri çağırma işlevi bir değer döndürmez.

Geri çağırma parametresi olan bir C++ işlevinin dönüş değeri Return<void> türündedir. Sunucu uygulaması yalnızca döndürülen değeri sağlamaktan sorumludur. Dönüş değerleri zaten geri çağırma işlevi kullanılarak aktarıldığı için T şablon parametresi void'tür:

Return<void> someMethod(someMethod_cb _cb);

Sunucu uygulamaları, C++ uygulamalarından Void() döndürmelidir. Bu, Return<void> nesnesi döndüren statik bir satır içi işlevdir. Geri çağırma parametresi içeren tipik bir sunucu yöntemi uygulaması örneği:

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

Döndürülen değer içermeyen işlevler

generates ifadesi içermeyen bir işlevin C++ imzasında, parametre listesinde geri çağırma parametresi olmaz. Döndürülen türün Return<void>. olması gerekir.

Tek yönlü işlevler

oneway anahtar kelimesiyle işaretlenen işlevler, asenkron işlevlerdir (istemciler, işlevlerin yürütülmesini engellemez) ve döndürülen değere sahip değildir. oneway işlevinin C++ imzasında, parametre listesinde geri çağırma işlevi parametresi olmaz ve C++ döndürülen değeri Return<void> olur.