Teilen über


Microsoft Information Protection SDK - Datei-SDK-Beobachter

Das File SDK enthält zwei Beobachterklassen. Beobachter-Member sind virtuell und können überschrieben werden, um Ereignisrückrufe 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::FileProfile::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.

Implementierung des Dateiprofilbeobachters

Im folgenden Beispiel haben wir eine Klasse erstellt, ProfileObserver die von mip::FileProfile::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::FileEngine zugehörigen Beobachter.

profile_observer.h

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

class ProfileObserver final : public mip::FileProfile::Observer {
public:
ProfileObserver() { }
  void OnLoadSuccess(const std::shared_ptr<mip::FileProfile>& profile, const std::shared_ptr<void>& context) override;
  void OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) override;
  //TODO: Implement mip::FileEngine related observers.
};

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 gemeinsamer Zeiger auf die Klasse, die wir in der Funktion behandeln. ProfileObserver::OnLoadSuccess würde erwarten, ein mip::FileProfile zu erhalten. ProfileObserver::OnAddEngineSuccess würde mip::FileEngine erwarten.

Die zweite ist ein freigegebener Zeiger auf den Kontext. In unserer Implementierung ist der Kontext ein Verweis auf einen std::promise, der als Verweis als std::shared_ptr<void> übergeben wird. 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::FileProfile übergeben wird.

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

//Called when FileProfile is successfully loaded
void ProfileObserver::OnLoadSuccess(const std::shared_ptr<mip::FileProfile>& profile, const std::shared_ptr<void>& context) {
  //cast context to promise
  auto promise = 
  std::static_pointer_cast<std::promise<std::shared_ptr<mip::FileProfile>>>(context);
  //set promise value to profile
  promise->set_value(profile);
}

//Called when FileProfile 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::FileProfile>>>(context);
  promise->set_exception(error);
}

//TODO: Implement mip::FileEngine related observers.

Wenn wir eine SDK-Klasse instanziieren oder eine Funktion verwenden, die asynchrone Vorgänge ausführt, übergeben wir die Beobachterimplementierung an den Einstellungskonstruktor oder die asynchrone Funktion selbst. Beim Instanziieren des mip::FileProfile::Settings-Objekts verwendet der Konstruktor mip::FileProfile::Observer als einen der Parameter. Das folgende Beispiel zeigt unser benutzerdefiniertes ProfileObserver, das in einem mip::FileProfile::Settings-Konstruktor verwendet wird.

FileHandler-Observer-Implementierung

Ähnlich wie der Profilbeobachter implementiert mip::FileHandler die mip::FileHandler::Observers-Klasse zum Behandeln asynchroner Ereignisbenachrichtigungen während Dateivorgängen. Die Implementierung ähnelt dem oben Beschriebenen. FileHandlerObserver wird teilweise unten definiert.

file_handler_observer.h

#include "mip/file/file_handler.h"

class FileHandlerObserver final : public mip::FileHandler::Observer {
public:
  void OnCreateFileHandlerSuccess(
      const std::shared_ptr<mip::FileHandler>& fileHandler,
      const std::shared_ptr<void>& context) override;

  void OnCreateFileHandlerFailure(
      const std::exception_ptr& error,
      const std::shared_ptr<void>& context) override;

  //TODO: override remaining member functions inherited from mip::FileHandler::Observer
};

file_handler_observer.cpp

Dieses Beispiel ist nur die ersten beiden Funktionen, die übrigen Funktionen jedoch verwenden ein ähnliches Muster wie diese und wie ProfileObserver.

#include "file_handler_observer.h"

void FileHandlerObserver::OnCreateFileHandlerSuccess(const std::shared_ptr<mip::FileHandler>& fileHandler, const std::shared_ptr<void>& context) {
    auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::FileHandler>>>(context);
    promise->set_value(fileHandler);
}

void FileHandlerObserver::OnCreateFileHandlerFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) {
    auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::FileHandler>>>(context);
    promise->set_exception(error);
}

//TODO: override remaining member functions inherited from mip::FileHandler::Observer