3.11.4.1.18 PeekCurrent (Opnum 24)

The PeekCurrent method is received by the server in an RPC_REQUEST packet. In response, the server retrieves the Message that is identified by the Cursor instance variable in the referenced queue's MessagePositionList, without removing it.

 HRESULT PeekCurrent(
   [in, optional] VARIANT* WantDestinationQueue,
   [in, optional] VARIANT* WantBody,
   [in, optional] VARIANT* ReceiveTimeout,
   [in, optional] VARIANT* WantConnectorType,
   [out, retval] IMSMQMessage4** ppmsg
 );

WantDestinationQueue: A pointer to a VARIANT (VT_BOOL).

If this parameter is not specified by the client, the server MUST use the default value VARIANT_FALSE (0x0000) in place of the unspecified value.

Value

Meaning

VARIANT_TRUE

0xFFFF

The server MUST return an MSMQMessage object that has the DestinationQueueInfo property set.

VARIANT_FALSE

0x0000

Default. The server MUST return an MSMQMessage object that does not have the DestinationQueueInfo property set.

WantBody: A pointer to a VARIANT (VT_BOOL).

If this parameter is not specified by the client, the server MUST use the default value VARIANT_TRUE (0xFFFF) in place of the unspecified value.

Value

Meaning

VARIANT_TRUE

0xFFFF

Default. The server MUST return an MSMQMessage object that has the Body property set.

VARIANT_FALSE

0x0000

The server MUST return an MSMQMessage object that does not have the Body property set.

ReceiveTimeout: A pointer to a VARIANT that contains a long value (VT_I4) that specifies the time, in milliseconds, that the server MUST NOT exceed while waiting for a new message to arrive.

If this parameter is not specified by the client, the server MUST use the default value INFINITE (0xFFFFFFFF).

WantConnectorType: A pointer to a VARIANT (VT_BOOL).

If this parameter is not specified by the client, the server MUST use the default value VARIANT_FALSE (0x0000) in place of the unspecified value.

Value

Meaning

VARIANT_TRUE

0xFFFF

The server MUST return an MSMQMessage object that has the ConnectorTypeGuid property set.

VARIANT_FALSE

0x0000

Default. The server MUST return an MSMQMessage object that does not have the ConnectorTypeGuid property set.

ppmsg: A pointer to a pointer to an IMSMQMessage4 interface that MUST be set by the server with the received message.

Return Values: The method MUST return S_OK (0x00000000) on success or an implementation-specific error HRESULT on failure.

When processing this call, the server MUST follow these guidelines:

  • If the IsInitialized instance variable equals False:

    • Return an error OLE_E_BLANK (0x80040007), and take no further action.

  • If the IsClosed instance variable equals True:

    • Return an error MQ_ERROR_INVALID_HANDLE (0xC00E0007), and take no further action.

  • If refQueue.AccessType is not equal to PeekAccess or PeekAdminAccess or ReceiveAccess or ReceiveAdminAccess:

    • Return an error MQ_ERROR_ACCESS_DENIED (0xC00E0025), and take no further action.

  • If the ppmsg output parameter is NULL:

    • Return E_INVALIDARG (0x80070057), and take no further action.

  • If the message that is represented by the Cursor instance variable is in the MessageDeleted state:

    • Set the ppmsg output parameter to NULL.

    • Return an error MQ_ERROR_MESSAGE_ALREADY_RECEIVED (0xc00e001d), and take no further action.

  • Define suitable message as a Message, identified by the cursor represented by the Cursor instance variable, in the MessagePositionList of the referenced queue for which the MessagePosition.State attribute does not equal Locked or Message.AllowPeekWhenLocked equals True.

  • Starting from the Message identified by the cursor that is represented by the Cursor instance variable, continually advance the cursor seeking a suitable message. If the cursor reaches the EndQueue state, wait for more messages to arrive. Do this by raising the Peek Message event with the following arguments:

    • iQueueDesc: This MUST be set to the OpenQueueDescriptor at Cursor.OpenQueueDescriptorReference.

    • iTimeout: The amount of time to wait, in seconds.

    • iCursor: This MUST be set to a reference to the Cursor instance variable.

    • Based on the rStatus, take the following actions:

    • If rStatus is not MQ_OK and the ReceiveTimeout input parameter equals 0:

      • Set the ppmsg output parameter to NULL.

      • Return an error MQ_ERROR_MESSAGE_NOT_FOUND (0xc00e0008), and take no further action.

    • If rStatus is MQ_ERROR_IO_TIMEOUT, and the ReceiveTimeout input parameter is greater than 0 and is not equal to INFINITE, and the time-out identified by the ReceiveTimeout input parameter expires:

      • Set the ppmsg output parameter to NULL.

      • Return an error MQ_ERROR_IO_TIMEOUT (0xc00e001b), and take no further action.

    • If rStatus is MQ_OK:

      • Retrieve the suitable message from rMessage, and instantiate an MSMQMessage instance and initialize it with the suitable message, observing the requirements set forth by the WantBody, WantDestinationQueue, and WantConnectorType input parameters. For details of initializing the MSMQMessage object, refer to section 3.17.3.

      • Set the ppmsg output parameter to the newly instantiated MSMQMessage instance.

  • Return S_OK (0x00000000), and take no further action.