Resolving Conflicts
9/8/2008
Um estar em conflito com ocorre quando um objeto é alterado em ambos os o Windows Embedded CE-Based dispositivo and o área de trabalho desde a última sincronização. O estar em conflito com for resolvido pelo avisar o usuário a escolher qual objeto para salvar.
Resolução de conflito começa quando o Gerenciador serviço chama IReplObjHandler::GetPacket Sobre o Windows Embedded CE com dispositivo para enviar um copiar do objeto para o área de trabalho. O área de trabalho Gerenciador serviço, em seguida, chama IReplObjHandler::SetPacket Para criar um objeto temporário. Durante as duas o Windows Embedded CE-com base dispositivo e o área de trabalho chamar, o Gerenciador serviço passa RSF_CONFLICT_OBJECT in REPLSETUP::dwFlags.
A seguinte ilustração mostra a seqüência chamar para resolução estar em conflito com.
Após o serviço Gerenciador recebe os dados do Windows Embedded CE com dispositivo, ele chama IReplStore::GetConflictInfo e transmite um identificador para ambos os o original área de trabalho objeto e o objeto dispositivo temporário. Próximo, o área de trabalho provedor preenche a CONFINFO estrutura para personalizar o texto descrição exibido em um padrão A resolução de conflito caixa diálogo, que é fornecida pelo Gerenciador serviço.
O seguinte mostra exemplo de código como para implementar IReplStore::GetConflictInfo.
STDMETHODIMP CStore::GetConflictInfo
(
PCONFINFO pConfInfo // pointer to a CONFINFO structure
)
{
// Verify that you have the right version of OBJUIDATA.
if (pConfInfo->cbStruct != sizeof (CONFINFO))
return E_INVALIDARG;
// Copy "Stock" to szLocalName and szRemoteName. You can use your
// own local and remote object names to replace "Stock".
lstrcpy (pConfInfo->szLocalName, "Stock");
lstrcpy (pConfInfo->szRemoteName, "Stock");
CItem *pLocalItem = (CItem*)pConfInfo->hLocalItem;
CItem *pRemoteItem = (CItem*)pConfInfo->hRemoteItem;
// Find the local object, then the remote object.
// pLocalObject points to the local object.
// pRemoteObject points to the remote object.
// If both the local and remote objects are found
if (pLocalObject && pRemoteObject)
{
// Compare local and remote objects.
// If identical, return RERR_IGNORE.
}
// if local object found
if (pLocalObject)
// Store information for local object in pConfInfo->szLocalDesc.
// if remote object found
if (pRemoteObject)
// Store information for remote object in pConfInfo->szRemoteDesc.
return NOERROR;
}
Se o área de trabalho provedor não pode gravar um objeto temporário sobre o área de trabalho, ele pode salvar os pacotes na memória e retornar HREPLITEM Com um ponteiro para a localidade memória. Neste maiúsculas e minúsculas, área de trabalho o provedor deve implementar esse identificador em todos os IReplStore Métodos que aceitar um HREPLITEM identificador, como CopyObject ou ISpTTSEngine::Speak. FreeObject. Quando o Gerenciador serviço chama IReplStore::GetConflictInfo, torna-se o identificador CONFINFO::hRemoteItem. O área de trabalho provedor, em seguida, pode extrair texto descritivo a partir de identificador e salvar em CONFINFO.
The A resolução de conflito caixa diálogo solicita que o usuário a escolher uma do seguinte ações:
- Substituir o área de trabalho objeto com o objeto dispositivo modificado.
O Gerenciador serviço marca o área de trabalho objeto como atualizado e o objeto dispositivo como alterado. Isso garante que o objeto dispositivo é transferido para o área de trabalho durante o próximo sincronização. - Substitua o objeto dispositivo o objeto dispositivo modificado.
O Gerenciador serviço marca o objeto dispositivo como atualizado. - Deixe as informações não resolvido item.
Tipo de informações não está sincronizado. Essa opção permitirá que o Gerenciador serviço ao identificador de resolução.
Em ambos os maiúsculas e minúsculas, Gerenciador de serviço chama IReplObjHandler::DeleteObject Para excluir o objeto temporário.
Situações de conflito sempre não exigem um A resolução de conflito caixa diálogo. A seguinte tabela descreve especial valores de erro que IReplStore::GetConflictInfo poderá retornar ao resolver o estar em conflito com automaticamente.
Value | Ação |
---|---|
RERR_IGNORE |
O área de trabalho provedor compara duas alças em CONFINFO, determina que eles são idênticos e não leva nenhuma ação. |
RERR_DISCARD |
O Gerenciador serviço determina que a área de trabalho objeto representado por um identificador já é excluído e exclui o objeto dispositivo de acordo. |
RERR_DISCARD_LOCAL |
O Gerenciador serviço resolve o estar em conflito com, excluindo um área de trabalho objeto instead of permitindo o área de trabalho provedor para excluir o objeto. |