Microsoft Information Protection SDK - osservatori del Policy SDK

Policy SDK contiene una classe observer. Eseguire l'override dei membri dell'osservatore virtuale per gestire i callback per le operazioni asincrone.

Al termine di un'operazione asincrona, l'SDK chiama la OnXxx() funzione membro che corrisponde al risultato. Gli esempi sono OnLoadSuccess(), OnLoadFailure()e OnAddEngineSuccess() per mip::PolicyProfile::Observer.

Gli esempi seguenti illustrano il modello promise/future. Gli esempi dell'SDK usano anche questo modello ed è possibile estenderlo per implementare il comportamento di callback desiderato.

Implementazione dell'osservatore di profilo

Nell'esempio seguente viene creata una classe , ProfileObserver, che deriva da mip::PolicyProfile::Observer. Le funzioni membro eseguono l'override della classe base per usare il modello futuro/promessa usato in tutti gli esempi.

Note

Gli esempi seguenti implementano solo parte della classe observer e non includono override per gli mip::PolicyEngine osservatori correlati.

profile_observer.h

L'intestazione definisce ProfileObserver, la deriva da mip::PolicyProfile::Observer, quindi esegue l'override di ognuna delle funzioni membro.

class ProfileObserver final : public mip::PolicyProfile::Observer {
public:
ProfileObserver() { }
  void OnLoadSuccess(const std::shared_ptr<mip::PolicyProfile>& 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

L'implementazione definisce un'azione da eseguire per ogni funzione membro osservatore.

Ogni membro accetta due parametri. Il primo è un puntatore condiviso alla classe gestita dalla funzione. ProfileObserver::OnLoadSuccess si aspetta di ricevere un mip::PolicyProfile. ProfileObserver::OnAddEngineSuccess si aspetta mip::PolicyEngine.

Il secondo è un puntatore condiviso al contesto. In questa implementazione, il contesto è un riferimento a un std::promise, passato come shared_ptr<void>. La prima riga della funzione esegue il cast di questo valore su std::promise, quindi la archivia in un oggetto denominato promise.

Infine, il codice rende il futuro pronto impostando promise->set_value() e passando l'oggetto mip::PolicyProfile .

#include "profile_observer.h"
#include <future>

//Called when Profile is successfully loaded
void ProfileObserver::OnLoadSuccess(const std::shared_ptr<mip::PolicyProfile>& profile, const std::shared_ptr<void>& context) {
  //cast context to promise
  auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::PolicyProfile>>>(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::PolicyProfile>>>(context);
  promise->set_exception(error);
}

//TODO: Implement remaining observer members

Quando si esegue un'operazione asincrona, passare l'implementazione dell'osservatore al costruttore delle impostazioni o alla funzione asincrona stessa.

Passaggi successivi