epoc32/include/wtlsnames.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:27:01 +0100
branchSymbian2
changeset 3 e1b950c65cb4
parent 0 061f57f2323e
child 4 837f303aceeb
permissions -rw-r--r--
Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
williamr@2
     1
/*
williamr@2
     2
* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
williamr@2
     3
* All rights reserved.
williamr@2
     4
* This component and the accompanying materials are made available
williamr@2
     5
* under the terms of the License "Eclipse Public License v1.0"
williamr@2
     6
* which accompanies this distribution, and is available
williamr@2
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
williamr@2
     8
*
williamr@2
     9
* Initial Contributors:
williamr@2
    10
* Nokia Corporation - initial contribution.
williamr@2
    11
*
williamr@2
    12
* Contributors:
williamr@2
    13
*
williamr@2
    14
* Description: 
williamr@2
    15
*
williamr@2
    16
*/
williamr@2
    17
williamr@2
    18
williamr@2
    19
williamr@2
    20
#if !defined (__WTLSNAMES_H__)
williamr@2
    21
#define __WTLSNAMES_H__
williamr@2
    22
williamr@2
    23
#include <e32base.h>
williamr@2
    24
#include <e32std.h>
williamr@2
    25
#include <x500dn.h>
williamr@2
    26
williamr@2
    27
/**
williamr@2
    28
@file
williamr@2
    29
This file contains the definition for class CWTLSName.
williamr@2
    30
williamr@2
    31
@internalAll
williamr@2
    32
williamr@2
    33
enum { null(0), text(1), binary(2), key_hash_sha(254), x509_name(255)}
williamr@2
    34
	IdentifierType;
williamr@2
    35
williamr@2
    36
We only support text and x509_name as these are the only meaningful identifiers..
williamr@2
    37
x509_name is X.500 Distinguished Name, and should use our existing X.500 DN implementation.  
williamr@2
    38
williamr@2
    39
struct {
williamr@2
    40
		IdentifierType identifier_type;
williamr@2
    41
		select (identifier_type) {
williamr@2
    42
			case null: struct {};
williamr@2
    43
			case text:
williamr@2
    44
				CharacterSet character_set;
williamr@2
    45
				opaque name<1.. 2^8-1>;
williamr@2
    46
			case binary: opaque identifier<1..2^8-1>;
williamr@2
    47
			case key_hash_sha: opaque key_hash[20];
williamr@2
    48
			case x509_name: opaque distinguished_name<1..2^8-1>;
williamr@2
    49
		} 
williamr@2
    50
		Identifier;
williamr@2
    51
williamr@2
    52
uint16 CharacterSet;
williamr@2
    53
williamr@2
    54
This maps on to one of the IANA defined character sets. There are rather a lot
williamr@2
    55
of these.  We just support the text type, with either Latin1 or UTF8 encoding.
williamr@2
    56
*/
williamr@2
    57
williamr@2
    58
/**
williamr@2
    59
 * Enumerates the types of WTLS certificate name forms/identifiers.
williamr@2
    60
 * 
williamr@2
    61
 * Only text strings and X.500 Distinguished Names are currently supported.
williamr@2
    62
 * 
williamr@2
    63
 * @publishedAll
williamr@2
    64
 * @released
williamr@2
    65
 */
williamr@2
    66
enum 
williamr@2
    67
	{
williamr@2
    68
	/* Null */
williamr@2
    69
	EWTLSNull =			0x00,
williamr@2
    70
	/* Text string (Latin-1 or Unicode). 
williamr@2
    71
	 *
williamr@2
    72
	 * A text identifier consists of a 16-bit character set identifier; 
williamr@2
    73
	 * this represents the IANA-assigned character set number. */
williamr@2
    74
	EWTLSText =			0x01,
williamr@2
    75
	/* Binary identifier.
williamr@2
    76
	 *
williamr@2
    77
	 * Certificates of this type will be rejected.*/
williamr@2
    78
	EWTLSBinary =		0x02,
williamr@2
    79
	/* Key Hash SHA-1. 
williamr@2
    80
	 *
williamr@2
    81
	 * Certificates of this type will be rejected.*/
williamr@2
    82
	EWTLSKeyHashSha =	0xfe,
williamr@2
    83
	/* X.500 Distinguished Name. */
williamr@2
    84
	EWTLSX500DN =		0xff
williamr@2
    85
	};
