Microsoft Information Protection SDK - Observadores do SDK de ficheiros

O File SDK contém duas classes de observadores. Pode sobrescrever membros observadores virtuais para tratar dos callbacks de eventos.

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::FileProfile::Observer.

Estes exemplos 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 de perfis de ficheiro

O exemplo seguinte cria uma classe, ProfileObserver, que deriva de mip::FileProfile::Observer. As funções-membro redefinem a classe base para utilizar o padrão future/promise usado ao longo dos exemplos.

Note

Os exemplos implementam apenas parte da classe observadora e não incluem substituições dos observadores relacionados com mip::FileEngine.

profile_observer.h

O cabeçalho define ProfileObserver, deriva-o de mip::FileProfile::Observer e, em seguida, redefine cada uma das funções-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

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. ProfileObserver::OnLoadSuccess espera receber um mip::FileProfile. ProfileObserver::OnAddEngineSuccess espera mip::FileEngine.

O segundo é um ponteiro partilhado para o contexto. Nesta implementação, o contexto é uma referência a um std::promise, passado por referência como std::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::FileProfile objeto.

#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 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::FileProfile::Settings objeto, o construtor aceita mip::FileProfile::Observer como um dos parâmetros. Este exemplo mostra o ProfileObserver personalizado, utilizado num construtor mip::FileProfile::Settings.

Implementação do observador FileHandler

Semelhante ao observador de perfil, mip::FileHandler implementa uma mip::FileHandler::Observer classe para lidar com notificações assíncronas de eventos durante operações de ficheiros. A implementação é semelhante à implementação anterior. O exemplo seguinte define FileHandlerObserverparcialmente .

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

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 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

Passos seguintes