diff -r 000000000000 -r dd21522fd290 webengine/browserrecognizers/src/BrowserRec.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/browserrecognizers/src/BrowserRec.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,319 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Recognizer for the bowser supported MIME types +* +*/ + +#include "BrowserRec.h" + +#include "ImplementationProxy.h" + +// +// CBrowserRecognizer +// +CBrowserRecognizer::CBrowserRecognizer() +:CApaDataRecognizerType( KUidMimeBrowserRecognizer, CApaDataRecognizerType::EHigh ) + { + iCountDataTypes = KSupportedMimetypes; + } + +TUint CBrowserRecognizer::PreferredBufSize() + { + return 0x80; + } + +TDataType CBrowserRecognizer::SupportedDataTypeL( TInt aIndex ) const + { + __ASSERT_DEBUG( aIndex>=0 && aIndex < KSupportedMimetypes, User::Invariant() ); + switch ( aIndex ) + { + case 0: + return TDataType( KHTMLMimeType ); + case 1: + return TDataType( KXHTMLMimeType1 ); + case 2: + return TDataType( KXHTMLMimeType2 ); + case 3: + return TDataType( KXHTMLMimeType2 ); + case 4: + return TDataType( KCssMimeType ); + case 5: + return TDataType( KJavaSCMimeType); + case 6: + return TDataType( KJavaSCMimeType); + case 7: + return TDataType( KJavaEcmaMimeType); + case 8: + return TDataType( KOPMLMimeType); +#ifndef BRDO_WML_DISABLED_FF + case 9: + return TDataType( KWMLCMimeType ); + case 10: + return TDataType( KWMLMimeType ); + case 11: + return TDataType( KWBXMLMimeType ); + case 12: + return TDataType( KWMLSCMimeType ); +#endif + default: + return TDataType( KHTMLMimeType ); + } + } + +void CBrowserRecognizer::DoRecognizeL( const TDesC& aName, const TDesC8& aBuffer ) + { + iConfidence = ENotRecognized; + if ( aBuffer.Length() < 3 ) + return; + + // First try the name extension + if ( aName.Length() >= 3 ) + { + TInt dotPos = aName.LocateReverse( '.' ); + if ( dotPos != KErrNotFound ) + { + TInt extLength = aName.Length() - dotPos; + HBufC* ext = aName.Right( extLength ).AllocL(); + CleanupStack::PushL( ext ); + +#ifndef BRDO_WML_DISABLED_FF + // application/vnd.wap.wmlc or application/vnd.wap.wbxml + if ( ext->CompareF( KDotWMLC ) == 0 || + ext->CompareF( KDotWBXML ) == 0 ) + { + iDataType = TDataType( KWMLCMimeType ); + if ( CheckWbxmlVersion( aBuffer[0] ) && + CheckWbxmlPubId( aBuffer[1] ) ) + { + iConfidence = ECertain; + } + else + { + iConfidence = EPossible; + } + } + // application/vnd.wap.wmlscriptc + else if ( ext->CompareF(KDotWMLSC) == 0 ) + { + iDataType = TDataType( KWMLSCMimeType ); + iConfidence = ECertain; + } + else if ( ext->CompareF(KDotJavaScript) == 0 ) + { + iDataType = TDataType( KJavaSCMimeType ); + iConfidence = ECertain; + } +#else + if ( ext->CompareF(KDotJavaScript) == 0 ) + { + iDataType = TDataType( KJavaSCMimeType ); + iConfidence = ECertain; + } +#endif // BRDO_WML_DISABLED_FF + else if ( ext->CompareF(KDotCss) == 0 ) + { + iDataType = TDataType( KCssMimeType ); + iConfidence = ECertain; + } + + // text/html + else if ( ext->CompareF(KDotHTML) == 0 || + ext->CompareF(KDotHTM) == 0 ) + { + iDataType = TDataType( KHTMLMimeType ); + iConfidence = ECertain; + } + // application/vnd.wap.html+xml and application/xhtml+xml + else if ( ext->CompareF(KDotXHTML) == 0 || + ext->CompareF(KDotXHTML2) == 0 ) + { + iDataType = TDataType( KHTMLMimeType ); + iConfidence = ECertain; + } + // OPML file + else if ( ext->CompareF(KDotOPML) == 0 ) + { + iDataType = TDataType( KOPMLMimeType ); + iConfidence = ECertain; + } + CleanupStack::PopAndDestroy(); // ext + } + } + + // No recognized file name extensions, we have to look into the buffer + if ( iConfidence == ENotRecognized ) + { +#ifndef BRDO_WML_DISABLED_FF + if ( CheckForWMLC( aBuffer ) ) + { + iDataType = TDataType( KWMLCMimeType ); + iConfidence = ECertain; + } + else if ( CheckForOPML( aBuffer ) ) + { + iDataType = TDataType( KOPMLMimeType ); + iConfidence = ECertain; + } + else if ( CheckForWML( aBuffer ) ) + { + iDataType = TDataType( KWMLMimeType ); + iConfidence = ECertain; + } +#else + if ( CheckForOPML( aBuffer ) ) + { + iDataType = TDataType( KOPMLMimeType ); + iConfidence = ECertain; + } +#endif // BRDO_WML_DISABLED_FF + else if ( CheckForHtml( aBuffer ) ) + { + if ( CheckForXhtml( aBuffer ) ) + { + iDataType = TDataType( KXHTMLMimeType2 ); + } + else + { + iDataType = TDataType( KHTMLMimeType ); + } + iConfidence = ECertain; + } + } + } + + +// We support only wml version 1.1, 1.2 and 1.3 +TBool CBrowserRecognizer::CheckWbxmlVersion( TUint8 byte ) + { + switch( byte ) + { + case 0x01: // wml version 1.1 + case 0x02: // wml version 1.2 + case 0x03: // wml version 1.3 + return ETrue; + default: + return EFalse; + } + } + +// We support only wml version 1.1, 1.2 and 1.3 +TBool CBrowserRecognizer::CheckWbxmlPubId( TUint8 byte ) + { + switch( byte ) + { + case 0x00: // String table follows. + case 0x04: // "-//WAPFORUM//DTD WML 1.1//EN (WML 1.1) + case 0x09: // "-//WAPFORUM//DTD WML 1.2//EN (WML 1.2) + case 0x0A: // "-//WAPFORUM//DTD WML 1.2//EN (WML 1.3) + return ETrue; + default: + return EFalse; + } + } + +// +// Check that the content has certain bytes is correct order +// according to the wmlc spec. +// +TBool CBrowserRecognizer::CheckForWMLC( const TDesC8& aBuffer ) + { + TInt IndexOfxmlVer = 0; + TInt IndexOfpubId = 1; + TInt IndexOfstrTblLen = 3; + TInt IndexOfstrTblStart = 4; + TInt root = -1; + + if ( aBuffer.Length() <= IndexOfstrTblStart ) + return EFalse; + + if ( !CheckWbxmlVersion( aBuffer[IndexOfxmlVer] ) || + !CheckWbxmlPubId( aBuffer[IndexOfpubId] ) ) + return EFalse; + + // Skip chararcter set + + // if the string table length is less than zero or more that the + // length of the buffer we cannot find a root element. + if ( aBuffer[IndexOfstrTblLen] > aBuffer.Length() - IndexOfstrTblLen ) + return EFalse; + + root = aBuffer[IndexOfstrTblStart + aBuffer[IndexOfstrTblLen]]; + + // Check if the root element is + if ( root == 0x7F ) + return ETrue; + + return EFalse; + } + +// +// From RFC 3236 "5. Recognizing XHTML files" +// +TBool CBrowserRecognizer::CheckForHtml( const TDesC8& aBuffer ) + { + _LIT8( html, "