Microsoft Information Protection SDK – naslouchače sady Protection SDK

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í asynchronní operace je zavolána členská funkce OnXxx(), která odpovídá danému 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, jaká akce se má provést pro každou členskou funkci observeru.

Každý člen přijímá dva parametry. První je sdílený ukazatel na třídu, kterou zpracováváme ve funkci. ProtectionObserver::OnLoadSuccess by očekával/a, že obdrží mip::ProtectionProtection, ProtectionObserver::OnAddEngineSuccess by očekával/a 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>. Na prvním řádku funkce se hodnota this přetypuje na std::promise a poté se uloží do 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 observeru ProtectionHandler

Podobně jako pozorovatel ochrany mip::ProtectionHandler implementuje třídu mip::ProtectionHandler::Observer pro zpracování asynchronních oznámení o událostech 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 GitHub ukázkovém úložišti.

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 obsahuje pouze první dvě funkce, ale zbývající funkce používají podobný postup jako tyto i 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);
};