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<CXnDomPropertyValue*>(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<CXnResource>& 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