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