Dela via


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 ProfileObservervi , som härleds från mip::Profile::Observeroch å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::promiseoch 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.