--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tsrc/consoleplayer/player/src/externalplayer.cpp Fri Sep 03 19:37:02 2010 -0500
@@ -0,0 +1,224 @@
+/*
+ * Copyright (c) 2010 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:
+ * Source file for the main class of the external player executable.
+ *
+ */
+
+#include "externalplayer.h"
+#include "mmfplayerwindow.h"
+#include "testappbase.h"
+
+// This is the implementation for the external player executable.
+
+class CExternalPlayerExe : public CActive
+ {
+public:
+
+ static void ExecuteL()
+ {
+ CExternalPlayerExe* self = new(ELeave) CExternalPlayerExe;
+ CleanupStack::PushL( self );
+ self->MainL();
+ CleanupStack::PopAndDestroy( self );
+ }
+
+private:
+
+ CExternalPlayerExe() : CActive( EPriorityStandard )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+ ~CExternalPlayerExe()
+ {
+ Cancel();
+ iMsgQueue.Close();
+ iChunk.Close();
+ delete iVideoPlayer;
+ delete iWindowGroup;
+ delete iScreenDevice;
+ iWs.Close();
+ iFs.Close();
+ }
+
+ void MainL()
+ {
+ TInt err = KErrNone;
+
+ User::LeaveIfError( iFs.Connect() );
+
+ User::LeaveIfError( iWs.Connect() );
+
+ iScreenDevice = new(ELeave) CWsScreenDevice( iWs );
+ User::LeaveIfError( iScreenDevice->Construct() );
+
+ TBuf<200> commandLine;
+ User::CommandLine( commandLine );
+
+ TInt startIndex = commandLine.Find(KMsgQueuePrefix);
+
+ if( startIndex < 0 )
+ {
+ err = startIndex;
+ }
+ else
+ {
+ TPtrC msgQueueName = commandLine.Right( commandLine.Length() - startIndex - KMsgQueuePrefix().Length());
+ err = iMsgQueue.CreateGlobal( msgQueueName, 3 );
+
+ if( err == KErrNone )
+ {
+ TBuf<80> chunkName;
+ chunkName.Copy( msgQueueName );
+ chunkName.Append( _L("_chunk") );
+ err = iChunk.CreateGlobal( chunkName, 2048, 2048 ); // 2K chunk
+ }
+ }
+
+ RProcess::Rendezvous( err );
+
+ if( err == KErrNone )
+ {
+ SetActive();
+ iMsgQueue.NotifyDataAvailable( iStatus );
+
+ CActiveScheduler::Start();
+ }
+ }
+
+ // inherited from CActive
+
+ void RunL()
+ {
+ if( iStatus == KErrNone )
+ {
+ TInt err = KErrNone;
+
+ TExternalPlayerCommands msg;
+ iMsgQueue.Receive( msg );
+
+ RDebug::Printf( "EXTERNALPLAYER RunL() msg=%i", msg );
+
+ switch( msg )
+ {
+ case EExternalPlayer_StartPlayback:
+ {
+ TStartPlayback* chunk = (TStartPlayback*)iChunk.Base();
+
+ TPtrC8 filename( chunk->name, chunk->length );
+ iLocation.Copy( filename );
+ iLocationIsFilename = chunk->locationIsFilename;
+
+ iWindowTopRight.iX = chunk->x;
+ iWindowTopRight.iY = chunk->y;
+ iWindowSize.iWidth = chunk->width;
+ iWindowSize.iHeight = chunk->height;
+
+ iWindowGroup = new RWindowGroup( iWs );
+ err = iWindowGroup->ConstructChildApp( chunk->idOfParentWindowGroup,
+ KNullWsHandle,
+ false );
+ ASSERT( err == KErrNone );
+
+ TStartPlaybackReturn* chunkReturn = (TStartPlaybackReturn*)iChunk.Base();
+
+ chunkReturn->windowGroupId = iWindowGroup->Identifier();
+
+ iVideoPlayer = CMmfPlayerWindow::NewL( iFs,
+ iWs,
+ *iScreenDevice,
+ *iWindowGroup,
+ iWindowTopRight,
+ iWindowSize,
+ true, // transparent
+ KRgbTransparent,
+ true );
+
+ if( iLocationIsFilename )
+ {
+ iVideoPlayer->StartWithFilenameL( iLocation, CPlayerWindow::EBestFit);
+ }
+ else
+ {
+ iVideoPlayer->StartWithUrlL( iLocation, CPlayerWindow::EBestFit);
+ }
+
+ RDebug::Printf( "EXTERNALPLAYER player started" );
+ break;
+ }
+ case EExternalPlayer_ExecuteOperation:
+ {
+ TExecuteOperation* chunk = (TExecuteOperation*)iChunk.Base();
+ err = iVideoPlayer->ExecuteOperation(chunk->operation );
+ break;
+ }
+ case EExternalPlayer_MoveWindow:
+ {
+ TMoveWindow* chunk = (TMoveWindow*)iChunk.Base();
+ iVideoPlayer->MoveWindow( TPoint(chunk->centerX, chunk->centerY) );
+ break;
+ }
+ case EExternalPlayer_Shutdown:
+ {
+ RDebug::Printf( "EXTERNALPLAYER player stopped" );
+
+ CActiveScheduler::Stop();
+ break;
+ }
+ }
+
+ RProcess::Rendezvous( err );
+
+ SetActive();
+ iMsgQueue.NotifyDataAvailable( iStatus );
+ }
+ }
+
+ void DoCancel()
+ {
+ iMsgQueue.CancelDataAvailable();
+ }
+
+ RFs iFs;
+ RWsSession iWs;
+ CWsScreenDevice* iScreenDevice;
+ RWindowGroup* iWindowGroup;
+ CPlayerWindow* iVideoPlayer;
+ RMsgQueue<TExternalPlayerCommands> iMsgQueue;
+ RChunk iChunk;
+ TFileName iLocation;
+ bool iLocationIsFilename;
+ TPoint iWindowTopRight;
+ TSize iWindowSize;
+
+ };
+
+GLDEF_C TInt E32Main()
+ {
+ __UHEAP_MARK;
+
+ CActiveScheduler* scheduler = new CActiveScheduler;
+ CTrapCleanup* cleanup = CTrapCleanup::New();
+ if( scheduler != NULL && cleanup != NULL )
+ {
+ CActiveScheduler::Install( scheduler );
+ TRAP_IGNORE( CExternalPlayerExe::ExecuteL() );
+ }
+ delete cleanup;
+ delete scheduler;
+ __UHEAP_MARKEND;
+ return 0;
+ }
+