Microsoft Information Protection SDK — obserwatorzy zestawu SDK plików
Zestaw File SDK zawiera dwie klasy klasowych. Członkowie obserwatorzy są wirtualni i mogą zostać zastępowani, aby obsługiwać wywołania zdarzeń.
Po zakończeniu asynchronicznej operacji jest wywoływana funkcja członkowski OnXxx() odpowiadająca wynikowi. Przykłady OnLoadSuccess() to : , i dla OnLoadFailure()OnAddEngineSuccess()mip::FileProfile::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 profilu pliku
W poniższym przykładzie utworzono klasę, która ProfileObserver pochodzi z mip::FileProfile::Observer . Funkcje członków zostały zastąpione, aby używać wzorca przyszłej/obietnicy stosowanego w próbkach.
Uwaga:Poniższe przykłady są zaimplementowane tylko częściowo i nie obejmują zastępowania powiązanych obserwatorów.
profile_observer.h
W nagłówku definiujemy , pochodny , a następnie ProfileObservermip::FileProfile::Observer zastępujemy wszystkie funkcje członkowskie.
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ę do podjęcia dla każdej pełniejszej funkcji członka.
Każdy członek akceptuje dwa parametry. Pierwszy to udostępniony wskaźnik dla zajęć, które pracujemy w funkcji. ProfileObserver::OnLoadSuccess spodziewalibyśmy się otrzymać mip::FileProfile . ProfileObserver::OnAddEngineSuccess można by się mip::FileEngine spodziewać.
Drugi to udostępniony wskaźnik kontekstu . W naszej implementacji kontekst jest odwołaniem do std::promise , przekazywanego przez odwołanie jako std::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::FileProfile obiekcie.
#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.
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::FileProfile::Settings obiektu konstruator przyjmuje mip::FileProfile::Observer jako jeden z parametrów. W poniższym przykładzie pokazano niestandardowy ProfileObserver , używany w mip::FileProfile::Settings konstruatorze.
Implementacja implementacji implementacji implementacji fileHandler
Podobnie jak w przypadku profilów, implementuje klasy do mip::FileHandlermip::FileHandler::Observers obsługi asynchronicznych powiadomień o zdarzeniach podczas operacji na plikach. Implementacja jest podobna do opisanej powyżej. FileHandlerObserver zdefiniowano częściowo 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
Ta próbka to tylko dwie pierwsze funkcje, ale pozostałe są w nich w podobny sposób jak w przypadku pozostałych ProfileObserver funkcji.
#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