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.