Microsoft Information Protection SDK — chętni zestawu SDK ochrony

Zestaw SDK ochrony zawiera trzy klasy klasowych ochrony. Członkowie jednakowy są wirtualni i można je zastąpić, aby obsługiwać wywołania zwrotne w przypadku asynchronicznych operacji.

Po zakończeniu asynchronicznej operacji jest wywoływana funkcja członkowski OnXxx() odpowiadająca wynikowi. Przykłady OnLoadSuccess() to : , i dla OnLoadFailure()OnAddEngineSuccess()mip::ProtectionProfile::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 szybkich plików ochrony

W poniższym przykładzie utworzono klasę, która ProtectionProfileObserverImpl pochodzi z mip::ProtectionProfile::Observer . Funkcje członków zostały zastąpione, aby używać wzorca obietnicy/przyszłego używanego w próbkach.

Deklaracja klasy ProtectionProfileObserverImpl

W nagłówku definiujemy , pochodny , a następnie ProtectionProfileObserverImplmip::ProtectionProfile::Observer zastępujemy wszystkie funkcje członkowskie.

//ProtectionProfileObserverImpl.h
class ProtectionProfileObserverImpl final : public mip::ProtectionProfile::Observer {
public:
  ProtectionProfileObserverImpl() { }
  void OnLoadSuccess(const shared_ptr<mip::ProtectionProfile>& profile, const shared_ptr<void>& context) override;
  void OnLoadFailure(const exception_ptr& error, const shared_ptr<void>& context) override;
  void OnAddEngineSuccess(const shared_ptr<mip::ProtectionEngine>& engine, const shared_ptr<void>& context) override;
  void OnAddEngineError(const exception_ptr& error, const shared_ptr<void>& context) override;
};

Implementacja ProtectionProfileObserverImpl

W samej implementacji po prostu określamy akcję, która ma być podjąć dla każdego członka-członka zespołu.

Każdy członek akceptuje dwa parametry. Pierwszy to udostępniony wskaźnik dla zajęć, które pracujemy w funkcji. ProtectionObserver::OnLoadSuccessspodziewalibyśmy się otrzymać mip::ProtectionProtection . ProtectionObserver::OnAddEngineSuccessmip::ProtectionEngine

Drugi to udostępniony wskaźnik kontekstu . W naszej implementacji kontekst jest odwołaniem do std::promise , przekazywane jako 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::ProtectionProtection obiekcie.

//protection_observers.cpp

void ProtectionProfileObserverImpl::OnLoadSuccess(
  const shared_ptr<mip::ProtectionProfile>& profile,
  const shared_ptr<void>& context) {
  auto loadPromise = static_cast<promise<shared_ptr<mip::ProtectionProfile>>*>(context.get());
  loadPromise->set_value(profile);
};

void ProtectionProfileObserverImpl::OnLoadFailure(const exception_ptr& error, const shared_ptr<void>& context) {
  auto loadPromise = static_cast<promise<shared_ptr<mip::ProtectionProfile>>*>(context.get());
  loadPromise->set_exception(error);
};

void ProtectionProfileObserverImpl::OnAddEngineSuccess(
  const shared_ptr<mip::ProtectionEngine>& engine,
  const shared_ptr<void>& context) {
  auto addEnginePromise = static_cast<promise<shared_ptr<mip::ProtectionEngine>>*>(context.get());
  addEnginePromise->set_value(engine);
};

void ProtectionProfileObserverImpl::OnAddEngineError(
  const exception_ptr& error,
  const shared_ptr<void>& context) {
  auto addEnginePromise = static_cast<promise<shared_ptr<mip::ProtectionEngine>>*>(context.get());
  addEnginePromise->set_exception(error);
};

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::ProtectionProfile::Settings obiektu konstruator przyjmuje mip::ProtectionProfile::Observer jako jeden z parametrów. W poniższym przykładzie pokazano niestandardowy ProtectionProfileObserverImpl , używany w mip::ProtectionProfile::Settings konstruatorze.

Implementacja projektu ProtectionHandler

Podobnie jak w przypadku inspektora ochrony mip::ProtectionHandler implementuje klasę do mip::ProtectionHandler::Observer obsługi asynchronicznych powiadomień zdarzeń podczas operacji ochrony. Implementacja jest podobna do opisanej powyżej. ProtectionHandlerObserverImpl zdefiniowano częściowo poniżej. Pełną implementację można znaleźć w przykładowym GitHub ponownego wdrożenia.

Deklaracja klasy ProtectionHandlerObserverImpl

//protection_observers.h

class ProtectionHandlerObserverImpl final : public mip::ProtectionHandler::Observer {
public:
  ProtectionHandlerObserverImpl() { }
  void OnCreateProtectionHandlerSuccess(const shared_ptr<mip::ProtectionHandler>& protectionHandler, const shared_ptr<void>& context) override;
  void OnCreateProtectionHandlerError(const exception_ptr& error, const shared_ptr<void>& context) override;
};

ProtectionHandlerObserverImpl Częściowa implementacja

Ta próbka to tylko dwie pierwsze funkcje, ale pozostałe są w nich w podobny sposób jak w przypadku pozostałych ProtectionObserver funkcji.

//protection_observers.cpp

void ProtectionHandlerObserverImpl::OnCreateProtectionHandlerSuccess(
  const shared_ptr<mip::ProtectionHandler>& protectionHandler,
  const shared_ptr<void>& context) {
  auto createProtectionHandlerPromise = static_cast<promise<shared_ptr<mip::ProtectionHandler>>*>(context.get());
  createProtectionHandlerPromise->set_value(protectionHandler);
};

void ProtectionHandlerObserverImpl::OnCreateProtectionHandlerError(
  const exception_ptr& error,
  const shared_ptr<void>& context) {
  auto createProtectionHandlerPromise = static_cast<promise<shared_ptr<mip::ProtectionHandler>>*>(context.get());
  createProtectionHandlerPromise->set_exception(error);
};