williamr@2
    86
williamr@2
    87
/**
williamr@2
    88
 * @publishedAll
williamr@2
    89
 * @released
williamr@2
    90
 */
williamr@2
    91
typedef TUint8 TWTLSNameType;
williamr@2
    92
williamr@2
    93
/**
williamr@2
    94
 * @publishedAll
williamr@2
    95
 * @released
williamr@2
    96
 */
williamr@2
    97
typedef TInt TWTLSCharSet;
williamr@2
    98
williamr@2
    99
// MIBenum constants from the IANA list of character sets.
williamr@2
   100
// See http://www.iana.org/assignments/character-sets for more info.
williamr@2
   101
williamr@2
   102
/** MIBenum constant for the Latin1 IANA character set */
williamr@2
   103
const TInt KWTLSLatin1CharSet = 4;
williamr@2
   104
williamr@2
   105
/** MIBenum constant for the UTF-8 IANA character set */
williamr@2
   106
const TInt KWTLSUTF8CharSet = 106;
williamr@2
   107
williamr@2
   108
class CWTLSName : public CBase
williamr@2
   109
/**
williamr@2
   110
 * Stores the type of a WTLS name and the underlying encoding of the type.
williamr@2
   111
 *
williamr@2
   112
 * @publishedAll
williamr@2
   113
 * @released
williamr@2
   114
 */
