Microsoft Information Protection SDK — obserwatorzy zestawu SDK plików

Zestaw File SDK zawiera dwie klasy klasowych. Członkowie obserwatorzy są wirtualni i mogą zostać zastępowani, aby obsługiwać wywołania zdarzeń.

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

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

Uwaga:Poniższe przykłady są zaimplementowane tylko częściowo i nie obejmują zastępowania powiązanych obserwatorów.

profile_observer.h

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

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ę do podjęcia dla każdej pełniejszej funkcji członka.

Każdy członek akceptuje dwa parametry. Pierwszy to udostępniony wskaźnik dla zajęć, które pracujemy w funkcji. ProfileObserver::OnLoadSuccess spodziewalibyśmy się otrzymać mip::FileProfile . ProfileObserver::OnAddEngineSuccess można by się mip::FileEngine spodziewać.

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

#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.

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

Implementacja implementacji implementacji implementacji fileHandler

Podobnie jak w przypadku profilów, implementuje klasy do mip::FileHandlermip::FileHandler::Observers obsługi asynchronicznych powiadomień o zdarzeniach podczas operacji na plikach. Implementacja jest podobna do opisanej powyżej. FileHandlerObserver zdefiniowano częściowo 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

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

#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