3.2.4.2 Completion of a MOVE_NOTIFICATION Message
See section 3.2.5.6 for information on the initiation of this request. Note in that definition that this MOVE_NOTIFICATION message is in reference to one volume, identified by the pvolid field of the TRKSVR_CALL_MOVE_NOTIFICATION structure of the request.
The processing performed by the client upon completion of the MOVE_NOTIFICATION message depends on the return value from the LnkSvrMessage call:
Zero:
As explained in 3.2.5.6, the cNotifications field in the TRKSVR_CALL_MOVE_NOTIFICATION structure of the request represents the number of notifications sent from the client to the server. Also, the cProcessed field in that structure, upon completion of the request, represents the number of notifications that were processed by the server (see section 3.1.4.2).
The client MUST increment the MoveNotificationCursor value for the volume's MoveNotificationList by the number of entries indicated by cProcessed. If this increment moves the MoveNotificationCursor past the end of the entries in the MoveNotificationList, it MUST be cleared.
If the cProcessed field is equal to the cNotifications field, the client MUST take the following steps:
If entries remain in this MoveNotificationList of the volume identified by the MoveNotificationVolumeCursor, then the client MUST initiate a new MOVE_NOTIFICATION message, following the steps in section 3.2.6.1.
Otherwise, if the MoveNotificationVolumeCursor does not already reference the last entry in the ClientVolumeTable, then the client MUST advance the MoveNotificationVolumeCursor to the next entry in the ClientVolumeTable, and go back to the previous step.
If neither of the previous two items is true, the client MUST clear the MoveNotificationVolumeCursor.
Note that, in the absence of failures, the preceding behavior can cause the client to send a series of MOVE_NOTIFICATION messages, such that a MOVE_NOTIFICATION message is sent for each of the entries of the MoveNotificationList of each of the volumes in the ClientVolumeTable.
If, however, the cProcessed field is less than the cNotifications field, then the client MUST follow the steps defined in the "Any other return value" entry at the end of this section.
TRK_S_OUT_OF_SYNC:
This return value indicates that the provided VolumeSequenceNumber did not match what the server was expecting, and that none of the notifications was processed. In this case, the seq field returned by the server in the TRKSVR_CALL_MOVE_NOTIFICATION structure of the request indicates the expected value.
The client MUST respond as follows:
If the MoveSequenceNumber field of the entry in the MoveNotificationList referenced by the MoveNotificationCursor is less than the seq value returned by the server, then the client MUST send a new MOVE_NOTIFICATION message to the server, as specified in section 3.2.5.6, except that the client MUST set the fForceSeqNumber field in that MOVE_NOTIFICATION message to 1.
Otherwise, if there is an entry in the MoveNotificationList with a MoveSequenceNumber that matches the seq field, then the client MUST update the MoveNotificationCursor to reference that entry, and the client MUST send a new MOVE_NOTIFICATION message to the server, as specified in section 3.2.5.6.
If neither of the previous two items is true, the client MUST update the MoveNotificationCursor to reference the oldest entry in the MoveNotificationList, and MUST send a new MOVE_NOTIFICATION message to the server, as specified in section 3.2.5.6, except that the client MUST set the fForceSeqNumber field in that MOVE_NOTIFICATION message to 1.
TRK_S_VOLUME_NOT_OWNED or TRK_S_VOLUME_NOT_FOUND:
This return value indicates that the client computer is not the VolumeOwner of the VolumeID for the volume indicated in the request. If the VolumeState value for this volume is the Owned value, it MUST be set to NotOwned, and the EnterNotOwnedTime value MUST be set to the current date and time.
TRK_S_NOTIFICATION_QUOTA_EXCEEDED:
This return value indicates that the server's FileTable has reached its maximum size. The client MUST set its FileTableQuotaExceeded flag to True, as specified in section 3.2.1.
The client also MUST increment the MoveNotificationCursor for the volume's MoveNotificationList by the number of entries indicated by the cProcessed field.
Any other return value:
If any other value is returned, and the MOVE_NOTIFICATION message was sent as part of the VolumeInitializationTimer processing described in section 3.2.5.1, then the client MUST put the VolumeInitializationTimer into its retry state, as described in section 3.2.2.