Detecting Changes to Desktop Objects
9/8/2008
O Gerenciador serviço automaticamente detecta objeto alterações e exclusões, comparando a lista de identificadores retornadas durante enumeração com alças de carregados do arquivo persistente do Gerenciador o serviço. Antes de iniciar um processo enumeração, Gerenciador o serviço faz o seguinte:
- Marca um bit de cada identificador armazenado em Repl.dat.
- Chamadas IReplStore::FindFirstItem e MapVirtualKey. IReplStore::FindNextItem.
- Realiza uma pesquisa binária em alças em Repl.dat cada tempo um desses métodos retorna um novo identificador para localizar um identificador que representam o mesmo objeto.
- Se não compatível identificador for encontrado, ele cria um novo objeto sobre o área de trabalho armazenar.
- Se um compatível identificador for encontrado, ele limpa o bit do identificador em Repl.dat e chamadas IReplStore::IsItemChanged Para ver se o objeto foi alterado desde a última sincronização.
- Se o objeto tiver sido alterado, ele chama IReplStore::CopyObject Para copiar os dados a partir de identificador retornado para o identificador que é salvo na Repl.dat.
- Chamadas IReplStore::IsItemReplicated Para ver se ela deve enviar o objeto para o Windows Embedded CE com dispositivo.
Todos os identificadores no Repl.dat que permanecem marcadas estando enumeração completo representam objetos excluídos.
Para acelerar o área de trabalho, enumeração provedor pode detecção e relatório área de trabalho altera para o Gerenciador serviço em tempo real. Para fazer isso, o área de trabalho provedor e serviço Gerenciador executar a seguinte ações.
- As chamadas Gerenciador serviço IReplNotify::OnItemNotify Para informar o área de trabalho provedor de status de um objeto.
- O área de trabalho provedor passa RNC_MODIFIED para um objeto modificado, RNC_CREATED para um objeto criado e RNC_DELETED para um objeto excluído.
- O área de trabalho provedor passa um identificador para o objeto para que possa Gerenciador o serviço pesquisa o arquivo persistente para o correspondente objeto dispositivo.
A seguinte ilustração mostra a seqüência de chamadas notificação em tempo real.
Se o área de trabalho provedor detecta que a aplicativo para desktop foi fechada, ele chama IReplNotify::OnItemNotify Com RNC_SHUTDOWN. O Gerenciador serviço responde ao descarregar o área de trabalho provedor e atualizando o exibir status.
O seguinte apresentação exemplos codificar como para implementar IReplStore::IsItemChanged e MapVirtualKey. IReplStore::IsItemReplicated.
STDMETHODIMP_(BOOL) CStore::IsItemChanged
(
HREPLFLD hFolder, // handle of folder or container that stores object
HREPLITEM hItem, // handle of object
HREPLITEM hItemComp // handle of object used for comparison
)
{
CFolder *pFolder = (CFolder*)hFolder;
CItem *pItem = (CItem*) hItem;
CItem *pItemComp = (CItem*) hItemComp;
BOOL fChanged = FALSE;
if (pItemComp)
fChanged = CompareFileTime (&pItem->m_ftModified,
&pItemComp->m_ftModified);
else
{
FILETIME ft;
// Read modification time stamp from object into ft.
// Compare with the time stamp in the object.
fChanged = CompareFileTime (&pItem->m_ftModified, &ft);
}
return fChanged;
}
STDMETHODIMP_(BOOL) CStore::IsItemReplicated
(
HREPLFLD hFolder, // handle of folder or container that stores object
HREPLITEM hItem, // handle of object
)
{
CFolder *pFolder = (CFolder*)hFolder;
CItem *pItem = (CItem*) hItem;
// hItem can be NULL.
if (pItem == NULL)
return TRUE;
// Search for the item. Return FALSE if not found.
// ...
// Check if pItem should be replicated by using information
// stored both in pFolder & pItem. If so, return TRUE.
// ...
return FALSE;
}