Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Sada Protection SDK obsahuje tři třídy pozorovatelů. Členové pozorovatele jsou virtuální a je možné je přepsat za účelem zpracování zpětných volání pro asynchronní operace.
-
Profil ochrany:
mip::ProtectionProfile::Observer -
Modul ochrany:
mip::ProtectionEngine::Observer -
Obslužná rutina ochrany:
mip::ProtectionHandler::Observer
Po dokončení asynchronní operace je zavolána členská funkce OnXxx(), která odpovídá danému výsledku. Příklady jsou OnLoadSuccess(), OnLoadFailure()a OnAddEngineSuccess() pro mip::ProtectionProfile::Observer.
Následující příklady ukazují model příslibu a budoucnosti, který se používá také v ukázkách sady SDK, a lze je rozšířit, aby implementoval požadované chování zpětného volání.
Implementace pozorovatele protectionProfile
V následujícím příkladu jsme vytvořili třídu, ProtectionProfileObserverImpl která je odvozena z mip::ProtectionProfile::Observer. Členské funkce byly přepsány tak, aby používaly vzor příslibu a budoucnosti, který se používá v rámci ukázek.
Deklarace třídy ProtectionProfileObserverImpl
V hlavičce definujeme ProtectionProfileObserverImpl, odvozené od mip::ProtectionProfile::Observer, a pak přepíšeme všechny členské funkce.
//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;
};
Implementace ProtectionProfileObserverImpl
V samotné implementaci jednoduše definujeme, jaká akce se má provést pro každou členskou funkci observeru.
Každý člen přijímá dva parametry. První je sdílený ukazatel na třídu, kterou zpracováváme ve funkci.
ProtectionObserver::OnLoadSuccess by očekával/a, že obdrží mip::ProtectionProtection, ProtectionObserver::OnAddEngineSuccess by očekával/a mip::ProtectionEngine.
Druhým je sdílený ukazatel na kontext. V naší implementaci je kontext odkazem na std::promise, předán jako shared_ptr<void>. Na prvním řádku funkce se hodnota this přetypuje na std::promise a poté se uloží do objektu s názvem promise.
Nakonec je budoucnost připravena nastavením promise->set_value() a předáním objektu 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);
};
Když vytvoříme instanci jakékoli třídy sady SDK nebo použijeme funkci, která provádí asynchronní operace, předáme implementaci pozorovatele konstruktoru nastavení nebo samotné asynchronní funkci. Při vytváření instance objektu mip::ProtectionProfile::Settings konstruktor přebírá mip::ProtectionProfile::Observer jako jeden z parametrů. Následující příklad ukazuje náš vlastní ProtectionProfileObserverImpl, použitý v konstruktoru mip::ProtectionProfile::Settings .
Implementace observeru ProtectionHandler
Podobně jako pozorovatel ochrany mip::ProtectionHandler implementuje třídu mip::ProtectionHandler::Observer pro zpracování asynchronních oznámení o událostech během operací ochrany. Implementace je podobná výše uvedené implementaci.
ProtectionHandlerObserverImpl je částečně definován níže. Úplnou implementaci najdete v našem GitHub ukázkovém úložišti.
Deklarace třídy 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;
};
Částečná implementace ProtectionHandlerObserverImpl
Tato ukázka obsahuje pouze první dvě funkce, ale zbývající funkce používají podobný postup jako tyto i 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);
};