webengine/browserrecognizers/src/BrowserRec.cpp
changeset 0 dd21522fd290
child 37 cb62a4f66ebe
--- /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 <wml>
+    if ( root == 0x7F )
+        return ETrue;
+
+    return EFalse;
+    }
+
+//
+// From RFC 3236 "5. Recognizing XHTML files"
+//
+TBool CBrowserRecognizer::CheckForHtml( const TDesC8& aBuffer )
+    {
+    _LIT8( html, "<html" );
+    _LIT8( script, "<script" );
+    if ( aBuffer.FindF( html ) != KErrNotFound )
+        return ETrue;
+    if ( aBuffer.FindF( script ) != KErrNotFound )
+        return ETrue;
+    return EFalse;
+    }
+
+//
+// From RFC 3236 "5. Recognizing XHTML files"
+//
+TBool CBrowserRecognizer::CheckForXhtml( const TDesC8& aBuffer )
+    {
+    _LIT8( dtd, "//DTD XHTML" );
+    if ( aBuffer.FindF( dtd ) != KErrNotFound )
+        return ETrue;
+    return EFalse;
+    }
+
+TBool CBrowserRecognizer::CheckForWML( const TDesC8& aBuffer )
+    {
+    _LIT8( dtd, "-//WAPFORUM//DTD WML" );
+    if ( aBuffer.FindF( dtd ) != KErrNotFound )
+        return ETrue;
+    return EFalse;
+    }
+
+TBool CBrowserRecognizer::CheckForOPML( const TDesC8& aBuffer )
+    {
+    _LIT8( dtd, "<opml" );
+    if( aBuffer.FindF( dtd ) != KErrNotFound )
+        return ETrue;
+    return EFalse;
+    }
+
+
+CApaDataRecognizerType* CBrowserRecognizer::CreateRecognizerL()
+    {
+    return new (ELeave) CBrowserRecognizer();
+    }
+
+const TImplementationProxy ImplementationTable[] =
+    {
+//        { { KBrowserRecognizerImplUIDValue}, CBrowserRecognizer::CreateRecognizerL}
+
+        IMPLEMENTATION_PROXY_ENTRY(KBrowserRecognizerImplUIDValue, CBrowserRecognizer::CreateRecognizerL)
+    };
+
+
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+    {
+    aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+    return ImplementationTable;
+    }