diff -r 000000000000 -r f72a12da539e idlehomescreen/xmluirendering/renderingplugins/xnnppluginfactory/src/xnnppluginadapter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlehomescreen/xmluirendering/renderingplugins/xnnppluginfactory/src/xnnppluginadapter.cpp Thu Dec 17 08:40:49 2009 +0200 @@ -0,0 +1,316 @@ +/* +* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: Implementation for wrapper for a Netscape Plugin API. +* +*/ + + +// INCLUDE FILES +#include "xnnppluginadapter.h" +#include "xnnpplugincontroladapter.h" +#include "xnnppluginhandler.h" +#include "xnproperty.h" +#include "xndomproperty.h" +#include "xndompropertyvalue.h" +#include "xndomlist.h" +#include "xnnodepluginif.h" +#include "xnuienginepluginif.h" +#include "xnresource.h" +#include "c_xnutils.h" + +// MACROS +_LIT8( KContentFile, "contentfile" ); +_LIT8( KMediaType, "mediatype" ); + +// LOCAL FUNCTION PROTOTYPES +const TDesC8& GetStringPropertyL( CXnNodePluginIf& aNode, const TDesC8& aProperty ); +CXnResource* FindResource(TXnUiEnginePluginIf& aEngine, const TDesC& aResourceFileName ); + +// ============================= LOCAL FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// GetStringProperty Retrieves the string property for the node. +// Returns: CXnNodePluginIf& aNode A node. +// TDesC8& aProperty A name of the property. +// const TDesC8 The value of property. +// ----------------------------------------------------------------------------- +// +const TDesC8& GetStringPropertyL( + CXnNodePluginIf& aNode, + const TDesC8& aProperty ) + { + CXnProperty* prop = aNode.GetPropertyL( aProperty ); + if( prop ) + { + CXnDomPropertyValue* value = + static_cast(prop->Property()->PropertyValueList().Item(0)); + if( CXnDomPropertyValue::EIdent == value->PrimitiveValueType() || + CXnDomPropertyValue::EString == value->PrimitiveValueType() ) + { + return prop->StringValue(); + } + } + return KNullDesC8; + } + +// ----------------------------------------------------------------------------- +// FindResource Locates a resource from the resource list. +// Returns: TXnUiEnginePluginIf& Pointer to UIEngine. +// const TDesC& The name of the resource file. +// CCnResource The actual resource. +// ----------------------------------------------------------------------------- +// +CXnResource* FindResource( + TXnUiEnginePluginIf& aEngine, + const TDesC& aResourceFileName ) + { + if (aResourceFileName == KNullDesC) + { + return NULL; + } + CArrayPtrSeg& resources = aEngine.Resources(); + for (TInt i = resources.Count() - 1; i >= 0; --i) + { + CXnResource* res = resources.At(i); + if (res->ResourceId().Compare(aResourceFileName) == 0 ) + { + return res; + } + } + return NULL; + } + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CXnNPPluginAdapter::NewL +// Symbian static 1st phase constructor +// ----------------------------------------------------------------------------- +// +CXnNPPluginAdapter* CXnNPPluginAdapter::NewL( + CXnControlAdapter* aParent, + CXnNodePluginIf& aNode ) + { + CXnNPPluginAdapter* self = new( ELeave ) CXnNPPluginAdapter; + + CleanupStack::PushL( self ); + self->ConstructL( aParent, aNode ); + CleanupStack::Pop(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CXnNPPluginAdapter::CXnNPPluginAdapter +// C++ default constructor +// ----------------------------------------------------------------------------- +// +CXnNPPluginAdapter::CXnNPPluginAdapter() + { + } + +// ----------------------------------------------------------------------------- +// CXnNPPluginAdapter::~CXnNPPluginAdapter +// C++ destructor +// ----------------------------------------------------------------------------- +// +CXnNPPluginAdapter::~CXnNPPluginAdapter() + { + //Clean up the content file from private folder. + iFs.Close(); + delete iContentFile; + + if( iPluginFuncs ) + { + iPluginFuncs->destroy(iInstance,NULL); + } + delete iPluginFuncs; + delete iPluginController; + delete iPluginHandler; + delete iInstance; + } + +// ----------------------------------------------------------------------------- +// CXnNPPluginAdapter::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CXnNPPluginAdapter::ConstructL( + CXnControlAdapter* aParent, + CXnNodePluginIf& aNode ) + { + iNode = &aNode; + + CXnControlAdapter::ConstructL( aNode ); + + iPluginHandler = CXnNPPluginHandler::NewL(); + + iPluginController = new (ELeave)CXnNPPluginControlAdapter; + ConstructPluginL( aParent ); + } + + +// ----------------------------------------------------------------------------- +// CXnNPPluginAdapter::ConstructPluginL +// Function returns if something goes wrong in plugin loading. +// ----------------------------------------------------------------------------- +// +TInt CXnNPPluginAdapter::ConstructPluginL( CXnControlAdapter* aParent ) + { + const TDesC8& mimeType = GetStringPropertyL( *iNode, KMediaType ); + const TDesC8& contentFile = GetStringPropertyL( *iNode, KContentFile ); + + iContentFile = HBufC::NewL( contentFile.Length() ); + TPtr cFilePtr = iContentFile->Des(); + cFilePtr.Copy( contentFile ); + + //Connect to file server + User::LeaveIfError( iFs.Connect() ); + iFs.CreatePrivatePath( EDriveC ); + + // Return if plugin could not be loaded. + if( KErrNone != iPluginHandler->LoadSpecificPluginL( mimeType, &iPluginFuncs )) + { + return KErrGeneral; + } + + // Call parent + iPluginController->iParentControlAdapter = aParent; + + iInstance = ( NPP ) User::AllocL( sizeof( NPP_t )); + iInstance->ndata = ( void* ) iPluginController; + iInstance->pdata = NULL; + + CDesCArray* argn = new( ELeave ) CDesCArrayFlat(1); + CDesCArray* argv = new( ELeave ) CDesCArrayFlat(1); + + argn->AppendL( KNullDesC ); + argv->AppendL( KNullDesC ); + + if (( iPluginFuncs ) && ( iPluginFuncs->newp )) + { + TDesC8* string( NULL ); + iPluginFuncs->newp(*string, iInstance, NP_EMBED, CONST_CAST( CDesCArray*, argn ), + CONST_CAST( CDesCArray*, argv ), NULL); + } + else + { + delete argn; + delete argv; + return KErrGeneral; + } + + TRect rect = iNode->Rect(); + // Coordinates for the plugin always start from (0,0) and are relative + // to the parent CCoeControl + NPWindow window; + window.x = 0; + window.y = 0; + window.width = rect.Width(); + window.height = rect.Height(); + window.type = NPWindowTypeDrawable; + window.window = ( void* ) iPluginController; + window.clipRect.top = window.x; + window.clipRect.bottom = window.x + window.height; + window.clipRect.left = window.y; + window.clipRect.right = window.y + window.width; + // Finally set the window. + iPluginFuncs->setwindow(iInstance,&window); + + NPStream* npstream = ( NPStream* )User::AllocL( sizeof( NPStream )); + npstream->url = NULL; + npstream->notifyData = NULL; + + TPtr resFileName = iContentFile->Des(); + /*TInt bitmapIndex; + CXnResource* resource = CXnUtils::FindResource( iNode->UiEngineL()->Resources(), + resFileName, bitmapIndex ); + if( !resource ) + { + User::Leave( KErrNotFound ); + } + TParsePtrC pathParser( resource->FileName() ); + TPtrC driveAndPath = pathParser.DriveAndPath();*/ + + npstream->url = resFileName.AllocL(); + + iPluginFuncs->asfile( iInstance, npstream, resFileName ); + + // Tell the plugin to destroy its stream + iPluginFuncs->destroystream( iInstance, npstream, 0 ); + // Delete the NPStream object + delete npstream->url; + delete npstream; + delete argn; + delete argv; + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CXnNPPluginAdapter::SizeChanged +// (Other items were commented in header.) +// ----------------------------------------------------------------------------- +// +void CXnNPPluginAdapter::SizeChanged() + { + if( iPluginFuncs ) + { + TRect rect = iNode->Rect(); + // Coordinates for the plugin always start from (0,0) and are relative + // to the parent CCoeControl + NPWindow window; + window.x = 0; + window.y = 0; + window.width = rect.Width(); + window.height = rect.Height(); + window.type = NPWindowTypeDrawable; + window.window = ( void* ) iPluginController; + window.clipRect.top = window.x; + window.clipRect.bottom = window.x + window.height; + window.clipRect.left = window.y; + window.clipRect.right = window.y + window.width; + // Finally set the window. + iPluginFuncs->setwindow(iInstance,&window); + // Set the correct position to the parent CCoeControl. + iPluginController->iNPPControlAdapter->SetPosition( TPoint( rect.iTl.iX, rect.iTl.iY )); + } + } +// ----------------------------------------------------------------------------- +// CXnNPPluginAdapter::DoEnterPowerSaveModeL +// Enter power save mode +// ----------------------------------------------------------------------------- +void CXnNPPluginAdapter::DoEnterPowerSaveModeL(TModeEvent /*aEvent*/) + { + if ( iPluginController->iPluginNotifier ) + { + iPluginController->iPluginNotifier->NotifyL + (MPluginNotifier::EApplicationFocusChanged, NULL); + } + } + +// ----------------------------------------------------------------------------- +// CXnNPPluginAdapter::DoExitPowerSaveModeL +// Exit power save mode +// ----------------------------------------------------------------------------- +void CXnNPPluginAdapter::DoExitPowerSaveModeL(TModeEvent /*aEvent*/) + { + if ( iPluginController->iPluginNotifier ) + { + TBool param(ETrue); + iPluginController->iPluginNotifier->NotifyL + (MPluginNotifier::EApplicationFocusChanged, ¶m ); + + } + } +// End of file