Microsoft Information Protection SDK – SDK-filobservatörer
Fil-SDK:et innehåller två observatörsklasser. Observatörsmedlemmar är virtuella och kan åsidosättas för att hantera händelseåteranrop.
När en asynkron åtgärd slutförs anropas medlemsfunktionen OnXxx()
som motsvarar resultatet. Exempel är OnLoadSuccess()
, OnLoadFailure()
och OnAddEngineSuccess()
för mip::FileProfile::Observer
.
Exemplen nedan visar promise/future-mönstret, som också används av SDK-exemplen, och kan utökas för att implementera önskat återanropsbeteende.
Implementering av filprofilobservatör
I följande exempel har vi skapat en klass som ProfileObserver
härleds från mip::FileProfile::Observer
. Medlemsfunktionerna har åsidosatts för att använda det framtids-/löftesmönster som används i exemplen.
Obs! Exemplen nedan är endast delvis implementerade och inkluderar inte åsidosättningar för de relaterade observatörerna mip::FileEngine
.
profile_observer.h
I rubriken definierar ProfileObserver
vi , som härleds från mip::FileProfile::Observer
och åsidosätter sedan var och en av medlemsfunktionerna.
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
I själva implementeringen definierar vi en åtgärd som ska vidtas för varje observatörsmedlemsfunktion.
Varje medlem accepterar två parametrar. Den första är en delad pekare till klassen vi hanterar i funktionen. ProfileObserver::OnLoadSuccess
förväntar sig att få en mip::FileProfile
. ProfileObserver::OnAddEngineSuccess
förväntar sig mip::FileEngine
.
Den andra är en delad pekare till kontexten. I vår implementering är kontexten en referens till en std::promise
, som skickas av referensen som std::shared_ptr<void>
. Den första raden i funktionen omvandlar detta till std::promise
och lagras sedan i ett objekt med namnet promise
.
Slutligen är framtiden klar genom att ange promise->set_value()
och skicka objektet mip::FileProfile
.
#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.
När vi instansierar någon SDK-klass eller använder en funktion som utför asynkrona åtgärder skickar vi observer-implementeringen till själva inställningskonstruktorn eller asynkron funktion. När objektet instansieras mip::FileProfile::Settings
tar konstruktorn in mip::FileProfile::Observer
som en av parametrarna. Exemplet nedan visar vår anpassade ProfileObserver
, som används i en mip::FileProfile::Settings
konstruktor.
Implementering av FileHandler Observer
Precis som profilobservatören mip::FileHandler
implementerar den en mip::FileHandler::Observers
klass för hantering av asynkrona händelsemeddelanden under filåtgärder. Implementeringen liknar den som beskrivs ovan. FileHandlerObserver
definieras delvis nedan.
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
Det här exemplet är bara de två första funktionerna, men de återstående funktionerna använder ett liknande mönster som dessa och till 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