Microsoft Information Protection SDK – Pozorovatelé sady File SDK
Sada File SDK obsahuje dvě třídy pozorovatele. Členové pozorovatele jsou virtuální a je možné je přepsat za účelem zpracování zpětných volání událostí.
Po dokončení OnXxx()
asynchronní operace je volána členová funkce odpovídající výsledku. Příklady jsou OnLoadSuccess()
, OnLoadFailure()
a OnAddEngineSuccess()
pro mip::FileProfile::Observer
.
Následující příklady ukazují model příslibu a budoucnosti, který se používá také v ukázkách sady SDK, a lze je rozšířit, aby implementoval požadované chování zpětného volání.
Implementace pozorovatele profilu souborů
V následujícím příkladu jsme vytvořili třídu, ProfileObserver
která je odvozena z mip::FileProfile::Observer
. Členské funkce byly přepsány tak, aby používaly vzor budoucnost/příslib použitý v rámci ukázek.
Poznámka: Následující ukázky jsou implementovány pouze částečně a nezahrnují přepsání pro mip::FileEngine
související pozorovatele.
profile_observer.h
V hlavičce definujeme ProfileObserver
, odvozené od mip::FileProfile::Observer
, a pak přepíšeme všechny členské funkce.
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
V samotné implementaci definujeme akci, která se má provést pro každou členovou funkci pozorovatele.
Každý člen přijímá dva parametry. První je sdílený ukazatel na třídu, kterou zpracováváme ve funkci. ProfileObserver::OnLoadSuccess
očekává, že obdrží .mip::FileProfile
ProfileObserver::OnAddEngineSuccess
by očekával mip::FileEngine
.
Druhým je sdílený ukazatel na kontext. V naší implementaci je kontext odkazem na odkaz předaný std::promise
odkazem jako std::shared_ptr<void>
. První řádek funkce tuto funkci přetypuje na std::promise
, pak uložen v objektu s názvem promise
.
Nakonec je budoucnost připravena nastavením promise->set_value()
a předáním objektu 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.
Když vytvoříme instanci jakékoli třídy sady SDK nebo použijeme funkci, která provádí asynchronní operace, předáme implementaci pozorovatele konstruktoru nastavení nebo samotné asynchronní funkci. Při vytváření instance objektu mip::FileProfile::Settings
konstruktor přebírá mip::FileProfile::Observer
jako jeden z parametrů. Následující příklad ukazuje náš vlastní ProfileObserver
, použitý v konstruktoru mip::FileProfile::Settings
.
Implementace pozorovatele obslužné rutiny souboru
Podobně jako pozorovatel mip::FileHandler
profilu implementuje mip::FileHandler::Observers
třídu pro zpracování asynchronních oznámení událostí během operací se soubory. Implementace je podobná výše uvedené implementaci. FileHandlerObserver
je částečně definován níže.
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
Tato ukázka je pouze první dvě funkce, ale zbývající funkce používají podobný vzor jako tyto funkce a na 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