Zestaw SDK usługi Microsoft Information Protection — obserwatorzy zestawu SDK plików
Zestaw SDK plików zawiera dwie klasy obserwatorów. Elementy członkowskie obserwatora są wirtualne i mogą być zastępowane w celu obsługi wywołań zwrotnych zdarzeń.
Po zakończeniu OnXxx()
operacji asynchronicznej wywoływana jest funkcja składowa odpowiadająca wynikowi. Przykłady to OnLoadSuccess()
, OnLoadFailure()
i OnAddEngineSuccess()
dla .mip::FileProfile::Observer
W poniższych przykładach pokazano wzorzec obietnicy/przyszłości, który jest również używany przez przykłady zestawu SDK i można go rozszerzyć w celu zaimplementowania żądanego zachowania wywołania zwrotnego.
Implementacja obserwatora profilu pliku
W poniższym przykładzie utworzyliśmy klasę, ProfileObserver
która pochodzi z klasy mip::FileProfile::Observer
. Funkcje składowe zostały zastąpione, aby używać wzorca przyszłości/obietnicy używanego w próbkach.
Uwaga: poniższe przykłady są implementowane tylko częściowo i nie obejmują przesłonięć powiązanych mip::FileEngine
obserwatorów.
profile_observer.h
W nagłówku definiujemy ProfileObserver
element , wyprowadzając z mip::FileProfile::Observer
, a następnie zastępujemy poszczególne funkcje składowe.
class ProfileObserver final : public mip::FileProfile::Observer {
public:
ProfileObserver() { }
void OnLoadSuccess(const std::shared_ptr<mip::FileProfile>& profile, const std::shared_ptr<void>& context) override;
void OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) override;
//TODO: Implement mip::FileEngine related observers.
};
profile_observer.cpp
W samej implementacji definiujemy akcję, która ma być wykonywana dla każdej funkcji składowej obserwatora.
Każdy element członkowski akceptuje dwa parametry. Pierwszy to wskaźnik współużytkowany do klasy, która obsługujemy w funkcji. ProfileObserver::OnLoadSuccess
oczekuje się, że otrzyma element mip::FileProfile
. ProfileObserver::OnAddEngineSuccess
oczekiwany mip::FileEngine
przez program .
Drugi to wskaźnik współużytkowany do kontekstu. W naszej implementacji kontekst jest odwołaniem do std::promise
elementu , przekazanego przez odwołanie jako std::shared_ptr<void>
. Pierwszy wiersz funkcji rzutuje to na std::promise
, a następnie przechowywany w obiekcie o nazwie promise
.
Na koniec przyszłość jest gotowa, ustawiając promise->set_value()
obiekt i przekazując go mip::FileProfile
.
#include "profile_observer.h"
#include <future>
//Called when FileProfile is successfully loaded
void ProfileObserver::OnLoadSuccess(const std::shared_ptr<mip::FileProfile>& profile, const std::shared_ptr<void>& context) {
//cast context to promise
auto promise =
std::static_pointer_cast<std::promise<std::shared_ptr<mip::FileProfile>>>(context);
//set promise value to profile
promise->set_value(profile);
}
//Called when FileProfile 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::FileProfile>>>(context);
promise->set_exception(error);
}
//TODO: Implement mip::FileEngine related observers.
Gdy utworzymy wystąpienie dowolnej klasy zestawu SDK lub użyjemy funkcji wykonującej operacje asynchroniczne, przekażemy implementację obserwatora do konstruktora ustawień lub samej funkcji asynchronicznej. Podczas tworzenia mip::FileProfile::Settings
wystąpienia obiektu konstruktor przyjmuje mip::FileProfile::Observer
jako jeden z parametrów. W poniższym przykładzie pokazano niestandardowy element ProfileObserver
, używany w konstruktorze mip::FileProfile::Settings
.
Implementacja obserwatora programu FileHandler
Podobnie jak obserwator profilu, mip::FileHandler
klasa implementuje klasę mip::FileHandler::Observers
do obsługi asynchronicznych powiadomień o zdarzeniach podczas operacji na plikach. Implementacja jest podobna do powyższej. FileHandlerObserver
jest częściowo zdefiniowany poniżej.
file_handler_observer.h
#include "mip/file/file_handler.h"
class FileHandlerObserver final : public mip::FileHandler::Observer {
public:
void OnCreateFileHandlerSuccess(
const std::shared_ptr<mip::FileHandler>& fileHandler,
const std::shared_ptr<void>& context) override;
void OnCreateFileHandlerFailure(
const std::exception_ptr& error,
const std::shared_ptr<void>& context) override;
//TODO: override remaining member functions inherited from mip::FileHandler::Observer
};
file_handler_observer.cpp
Ten przykład to tylko dwie pierwsze funkcje, ale pozostałe funkcje używają podobnego wzorca do tych i do ProfileObserver
.
#include "file_handler_observer.h"
void FileHandlerObserver::OnCreateFileHandlerSuccess(const std::shared_ptr<mip::FileHandler>& fileHandler, const std::shared_ptr<void>& context) {
auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::FileHandler>>>(context);
promise->set_value(fileHandler);
}
void FileHandlerObserver::OnCreateFileHandlerFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) {
auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::FileHandler>>>(context);
promise->set_exception(error);
}
//TODO: override remaining member functions inherited from mip::FileHandler::Observer