Microsoft Information Protection SDK - Pengamat SDK Kebijakan

SDK Kebijakan berisi satu kelas pengamat. Anggota pengamat bersifat virtual dan harus dioverride untuk menangani callback pada operasi asinkron.

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

Contoh di bawah ini menunjukkan pola promise/future, yang juga digunakan oleh contoh-contoh SDK, dan dapat diperluas untuk menerapkan perilaku callback yang diinginkan.

Implementasi Pemantau Profil

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

Catatan: Sampel di bawah ini hanya diimplementasikan sebagian dan tidak menyertakan penimpaan mip::ProfileEngine untuk pengamat terkait.

profile_observer.h

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

class ProfileObserver final : public mip::Profile::Observer {
public:
ProfileObserver() { }
  void OnLoadSuccess(const std::shared_ptr<mip::Profile>& profile, const std::shared_ptr<void>& context) override;
  void OnLoadFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) override;
  //TODO: Implement remaining members
};

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 penunjuk bersama ke kelas yang ditangani oleh fungsi. ProfileObserver::OnLoadSuccess akan mengharapkan menerima mip::Profile. ProfileObserver::OnAddEngineSuccess akan mengharapkan mip::ProfileEngine.

Yang kedua adalah penunjuk berbagi ke konteks. Dalam implementasi kami, konteks adalah referensi ke std::promise, dimasukkan sebagai 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::Profile.

#include "profile_observer.h"
#include <future>

//Called when Profile is successfully loaded
void ProfileObserver::OnLoadSuccess(const std::shared_ptr<mip::Profile>& profile, const std::shared_ptr<void>& context) {
  //cast context to promise
  auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::Profile>>>(context);
  //set promise value to profile
  promise->set_value(profile);
}

//Called when Profile 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::Profile>>>(context);
  promise->set_exception(error);
}

//TODO: Implement remaining observer members

Saat melakukan operasi asinkron, implementasi pengamat diteruskan ke konstruktor pengaturan atau fungsi asinkron itu sendiri.