Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Zestaw SDK ochrony zawiera trzy klasy obserwatorów. Członkowie obserwatora są wirtualni i mogą być przeciążani w celu obsługi wywołań zwrotnych dla operacji asynchronicznych.
-
Profil ochrony:
mip::ProtectionProfile::Observer -
Aparat ochrony:
mip::ProtectionEngine::Observer -
Menedżer 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 przedefiniowane, aby używać wzorca promise/future używanego w przykładach.
Deklaracja klasy ProtectionProfileObserverImpl
W nagłówku definiujemy ProtectionProfileObserverImpl, wyprowadzając z mip::ProtectionProfile::Observer, a następnie przesłaniamy 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 członkowskiej obserwatora.
Każdy członek akceptuje dwa parametry. Pierwszy to wskaźnik współużytkowany do klasy, którą 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 std::promise, przekazanym jako shared_ptr<void>. Pierwszy wiersz funkcji rzutuje to na std::promise, a następnie jest przechowywane w obiekcie o nazwie promise.
Na koniec przyszłość zostaje przygotowana poprzez ustawienie promise->set_value() i przekazanie obiektu 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 obiektu mip::ProtectionProfile::Settings, konstruktor przyjmuje mip::ProtectionProfile::Observer jako parametr. 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.
Deklaracja klasy ProtectionHandlerObserverImpl
//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);
};