通知篩選和通訊樣式
本節說明多工緩衝處理常式和列印元件之間的介面,例如列印處理器、驅動程式和監視器。
通知篩選
PrintAsyncNotifyUserFilter 列舉類型用於兩種情況。 在第一個中,在多工緩衝處理常式內執行的列印元件會呼叫 CreatePrintAsyncNotifyChannel 函式來建立通知通道。 呼叫端會傳遞 PrintAsyncNotifyUserFilter 列舉類型的一個列舉值,以指定哪些接聽用戶端可以接收通知。 第二種情況是,接聽用戶端會呼叫 RegisterForPrintAsyncNotifications 函式來註冊通知。 呼叫端會傳遞其中一個 PrintAsyncNotifyUserFilter 列舉值,以指出應該接收的通知。
typedef enum
{
kPerUser,
kAllUsers
} PrintAsyncNotifyUserFilter;
在下圖中, kPerUser 列舉值用於 呼叫 CreatePrintAsyncNotifyChannel 函式。 因此,只允許在與註冊的使用者相同的使用者帳戶中執行那些接聽程式,才能接收通知。
在下一個圖中, kAllUsers 列舉值用於 呼叫 CreatePrintAsyncNotifyChannel 函式。 因此,所有對印表機或伺服器有興趣的接聽程式都可以接收通知。 請注意,只有系統管理員可以在呼叫此函式時使用 kAllUsers 設定。
下圖顯示使用者 1 和使用者 2 已藉由呼叫 RegisterForPrintAsyncNotifications 函式來註冊通知的情況,並在呼叫中傳遞 kPerUser 列舉值。 在傳送的三個通知中,接聽程式使用者 1 會在會話 0 或會話 1 中接收來自使用者 1 的通知。 接聽程式使用者 2 會在會話 2 中接收來自使用者 2 的通知。
如果上圖中顯示的接聽用戶端已呼叫 RegisterForPrintAsyncNotifications,但這次在呼叫中傳遞 kAllUsers 列舉值,則所有會話中的所有接聽程式都會收到三個通知。 請注意,只有系統管理員可以在呼叫此函式時使用 kAllUsers 列舉值。
系統管理員
系統管理員是具有指定之列印物件PRINTER_ACCESS_ADMINISTER許可權的使用者。 系統管理員可以傳送通知給任何人,並可接收來自任何人的通知。 請注意,仍會強制執行通知篩選。
在下圖中,Joe 會在具有 kPerUser的通道上傳送通知。 根據這個列舉值篩選通道時,通知應該只會傳送給屬於使用者 1 的會話,也就是會話 1。 不過,通知也會傳送至會話 2,因為有系統管理員正在接聽,並且正在接聽此類型的通知。 請注意,會話 3 中的系統管理員不會收到通知,因為通知類型不同。
指定通訊的類型
藉由指定通訊類型,列印元件會指出是否預期來自接聽程式用戶端的回應,以及多工緩衝處理常式處理從多個用戶端傳回通知時的案例。
typedef enum
{
kBidirectional = 1,
kUnidirectional,
} PrintAsyncNotifyConversationStyle
通訊有兩種類型:單向和雙向。 在單向通訊中,接聽用戶端不會回應多工緩衝處理常式通知。 在此情況下,接聽用戶端無法將通知傳回,因為它會收到 NullIPrintAsyncNotifyChannel 介面指標。 在雙向通訊中,用戶端會在收到通知時傳送回應,並帶有列印元件的對話方塊。 這是 UI 通知案例。
多個會話收到 UI 通知值得批註的情況。 在此情況下,多工緩衝處理常式會開啟通道,並通知所有符合篩選準則的接聽程式,並將它們傳送到第一個通知。 當第一個接聽程式回應時,多工緩衝處理常式會關閉其他通道,而對話會繼續與第一個用戶端一起運作。
如果系統管理員 (例如,在已註冊的接聽用戶端回應之前) 登入,系統管理員會收到與接聽用戶端相同的 UI 通知。
當第一個使用者 (系統管理員時,例如) 傳送回應,多工緩衝處理常式會將與其他用戶端的連線標示為「已關閉」。當其他接聽用戶端最終回應時,它會收到「通道已關閉」訊息。
通知類型
通知類型是多工緩衝處理常式接受並用來篩選接聽程式用戶端的 GUID。 (查看標頭檔 Prnasnot.h.) 多工緩衝處理常式非同步通知機制的任何用戶端都可以定義自己的通知類型中的 PrintAsyncNotificationType 類型定義。 即使多工緩衝處理器不知道傳送的通知類型意義,它仍會根據通知類型篩選接聽程式用戶端。
每個通知都必須有與其相關聯的通知資料類型。 此類型會識別通知資料架構。
除了通知資料類型之外,還有與通道相關聯的類型,即通知通道類型。 通知傳送者和接聽用戶端會針對不同用途使用通知通道類型。
在通道的傳送端上,當列印元件開啟通道時,它可以指定想要透過該通道傳送的通知類型。 通過該通道的所有通知都必須與通知通道類型相同。
傳送者必須一律將類型與通知產生關聯,讓多工緩衝處理常式「知道」如何將它傳送至適當的接聽用戶端。 接聽用戶端必須根據自己的架構來驗證資料。 通知類型會識別此架構。
在通道的接聽程式端,接聽用戶端可以在註冊時指定特定通知資料類型,要求接收一種類型的通知。
多工緩衝處理常式會定義特殊的通知類型,用來宣告服務或應用程式有問題接聽用戶端。
const GUID NOTIFICATION_RELEASE;
只有在呼叫接聽用戶端 的 IPrintAsyncNotifyCallback::ChannelClosed 方法時,才能接收這種類型的訊息。
通知註冊控制碼
當用戶端註冊通知時,伺服器端多工緩衝處理器會維護內部資料表,其中包含應用程式的相關資訊,例如其安全性內容。 通知註冊控制碼是用戶端收到的不透明結構。
用戶端只能使用此控制碼取消註冊以接收通知。