diff -r 6385c4c93049 -r 8e6fa1719340 browserplugins/browsergpsplugin/src/GpsPlugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserplugins/browsergpsplugin/src/GpsPlugin.cpp Wed Sep 01 12:31:04 2010 +0100 @@ -0,0 +1,259 @@ +/* +* 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: Interface to Browser for handling embedded Gps requests. +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include "GpsPlugin.h" +#include "GpsObserver.h" +#include + + +// CONSTANTS + +enum TIdentifiersNames { + EIdLatitude, + EIdLongitude, + EIdAlt, + EIdHorizontalAccuracy, + EIdVerticalAccuracy, + EIdOnGps, + EIdSatelliteStatus, + EIdTickCount, + EIdLast + }; + +const NPUTF8 *GpsPluginIdentifierNames[EIdLast] += { "latitude", // 0 + "longitude", // 1 + "altitude", // 2 + "horizontalaccuracy", // 3 + "verticalaccuracy", // 4 + "ongps", // 5 + "showsatellitestatus", // 6 + "tickcount", // 7 + }; + +const TBool IsMethod[] = { + EFalse, // latitude, + EFalse, // longitude, + EFalse, // altitude + EFalse, // horizontalaccuracy + EFalse, // verticalaccuracy + EFalse, // ongps + ETrue, // showSatelliteStatus + EFalse, // tickcount + }; + + +// ============================ MEMBER FUNCTIONS =============================== + +// ---------------------------------------------------------------------------- +// CGpsPlugin::CGpsPlugin +// C++ default constructor can NOT contain any code, that +// might leave. +// ---------------------------------------------------------------------------- +CGpsPlugin::CGpsPlugin() + { + } + +// ---------------------------------------------------------------------------- +// CGpsPlugin::NewL +// Two-phased constructor. +// ---------------------------------------------------------------------------- +CGpsPlugin* CGpsPlugin::NewL() + { + CGpsPlugin* self = new (ELeave) CGpsPlugin; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------------------------------- +// CGpsPlugin::ConstructL +// Symbian 2nd phase constructor can leave. +// ---------------------------------------------------------------------------- +void CGpsPlugin::ConstructL() + { + iGpsPluginIdentifiers = new (ELeave) NPIdentifier[EIdLast]; + NPN_GetStringIdentifiers( GpsPluginIdentifierNames, EIdLast, + iGpsPluginIdentifiers ); + + iGpsObserver = CGpsObserver::NewL( this ); + } + +// ---------------------------------------------------------------------------- +// CGpsPlugin::Destructor +// ---------------------------------------------------------------------------- +CGpsPlugin::~CGpsPlugin() + { + delete [] iGpsPluginIdentifiers; + delete iGpsObserver; + } + +// ---------------------------------------------------------------------------- +// CGpsPlugin::Deallocate +// ---------------------------------------------------------------------------- +void CGpsPlugin::Deallocate () + { + } + +// ---------------------------------------------------------------------------- +// CGpsPlugin::InvokeCallback +// ---------------------------------------------------------------------------- +bool CGpsPlugin::InvokeCallback( TDesC8& name, + const NPVariant *args, uint32_t argCount ) + { + CGpsPluginEcomMain* lGpsPPluginEcomMain = (CGpsPluginEcomMain*) Dll::Tls(); + NPNetscapeFuncs* lNetscapeFuncs = lGpsPPluginEcomMain->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; + } + +// ---------------------------------------------------------------------------- +// CWidgetManagerPlugin::HasMethod +// ---------------------------------------------------------------------------- + +bool CGpsPlugin::HasMethod( NPIdentifier name ) + { + for ( TInt i= 0; i < EIdLast; i++ ) + { + if ( name == iGpsPluginIdentifiers[i] ) + { + return IsMethod[i]; + } + } + return false; + } + +// ---------------------------------------------------------------------------- +// CGpsPlugin::HasProperty +// ---------------------------------------------------------------------------- +bool CGpsPlugin::HasProperty( NPIdentifier name ) + { + for ( TInt i= 0; i < EIdLast; i++ ) + { + if ( name == iGpsPluginIdentifiers[i] ) + { + return !IsMethod[i]; + } + } + return false; + } + +// ---------------------------------------------------------------------------- +// CGpsPlugin::GetProperty +// ---------------------------------------------------------------------------- +bool CGpsPlugin::GetProperty( NPIdentifier name, NPVariant *variant ) + { + // default variant value maps to javascript undefined + VOID_TO_NPVARIANT( *variant ); + if ( name == iGpsPluginIdentifiers[EIdLatitude] ) + { + DOUBLE_TO_NPVARIANT( iGpsObserver->Latitude(), *variant ); + } + else if ( name == iGpsPluginIdentifiers[EIdLongitude] ) + { + DOUBLE_TO_NPVARIANT( iGpsObserver->Longitude(), *variant ); + } + else if ( name == iGpsPluginIdentifiers[EIdAlt] ) + { + DOUBLE_TO_NPVARIANT( iGpsObserver->Altitude(), *variant ); + } + else if ( name == iGpsPluginIdentifiers[EIdHorizontalAccuracy] ) + { + DOUBLE_TO_NPVARIANT( iGpsObserver->HorizontalAccuracy(), *variant ); + } + else if ( name == iGpsPluginIdentifiers[EIdVerticalAccuracy] ) + { + DOUBLE_TO_NPVARIANT( iGpsObserver->VerticalAccuracy(), *variant ); + } + else if ( name == iGpsPluginIdentifiers[EIdTickCount] ) + { + INT32_TO_NPVARIANT( iGpsObserver->TickCount(), *variant ); + } + else + { + return EFalse; + } + return ETrue; + } + +// ---------------------------------------------------------------------------- +// CGpsPlugin::Invoke +// ---------------------------------------------------------------------------- +bool CGpsPlugin::Invoke( NPIdentifier name, + NPVariant* /*args*/, + uint32_t /*argCount*/, + NPVariant *result ) + { + VOID_TO_NPVARIANT( *result ); + if ( name == iGpsPluginIdentifiers[EIdSatelliteStatus] ) + { + TRAP_IGNORE( + CSatelliteInfoUI* satelliteUI = CSatelliteInfoUI::NewL(); + (void) satelliteUI->ExecuteLD( _L("BrowserGpsPlugin") ) ); + } + return true; + } + +// ---------------------------------------------------------------------------- +// CGpsPlugin::SetPropertyL +// ---------------------------------------------------------------------------- +bool CGpsPlugin::SetPropertyL( NPIdentifier name, NPVariant *variant ) + { + if ( name == iGpsPluginIdentifiers[EIdOnGps] ) + { + NPString str = NPVARIANT_TO_STRING( *variant ); + iGpsObserver->RequestNotificationL(str); + } + else + { + return EFalse; + } + return ETrue; + } + +// ---------------------------------------------------------------------------- +// CBAPPlugin::SetWindowL +// Called by Browser for window creation. +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +void CGpsPlugin::SetWindowL( + MPluginAdapter* /*aPluginAdapter*/, // Allows callback to Browser + const TRect& /*aRect*/) // Window information + { + } +// End of File