Udostępnij za pośrednictwem


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

Zestaw SDK ochrony zawiera trzy klasy obserwatorów. Elementy członkowskie obserwatora są wirtualne i mogą być zastępowane 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 zastąpione, aby używać wzorca obietnicy/przyszłości używanego w próbkach.

ProtectionProfileObserverImpl, deklaracja klasy

W nagłówku definiujemy ProtectionProfileObserverImplelement , wyprowadzając z mip::ProtectionProfile::Observer, a następnie zastępujemy 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 elementu członkowskiego obserwatora.

Każdy element członkowski akceptuje dwa parametry. Pierwszy to wskaźnik współużytkowany do klasy, która 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 elementu , przekazanego std::promisejako shared_ptr<void>. Pierwszy wiersz funkcji rzutuje to na std::promise, a następnie przechowywany w obiekcie o nazwie promise.

Na koniec przyszłość jest gotowa, ustawiając promise->set_value() obiekt i przekazując go 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 mip::ProtectionProfile::Settings wystąpienia obiektu konstruktor przyjmuje mip::ProtectionProfile::Observer jako jeden z parametrów. 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.

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