Udostępnij przez


Zestaw SDK usługi Microsoft Information Protection — obserwatorzy zestawu SDK ochrony

Zestaw SDK ochrony zawiera trzy klasy obserwatorów. Członkowie obserwatora są wirtualni i mogą być przeciążani w celu obsługi wywołań zwrotnych dla operacji asynchronicznych.

Po zakończeniu OnXxx() operacji asynchronicznej wywoływana jest funkcja składowa odpowiadająca wynikowi. Przykłady to OnLoadSuccess(), OnLoadFailure()i OnAddEngineSuccess() dla .mip::ProtectionProfile::Observer

W poniższych przykładach pokazano wzorzec obietnicy/przyszłości, który jest również używany przez przykłady zestawu SDK i można go rozszerzyć w celu zaimplementowania żądanego zachowania wywołania zwrotnego.

Implementacja obserwatora protectionProfile

W poniższym przykładzie utworzyliśmy klasę, ProtectionProfileObserverImpl która pochodzi z klasy mip::ProtectionProfile::Observer. Funkcje składowe zostały przedefiniowane, aby używać wzorca promise/future używanego w przykładach.

Deklaracja klasy ProtectionProfileObserverImpl

W nagłówku definiujemy ProtectionProfileObserverImpl, wyprowadzając z mip::ProtectionProfile::Observer, a następnie przesłaniamy poszczególne funkcje składowe.

//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;
};

Implementacja ProtectionProfileObserverImpl

W samej implementacji po prostu definiujemy akcję do wykonania dla każdej funkcji członkowskiej obserwatora.

Każdy członek akceptuje dwa parametry. Pierwszy to wskaźnik współużytkowany do klasy, którą obsługujemy w funkcji. ProtectionObserver::OnLoadSuccess oczekuje się, że otrzyma wartość mip::ProtectionProtection, ProtectionObserver::OnAddEngineSuccess będzie oczekiwać mip::ProtectionEngine.

Drugi to wskaźnik współużytkowany do kontekstu. W naszej implementacji kontekst jest odwołaniem do std::promise, przekazanym jako shared_ptr<void>. Pierwszy wiersz funkcji rzutuje to na std::promise, a następnie jest przechowywane w obiekcie o nazwie promise.

Na koniec przyszłość zostaje przygotowana poprzez ustawienie promise->set_value() i przekazanie obiektu 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);
};

Gdy utworzymy wystąpienie dowolnej klasy zestawu SDK lub użyjemy funkcji wykonującej operacje asynchroniczne, przekażemy implementację obserwatora do konstruktora ustawień lub samej funkcji asynchronicznej. Podczas tworzenia obiektu mip::ProtectionProfile::Settings, konstruktor przyjmuje mip::ProtectionProfile::Observer jako parametr. W poniższym przykładzie pokazano niestandardowy element ProtectionProfileObserverImpl, używany w konstruktorze mip::ProtectionProfile::Settings .

Implementacja obserwatora programu ProtectionHandler

Podobnie jak obserwator ochrony, mip::ProtectionHandler implementuje klasę mip::ProtectionHandler::Observer do obsługi asynchronicznych powiadomień o zdarzeniach podczas operacji ochrony. Implementacja jest podobna do powyższej. ProtectionHandlerObserverImpl jest częściowo zdefiniowany poniżej. Pełną implementację można znaleźć w naszym repozytorium przykładowym usługi GitHub.

Deklaracja klasy 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;
};

Implementacja częściowa programu ProtectionHandlerObserverImpl

Ten przykład to tylko dwie pierwsze funkcje, ale pozostałe funkcje używają podobnego wzorca do tych i do 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);
};