Compartilhar via


IDestinationChangeVersionsBuilder::AddItemMetadata

Adiciona uma alteração de item especificada à lista.

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

Parâmetros

  • pbOwnerReplicaId
    [in] A ID da réplica onde pChangeVersion e pCreationVersion são válidos. O formato de ID deve corresponder ao formato especificado pela estrutura ID_PARAMETERS do provedor.
  • pbItemId
    [in] A ID do item. O formato de ID deve corresponder ao formato especificado pela estrutura ID_PARAMETERS do provedor.
  • pChangeVersion
    [in] A versão desta alteração.
  • pCreationVersion
    [in] A versão de criação do item.
  • dwFlags
    [in] Sinalizadores que especificam o estado da alteração do item. Para obter valores de sinalizadores, consulte Sinalizadores SYNC_CHANGE_FLAG.
  • ppChangeBuilder
    [out] Retorna um objeto que pode ser usado para adicionar informações da unidade de alteração à alteração.

Valor de retorno

  • S_OK

  • E_POINTER

  • E_INVALIDARG se dwFlags contiver qualquer valor diferente de SYNC_CHANGE_FLAG_DELETED ou SYNC_CHANGE_FLAG_DOES_NOT_EXIST.

  • SYNC_E_INVALID_OPERATION quando ocorre uma operação inválida.

  • SYNC_E_ID_FORMAT_MISMATCH quando o formato de pbOwnerReplicaId ou pbItemId não corresponde ao formato especificado pelo esquema de formato de ID do provedor.

Exemplo

O exemplo a seguir mostra como enumerar as alterações em um lote de alterações remoto e cria uma lista correspondente de versões locais usando AddItemMetadata para adicionar versões locais para um objeto IDestinationChangeVersionsBuilder. O exemplo também usa IDestinationChangeVersionsBuilder::GetChangeEnumerator para retornar a lista de versões locais.

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

Consulte também

Referência

Interface IDestinationChangeVersionsBuilder