williamr@2
   115
	{
williamr@2
   116
public:
williamr@2
   117
	/**
williamr@2
   118
	 * Creates a new CWTLSName object from the specified buffer containing the binary coded representation.
williamr@2
   119
	 *
williamr@2
   120
	 * @param aBinaryData	The encoded binary representation.
williamr@2
   121
	 * @return				The new CWTLSName object.
williamr@2
   122
	 */
williamr@2
   123
	IMPORT_C static CWTLSName* NewL(const TDesC8& aBinaryData);
williamr@2
   124
williamr@2
   125
	/**
williamr@2
   126
	 * Creates a new CWTLSName object from the specified buffer containing the binary coded representation,
williamr@2
   127
	 * and puts a pointer to it onto the cleanup stack.
williamr@2
   128
	 *
williamr@2
   129
	 * @param aBinaryData	The encoded binary representation.
williamr@2
   130
	 * @return				The new CWTLSName object.
williamr@2
   131
	 */
williamr@2
   132
	IMPORT_C static CWTLSName* NewLC(const TDesC8& aBinaryData);
williamr@2
   133
	
williamr@2
   134
	/**
williamr@2
   135
	 * Creates a new CWTLSName object from the specified buffer containing the binary coded representation, 
williamr@2
   136
	 * starting at the specified offset.
williamr@2
   137
	 *
williamr@2
   138
	 * @param aBinaryData	The encoded binary representation.
williamr@2
   139
	 * @param aPos			The offset position from which to start decoding. It specifies an offset into the descriptor, 
williamr@2
   140
	 *						and is updated to the position at the end of the object.
williamr@2
   141
	 * @return				The new CWTLSName object.
williamr@2
   142
	 */
williamr@2
   143
	IMPORT_C static CWTLSName* NewL(const TDesC8& aBinaryData, TInt& aPos);
williamr@2
   144
williamr@2
   145
	/**
williamr@2
   146
	 * Creates a new CWTLSName object from the specified buffer containing the binary coded representation, 
williamr@2
   147
	 * starting at the specified offset, and puts a pointer to it onto the cleanup stack.
williamr@2
   148
	 *
williamr@2
   149
	 * @param aBinaryData	The encoded binary representation.
williamr@2
   150
	 * @param aPos			The offset position from which to start decoding. It specifies an offset into the descriptor, 
williamr@2
   151
	 *						and is updated to the position at the end of the object.
williamr@2
   152
	 * @return				The new CWTLSName object.
williamr@2
   153
	 */
williamr@2
   154
	IMPORT_C static CWTLSName* NewLC(const TDesC8& aBinaryData, TInt& aPos);
williamr@2
   155
williamr@2
   156
	/**
williamr@2
   157
	 * Creates a new CWTLSName object from an existing one.
williamr@2
   158
	 *
williamr@2
   159
	 * @param aName	An existing CWTLSName object.
williamr@2
   160
	 * @return		The new CWTLSName object.
williamr@2
   161
	 */
williamr@2
   162
	IMPORT_C static CWTLSName* NewL(const CWTLSName& aName);
williamr@2
   163
williamr@2
   164
	/**
williamr@2
   165
	 * Creates a new CWTLSName object from an existing one, 
williamr@2
   166
	 * and puts a pointer to it onto the cleanup stack.
williamr@2
   167
	 *
williamr@2
   168
	 * @param aName	An existing CWTLSName object.
williamr@2
   169
	 * @return		The new CWTLSName object.
williamr@2
   170
	 */
williamr@2
   171
	IMPORT_C static CWTLSName* NewLC(const CWTLSName& aName);	
williamr@2
   172
	
williamr@2
   173
	/**
williamr@2
   174
	 * Destructor.
williamr@2
   175
	 *
williamr@2
   176
	 * Frees all resources owned by the object, prior to its destruction.
williamr@2
   177
	 */
williamr@2
   178
	IMPORT_C ~CWTLSName(); 
williamr@2
   179
	
williamr@2
   180
	/**
williamr@2
   181
	 * Performs a simple byte compare between this WTLS name and a specified WTLS name.
williamr@2
   182
	 *
williamr@2
   183
	 * Needed for the constructing/validating of certificate chains.
williamr@2
   184
	 *
williamr@2
   185
	 * @param aName	An existing CWTLSName object.
williamr@2
   186
	 * @return		ETrue, if the WTLS names match; EFalse, otherwise.
williamr@2
   187
	 */	
williamr@2
   188
	IMPORT_C TBool ExactMatchL(const CWTLSName& aName) const;
williamr@2
   189
	
williamr@2
   190
	/** 
williamr@2
   191
	 * Gets the type of the WTLS name.
williamr@2
   192
	 *
williamr@2
   193
	 * @return	Type of WTLS name form.
williamr@2
   194
	 */	
williamr@2
   195
	IMPORT_C TWTLSNameType NameType() const;
williamr@2
   196
	
williamr@2
   197
	/** 
williamr@2
   198
	 * Gets the encoding of the underlying type of WTLS name.
williamr@2
   199
	 *
williamr@2
   200
	 * @return	Pointer descriptor representing the encoding of the WTLS name type.
williamr@2
   201
	 */	
williamr@2
   202
	IMPORT_C TPtrC8 NameData() const;
williamr@2
   203
	
williamr@2
   204
	/**
williamr@2
   205
	 * Gets the decoded value for the common or organisation name.
williamr@2
   206
	 *
williamr@2
   207
	 * Provides the functionality required by the CCertificate::IssuerL() and SubjectL() functions.
williamr@2
   208
	 *
williamr@2
   209
	 * @return A heap descriptor containing the decoded value of the common or organisation name.
williamr@2
   210
	 */
williamr@2
   211
	IMPORT_C HBufC* DisplayNameL() const;
williamr@2
   212
private:
williamr@2
   213
	CWTLSName();
williamr@2
   214
	void ConstructL(const TDesC8& aBinaryData, TInt& aPos);
williamr@2
   215
	void ConstructL(const CWTLSName& aName);
williamr@2
   216
	void AllocNameDataL(const TDesC8& aBinaryData, TInt& aPos);
williamr@2
   217
	void AllocTextDataL(const TDesC8& aBinaryData, TInt& aPos);
williamr@2
   218
	TWTLSNameType iNameType;
williamr@2
   219
	HBufC8* iNameData;
williamr@2
   220
	};
williamr@2
   221
williamr@2
   222
/**
williamr@2
   223
 * @publishedAll
williamr@2
   224
 * @released
williamr@2
   225
 */
williamr@2
   226
