Microsoft 信息保护 SDK - 保护 SDK 支持者

保护 SDK 包含三个观察类。 观察者成员是虚拟成员,可以重写以处理异步操作回调。

异步操作完成后,将 OnXxx() 调用与结果对应的成员函数。 示例包括 OnLoadSuccess()OnLoadFailure() 、 和 OnAddEngineSuccess()mip::ProtectionProfile::Observer

以下示例演示 promise/future 模式,该模式也由 SDK 示例使用,可以扩展该模式来实现所需的回调行为。

ProtectionProfile 观察者实现

在下面的示例中,我们创建了一个 ProtectionProfileObserverImpl 派生自 的类 mip::ProtectionProfile::Observer 。 成员函数已被重写,以使用整个示例中使用的 promise/future 模式。

ProtectionProfileObserverImpl 类声明

在 标头中,我们 ProtectionProfileObserverImpl 定义 派生自 mip::ProtectionProfile::Observer ,然后重写每个成员函数。

//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 实现

在实现本身中,我们只需定义要为每个观察成员函数执行的操作。

每个成员接受两个参数。 第一个指针是指向我们在 函数中处理的类的共享指针。 ProtectionObserver::OnLoadSuccess 预期会收到 , mip::ProtectionProtectionProtectionObserver::OnAddEngineSuccess 将预期 mip::ProtectionEngine

第二个是指向上下文 的共享 指针。 在我们的实现中,上下文是对 的引用 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 对象时,构造函数采用 mip::ProtectionProfile::Observer 作为参数之一。 以下示例显示了在构造函数中使用的 ProtectionProfileObserverImpl 自定义 mip::ProtectionProfile::Settings

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 部分实现

此示例只是前两个函数,但其余函数使用与和 类似的模式 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);
};