Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Пакет SDK для защиты содержит три класса наблюдателя. Вы можете переопределить элементы виртуального наблюдателя для обработки обратных вызовов для асинхронных операций.
-
Профиль защиты:
mip::ProtectionProfile::Observer -
Подсистема защиты:
mip::ProtectionEngine::Observer -
Обработчик защиты:
mip::ProtectionHandler::Observer
После завершения асинхронной операции SDK вызывает функцию-член OnXxx(), соответствующую полученному результату. Примеры: OnLoadSuccess(), OnLoadFailure()и OnAddEngineSuccess() для mip::ProtectionProfile::Observer.
В следующих примерах демонстрируется шаблон обещания и будущего. Примеры пакета SDK также используют этот шаблон, и его можно расширить для реализации требуемого поведения обратного вызова.
Реализация наблюдателя ProtectionProfile
В следующем примере создается класс, ProtectionProfileObserverImplпроизводный от mip::ProtectionProfile::Observer. Функции-члены переопределяют функции базового класса, чтобы использовать паттерн promise/future, применяемый во всех примерах.
Объявление класса ProtectionProfileObserverImpl
Заголовок определяет ProtectionProfileObserverImpl, наследует его от mip::ProtectionProfile::Observer, а затем переопределяет каждую из функций-членов.
//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;
};
Реализация ProtectionProfileObserverImpl
Реализация определяет, какое действие следует выполнить для каждой функции-члена наблюдателя.
Каждый член принимает два параметра. Первым является общий указатель на класс, который обрабатывает функция.
ProtectionObserver::OnLoadSuccess ожидает получить mip::ProtectionProfile.
ProtectionObserver::OnAddEngineSuccess ожидает mip::ProtectionEngine.
Второй — это общий указатель на контекст. В этой реализации контекст является ссылкой на объект std::promise, переданный как shared_ptr<void>. Первая строка функции вызывает это значение std::promise, а затем сохраняет его в объекте с именем promise.
Наконец, код делает будущее готовым, задав promise->set_value() и передав объект mip::ProtectionProfile .
//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);
};
При создании экземпляра любого класса SDK или использовании функции, выполняющей асинхронные операции, передайте реализацию наблюдателя конструктору параметров или асинхронной функции. При создании экземпляра mip::ProtectionProfile::Settings объекта конструктор принимает mip::ProtectionProfile::Observer в качестве одного из параметров. В следующем примере показан пользовательский ProtectionProfileObserverImpl, используемый в конструкторе mip::ProtectionProfile::Settings.
Реализация наблюдателя ProtectionHandler
Подобно наблюдателю по защите, mip::ProtectionHandler реализует класс mip::ProtectionHandler::Observer для обработки асинхронных уведомлений о событиях во время операций защиты. Реализация аналогична предыдущей реализации. В следующем примере приведено частичное определение ProtectionHandlerObserverImpl. Полная реализация находится в репозитории с примерами на GitHub.
Объявление класса 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;
};
Частичная реализация ProtectionHandlerObserverImpl
Этот пример включает только первые две функции, но остальные функции используют аналогичный шаблон этих функций и 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);
};
Дальнейшие действия
- Ознакомьтесь с примером MIP Protection SDK для C++ на GitHub.