class CWTLSText : public CBase
williamr@2
   227
	{
williamr@2
   228
public:
williamr@2
   229
	/**
williamr@2
   230
	 * Creates a new CWTLSText object from the specified buffer containing the binary coded representation.
williamr@2
   231
	 *
williamr@2
   232
	 * @param aBinaryData	The encoded binary representation.
williamr@2
   233
	 * @return				The new CWTLSText object.
williamr@2
   234
	 */
williamr@2
   235
	IMPORT_C static CWTLSText* NewL(const TDesC8& aBinaryData);
williamr@2
   236
williamr@2
   237
	/**
williamr@2
   238
	 * Creates a new CWTLSText object from the specified buffer containing the binary coded representation,
williamr@2
   239
	 * and puts a pointer to it onto the cleanup stack.
williamr@2
   240
	 *
williamr@2
   241
	 * @param aBinaryData	The encoded binary representation.
williamr@2
   242
	 * @return				The new CWTLSText object.
williamr@2
   243
	 */
williamr@2
   244
	IMPORT_C static CWTLSText* NewLC(const TDesC8& aBinaryData);
williamr@2
   245
williamr@2
   246
	/**
williamr@2
   247
	 * Creates a new CWTLSText object from the specified buffer containing the binary coded representation, 
williamr@2
   248
	 * starting at the specified offset.
williamr@2
   249
	 *
williamr@2
   250
	 * @param aBinaryData	The encoded binary representation.
williamr@2
   251
	 * @param aPos			The offset position from which to start decoding. It specifies an offset into the descriptor, 
williamr@2
   252
	 *						and is updated to the position at the end of the object.
williamr@2
   253
	 * @return				The new CWTLSText object.
williamr@2
   254
	 */
williamr@2
   255
	IMPORT_C static CWTLSText* NewL(const TDesC8& aBinaryData, TInt& aPos);
williamr@2
   256
williamr@2
   257
	/**
williamr@2
   258
	 * Creates a new CWTLSText object from the specified buffer containing the binary coded representation, 
williamr@2
   259
	 * starting at the specified offset, and puts a pointer to it onto the cleanup stack.
williamr@2
   260
	 *
williamr@2
   261
	 * @param aBinaryData	The encoded binary representation.
williamr@2
   262
	 * @param aPos			The offset position from which to start decoding. It specifies an offset into the descriptor, 
williamr@2
   263
	 *						and is updated to the position at the end of the object.
williamr@2
   264
	 * @return				The new CWTLSText object.
williamr@2
   265
	 */
williamr@2
   266
	IMPORT_C static CWTLSText* NewLC(const TDesC8& aBinaryData, TInt& aPos);	
williamr@2
   267
	
williamr@2
   268
	/**
williamr@2
   269
	 * Destructor.
williamr@2
   270
	 *
williamr@2
   271
	 * Frees all resources owned by the object, prior to its destruction.
williamr@2
   272
	 */
williamr@2
   273
	IMPORT_C ~CWTLSText(); 	
williamr@2
   274
	
williamr@2
   275
	/**
williamr@2
   276
	 * Performs a simple byte compare between this CWTLSText object and a specified CWTLSText object.
williamr@2
   277
	 *
williamr@2
   278
	 * There is a subtle difference between this byte-match and CWTLSName::ExactMatchL().
williamr@2
   279
	 * As opposed to the latter, this function should successfully match two names that 
williamr@2
   280
	 * are the same that were encoded using different character sets.
williamr@2
   281
	 *
williamr@2
   282
	 * @param aName	An existing CWTLSText object.
williamr@2
   283
	 * @return		ETrue, if the CWTLSText objects match; EFalse, otherwise.
williamr@2
   284
	 */	
williamr@2
   285
	IMPORT_C TBool ExactMatchL(const CWTLSText& aName) const;	
williamr@2
   286
	
williamr@2
   287
	/**
williamr@2
   288
	 * Gets the name of the CWTLSText object.
williamr@2
   289
	 *
williamr@2
   290
	 * @return A pointer to the name of the CWTLSText object. 
williamr@2
   291
	 */
williamr@2
   292
	IMPORT_C TPtrC Name() const;
williamr@2
   293
	
williamr@2
   294
	/**
williamr@2
   295
	 * Gets the character set of the CWTLSText object.
williamr@2
   296
	 *
williamr@2
   297
	 * @return The character set
williamr@2
   298
	 */
williamr@2
   299
	IMPORT_C TWTLSCharSet CharacterSet() const;
williamr@2
   300
protected:
williamr@2
   301
	/** 
williamr@2
   302
	 * @internalAll
williamr@2
   303
	 */
williamr@2
   304
	CWTLSText();
williamr@2
   305
	/** 
williamr@2
   306
	 * @internalAll
williamr@2
   307
	 */
williamr@2
   308
	void ConstructL(const TDesC8& aBinaryData, TInt& aPos);
williamr@2
   309
	HBufC* iName;
williamr@2
   310
private:
williamr@2
   311
	TInt iCharacterSet;
williamr@2
   312
	};
