mmlibs/mmfw/Recogniser/src/asfparser.cpp
author hgs
Tue, 02 Nov 2010 12:28:51 +0000
changeset 6 fe9d1bf55678
parent 0 b8ed18f6c07b
permissions -rw-r--r--
2010wk46_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     1
// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     2
// All rights reserved.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     7
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     8
// Initial Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    10
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    11
// Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    12
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    13
// Description:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    14
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    15
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    16
#include "constants.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    17
#include "parsers.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    18
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    19
#define KASFAudioMedia				"\xF8\x69\x9E\x40\x5B\x4D\x11\xCF\xA8\xFD\x00\x80\x5F\x5C\x44\x2B"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    20
#define KASFVideoMedia				"\xBC\x19\xEF\xC0\x5B\x4D\x11\xCF\xA8\xFD\x00\x80\x5F\x5C\x44\x2B"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    21
#define KASFHeaderObject 			"\x75\xB2\x26\x30\x66\x8E\x11\xCF\xA6\xD9\x00\xAA\x00\x62\xCE\x6C"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    22
#define KASFStreamPropertiesObject	"\xB7\xDC\x07\x91\xA9\xB7\x11\xCF\x8E\xE6\x00\xC0\x0C\x20\x53\x65"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    23
#define KASFCodecListObject			"\x86\xD1\x52\x40\x31\x1D\x11\xD0\xA3\xA4\x00\xA0\xC9\x03\x48\xF6"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    24
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    25
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    26
static const TInt KGUIDLen = 16; 				// 128-bit
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    27
static const TInt KObjectLen = KGUIDLen + 8; 	// GUID followed by 64-bit size.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    28
static const TInt KMinObjectLen = 30; 			// From documentation
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    29
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    30
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    31
typedef struct
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    32
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    33
	const TText* iExt;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    34
	const TText8* iVideoMime;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    35
	const TText8* iAudioMime;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    36
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    37
TASFType;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    38
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    39
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    40
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    41
// Various ASF container MIME-types.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    42
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    43
static const TASFType KASFTypes[] =
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    44
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    45
		{KExtWMA,	KMimeWMA,	KMimeWMA},
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    46
		{KExtWMV,	KMimeWMV,	KMimeWMV},
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    47
		{KExtASF,	KMimeASF_V,	KMimeASF_A}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    48
	};
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    49
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    50
#define KASFTypesCount	sizeof(KASFTypes) / sizeof(TASFType)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    51
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    52
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    53
#define KASFHeaderObjectBit		KBit1	// 00000001
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    54
#define KASFStreamHeaderBit		KBit2	// 00000010
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    55
#define KASFVideoBit			KBit3	// 00000100
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    56
#define KASFConfidenceMask		0x07	// 00000111
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    57
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    58
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    59
// Flags mapped to confidence levels.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    60
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    61
// A: Extension identified.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    62
// B: HeaderObject GUID
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    63
// C: StreamProperties GUID
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    64
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    65
// C B A -> Confidence
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    66
// -------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    67
// 0 0 0 -> ENotRecognised
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    68
// 0 0 1 -> EPossible
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    69
// 0 1 0 -> EPossible
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    70
// 0 1 1 -> EProbable
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    71
// 1 0 0 -> ENotRecognised (StreamProperties occurs within HeaderObject)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    72
// 1 0 1 -> ENotRecognised (StreamProperties occurs within HeaderObject)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    73
// 1 1 0 -> EProbable
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    74
// 1 1 1 -> ECertain
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    75
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    76
static const TInt KASFFlagsToConfidence[8] = 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    77
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    78
	KConfNotRecognised,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    79
	KConfPossible,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    80
	KConfPossible,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    81
	KConfProbable,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    82
	KConfNotRecognised,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    83
	KConfNotRecognised,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    84
	KConfProbable,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    85
	KConfCertain
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    86
	};
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    87
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    88
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    89
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    90
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    91
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    92
TASFParser::TASFParser(CReader& aReader, TFlags& aFlags)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    93
 :	iReader(aReader),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    94
 	iFlags(aFlags)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    95
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    96
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    97
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    98
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    99
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   100
// Sets the mime-type the file extension implies.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   101
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   102
const TText8* TASFParser::MatchExtension(const TDesC& aExt, TBool aVideo)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   103
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   104
	for (TInt i = 0; i < KASFTypesCount; i++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   105
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   106
		if (aExt.MatchF(TPtrC(KASFTypes[i].iExt)) != KErrNotFound)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   107
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   108
			return (aVideo ? KASFTypes[i].iVideoMime : KASFTypes[i].iAudioMime);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   109
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   110
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   111
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   112
	return NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   113
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   114
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   115
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   116
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   117
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   118
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   119
void TASFParser::DoRecognise(const TDesC& aExt, CReader& aReader, TMatch& aMatch)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   120
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   121
	TFlags flags;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   122
	TASFParser parser(aReader, flags);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   123
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   124
	// We need to parse first to determine if there's video content present.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   125
	TRAPD(err, parser.ParseL());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   126
	if (err == KErrCorrupt)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   127
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   128
		// Unrecognised content. However the extension may allow
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   129
		// correct identification so assume there's video content.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   130
		flags.SetBit(KASFVideoBit);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   131
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   132
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   133
	const TText8* extMime = parser.MatchExtension(aExt, flags.GetBitField(KASFVideoBit));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   134
	if (extMime != NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   135
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   136
		// The extension was recognised.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   137
		flags.SetExtensionFlag();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   138
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   139
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   140
	TInt confIndex = flags.GetBitField(KASFConfidenceMask);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   141
	aMatch.iConfidence = KASFFlagsToConfidence[confIndex];
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   142
	if (aMatch.iConfidence != KConfNotRecognised)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   143
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   144
		// Trust the mime-type the extension maps to.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   145
		// If the extension wasn't recognised, but the content was
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   146
		// then return the generic ASF mime type. ASF format files
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   147
		// can't be identified from their content; just whether they
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   148
		// contain video or not.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   149
		aMatch.iMime = extMime;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   150
		if (aMatch.iMime == NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   151
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   152
			aMatch.iMime = (flags.GetBitField(KASFVideoBit) ? KMimeASF_V : KMimeASF_A);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   153
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   154
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   155
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   156
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   157
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   158
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   159
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   160
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   161
void TASFParser::ParseL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   162
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   163
	// ASF files are logically composed of three types of top-level objects:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   164
	// the Header Object, the Data Object, and the Index Object(s).
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   165
	// The Header Object is mandatory and must be placed at the beginning of every
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   166
	// ASF file. The Data Object is also mandatory and must follow the Header Object.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   167
	// The Index Object(s) are optional, but they are useful in providing time-based
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   168
	// random access into ASF files. When present, the Index Object(s) must be the
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   169
	// last object in the ASF file. 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   170
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   171
	TBuf8<KGUIDLen> guid;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   172
	TInt64 size;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   173
	const TBool useLittleEndian = ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   174
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   175
	// Assume there's video content present if we only have buffer data.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   176
	if (iReader.Type() == CReader::EBuffer)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   177
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   178
		iFlags.SetBit(KASFVideoBit);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   179
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   180
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   181
	ReadObjectL(guid, size);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   182
	if (guid == MAKE_TPtrC8(KASFHeaderObject))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   183
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   184
		TUint32 objectCount;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   185
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   186
		if (size < KMinObjectLen)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   187
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   188
			User::Leave(KErrCorrupt);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   189
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   190
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   191
		iFlags.SetBit(KASFHeaderObjectBit);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   192
		// We need to find out how many objects there are.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   193
		iReader.Read32L(objectCount, useLittleEndian);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   194
		iReader.SeekL(2); // Ignore reserved values (two bytes).
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   195
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   196
		const TDesC8& streamPropertiesGUID = MAKE_TPtrC8(KASFStreamPropertiesObject);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   197
		const TDesC8& videoMediaGUID = MAKE_TPtrC8(KASFVideoMedia);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   198
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   199
		for (TInt i = 0; i < objectCount; i++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   200
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   201
			ReadObjectL(guid, size);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   202
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   203
			// We want the stream properties object.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   204
			if (guid == streamPropertiesGUID)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   205
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   206
				// There may be more than one present.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   207
				iFlags.SetBit(KASFStreamHeaderBit);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   208
				
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   209
				ReadGUIDL(guid);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   210
				if (guid == videoMediaGUID)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   211
					{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   212
					iFlags.SetBit(KASFVideoBit);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   213
					}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   214
				iReader.SeekL(size - KObjectLen - KGUIDLen);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   215
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   216
			else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   217
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   218
				iReader.SeekL(size - KObjectLen);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   219
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   220
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   221
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   222
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   223
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   224
		User::Leave(KErrCorrupt);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   225
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   226
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   227
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   228
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   229
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   230
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   231
void TASFParser::ReadObjectL(TDes8& aGUID, TInt64& aSize)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   232
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   233
	//The base unit of organization for ASF files is called the ASF object.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   234
	//It consists of a 128-bit GUID for the object, a 64-bit integer object size,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   235
	//and the variable-length object data. The value of the object size field is
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   236
	//the sum of 24 bytes plus the size of the object data in bytes.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   237
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   238
	TUint32 word1;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   239
	TUint32 word2;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   240
	const TBool useLittleEndian = ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   241
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   242
	aGUID.SetLength(KGUIDLen);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   243
	ReadGUIDL(aGUID);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   244
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   245
	iReader.Read32L(word2, useLittleEndian);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   246
	iReader.Read32L(word1, useLittleEndian);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   247
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   248
	aSize = MAKE_TINT64(word1, word2);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   249
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   250
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   251
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   252
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   253
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   254
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   255
void TASFParser::ReadGUIDL(TDes8& aGUID)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   256
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   257
	TUint8 byte;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   258
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   259
	if (aGUID.Length() != KGUIDLen)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   260
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   261
		User::Leave(KErrUnderflow);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   262
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   263
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   264
	// Parts of the GUID are stored in big-endian order.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   265
	// They're converted to little-endian order here.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   266
	iReader.ReadByteL(byte);	aGUID[3] = byte;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   267
	iReader.ReadByteL(byte);	aGUID[2] = byte;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   268
	iReader.ReadByteL(byte);	aGUID[1] = byte;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   269
	iReader.ReadByteL(byte);	aGUID[0] = byte;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   270
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   271
	iReader.ReadByteL(byte);	aGUID[5] = byte;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   272
	iReader.ReadByteL(byte);	aGUID[4] = byte;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   273
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   274
	iReader.ReadByteL(byte);	aGUID[7] = byte;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   275
	iReader.ReadByteL(byte);	aGUID[6] = byte;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   276
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   277
	for (TInt i = 8; i < KGUIDLen; i++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   278
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   279
		iReader.ReadByteL(byte);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   280
		aGUID[i] = byte; 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   281
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   282
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   283