Microsoft Proteção de Informações SDK - Observadores do SDK de proteção

O SDK de proteção contém três classes de observador. Você pode substituir membros do observador virtual para lidar com retornos de chamada para operações assíncronas.

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

Os exemplos a seguir demonstram o padrão de promessa/futuro. Os exemplos do SDK também usam esse padrão e você pode estendê-lo para implementar o comportamento de retorno de chamada desejado.

Implementação do observador ProtectionProfile

O exemplo a seguir cria uma classe, ProtectionProfileObserverImplque deriva de mip::ProtectionProfile::Observer. As funções membro substituem a classe base para usar o padrão promise/future usado em todos os exemplos.

Declaração da classe ProtectionProfileObserverImpl

O cabeçalho define ProtectionProfileObserverImpl, deriva-o de mip::ProtectionProfile::Observer e, em seguida, sobrescreve 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 da ProtectionProfileObserverImpl

A implementação define uma ação a ser tomada para cada função de membro do observador.

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

O segundo é um ponteiro compartilhado para o contexto. Nessa implementação, o contexto é uma referência a um std::promise, passado como shared_ptr<void>. A primeira linha da função converte esse valor em std::promise, em seguida, armazena-o em um objeto chamado promise.

Por fim, o código prepara o futuro definindo promise->set_value() e passando 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);
};

Ao instanciar qualquer classe SDK ou usar uma função que executa operações assíncronas, passe a implementação do observador para o construtor de configurações ou a função assíncrona em si. Quando você cria uma instância do mip::ProtectionProfile::Settings objeto, o construtor aceita mip::ProtectionProfile::Observer como um dos parâmetros. O exemplo a seguir mostra o ProtectionProfileObserverImpl personalizado, usado em um construtor mip::ProtectionProfile::Settings.

Implementação do observador ProtectionHandler

Semelhante ao observador de proteção, o mip::ProtectionHandler implementa uma classe mip::ProtectionHandler::Observer para manipular notificações de evento assíncronas durante operações de proteção. A implementação é semelhante à implementação anterior. O exemplo a seguir define ProtectionHandlerObserverImplparcialmente. A implementação completa está no repositório de exemplo GitHub.

Declaração da 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;
};

ProtectionHandlerObserverImpl implementação parcial

Este exemplo inclui apenas as duas primeiras funções, mas as funções restantes usam um padrão semelhante a essas funções e para 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);
};

Próximas Etapas