Delen via


Microsoft Information Protection SDK - Protection SDK-monitoren

De Protection SDK bevat drie waarnemerklassen. Observer-leden zijn virtueel en kunnen worden overschreven om callbacks voor asynchrone operaties af te handelen.

Wanneer een asynchrone bewerking is voltooid, wordt de OnXxx() lidfunctie die overeenkomt met het resultaat aangeroepen. Voorbeelden zijn OnLoadSuccess(), OnLoadFailure()en OnAddEngineSuccess() voor mip::ProtectionProfile::Observer.

In de onderstaande voorbeelden ziet u het promise/future-patroon, dat ook wordt gebruikt door de SDK-voorbeelden en kan worden uitgebreid om het gewenste callbackgedrag te implementeren.

Implementatie van ProtectionProfile Observer

In het volgende voorbeeld hebben we een klasse gemaakt die ProtectionProfileObserverImpl is afgeleid van mip::ProtectionProfile::Observer. De ledemaatfuncties zijn overschreven om het promise/future-patroon te gebruiken dat in de voorbeelden wordt gehanteerd.

Declaratie van klasse ProtectionProfileObserverImpl

In de koptekst definiëren we ProtectionProfileObserverImpl, afgeleid van mip::ProtectionProfile::Observer, en overschrijven we vervolgens elk van de lidfuncties.

//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 OnAddEngineError(const exception_ptr& error, const shared_ptr<void>& context) override;
};

ProtectionProfileObserverImpl-implementatie

In de implementatie zelf definiëren we gewoon een actie die moet worden ondernomen voor elke waarnemersfunctie.

Elk lid accepteert twee parameters. De eerste is een gedeelde aanwijzer naar de klasse die we in de functie verwerken. ProtectionObserver::OnLoadSuccess zou een mip::ProtectionProtection verwachten, ProtectionObserver::OnAddEngineSuccess zou mip::ProtectionEngine verwachten.

De tweede is een gedeelde aanwijzer naar de context. In onze implementatie is de context een verwijzing naar een std::promise, doorgegeven als shared_ptr<void>. De eerste regel van de functie cast dit naar std::promise, waarna het wordt opgeslagen in een object genaamd promise.

Ten slotte wordt de toekomst gereed gemaakt door het promise->set_value() object in te stellen en het mip::ProtectionProtection object door te geven.

//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::OnAddEngineError(
  const exception_ptr& error,
  const shared_ptr<void>& context) {
  auto addEnginePromise = static_cast<promise<shared_ptr<mip::ProtectionEngine>>*>(context.get());
  addEnginePromise->set_exception(error);
};

Wanneer we een SDK-klasse instantiëren of een functie gebruiken die asynchrone bewerkingen uitvoert, geven we de waarnemers-implementatie door aan de instellingenconstructor of asynchrone functie zelf. Bij het instantiëren van het mip::ProtectionProfile::Settings object accepteert de constructor mip::ProtectionProfile::Observer als een van de parameters. In het onderstaande voorbeeld ziet u onze aangepaste ProtectionProfileObserverImpl, die wordt gebruikt in een mip::ProtectionProfile::Settings constructor.

Implementatie van ProtectionHandler-Observer

Net als de Beschermingswaarnemer implementeert mip::ProtectionHandler een mip::ProtectionHandler::Observer klasse voor het verwerken van asynchrone gebeurtenismeldingen tijdens beveiligingsbewerkingen. De implementatie is vergelijkbaar met die hierboven beschreven. ProtectionHandlerObserverImpl is gedeeltelijk gedefinieerd hieronder. De volledige implementatie vindt u in onze GitHub-voorbeeldopslagplaats.

Declaratie van klasse 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 OnCreateProtectionHandlerError(const exception_ptr& error, const shared_ptr<void>& context) override;
};

Gedeeltelijke implementatie van ProtectionHandlerObserverImpl

Dit voorbeeld toont slechts de eerste twee functies, maar de resterende functies gebruiken een vergelijkbaar patroon als deze en 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::OnCreateProtectionHandlerError(
  const exception_ptr& error,
  const shared_ptr<void>& context) {
  auto createProtectionHandlerPromise = static_cast<promise<shared_ptr<mip::ProtectionHandler>>*>(context.get());
  createProtectionHandlerPromise->set_exception(error);
};