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

  • E_INVALIDARG (dwFlags が SYNC_CHANGE_FLAG_DELETED または SYNC_CHANGE_FLAG_DOES_NOT_EXIST 以外の値を含む場合)

  • SYNC_E_INVALID_OPERATION (無効な処理が発生した場合)

  • SYNC_E_ID_FORMAT_MISMATCH (pbOwnerReplicaId または pbItemId の形式がプロバイダーの ID 形式スキーマによって指定された形式に一致しない場合)

次の例では、リモート変更バッチの変更を列挙し、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 インターフェイス