Teilen über


Microsoft Information Protection SDK - Policy SDK Beobachter

Das Policy SDK enthält eine Beobachterklasse. Beobachter-Members sind virtuell und sollten überschrieben werden, um Rückrufe für asynchrone Vorgänge zu behandeln.

Wenn ein asynchroner Vorgang abgeschlossen wird, wird die OnXxx()-Memberfunktion, die dem Ergebnis entspricht, genannt. Beispiele sind OnLoadSuccess(), OnLoadFailure(), und OnAddEngineSuccess() für mip::Profile::Observer.

Die folgenden Beispiele veranschaulichen das zugesagte/zukünftige Muster, das auch von den SDK-Beispielen verwendet wird, und kann erweitert werden, um das gewünschte Rückrufverhalten zu implementieren.

Profilbeobachterimplementierung

Im folgenden Beispiel haben wir eine Klasse erstellt, ProfileObserver die von mip::Profile::Observer abgeleitet ist. Die Memberfunktionen wurden überschrieben, um das in den Beispielen verwendete Zukünftige/Zusagemuster zu verwenden.

Hinweis: Die folgenden Beispiele sind nur teilweise implementiert und enthalten keine Außerkraftsetzungen für die mip::ProfileEngine zugehörigen Beobachter.

profile_observer.h

In der Kopfzeile definieren wir ProfileObserver, abgeleitet von mip::Profile::Observer, und überschreiben dann jede der Memberfunktionen.

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 der Implementierung selbst definieren wir eine Aktion, die für jede Beobachter-Memberfunktion zu ergreifen ist.

Jedes Member akzeptiert zwei Parameter. Der erste ist ein gemeinsam genutzter Zeiger auf die Klasse, die von der Funktion behandelt wird. ProfileObserver::OnLoadSuccess würde erwarten, ein mip::Profile zu erhalten. ProfileObserver::OnAddEngineSuccess würde mip::ProfileEngine erwarten.

Die zweite ist ein freigegebener Zeiger auf den Kontext. In unserer Implementierung ist der Kontext ein Verweis auf ein std::promise, übergeben als shared_ptr<void>. Die erste Zeile der Funktion überträgt dies nach std::promise und wird dann in einem Objekt gespeichert, das promise heißt.

Letztendlich wird die Zukunft vorbereitet, indem das promise->set_value()-Objekt festgelegt und mip::Profile übergeben wird.

#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

Beim Ausführen eines asynchronen Vorgangs wird die Beobachterimplementierung an den Einstellungskonstruktor oder die asynchrone Funktion selbst übergeben.