browserplugins/browsersysteminfoplugin/src/SystemInfoPlugin.cpp
branchRCL_3
changeset 65 8e6fa1719340
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserplugins/browsersysteminfoplugin/src/SystemInfoPlugin.cpp	Wed Sep 01 12:31:04 2010 +0100
@@ -0,0 +1,624 @@
+/*
+* Copyright (c) 2007 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:  Interface to Browser for handling embedded system info requests.
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32std.h>
+#include <npupp.h>
+#include <string.h>
+#include <utf.h>
+#include <MProfileEngine.h>
+#include <MProfile.h>
+#include "SystemInfoPlugin.h"
+#include "NetworkObserver.h"
+#include "PowerObserver.h"
+#include "SystemInfoMisc.h"
+
+// CONSTANTS
+
+enum TIdentifiersNames
+    {
+    EIdChargeLevel,
+    EIdOnChargeLevel,
+    EIdChargerConnected,
+    EIdOnChargerConnected,
+    EIdSignalBars,
+    EIdNetworkName,
+    EIdNetworkRegistrationStatus,
+    EIdOnNetworkRegistrationStatus,
+    EIdLightMinIntensity,
+    EIdLightMaxIntensity,
+    EIdLightDefaultIntensity,
+    EIdLightInfiniteDuration,
+    EIdLightMaxDuration,
+    EIdLightDefaultCycleTime,
+    EIdLightTargetPrimaryDisplayAndKeyboard,
+    EIdLightTargetSystem,
+    EIdLightOn,
+    EIdLightBlink,
+    EIdLightOff,
+    EIdVibraMinIntensity,
+    EIdVibraMaxIntensity,
+    EIdVibraMaxDuration,
+    EIdVibraSettings,
+    EIdStartVibra,
+    EIdStopVibra,
+    EIdBeep,
+    EIdTotalRam,
+    EIdFreeRam,
+    EIdDriveList,
+    EIdDriveSize,
+    EIdDriveFree,
+    EIdLanguage,
+    EIdLast
+    };
+
+const NPUTF8 *systemInfoPluginIdentifierNames[EIdLast] =
+    {
+    "chargelevel",
+    "onchargelevel",
+    "chargerconnected",
+    "onchargerconnected",
+    "signalbars",
+    "networkname",
+    "networkregistrationstatus",
+    "onnetworkregistrationstatus",
+    "lightminintensity",
+    "lightmaxintensity",
+    "lightdefaultintensity",
+    "lightinfiniteduration",
+    "lightmaxduration",
+    "lightdefaultcycletime",
+    "lighttargetprimarydisplayandkeyboard",
+    "lighttargetsystem",
+    "lighton",
+    "lightblink",
+    "lightoff",
+    "vibraminintensity",
+    "vibramaxintensity",
+    "vibramaxduration",
+    "vibrasettings",
+    "startvibra",
+    "stopvibra",
+    "beep",
+    "totalram",
+    "freeram",
+    "drivelist",
+    "drivesize",
+    "drivefree",
+    "language"
+    };
+
+const TBool IsMethod[EIdLast] =
+    {
+    EFalse, // "chargelevel"
+    EFalse, // "onchargelevel"
+    EFalse, // "chargerconnected"
+    EFalse, // "onchargerconnected"
+    EFalse, // "signalbars"
+    EFalse, // "networkname"
+    EFalse, // "networkregistrationstatus"
+    EFalse, // "onnetworkregistrationstatus"
+    EFalse, // "lightminintensity"
+    EFalse, // "lightmaxintensity"
+    EFalse, // "lightdefaultintensity"
+    EFalse, // "lightinfiniteduration"
+    EFalse, // "lightmaxduration"
+    EFalse, // "lightdefaultcycletime"
+    EFalse, // "lighttargetprimarydisplayandkeyboard"
+    EFalse, // "lighttargetsystem"
+    ETrue, // "lighton"
+    ETrue, // "lightblink"
+    ETrue, // "lightoff"
+    EFalse, // "vibraminintensity"
+    EFalse, // "vibramaxintensity"
+    EFalse, // "vibramaxduration"
+    EFalse, // "vibrasettings"
+    ETrue, // "startvibra"
+    ETrue, // "stopvibra"
+    ETrue, // "beep"
+    EFalse, // "totalram"
+    EFalse, // "freeram"
+    EFalse, // "drivelist"
+    ETrue, // "drivesize"
+    ETrue, // "drivefree"
+    EFalse  // "language"
+    };
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ----------------------------------------------------------------------------
+// CSystemInfoPlugin::CSystemInfoPlugin
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ----------------------------------------------------------------------------
+CSystemInfoPlugin::CSystemInfoPlugin()
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CSystemInfoPlugin::ConstructL
+// Symbian 2nd phase constructor can leave.
+// ----------------------------------------------------------------------------
+void CSystemInfoPlugin::ConstructL()
+    {
+    iSystemInfoPluginIdentifiers = new (ELeave) NPIdentifier[EIdLast];
+    NPN_GetStringIdentifiers( systemInfoPluginIdentifierNames, EIdLast,
+                              iSystemInfoPluginIdentifiers );
+    iUid = RProcess().SecureId();
+
+    // need profile to determine silent mode for beep control
+    iProfileEngine = CreateProfileEngineL();
+
+    // sysinfo feature class instances
+    iPowerObserver = CPowerObserver::NewL( this );
+    iNetworkObserver = CNetworkObserver::NewL( this );
+    iSystemInfoMisc = CSystemInfoMisc::NewL();
+    }
+
+// ----------------------------------------------------------------------------
+// CSystemInfoPlugin::NewL
+// Two-phased constructor.
+// ----------------------------------------------------------------------------
+CSystemInfoPlugin* CSystemInfoPlugin::NewL()
+
+    {
+    CSystemInfoPlugin* self = new (ELeave) CSystemInfoPlugin;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CSystemInfoPlugin::Destructor
+// ----------------------------------------------------------------------------
+CSystemInfoPlugin::~CSystemInfoPlugin()
+    {
+    delete [] iSystemInfoPluginIdentifiers;
+
+    if (iProfileEngine != NULL)
+        {
+        iProfileEngine->Release();
+        }
+    // sysinfo feature class instances
+    delete iPowerObserver;
+    delete iNetworkObserver;
+    delete iSystemInfoMisc;
+    }
+
+// ----------------------------------------------------------------------------
+// CSystemInfoPlugin::Deallocate
+//
+// ----------------------------------------------------------------------------
+void CSystemInfoPlugin::Deallocate()
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CSystemInfoPlugin::InvokeCallback
+//
+// ----------------------------------------------------------------------------
+bool CSystemInfoPlugin::InvokeCallback( TDesC8& name, const NPVariant *args, uint32_t argCount )
+    {
+    CSystemInfoPluginEcomMain* lSystemInfoPPluginEcomMain
+        = (CSystemInfoPluginEcomMain*) Dll::Tls();
+    NPNetscapeFuncs* lNetscapeFuncs = lSystemInfoPPluginEcomMain->Funcs();
+    if ( lNetscapeFuncs && iInstanceHandle )
+        {
+        void* value = 0;
+        NPError npErr = lNetscapeFuncs->getvalue( iInstanceHandle, NPNVWindowNPObject,
+                                                 (void*)&value );
+        if ( npErr == NPERR_NO_ERROR )
+            {
+            NPVariant resultVariant;
+            VOID_TO_NPVARIANT( resultVariant );
+            NPIdentifier ident = NPN_GetStringIdentifier( (const NPUTF8 *)(name.Ptr()) );
+            return NPN_Invoke( iInstanceHandle, (NPObject*)value, ident,
+                               args, argCount, &resultVariant );
+            }
+        }
+    return false;
+    }
+
+// ----------------------------------------------------------------------------
+// CSystemInfoPlugin::HasMethod
+//
+// ----------------------------------------------------------------------------
+bool CSystemInfoPlugin::HasMethod( NPIdentifier name )
+    {
+    for (TInt i= 0; i < EIdLast; i++)
+        {
+        if ( name == iSystemInfoPluginIdentifiers[i] )
+            {
+            return IsMethod[i];
+            }
+        }
+    return false;
+    }
+
+// ----------------------------------------------------------------------------
+// CSystemInfoPlugin::VariantToInt
+//
+// ----------------------------------------------------------------------------
+void CSystemInfoPlugin::VariantToInt( NPVariant& v, TInt& i )
+    {
+    if ( NPVARIANT_IS_INT32( v ) )
+        {
+        i = NPVARIANT_TO_INT32( v );
+        }
+    else if ( NPVARIANT_IS_DOUBLE( v ) )
+        {
+        double d = NPVARIANT_TO_DOUBLE( v );
+        i = d;
+        }
+    // leave unchanged if some other type tag on variant
+    }
+
+// ----------------------------------------------------------------------------
+// CSystemInfoPlugin::Invoke
+//
+// ----------------------------------------------------------------------------
+bool CSystemInfoPlugin::Invoke( NPIdentifier name,
+                                NPVariant* args,
+                                uint32_t argCount,
+                                NPVariant *result )
+    {
+    bool ret = false;
+    VOID_TO_NPVARIANT( *result );
+
+    if ( name == iSystemInfoPluginIdentifiers[EIdBeep] )
+        {
+        // don't beep if profile is silent
+        MProfile* profile = NULL;
+        TRAPD( error,
+               profile = iProfileEngine->ActiveProfileL() );
+        if ( KErrNone != error )
+            {
+            return true;
+            }
+        if ( EFalse == profile->IsSilent() )
+            {
+            TInt f = 440; // default 440 hertz
+            TInt d = 500; // default 0.5 seconds (in milliseconds)
+            if ( argCount > 0 ) VariantToInt( args[0], f );
+            if ( argCount > 1 ) VariantToInt( args[1], d );
+            // convert duration from milliseconds to microseconds, the
+            // underlying functionality doesn't really handle microseconds
+            // even though the interface specs it as microseconds
+            d = d * 1000;
+            // Note that d = 0 seems to mean "forever". Also, there
+            // are max and min frequencies but they are not defined.
+            // Below min there is silence, above max the equation
+            // seems to be f = min( max_freq, f)
+            iSystemInfoMisc->Beep( f, d );
+            }
+        profile->Release();
+        ret = true;
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdLightOn] )
+        {
+        TInt l = iSystemInfoMisc->LightTargetSystem();
+        TInt d = iSystemInfoMisc->LightInfiniteDuration();
+        TInt i = iSystemInfoMisc->LightDefaultIntensity();
+        TInt f = 1;
+        if ( argCount > 0 ) VariantToInt( args[0], l );
+        if ( argCount > 1 ) VariantToInt( args[1], d );
+        if ( argCount > 2 ) VariantToInt( args[2], i );
+        if ( argCount > 3 ) VariantToInt( args[3], f );
+        iSystemInfoMisc->LightOn( l, d, i, f );
+        ret = true;
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdLightBlink] )
+        {
+        TInt l = iSystemInfoMisc->LightTargetSystem();
+        TInt d = iSystemInfoMisc->LightInfiniteDuration();
+        TInt don = iSystemInfoMisc->LightDefaultCycleTime();
+        TInt doff = iSystemInfoMisc->LightDefaultCycleTime();
+        TInt i = iSystemInfoMisc->LightDefaultIntensity();
+        if ( argCount > 0 ) VariantToInt( args[0], l );
+        if ( argCount > 1 ) VariantToInt( args[1], d );
+        if ( argCount > 2 ) VariantToInt( args[2], don );
+        if ( argCount > 3 ) VariantToInt( args[3], doff );
+        if ( argCount > 4 ) VariantToInt( args[4], i );
+        iSystemInfoMisc->LightBlink( l, d, don, doff, i );
+        ret = true;
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdLightOff] )
+        {
+        TInt l = iSystemInfoMisc->LightTargetSystem();
+        TInt d = iSystemInfoMisc->LightInfiniteDuration();
+        TInt f = 1;
+        if ( argCount > 0 ) VariantToInt( args[0], l );
+        if ( argCount > 1 ) VariantToInt( args[1], d );
+        if ( argCount > 2 ) VariantToInt( args[2], f );
+        iSystemInfoMisc->LightOff( l, d, f );
+        ret = true;
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdStartVibra] )
+        {
+        TInt d = iSystemInfoMisc->VibraMaxDuration();
+        TInt i = iSystemInfoMisc->VibraMaxIntensity();
+        if ( argCount > 0 ) VariantToInt( args[0], d );
+        if ( argCount > 1 ) VariantToInt( args[1], i );
+        iSystemInfoMisc->StartVibra( d, i );
+        ret = true;
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdStopVibra] )
+        {
+        iSystemInfoMisc->StopVibra();
+        ret = true;
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdDriveSize] )
+        {
+        TUint c = 0;
+        if ( argCount > 0 && NPVARIANT_IS_STRING( args[0] ) )
+            {
+            NPString nps = NPVARIANT_TO_STRING( args[0] );
+            if ( nps.UTF8Characters ) c = nps.UTF8Characters[0];
+            }
+        if ( c > 0 )
+            {
+            TChar drive( c );
+            TReal size = iSystemInfoMisc->DriveSize( drive );
+            DOUBLE_TO_NPVARIANT( size, *result );
+            ret = true;
+            }
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdDriveFree] )
+        {
+        TUint c = 0;
+        if ( argCount > 0 && NPVARIANT_IS_STRING( args[0] ) )
+            {
+            NPString nps = NPVARIANT_TO_STRING( args[0] );
+            if ( nps.UTF8Characters ) c = nps.UTF8Characters[0];
+            }
+        if ( c > 0 )
+            {
+            TChar drive( c );
+            TReal free = iSystemInfoMisc->DriveFree( drive );
+            DOUBLE_TO_NPVARIANT( free, *result );
+            ret = true;
+            }
+        }
+
+    return ret;
+    }
+
+// ----------------------------------------------------------------------------
+// CSystemInfoPlugin::HasProperty
+//
+// ----------------------------------------------------------------------------
+bool CSystemInfoPlugin::HasProperty (NPIdentifier name)
+    {
+    for ( TInt i= 0; i < EIdLast; i++ )
+        {
+        if ( name == iSystemInfoPluginIdentifiers[i] )
+            {
+            return !IsMethod[i];
+            }
+        }
+    return false;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CSystemInfoPlugin::GetProperty
+//
+// ----------------------------------------------------------------------------
+bool CSystemInfoPlugin::GetProperty( NPIdentifier name, NPVariant *variant )
+    {
+    // default variant value maps to javascript undefined
+    VOID_TO_NPVARIANT( *variant );
+
+    if ( name == iSystemInfoPluginIdentifiers[EIdChargeLevel] )
+        {
+        INT32_TO_NPVARIANT( iPowerObserver->ChargeLevel(), *variant );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdChargerConnected] )
+        {
+        INT32_TO_NPVARIANT( iPowerObserver->ChargerConnected(), *variant );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdSignalBars] )
+        {
+        INT32_TO_NPVARIANT( iNetworkObserver->SignalBars(), *variant );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdNetworkRegistrationStatus] )
+        {
+        INT32_TO_NPVARIANT( iNetworkObserver->RegistrationStatus(), *variant );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdNetworkName] )
+        {
+        const TDesC& inBuf = iNetworkObserver->NetworkName();
+        HBufC8* outBuf = HBufC8::New( inBuf.Length() + 1 );
+        if ( outBuf )
+            {
+            TPtr8 ptr( outBuf->Des() );
+            TInt ret = CnvUtfConverter::ConvertFromUnicodeToUtf8( ptr, inBuf );
+            DesToNpvariant(ptr, variant);
+            delete outBuf;
+            }
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdLightMinIntensity] )
+        {
+        INT32_TO_NPVARIANT( iSystemInfoMisc->LightMinIntensity(), *variant );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdLightMaxIntensity] )
+        {
+        INT32_TO_NPVARIANT( iSystemInfoMisc->LightMaxIntensity(), *variant );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdLightDefaultIntensity] )
+        {
+        INT32_TO_NPVARIANT( iSystemInfoMisc->LightDefaultIntensity(), *variant );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdLightInfiniteDuration] )
+        {
+        INT32_TO_NPVARIANT( iSystemInfoMisc->LightInfiniteDuration(), *variant );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdLightMaxDuration] )
+        {
+        INT32_TO_NPVARIANT( iSystemInfoMisc->LightMaxDuration(), *variant );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdLightDefaultCycleTime] )
+        {
+        INT32_TO_NPVARIANT( iSystemInfoMisc->LightDefaultCycleTime(), *variant );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdLightTargetPrimaryDisplayAndKeyboard] )
+        {
+        INT32_TO_NPVARIANT( iSystemInfoMisc->LightTargetPrimaryDisplayAndKeyboard(), *variant );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdLightTargetSystem] )
+        {
+        INT32_TO_NPVARIANT( iSystemInfoMisc->LightTargetSystem(), *variant );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdVibraMinIntensity] )
+        {
+        INT32_TO_NPVARIANT( iSystemInfoMisc->VibraMinIntensity(), *variant );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdVibraMaxIntensity] )
+        {
+        INT32_TO_NPVARIANT( iSystemInfoMisc->VibraMaxIntensity(), *variant );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdVibraMaxDuration] )
+        {
+        INT32_TO_NPVARIANT( iSystemInfoMisc->VibraMaxDuration(), *variant );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdVibraSettings] )
+        {
+        INT32_TO_NPVARIANT( iSystemInfoMisc->VibraSettings(), *variant );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdTotalRam] )
+        {
+        INT32_TO_NPVARIANT( iSystemInfoMisc->TotalRam(), *variant );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdFreeRam] )
+        {
+        INT32_TO_NPVARIANT( iSystemInfoMisc->FreeRam(), *variant );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdDriveList] )
+        {
+        HBufC8* drives = HBufC8::New( KMaxDrives*2 );
+        if ( drives )
+            {
+            TPtr8 ptr( drives->Des() );
+            iSystemInfoMisc->DriveList( ptr );
+            DesToNpvariant(ptr, variant);
+            delete drives;
+            }
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdLanguage] )
+        {
+        TBuf<64> langCode;
+        iSystemInfoMisc->Language( langCode );
+        HBufC8* outBuf = HBufC8::New( langCode.Length() + 1 );
+        if ( outBuf )
+            {
+            TPtr8 ptr( outBuf->Des() );
+            ptr.SetLength( 0 );
+            // Note: the copy below goes from 16-bit to 8-bit by
+            // dropping the high 8-bits.  This will work since all
+            // codes are made from 7-bit ASCII characters see
+            // http://www.rfc-editor.org/rfc/rfc4646.txt section 7
+            // "Character Set Considerations".  Also see
+            // http://www.w3.org/International/questions/qa-lang-2or3
+            ptr.Copy( langCode );
+            ptr.ZeroTerminate();
+            DesToNpvariant( ptr, variant );
+            delete outBuf;
+            }
+        }
+    else
+        {
+        return EFalse;
+        }
+    return ETrue;
+    }
+
+// ----------------------------------------------------------------------------
+// CSystemInfoPlugin::SetProperty
+// ----------------------------------------------------------------------------
+bool CSystemInfoPlugin::SetPropertyL( NPIdentifier name, NPVariant *variant )
+    {
+    // all writeable properties are names of callback functions
+    HBufC8* pFunctionText = NULL;
+
+    // anything but a string will result in nulling out the callback
+    if ( NPVARIANT_IS_STRING( *variant ) )
+        {
+        // canonicalize function name string: only fname (no args) and zero terminate
+        NPString str = NPVARIANT_TO_STRING( *variant );
+
+        if ( (const TUint8 *)str.UTF8Characters )
+            {
+            // allocate a copy
+            TInt length = str.UTF8Length;
+            pFunctionText = HBufC8::NewL( length+1 );
+            TPtr8 tptr = pFunctionText->Des();
+            tptr.Copy( (const TUint8 *)str.UTF8Characters, length );
+
+            //Remove any arguments passed in the with the function name
+            TInt pos = pFunctionText->Locate(TChar('('));
+            if ( pos != KErrNotFound )
+                {
+                length = pos;
+                }
+            tptr.SetLength(length);
+            tptr.ZeroTerminate();
+            }
+        }
+
+    // NOTE: pFunctionText can be NULL
+
+    if ( name == iSystemInfoPluginIdentifiers[EIdOnChargeLevel] )
+        {
+        iPowerObserver->RequestNotificationL( CPowerObserver::EIdBatteryInfo,
+                                              pFunctionText );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdOnChargerConnected] )
+        {
+        iPowerObserver->RequestNotificationL( CPowerObserver::EIdIndicator,
+                                              pFunctionText );
+        }
+    else if ( name == iSystemInfoPluginIdentifiers[EIdOnNetworkRegistrationStatus] )
+        {
+        iNetworkObserver->RequestNotificationL( CNetworkObserver::EIdRegistrationStatus,
+                                                pFunctionText );
+        }
+    else
+        {
+        delete pFunctionText;
+        return EFalse;
+        }
+    return ETrue;
+    }
+
+void CSystemInfoPlugin::DesToNpvariant(TPtr8& string, NPVariant*& variant)
+{
+    char* newString = NULL;
+    if (string.Length()) {
+        newString = new char[string.Length()];
+    }
+    if (newString) {
+        Mem::Copy(newString, string.Ptr(), string.Length());
+        STRINGN_TO_NPVARIANT(newString, string.Length(), *variant);
+    }
+}
+
+
+
+//  End of File