browserplugins/browseraudiovideoplugin/src/BavpApi.cpp
branchRCL_3
changeset 65 8e6fa1719340
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserplugins/browseraudiovideoplugin/src/BavpApi.cpp	Wed Sep 01 12:31:04 2010 +0100
@@ -0,0 +1,482 @@
+/*
+* 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:  API functions that were loaded into TLS for the Browser to use.
+*
+*/
+
+// INCLUDE FILES
+#include <Uri16.h>
+#include <mmf/common/MmfControllerFrameworkBase.h>
+#include <stdlib.h>
+
+#include "BavpLogger.h"
+#include "BavpPlugin.h"
+#include "BavpVolumeHandler.h"
+
+#include <npscript.h>
+#include "BavpNPObject.h"
+// CONSTANTS
+_LIT(KAccessPtId, "accesspointid");
+_LIT(KLoop,"loop");
+_LIT(KSrc,"src");
+_LIT(KData,"data");
+_LIT(KRtsp,"rtsp");
+_LIT(KInfinite,"infinite");
+_LIT(KVolume, "volume");
+_LIT(KHigh, "high");
+_LIT(KMiddle, "middle");
+_LIT(KLow, "low");
+
+const TInt KOneLoopValue = 1;
+const TInt KMaxLoopValue = 50; 
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// BavpNewp
+// Create a new instance of a plugin. This is non-leaving method.
+// Returns: NPError: Error codes recognized by Browser
+// -----------------------------------------------------------------------------
+NPError BavpNewp( NPMIMEType /* pluginType*/,   // Not used locally
+                  NPP aInstance,                // Stores pointer to Bavp 
+                  uint16 /* mode */,            // 
+                  CDesCArray* argn,             // The number of arguments passed
+                  CDesCArray* argv,             // The values of arguments in the array
+                  NPSavedData* /*saved*/ )      // 
+    {
+        
+    // Fix for TSW error ID:  SLON-74588K, as ControlPanel is unsupported so for the time being
+    // controlPanel plugin window shown as emplty non supported window.
+
+    _LIT(KControls, "controls");     
+    _LIT(KControlPanel, "controlpanel");
+   
+    for ( TInt i=0; i < argn->Count(); i++ )
+    {
+    if(((*argn)[i].Compare( KControls) == 0)&&((*argv)[i].Compare(KControlPanel ) == 0))
+        {
+            return NPERR_INVALID_PLUGIN_ERROR;
+        }
+    }
+    // Create BrowserAudioVideoPlugin, call this leaving method to wrap leaving methods
+    TRAPD( err, BavpConstructL( aInstance, argn, argv ) );
+    if ( err == KErrNoMemory )
+        {       
+        Log( EFalse, _L("FUNCTION BavpNewp ERROR! Out of Memory Error") );
+
+        return NPERR_OUT_OF_MEMORY_ERROR;
+        }
+        
+    if ( err != KErrNone )
+        {
+        Log( EFalse, _L("FUNCTION BavpNewp ERROR! Module Load Failure") );
+        return NPERR_MODULE_LOAD_FAILED_ERROR;
+        }
+        
+    return NPERR_NO_ERROR;
+    }
+
+// -----------------------------------------------------------------------------
+// BavpConstructL
+// This is the leaving method to create the plugin.  We have leaving setters
+// that need to be wrapped.
+// Returns: void
+// -----------------------------------------------------------------------------
+void BavpConstructL( NPP aInstance,     // Stores pointer to Bavp 
+                     CDesCArray* argn,  // The number of arguments passed
+                     CDesCArray* argv ) // The values of arguments in the array
+    {
+    Log( EFalse, _L("Calling FUNCTION BavpConstructL") );
+    
+    CBavpPlugin *pluginInstance( NULL );
+
+    // Create BrowserVideoPlugin        
+    pluginInstance = CBavpPlugin::NewL();   
+
+    // Bavp functions can now be called
+    aInstance->pdata = pluginInstance;
+    
+    // Retrieve the various attributes from the HTTP file and the
+    // object/embed/bgsound/soundstart tags on that page
+    //
+    // Retrieve the access point attribute
+    TInt accessPtIndex;
+    TInt accessPtId( KUseDefaultIap );
+    if  ( !argn->Find( KAccessPtId, accessPtIndex, ECmpFolded ) )
+        {
+        // If the string is found get the access pt id and convert to TInt
+        TPtrC16 accessPtValue( (*argv)[accessPtIndex] );
+        TLex lex( accessPtValue );
+        TInt intVal( 0 );
+        if ( lex.Val( intVal ) == KErrNone)
+          {
+          accessPtId = intVal;
+          }
+        }
+    pluginInstance->SetAccessPtId( accessPtId );
+    
+    // Retrieve the "loop" attribute value, default value is "1",
+    // with infiniteFlag off. This handles the loop attribute missing
+    // and loop="0" cases.
+    TInt loopIndex( 0 );
+    TPtrC16 loopValue;
+    TBool infiniteFlag( EFalse );   // Always false, use loop="50" instead "infinite" 
+    TInt loop( KOneLoopValue );     // Our default loop value is "1"
+    
+    TInt positionLoop = argn->Find( KLoop, loopIndex, ECmpFolded );
+    if ( positionLoop == 0 )
+        {
+        // Found a loop attribute value
+        TPtrC16 pointerLoopCount( (*argv)[loopIndex] );
+        loopValue.Set( pointerLoopCount );
+
+        // Is the loop value equal to string "infinite"
+        if  ( loopValue.Compare( KInfinite ) == 0 )
+            {
+            // We never play true infinite, we loop max 50 times
+            loop = KMaxLoopValue;
+            }
+        else
+            {
+            // Ensure that only a valid loop value is used (1 to 50)
+            HBufC8* convertPointerLoopCount = HBufC8::New( pointerLoopCount.Length() );
+            TPtr8 convertToByteLoop = convertPointerLoopCount->Des();
+            convertToByteLoop.Copy( pointerLoopCount );
+                
+            loop = atoi( (char*)(convertToByteLoop.Ptr()) );
+            if ( loop < KOneLoopValue )
+                {
+                loop = KOneLoopValue;
+                }
+            else if ( loop > KMaxLoopValue )
+                {
+                loop = KMaxLoopValue;
+                }
+            }
+        }
+
+    // Retrieve the "volume" attribute value, default is max, so that if the
+    // "volume" attribute isn't present, the user preferences will not get
+    // overwritten.  There is a check in controller->SetVolumeByAttribute that
+    // checks current and attribute volume and choses lower volume.
+    TInt positionVolumeValue( 0 ); 
+    TInt CRVolume( KCRVolumeMax );
+    TPtrC16 volumeValue;
+    TInt positionVol = argn->Find( KVolume, positionVolumeValue, ECmpFolded );
+    if ( positionVol == 0 )
+    {
+        TPtrC16 pointerVolumeValue( (*argv)[positionVolumeValue] );
+        volumeValue.Set( pointerVolumeValue );
+        if (  !(volumeValue.Compare( KHigh )) )
+            {
+            CRVolume = KCRVolume10;
+            }
+        else if ( !(volumeValue.Compare( KMiddle )) )
+            {
+            CRVolume = KCRVolume5;
+            }
+        else if ( !(volumeValue.Compare( KLow )) )
+            {
+            CRVolume = KCRVolume2;
+            }
+        else
+            {
+            // Convert volume numeric string (i.e. volume="6") to CR volume
+            HBufC8* convertPointerVolumeValue = HBufC8::New( pointerVolumeValue.Length() );
+            TPtr8 convertToByteVolume = convertPointerVolumeValue->Des();
+            convertToByteVolume.Append( pointerVolumeValue );
+            CRVolume = atoi( (char*)(convertToByteVolume.Ptr()) );
+            if ( CRVolume < KCRVolumeMute )
+                {
+                CRVolume = KCRVolumeMute;
+                }
+            else if ( CRVolume > KCRVolumeMax )
+                {
+                CRVolume = KCRVolumeMax;
+                }
+            }    
+    }
+    
+    // Set the Volume and Loop for plugin
+    pluginInstance->SetVolumeAndLoop( CRVolume, loop, infiniteFlag );
+
+    // Retrieve the "src" or "data" attribute value, if it is rtsp scheme lets
+    // save it, so we can start a controller, since rtsp content is not passed
+    // by WebKit.  It is our (Bavp) responsibilty to load rtsp content.
+    TInt srcIndex( 0 ); 
+    TInt ret = argn->Find( KSrc, srcIndex, ECmpFolded );
+    if  ( ret != 0 )
+        {
+        // If the src attribute NOT found, try to find data attribute
+        ret = argn->Find( KData, srcIndex, ECmpFolded );
+        }
+
+    if ( ret == 0 )
+        {
+        // We found either data or src attribute
+        TPtrC16 srcValue( (*argv)[ srcIndex ] );
+        TUriParser uriParser;
+        uriParser.Parse( srcValue );
+        if ( !uriParser.Extract( EUriScheme ).Compare( KRtsp ) )
+            {
+            // We found a RTSP scheme. Lets save it up, so when the BavpView
+            // is create we can start the BavpController and load rtsp. This
+            // is because rtsp will not be started by a call to BavpAsFile().
+            // NOTE: Files (http) are downloaded first and then BavpAsFile()
+            // is called, which starts the BavpController.
+            pluginInstance->SetRtspUriL( uriParser.UriDes() );
+            
+            // We may have to move this to a different place if eg: the url of
+            // the object is changed later (say from javascript)
+            CBavpPluginEcomMain* lBavpPluginEcomMain = (CBavpPluginEcomMain*) Dll::Tls();
+            NPNetscapeFuncs* funcPtr = lBavpPluginEcomMain->Funcs();
+            if ( funcPtr && funcPtr->getvalue ) 
+               {
+               funcPtr->getvalue( aInstance, NPNNetworkAccess, (void *)&accessPtId);
+               pluginInstance->SetAccessPtId( accessPtId );
+               }
+            
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// BavpDestroy(NPP aInstance, NPSavedData**)
+// Called by Browser to destroy the plugin
+// Returns: NPError: Error Code
+// -----------------------------------------------------------------------------
+NPError BavpDestroy( NPP    aInstance,          // Link to Browser
+                     NPSavedData** /*save*/ )   // Not used locally
+    {
+    Log( EFalse, _L("Calling FUNCTION BavpDestroy") );
+
+    CBavpPlugin *pluginInstance = STATIC_CAST( CBavpPlugin*, aInstance->pdata );
+    delete pluginInstance;
+
+    return NPERR_NO_ERROR;
+    }
+
+// -----------------------------------------------------------------------------
+// BavpSetwindow
+// This is the parent window of plugin
+// Returns: NPError: Error Code
+// -----------------------------------------------------------------------------
+NPError BavpSetwindow( NPP aInstance,       // Link to Browser
+                       NPWindow* aWindow )  // Browser's window passed to Bavp
+    {
+    Log( EFalse, _L("Calling FUNCTION BavpSetwindow") );
+
+    CBavpPlugin *pluginInstance = STATIC_CAST( CBavpPlugin*, aInstance->pdata );
+    MPluginAdapter *pluginAdapter = STATIC_CAST( MPluginAdapter*, aWindow->window);
+    
+    TRAPD( err, pluginInstance->SetWindowL(pluginAdapter, aWindow, aInstance) );
+    if ( err == KErrNoMemory )
+        {
+        Log( EFalse, _L("FUNCTION BavpSetWindow ERROR! Out of Memory Error") );
+
+        // Set the error to plugin if err occurs, it's for the next create plugin check
+        pluginInstance->iError = ETrue;
+        return NPERR_OUT_OF_MEMORY_ERROR;
+        }
+        
+    if ( err != KErrNone )
+        {
+        Log( EFalse, _L("FUNCTION BavpSetWindow ERROR: %d"), err );
+
+        // Set the error to plugin if err occurs, it's for the next create plugin check
+        pluginInstance->iError = ETrue;
+        return NPERR_GENERIC_ERROR;
+        }
+        
+    return NPERR_NO_ERROR;
+    }
+
+// -----------------------------------------------------------------------------
+// BavpNewstream
+// Indicates start of downloading of an video file from the internet
+// Returns: NPError: Error Code
+// -----------------------------------------------------------------------------
+NPError BavpNewstream( NPP instance,         
+                       NPMIMEType type,      
+                       NPStream* /*stream*/,    // 
+                       NPBool /*seekable*/,     // 
+                       uint16* stype )          // Will set to NP_ASFILEONLY to notify Browser how to send data 
+    {
+    Log( EFalse, _L("Calling FUNCTION BavpNewstream") );
+
+    // Bavp needs to set stype to alert Browser to send data via Bavp_asfile
+    *stype = NP_ASFILEONLY; 
+    
+    CBavpPlugin *pluginInstance = STATIC_CAST( CBavpPlugin*, instance->pdata );
+    
+    pluginInstance->SetMimeType( type );
+    
+    return NPERR_NO_ERROR;
+    }
+
+// -----------------------------------------------------------------------------
+// BavpDestroystream    NOT USED
+// Indicates completion of downloading an video file from the internet
+// Returns: NPError: Error Code
+// -----------------------------------------------------------------------------
+NPError BavpDestroystream( NPP  /*instance*/,       // Not used locally
+                           NPStream* /*stream*/,    //
+                           NPReason /*aReason*/ )   //
+    {
+    Log( EFalse, _L("Calling FUNCTION BavpDestroyStream") );
+
+    return NPERR_NO_ERROR; 
+    }
+
+// -----------------------------------------------------------------------------
+// BavpAsfile
+// Called by Browser when data is copied to a file.
+// Returns: void
+// -----------------------------------------------------------------------------
+void BavpAsfile( NPP aInstance,             // Link to Browser
+                 NPStream* stream,      
+                 const TDesC& aFileName )   // file name and path
+    {
+    Log( EFalse, _L("Calling FUNCTION BavpAsfile") );
+    Log( EFalse, _L("Filename:") );
+    Log( EFalse, aFileName );
+
+    CBavpPlugin *pluginInstance = STATIC_CAST( CBavpPlugin*, aInstance->pdata );
+    
+    // Get the error, and set this error to iError in plugin
+    TRAPD( err, pluginInstance->OpenAndPlayFileL( aFileName, stream->url ) );
+    if ( err != KErrNone )
+        {
+        Log( EFalse, _L("FUNCTION BavpAsfile ERROR!") );
+
+        // If error, set for plugin, it's for the next create plugin check
+        pluginInstance->iError = ETrue;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// BavpWriteready       NOT SUPPORTED
+// -----------------------------------------------------------------------------
+int32 BavpWriteready( NPP /*instance*/,     
+                      NPStream* /*stream*/ )    
+    {
+    // Not implemented
+    return NPERR_NO_ERROR;
+    }
+
+// -----------------------------------------------------------------------------
+// BavpWrite     NOT SUPPORTED
+// -----------------------------------------------------------------------------
+int32 BavpWrite( NPP /*instance*/,  
+                 NPStream* /*stream*/,   
+                 int32 /*offset*/,      
+                 int32 /*len*/,     
+                 void* /*buffer*/ )
+        {
+        // Not implemented
+        return NPERR_NO_ERROR; 
+        }
+
+// -----------------------------------------------------------------------------
+// BavpPrint        NOT SUPPORTED
+// -----------------------------------------------------------------------------
+void BavpPrint( NPP /*instance*/,           
+                NPPrint* /*platformPrint*/ )    
+    {
+    // Not implemented
+    }
+
+// -----------------------------------------------------------------------------
+// BavpEvent        NOT SUPPORTED
+// -----------------------------------------------------------------------------
+int16 BavpEvent( NPP instance,
+                 void* event )      
+    {
+    TInt ret = EFalse;
+    if (instance)
+        {
+        CBavpPlugin *plugin = static_cast<CBavpPlugin*>(instance->pdata);
+        NPEvent *ev = static_cast<NPEvent*>(event);
+    
+        if (plugin)
+            {
+            if (ev->event == ENppEventPointer)
+                {
+                NPEventPointer *evp =static_cast<NPEventPointer*> (ev->param);
+                ret = plugin->HandleGesture(evp->reserved);
+                }
+            }
+        }
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// BavpUrlnotify        NOT SUPPORTED
+// -----------------------------------------------------------------------------
+void BavpUrlnotify( NPP /*instance*/,       
+                    const TDesC8& /*url*/,  
+                    NPReason /*reason*/,    
+                    void* /*notifyData*/ )
+    {
+    // Not implemented
+    }
+
+// -----------------------------------------------------------------------------
+// BavpSetvalue     NOT SUPPORTED
+// -----------------------------------------------------------------------------
+NPError BavpSetvalue( NPP /*instance*/,     
+                      NPNVariable /*variable*/,
+                      void* /*ret_value*/ )
+    {
+    // Not implemented
+    return NPERR_NO_ERROR;
+    }
+
+// -----------------------------------------------------------------------------
+// BavpGetvalue     NOT SUPPORTED
+// -----------------------------------------------------------------------------
+NPError BavpGetvalue( NPP aInstance,        
+                      NPPVariable aVariable,  
+                      void* ret_value ) 
+    {
+    NPError err( NPERR_NO_ERROR );
+
+        switch( aVariable )
+        {
+        case NPPVpluginInteractiveBool:
+            // Interactive=0, Not Interactive=1
+             *(TBool *)ret_value = EFalse;
+             break;
+        case NPPVpluginScriptableNPObject:
+            {        
+            // return instance of scripting object to the browser
+            BavpNPObject *pluginNPObject = BavpNPObject_new( aInstance );        
+        
+            CBavpPlugin *bavpplugin = (CBavpPlugin*)aInstance->pdata;
+            bavpplugin->SetNPObject(pluginNPObject);
+            
+            pluginNPObject->plugin = bavpplugin; 
+            pluginNPObject->nppInstance = aInstance;
+            void** ret = (void**)ret_value;
+            *ret = (void*)pluginNPObject;        
+            }
+            break;
+        default:
+            break;
+        }   //end switch
+
+    return err;
+    }
+
+//  End of File