--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmlibs/mmfw/src/Recognizer/RecMmf.cpp Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,239 @@
+// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <f32file.h>
+#include <barsread.h>
+#include "RecMmf.h"
+#include "mmfcontrollerpluginresolver.h"
+
+const TInt KMimeMmfRecognizerValue = 0x101F7C0C;
+const TUid KUidMimeMmfRecognizer = {KMimeMmfRecognizerValue};
+const TInt KMmfRecognizerPriority = 10; // The recognizer priority is set to 10(a value between ENormal and EHigh)
+
+
+// the minimum buffer size that will theoretically guarantee recognition
+const TInt KPreferredBufSize = 256;
+
+// the granularity of the internal MIME type array
+const TInt KMimeArrayGranularity = 4;
+
+// CApaMmfRecognizer
+
+/**
+ * @internalAll
+ *
+ * Call base constructor with the recognizer's UID and confidence level
+ * The MMF recognizer priority is set to 10(a value between ENormal and EHigh) to allow
+ * third-party recognizers to specify high priority.
+ */
+CApaMmfRecognizer::CApaMmfRecognizer()
+ :CApaDataRecognizerType(KUidMimeMmfRecognizer,KMmfRecognizerPriority)
+ {
+ }
+
+CApaMmfRecognizer::~CApaMmfRecognizer()
+ {
+ delete iMmfRecognizer;
+ }
+
+/**
+ * @internalAll
+ *
+ * Return the supposed minimum buffer size we need to
+ * successfully recognize the data
+ */
+TUint CApaMmfRecognizer::PreferredBufSize()
+ {
+ return KPreferredBufSize;
+ }
+
+/**
+ * @internalAll
+ *
+ * Gets one of the data (MIME) types that the recognizer can recognize.
+ */
+TDataType CApaMmfRecognizer::SupportedDataTypeL(TInt aIndex) const
+ {
+ return (iMmfRecognizer->SupportedDataTypeL(aIndex));
+ }
+
+
+/**
+ * @internalAll
+ *
+ * Attempt to recognize the data.
+ * This recognizer only attempts to match the data header on its own,
+ * or the data header plus the file suffix together.
+ *
+ * NB if the file is not recognized, this function should NOT leave :
+ * it should instead set iConfidence = ENotRecognized and return
+ * the function should only leave if there is an out-of-memory condition
+ */
+void CApaMmfRecognizer::DoRecognizeL(const TDesC& aName, const TDesC8& aBuffer)
+ {
+ // assume Match will fail :
+ iConfidence = CApaDataRecognizerType::ENotRecognized;
+
+ CMmfRecognizer::TMatchMethod matchMethod = iMmfRecognizer->MatchL(aName,aBuffer);
+
+ // return whether the data was matched by setting iConfidence
+ // if matched the MIME type is returned in iDataType
+ if (matchMethod == CMmfRecognizer::ENotMatched)
+ {
+ iConfidence = CApaDataRecognizerType::ENotRecognized;
+ }
+ else
+ {
+ iDataType = iMmfRecognizer->MimeString();
+
+ //Match on data only
+ if (matchMethod == CMmfRecognizer::EBySignature)
+ iConfidence = CApaDataRecognizerType::EPossible;
+ else
+ {//Match on data and suffix
+ ASSERT(matchMethod == CMmfRecognizer::EByName);
+ iConfidence = CApaDataRecognizerType::EProbable;
+ }
+
+ }
+ }
+
+void CApaMmfRecognizer::ConstructL()
+ {
+ iMmfRecognizer = CMmfRecognizer::NewL();
+ iCountDataTypes = iMmfRecognizer->NumMimeTypes();
+ }
+
+CApaMmfRecognizer* CApaMmfRecognizer::NewL()
+ {
+ CApaMmfRecognizer* self = new (ELeave) CApaMmfRecognizer();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// CMmfRecognizer - the main utility class owner by CApaMmfRecognizer
+
+CMmfRecognizer::CMmfRecognizer()
+ {
+ }
+
+CMmfRecognizer::~CMmfRecognizer()
+ {
+ delete iMmfRecognizerUtil;
+ delete iMimeTypes;
+ }
+
+void CMmfRecognizer::ConstructL()
+ {
+ iMimeTypes = new (ELeave) CDesC8ArrayFlat(KMimeArrayGranularity);
+ BuildListL();
+ iMmfRecognizerUtil = CMmfRecognizerUtil::NewL();
+ }
+
+CMmfRecognizer* CMmfRecognizer::NewL()
+ {
+ CMmfRecognizer* self = new (ELeave) CMmfRecognizer();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+/**
+ * @internalAll
+ *
+ * Return the number of MIME types supported
+ */
+TInt CMmfRecognizer::NumMimeTypes() const
+ {
+ return(iMimeTypes->Count());
+ }
+
+
+/**
+ * @internalAll
+ *
+ * Call into the MMF Controller Framework DLL to get
+ * a list of supported MIME types
+ */
+void CMmfRecognizer::BuildListL()
+ {
+ iMimeTypes->Reset();
+ CMmfRecognizerUtil::GetMimeTypesL(iMimeTypes);
+ }
+
+
+/**
+ * @internalAll
+ *
+ * Get one of the data (MIME) types that MMF can recognize.
+ */
+const TPtrC8 CMmfRecognizer::SupportedDataTypeL(TInt aIndex) const
+ {
+ if ((aIndex < 0) || (aIndex >= iMimeTypes->Count()))
+ User::Leave(KErrArgument);
+
+ return(iMimeTypes->MdcaPoint(aIndex));
+ }
+
+
+/**
+ * @internalAll
+ *
+ * Get a reference to the last MIME type string successfully matched
+ */
+const TDesC8& CMmfRecognizer::MimeString() const
+ {
+ return iMimeString;
+ }
+
+/**
+ * @internalAll
+ *
+ * Attempt to recognize the data
+ */
+CMmfRecognizer::TMatchMethod CMmfRecognizer::MatchL(const TDesC& aFileName, const TDesC8& aBuffer)
+ {
+ CMmfRecognizerUtil::TMatchLevel matchLevel = CMmfRecognizerUtil::EMatchNone;
+ matchLevel = iMmfRecognizerUtil->GetMimeTypeL(aFileName, aBuffer, iMimeString);
+
+ TMatchMethod bestMatchMethod = ENotMatched;
+ if(matchLevel==CMmfRecognizerUtil::EMatchData)
+ bestMatchMethod = EBySignature;
+ else if(matchLevel==CMmfRecognizerUtil::EMatchName)
+ bestMatchMethod = EByName;
+
+ return bestMatchMethod;
+ }
+
+
+#include <ecom/ecom.h>
+#include <ecom/implementationproxy.h>
+
+const TImplementationProxy ImplementationTable[] =
+ {
+ IMPLEMENTATION_PROXY_ENTRY(0x101F7C41, CApaMmfRecognizer::NewL)
+ };
+
+
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+ {
+ aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+ return ImplementationTable;
+ }
+
+