browserplugins/browsersysteminfoplugin/src/SystemInfoPlugin.cpp
branchRCL_3
changeset 48 8e6fa1719340
equal deleted inserted replaced
47:6385c4c93049 48:8e6fa1719340
       
     1 /*
       
     2 * Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the License "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Interface to Browser for handling embedded system info requests.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include <e32std.h>
       
    21 #include <npupp.h>
       
    22 #include <string.h>
       
    23 #include <utf.h>
       
    24 #include <MProfileEngine.h>
       
    25 #include <MProfile.h>
       
    26 #include "SystemInfoPlugin.h"
       
    27 #include "NetworkObserver.h"
       
    28 #include "PowerObserver.h"
       
    29 #include "SystemInfoMisc.h"
       
    30 
       
    31 // CONSTANTS
       
    32 
       
    33 enum TIdentifiersNames
       
    34     {
       
    35     EIdChargeLevel,
       
    36     EIdOnChargeLevel,
       
    37     EIdChargerConnected,
       
    38     EIdOnChargerConnected,
       
    39     EIdSignalBars,
       
    40     EIdNetworkName,
       
    41     EIdNetworkRegistrationStatus,
       
    42     EIdOnNetworkRegistrationStatus,
       
    43     EIdLightMinIntensity,
       
    44     EIdLightMaxIntensity,
       
    45     EIdLightDefaultIntensity,
       
    46     EIdLightInfiniteDuration,
       
    47     EIdLightMaxDuration,
       
    48     EIdLightDefaultCycleTime,
       
    49     EIdLightTargetPrimaryDisplayAndKeyboard,
       
    50     EIdLightTargetSystem,
       
    51     EIdLightOn,
       
    52     EIdLightBlink,
       
    53     EIdLightOff,
       
    54     EIdVibraMinIntensity,
       
    55     EIdVibraMaxIntensity,
       
    56     EIdVibraMaxDuration,
       
    57     EIdVibraSettings,
       
    58     EIdStartVibra,
       
    59     EIdStopVibra,
       
    60     EIdBeep,
       
    61     EIdTotalRam,
       
    62     EIdFreeRam,
       
    63     EIdDriveList,
       
    64     EIdDriveSize,
       
    65     EIdDriveFree,
       
    66     EIdLanguage,
       
    67     EIdLast
       
    68     };
       
    69 
       
    70 const NPUTF8 *systemInfoPluginIdentifierNames[EIdLast] =
       
    71     {
       
    72     "chargelevel",
       
    73     "onchargelevel",
       
    74     "chargerconnected",
       
    75     "onchargerconnected",
       
    76     "signalbars",
       
    77     "networkname",
       
    78     "networkregistrationstatus",
       
    79     "onnetworkregistrationstatus",
       
    80     "lightminintensity",
       
    81     "lightmaxintensity",
       
    82     "lightdefaultintensity",
       
    83     "lightinfiniteduration",
       
    84     "lightmaxduration",
       
    85     "lightdefaultcycletime",
       
    86     "lighttargetprimarydisplayandkeyboard",
       
    87     "lighttargetsystem",
       
    88     "lighton",
       
    89     "lightblink",
       
    90     "lightoff",
       
    91     "vibraminintensity",
       
    92     "vibramaxintensity",
       
    93     "vibramaxduration",
       
    94     "vibrasettings",
       
    95     "startvibra",
       
    96     "stopvibra",
       
    97     "beep",
       
    98     "totalram",
       
    99     "freeram",
       
   100     "drivelist",
       
   101     "drivesize",
       
   102     "drivefree",
       
   103     "language"
       
   104     };
       
   105 
       
   106 const TBool IsMethod[EIdLast] =
       
   107     {
       
   108     EFalse, // "chargelevel"
       
   109     EFalse, // "onchargelevel"
       
   110     EFalse, // "chargerconnected"
       
   111     EFalse, // "onchargerconnected"
       
   112     EFalse, // "signalbars"
       
   113     EFalse, // "networkname"
       
   114     EFalse, // "networkregistrationstatus"
       
   115     EFalse, // "onnetworkregistrationstatus"
       
   116     EFalse, // "lightminintensity"
       
   117     EFalse, // "lightmaxintensity"
       
   118     EFalse, // "lightdefaultintensity"
       
   119     EFalse, // "lightinfiniteduration"
       
   120     EFalse, // "lightmaxduration"
       
   121     EFalse, // "lightdefaultcycletime"
       
   122     EFalse, // "lighttargetprimarydisplayandkeyboard"
       
   123     EFalse, // "lighttargetsystem"
       
   124     ETrue, // "lighton"
       
   125     ETrue, // "lightblink"
       
   126     ETrue, // "lightoff"
       
   127     EFalse, // "vibraminintensity"
       
   128     EFalse, // "vibramaxintensity"
       
   129     EFalse, // "vibramaxduration"
       
   130     EFalse, // "vibrasettings"
       
   131     ETrue, // "startvibra"
       
   132     ETrue, // "stopvibra"
       
   133     ETrue, // "beep"
       
   134     EFalse, // "totalram"
       
   135     EFalse, // "freeram"
       
   136     EFalse, // "drivelist"
       
   137     ETrue, // "drivesize"
       
   138     ETrue, // "drivefree"
       
   139     EFalse  // "language"
       
   140     };
       
   141 
       
   142 
       
   143 // ============================ MEMBER FUNCTIONS ===============================
       
   144 
       
   145 // ----------------------------------------------------------------------------
       
   146 // CSystemInfoPlugin::CSystemInfoPlugin
       
   147 // C++ default constructor can NOT contain any code, that
       
   148 // might leave.
       
   149 // ----------------------------------------------------------------------------
       
   150 CSystemInfoPlugin::CSystemInfoPlugin()
       
   151     {
       
   152     }
       
   153 
       
   154 // ----------------------------------------------------------------------------
       
   155 // CSystemInfoPlugin::ConstructL
       
   156 // Symbian 2nd phase constructor can leave.
       
   157 // ----------------------------------------------------------------------------
       
   158 void CSystemInfoPlugin::ConstructL()
       
   159     {
       
   160     iSystemInfoPluginIdentifiers = new (ELeave) NPIdentifier[EIdLast];
       
   161     NPN_GetStringIdentifiers( systemInfoPluginIdentifierNames, EIdLast,
       
   162                               iSystemInfoPluginIdentifiers );
       
   163     iUid = RProcess().SecureId();
       
   164 
       
   165     // need profile to determine silent mode for beep control
       
   166     iProfileEngine = CreateProfileEngineL();
       
   167 
       
   168     // sysinfo feature class instances
       
   169     iPowerObserver = CPowerObserver::NewL( this );
       
   170     iNetworkObserver = CNetworkObserver::NewL( this );
       
   171     iSystemInfoMisc = CSystemInfoMisc::NewL();
       
   172     }
       
   173 
       
   174 // ----------------------------------------------------------------------------
       
   175 // CSystemInfoPlugin::NewL
       
   176 // Two-phased constructor.
       
   177 // ----------------------------------------------------------------------------
       
   178 CSystemInfoPlugin* CSystemInfoPlugin::NewL()
       
   179 
       
   180     {
       
   181     CSystemInfoPlugin* self = new (ELeave) CSystemInfoPlugin;
       
   182     CleanupStack::PushL( self );
       
   183     self->ConstructL();
       
   184     CleanupStack::Pop( self );
       
   185     return self;
       
   186     }
       
   187 
       
   188 // ----------------------------------------------------------------------------
       
   189 // CSystemInfoPlugin::Destructor
       
   190 // ----------------------------------------------------------------------------
       
   191 CSystemInfoPlugin::~CSystemInfoPlugin()
       
   192     {
       
   193     delete [] iSystemInfoPluginIdentifiers;
       
   194 
       
   195     if (iProfileEngine != NULL)
       
   196         {
       
   197         iProfileEngine->Release();
       
   198         }
       
   199     // sysinfo feature class instances
       
   200     delete iPowerObserver;
       
   201     delete iNetworkObserver;
       
   202     delete iSystemInfoMisc;
       
   203     }
       
   204 
       
   205 // ----------------------------------------------------------------------------
       
   206 // CSystemInfoPlugin::Deallocate
       
   207 //
       
   208 // ----------------------------------------------------------------------------
       
   209 void CSystemInfoPlugin::Deallocate()
       
   210     {
       
   211     }
       
   212 
       
   213 // ----------------------------------------------------------------------------
       
   214 // CSystemInfoPlugin::InvokeCallback
       
   215 //
       
   216 // ----------------------------------------------------------------------------
       
   217 bool CSystemInfoPlugin::InvokeCallback( TDesC8& name, const NPVariant *args, uint32_t argCount )
       
   218     {
       
   219     CSystemInfoPluginEcomMain* lSystemInfoPPluginEcomMain
       
   220         = (CSystemInfoPluginEcomMain*) Dll::Tls();
       
   221     NPNetscapeFuncs* lNetscapeFuncs = lSystemInfoPPluginEcomMain->Funcs();
       
   222     if ( lNetscapeFuncs && iInstanceHandle )
       
   223         {
       
   224         void* value = 0;
       
   225         NPError npErr = lNetscapeFuncs->getvalue( iInstanceHandle, NPNVWindowNPObject,
       
   226                                                  (void*)&value );
       
   227         if ( npErr == NPERR_NO_ERROR )
       
   228             {
       
   229             NPVariant resultVariant;
       
   230             VOID_TO_NPVARIANT( resultVariant );
       
   231             NPIdentifier ident = NPN_GetStringIdentifier( (const NPUTF8 *)(name.Ptr()) );
       
   232             return NPN_Invoke( iInstanceHandle, (NPObject*)value, ident,
       
   233                                args, argCount, &resultVariant );
       
   234             }
       
   235         }
       
   236     return false;
       
   237     }
       
   238 
       
   239 // ----------------------------------------------------------------------------
       
   240 // CSystemInfoPlugin::HasMethod
       
   241 //
       
   242 // ----------------------------------------------------------------------------
       
   243 bool CSystemInfoPlugin::HasMethod( NPIdentifier name )
       
   244     {
       
   245     for (TInt i= 0; i < EIdLast; i++)
       
   246         {
       
   247         if ( name == iSystemInfoPluginIdentifiers[i] )
       
   248             {
       
   249             return IsMethod[i];
       
   250             }
       
   251         }
       
   252     return false;
       
   253     }
       
   254 
       
   255 // ----------------------------------------------------------------------------
       
   256 // CSystemInfoPlugin::VariantToInt
       
   257 //
       
   258 // ----------------------------------------------------------------------------
       
   259 void CSystemInfoPlugin::VariantToInt( NPVariant& v, TInt& i )
       
   260     {
       
   261     if ( NPVARIANT_IS_INT32( v ) )
       
   262         {
       
   263         i = NPVARIANT_TO_INT32( v );
       
   264         }
       
   265     else if ( NPVARIANT_IS_DOUBLE( v ) )
       
   266         {
       
   267         double d = NPVARIANT_TO_DOUBLE( v );
       
   268         i = d;
       
   269         }
       
   270     // leave unchanged if some other type tag on variant
       
   271     }
       
   272 
       
   273 // ----------------------------------------------------------------------------
       
   274 // CSystemInfoPlugin::Invoke
       
   275 //
       
   276 // ----------------------------------------------------------------------------
       
   277 bool CSystemInfoPlugin::Invoke( NPIdentifier name,
       
   278                                 NPVariant* args,
       
   279                                 uint32_t argCount,
       
   280                                 NPVariant *result )
       
   281     {
       
   282     bool ret = false;
       
   283     VOID_TO_NPVARIANT( *result );
       
   284 
       
   285     if ( name == iSystemInfoPluginIdentifiers[EIdBeep] )
       
   286         {
       
   287         // don't beep if profile is silent
       
   288         MProfile* profile = NULL;
       
   289         TRAPD( error,
       
   290                profile = iProfileEngine->ActiveProfileL() );
       
   291         if ( KErrNone != error )
       
   292             {
       
   293             return true;
       
   294             }
       
   295         if ( EFalse == profile->IsSilent() )
       
   296             {
       
   297             TInt f = 440; // default 440 hertz
       
   298             TInt d = 500; // default 0.5 seconds (in milliseconds)
       
   299             if ( argCount > 0 ) VariantToInt( args[0], f );
       
   300             if ( argCount > 1 ) VariantToInt( args[1], d );
       
   301             // convert duration from milliseconds to microseconds, the
       
   302             // underlying functionality doesn't really handle microseconds
       
   303             // even though the interface specs it as microseconds
       
   304             d = d * 1000;
       
   305             // Note that d = 0 seems to mean "forever". Also, there
       
   306             // are max and min frequencies but they are not defined.
       
   307             // Below min there is silence, above max the equation
       
   308             // seems to be f = min( max_freq, f)
       
   309             iSystemInfoMisc->Beep( f, d );
       
   310             }
       
   311         profile->Release();
       
   312         ret = true;
       
   313         }
       
   314     else if ( name == iSystemInfoPluginIdentifiers[EIdLightOn] )
       
   315         {
       
   316         TInt l = iSystemInfoMisc->LightTargetSystem();
       
   317         TInt d = iSystemInfoMisc->LightInfiniteDuration();
       
   318         TInt i = iSystemInfoMisc->LightDefaultIntensity();
       
   319         TInt f = 1;
       
   320         if ( argCount > 0 ) VariantToInt( args[0], l );
       
   321         if ( argCount > 1 ) VariantToInt( args[1], d );
       
   322         if ( argCount > 2 ) VariantToInt( args[2], i );
       
   323         if ( argCount > 3 ) VariantToInt( args[3], f );
       
   324         iSystemInfoMisc->LightOn( l, d, i, f );
       
   325         ret = true;
       
   326         }
       
   327     else if ( name == iSystemInfoPluginIdentifiers[EIdLightBlink] )
       
   328         {
       
   329         TInt l = iSystemInfoMisc->LightTargetSystem();
       
   330         TInt d = iSystemInfoMisc->LightInfiniteDuration();
       
   331         TInt don = iSystemInfoMisc->LightDefaultCycleTime();
       
   332         TInt doff = iSystemInfoMisc->LightDefaultCycleTime();
       
   333         TInt i = iSystemInfoMisc->LightDefaultIntensity();
       
   334         if ( argCount > 0 ) VariantToInt( args[0], l );
       
   335         if ( argCount > 1 ) VariantToInt( args[1], d );
       
   336         if ( argCount > 2 ) VariantToInt( args[2], don );
       
   337         if ( argCount > 3 ) VariantToInt( args[3], doff );
       
   338         if ( argCount > 4 ) VariantToInt( args[4], i );
       
   339         iSystemInfoMisc->LightBlink( l, d, don, doff, i );
       
   340         ret = true;
       
   341         }
       
   342     else if ( name == iSystemInfoPluginIdentifiers[EIdLightOff] )
       
   343         {
       
   344         TInt l = iSystemInfoMisc->LightTargetSystem();
       
   345         TInt d = iSystemInfoMisc->LightInfiniteDuration();
       
   346         TInt f = 1;
       
   347         if ( argCount > 0 ) VariantToInt( args[0], l );
       
   348         if ( argCount > 1 ) VariantToInt( args[1], d );
       
   349         if ( argCount > 2 ) VariantToInt( args[2], f );
       
   350         iSystemInfoMisc->LightOff( l, d, f );
       
   351         ret = true;
       
   352         }
       
   353     else if ( name == iSystemInfoPluginIdentifiers[EIdStartVibra] )
       
   354         {
       
   355         TInt d = iSystemInfoMisc->VibraMaxDuration();
       
   356         TInt i = iSystemInfoMisc->VibraMaxIntensity();
       
   357         if ( argCount > 0 ) VariantToInt( args[0], d );
       
   358         if ( argCount > 1 ) VariantToInt( args[1], i );
       
   359         iSystemInfoMisc->StartVibra( d, i );
       
   360         ret = true;
       
   361         }
       
   362     else if ( name == iSystemInfoPluginIdentifiers[EIdStopVibra] )
       
   363         {
       
   364         iSystemInfoMisc->StopVibra();
       
   365         ret = true;
       
   366         }
       
   367     else if ( name == iSystemInfoPluginIdentifiers[EIdDriveSize] )
       
   368         {
       
   369         TUint c = 0;
       
   370         if ( argCount > 0 && NPVARIANT_IS_STRING( args[0] ) )
       
   371             {
       
   372             NPString nps = NPVARIANT_TO_STRING( args[0] );
       
   373             if ( nps.UTF8Characters ) c = nps.UTF8Characters[0];
       
   374             }
       
   375         if ( c > 0 )
       
   376             {
       
   377             TChar drive( c );
       
   378             TReal size = iSystemInfoMisc->DriveSize( drive );
       
   379             DOUBLE_TO_NPVARIANT( size, *result );
       
   380             ret = true;
       
   381             }
       
   382         }
       
   383     else if ( name == iSystemInfoPluginIdentifiers[EIdDriveFree] )
       
   384         {
       
   385         TUint c = 0;
       
   386         if ( argCount > 0 && NPVARIANT_IS_STRING( args[0] ) )
       
   387             {
       
   388             NPString nps = NPVARIANT_TO_STRING( args[0] );
       
   389             if ( nps.UTF8Characters ) c = nps.UTF8Characters[0];
       
   390             }
       
   391         if ( c > 0 )
       
   392             {
       
   393             TChar drive( c );
       
   394             TReal free = iSystemInfoMisc->DriveFree( drive );
       
   395             DOUBLE_TO_NPVARIANT( free, *result );
       
   396             ret = true;
       
   397             }
       
   398         }
       
   399 
       
   400     return ret;
       
   401     }
       
   402 
       
   403 // ----------------------------------------------------------------------------
       
   404 // CSystemInfoPlugin::HasProperty
       
   405 //
       
   406 // ----------------------------------------------------------------------------
       
   407 bool CSystemInfoPlugin::HasProperty (NPIdentifier name)
       
   408     {
       
   409     for ( TInt i= 0; i < EIdLast; i++ )
       
   410         {
       
   411         if ( name == iSystemInfoPluginIdentifiers[i] )
       
   412             {
       
   413             return !IsMethod[i];
       
   414             }
       
   415         }
       
   416     return false;
       
   417     }
       
   418 
       
   419 
       
   420 // ----------------------------------------------------------------------------
       
   421 // CSystemInfoPlugin::GetProperty
       
   422 //
       
   423 // ----------------------------------------------------------------------------
       
   424 bool CSystemInfoPlugin::GetProperty( NPIdentifier name, NPVariant *variant )
       
   425     {
       
   426     // default variant value maps to javascript undefined
       
   427     VOID_TO_NPVARIANT( *variant );
       
   428 
       
   429     if ( name == iSystemInfoPluginIdentifiers[EIdChargeLevel] )
       
   430         {
       
   431         INT32_TO_NPVARIANT( iPowerObserver->ChargeLevel(), *variant );
       
   432         }
       
   433     else if ( name == iSystemInfoPluginIdentifiers[EIdChargerConnected] )
       
   434         {
       
   435         INT32_TO_NPVARIANT( iPowerObserver->ChargerConnected(), *variant );
       
   436         }
       
   437     else if ( name == iSystemInfoPluginIdentifiers[EIdSignalBars] )
       
   438         {
       
   439         INT32_TO_NPVARIANT( iNetworkObserver->SignalBars(), *variant );
       
   440         }
       
   441     else if ( name == iSystemInfoPluginIdentifiers[EIdNetworkRegistrationStatus] )
       
   442         {
       
   443         INT32_TO_NPVARIANT( iNetworkObserver->RegistrationStatus(), *variant );
       
   444         }
       
   445     else if ( name == iSystemInfoPluginIdentifiers[EIdNetworkName] )
       
   446         {
       
   447         const TDesC& inBuf = iNetworkObserver->NetworkName();
       
   448         HBufC8* outBuf = HBufC8::New( inBuf.Length() + 1 );
       
   449         if ( outBuf )
       
   450             {
       
   451             TPtr8 ptr( outBuf->Des() );
       
   452             TInt ret = CnvUtfConverter::ConvertFromUnicodeToUtf8( ptr, inBuf );
       
   453             DesToNpvariant(ptr, variant);
       
   454             delete outBuf;
       
   455             }
       
   456         }
       
   457     else if ( name == iSystemInfoPluginIdentifiers[EIdLightMinIntensity] )
       
   458         {
       
   459         INT32_TO_NPVARIANT( iSystemInfoMisc->LightMinIntensity(), *variant );
       
   460         }
       
   461     else if ( name == iSystemInfoPluginIdentifiers[EIdLightMaxIntensity] )
       
   462         {
       
   463         INT32_TO_NPVARIANT( iSystemInfoMisc->LightMaxIntensity(), *variant );
       
   464         }
       
   465     else if ( name == iSystemInfoPluginIdentifiers[EIdLightDefaultIntensity] )
       
   466         {
       
   467         INT32_TO_NPVARIANT( iSystemInfoMisc->LightDefaultIntensity(), *variant );
       
   468         }
       
   469     else if ( name == iSystemInfoPluginIdentifiers[EIdLightInfiniteDuration] )
       
   470         {
       
   471         INT32_TO_NPVARIANT( iSystemInfoMisc->LightInfiniteDuration(), *variant );
       
   472         }
       
   473     else if ( name == iSystemInfoPluginIdentifiers[EIdLightMaxDuration] )
       
   474         {
       
   475         INT32_TO_NPVARIANT( iSystemInfoMisc->LightMaxDuration(), *variant );
       
   476         }
       
   477     else if ( name == iSystemInfoPluginIdentifiers[EIdLightDefaultCycleTime] )
       
   478         {
       
   479         INT32_TO_NPVARIANT( iSystemInfoMisc->LightDefaultCycleTime(), *variant );
       
   480         }
       
   481     else if ( name == iSystemInfoPluginIdentifiers[EIdLightTargetPrimaryDisplayAndKeyboard] )
       
   482         {
       
   483         INT32_TO_NPVARIANT( iSystemInfoMisc->LightTargetPrimaryDisplayAndKeyboard(), *variant );
       
   484         }
       
   485     else if ( name == iSystemInfoPluginIdentifiers[EIdLightTargetSystem] )
       
   486         {
       
   487         INT32_TO_NPVARIANT( iSystemInfoMisc->LightTargetSystem(), *variant );
       
   488         }
       
   489     else if ( name == iSystemInfoPluginIdentifiers[EIdVibraMinIntensity] )
       
   490         {
       
   491         INT32_TO_NPVARIANT( iSystemInfoMisc->VibraMinIntensity(), *variant );
       
   492         }
       
   493     else if ( name == iSystemInfoPluginIdentifiers[EIdVibraMaxIntensity] )
       
   494         {
       
   495         INT32_TO_NPVARIANT( iSystemInfoMisc->VibraMaxIntensity(), *variant );
       
   496         }
       
   497     else if ( name == iSystemInfoPluginIdentifiers[EIdVibraMaxDuration] )
       
   498         {
       
   499         INT32_TO_NPVARIANT( iSystemInfoMisc->VibraMaxDuration(), *variant );
       
   500         }
       
   501     else if ( name == iSystemInfoPluginIdentifiers[EIdVibraSettings] )
       
   502         {
       
   503         INT32_TO_NPVARIANT( iSystemInfoMisc->VibraSettings(), *variant );
       
   504         }
       
   505     else if ( name == iSystemInfoPluginIdentifiers[EIdTotalRam] )
       
   506         {
       
   507         INT32_TO_NPVARIANT( iSystemInfoMisc->TotalRam(), *variant );
       
   508         }
       
   509     else if ( name == iSystemInfoPluginIdentifiers[EIdFreeRam] )
       
   510         {
       
   511         INT32_TO_NPVARIANT( iSystemInfoMisc->FreeRam(), *variant );
       
   512         }
       
   513     else if ( name == iSystemInfoPluginIdentifiers[EIdDriveList] )
       
   514         {
       
   515         HBufC8* drives = HBufC8::New( KMaxDrives*2 );
       
   516         if ( drives )
       
   517             {
       
   518             TPtr8 ptr( drives->Des() );
       
   519             iSystemInfoMisc->DriveList( ptr );
       
   520             DesToNpvariant(ptr, variant);
       
   521             delete drives;
       
   522             }
       
   523         }
       
   524     else if ( name == iSystemInfoPluginIdentifiers[EIdLanguage] )
       
   525         {
       
   526         TBuf<64> langCode;
       
   527         iSystemInfoMisc->Language( langCode );
       
   528         HBufC8* outBuf = HBufC8::New( langCode.Length() + 1 );
       
   529         if ( outBuf )
       
   530             {
       
   531             TPtr8 ptr( outBuf->Des() );
       
   532             ptr.SetLength( 0 );
       
   533             // Note: the copy below goes from 16-bit to 8-bit by
       
   534             // dropping the high 8-bits.  This will work since all
       
   535             // codes are made from 7-bit ASCII characters see
       
   536             // http://www.rfc-editor.org/rfc/rfc4646.txt section 7
       
   537             // "Character Set Considerations".  Also see
       
   538             // http://www.w3.org/International/questions/qa-lang-2or3
       
   539             ptr.Copy( langCode );
       
   540             ptr.ZeroTerminate();
       
   541             DesToNpvariant( ptr, variant );
       
   542             delete outBuf;
       
   543             }
       
   544         }
       
   545     else
       
   546         {
       
   547         return EFalse;
       
   548         }
       
   549     return ETrue;
       
   550     }
       
   551 
       
   552 // ----------------------------------------------------------------------------
       
   553 // CSystemInfoPlugin::SetProperty
       
   554 // ----------------------------------------------------------------------------
       
   555 bool CSystemInfoPlugin::SetPropertyL( NPIdentifier name, NPVariant *variant )
       
   556     {
       
   557     // all writeable properties are names of callback functions
       
   558     HBufC8* pFunctionText = NULL;
       
   559 
       
   560     // anything but a string will result in nulling out the callback
       
   561     if ( NPVARIANT_IS_STRING( *variant ) )
       
   562         {
       
   563         // canonicalize function name string: only fname (no args) and zero terminate
       
   564         NPString str = NPVARIANT_TO_STRING( *variant );
       
   565 
       
   566         if ( (const TUint8 *)str.UTF8Characters )
       
   567             {
       
   568             // allocate a copy
       
   569             TInt length = str.UTF8Length;
       
   570             pFunctionText = HBufC8::NewL( length+1 );
       
   571             TPtr8 tptr = pFunctionText->Des();
       
   572             tptr.Copy( (const TUint8 *)str.UTF8Characters, length );
       
   573 
       
   574             //Remove any arguments passed in the with the function name
       
   575             TInt pos = pFunctionText->Locate(TChar('('));
       
   576             if ( pos != KErrNotFound )
       
   577                 {
       
   578                 length = pos;
       
   579                 }
       
   580             tptr.SetLength(length);
       
   581             tptr.ZeroTerminate();
       
   582             }
       
   583         }
       
   584 
       
   585     // NOTE: pFunctionText can be NULL
       
   586 
       
   587     if ( name == iSystemInfoPluginIdentifiers[EIdOnChargeLevel] )
       
   588         {
       
   589         iPowerObserver->RequestNotificationL( CPowerObserver::EIdBatteryInfo,
       
   590                                               pFunctionText );
       
   591         }
       
   592     else if ( name == iSystemInfoPluginIdentifiers[EIdOnChargerConnected] )
       
   593         {
       
   594         iPowerObserver->RequestNotificationL( CPowerObserver::EIdIndicator,
       
   595                                               pFunctionText );
       
   596         }
       
   597     else if ( name == iSystemInfoPluginIdentifiers[EIdOnNetworkRegistrationStatus] )
       
   598         {
       
   599         iNetworkObserver->RequestNotificationL( CNetworkObserver::EIdRegistrationStatus,
       
   600                                                 pFunctionText );
       
   601         }
       
   602     else
       
   603         {
       
   604         delete pFunctionText;
       
   605         return EFalse;
       
   606         }
       
   607     return ETrue;
       
   608     }
       
   609 
       
   610 void CSystemInfoPlugin::DesToNpvariant(TPtr8& string, NPVariant*& variant)
       
   611 {
       
   612     char* newString = NULL;
       
   613     if (string.Length()) {
       
   614         newString = new char[string.Length()];
       
   615     }
       
   616     if (newString) {
       
   617         Mem::Copy(newString, string.Ptr(), string.Length());
       
   618         STRINGN_TO_NPVARIANT(newString, string.Length(), *variant);
       
   619     }
       
   620 }
       
   621 
       
   622 
       
   623 
       
   624 //  End of File