пакет SDK Microsoft Information Protection — наблюдатели пакета SDK политики

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

После завершения асинхронной операции SDK вызывает функцию-член OnXxx(), соответствующую полученному результату. Примеры: OnLoadSuccess(), OnLoadFailure()и OnAddEngineSuccess() для mip::Profile::Observer.

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

Реализация наблюдателя профиля

В следующем примере создается класс, ProfileObserverпроизводный от mip::Profile::Observer. Функции-члены переопределяют методы базового класса, чтобы использовать паттерн future/promise, который используется во всех примерах.

Note

Следующие примеры реализуют только часть класса наблюдателя и не включают переопределения для связанных наблюдателей mip::ProfileEngine .

profile_observer.h

Заголовок определяет ProfileObserver, наследует его от mip::Profile::Observer, а затем переопределяет каждую из функций-членов.

class ProfileObserver final : public mip::Profile::Observer {
public:
ProfileObserver() { }
  void OnLoadSuccess(const std::shared_ptr<mip::Profile>& profile, const std::shared_ptr<void>& context) override;
  void OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) override;
  //TODO: Implement remaining members
};

profile_observer.cpp

Реализация определяет, какое действие следует выполнить для каждой функции-члена наблюдателя.

Каждый член принимает два параметра. Первым является общий указатель на класс, который обрабатывает функция. ProfileObserver::OnLoadSuccess ожидает получить mip::Profile. ProfileObserver::OnAddEngineSuccess ожидает mip::ProfileEngine.

Второй — это общий указатель на контекст. В этой реализации контекст является ссылкой на объект std::promise, переданный как shared_ptr<void>. Первая строка функции вызывает это значение std::promise, а затем сохраняет его в объекте с именем promise.

Наконец, код делает будущее готовым, задав promise->set_value() и передав объект mip::Profile .

#include "profile_observer.h"
#include <future>

//Called when Profile is successfully loaded
void ProfileObserver::OnLoadSuccess(const std::shared_ptr<mip::Profile>& profile, const std::shared_ptr<void>& context) {
  //cast context to promise
  auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::Profile>>>(context);
  //set promise value to profile
  promise->set_value(profile);
}

//Called when Profile fails to load
void ProfileObserver::OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) {
  auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::Profile>>>(context);
  promise->set_exception(error);
}

//TODO: Implement remaining observer members

При выполнении любой асинхронной операции передайте реализацию наблюдателя конструктору параметров или асинхронной функции.

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