다음을 통해 공유


IDestinationChangeVersionsBuilder::AddItemMetadata

지정된 항목 변경 내용을 목록에 추가합니다.

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

매개 변수

  • pbOwnerReplicaId
    [in] pChangeVersion과 pCreationVersion이 유효하면 복제본의 ID입니다. ID 형식은 공급자의 ID_PARAMETERS 구조에서 지정한 형식과 일치해야 합니다.
  • pbItemId
    [in] 항목의 ID입니다. ID 형식은 공급자의 ID_PARAMETERS 구조에서 지정한 형식과 일치해야 합니다.
  • pChangeVersion
    [in] 이 변경 내용의 버전입니다.
  • pCreationVersion
    [in] 항목의 생성 버전입니다.
  • dwFlags
    [in] 항목 변경 내용의 상태를 지정하는 플래그입니다. 플래그 값은 SYNC_CHANGE_FLAG 플래그를 참조하십시오.
  • ppChangeBuilder
    [out] 변경 내용에 변경 단위 정보를 추가하는 데 사용할 수 있는 개체를 반환합니다.

반환 값

  • S_OK

  • E_POINTER

  • dwFlags가 SYNC_CHANGE_FLAG_DELETED 또는 SYNC_CHANGE_FLAG_DOES_NOT_EXIST 이외의 값을 포함하면 E_INVALIDARG입니다.

  • 잘못된 작업이 발생하면 SYNC_E_INVALID_OPERATION입니다.

  • pbOwnerReplicaId 또는 pbItemId의 형식이 공급자의 ID 형식 스키마에서 지정한 형식과 일치하지 않으면 SYNC_E_ID_FORMAT_MISMATCH입니다.

예제

다음 예제에서는 원격 일괄 변경 내용의 변경 내용을 열거하고 AddItemMetadata를 사용하여 해당하는 로컬 버전의 목록을 만들어 로컬 버전을 IDestinationChangeVersionsBuilder 개체에 추가하는 방법을 보여 줍니다. 또한 IDestinationChangeVersionsBuilder::GetChangeEnumerator를 사용하여 로컬 버전의 목록을 반환합니다.

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

참고 항목

참조

IDestinationChangeVersionsBuilder 인터페이스