次の方法で共有


Microsoft Information Protection SDK - 保護 SDK オブザーバー

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

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

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

ProtectionProfile オブザーバーの実装

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

ProtectionProfileObserverImpl クラスの宣言

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

//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;
};

ProtectionProfileObserverImpl の実装

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

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

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

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

//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);
};

SDK クラスをインスタンス化するとき、または非同期操作を実行する関数を使用するときは、オブザーバーの実装を設定コンストラクターまたは非同期関数自体に渡します。 mip::ProtectionProfile::Settingsオブジェクトをインスタンス化するとき、コンストラクターはパラメーターの 1 つとして mip::ProtectionProfile::Observer を受け取ります。 次の例は、mip::ProtectionProfile::Settings コンストラクターで使用されるカスタムの ProtectionProfileObserverImpl を示しています。

ProtectionHandler オブザーバーの実装

保護オブザーバーと同様に、 mip::ProtectionHandler は保護操作中に非同期イベント通知を処理するための mip::ProtectionHandler::Observer クラスを実装します。 実装は上記で詳しく説明したものと似ています。 ProtectionHandlerObserverImpl の一部を以下に定義します。 完全な実装は、GitHub サンプル リポジトリ にあります。

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の部分実装

このサンプルは最初の 2 つの関数だけですが、残りの関数はこれらと ProtectionObserver と同様のパターンを使用します。

//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);
};