williamr@2
   313
williamr@2
   314
//this class implements the 'structured' variant of the text type defined in the WTLS spec, section 10.5.2:
williamr@2
   315
//<servicename>; <organization>; <country>[; <commonname>[; <extension>[; <extension>[ …. ]]]]
williamr@2
   316
_LIT(KWTLSCountryName,"C");
williamr@2
   317
_LIT(KWTLSOrganizationName,"O");
williamr@2
   318
_LIT(KWTLSServiceName,"OU");
williamr@2
   319
_LIT(KWTLSTitle,"T");
williamr@2
   320
_LIT(KWTLSCommonName,"CN");
williamr@2
   321
williamr@2
   322
/**
williamr@2
   323
 * @publishedAll
williamr@2
   324
 * @released
williamr@2
   325
 */
williamr@2
   326
class TWTLSStructuredTextField 
williamr@2
   327
	{
williamr@2
   328
public:
williamr@2
   329
	/** 
williamr@2
   330
     * @internalAll
williamr@2
   331
     */
williamr@2
   332
	TWTLSStructuredTextField(const TDesC& aType, const TDesC& aValue);
williamr@2
   333
williamr@2
   334
	/**
williamr@2
   335
	 *
williamr@2
   336
	 * @return	
williamr@2
   337
	 */
williamr@2
   338
	IMPORT_C TPtrC Type() const;
williamr@2
   339
williamr@2
   340
	/**
williamr@2
   341
	 *
williamr@2
   342
	 * @return
williamr@2
   343
	 */
williamr@2
   344
	IMPORT_C TPtrC Value() const;
williamr@2
   345
williamr@2
   346
private:
williamr@2
   347
	const TPtrC iType;
williamr@2
   348
	const TPtrC iValue; 
williamr@2
   349
	};
williamr@2
   350
williamr@2
   351
/**
williamr@2
   352
 * @publishedAll
williamr@2
   353
 * @released
williamr@2
   354
 */
williamr@2
   355
