estrutura WS_UNION_DESCRIPTION (webservices.h)

Informações sobre as opções dentro de um tipo de união. Isso é usado com WS_UNION_TYPE.

Sintaxe

typedef struct _WS_UNION_DESCRIPTION {
  ULONG                      size;
  ULONG                      alignment;
  WS_UNION_FIELD_DESCRIPTION **fields;
  ULONG                      fieldCount;
  ULONG                      enumOffset;
  int                        noneEnumValue;
  ULONG                      *valueIndices;
} WS_UNION_DESCRIPTION;

Membros

size

O tamanho em bytes da estrutura.

alignment

O requisito de alinhamento da estrutura. Deve ser uma potência de dois entre 1 e 8.

fields

Uma matriz de ponteiros para as descrições dos campos da união.

Consulte a seção Comentários para obter informações sobre a ordenação dos campos nesta matriz.

fieldCount

O número de campos na matriz de campos. Qualquer parte da estrutura que não é representada por um campo será deixada não inicializada. As descrições de campos podem referenciar o mesmo deslocamento da estrutura (por exemplo, se todas fizerem parte de uma única união).

enumOffset

O deslocamento do campo de enumeração que controla qual opção é selecionada dentro da união. O tamanho do campo é considerado o tamanho de uma enumeração (inteiro com sinal de 32 bits).

noneEnumValue

Esse valor corresponde ao valor de enumeração usado quando nenhuma das opções está definida no momento. Esse campo só é usado quando o campo é opcional (WS_FIELD_OPTIONAL foi especificado).

valueIndices

Essa matriz opcional fornece informações que podem melhorar o desempenho da pesquisa de campos da união por elemento ou por valor de enumeração. Essa matriz pode ser NULL, caso em que uma pesquisa de O(n) é usada, o que pode ser suficiente para um pequeno número de campos.

Se não for NULL, o seguinte deverá ser verdadeiro:

  • A matriz de campos é necessária para ser classificada por elemento, em ordem crescente. Ao comparar um elemento, o namespace deve ser comparado primeiro e, em seguida, o nome local. Cada um dos nomes deve ser comparado executando uma comparação em todo o byte da cadeia de caracteres utf-8. O campo que usa WS_ANY_ELEMENT_FIELD_MAPPING, se presente, sempre deve ser o último na matriz de campos.
  • A matriz valueIndices aponta para uma matriz que tem itens fieldCount. A matriz valueIndices fornece os índices dos itens na matriz de campos como se fossem classificados por valor em ordem crescente.

Comentários

Essa descrição pressupõe uma estrutura que contém o valor do seletor (um valor enumerado inteiro) e uma união que contém um campo que corresponde a cada uma das opções possíveis, por exemplo:

// Enumeration of choices of different values
enum Choice
{
    ChoiceA = 20,
    ChoiceB = 10,
    None = 0,
};

// Struct containing union of values, and enum "selector"
struct StructType
{
    Choice choice;
    union
    {
        int a;
        WS_STRING b;
    } value;
};

Os exemplos a seguir ilustram a inicialização de uma descrição de união para o exemplo anterior. Este exemplo preenche o campo nameIndices, mas esse campo pode ser NULL .

WS_XML_STRING choiceAString = WS_XML_STRING_VALUE("choiceA");
WS_XML_STRING choiceANs = WS_XML_STRING_VALUE("http://examples.org/a");

WS_UNION_FIELD_DESCRIPTION fieldA = { };
fieldA.value = ChoiceA;
fieldA.field.localName = &choiceAString;
fieldA.field.ns = &choiceANs;
fieldA.field.type = WS_INT32_TYPE;
fieldA.field.offset = WsOffsetOf(StructType, value.a);

WS_XML_STRING choiceBString = WS_XML_STRING_VALUE("choiceB");
WS_XML_STRING choiceBNs = WS_XML_STRING_VALUE("http://examples.org/b");

WS_UNION_FIELD_DESCRIPTION fieldB = { };
fieldB.value = ChoiceB;
fieldB.field.localName = &choiceBString;
fieldB.field.ns = &choiceBNs;
fieldB.field.type = WS_STRING_TYPE;
fieldB.field.offset = WsOffsetOf(StructType, value.b);

// Sorted by ascending element name (first ns, then localName)
WS_UNION_FIELD_DESCRIPTION* fieldsArray[] =
{
    &fieldA, // "http://example.com/a", "choiceA"
    &fieldB, // "http://example.com/b", "choiceB"
};

// Sorted by ascending enum value
ULONG valueIndices[] =
{
    1, // ChoiceB (10)
    0, // ChoiceA (20)
};

WS_UNION_DESCRIPTION unionDescription;
unionDescription.size = sizeof(StructType);
unionDescription.alignment = __alignof(StructType);
unionDescription.fields = fieldsArray;
unionDescription.fieldCount = WsCountOf(fieldsArray);
unionDescription.enumOffset = WsOffsetOf(StructType, choice);
unionDescription.noneEnumValue = None;
unionDescription.valueIndices = valueIndices;

O acima permitiria que qualquer um dos seguintes elementos aparecesse:

<choiceA xmlns="http://example.com/a">123</choiceA>
<choiceB xmlns="http://example.com/b">hello</choiceB>

Veja a seguir um exemplo de configuração de valores:

StructType structType;

// Set ChoiceA
structType.choice = ChoiceA;
structType.value.a = 123;

// Set ChoiceB
static const WS_STRING = WS_STRING_VALUE(L"hello");
structType.choice = ChoiceB;
structType.value.b = helloString;

// Set "none" choice
structType.choice = None;

Veja a seguir a gramática que descreve a ordem dos WS_FIELD_DESCRIPTION que compõem uma WS_UNION_DESCRIPTION. A ordem é definida com base no campo de mapeamento do WS_FIELD_DESCRIPTION.


Fields := ElementContentFields AnyElementField?
ElementContentFields := (ElementField | RepeatingElementField)*
ElementField := WS_ELEMENT_FIELD_MAPPING
RepeatingElementField := WS_REPEATING_ELEMENT_FIELD_MAPPING
AnyElementField := WS_ANY_ELEMENT_FIELD_MAPPING

Os WS_ELEMENT_FIELD_MAPPING e WS_REPEATING_ELEMENT_FIELD_MAPPING representam as opções de elemento e seus campos correspondentes na união.

O WS_ANY_ELEMENT_FIELD_MAPPING é o campo usado quando nenhum dos outros elementos corresponde.

As seguintes restrições se aplicam às descrições de campo:

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 7 [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2008 R2 [somente aplicativos da área de trabalho]
Cabeçalho webservices.h