Freigeben über


Microsoft Information Protection SDK – Beobachter des Policy SDK

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

Nach Abschluss eines asynchronen Vorgangs wird die dem Ergebnis entsprechende OnXxx()-Mitgliedsfunktion aufgerufen. 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, die von ProfileObserver abgeleitet ist mip::Profile::Observer. 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 Überschreibungen für die mip::ProfileEngine-Observer.

profile_observer.h

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

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 Beobachtermitgliedsfunktion zu ergreifen ist.

Jedes Mitglied 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 wandelt dies in ein std::promise um, dann wird es in einem Objekt namens promise gespeichert.

Schließlich wird die Zukunft vorbereitet, indem das promise->set_value() Objekt festgelegt und das mip::Profile Objekt ü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.