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