通知筛选和通信样式

本部分介绍后台处理程序进程与打印组件(如打印处理器、驱动程序和监视器)之间的接口。

通知筛选

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 方法时,侦听客户端才能接收此类消息。

通知注册句柄

当客户端注册通知时,服务器端后台处理程序会维护一个内部表,其中包含有关应用程序的信息,例如其安全上下文。 通知注册句柄是客户端接收的不透明结构。

客户端只能使用此句柄取消注册以接收通知。