Compartilhar via


Comparing Store Identifiers

Windows Mobile SupportedWindows Embedded CE Supported

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

  1. O área de trabalho serviço Gerenciador chamadas IReplStore::GetStoreInfo Para recuperar identificador de armazenar o dispositivo.

  2. Esse número é armazenado no arquivo persistente do Gerenciador de serviço.

  3. O Gerenciador serviço lê o identificador para o armazenar seja sincronizado e passa esse identificador para IReplStore::CompareStoreIDs.

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

See Also

Concepts

Developing the Desktop Provider