SDK da Proteção de Informações da Microsoft - observadores do SDK de proteção
O SDK de proteção contém três classes de observador. Os membros observadores são virtuais e podem ser substituídos para manipular retornos de chamada nas operações assíncronas.
- Perfil de proteção:
mip::ProtectionProfile::Observer
- Mecanismo de proteção:
mip::ProtectionEngine::Observer
- Manipulador de proteção:
mip::ProtectionHandler::Observer
Quando uma operação assíncrona é concluída, a função de membro OnXxx()
correspondente ao resultado é chamada. Os exemplos são OnLoadSuccess()
, OnLoadFailure()
e OnAddEngineSuccess()
para mip::ProtectionProfile::Observer
.
Os exemplos abaixo demonstram o padrão promessa/futuro, 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 promessa/futuro usado em todas as amostras.
Declaração de classe ProtectionProfileObserverImpl
No cabeçalho, definimos ProtectionProfileObserverImpl
, derivando de mip::ProtectionProfile::Observer
e, em seguida, substituímos 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 em si, simplesmente definimos uma ação a ser tomada para cada função de membro observador.
Cada membro aceita dois parâmetros. O primeiro é um ponteiro compartilhado para a classe que estamos manipulando na função. ProtectionObserver::OnLoadSuccess
esperaria receber um mip::ProtectionProtection
; ProtectionObserver::OnAddEngineSuccess
esperaria mip::ProtectionEngine
.
O segundo é um ponteiro compartilhado para o contexto. Em nossa implementação, o contexto é uma referência a um std::promise
, transmitido como shared_ptr<void>
. A primeira linha da função converte isso em std::promise
e, em seguida, armazena em um objeto chamado promise
.
Finalmente, o futuro é preparado pela configuração de promise->set_value()
e a transmissão do objeto mip::ProtectionProtection
.
//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, transmitimos a implementação do observador para o construtor de configurações ou a própria função assíncrona. Ao instanciar o objeto mip::ProtectionProfile::Settings
, o construtor utiliza mip::ProtectionProfile::Observer
como um dos parâmetros. O exemplo abaixo mostra nosso ProtectionProfileObserverImpl
personalizado, usado em um construtor de mip::ProtectionProfile::Settings
.
Implementação do ProtectionHandler Observer
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 à detalhada acima. ProtectionHandlerObserverImpl
é parcialmente definido abaixo. A implementação completa pode ser encontrada em nosso 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 OnCreateProtectionHandlerError(const exception_ptr& error, const shared_ptr<void>& context) override;
};
Implementação parcial de ProtectionHandlerObserverImpl
Este exemplo é apenas as duas primeiras funções, mas as funções restantes usam um padrão semelhante a estas e ao 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);
};