Microsoft Information Protection SDK - Osservatori di Protection SDK
Protection SDK contiene tre classi observer. I membri observer sono virtuali e possono essere sottoposti a override per gestire i callback per le operazioni asincrone.
-
Profilo di protezione:
mip::ProtectionProfile::Observer
-
Motore di protezione:
mip::ProtectionEngine::Observer
-
Gestore protezione:
mip::ProtectionHandler::Observer
Al termine di un'operazione asincrona, viene chiamata la OnXxx()
funzione membro corrispondente al risultato. Gli esempi sono OnLoadSuccess()
, OnLoadFailure()
e OnAddEngineSuccess()
per mip::ProtectionProfile::Observer
.
Gli esempi seguenti illustrano il modello promise/future, che viene usato anche dagli esempi dell'SDK e possono essere estesi per implementare il comportamento di callback desiderato.
Implementazione di ProtectionProfile Observer
Nell'esempio seguente è stata creata una classe derivata ProtectionProfileObserverImpl
da mip::ProtectionProfile::Observer
. Le funzioni membro sono state sottoposte a override per usare il modello promise/futuro usato in tutti gli esempi.
Dichiarazione di classe ProtectionProfileObserverImpl
Nell'intestazione si definisce ProtectionProfileObserverImpl
, derivando da mip::ProtectionProfile::Observer
, quindi si esegue l'override di ognuna delle funzioni membro.
//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;
};
Implementazione di ProtectionProfileObserverImpl
Nell'implementazione stessa si definisce semplicemente un'azione da eseguire per ogni funzione membro osservatore.
Ogni membro accetta due parametri. Il primo è un puntatore condiviso alla classe gestita nella funzione.
ProtectionObserver::OnLoadSuccess
si prevede di ricevere un oggetto mip::ProtectionProtection
, ProtectionObserver::OnAddEngineSuccess
si aspetterebbe mip::ProtectionEngine
.
Il secondo è un puntatore condiviso al contesto. Nell'implementazione il contesto è un riferimento a un std::promise
oggetto , passato come shared_ptr<void>
. La prima riga della funzione esegue il cast di questo oggetto in std::promise
, quindi archiviato in un oggetto denominato promise
.
Infine, il futuro è pronto impostando promise->set_value()
e passando l'oggetto 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);
};
Quando si crea un'istanza di qualsiasi classe SDK o si usa una funzione che esegue operazioni asincrone, si passerà l'implementazione dell'osservatore al costruttore delle impostazioni o alla funzione asincrona stessa. Quando si crea un'istanza dell'oggetto mip::ProtectionProfile::Settings
, il costruttore accetta mip::ProtectionProfile::Observer
come uno dei parametri. L'esempio seguente mostra l'oggetto personalizzato ProtectionProfileObserverImpl
usato in un mip::ProtectionProfile::Settings
costruttore.
Implementazione di ProtectionHandler Observer
Analogamente all'osservatore protezione, mip::ProtectionHandler
implementa una mip::ProtectionHandler::Observer
classe per la gestione delle notifiche degli eventi asincrone durante le operazioni di protezione. L'implementazione è simile a quella descritta in precedenza.
ProtectionHandlerObserverImpl
è parzialmente definito di seguito. L'implementazione completa è disponibile nel repository di esempio gitHub.
Dichiarazione di classe 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;
};
Implementazione parziale di ProtectionHandlerObserverImpl
Questo esempio è solo le prime due funzioni, ma le funzioni rimanenti usano un modello simile a questi e a 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);
};