Microsoft Information Protection SDK - ポリシー SDK オブザーバー

ポリシー SDK には、オブザーバー クラスが 1 つ含まれています。 オブザーバー メンバーは仮想であるため、非同期操作のコールバックを処理するにはオーバーライドする必要があります。

非同期操作が完了すると、結果に対応する OnXxx() メンバー関数が呼び出されます。 例としては、mip::Profile::Observerに対する OnLoadSuccess()OnLoadFailure()OnAddEngineSuccess() です。

以下の例は、Promise/future パターンを示しています。これは SDK サンプルでも使用されており、目的のコールバック動作を実装するために拡張できます。

プロファイルオブザーバーの実装

次の例では、mip::Profile::Observer から派生したクラス ProfileObserverを作成しました。 メンバー関数は、サンプル全体で使用される future/promise パターンを使用するようにオーバーライドされています。

: 以下のサンプルは部分的にのみ実装されており、mip::ProfileEngine 関連するオブザーバーのオーバーライドは含まれていません。

profile_observer.h

ヘッダーでは、mip::Profile::Observerから派生した ProfileObserver を定義し、各メンバー関数をオーバーライドします。

class ProfileObserver final : public mip::Profile::Observer {
public:
ProfileObserver() { }
  void OnLoadSuccess(const std::shared_ptr<mip::Profile>& profile, const std::shared_ptr<void>& context) override;
  void OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) override;
  //TODO: Implement remaining members
};

profile_observer.cpp

実装自体では、各オブザーバー メンバー関数に対して実行するアクションを定義します。

各メンバーは 2 つのパラメータを受け入れます。 1 つ目は、関数によって処理されるクラスへの共有ポインタです。 ProfileObserver::OnLoadSuccessmip::Profile を受け取ることを期待します。 ProfileObserver::OnAddEngineSuccessmip::ProfileEngine を期待します。

2 番目は、contextへの共有ポインタです。 私たちの実装では、コンテキストは std::promise への参照であり、shared_ptr<void> として渡されます。 関数の最初の行は、これを std::promise にキャストし、promise というオブジェクトに格納します。

最後に、promise->set_value() を設定し、mip::Profile オブジェクトを渡すことで、未来の準備が整います。

#include "profile_observer.h"
#include <future>

//Called when Profile is successfully loaded
void ProfileObserver::OnLoadSuccess(const std::shared_ptr<mip::Profile>& profile, const std::shared_ptr<void>& context) {
  //cast context to promise
  auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::Profile>>>(context);
  //set promise value to profile
  promise->set_value(profile);
}

//Called when Profile 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::Profile>>>(context);
  promise->set_exception(error);
}

//TODO: Implement remaining observer members

非同期操作を実行する場合、オブザーバーの実装は設定コンストラクターまたは非同期関数自体に渡されます。