Поделиться через


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

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

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