IDestinationChangeVersionsBuilder::AddItemMetadata
Ajoute une modification d'élément spécifiée à la liste.
HRESULT AddItemMetadata(
const BYTE * pbOwnerReplicaId,
const BYTE * pbItemId,
const SYNC_VERSION * pChangeVersion,
const SYNC_VERSION * pCreationVersion,
DWORD dwFlags,
ISyncChangeBuilder ** ppChangeBuilder);
Paramètres
- pbOwnerReplicaId
[in] ID du réplica où pChangeVersion et pCreationVersion sont valides. Le format d'ID doit correspondre au format spécifié par la structure ID_PARAMETERS du fournisseur.
- pbItemId
[in] ID de l'élément. Le format d'ID doit correspondre au format spécifié par la structure ID_PARAMETERS du fournisseur.
- pChangeVersion
[in] Version de cette modification.
- pCreationVersion
[in] Version de création de l'élément.
- dwFlags
[in] Indicateurs qui spécifient l'état de la modification d'élément. Pour les valeurs d'indicateur, consultez Indicateurs SYNC_CHANGE_FLAG.
- ppChangeBuilder
[out] Retourne un objet qui peut être utilisé pour ajouter des informations d'unité de modification à la modification.
Valeur de retour
S_OK
E_POINTER
E_INVALIDARG si dwFlags contient des valeurs autres que SYNC_CHANGE_FLAG_DELETED ou SYNC_CHANGE_FLAG_DOES_NOT_EXIST.
SYNC_E_INVALID_OPERATION lorsqu'une opération non valide a lieu.
SYNC_E_ID_FORMAT_MISMATCH lorsque le format de pbOwnerReplicaId ou pbItemId ne correspond pas à celui qui est spécifié par le schéma du format d'ID du fournisseur.
Exemple
L'exemple suivant montre comment énumérer les modifications dans un lot de modifications distant et créer une liste de versions locales correspondante en utilisant AddItemMetadata
pour ajouter les versions locales à un objet IDestinationChangeVersionsBuilder. L'exemple utilise également IDestinationChangeVersionsBuilder::GetChangeEnumerator pour retourner la liste de versions locales.
STDMETHODIMP CMetadataMgr::GetItemBatchVersions(
ISyncChangeBatch * pRemoteSyncChangeBatch,
IEnumSyncChanges ** ppLocalVersionsEnum)
{
HRESULT hr = E_UNEXPECTED;
if (NULL == pRemoteSyncChangeBatch || NULL == ppLocalVersionsEnum)
{
hr = E_POINTER;
}
else
{
IProviderSyncServices* pProvSvc;
hr = GetProviderSyncServices(&c_idParams, &pProvSvc);
if (SUCCEEDED(hr))
{
IDestinationChangeVersionsBuilder* pDestChangeBuilder = NULL;
hr = pProvSvc->CreateDestinationChangeVersionsBuilder(&pDestChangeBuilder);
if (SUCCEEDED(hr))
{
IEnumSyncChanges* pRemoteEnum = NULL;
hr = pRemoteSyncChangeBatch->GetChangeEnumerator(&pRemoteEnum);
if (SUCCEEDED(hr))
{
ULONG cFetched;
ISyncChange* pChange;
SYNC_GID gidItem;
DWORD cbID = sizeof(gidItem);
DWORD dwFlags;
SYNC_VERSION verCurrent;
SYNC_VERSION verCreation;
HRESULT hrEnum = S_OK;
while (S_OK == hrEnum && SUCCEEDED(hr))
{
pChange = NULL;
hrEnum = pRemoteEnum->Next(1, &pChange, &cFetched);
if (S_OK == hrEnum)
{
hr = pChange->GetRootItemId((BYTE*)&gidItem, &cbID);
if (SUCCEEDED(hr))
{
// Try to find the item in the local (destination) metadata.
IItemMetadata* pItem = NULL;
hr = FindItemMetadataByGlobalId((BYTE*)&gidItem, &pItem);
if (S_OK == hr)
{
// S_OK means the item exists in our local store.
// Extract its version and tombstone information.
dwFlags = 0;
BOOL fTombstone = FALSE;
hr = pItem->GetIsDeleted(&fTombstone);
if (SUCCEEDED(hr))
{
if (fTombstone)
{
dwFlags = SYNC_CHANGE_FLAG_DELETED;
}
}
if (SUCCEEDED(hr))
{
hr = pItem->GetChangeVersion(&verCurrent);
if (SUCCEEDED(hr))
{
hr = pItem->GetCreationVersion(&verCreation);
}
}
pItem->Release();
}
else if (S_FALSE == hr)
{
// S_FALSE means this item does not exist in our local store.
// Set versions to 0 and flag it as a new item.
verCurrent.dwLastUpdatingReplicaKey = 0;
verCurrent.ullTickCount = 0;
verCreation.dwLastUpdatingReplicaKey = 0;
verCreation.ullTickCount = 0;
dwFlags = SYNC_CHANGE_FLAG_DOES_NOT_EXIST;
}
if (SUCCEEDED(hr))
{
// Add the item to the batch of destination versions.
GUID guidReplicaID = GUID_NULL;
ULONG cbID = sizeof(guidReplicaID);
hr = GetReplicaId((BYTE*)&guidReplicaID, &cbID);
if (SUCCEEDED(hr))
{
hr = pDestChangeBuilder->AddItemMetadata((BYTE*)&guidReplicaID,
(BYTE*)&gidItem, &verCurrent, &verCreation, dwFlags, NULL);
}
}
}
pChange->Release();
}
}
if (FAILED(hrEnum))
{
hr = hrEnum;
}
pRemoteEnum->Release();
}
if (SUCCEEDED(hr))
{
hr = pDestChangeBuilder->GetChangeEnumerator(ppLocalVersionsEnum);
}
pDestChangeBuilder->Release();
}
pProvSvc->Release();
}
}
return hr;
}