Microsoft 信息保护 SDK - 文件 SDK 观察程序

文件 SDK 包含两个观察程序类。 观察者成员是虚拟的,可以将其重写以处理事件回调。

当异步操作完成时,将会调用与结果对应的 OnXxx() 成员函数。 例如,对于 mip::FileProfile::ObserverOnLoadSuccess()OnLoadFailure()OnAddEngineSuccess()

下面的示例演示了 SDK 示例也同样使用的承诺/未来模式,并且可以进行扩展以实现所需的回调行为。

文件配置文件观察者实现

在下面的示例中,我们创建了一个类 ProfileObserver,它派生自 mip::FileProfile::Observer。 成员函数已被重写,以便在整个示例中使用未来/承诺模式。

注意:以下示例仅部分实现,不包括对 mip::FileEngine 相关观察者的替代。

profile_observer.h

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

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

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

每个成员可接受两个参数。 第一个是指向我们在函数中处理的类的共享指针。 ProfileObserver::OnLoadSuccess 预计会收到 mip::FileProfileProfileObserver::OnAddEngineSuccess 预计会收到 mip::FileEngine

第二个是指向“上下文”的共享指针。 在我们的实现中,上下文是对 std::promise 的引用,通过引用传递为 std::shared_ptr<void>。 函数的第一行将此强制转换为 std::promise,然后存储在一个名为 promise 的对象中。

最后,通过设置 promise->set_value() 并传入 mip::FileProfile 对象来准备未来。

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

当我们实例化任何 SDK 类或使用执行异步操作的函数时,我们会将观察者实现传递给设置构造函数或异步函数本身。 实例化 mip::FileProfile::Settings 对象时,构造函数会将 mip::FileProfile::Observer 作为一个参数使用。 下面的示例显示了我们在 mip::FileProfile::Settings 构造函数中使用的自定义 ProfileObserver

FileHandler 观察者实现

与配置文件观察者类似,mip::FileHandler 将会实现一个 mip::FileHandler::Observers 类,用于在文件操作期间处理异步事件通知。 实现与上面详述的实现类似。 下面部分定义了 FileHandlerObserver

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

此示例只包含了前两个函数,剩余的函数使用的模式与这些函数和 ProfileObserver 类似。

#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