пакет SDK Microsoft Information Protection — наблюдатели пакета SDK для защиты

Пакет SDK для защиты содержит три класса наблюдателя. Вы можете переопределить элементы виртуального наблюдателя для обработки обратных вызовов для асинхронных операций.

После завершения асинхронной операции 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);
};

Дальнейшие действия