Microsoft 資訊保護 SDK - 檔案 SDK 觀察者
檔案 SDK 包含兩個觀察者類別。 觀察者成員是虛擬的,可以覆寫以處理事件回呼。
非同步作業完成時, OnXxx()
會呼叫對應至結果的成員函式。 範例包括 OnLoadSuccess()
、 OnLoadFailure()
和 OnAddEngineSuccess()
。 mip::FileProfile::Observer
下列範例示範 SDK 範例也會使用 promise/future 模式,並可擴充以實作所需的回呼行為。
檔案設定檔觀察者實作
在下列範例中,我們已建立衍生自 mip::FileProfile::Observer
的類別 ProfileObserver
。 已覆寫成員函式,以在整個範例中使用未來/承諾模式。
注意 :下列範例只會部分實作,且不包含相關觀察者覆 mip::FileEngine
寫。
profile_observer.h
在 標頭中,我們會定義 ProfileObserver
衍生自 mip::FileProfile::Observer
,然後覆寫每個成員函式。
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::FileProfile
。 ProfileObserver::OnAddEngineSuccess
預期會是 mip::FileEngine
。
第二個是內容的 共用指標 。 在我們的實作中,內容是以 傳址 std::shared_ptr<void>
方式傳遞的 std::promise
參考。 函式的第一行會將這個 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 Observer 實作
與設定檔觀察者類似,會 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