Microsoft Information Protection SDK – Skydds-SDK-observatörer

Skydds-SDK:et innehåller tre observatörsklasser. Du kan åsidosätta virtuella observatörsmedlemmar för att hantera återanrop för asynkrona åtgärder.

När en asynkron åtgärd slutförs anropar SDK medlemsfunktionen OnXxx() som motsvarar resultatet. Exempel är OnLoadSuccess(), OnLoadFailure()och OnAddEngineSuccess() för mip::ProtectionProfile::Observer.

Följande exempel visar mönstret för löfte/framtid. SDK-exemplen använder också det här mönstret, och du kan utöka det för att implementera önskat återanropsbeteende.

implementering av ProtectionProfile-observatör

I följande exempel skapas en klass, ProtectionProfileObserverImpl, som härleds från mip::ProtectionProfile::Observer. Medlemsfunktionerna åsidosätter basklassen för att använda det promise/future-mönster som används i exemplen.

ProtectionProfileObserverImpl-klassdeklaration

Rubriken definierar ProtectionProfileObserverImpl, härleder den från mip::ProtectionProfile::Observeroch åsidosätter sedan var och en av medlemsfunktionerna.

//ProtectionProfileObserverImpl.h
class ProtectionProfileObserverImpl final : public mip::ProtectionProfile::Observer {
public:
  ProtectionProfileObserverImpl() { }
  void OnLoadSuccess(const shared_ptr<mip::ProtectionProfile>& profile, const shared_ptr<void>& context) override;
  void OnLoadFailure(const exception_ptr& error, const shared_ptr<void>& context) override;
  void OnAddEngineSuccess(const shared_ptr<mip::ProtectionEngine>& engine, const shared_ptr<void>& context) override;
  void OnAddEngineFailure(const exception_ptr& error, const shared_ptr<void>& context) override;
};

implementering av ProtectionProfileObserverImpl

Implementeringen definierar 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 funktionen hanterar. ProtectionObserver::OnLoadSuccess förväntar sig att få en mip::ProtectionProfile. ProtectionObserver::OnAddEngineSuccess förväntar sig mip::ProtectionEngine.

Den andra är en delad pekare till kontexten. I den här implementeringen är kontexten en referens till en std::promise, som skickas in som shared_ptr<void>. Den första raden i funktionen omvandlar det här värdet till std::promiseoch lagrar det sedan i ett objekt med namnet promise.

Slutligen gör koden framtiden redo genom att ange promise->set_value() och skicka objektet mip::ProtectionProfile .

//protection_observers.cpp

void ProtectionProfileObserverImpl::OnLoadSuccess(
  const shared_ptr<mip::ProtectionProfile>& profile,
  const shared_ptr<void>& context) {
  auto loadPromise = static_cast<promise<shared_ptr<mip::ProtectionProfile>>*>(context.get());
  loadPromise->set_value(profile);
};

void ProtectionProfileObserverImpl::OnLoadFailure(const exception_ptr& error, const shared_ptr<void>& context) {
  auto loadPromise = static_cast<promise<shared_ptr<mip::ProtectionProfile>>*>(context.get());
  loadPromise->set_exception(error);
};

void ProtectionProfileObserverImpl::OnAddEngineSuccess(
  const shared_ptr<mip::ProtectionEngine>& engine,
  const shared_ptr<void>& context) {
  auto addEnginePromise = static_cast<promise<shared_ptr<mip::ProtectionEngine>>*>(context.get());
  addEnginePromise->set_value(engine);
};

void ProtectionProfileObserverImpl::OnAddEngineFailure(
  const exception_ptr& error,
  const shared_ptr<void>& context) {
  auto addEnginePromise = static_cast<promise<shared_ptr<mip::ProtectionEngine>>*>(context.get());
  addEnginePromise->set_exception(error);
};

När du instansierar någon SDK-klass eller använder en funktion som utför asynkrona åtgärder skickar du observer-implementeringen till själva inställningskonstruktorn eller asynkron funktion. När du instansierar objektet mip::ProtectionProfile::Observer tar konstruktorn emot mip::ProtectionProfile::Settings som en av parametrarna. Följande exempel visar den anpassade ProtectionProfileObserverImpl, som används i en mip::ProtectionProfile::Settings-konstruktor.

ProtectionHandler observatörsimplementering

Precis som skyddsobservatören mip::ProtectionHandler implementerar en mip::ProtectionHandler::Observer klass för hantering av asynkrona händelseaviseringar under skyddsåtgärder. Implementeringen liknar den föregående implementeringen. I följande exempel definieras ProtectionHandlerObserverImpldelvis . Den fullständiga implementeringen finns i GitHub exempellagringsplats.

klassdeklarationen för ProtectionHandlerObserverImpl

//protection_observers.h

class ProtectionHandlerObserverImpl final : public mip::ProtectionHandler::Observer {
public:
  ProtectionHandlerObserverImpl() { }
  void OnCreateProtectionHandlerSuccess(const shared_ptr<mip::ProtectionHandler>& protectionHandler, const shared_ptr<void>& context) override;
  void OnCreateProtectionHandlerFailure(const exception_ptr& error, const shared_ptr<void>& context) override;
};

Partiell implementering av ProtectionHandlerObserverImpl

Det här exemplet innehåller bara de två första funktionerna, men de återstående funktionerna använder ett liknande mönster som dessa funktioner och till ProtectionObserver.

//protection_observers.cpp

void ProtectionHandlerObserverImpl::OnCreateProtectionHandlerSuccess(
  const shared_ptr<mip::ProtectionHandler>& protectionHandler,
  const shared_ptr<void>& context) {
  auto createProtectionHandlerPromise = static_cast<promise<shared_ptr<mip::ProtectionHandler>>*>(context.get());
  createProtectionHandlerPromise->set_value(protectionHandler);
};

void ProtectionHandlerObserverImpl::OnCreateProtectionHandlerFailure(
  const exception_ptr& error,
  const shared_ptr<void>& context) {
  auto createProtectionHandlerPromise = static_cast<promise<shared_ptr<mip::ProtectionHandler>>*>(context.get());
  createProtectionHandlerPromise->set_exception(error);
};

Nästa steg