Compartilhar via


Sending and Receiving Changed Objects

Windows Mobile SupportedWindows Embedded CE Supported

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.

  1. IReplObjHandler::Setup Informa o área de trabalho provedor qual objeto é converter ou restaurar e o provedor para alocar os recursos necessários.
  2. 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.
  3. 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.

See Also

Concepts

Resolving Conflicts
Developing the Desktop Provider