Microsoft Information Protection SDK – Sledovatelé 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í asynchronní operace je volána členská funkce OnXxx(), která odpovídá výsledku. Příklady jsou OnLoadSuccess(), OnLoadFailure(), a OnAddEngineSuccess() pro mip::FileProfile::Observer.

Tyto příklady demonstrují model příslibu a budoucnosti, který také používají ukázky 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 future/promise použitý v celých příkladech.

Poznámka: Ukázky jsou implementovány pouze částečně a nezahrnují úpravy u mip::FileEngine souvisejících pozorovatelů.

profile_observer.h

V hlavičce definujeme ProfileObserver, odvozenou z mip::FileProfile::Observer, a poté přepíšeme každou z členských funkcí.

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 pro každou funkci člena pozorovatele.

Každý člen přijímá dva parametry. První je sdílený ukazatel na třídu, se kterou pracujeme v této funkci. ProfileObserver::OnLoadSuccess očekává, že obdrží mip::FileProfile. ProfileObserver::OnAddEngineSuccess očekával by mip::FileEngine.

Druhý je sdílený ukazatel na kontext. V naší implementaci je kontext odkazem na std::promise, který je předán jako std::shared_ptr<void>. První řádek funkce převede toto na std::promise, poté je uložen do objektu nazvaného promise.

Nakonec se připraví budoucnost 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ů. Tento příklad ukazuje náš vlastní ProfileObserver, použitý v konstruktoru mip::FileProfile::Settings .

Implementace pozorovatele obslužné rutiny souboru

Podobně jako pozorovatel profilu mip::FileHandler implementuje mip::FileHandler::Observers třídu pro řízení asynchronních oznámení událostí při operacích 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 obsahuje pouze první dvě funkce, ale zbývající funkce používají podobný postup jako tyto i 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