3.2.5.3 Determining What Differences To Download

In this section, all references to the ICS state properties refer to values uploaded in the initial ICS state.

For every object in the synchronization scope, servers MUST do the following:

  • Include the following syntactical elements in the FastTransfer stream of the OutputServerObject field of the FastTransfer download ROPs, as specified in section 2.2.3.1.1, if one of the following applies:

    • Include the folderChange element, as specified in section 2.2.4.3.5, if the object specified by the InputServerObject field of the FastTransfer download ROP request is a Folder object

    • Include the messageChange element, as specified in section 2.2.4.3.11, if the object specified by the InputServerObject field is a normal message

      • And the Normal flag of the SynchronizationFlags field was set, as specified in section 2.2.3.2.1.1.1

      • And the change number is not included in the value of the MetaTagCnsetSeen property.

    • Include the messageChangeFull element, as specified in section 2.2.4.3.13, if the object specified by the InputServerObject field is an FAI message, meaning the PidTagAssociated property (section 2.2.1.5) is set to TRUE

      • And the FAI flag of the SynchronizationFlags field was set

      • And the change number is not included in the value of the MetaTagCnsetSeenFAI property (section 2.2.1.1.3).

  • If the NoDeletions flag of the SynchronizationFlags field is not set, include the deletions element, as specified in section 2.2.4.3.3, for objects that either:

  • If the NoDeletion and IgnoreNoLongerInScope flags are not set in the SynchronizationFlags field, include the deletions element for messages that went out of scope that:

    • Have their internal identifiers present in the value of the MetaTagIdsetGiven property

      • And exist in a server replica and belong to a folder that defines the synchronization scope

      • And do not match the restriction that defines the synchronization scope.

  • If the ReadState flag of the SynchronizationFlags field is set, include the readStateChanges element, as specified in section 2.2.4.3.22, for messages that:

    • Do not have their change numbers for read and unread state in the MetaTagCnsetRead property (section 2.2.1.1.4)

      • And are not FAI messages and have not had change information downloaded for them in this session.

The server MAY<32> confirm that the FastTransfer context that is returned by the RopSynchronizationGetTransferState ROP (section 2.2.3.2.3.1), which is sent before the subsequent RopFastTransferSourceGetBuffer ROP (section 2.2.3.1.1.5), contains only the differences that have been downloaded to the client in the current synchronization download operation, in addition to what was reflected in the initial ICS state. Note that the final ICS state that has to be downloaded in the FastTransfer stream as the last portion of the payload is exactly the same as the checkpoint ICS state that corresponds to the end of the operation.

The following invariants define the relationship between the initial ICS state, the checkpoint ICS state, and differences downloaded at the time of checkpointing. The server does not maintain a per-client state or store the values of these ICS state properties, but it does include the final ICS state at the end of the FastTransfer stream. The server does not persist the ICS state properties on the server; they are only present as data in the FastTransfer stream and in the fields of ROPs that support synchronization. The following table contains the nomenclature used to describe the invariants. For more details about checkpointing, see section 3.3.5.6.

Nomenclature

Description

PropIndex

Property Prop of the ICS state, as specified in section 2.2.1.1. Index can be I for initial and C for checkpoint.

PropD

Property Prop that contains a particular set of differences that have been downloaded in the current operation, as specified in section 2.2.1.3.

{changeSubset.Id}

{changeSubset.CN}

Internal identifiers (Id) or change numbers of all changes that have been downloaded in the current operation. The Subset can be one of the following:

  • Omitted to denote all changes.

  • Normal for normal messages.

  • FAI for FAI messages.

  • Partial for normal messages downloaded as partial changes.

{readStateChange.Id}

{readStateChange.ReadStateCn}

Internal identifiers or read state change numbers of all normal messages, with only the read state changed, which have been downloaded in the current operation.

Servers MUST ensure that the following invariants are true:

  • AllDeleted = (IdsetDeletedD ∪ IdsetNoLongerInScopeD ∪ IdsetExpiredD)

  • IdsetGivenC = (IdsetGivenI ∪ {change.Id}) \ AllDeleted

  • CnsetSeenC = CnsetSeenI ∪ {changeNormal.Cn}

  • CnsetSeenFAIC = CnsetSeenFAII ∪ {changeFAI.Cn}

  • CnsetReadC = CnsetReadI ∪ {readStateChange.ReadCn}

  • IdsetGivenI ⊇ {changesPartial.Id}

  • IdsetGivenI ⊇ (IdsetReadD ∪ IdsetUnreadD)

  • {readStateChange.Id} = IdsetReadD ∪ IdsetUnreadD

  • {change.Id} ∩ AllDeleted = ø

  • {change.Cn} ∩ (CnsetSeenI ∪ CnsetSeenFAII) = ø

  • {readStateChange.Id} ∩ AllDeleted = ø

  • {readStateChange.Id} ∩ {change.Id} = ø