Delen via


Microsoft Information Protection SDK - Waarnemers van beleids-SDK

De Beleids-SDK bevat één waarnemersklasse. Waarnemerleden zijn virtueel en moeten worden overschreven voor het afhandelen van callbacks voor asynchrone bewerkingen.

Wanneer een asynchrone bewerking is voltooid, wordt de OnXxx() lidfunctie die overeenkomt met het resultaat aangeroepen. Voorbeelden zijn OnLoadSuccess(), OnLoadFailure()en OnAddEngineSuccess() voor mip::Profile::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 profielobator

In het volgende voorbeeld hebben we een klasse gemaakt die ProfileObserver is afgeleid van mip::Profile::Observer. De lidfuncties zijn overschreven voor het gebruik van het toekomstige/beloftepatroon dat in de voorbeelden wordt gebruikt.

Opmerking: de onderstaande voorbeelden zijn slechts gedeeltelijk geïmplementeerd en bevatten geen onderdrukkingen voor de mip::ProfileEngine gerelateerde waarnemers.

profile_observer.h

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

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

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

Elk lid accepteert twee parameters. De eerste is een gedeelde aanwijzer naar de klasse die wordt verwerkt door de functie. ProfileObserver::OnLoadSuccess zou verwachten dat een mip::Profile. ProfileObserver::OnAddEngineSuccess zou verwachten mip::ProfileEngine.

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::promiseen vervolgens opgeslagen in een object met de naam promise.

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

#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

Bij het uitvoeren van een asynchrone bewerking wordt de waarnemers-implementatie doorgegeven aan de instellingenconstructor of asynchrone functie zelf.