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


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

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

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

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

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

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

Примечание. Приведенные ниже примеры частично реализованы и не включают переопределения для связанных наблюдателей 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::FileHandlermip::FileHandler::Observers класс для обработки асинхронных уведомлений о событиях во время операций с файлами. Реализация аналогична описанной выше. 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