zestaw SDK Microsoft Information Protection — obserwatorzy zestawu SDK zasad

Zestaw SDK zasad zawiera jedną klasę klasy klasowej. Elementy składowe są wirtualne i powinny zostać zastąpione, aby obsługiwać wywołania zwrotne w przypadku asynchronicznych operacji.

Po zakończeniu asynchronicznej operacji jest wywoływana funkcja członkowski OnXxx() odpowiadająca wynikowi. Przykłady OnLoadSuccess() to : , i dla OnLoadFailure()OnAddEngineSuccess()mip::Profile::Observer .

Poniższe przykłady ilustrują wzorzec obietnicy/przyszłości, który jest również używany w przykładach SDK i można go rozszerzyć, aby zaimplementować odpowiednie zachowanie wywołania zwrotnego.

Implementacja profilu

W poniższym przykładzie utworzono klasę, która ProfileObserver pochodzi z mip::Profile::Observer . Funkcje członków zostały zastąpione, aby używać wzorca przyszłej/obietnicy stosowanego w próbkach.

Uwaga:Poniższe przykłady są zaimplementowane tylko częściowo i nie obejmują zastępowania powiązanych obserwatorów.

profile_observer.h

W nagłówku definiujemy , pochodny , a następnie ProfileObservermip::Profile::Observer zastępujemy wszystkie funkcje członkowskie.

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

W samej implementacji definiujemy akcję do podjęcia dla każdej pełniejszej funkcji członka.

Każdy członek akceptuje dwa parametry. Pierwszy z nich to udostępniony wskaźnik dla zajęć obsługiwanych przez funkcję. ProfileObserver::OnLoadSuccess spodziewalibyśmy się otrzymać mip::Profile . ProfileObserver::OnAddEngineSuccess można by się mip::ProfileEngine spodziewać.

Drugi to udostępniony wskaźnik kontekstu . W naszej implementacji kontekst jest odwołaniem do std::promise , przekazywane jako shared_ptr<void> . Pierwszy wiersz funkcji rzutuje na , a następnie std::promise przechowywany w obiekcie o nazwie promise .

Na koniec przyszłość jest gotowa przez ustawienie promise->set_value() i przejście w mip::Profile obiekcie.

#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

Podczas wykonywania dowolnych asynchronicznych operacji implementacja konstruktora ustawień jest przekazywana do samej konstruktora ustawień lub funkcji synchronizacji.