Sending and Receiving Changed Objects
9/8/2008
IReplObjHandler Ambos converte um objeto para uma seqüência de bytes (serialização) e retorna o seqüência de bytes para seu original forma como um objeto (desserialização). Não há nenhuma especificação ou limitação sobre como fazer isso. A seqüência pode consistir de qualquer número de bytes, agrupados em qualquer modo. A conversão é executada no seguinte ordem.
- IReplObjHandler::Setup Informa o área de trabalho provedor qual objeto é converter ou restaurar e o provedor para alocar os recursos necessários.
- IReplObjHandler::GetPacket é chamado repetidamente para permitir que o área de trabalho provedor criar a seqüência de bytes. A parar chamadas quando RWRN_LAST_PACKET for retornado.
- IReplObjHandler::Reset é chamado quando a seqüência para permitir que o área de trabalho livre quaisquer recursos que foram alocados a partir A instalação.
O Gerenciador serviço chama esse método quando serialização é concluída.
O Gerenciador serviço paga não atenção para o formato ou de conteúdo da seqüência de bytes. Ela simplesmente envia os pacotes no mesmo número byte e seqüência à medida que eles foram originalmente recebidos.
A seguinte ilustração mostra a seqüência de chamadas necessários para enviar e receber dados.
O seguinte mostra exemplo de código como para implementar IReplObjHandler::Setup e MapVirtualKey. IReplObjHandler::GetPacket. Ele também mostra a definição para CDataHandler, uma classe COM é cujo de base IReplStore.
CDataHandler gerencia o tamanho de buffers. CDataHandler::Setup Aloca memória para os pacotes. CDataHandler::Reset Libera a memória.
class CDataHandler : public IReplObjHandler
{
public:
CDataHandler (CStore *pStore);
~CDataHandler ();
// IUnknown methods
// AddRef, Release, QueryInterface
// IReplObjHandler methods
// Setup, Reset, GetPacket, SetPacket, DeleteObj
private:
long m_cRef;
PREPLSETUP m_pWriteSetup, m_pReadSetup;
};
STDMETHODIMP CDataHandler::Setup
(
PREPLSETUP pSetup // Points a REPLSETUP structure containing
// information about object to be sequenced or restored.
)
{
// Can read and write at the same time, so pointer to
// set up the structure differently must be saved.
if (pSetup->fRead)
m_pReadSetup = pSetup;
else
m_pWriteSetup = pSetup;
return NOERROR;
}
STDMETHODIMP CDataHandler::GetPacket
(
LPBYTE *lppbPacket, // pointer to pointer of outgoing packet
DWORD *pcbPacket, // pointer to DWORD for packet size
DWORD cbRecommend // recommended maximum size of packet
)
{
if (m_pReadSetup->hItem == NULL)
return E_UNEXPECTED;
// Initialize the packet.
// ...
// Fill up the packet.
// ...
// *pcbPacket = sizeof (packet);
// *lppbPacket = (LPBYTE)&packet;
return NOERROR;
// Return RWRN_LAST_PACKET if packet is final packet.
}
Durante sincronização, o Gerenciador serviço obtém a partir de área de trabalho uma instância do provedor IReplObjHandler Para cada tipo objeto. O área de trabalho provedor reconhece quando IReplObjHandler::SetPacket está enviando informações sobre um novo objeto verificando RSF_NEW_OBJECT in REPLSETUP::dwFlags. Passa o Gerenciador serviço REPLSETUP::dwFlags in a IReplObjHandler::Setup chamar.
A seguinte tabela mostra a REPLSETUP Membros usados pelo área de trabalho provedor. Todos os outros membros são internos para o Gerenciador serviço e não devem ser alterados.
Membro REPLSETUP | Description |
---|---|
fRead |
Definir TRUE para ler um objeto a partir de área de trabalho armazenar. Definir FALSE para gravar um objeto de área de trabalho armazenar. |
dwFlags |
Uma coleção dos sinalizadores bit relacionado a serialização e desserialização. |
hfolder |
Um identificador para a pasta. |
hItem |
Um identificador para o objeto seja serializado. O área de trabalho provedor usa as informações neste identificador para identificar e converter o objeto em pacotes de bytes. |
O processo de receber um objeto a partir de Windows Embedded CE- dispositivo com base é semelhante ao enviar um objeto para o Windows Embedded CE - com base em dispositivo. Após os pacotes de dados chegam, o Gerenciador serviço chama a IReplObjHandler Métodos interface, que habilitar o área de trabalho provedor para converter esses pacotes voltar para um objeto. O área de trabalho provedor deve criar um novo HREPLITEM que representa o objeto no REPLSETUP::hItem.
Quando o Gerenciador serviço grava um objeto para o área de trabalho armazenar, ele chama IReplStore::UpdateItem. Isso solicita o área de trabalho provedor para aberto o objeto e atualização o identificador HREPLITEM com um carimbo tempo ou número versão, assim garantir que o objeto não está marcado como alterados no área de trabalho.
O seguinte mostra exemplo de código como para implementar IReplStore::UpdateItem.
STDMETHODIMP_(void) CStore::UpdateItem
(
HREPLFLD hFolder, // handle of a folder
HREPLITEM hItemDst, // handle of the destination object
HREPLITEM hItemSrc // handle to the source object
)
{
CFolder *pFolder = (CFolder*)hFolder;
CItem *pItemDst = (CItem*) hItemDst;
CItem *pItemSrc = (CItem*) hItemSrc;
if (pItemSrc)
{
pItemDst->m_ftModified = pItemSrc->m_ftModified;
}
else
{
// Implementation should update what it used to validate object
// changes, such as a time stamp, by reading it from the object.
// Update the time stamp.
// pItemDst->m_ftModified = time stamp read from object
}
}
Em algumas situações é apropriado para tratar objetos que são alterados no Windows Embedded CE com dispositivo como objetos a ser excluído a partir de área de trabalho. De exemplo, quando um usuário exclui um mensagem de email em um Windows Embedded CE com dispositivo, a mensagem é movido para a pasta Deleted Item e marcado como alterados. O área de trabalho provedor recebe o objeto alterado e tenta exclui a mensagem o área de trabalho. IReplObjHandler::SetPacket Retorna um do seguinte erros na resposta.
- RERR_DISCARD é enviado quando o área de trabalho provedor tenta excluir o objeto dispositivo Imediatamente após a alteração é sincronizado. O Gerenciador serviço envia um comando para o Windows Embedded CE com dispositivo para excluir o correspondente objeto.
- RERR_DISCARD_LOCAL é enviado quando o área de trabalho provedor tenta excluir o área de trabalho objeto Imediatamente após a alteração é sincronizado. As chamadas Gerenciador serviço IReplObjHandler::DeleteObject Para excluir o área de trabalho existente objeto.