Zestaw SDK usługi Microsoft Information Protection — obserwatorzy zestawu SDK ochrony
Zestaw SDK ochrony zawiera trzy klasy obserwatorów. Elementy członkowskie obserwatora są wirtualne i mogą być zastępowane w celu obsługi wywołań zwrotnych dla operacji asynchronicznych.
-
Profil ochrony:
mip::ProtectionProfile::Observer
-
Aparat ochrony:
mip::ProtectionEngine::Observer
-
Program obsługi ochrony:
mip::ProtectionHandler::Observer
Po zakończeniu OnXxx()
operacji asynchronicznej wywoływana jest funkcja składowa odpowiadająca wynikowi. Przykłady to OnLoadSuccess()
, OnLoadFailure()
i OnAddEngineSuccess()
dla .mip::ProtectionProfile::Observer
W poniższych przykładach pokazano wzorzec obietnicy/przyszłości, który jest również używany przez przykłady zestawu SDK i można go rozszerzyć w celu zaimplementowania żądanego zachowania wywołania zwrotnego.
Implementacja obserwatora protectionProfile
W poniższym przykładzie utworzyliśmy klasę, ProtectionProfileObserverImpl
która pochodzi z klasy mip::ProtectionProfile::Observer
. Funkcje składowe zostały zastąpione, aby używać wzorca obietnicy/przyszłości używanego w próbkach.
ProtectionProfileObserverImpl, deklaracja klasy
W nagłówku definiujemy ProtectionProfileObserverImpl
element , wyprowadzając z mip::ProtectionProfile::Observer
, a następnie zastępujemy poszczególne funkcje składowe.
//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 OnAddEngineError(const exception_ptr& error, const shared_ptr<void>& context) override;
};
Implementacja ProtectionProfileObserverImpl
W samej implementacji po prostu definiujemy akcję do wykonania dla każdej funkcji elementu członkowskiego obserwatora.
Każdy element członkowski akceptuje dwa parametry. Pierwszy to wskaźnik współużytkowany do klasy, która obsługujemy w funkcji.
ProtectionObserver::OnLoadSuccess
oczekuje się, że otrzyma wartość mip::ProtectionProtection
, ProtectionObserver::OnAddEngineSuccess
będzie oczekiwać mip::ProtectionEngine
.
Drugi to wskaźnik współużytkowany do kontekstu. W naszej implementacji kontekst jest odwołaniem do elementu , przekazanego std::promise
jako shared_ptr<void>
. Pierwszy wiersz funkcji rzutuje to na std::promise
, a następnie przechowywany w obiekcie o nazwie promise
.
Na koniec przyszłość jest gotowa, ustawiając promise->set_value()
obiekt i przekazując go mip::ProtectionProtection
.
//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::OnAddEngineError(
const exception_ptr& error,
const shared_ptr<void>& context) {
auto addEnginePromise = static_cast<promise<shared_ptr<mip::ProtectionEngine>>*>(context.get());
addEnginePromise->set_exception(error);
};
Gdy utworzymy wystąpienie dowolnej klasy zestawu SDK lub użyjemy funkcji wykonującej operacje asynchroniczne, przekażemy implementację obserwatora do konstruktora ustawień lub samej funkcji asynchronicznej. Podczas tworzenia mip::ProtectionProfile::Settings
wystąpienia obiektu konstruktor przyjmuje mip::ProtectionProfile::Observer
jako jeden z parametrów. W poniższym przykładzie pokazano niestandardowy element ProtectionProfileObserverImpl
, używany w konstruktorze mip::ProtectionProfile::Settings
.
Implementacja obserwatora programu ProtectionHandler
Podobnie jak obserwator ochrony, mip::ProtectionHandler
implementuje klasę mip::ProtectionHandler::Observer
do obsługi asynchronicznych powiadomień o zdarzeniach podczas operacji ochrony. Implementacja jest podobna do powyższej.
ProtectionHandlerObserverImpl
jest częściowo zdefiniowany poniżej. Pełną implementację można znaleźć w naszym repozytorium przykładowym usługi GitHub.
ProtectionHandlerObserverImpl, deklaracja klasy
//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 OnCreateProtectionHandlerError(const exception_ptr& error, const shared_ptr<void>& context) override;
};
Implementacja częściowa programu ProtectionHandlerObserverImpl
Ten przykład to tylko dwie pierwsze funkcje, ale pozostałe funkcje używają podobnego wzorca do tych i do 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::OnCreateProtectionHandlerError(
const exception_ptr& error,
const shared_ptr<void>& context) {
auto createProtectionHandlerPromise = static_cast<promise<shared_ptr<mip::ProtectionHandler>>*>(context.get());
createProtectionHandlerPromise->set_exception(error);
};