Udostępnij za pośrednictwem


Zestaw SDK usługi Microsoft Information Protection — obserwatorzy zestawu SDK plików

Zestaw SDK plików zawiera dwie klasy obserwatorów. Elementy członkowskie obserwatora są wirtualne i mogą być zastępowane w celu obsługi wywołań zwrotnych zdarzeń.

Po zakończeniu OnXxx() operacji asynchronicznej wywoływana jest funkcja składowa odpowiadająca wynikowi. Przykłady to OnLoadSuccess(), OnLoadFailure()i OnAddEngineSuccess() dla .mip::FileProfile::Observer

W poniższych przykładach pokazano wzorzec obietnicy/przyszłości, który jest również używany przez przykłady zestawu SDK i można go rozszerzyć w celu zaimplementowania żądanego zachowania wywołania zwrotnego.

Implementacja obserwatora profilu pliku

W poniższym przykładzie utworzyliśmy klasę, ProfileObserver która pochodzi z klasy mip::FileProfile::Observer. Funkcje składowe zostały zastąpione, aby używać wzorca przyszłości/obietnicy używanego w próbkach.

Uwaga: poniższe przykłady są implementowane tylko częściowo i nie obejmują przesłonięć powiązanych mip::FileEngine obserwatorów.

profile_observer.h

W nagłówku definiujemy ProfileObserverelement , wyprowadzając z mip::FileProfile::Observer, a następnie zastępujemy poszczególne funkcje składowe.

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ę, która ma być wykonywana dla każdej funkcji składowej obserwatora.

Każdy element członkowski akceptuje dwa parametry. Pierwszy to wskaźnik współużytkowany do klasy, która obsługujemy w funkcji. ProfileObserver::OnLoadSuccess oczekuje się, że otrzyma element mip::FileProfile. ProfileObserver::OnAddEngineSuccess oczekiwany mip::FileEngineprzez program .

Drugi to wskaźnik współużytkowany do kontekstu. W naszej implementacji kontekst jest odwołaniem do std::promiseelementu , przekazanego przez odwołanie jako std::shared_ptr<void>. Pierwszy wiersz funkcji rzutuje to na std::promise, a następnie przechowywany w obiekcie o nazwie promise.

Na koniec przyszłość jest gotowa, ustawiając promise->set_value() obiekt i przekazując go 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.

Gdy utworzymy wystąpienie dowolnej klasy zestawu SDK lub użyjemy funkcji wykonującej operacje asynchroniczne, przekażemy implementację obserwatora do konstruktora ustawień lub samej funkcji asynchronicznej. Podczas tworzenia mip::FileProfile::Settings wystąpienia obiektu konstruktor przyjmuje mip::FileProfile::Observer jako jeden z parametrów. W poniższym przykładzie pokazano niestandardowy element ProfileObserver, używany w konstruktorze mip::FileProfile::Settings .

Implementacja obserwatora programu FileHandler

Podobnie jak obserwator profilu, mip::FileHandler klasa implementuje klasę mip::FileHandler::Observers do obsługi asynchronicznych powiadomień o zdarzeniach podczas operacji na plikach. Implementacja jest podobna do powyższej. FileHandlerObserver jest częściowo zdefiniowany 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

Ten przykład to tylko dwie pierwsze funkcje, ale pozostałe funkcje używają podobnego wzorca do tych i do 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