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

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

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

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

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

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

Note

Примеры реализуют только часть класса наблюдателя и не содержат переопределений для наблюдателей, связанных с mip::FileEngine.

profile_observer.h

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

class ProfileObserver final : public mip::FileProfile::Observer {
public:
ProfileObserver() { }
  void OnLoadSuccess(const std::shared_ptr<mip::FileProfile>& profile, const std::shared_ptr<void>& context) override;
  void OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) override;
  //TODO: Implement mip::FileEngine related observers.
};

profile_observer.cpp

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

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

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

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

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

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

//Called when FileProfile 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::FileProfile>>>(context);
  promise->set_exception(error);
}

//TODO: Implement mip::FileEngine related observers.

При создании экземпляра любого класса SDK или использовании функции, выполняющей асинхронные операции, передайте реализацию наблюдателя конструктору параметров или асинхронной функции. При создании экземпляра mip::FileProfile::Settings объекта конструктор принимает mip::FileProfile::Observer в качестве одного из параметров. В этом примере показан пользовательский ProfileObserver, который используется в конструкторе mip::FileProfile::Settings.

Реализация наблюдателя FileHandler

Как и наблюдатель профиля, mip::FileHandler реализует mip::FileHandler::Observer класс для обработки асинхронных уведомлений о событиях во время операций с файлами. Реализация аналогична предыдущей реализации. В следующем примере приведено частичное определение FileHandlerObserver.

file_handler_observer.h

#include "mip/file/file_handler.h"

class FileHandlerObserver final : public mip::FileHandler::Observer {
public:
  void OnCreateFileHandlerSuccess(
      const std::shared_ptr<mip::FileHandler>& fileHandler,
      const std::shared_ptr<void>& context) override;

  void OnCreateFileHandlerFailure(
      const std::exception_ptr& error,
      const std::shared_ptr<void>& context) override;

  //TODO: override remaining member functions inherited from mip::FileHandler::Observer
};

file_handler_observer.cpp

Этот пример включает только первые две функции, но остальные функции используют аналогичный шаблон этих функций и ProfileObserver.

#include "file_handler_observer.h"

void FileHandlerObserver::OnCreateFileHandlerSuccess(const std::shared_ptr<mip::FileHandler>& fileHandler, const std::shared_ptr<void>& context) {
    auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::FileHandler>>>(context);
    promise->set_value(fileHandler);
}

void FileHandlerObserver::OnCreateFileHandlerFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) {
    auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::FileHandler>>>(context);
    promise->set_exception(error);
}

//TODO: override remaining member functions inherited from mip::FileHandler::Observer

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