Condividi tramite


IDestinationChangeVersionsBuilder::AddItemMetadata

Aggiunge una modifica dell'elemento specificata all'elenco.

HRESULT AddItemMetadata(
  const BYTE * pbOwnerReplicaId, 
  const BYTE * pbItemId, 
  const SYNC_VERSION * pChangeVersion,
  const SYNC_VERSION * pCreationVersion, 
  DWORD dwFlags,
  ISyncChangeBuilder ** ppChangeBuilder);

Parametri

  • pbOwnerReplicaId
    [in] ID della replica della replica in cui pChangeVersion e pCreationVersion sono validi. Il formato dell'ID deve corrispondere al formato specificato dalla struttura ID_PARAMETERS del provider.
  • pbItemId
    [in] ID dell'elemento. Il formato dell'ID deve corrispondere al formato specificato dalla struttura ID_PARAMETERS del provider.
  • pChangeVersion
    [in] Versione di questa modifica.
  • pCreationVersion
    [in] Versione di creazione dell'elemento.
  • dwFlags
    [in] Flag che specificano lo stato della modifica dell'elemento. Per i valori dei flag, vedere Flag SYNC_CHANGE_FLAG.
  • ppChangeBuilder
    [out] Restituisce un oggetto che può essere utilizzato per aggiungere informazioni sull'unità di modifica alla modifica.

Valore restituito

  • S_OK

  • E_POINTER

  • E_INVALIDARG se dwFlags contiene qualsiasi valore diverso da SYNC_CHANGE_FLAG_DELETED o SYNC_CHANGE_FLAG_DOES_NOT_EXIST.

  • SYNC_E_INVALID_OPERATION se si verifica un'operazione non valida.

  • SYNC_E_ID_FORMAT_MISMATCH quando il formato di pbOwnerReplicaId o di pbItemId non corrisponde al formato specificato dallo schema del formato ID del provider.

Esempio

Nell'esempio seguente viene illustrato come enumerare le modifiche in un batch di modifiche remoto e come creare un elenco corrispondente di versioni locali tramite AddItemMetadata per aggiungere versioni locali a un oggetto IDestinationChangeVersionsBuilder. Nell'esempio viene inoltre utilizzato IDestinationChangeVersionsBuilder::GetChangeEnumerator per restituire l'elenco delle versioni locali.

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;
}

Vedere anche

Riferimento

Interfaccia IDestinationChangeVersionsBuilder