Microsoft Information Protection SDK - Observasi File SDK

File SDK berisi dua kelas pengamat. Anggota pengamat bersifat virtual dan dapat ditimpa untuk menangani panggilan balik peristiwa.

Ketika operasi asinkron selesai, fungsi anggota OnXxx() yang sesuai dengan hasil dipanggil. Contoh adalah OnLoadSuccess(), OnLoadFailure(), dan OnAddEngineSuccess() untuk mip::FileProfile::Observer.

Contoh-contoh ini menunjukkan pola janji/masa depan, yang juga digunakan oleh sampel SDK, dan dapat diperluas untuk menerapkan perilaku panggilan balik yang diinginkan.

Implementasi Pemantau Profil File

Dalam contoh berikut, kami membuat kelas, ProfileObserver yang berasal dari mip::FileProfile::Observer. Fungsi anggota telah digantikan untuk menggunakan pola future/promise yang digunakan di seluruh contoh.

Catatan: Sampel hanya diimplementasikan sebagian dan tidak menyertakan pembatalan mip::FileEngine terhadap pengamat terkait.

profile_observer.h

Dalam bagian header, kita mendefinisikan ProfileObserver, yang diturunkan dari mip::FileProfile::Observer, lalu mengganti setiap fungsi anggotanya.

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

Dalam implementasi itu sendiri, kami mendefinisikan tindakan yang harus diambil untuk setiap fungsi anggota pengamat.

Setiap anggota menerima dua parameter. Yang pertama adalah pointer berbagi ke kelas yang kami tangani dalam fungsi. ProfileObserver::OnLoadSuccess akan mengharapkan menerima mip::FileProfile. ProfileObserver::OnAddEngineSuccess akan mengharapkan mip::FileEngine.

Yang kedua adalah penunjuk berbagi ke konteks. Dalam implementasi kami, konteksnya adalah referensi ke std::promise, yang diteruskan oleh referensi sebagai std::shared_ptr<void>. Baris pertama dari fungsi ini mengubah ini menjadi std::promise, lalu disimpan dalam sebuah objek yang disebut promise.

Akhirnya, masa depan disiapkan dengan mengatur promise->set_value() dan memasukkan objek 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.

Ketika kita membuat instans kelas SDK atau menggunakan fungsi yang melakukan operasi asinkron, kita meneruskan implementasi pengamat ke konstruktor pengaturan atau fungsi asinkron itu sendiri. When instantiating the mip::FileProfile::Settings object, the constructor takes in mip::FileProfile::Observer as one of the parameters. Contoh ini menunjukkan kustom kami ProfileObserver, digunakan dalam konstruktor mip::FileProfile::Settings.

Implementasi Pola Pengamat FileHandler

Mirip dengan pengamat profil, mip::FileHandler mengimplementasikan kelas mip::FileHandler::Observers untuk menangani pemberitahuan asinkron peristiwa selama operasi file. Pelaksanaan ini mirip dengan yang dijelaskan di atas. FileHandlerObserver didefinisikan sebagian di bawah ini.

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

Sampel ini hanya mencakup dua fungsi pertama, tetapi fungsi-fungsi yang tersisa menggunakan pola yang serupa dengan kedua fungsi tersebut dan dengan 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