Microsoft Information Protection SDK – Princip-SDK-observatörer
Princip-SDK:et innehåller en observatörsklass. Observatörsmedlemmar är virtuella och bör åsidosättas för att hantera återanrop för asynkrona åtgärder.
När en asynkron åtgärd slutförs anropas medlemsfunktionen OnXxx()
som motsvarar resultatet. Exempel är OnLoadSuccess()
, OnLoadFailure()
och OnAddEngineSuccess()
för mip::Profile::Observer
.
Exemplen nedan visar promise/future-mönstret, som också används av SDK-exemplen, och kan utökas för att implementera önskat återanropsbeteende.
Implementering av profilobservatör
I följande exempel har vi skapat en klass som ProfileObserver
härleds från mip::Profile::Observer
. Medlemsfunktionerna har åsidosatts för att använda det framtids-/löftesmönster som används i exemplen.
Obs! Exemplen nedan är endast delvis implementerade och inkluderar inte åsidosättningar för de relaterade observatörerna mip::ProfileEngine
.
profile_observer.h
I rubriken definierar ProfileObserver
vi , som härleds från mip::Profile::Observer
och åsidosätter sedan var och en av medlemsfunktionerna.
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
I själva implementeringen definierar vi en åtgärd som ska vidtas för varje observatörsmedlemsfunktion.
Varje medlem accepterar två parametrar. Den första är en delad pekare till klassen som hanteras av funktionen. ProfileObserver::OnLoadSuccess
förväntar sig att få en mip::Profile
. ProfileObserver::OnAddEngineSuccess
förväntar sig mip::ProfileEngine
.
Den andra är en delad pekare till kontexten. I vår implementering är kontexten en referens till en std::promise
, som shared_ptr<void>
skickas som . Den första raden i funktionen omvandlar detta till std::promise
och lagras sedan i ett objekt med namnet promise
.
Slutligen är framtiden klar genom att ange promise->set_value()
och skicka objektet mip::Profile
.
#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
När du utför en asynkron åtgärd skickas observatörsimplementeringen till själva inställningskonstruktorn eller asynkrona funktionen.