Sdílet prostřednictvím


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::OnLoadSuccessoč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::promiseodkazem 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