Sdílet prostřednictvím


Microsoft Information Protection SDK – Pozorovatelé sady SDK zásad

Sada Policy SDK obsahuje jednu třídu pozorovatele. Členové pozorovatele jsou virtuální a měly by být přepsány, aby zpracovávaly zpětná 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::Profile::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 profilu

V následujícím příkladu jsme vytvořili třídu, ProfileObserver která je odvozena z mip::Profile::Observer. Členské funkce byly přepsány tak, aby používaly vzor budoucnost/příslib použitý v rámci ukázek.

Poznámka: Následující ukázky jsou implementovány pouze částečně a nezahrnují přepsání pro mip::ProfileEngine související pozorovatele.

profile_observer.h

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

class ProfileObserver final : public mip::Profile::Observer {
public:
ProfileObserver() { }
  void OnLoadSuccess(const std::shared_ptr<mip::Profile>& profile, const std::shared_ptr<void>& context) override;
  void OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) override;
  //TODO: Implement remaining members
};

profile_observer.cpp

V samotné implementaci 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á funkce. ProfileObserver::OnLoadSuccessočekává, že obdrží .mip::Profile ProfileObserver::OnAddEngineSuccess by očekával mip::ProfileEngine.

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::Profile .

#include "profile_observer.h"
#include <future>

//Called when Profile is successfully loaded
void ProfileObserver::OnLoadSuccess(const std::shared_ptr<mip::Profile>& profile, const std::shared_ptr<void>& context) {
  //cast context to promise
  auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::Profile>>>(context);
  //set promise value to profile
  promise->set_value(profile);
}

//Called when Profile fails to load
void ProfileObserver::OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) {
  auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::Profile>>>(context);
  promise->set_exception(error);
}

//TODO: Implement remaining observer members

Při provádění jakékoli asynchronní operace se implementace pozorovatele předá konstruktoru nastavení nebo samotné asynchronní funkci.