Microsoft Information Protection SDK - Observadores do SDK de Proteção

O SDK de proteção contém três classes de observadores. Pode substituir membros virtuais do observador para processar callbacks de operações assíncronas.

Quando uma operação assíncrona é concluída, o SDK chama a OnXxx() função membro que corresponde ao resultado. Exemplos são OnLoadSuccess(), OnLoadFailure(), e OnAddEngineSuccess() para mip::ProtectionProfile::Observer.

Os exemplos seguintes demonstram o padrão promessa/futuro. Os exemplos do SDK também usam este padrão, e pode estendê-lo para implementar o comportamento desejado de callback.

Implementação do observador ProtectionProfile

O exemplo seguinte cria uma classe, ProtectionProfileObserverImpl, que deriva de mip::ProtectionProfile::Observer. As funções membros sobrepõem-se à classe base para usar o padrão promessa/futuro usado ao longo das amostras.

Declaração de classe ProtectionProfileObserverImpl

O cabeçalho define ProtectionProfileObserverImpl, deriva-o de mip::ProtectionProfile::Observer e, em seguida, redefine cada uma das funções-membro.

//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 OnAddEngineFailure(const exception_ptr& error, const shared_ptr<void>& context) override;
};

Implementação do ProtectionProfileObserverImpl

A implementação define uma ação a realizar para cada função membro do observador.

Cada membro aceita dois parâmetros. O primeiro é um ponteiro partilhado para a classe que a função gere. ProtectionObserver::OnLoadSuccess espera receber um mip::ProtectionProfile. ProtectionObserver::OnAddEngineSuccess espera mip::ProtectionEngine.

O segundo é um ponteiro partilhado para o contexto. Nesta implementação, o contexto é uma referência a um std::promise, passado como shared_ptr<void>. A primeira linha da função converte este valor em std::promise, e depois armazena-o num objeto chamado promise.

Finalmente, o código prepara o futuro ao definir promise->set_value() e passar o mip::ProtectionProfile objeto.

//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::OnAddEngineFailure(
  const exception_ptr& error,
  const shared_ptr<void>& context) {
  auto addEnginePromise = static_cast<promise<shared_ptr<mip::ProtectionEngine>>*>(context.get());
  addEnginePromise->set_exception(error);
};

Quando instancias qualquer classe SDK ou usas uma função que realiza operações assíncronas, passa a implementação do observador para o construtor de configurações ou para a própria função assíncrona. Quando instancias o mip::ProtectionProfile::Settings objeto, o construtor aceita mip::ProtectionProfile::Observer como um dos parâmetros. O exemplo seguinte mostra o ProtectionProfileObserverImpl personalizado, usado num construtor mip::ProtectionProfile::Settings.

Implementação do observador ProtectionHandler

Semelhante ao observador de proteção, mip::ProtectionHandler implementa uma mip::ProtectionHandler::Observer classe para manipular notificações de eventos assíncronos durante operações de proteção. A implementação é semelhante à implementação anterior. O exemplo seguinte define ProtectionHandlerObserverImplparcialmente . A implementação completa encontra-se no repositório de exemplos do GitHub.

Declaração de classe 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 OnCreateProtectionHandlerFailure(const exception_ptr& error, const shared_ptr<void>& context) override;
};

Implementação parcial do ProtectionHandlerObserverImpl

Esta amostra inclui apenas as duas primeiras funções, mas as restantes funções usam um padrão semelhante a estas funções e a 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::OnCreateProtectionHandlerFailure(
  const exception_ptr& error,
  const shared_ptr<void>& context) {
  auto createProtectionHandlerPromise = static_cast<promise<shared_ptr<mip::ProtectionHandler>>*>(context.get());
  createProtectionHandlerPromise->set_exception(error);
};

Passos seguintes