Dela via


Microsoft Information Protection SDK – SDK-filobservatörer

Fil-SDK:et innehåller två observatörsklasser. Observatörsmedlemmar är virtuella och kan åsidosättas för att hantera händelseåteranrop.

När en asynkron åtgärd slutförs anropas medlemsfunktionen OnXxx() som motsvarar resultatet. Exempel är OnLoadSuccess(), OnLoadFailure()och OnAddEngineSuccess() för mip::FileProfile::Observer.

Exemplen nedan visar promise/future-mönstret, som också används av SDK-exemplen, och kan utökas för att implementera önskat återanropsbeteende.

Implementering av filprofilobservatör

I följande exempel har vi skapat en klass som ProfileObserver härleds från mip::FileProfile::Observer. Medlemsfunktionerna har åsidosatts för att använda det framtids-/löftesmönster som används i exemplen.

Obs! Exemplen nedan är endast delvis implementerade och inkluderar inte åsidosättningar för de relaterade observatörerna mip::FileEngine .

profile_observer.h

I rubriken definierar ProfileObservervi , som härleds från mip::FileProfile::Observeroch åsidosätter sedan var och en av medlemsfunktionerna.

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

I själva implementeringen definierar vi en åtgärd som ska vidtas för varje observatörsmedlemsfunktion.

Varje medlem accepterar två parametrar. Den första är en delad pekare till klassen vi hanterar i funktionen. ProfileObserver::OnLoadSuccess förväntar sig att få en mip::FileProfile. ProfileObserver::OnAddEngineSuccess förväntar sig mip::FileEngine.

Den andra är en delad pekare till kontexten. I vår implementering är kontexten en referens till en std::promise, som skickas av referensen som std::shared_ptr<void>. Den första raden i funktionen omvandlar detta till std::promiseoch lagras sedan i ett objekt med namnet promise.

Slutligen är framtiden klar genom att ange promise->set_value() och skicka objektet 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.

När vi instansierar någon SDK-klass eller använder en funktion som utför asynkrona åtgärder skickar vi observer-implementeringen till själva inställningskonstruktorn eller asynkron funktion. När objektet instansieras mip::FileProfile::Settings tar konstruktorn in mip::FileProfile::Observer som en av parametrarna. Exemplet nedan visar vår anpassade ProfileObserver, som används i en mip::FileProfile::Settings konstruktor.

Implementering av FileHandler Observer

Precis som profilobservatören mip::FileHandler implementerar den en mip::FileHandler::Observers klass för hantering av asynkrona händelsemeddelanden under filåtgärder. Implementeringen liknar den som beskrivs ovan. FileHandlerObserver definieras delvis nedan.

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

Det här exemplet är bara de två första funktionerna, men de återstående funktionerna använder ett liknande mönster som dessa och till 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