class CWTLSStructuredText : public CWTLSText
williamr@2
   356
	{
williamr@2
   357
public:
williamr@2
   358
	/**
williamr@2
   359
	 * Creates a new CWTLSStructuredText object from the specified buffer containing the binary coded representation.
williamr@2
   360
	 *
williamr@2
   361
	 * @param aBinaryData	The encoded binary representation.
williamr@2
   362
	 * @return				The new CWTLSStructuredText object.
williamr@2
   363
	 */
williamr@2
   364
	IMPORT_C static CWTLSStructuredText* NewL(const TDesC8& aBinaryData);
williamr@2
   365
williamr@2
   366
	/**
williamr@2
   367
	 * Creates a new CWTLSStructuredText object from the specified buffer containing the binary coded representation,
williamr@2
   368
	 * and puts a pointer to it onto the cleanup stack.
williamr@2
   369
	 *
williamr@2
   370
	 * @param aBinaryData	The encoded binary representation.
williamr@2
   371
	 * @return				The new CWTLSStructuredText object.
williamr@2
   372
	 */
williamr@2
   373
	IMPORT_C static CWTLSStructuredText* NewLC(const TDesC8& aBinaryData);
williamr@2
   374
williamr@2
   375
	/**
williamr@2
   376
	 * Creates a new CWTLSStructuredText object from the specified buffer containing the binary coded representation, 
williamr@2
   377
	 * starting at the specified offset.
williamr@2
   378
	 *
williamr@2
   379
	 * @param aBinaryData	The encoded binary representation.
williamr@2
   380
	 * @param aPos			The offset position from which to start decoding. It specifies an offset into the descriptor, 
williamr@2
   381
	 *						and is updated to the position at the end of the object.
williamr@2
   382
	 * @return				The new CWTLSStructuredText object.
williamr@2
   383
	 */
williamr@2
   384
	IMPORT_C static CWTLSStructuredText* NewL(const TDesC8& aBinaryData, TInt& aPos);
williamr@2
   385
williamr@2
   386
	/**
williamr@2
   387
	 * Creates a new CWTLSStructuredText object from the specified buffer containing the binary coded representation, 
williamr@2
   388
	 * starting at the specified offset, and puts a pointer to it onto the cleanup stack.
williamr@2
   389
	 *
williamr@2
   390
	 * @param aBinaryData	The encoded binary representation.
williamr@2
   391
	 * @param aPos			The offset position from which to start decoding. It specifies an offset into the descriptor, 
williamr@2
   392
	 *						and is updated to the position at the end of the object.
williamr@2
   393
	 * @return				The new CWTLSStructuredText object.
williamr@2
   394
	 */
williamr@2
   395
	IMPORT_C static CWTLSStructuredText* NewLC(const TDesC8& aBinaryData, TInt& aPos);
williamr@2
   396
	
williamr@2
   397
	/**
williamr@2
   398
	 * Destructor.
williamr@2
   399
	 *
williamr@2
   400
	 * Frees all resources owned by the object, prior to its destruction.
williamr@2
   401
	 */
williamr@2
   402
	IMPORT_C ~CWTLSStructuredText(); 
williamr@2
   403
	
williamr@2
   404
	/**
williamr@2
   405
	 * 
williamr@2
   406
	 *
williamr@2
   407
	 * @return
williamr@2
   408
	 */
williamr@2
   409
	IMPORT_C HBufC* DisplayNameL() const;
williamr@2
   410
williamr@2
   411
	//accessors for defined fields
williamr@2
   412
	
williamr@2
   413
	/**
williamr@2
   414
	 *
williamr@2
   415
	 *
williamr@2
   416
	 * @return
williamr@2
   417
	 */
williamr@2
   418
	IMPORT_C TPtrC ServiceName() const;
williamr@2
   419
	
williamr@2
   420
	/**
williamr@2
   421
	 *
williamr@2
   422
	 *
williamr@2
   423
	 * @return
williamr@2
   424
	 */
williamr@2
   425
	IMPORT_C TPtrC Organization() const;
williamr@2
   426
	
williamr@2
   427
	/**
williamr@2
   428
	 *
williamr@2
   429
	 *
williamr@2
   430
	 * @return
williamr@2
   431
	 */
williamr@2
   432
	IMPORT_C TPtrC Country() const;
williamr@2
   433
	
williamr@2
   434
	/**
williamr@2
   435
	 *
williamr@2
   436
	 *
williamr@2
   437
	 * @return
williamr@2
   438
	 */
williamr@2
   439
	IMPORT_C TInt Count() const;
williamr@2
   440
williamr@2
   441
	
williamr@2
   442
	/**
williamr@2
   443
	 *
williamr@2
   444
	 *
williamr@2
   445
	 * Note 
williamr@2
   446
	 *
williamr@2
   447
	 * @param aType
williamr@2
   448
	 * @return	A pointer to a TWTLSStructuredTextField object; NULL if field not found. 
williamr@2
   449
	 *			The returned object remains the property of the structured text object
williamr@2
   450
	 *			(so don't delete it).
williamr@2
   451
	 */
williamr@2
   452
	IMPORT_C const TWTLSStructuredTextField* FieldByName(const TDesC& aType) const;
williamr@2
   453
	
williamr@2
   454
	/**
williamr@2
   455
	 *
williamr@2
   456
	 *
williamr@2
   457
	 * @return
williamr@2
   458
	 */
williamr@2
   459
	IMPORT_C const TWTLSStructuredTextField& FieldByIndex(TInt aIndex) const;
williamr@2
   460
private:
williamr@2
   461
	CWTLSStructuredText();
williamr@2
   462
	void ConstructL(const TDesC8& aBinaryData, TInt& aPos);
williamr@2
   463
	void AddFieldValueL(const TDesC& aFieldName, TInt& aPos);
williamr@2
   464
	void AddFieldL(TInt& aPos);
williamr@2
   465
	TPtrC GetFieldL(TDesC& aString, TInt& aPos);
williamr@2
   466
	TBool GetSubFieldL(TDesC& aString, TInt& aPos);
williamr@2
   467
	CArrayFixFlat<TWTLSStructuredTextField>* iFields; 
williamr@2
   468
	};
williamr@2
   469
williamr@2
   470
#endif