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.
-
Profil ochrany:
mip::ProtectionProfile::Observer
-
Modul ochrany:
mip::ProtectionEngine::Observer
-
Obslužná rutina ochrany:
mip::ProtectionHandler::Observer
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::OnLoadSuccess
očekává, že obdrží , mip::ProtectionProtection
ProtectionObserver::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);
};