Compartilhar via


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

O SDK de arquivo contém duas classes de observador. Os membros observadores são virtuais e podem ser substituídos para manipular retornos de chamada de eventos.

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::FileProfile::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 observador de perfil de arquivo

No exemplo a seguir, criamos uma classe, ProfileObserver, que é derivada de mip::FileProfile::Observer. As funções de membro foram substituídas para usar o padrão futuro/promessa usado em todos os exemplos.

Observação: os exemplos abaixo são implementados apenas parcialmente e não incluem substituições para os observadores relacionados a mip::FileEngine.

profile_observer.h

No cabeçalho, definimos ProfileObserver, derivando de mip::FileProfile::Observer e, em seguida, substituímos cada uma das funções de membro.

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

Na implementação propriamente dita, 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. ProfileObserver::OnLoadSuccess esperaria receber um arquivo mip::FileProfile. ProfileObserver::OnAddEngineSuccess esperaria mip::FileEngine.

O segundo é um ponteiro compartilhado para o contexto. Em nossa implementação, o contexto é uma referência a um std::promise, transmitido por referência como std::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::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.

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::FileProfile::Settings, o construtor utiliza mip::FileProfile::Observer como um dos parâmetros. O exemplo abaixo mostra nosso ProfileObserver personalizado, usado em um construtor de mip::FileProfile::Settings.

Implementação do FileHandler Observer

Semelhante ao observador de perfil, o mip::FileHandler implementa uma classe mip::FileHandler::Observers para manipular notificações de evento assíncronas durante operações de arquivo. A implementação é semelhante à detalhada acima. FileHandlerObserver é parcialmente definido abaixo.

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

Este exemplo é apenas as duas primeiras funções, mas as funções restantes usam um padrão semelhante a estas e ao 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