Microsoft Information Protection SDK - 保護 SDK オブザーバー
保護 SDK には、3 つのオブザーバー クラスが含まれています。 オブザーバー メンバーは仮想であり、非同期操作のコールバックを処理するためにオーバーライドできます。
- 保護プロファイル:
mip::ProtectionProfile::Observer
- 保護エンジン:
mip::ProtectionEngine::Observer
- 保護ハンドラ:
mip::ProtectionHandler::Observer
非同期操作が完了すると、結果に対応する 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::OnLoadSuccess
は mip::ProtectionProtection
を受け取ることを期待し、ProtectionObserver::OnAddEngineSuccess
は mip::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);
};