Comparing Store Identifiers
9/8/2008
Após um armazenar é inicializado, o provedor deve comparar armazenar identificadores e identificador mismapped armazenar identificadores por avisar o usuário para qualquer combinar dois conjuntos de objetos ou substituir o dispositivo objetos com objetos a partir de área de trabalho.
Quando um usuário se conecta um dispositivo Windows_Embedded_CE-Based a um área de trabalho
O área de trabalho serviço Gerenciador chamadas IReplStore::GetStoreInfo Para recuperar identificador de armazenar o dispositivo.
Esse número é armazenado no arquivo persistente do Gerenciador de serviço.
O Gerenciador serviço lê o identificador para o armazenar seja sincronizado e passa esse identificador para IReplStore::CompareStoreIDs.
O área de trabalho provedor determina se este identificador armazenar coincide com o identificador armazenar carregado do arquivo persistente do Gerenciador de serviço, que identifica a armazenar usado na sincronização anterior.
Se os identificadores não coincidirem, o Gerenciador serviço restabelece o mapeamento entre os objetos área de trabalho e dispositivo por avisar o usuário para qualquer combinar dois conjuntos de objetos ou substituir o dispositivo objetos com objetos a partir de área de trabalho.
A combinar/processo substituir é exigido quando o usuário executa qualquer uma do seguinte ações.
- Sincroniza uma Windows Embedded CE com dispositivo com dados existentes para o primeiro tempo.
- Exclui um perfil dispositivo sem excluir também a informações de perfil que acompanha sobre o Windows Embedded CE- com base em dispositivo e depois reconecta o Windows Embedded CE - com base em dispositivo para criar uma nova parceria.
- Escolhe um área de trabalho armazenar que seja diferente da que foi usado na última sincronização. O Gerenciador serviço detecta a nova seleção comparando armazenar identificadores.
- Restaura os dados dispositivo de um arquivo de backup.
- Executa uma operação substituir em um computador e sincroniza o Windows Embedded CE com dispositivo com um segundo computador.
Se o usuário optar combinar os dados, todos os objetos, tanto o dispositivo baseado em Windows Embedded CE o área de trabalho são marcados como alterados. Se o usuário optar por substituir que os dados, todos os objetos dispositivo estão marcados como excluído e área de trabalho todos os objetos estiverem marcados como alterados. A sincronização ocorre imediatamente após a escolha é feita.
Combinar dados normalmente cria duplicado objetos o área de trabalho armazenar. As chamadas Gerenciador serviço IReplStore::RemoveDuplicates Para localizar e remover as duplicatas após a primeira bem-sucedido sincronização. Depois que objetos duplicados são removidos, o área de trabalho provedor retorna controle para o Gerenciador serviço para enumerar a armazenar. O Gerenciador serviço determina qual área de trabalho os objetos são excluídos e informa o dispositivo baseado em Windows Embedded CE para remover o correspondente objetos dispositivo.
Além das informações de identificação, fornecendo IReplStore::GetStoreInfo pode fazer outras coisas, como alterar o tamanho de armazenar um objeto ou intervalo de tempo entre as enumerações. The STOREINFO estrutura é passada por IReplStore::GetStoreInfoe é usado para alteração armazenar informações no seguinte maneira.
- Para receber um identificador para um armazenar variable-sized, defina STOREINFO::cbMaxStoreId para 0. Este chamar deve prompt o área de trabalho provedor para definir o tamanho solicitado para o identificador armazenar no STOREINFO::cbStoreId e retornar E_OUTOFMEMORY. Em resposta, o Gerenciador serviço aloca o exigido memória e passa um ponteiro para o identificador armazenar no STOREINFO::lpbStoreId. O área de trabalho provedor poderá, então, usar este ponteiro para salvar o identificador armazenar.
- Se você escolher Gravar um área de trabalho provedor que não não suporte em tempo real notificação de alterações, você deve habilitar enumeração automática por configuração STOREINFO::uTimerRes.
- Para automaticamente enumerar a armazenar em um intervalo especificado, definido STOREINFO::uTimerRes Para o intervalo non-zero, em microssegundos. O intervalo deve ser pelo menos várias vezes desde que leva para executar uma enumeração. Caso contrário, o Gerenciador serviço irá ser enumerando "continuamente".
- Se STOREINFO::uTimerRes é definido como 0, o Gerenciador serviço começa enumeração imediatamente antes sincronização, ou quando o usuário ativa a janela status ActiveSync.
O seguinte mostra exemplo de código como para implementar o STOREINFO estrutura e a IReplStore::CompareStoreIDs e MapVirtualKey. IReplStore::GetStoreInfo Métodos.
Observação
Para fazer o seguinte exemplo de código mais fácil de ler, verificação de erro não está incluído.Esta exemplo de código não devem ser usadas em uma configuração versão a menos que ele foi modificado para incluir Seguro manipulação de erro.
STDMETHODIMP_(int) CStore::CompareStoreIDs
(
LPBYTE lpbID1, // points to first store identifier
UINT cbID1, // size of first store identifier
LPBYTE lpbID2, // points to second store identifier
UINT cbID2 // size of second store identifier
)
{
// if first identifier is smaller than second identifier
if (cbID1 < cbID2)
return -1;
// if first identifier is larger than second identifier
if (cbID1 > cbID2)
return 1;
return memcmp (lpbID1, lpbID2, cbID1);
}
STDMETHODIMP CStore::GetStoreInfo
(
PSTOREINFO pInfo // pointers to the STOREINFO structure
)
{
if (pInfo->cbStruct != sizeof (STOREINFO))
return E_INVALIDARG;
pInfo->uFlags = SCF_SINGLE_THREAD | SCF_SIMULATE_RTS;
// ProgId of store. Change to match company and product.
lstrcpyn (pInfo->szProgId,
"MyCompany.WinCE.DeskSamp",
sizeof(pInfo->szProgId));
// Description of store. Change to fit requirements.
lstrcpyn (pInfo->szStoreDesc,
"Files",
sizeof(pInfo->szStoreDesc));
// Let replication scan the store every 5 seconds.
pInfo->uTimerRes = 5000;
// Choose a unique identifier for the store. In this example,
// because the differences in the stores are inconsequential,
// set the size of the store identifier to any value.
pInfo->cbStoreId = 10;
// Compare the size of the the store identifier with the maximum
// size of the store identifier.
if (pInfo->cbStoreId > pInfo->cbMaxStoreId)
return E_OUTOFMEMORY;
// Check if pointer to store identifier is NULL.
if (pInfo->lpbStoreId == NULL)
return E_POINTER;
memset (pInfo->lpbStoreId, 0, 10);
return NOERROR;
}