Microsoft Information Protection SDK - Schutz-SDK-Beobachter

Das Protection SDK enthält drei Beobachterklassen. Sie können virtuelle Member der Observer-Klasse überschreiben, um Callbacks für asynchrone Vorgänge zu verarbeiten.

Wenn ein asynchroner Vorgang abgeschlossen ist, ruft das SDK die OnXxx() Memberfunktion auf, die dem Ergebnis entspricht. Beispiele sind OnLoadSuccess(), OnLoadFailure(), und OnAddEngineSuccess() für mip::ProtectionProfile::Observer.

Die folgenden Beispiele veranschaulichen das Zusage-/zukünftige Muster. Die SDK-Beispiele verwenden auch dieses Muster, und Sie können es erweitern, um das gewünschte Rückrufverhalten zu implementieren.

ProtectionProfile-Beobachterimplementierung

Im folgenden Beispiel wird eine Klasse, ProtectionProfileObserverImpl, erstellt, die von mip::ProtectionProfile::Observer abgeleitet ist. Die Memberfunktionen überschreiben die Basisklasse, um das in den Beispielen verwendete Zusage-/zukünftige Muster zu verwenden.

ProtectionProfileObserverImpl-Klassendeklaration

Die Header-Datei definiert ProtectionProfileObserverImpl, leitet es von mip::ProtectionProfile::Observer ab und überschreibt dann jede der Member-Funktionen.

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

ProtectionProfileObserverImpl-Implementierung

Die Implementierung definiert eine Aktion, die für jede Beobachtermitgliedsfunktion zu ergreifen ist.

Jedes Member akzeptiert zwei Parameter. Der erste ist ein Shared Pointer auf die Klasse, die von der Funktion verarbeitet wird. ProtectionObserver::OnLoadSuccess erwartet, ein mip::ProtectionProfile zu erhalten. ProtectionObserver::OnAddEngineSuccess erwartet mip::ProtectionEngine.

Die zweite ist ein freigegebener Zeiger auf den Kontext. In dieser Implementierung ist der Kontext ein Verweis auf ein std::promise, übergeben als shared_ptr<void>. Die erste Zeile der Funktion wandelt diesen Wert in std::promise um und speichert ihn dann in einem Objekt namens promise.

Letztendlich wird durch den Code für die Zukunft gerüstet, indem das promise->set_value()-Objekt festgelegt und mip::ProtectionProfile übergeben wird.

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

Wenn Sie eine SDK-Klasse instanziieren oder eine Funktion verwenden, die asynchrone Vorgänge ausführt, übergeben Sie die Beobachterimplementierung an den Einstellungskonstruktor oder die asynchrone Funktion selbst. Wenn Sie das Objekt mip::ProtectionProfile::Settings instanziieren, akzeptiert der Konstruktor mip::ProtectionProfile::Observer als einen der Parameter. Das folgende Beispiel zeigt den benutzerdefinierten ProtectionProfileObserverImpl, der in einem mip::ProtectionProfile::Settings Konstruktor verwendet wird.

Observer-Implementierung für ProtectionHandler

Ähnlich wie der Protection-Beobachter implementiert mip::ProtectionHandler eine mip::ProtectionHandler::Observer-Klasse zum Behandeln asynchroner Ereignisbenachrichtigungen während Schutzvorgängen. Die Implementierung ähnelt der vorherigen Implementierung. Das folgende Beispiel definiert ProtectionHandlerObserverImpl teilweise. Die vollständige Implementierung befindet sich im GitHub Beispiel-Repository.

ProtectionHandlerObserverImpl-Klassendeklaration

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

Partielle Implementierung von ProtectionHandlerObserverImpl

Dieses Beispiel enthält nur die ersten beiden Funktionen, aber die verbleibenden Funktionen verwenden ein ähnliches Schema wie diese Funktionen und 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::OnCreateProtectionHandlerFailure(
  const exception_ptr& error,
  const shared_ptr<void>& context) {
  auto createProtectionHandlerPromise = static_cast<promise<shared_ptr<mip::ProtectionHandler>>*>(context.get());
  createProtectionHandlerPromise->set_exception(error);
};

Nächste Schritte