Microsoft Information Protection SDK — chętni zestawu SDK ochrony
Zestaw SDK ochrony zawiera trzy klasy klasowych ochrony. Członkowie jednakowy są wirtualni i można je zastąpić, aby obsługiwać wywołania zwrotne w przypadku asynchronicznych operacji.
Po zakończeniu asynchronicznej operacji jest wywoływana funkcja członkowski OnXxx() odpowiadająca wynikowi. Przykłady OnLoadSuccess() to : , i dla OnLoadFailure()OnAddEngineSuccess()mip::ProtectionProfile::Observer .
Poniższe przykłady ilustrują wzorzec obietnicy/przyszłości, który jest również używany w przykładach SDK i można go rozszerzyć, aby zaimplementować odpowiednie zachowanie wywołania zwrotnego.
Implementacja implementacji implementacji szybkich plików ochrony
W poniższym przykładzie utworzono klasę, która ProtectionProfileObserverImpl pochodzi z mip::ProtectionProfile::Observer . Funkcje członków zostały zastąpione, aby używać wzorca obietnicy/przyszłego używanego w próbkach.
Deklaracja klasy ProtectionProfileObserverImpl
W nagłówku definiujemy , pochodny , a następnie ProtectionProfileObserverImplmip::ProtectionProfile::Observer zastępujemy wszystkie funkcje członkowskie.
//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 określamy akcję, która ma być podjąć dla każdego członka-członka zespołu.
Każdy członek akceptuje dwa parametry. Pierwszy to udostępniony wskaźnik dla zajęć, które pracujemy w funkcji. ProtectionObserver::OnLoadSuccessspodziewalibyśmy się otrzymać mip::ProtectionProtection . ProtectionObserver::OnAddEngineSuccessmip::ProtectionEngine
Drugi to udostępniony wskaźnik kontekstu . W naszej implementacji kontekst jest odwołaniem do std::promise , przekazywane jako shared_ptr<void> . Pierwszy wiersz funkcji rzutuje na , a następnie std::promise przechowywany w obiekcie o nazwie promise .
Na koniec przyszłość jest gotowa przez ustawienie promise->set_value() i przejście w mip::ProtectionProtection obiekcie.
//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);
};
Podczas tworzenia wystąpienia dowolnej klasy ZESTAWU SDK lub używania funkcji wykonującej asynchroniczne operacje przekażemy implementację konstruktora ustawień lub funkcji synchronizacji. Podczas tworzenia wystąpienia mip::ProtectionProfile::Settings obiektu konstruator przyjmuje mip::ProtectionProfile::Observer jako jeden z parametrów. W poniższym przykładzie pokazano niestandardowy ProtectionProfileObserverImpl , używany w mip::ProtectionProfile::Settings konstruatorze.
Implementacja projektu ProtectionHandler
Podobnie jak w przypadku inspektora ochrony mip::ProtectionHandler implementuje klasę do mip::ProtectionHandler::Observer obsługi asynchronicznych powiadomień zdarzeń podczas operacji ochrony. Implementacja jest podobna do opisanej powyżej. ProtectionHandlerObserverImpl zdefiniowano częściowo poniżej. Pełną implementację można znaleźć w przykładowym GitHub ponownego wdrożenia.
Deklaracja klasy 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;
};
ProtectionHandlerObserverImpl Częściowa implementacja
Ta próbka to tylko dwie pierwsze funkcje, ale pozostałe są w nich w podobny sposób jak w przypadku pozostałych ProtectionObserver funkcji.
//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);
};