Negociação do tipo mídia

Muitos protocolos de Internet de camada de aplicativo são baseados na troca de mensagens em um formato simples e flexível chamado Multipurpose Internet Mail Extensions (MIME). Embora o MIME tenha se originado como um padrão para a troca de mensagens de correio eletrônico, ele é usado hoje por uma ampla variedade de aplicativos para especificar formatos de dados mutuamente compreendidos como tipos MIME, ou mídia. O processo é chamado de negociação do tipo mídia.

Os tipos de mídia são cadeias de caracteres simples que denotam um tipo e subtipo (como "text/plain" ou "text/HTML"). Eles são usados para rotular dados ou qualificar uma solicitação. Um navegador da Web, por exemplo, como parte de uma solicitação HTTP de dados ou solicitação de informações, especifica que está solicitando tipos de mídia "image/gif" ou "image/jpeg", aos quais um servidor Web responde retornando o tipo de mídia apropriado e, se a chamada foi uma solicitação de dados, os próprios dados no formato solicitado.

A negociação de tipo de mídia geralmente é semelhante à forma como os aplicativos de área de trabalho existentes negociam com a área de transferência do sistema para determinar qual formato de dados colar quando um usuário escolhe Editar/Colar ou consulta formatos ao receber um ponteiro IDataObject durante uma operação de arrastar e soltar. A diferença sutil na negociação do tipo de mídia HTTP é que o cliente não sabe com antecedência quais formatos o servidor tem disponíveis. Portanto, o cliente especifica antecipadamente os tipos de mídia que suporta, em ordem de maior fidelidade, e o servidor responde com o melhor formato disponível.

Os monikers de URL oferecem suporte à negociação de tipo de mídia como uma maneira de clientes e servidores da Internet concordarem com os formatos a serem usados ao baixar dados em operações BindToStorage. Para dar suporte à negociação de tipo de mídia, um cliente implementa a interface IEnumFORMATETC e chama a função RegisterFormatEnumerator para registrá-la com o contexto de ligação. O enumerador de formato lista os formatos que o cliente pode aceitar. Um moniker de URL converte esses formatos em tipos de mídia ao vincular a URLs HTTP.

Os possíveis tipos de mídia solicitados pelo cliente são representados para monikers de URL por meio de estruturas FORMATETC disponíveis no enumerador IEnumFORMATETC registrado pelo chamador no contexto de ligação: Cada FORMATETC especifica um formato de área de transferência que identifica o tipo de mídia. Por exemplo, o fragmento de código a seguir especifica que o tipo de mídia é PostScript.

FORMATETC fmtetc;
fmtetc.cfFormat = RegisterClipboardFormat(CF_MIME_POSTSCRIPT);
. . .

Um cliente pode definir o formato da área de transferência para o tipo de mídia especial CF_NULL para indicar que o tipo de mídia padrão do recurso apontado pela URL deve ser recuperado. Esse formato costuma ser o último em que o cliente tem interesse. Quando nenhum enumerador é registrado com o contexto de ligação, um moniker de URL funciona como se um enumerador contendo um único FORMATETC com cfFormat=CF_NULL estivesse disponível, baixando automaticamente o tipo de mídia padrão.

Qualquer que seja o tipo de mídia a ser usado, o cliente é notificado da escolha por meio do argumento pformatetc em seu método IBindStatusCallback::OnDataAvailable. O retorno de chamada ocorre no contexto da chamada do cliente para BindToStorage.

Observação

Se o conteúdo recebido for de um tipo de mídia não reconhecido, o cliente chamará automaticamente RegisterMediaTypes para registrar o novo tipo.

 

URL Monikers