Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das Protection SDK enthält drei Beobachterklassen. Beobachter-Member sind virtuell und können überschrieben werden, um Rückrufe für asynchrone Vorgänge zu verarbeiten.
- Schutzprofil:
mip::ProtectionProfile::Observer
- Schutzmechanismus:
mip::ProtectionEngine::Observer
- Schutzhandler:
mip::ProtectionHandler::Observer
Wenn ein asynchroner Vorgang abgeschlossen wird, wird die OnXxx()
-Memberfunktion, die dem Ergebnis entspricht, genannt. Beispiele sind OnLoadSuccess()
, OnLoadFailure()
, und OnAddEngineSuccess()
für mip::ProtectionProfile::Observer
.
Die folgenden Beispiele veranschaulichen das zugesagte/zukünftige Muster, das auch von den SDK-Beispielen verwendet wird, und kann erweitert werden, um das gewünschte Rückrufverhalten zu implementieren.
ProtectionProfile Beobachter-Implementierung
Im folgenden Beispiel haben wir eine Klasse erstellt, ProtectionProfileObserverImpl
die von mip::ProtectionProfile::Observer
abgeleitet ist. Die Memberfunktionen wurden überschrieben, um das in den Beispielen verwendete Zusage-/zukünftige Muster zu verwenden.
Deklaration der ProtectionProfileObserverImpl-Klasse
In dem Header definieren wir ProtectionProfileObserverImpl
, abgeleitet von mip::ProtectionProfile::Observer
, und überschreiben dann jede der Mitgliedsfunktionen.
//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;
};
ProtectionProfileObserverImpl-Implementierung
In der Implementierung selbst definieren wir einfach eine Aktion, die für jede Beobachter-Memberfunktion zu ergreifen ist.
Jedes Member akzeptiert zwei Parameter. Der erste ist ein gemeinsamer Zeiger auf die Klasse, die wir in der Funktion behandeln. ProtectionObserver::OnLoadSuccess
würde erwarten, ein mip::ProtectionProtection
zu erhalten, ProtectionObserver::OnAddEngineSuccess
würde mip::ProtectionEngine
erwarten.
Die zweite ist ein freigegebener Zeiger auf den Kontext. In unserer Implementierung bezieht sich der Kontext auf ein std::promise
, das als shared_ptr<void>
übergeben wird. Die erste Zeile der Funktion überträgt dies nach std::promise
und wird dann in einem Objekt gespeichert, das promise
heißt.
Letztendlich wird die Zukunft vorbereitet, indem promise->set_value()
festgelegt und das mip::ProtectionProtection
-Objekt übergeben wird.
//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);
};
Wenn wir eine SDK-Klasse instanziieren oder eine Funktion verwenden, die asynchrone Vorgänge ausführt, übergeben wir die Beobachterimplementierung an den Einstellungskonstruktor oder die asynchrone Funktion selbst. Beim Instanziieren des mip::ProtectionProfile::Settings
-Objekts verwendet der Konstruktor mip::ProtectionProfile::Observer
als einen der Parameter. Das folgende Beispiel zeigt unser benutzerdefiniertes ProtectionProfileObserverImpl
, das in einem mip::ProtectionProfile::Settings
-Konstruktor verwendet wird.
ProtectionHandler-Beobachterimplementierung
Ähnlich wie der Protection-Beobachter implementiert mip::ProtectionHandler
eine mip::ProtectionHandler::Observer
-Klasse zum Behandeln asynchroner Ereignisbenachrichtigungen während Schutzvorgängen. Die Implementierung ähnelt dem oben Beschriebenen. ProtectionHandlerObserverImpl
wird teilweise unten definiert. Die vollständige Implementierung finden Sie in unserem GitHub-Beispiel-Repository.
Die Klassendeklaration von 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;
};
Partielle Implementierung von ProtectionHandlerObserverImpl
Dieses Beispiel zeigt nur die ersten beiden Funktionen. Die übrigen Funktionen verwenden jedoch ein ähnliches Muster wie diese und wie 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);
};