Sdílet prostřednictvím


Microsoft Information Protection SDK – Pozorovatelé sady SDK ochrany

Sada Protection SDK obsahuje tři třídy pozorovatelů. Členové pozorovatele jsou virtuální a je možné je přepsat za účelem zpracování zpětných volání pro asynchronní operace.

Po dokončení OnXxx() asynchronní operace je volána členová funkce odpovídající výsledku. Příklady jsou OnLoadSuccess(), OnLoadFailure()a OnAddEngineSuccess() pro mip::ProtectionProfile::Observer.

Následující příklady ukazují model příslibu a budoucnosti, který se používá také v ukázkách sady SDK, a lze je rozšířit, aby implementoval požadované chování zpětného volání.

Implementace pozorovatele protectionProfile

V následujícím příkladu jsme vytvořili třídu, ProtectionProfileObserverImpl která je odvozena z mip::ProtectionProfile::Observer. Členské funkce byly přepsány tak, aby používaly vzor příslibu a budoucnosti, který se používá v rámci ukázek.

Deklarace třídy ProtectionProfileObserverImpl

V hlavičce definujeme ProtectionProfileObserverImpl, odvozené od mip::ProtectionProfile::Observer, a pak přepíšeme všechny členské funkce.

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

Implementace ProtectionProfileObserverImpl

V samotné implementaci jednoduše definujeme akci, která se má provést pro každou členovou funkci pozorovatele.

Každý člen přijímá dva parametry. První je sdílený ukazatel na třídu, kterou zpracováváme ve funkci. ProtectionObserver::OnLoadSuccessočekává, že obdrží , mip::ProtectionProtectionProtectionObserver::OnAddEngineSuccess očekává mip::ProtectionEngine.

Druhým je sdílený ukazatel na kontext. V naší implementaci je kontext odkazem na std::promise, předán jako shared_ptr<void>. První řádek funkce tuto funkci přetypuje na std::promise, pak uložen v objektu s názvem promise.

Nakonec je budoucnost připravena nastavením promise->set_value() a předáním objektu 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);
};

Když vytvoříme instanci jakékoli třídy sady SDK nebo použijeme funkci, která provádí asynchronní operace, předáme implementaci pozorovatele konstruktoru nastavení nebo samotné asynchronní funkci. Při vytváření instance objektu mip::ProtectionProfile::Settings konstruktor přebírá mip::ProtectionProfile::Observer jako jeden z parametrů. Následující příklad ukazuje náš vlastní ProtectionProfileObserverImpl, použitý v konstruktoru mip::ProtectionProfile::Settings .

Implementace pozorovatele obslužné rutiny ochrany

Podobně jako pozorovatel mip::ProtectionHandler ochrany implementuje mip::ProtectionHandler::Observer třídu pro zpracování asynchronních oznámení událostí během operací ochrany. Implementace je podobná výše uvedené implementaci. ProtectionHandlerObserverImpl je částečně definován níže. Úplnou implementaci najdete v našem ukázkovém úložišti GitHubu.

Deklarace třídy 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;
};

Částečná implementace ProtectionHandlerObserverImpl

Tato ukázka je pouze první dvě funkce, ale zbývající funkce používají podobný vzor jako tyto funkce a na 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);
};