mmlibs/mmfw/Recogniser/src/mmruf.cpp
author hgs
Thu, 07 Oct 2010 22:34:12 +0100
changeset 0 b8ed18f6c07b
permissions -rw-r--r--
2010wk40
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 "mmruf.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    17
#include <e32uid.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    18
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    19
#include "constants.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    20
#include "parsers.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    21
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    22
#ifdef _DEBUG
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    23
_LIT(KRUFPanic, "MMRUF");
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    24
static const TInt KReasonNoFunction = 1;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    25
#endif
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    26
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    27
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    28
// A table of recognised file formats.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    29
// It should be sorted in order of format popularity.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    30
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    31
static const TSignature KSigs[] =
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    32
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    33
	CUSTOM_SIG(KMimeAAC,		TAACParser::DoRecognise),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    34
	CUSTOM_SIG(KMimeMP3,		TMP3Parser::DoRecognise),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    35
	CUSTOM_SIG(KMimeMP4_V,		TMPEG4Parser::DoRecognise),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    36
	CUSTOM_SIG(KMimeWMV,		TASFParser::DoRecognise),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    37
	CUSTOM_SIG(KMimeMPEG2_V,	TMPEG2Parser::DoRecognise),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    38
	CUSTOM_SIG(KMimeRM_V,		TRMParser::DoRecognise),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    39
	CUSTOM_SIG(KMimeRAM,		TRAMParser::DoRecognise),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    40
	CUSTOM_SIG(KMimeSDP,		TSDPParser::DoRecognise),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    41
	CUSTOM_SIG(KMimeXPS,		TXPSParser::DoRecognise),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    42
	HEADER_SIG(KMimeRA,			KExtRA,			KSigRA),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    43
	HEADER_SIG(KMimeAIFF,		KExtAIFF_1,		KSigAIFF),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    44
	HEADER_SIG(KMimeAIFF,		KExtAIFF_2,		KSigAIFF),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    45
	HEADER_SIG(KMimeAIFF,		KExtAIFF_3,		KSigAIFF),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    46
	HEADER_SIG(KMimeAMR,		KExtAMR,		KSigAMR_1),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    47
	HEADER_SIG(KMimeAMR,		KExtAMR,		KSigAMR_2),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    48
	HEADER_SIG(KMimeAMRWB,		KExtAMRWB,		KSigAMRWB_1),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    49
	HEADER_SIG(KMimeAMRWB,		KExtAMRWB,		KSigAMRWB_2),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    50
	HEADER_SIG(KMimeAU,			KExtAU,			KSigAU),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    51
	HEADER_SIG(KMimeAVI,		KExtAVI,		KSigAVI),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    52
	HEADER_SIG(KMimeDIVX,		KExtDIVX,		KSigDIVX_1),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    53
	HEADER_SIG(KMimeDIVX,		KExtDIVX,		KSigDIVX_2),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    54
	HEADER_SIG(KMimeDLS,		KExtDLS,		KSigDLS),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    55
	HEADER_SIG(KMimeFLAC,		KExtFLAC_1,		KSigFLAC),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    56
	HEADER_SIG(KMimeFLAC,		KExtFLAC_2,		KSigFLAC),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    57
	HEADER_SIG(KMimeGSM,		KExtGSM,		KSigGSM),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    58
	HEADER_SIG(KMimeM3U,		KExtM3U,		KSigM3U),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    59
	HEADER_SIG(KMimeMID,		KExtMID,		KSigMID),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    60
	HEADER_SIG(KMimeMLD,		KExtMLD,		KSigMLD),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    61
	HEADER_SIG(KMimeMMF,		KExtMMF,		KSigMMF),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    62
	HEADER_SIG(KMimeMXMF,		KExtMXMF,		KSigMXMF),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    63
	HEADER_SIG(KMimeOGG,		KExtOGG,		KSigOGG),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    64
	HEADER_SIG(KMimeBeatnikRMF, KExtBeatnikRMF, KSigBeatnikRMF),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    65
	HEADER_SIG(KMimeSMF,		KExtSMF,		KSigSMF),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    66
	HEADER_SIG(KMimeSND,		KExtSND,		KSigSND),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    67
	HEADER_SIG(KMimeWAV,		KExtWAV,		KSigWAV_1),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    68
	HEADER_SIG(KMimeWAV,		KExtWAV,		KSigWAV_2),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    69
	HEADER_SIG(KMimeXMF,		KExtXMF,		KSigXMF),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    70
	CUSTOM_SIG(KMimeMAT_V,		TMatroskaParser::DoRecognise),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    71
	};
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    72
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    73
static const TInt KDataTypesCount = sizeof(KSigs) / sizeof(TSignature);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    74
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    75
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    76
// Map all combinations of [ext_match][header_match] to confidence levels.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    77
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    78
static const TInt KResultToConfidence[] =
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    79
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    80
	KConfNotRecognised,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    81
	KConfProbable,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    82
	KConfPossible,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    83
	KConfCertain
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    84
	};
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    85
	
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
const TImplementationProxy ImplementationTable[] =
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    90
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    91
	// UID taken from Multimedia's UID allocation table.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    92
	IMPLEMENTATION_PROXY_ENTRY(KRecogniserUID, CMMRUF::NewL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    93
	};
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    94
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
EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   100
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   101
    aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   102
    return ImplementationTable;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   103
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   104
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   105
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   106
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   107
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   108
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   109
CMMRUF::CMMRUF()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   110
 : CApaDataRecognizerType(KMMRUFDLLUid, KRecogniserPriority)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   111
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   112
	iCountDataTypes = KDataTypesCount;
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
CMMRUF* CMMRUF::NewL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   120
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   121
	return new(ELeave)CMMRUF();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   122
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   123
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   124
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   125
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   126
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   127
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   128
CMMRUF::~CMMRUF()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   129
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   130
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   131
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   132
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   133
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   134
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   135
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   136
TUint CMMRUF::PreferredBufSize()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   137
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   138
	return KPreferredBufSize;	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   139
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   140
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   141
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   142
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   143
// Required for CApaDataRecognizerType parent class.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   144
// It creates a mime-type string for the signature at aIndex.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   145
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   146
TDataType CMMRUF::SupportedDataTypeL(TInt aIndex) const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   147
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   148
	if ((aIndex < 0) || (aIndex >= KDataTypesCount))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   149
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   150
		User::Leave(KErrArgument);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   151
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   152
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   153
	return SupportedDataTypeL(KSigs[aIndex].iMime);
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
TDataType CMMRUF::SupportedDataTypeL(const TText8* aMime) const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   161
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   162
	if (aMime == NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   163
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   164
		User::Leave(KErrArgument);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   165
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   166
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   167
	return TDataType(TPtrC8(aMime));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   168
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   169
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   170
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   171
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   172
// Records the matched data type and the confidence.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   173
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   174
void CMMRUF::SetDataTypeL(TInt aConfidence, const TText8* aMime)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   175
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   176
	iDataType = SupportedDataTypeL(aMime);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   177
	iConfidence = aConfidence;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   178
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   179
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   180
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   181
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   182
// Utility function for matching file extensions.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   183
// Returns 1 if the extensions match, 0 otherwise.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   184
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   185
TUint8 CMMRUF::MatchExtension(const TDesC& aFileExt, const TText* aKnownExt) const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   186
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   187
	if (aFileExt.Length() > 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   188
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   189
		return ((aFileExt.MatchF(TPtrC(aKnownExt)) != KErrNotFound) ? 1 : 0);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   190
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   191
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   192
	return 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   193
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   194
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   195
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   196
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   197
// Utility function for matching known header data.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   198
// Returns 1 if the buffer contents match the header, 0 otherwise.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   199
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   200
TUint8 CMMRUF::MatchHeader(const TDesC8& aBuffer, const TDesC8& aHeader) const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   201
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   202
	if (aBuffer.Length() > 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   203
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   204
		if (aHeader.Length() <= aBuffer.Length())
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   205
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   206
			return ((aBuffer.Match(aHeader) != KErrNotFound) ? 1 : 0);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   207
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   208
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   209
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   210
	return 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   211
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   212
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   213
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   214
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   215
// This function is called by AppArc when something needs recognising.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   216
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   217
void CMMRUF::DoRecognizeL(const TDesC& aFileName, const TDesC8& aBuffer)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   218
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   219
	TMatch match;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   220
	RArray<TMatch> matches;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   221
	CleanupClosePushL(matches);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   222
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   223
	// If a handle to the file is available, AppArc prepends "::" to the
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   224
	// aFileName parameter for some reason. This causes TParse to fail
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   225
	// to get the file extension, so we have to fix it.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   226
	TPtrC fName(aFileName);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   227
	if (aFileName.Match(_L("::*")) == 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   228
 		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   229
		fName.Set(aFileName.Mid(2));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   230
 		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   231
 	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   232
 	TParse parse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   233
	User::LeaveIfError(parse.Set(fName, NULL, NULL));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   234
	const TPtrC& ext = parse.Ext();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   235
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   236
	RFile* pFile = FilePassedByHandleL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   237
	CReader* pReader = (pFile ? CFileReader::NewLC(pFile) : CBufferReader::NewLC(aBuffer));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   238
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   239
	// The main recognition loop.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   240
	TBool certainMatch = EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   241
	for (TInt i = 0; (i < KDataTypesCount) && !certainMatch; i++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   242
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   243
		// Reset the results for each iteration.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   244
		pReader->Reset();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   245
		match.Reset();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   246
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   247
		if (KSigs[i].iHeaderLen == 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   248
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   249
			// Call the custom recognition function.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   250
			// match contains the results.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   251
			__ASSERT_DEBUG(KSigs[i].iHeaderOrProc, User::Panic(KRUFPanic, KReasonNoFunction));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   252
			TCustomProc proc = (TCustomProc)(KSigs[i].iHeaderOrProc);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   253
			proc(ext, *pReader, match);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   254
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   255
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   256
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   257
			// This format has a known signature.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   258
			TPtrC8 header(_S8(KSigs[i].iHeaderOrProc), KSigs[i].iHeaderLen);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   259
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   260
			TUint8 sameHeader = MatchHeader(aBuffer, header);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   261
			TUint8 sameExt = MatchExtension(ext, KSigs[i].iExt);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   262
			TUint8 confIndex = MAKE_BYTE2(sameExt, sameHeader);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   263
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   264
			match.iConfidence = KResultToConfidence[confIndex];
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   265
			match.iMime = KSigs[i].iMime; 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   266
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   267
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   268
		// Evaluate the result.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   269
		switch (match.iConfidence)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   270
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   271
			case KConfNotRecognised:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   272
				continue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   273
				
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   274
			case KConfCertain:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   275
				certainMatch = ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   276
				// Deliberate fall through to add match to array of matches.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   277
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   278
			case KConfProbable:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   279
				// Add it to the start of the array.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   280
				User::LeaveIfError(matches.Insert(TMatch(match), 0));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   281
				break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   282
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   283
			case KConfPossible:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   284
				// Add it to the end of the array.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   285
				if (matches.Count() == 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   286
					{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   287
					User::LeaveIfError(matches.Append(TMatch(match)));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   288
					}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   289
				break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   290
				
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   291
			default:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   292
				// Should never get here.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   293
				User::Leave(KErrArgument);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   294
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   295
		}	// for (TInt i = 0; i < KDataTypesCount; i++)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   296
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   297
	// We've done looping.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   298
	if (matches.Count() > 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   299
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   300
		match = matches[0];
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   301
		SetDataTypeL(match.iConfidence, match.iMime);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   302
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   303
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   304
	CleanupStack::PopAndDestroy(pReader);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   305
	CleanupStack::PopAndDestroy(&matches);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   306
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   307
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   308
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   309
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   310