Compartir a través de


Estilos de comunicación y filtrado de notificaciones

En esta sección se describe la interfaz entre el proceso de cola y los componentes de impresión, como el procesador de impresión, el controlador y el monitor.

Filtrado de notificaciones

El tipo enumerado PrintAsyncNotifyUserFilter se usa para dos situaciones. En el primero de estos componentes de impresión que se ejecuta dentro del administrador de trabajos de cola, llama a la función CreatePrintAsyncNotifyChannel para crear un canal de notificación. El llamador pasa un enumerador del tipo enumerado PrintAsyncNotifyUserFilter para especificar qué clientes de escucha pueden recibir notificaciones. En la segunda situación, un cliente de escucha llama a la función RegisterForPrintAsyncNotifications para registrarse para la notificación. El autor de la llamada pasa uno de los enumeradores PrintAsyncNotifyUserFilter para indicar qué notificaciones debe recibir.

typedef enum
{
  kPerUser,
  kAllUsers
} PrintAsyncNotifyUserFilter;

En la ilustración siguiente, el enumerador kPerUser se usa en la llamada a la función CreatePrintAsyncNotifyChannel . Como resultado, solo los agentes de escucha que se ejecutan en la misma cuenta de usuario que el usuario que realizó el registro pueden recibir notificaciones.

diagrama que ilustra el filtrado del agente de escucha por usuario.

En la ilustración siguiente, el enumerador kAllUsers se usa en la llamada a la función CreatePrintAsyncNotifyChannel . Como resultado, todos los agentes de escucha interesados en la impresora o el servidor pueden recibir notificaciones. Tenga en cuenta que solo los administradores pueden usar la configuración kAllUsers en las llamadas a esta función.

diagrama que ilustra la notificación a todos los agentes de escucha.

En la ilustración siguiente se muestra la situación en la que el usuario 1 y el usuario 2 se han registrado para las notificaciones mediante una llamada a la función RegisterForPrintAsyncNotifications , pasando el enumerador kPerUser en la llamada. De las tres notificaciones enviadas, el usuario de escucha 1 recibe notificaciones del usuario 1 en la sesión 0 o en la sesión 1. El usuario de escucha 2 recibe notificaciones del usuario 2 en la sesión 2.

diagrama que ilustra el filtrado por usuario de las notificaciones.

Si los clientes de escucha que se muestran en la ilustración anterior habían llamado RegisterForPrintAsyncNotifications, pero esta vez pasando el enumerador kAllUsers en la llamada, todos los agentes de escucha de todas las sesiones habrían recibido las tres notificaciones. Tenga en cuenta que solo los administradores pueden usar el enumerador kAllUsers en llamadas a esta función.

Administradores

Un administrador es un usuario con derechos de PRINTER_ACCESS_ADMINISTER para el objeto de impresión especificado. Un administrador puede enviar notificaciones a cualquier persona y recibir notificaciones de cualquier persona. Tenga en cuenta que el filtro de notificación todavía se aplica.

En la ilustración siguiente, Joe envía una notificación en un canal con un kPerUser. Cuando el canal se filtra sobre la base de este enumerador, la notificación solo se debe enviar a las sesiones que pertenecen al usuario 1, es decir, la sesión 1. Sin embargo, la notificación también se envía a la sesión 2, ya que hay un administrador escuchando allí y escucha notificaciones de este tipo. Tenga en cuenta que el administrador de la sesión 3 no recibe la notificación, ya que los tipos de notificación no son los mismos.

diagrama que ilustra el filtrado por usuario y tipo de notificación.

Especificar el tipo de comunicación

Al especificar un tipo de comunicación, el componente de impresión indica si se espera una respuesta del cliente de escucha, así como la forma en que el administrador de colas controla el caso cuando las notificaciones se devuelven desde varios clientes.

typedef enum
{
  kBidirectional = 1,
  kUnidirectional,
} PrintAsyncNotifyConversationStyle

Hay dos tipos de comunicación: unidireccional y bidireccional. En la comunicación unidireccional, un cliente de escucha no responde a una notificación de cola. En este caso, el cliente de escucha no puede devolver notificaciones porque recibe un puntero de interfaz IPrintAsyncNotifyChannelNULL. En la comunicación bidireccional, el cliente envía una respuesta cuando recibe una notificación y lleva a cabo un diálogo con el componente de impresión. Este es el caso de notificación de la interfaz de usuario.

La situación en la que varias sesiones reciben una notificación de interfaz de usuario merece un comentario. En esta situación, el administrador de colas abre un canal y notifica a todos los agentes de escucha que coincidan con los filtros, enviándolos la primera notificación. Cuando el primer agente de escucha responde, el administrador de trabajos de cola cierra los demás canales y el cuadro de diálogo continúa con el primer cliente.

Si un administrador (por ejemplo) inicia sesión antes de que un cliente de escucha registrado responda, el administrador recibe la misma notificación de interfaz de usuario que el cliente de escucha.

Cuando el primer usuario (el administrador, por ejemplo) envía la respuesta, el administrador marca las conexiones con los demás clientes como "cerradas". Cuando el otro cliente de escucha responde finalmente, recibe un mensaje de "canal cerrado".

Tipos de notificación

El tipo de notificación es un GUID que acepta el administrador de colas y usa para filtrar los clientes del agente de escucha. (Vea la definición del tipo PrintAsyncNotificationType en el archivo de encabezado Prnasnot.h). Cualquier cliente del mecanismo de notificación asincrónica del administrador de colas puede definir su propio tipo de notificación. Aunque el administrador de colas no es consciente del significado del tipo de notificación que se envía, sigue filtrando los clientes de escucha en función del tipo de notificación.

Cada notificación debe tener un tipo de datos de notificación asociado. Este tipo identifica el esquema de datos de notificación.

Además del tipo de datos de notificación, hay un tipo asociado al canal, el tipo de canal de notificación. Un remitente de notificación y un cliente de escucha usan el tipo de canal de notificación para diferentes propósitos.

En el lado remitente del canal, cuando un componente de impresión abre un canal, puede especificar el tipo de notificaciones que pretende enviar a través de ese canal. Todas las notificaciones que pasan a través de ese canal deben ser del mismo tipo que el tipo de canal de notificación.

El remitente siempre debe asociar un tipo a una notificación para que el administrador de colas "sepa" cómo enviarlo a los clientes de escucha adecuados. Un cliente de escucha debe validar los datos según su propio esquema. El tipo de notificación identifica este esquema.

En el lado del agente de escucha del canal, un cliente de escucha puede pedir que reciba un tipo de notificación especificando un tipo de datos de notificación determinado cuando se registra.

El administrador de colas define un tipo de notificación especial que se usa para anunciar a los clientes que escuchan que el servicio o la aplicación han muerto.

const GUID NOTIFICATION_RELEASE;

El cliente de escucha solo puede recibir este tipo de mensaje cuando se llama a su método IPrintAsyncNotifyCallback::ChannelClosed .

Identificador de registro de notificaciones

Cuando un cliente se registra para las notificaciones, el administrador de colas del lado servidor mantiene una tabla interna con información sobre la aplicación, como su contexto de seguridad. El identificador de registro de notificaciones es una estructura opaca que recibe el cliente.

El cliente solo puede anular el registro para recibir notificaciones mediante este identificador.