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

O SDK de proteção contém três classes de observadores. Os membros observadores são virtuais e podem ser substituídos para lidar com retornos de chamada para operações assíncronas.

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

Os exemplos abaixo demonstram o padrão promise/future, que também é usado pelos exemplos do SDK e pode ser estendido para implementar o comportamento de retorno de chamada desejado.

Implementação do ProtectionProfile Observer

No exemplo a seguir, criamos uma classe, ProtectionProfileObserverImpl que é derivada de mip::ProtectionProfile::Observer. As funções de membro foram substituídas para usar o padrão promise/future usado em todas as amostras.

Declaração de classe ProtectionProfileObserverImpl

No cabeçalho, definimos ProtectionProfileObserverImpl, derivando de mip::ProtectionProfile::Observer, em seguida, substituir cada uma das funções de 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 OnAddEngineError(const exception_ptr& error, const shared_ptr<void>& context) override;
};

Implementação do ProtectionProfileObserverImpl

Na implementação propriamente dita, limitamo-nos a definir uma ação a tomar para cada função de membro observador.

Cada membro aceita dois parâmetros. O primeiro é um ponteiro compartilhado para a classe que estamos lidando na função. ProtectionObserver::OnLoadSuccess esperaria receber um mip::ProtectionProtection, ProtectionObserver::OnAddEngineSuccess esperaria mip::ProtectionEngine.

O segundo é um ponteiro compartilhado para o contexto. Na nossa implementação, o contexto é uma referência a um std::promise, passado como shared_ptr<void>. A primeira linha da função projeta isso para std::promisee, em seguida, armazenada em um objeto chamado promise.

Finalmente, o futuro é preparado definindo o promise->set_value() e passando no mip::ProtectionProtection 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::OnAddEngineError(
  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 instanciamos qualquer classe SDK ou usamos uma função que executa operações assíncronas, passaremos a implementação do observador para o construtor de configurações ou para a própria função assíncrona. Ao instanciar o mip::ProtectionProfile::Settings objeto, o construtor assume mip::ProtectionProfile::Observer como um dos parâmetros. O exemplo abaixo mostra nosso personalizado ProtectionProfileObserverImpl, usado em um mip::ProtectionProfile::Settings construtor.

Implementação do ProtectionHandler Observer

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 à descrita acima. ProtectionHandlerObserverImpl é parcialmente definida abaixo. A implementação completa pode ser encontrada em nosso repositório de exemplo 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 OnCreateProtectionHandlerError(const exception_ptr& error, const shared_ptr<void>& context) override;
};

Implementação parcial do ProtectionHandlerObserverImpl

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