3.1.4.1 Reading Configuration Data
To read settings in a configuration data settings group, as specified in section 2.2.2, the client MUST open the special folder that contains the configuration data message. The client MUST call the RopGetContentsTable ROP ([MS-OXCROPS] section 2.2.4.14) with the Associated flag to open the FAI contents table, as specified in [MS-OXCFOLD] section 2.2.1.14.
The client MUST find all the rows in the FAI contents table that have the PidTagMessageClass property ([MS-OXCMSG] section 2.2.1.3) specified by the configuration data message that the client is trying to open, by using steps equivalent to the following, as specified in [MS-OXCTABL]:
Send the RopSetColumns ROP ([MS-OXCROPS] section 2.2.5.1) with the following properties:
PidTagFolderId ([MS-OXCFOLD] section 2.2.2.2.1.6)
PidTagMid ([MS-OXCFXICS] section 2.2.1.2.1)
PidTagMessageClass
PidTagRoamingDatatypes (section 2.2.2.1)
Send the RopSortTable ROP ([MS-OXCROPS] section 2.2.5.2) with a sort order that includes the following properties:
PidTagMessageClass, followed by
PidTagLastModificationTime ([MS-OXCMSG] section 2.2.2.2)
Send the RopFindRow ROP ([MS-OXCROPS] section 2.2.5.13), searching for a match on the PidTagMessageClass property.
Send the RopQueryRows ROP ([MS-OXCROPS] section 2.2.5.4) repeatedly until either the end of the table or a row with a PidTagMessageClass property that no longer matches the configuration data message is encountered.
Based on the subsort by the PidTagLastModificationTime property, pick the message with the most recent (the greatest value) modification time that includes the bit that matches the PidTagRoamingDatatypes property specified by the configuration data message. If none of the messages match the PidTagRoamingDatatypes property of the configuration data message, the client MUST pick the most recently modified of all the messages.
If the client cannot find a row that matches the PidTagMessageClass and PidTagRoamingDatatypes properties of the configuration data message, that group of settings does not exist. When reading the settings, the client MUST use default values for those settings when the configuration data message cannot be found.
If the client found a matching row, it MUST open the existing message as specified in [MS-OXCMSG] section 2.2.3.1 by opening the message, using the PidTagFolderId and PidTagMid properties from the table row and setting the ReadWrite flag in the OpenModeFlags field, by sending the RopOpenMessage ROP ([MS-OXCROPS] section 2.2.6.1).
If the client found a matching message, it MUST retrieve the serialized settings stream from the property specified by the configuration data message by using steps equivalent to the following, as specified in [MS-OXCPRPT] section 2.2.14:
Open a Stream object handle on the stream property specified by the configuration data message by sending the RopOpenStream ROP ([MS-OXCROPS] section 2.2.9.1).
Read the serialized settings by using the RopReadStream ROP ([MS-OXCROPS] section 2.2.9.2).
If multiple configuration data messages of the same type are found, the configuration data messages are deemed in conflict and MUST be resolved. If no specific conflict resolution algorithm is available, the first matching message SHOULD be used, and the client SHOULD delete the rest of the matching configuration data messages from the message store. Regardless of the method of resolution, a client SHOULD resolve such conflicts as soon as possible and SHOULD delete any duplicates, leaving only one configuration data message that is the result of the conflict resolution.