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