Microsoft Information Protection SDK - İlke SDK Gözlemcileri

İlke SDK'sı bir gözlemci sınıfı içerir. Gözlemci üyeleri sanaldır ve eşzamansız işlemlere yönelik geri çağrıları işlemek için geçersiz kılınmalıdır.

Zaman uyumsuz bir işlem tamamlandığında, OnXxx() sonuca karşılık gelen üye işlevi çağrılır. mip::Profile::Observer için örnekler OnLoadSuccess(), OnLoadFailure() ve OnAddEngineSuccess()'dir.

Aşağıdaki örneklerde, SDK örnekleri tarafından da kullanılan ve istenen geri çağırma davranışını uygulamak için genişletilebilen promise/future deseni gösterilmektedir.

Profil Gözlemcisi Uygulaması

Aşağıdaki örnekte, mip::Profile::Observer sınıfından türetilen ProfileObserver adlı bir sınıf oluşturduk. Örneklerde kullanılan future/promise desenini kullanmak için üye işlevleri geçersiz kılındı.

Not: Aşağıdaki örnekler yalnızca kısmen uygulanır ve ilgili gözlemciler için mip::ProfileEngine geçersiz kılmalar içermez.

profile_observer.h

Başlık dosyasında, mip::Profile::Observer öğesinden türeyen ProfileObserver öğesini tanımlar, ardından üye işlevlerinin her birini geçersiz kılarız.

class ProfileObserver final : public mip::Profile::Observer {
public:
ProfileObserver() { }
  void OnLoadSuccess(const std::shared_ptr<mip::Profile>& profile, const std::shared_ptr<void>& context) override;
  void OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) override;
  //TODO: Implement remaining members
};

profile_observer.cpp

Uygulamanın kendisinde, her gözlemci üye işlevi için gerçekleştirecek bir eylem tanımlarız.

Her üye iki parametre kabul eder. Birincisi, işlevin işlediği sınıfı gösteren paylaşılan işaretçidir. ProfileObserver::OnLoadSuccess, bir mip::Profile almayı bekler. ProfileObserver::OnAddEngineSuccess beklerdi mip::ProfileEngine.

İkincisi, bağlama ilişkin paylaşılan bir işaretçidir. Uygulamamızda bağlam, shared_ptr<void> olarak iletilen bir std::promise öğesine referanstır. Fonksiyonun ilk satırı this'i std::promise türüne dönüştürür, ardından bunu promise adlı bir nesnede depolar.

Son olarak, promise->set_value() ayarlanıp mip::Profile nesnesi geçirilerek future hazır duruma getirilir.

#include "profile_observer.h"
#include <future>

//Called when Profile is successfully loaded
void ProfileObserver::OnLoadSuccess(const std::shared_ptr<mip::Profile>& profile, const std::shared_ptr<void>& context) {
  //cast context to promise
  auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::Profile>>>(context);
  //set promise value to profile
  promise->set_value(profile);
}

//Called when Profile fails to load
void ProfileObserver::OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) {
  auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::Profile>>>(context);
  promise->set_exception(error);
}

//TODO: Implement remaining observer members

Herhangi bir eşzamansız işlem gerçekleştirilirken gözlemci gerçekleştirim(i), ayar oluşturucusuna veya eşzamansız işlevin kendisine aktarılır.