zestaw SDK Microsoft Information Protection — obserwatorzy zestawu SDK ochrony

Zestaw SDK ochrony zawiera trzy klasy obserwatorów. Można zastąpić wirtualnych członków obserwatora w celu obsługi wywołań zwrotnych dla operacji asynchronicznych.

Po zakończeniu operacji asynchronicznej zestaw SDK wywołuje OnXxx() funkcję składową odpowiadającą wynikowi. Przykłady to OnLoadSuccess(), OnLoadFailure()i OnAddEngineSuccess() dla .mip::ProtectionProfile::Observer

W poniższych przykładach przedstawiono wzorzec obietnicy/przyszłości. Przykłady zestawu SDK używają również tego wzorca i można go rozszerzyć w celu zaimplementowania żądanego zachowania wywołania zwrotnego.

Implementacja obserwatora ProtectionProfile

Poniższy przykład tworzy klasę , ProtectionProfileObserverImplktóra pochodzi z klasy mip::ProtectionProfile::Observer. Funkcje składowe zastępują klasę bazową, aby używać wzorca obietnicy/przyszłości używanego w próbkach.

ProtectionProfileObserverImpl, deklaracja klasy

Nagłówek definiuje ProtectionProfileObserverImpl, wyprowadza go z mip::ProtectionProfile::Observer, a następnie przesłania każdą z funkcji składowych.

//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 OnAddEngineFailure(const exception_ptr& error, const shared_ptr<void>& context) override;
};

Implementacja ProtectionProfileObserverImpl

Implementacja definiuje działanie wykonywane dla każdej funkcji składowej obserwatora.

Każdy członek akceptuje dwa parametry. Pierwszy to współdzielony wskaźnik do klasy obsługiwanej przez funkcję. ProtectionObserver::OnLoadSuccess oczekuje, że otrzyma element mip::ProtectionProfile. ProtectionObserver::OnAddEngineSuccess oczekuje mip::ProtectionEngine.

Drugi to wskaźnik współużytkowany do kontekstu. W tej implementacji kontekst jest odwołaniem do std::promise, przekazywanym jako shared_ptr<void>. Pierwszy wiersz funkcji rzutuje tę wartość na std::promise, a następnie przechowuje ją w obiekcie o nazwie promise.

Na koniec kod sprawia, że przyszłość jest gotowa, ustawiając promise->set_value() i przekazując mip::ProtectionProfile obiekt.

//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::OnAddEngineFailure(
  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 tworzysz instancję dowolnej klasy SDK lub używasz funkcji wykonującej operacje asynchroniczne, przekaż implementację obserwatora do konstruktora klasy Settings lub do samej funkcji async. Gdy tworzysz instancję obiektu mip::ProtectionProfile::Settings, konstruktor przyjmuje mip::ProtectionProfile::Observer jako jeden z parametrów. W poniższym przykładzie pokazano użycie niestandardowego elementu ProtectionProfileObserverImpl 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 poprzedniej implementacji. Poniższy przykład częściowo definiuje element ProtectionHandlerObserverImpl. Pełna implementacja znajduje się w repozytorium GitHub przykładowym.

ProtectionHandlerObserverImpl, deklaracja klasy

//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 OnCreateProtectionHandlerFailure(const exception_ptr& error, const shared_ptr<void>& context) override;
};

Częściowa implementacja programu ProtectionHandlerObserverImpl

Ten przykład obejmuje tylko dwie pierwsze funkcje, ale pozostałe funkcje używają podobnego wzorca do tych funkcji 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::OnCreateProtectionHandlerFailure(
  const exception_ptr& error,
  const shared_ptr<void>& context) {
  auto createProtectionHandlerPromise = static_cast<promise<shared_ptr<mip::ProtectionHandler>>*>(context.get());
  createProtectionHandlerPromise->set_exception(error);
};

Następne kroki