3.2.4.5 Peeking a Message by Using a Cursor

To peek a message by using a cursor, the following inputs are expected:

QueueHandle: Handle of the queue to be peeked from.

TimeOut: Set to the time-out in milliseconds.

Action: Set to MQ_ACTION_PEEK_CURRENT or MQ_ACTION_PEEK_NEXT, as described in section 3.1.4.1.

The client MUST perform the following actions to process this event:

  • Create a PendingRemoteReadEntry (section 3.2.1.1), referred to as rPendingRemoteReadEntry, and do the following:

    • Set rPendingRemoteReadEntry.OpenQueueDescriptorHandle equal to QueueHandle.

    • Set rPendingRemoteReadEntry.RequestId equal to a value that uniquely identifies this call from all other pending calls to this protocol. This value MUST NOT be equal to the RequestId of any other PendingRemoteReadEntry in rPendingRemoteReadEntryCollection.

    • Add rPendingRemoteReadEntry to rPendingRemoteReadEntryCollection.

After creating a PendingRemoteReadEntry, the client SHOULD<30> call the RemoteQmGetVersion method to determine the capabilities of the server. The client SHOULD check for the following conditions:

  • pMajor is less than 5.

  • pMajor is equal to 5, and pMinor is less than 1.

  • pMajor is equal to 5, and pMinor is less than 1, and pBuildNumber is less than 951.

    If any of the above conditions are satisfied, the client MUST:

    • Call the RemoteQMStartReceive method and MUST specify the following parameter values for the REMOTEREADDESC structure (lpRemoteReadDesc):

      • hRemoteQueue set to the phQueue out parameter of the qmcomm:R_QMOpenRemoteQueue, as specified in [MS-MQMP] section 3.1.4.2.

      • dwQueue set to the DWORD pointed to by the dwpQueue out parameter of the qmcomm:R_QMOpenRemoteQueue, as specified in [MS-MQMP] section 3.1.4.2.

      • hCursor set to the cursor handle obtained from qmcomm:R_QMCreateRemoteCursor, as specified in [MS-MQMP] section 3.1.4.4.

      • dwSize set to 0.

      • lpBuffer set to NULL.

      • ulAction set to Action.

      • ulTimeout set to TimeOut.

      • dwRequestID set to rPendingRemoteReadEntry.RequestId.

        Else if none of the above conditions are satisfied, the client MUST:

    • Call the RemoteQMStartReceive2 method and MUST specify the following parameter values for the REMOTEREADDESC2 structure (lpRemoteReadDesc2):

      • hRemoteQueue set to the phQueue out parameter of the qmcomm:R_QMOpenRemoteQueue, as specified in [MS-MQMP] section 3.1.4.2.

      • dwQueue set to the DWORD pointed to by the dwpQueue out parameter of the qmcomm:R_QMOpenRemoteQueue, as specified in [MS-MQMP] section 3.1.4.2.

      • hCursor set to the cursor handle obtained from qmcomm:R_QMCreateRemoteCursor, as specified in [MS-MQMP] section 3.1.4.4.

      • dwSize set to 0.

      • lpBuffer set to NULL.

      • ulAction set to Action.

      • ulTimeout set to TimeOut.

      • dwRequestID set to rPendingRemoteReadEntry.RequestId.

      • SequentialId set to 0.

The client MUST then perform the following actions to process this event:

  • Set rPendingRemoteReadEntry.RemoteReadHandle to the returned pphContext.

  • Reconstruct the message, as specified in [MS-MQMQ] section 2.2.18, from the returned lpBuffer element of the REMOTEREADDESC structure (lpRemoteReadDesc), which contains a UserMessage Packet ([MS-MQMQ] section 2.2.20).

  • Remove the rPendingRemoteReadEntry element from rPendingRemoteReadEntryCollection.