tsrc/consoleplayer/player/inc/externalplayer.h
author hgs
Fri, 03 Sep 2010 19:37:02 -0500
changeset 33 e1b6d78dfe6a
permissions -rw-r--r--
201035
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Contributors:
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * Description:
hgs
parents:
diff changeset
    15
 * Header for the external player main class.
hgs
parents:
diff changeset
    16
 * 
hgs
parents:
diff changeset
    17
 */
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#ifndef __EXTERNAL_PLAYER_H__
hgs
parents:
diff changeset
    20
#define __EXTERNAL_PLAYER_H__
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include <e32base.h>
hgs
parents:
diff changeset
    23
#include <e32msgqueue.h>
hgs
parents:
diff changeset
    24
#include <w32std.h>
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
#include "PlayerWindow.h"
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
// Note: the executable name is also used as the message queue name.
hgs
parents:
diff changeset
    29
_LIT( KExternalPlayerExe, "externalplayer.exe" );
hgs
parents:
diff changeset
    30
_LIT( KExternalPlayerExe2, "externalplayer2.exe" );
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
enum TExternalPlayerCommands
hgs
parents:
diff changeset
    33
    {
hgs
parents:
diff changeset
    34
    EExternalPlayer_StartPlayback,
hgs
parents:
diff changeset
    35
    EExternalPlayer_ExecuteOperation,
hgs
parents:
diff changeset
    36
    EExternalPlayer_MoveWindow,
hgs
parents:
diff changeset
    37
    EExternalPlayer_Shutdown
hgs
parents:
diff changeset
    38
    };
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
struct TStartPlayback
hgs
parents:
diff changeset
    41
    {
hgs
parents:
diff changeset
    42
    TInt x;
hgs
parents:
diff changeset
    43
    TInt y;
hgs
parents:
diff changeset
    44
    TInt width;
hgs
parents:
diff changeset
    45
    TInt height;
hgs
parents:
diff changeset
    46
    TInt idOfParentWindowGroup;
hgs
parents:
diff changeset
    47
    bool locationIsFilename;
hgs
parents:
diff changeset
    48
    TInt length;
hgs
parents:
diff changeset
    49
    unsigned char name[200];
hgs
parents:
diff changeset
    50
    };
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
struct TStartPlaybackReturn
hgs
parents:
diff changeset
    53
    {
hgs
parents:
diff changeset
    54
    TInt windowGroupId;
hgs
parents:
diff changeset
    55
    };
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
struct TExecuteOperation
hgs
parents:
diff changeset
    58
    {
hgs
parents:
diff changeset
    59
    TInt operation;
hgs
parents:
diff changeset
    60
    };
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
struct TMoveWindow
hgs
parents:
diff changeset
    63
    {
hgs
parents:
diff changeset
    64
    TInt centerX;
hgs
parents:
diff changeset
    65
    TInt centerY;
hgs
parents:
diff changeset
    66
    };
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
_LIT( KMsgQueuePrefix, "-msg=" );
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
// This is the client-side class for launching and controlling an external player executable.
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
class CExternalPlayer : public CBase, public MPlayerCommands
hgs
parents:
diff changeset
    73
    {
hgs
parents:
diff changeset
    74
public:
hgs
parents:
diff changeset
    75
    
hgs
parents:
diff changeset
    76
    ~CExternalPlayer()
hgs
parents:
diff changeset
    77
        {
hgs
parents:
diff changeset
    78
        Terminate();
hgs
parents:
diff changeset
    79
        }
hgs
parents:
diff changeset
    80
    
hgs
parents:
diff changeset
    81
    CExternalPlayer( RWsSession& aWs ) : iWs( aWs )
hgs
parents:
diff changeset
    82
        {        
hgs
parents:
diff changeset
    83
        }
hgs
parents:
diff changeset
    84
    
hgs
parents:
diff changeset
    85
    TInt SendMsg( TExternalPlayerCommands aMsg )
hgs
parents:
diff changeset
    86
        {
hgs
parents:
diff changeset
    87
        TRequestStatus status;
hgs
parents:
diff changeset
    88
        status = KRequestPending;
hgs
parents:
diff changeset
    89
        iProcess.Rendezvous( status );
hgs
parents:
diff changeset
    90
        
hgs
parents:
diff changeset
    91
        iMsgQueue.SendBlocking( aMsg );
hgs
parents:
diff changeset
    92
                
hgs
parents:
diff changeset
    93
        User::WaitForRequest( status );   
hgs
parents:
diff changeset
    94
        
hgs
parents:
diff changeset
    95
        return status.Int();
hgs
parents:
diff changeset
    96
        }
hgs
parents:
diff changeset
    97
    
hgs
parents:
diff changeset
    98
    TInt Launch( const TDesC&  aExeName, 
hgs
parents:
diff changeset
    99
                 RWindowGroup& aParentWindowGroup, 
hgs
parents:
diff changeset
   100
                 const TDesC&  aLocation,
hgs
parents:
diff changeset
   101
                 bool          aLocationIsFilename, // false means location is URL
hgs
parents:
diff changeset
   102
                 TPoint        aTopRight, 
hgs
parents:
diff changeset
   103
                 TSize         aSize )
hgs
parents:
diff changeset
   104
        {
hgs
parents:
diff changeset
   105
        // The base name for message queue and chunk is the name of the executable followed by the address of this instance.
hgs
parents:
diff changeset
   106
        TBuf<80> nameBase;
hgs
parents:
diff changeset
   107
        nameBase.Copy( aExeName );
hgs
parents:
diff changeset
   108
        nameBase.AppendFormat(_L("%08x"), this );
hgs
parents:
diff changeset
   109
        
hgs
parents:
diff changeset
   110
        TBuf<100> commandLineArguments;
hgs
parents:
diff changeset
   111
        commandLineArguments.Copy( KMsgQueuePrefix );
hgs
parents:
diff changeset
   112
        commandLineArguments.Append( nameBase );
hgs
parents:
diff changeset
   113
        
hgs
parents:
diff changeset
   114
        TInt err = iProcess.Create( aExeName, commandLineArguments );
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
        if( err == KErrNone )
hgs
parents:
diff changeset
   117
            {
hgs
parents:
diff changeset
   118
            aParentWindowGroup.AllowProcessToCreateChildWindowGroups( iProcess.SecureId() );
hgs
parents:
diff changeset
   119
        
hgs
parents:
diff changeset
   120
            iProcess.Resume();
hgs
parents:
diff changeset
   121
            
hgs
parents:
diff changeset
   122
            TRequestStatus status;
hgs
parents:
diff changeset
   123
            status = KRequestPending;
hgs
parents:
diff changeset
   124
            iProcess.Rendezvous( status );
hgs
parents:
diff changeset
   125
            User::WaitForRequest( status );
hgs
parents:
diff changeset
   126
            
hgs
parents:
diff changeset
   127
            err = status.Int();
hgs
parents:
diff changeset
   128
                    
hgs
parents:
diff changeset
   129
            if( err == KErrNone )
hgs
parents:
diff changeset
   130
                {  
hgs
parents:
diff changeset
   131
                err = iMsgQueue.OpenGlobal( nameBase );
hgs
parents:
diff changeset
   132
                }
hgs
parents:
diff changeset
   133
            
hgs
parents:
diff changeset
   134
            if( err == KErrNone )
hgs
parents:
diff changeset
   135
                {
hgs
parents:
diff changeset
   136
                nameBase.Append( _L("_chunk") );
hgs
parents:
diff changeset
   137
                err = iChunk.OpenGlobal( nameBase, EFalse );
hgs
parents:
diff changeset
   138
                }
hgs
parents:
diff changeset
   139
                
hgs
parents:
diff changeset
   140
            if( err == KErrNone )
hgs
parents:
diff changeset
   141
                {
hgs
parents:
diff changeset
   142
                iActive = true;
hgs
parents:
diff changeset
   143
                
hgs
parents:
diff changeset
   144
                // Send the start messages to the external player.
hgs
parents:
diff changeset
   145
                
hgs
parents:
diff changeset
   146
                TStartPlayback* chunk = (TStartPlayback*)iChunk.Base();
hgs
parents:
diff changeset
   147
                
hgs
parents:
diff changeset
   148
                TPtr8 filename( chunk->name, 0, 200 );
hgs
parents:
diff changeset
   149
                filename.Copy( aLocation );
hgs
parents:
diff changeset
   150
                chunk->length = filename.Length();            
hgs
parents:
diff changeset
   151
                chunk->locationIsFilename = aLocationIsFilename;
hgs
parents:
diff changeset
   152
                
hgs
parents:
diff changeset
   153
                chunk->x = aTopRight.iX;
hgs
parents:
diff changeset
   154
                chunk->y = aTopRight.iY;
hgs
parents:
diff changeset
   155
                chunk->width = aSize.iWidth;
hgs
parents:
diff changeset
   156
                chunk->height = aSize.iHeight;
hgs
parents:
diff changeset
   157
                chunk->idOfParentWindowGroup = aParentWindowGroup.Identifier();
hgs
parents:
diff changeset
   158
                err = SendMsg( EExternalPlayer_StartPlayback );
hgs
parents:
diff changeset
   159
                
hgs
parents:
diff changeset
   160
                if( err == KErrNone )
hgs
parents:
diff changeset
   161
                    {
hgs
parents:
diff changeset
   162
                    TStartPlaybackReturn* chunk = (TStartPlaybackReturn*)iChunk.Base();
hgs
parents:
diff changeset
   163
                    iWindowGroupId = chunk->windowGroupId;                            
hgs
parents:
diff changeset
   164
                    }
hgs
parents:
diff changeset
   165
                }
hgs
parents:
diff changeset
   166
            else
hgs
parents:
diff changeset
   167
                {
hgs
parents:
diff changeset
   168
                iProcess.Kill( KErrCancel );
hgs
parents:
diff changeset
   169
                iProcess.Close();     
hgs
parents:
diff changeset
   170
                }
hgs
parents:
diff changeset
   171
            
hgs
parents:
diff changeset
   172
            }
hgs
parents:
diff changeset
   173
        
hgs
parents:
diff changeset
   174
        return err;        
hgs
parents:
diff changeset
   175
        }
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
    // inherited from MPlayerCommands
hgs
parents:
diff changeset
   178
    TInt ExecuteOperation( TInt aOperation )
hgs
parents:
diff changeset
   179
        {
hgs
parents:
diff changeset
   180
        TInt err = KErrNone;
hgs
parents:
diff changeset
   181
        
hgs
parents:
diff changeset
   182
        if( iActive )
hgs
parents:
diff changeset
   183
            {
hgs
parents:
diff changeset
   184
            TExecuteOperation* chunk = (TExecuteOperation*)iChunk.Base();
hgs
parents:
diff changeset
   185
            chunk->operation = aOperation;            
hgs
parents:
diff changeset
   186
            err = SendMsg( EExternalPlayer_ExecuteOperation );
hgs
parents:
diff changeset
   187
            }
hgs
parents:
diff changeset
   188
        
hgs
parents:
diff changeset
   189
        return err;
hgs
parents:
diff changeset
   190
        }
hgs
parents:
diff changeset
   191
    
hgs
parents:
diff changeset
   192
    // inherited from MPlayerCommands
hgs
parents:
diff changeset
   193
    void MoveWindow( TPoint aNewCenter )
hgs
parents:
diff changeset
   194
        {
hgs
parents:
diff changeset
   195
        if( iActive )
hgs
parents:
diff changeset
   196
            {
hgs
parents:
diff changeset
   197
            TMoveWindow* chunk = (TMoveWindow*)iChunk.Base();
hgs
parents:
diff changeset
   198
            chunk->centerX = aNewCenter.iX;            
hgs
parents:
diff changeset
   199
            chunk->centerY = aNewCenter.iY;            
hgs
parents:
diff changeset
   200
            SendMsg( EExternalPlayer_MoveWindow );
hgs
parents:
diff changeset
   201
            }
hgs
parents:
diff changeset
   202
        }
hgs
parents:
diff changeset
   203
    
hgs
parents:
diff changeset
   204
    void SetOrdinalPosition( TInt /*aPosition*/ )
hgs
parents:
diff changeset
   205
        {
hgs
parents:
diff changeset
   206
        if( iActive )
hgs
parents:
diff changeset
   207
            {        
hgs
parents:
diff changeset
   208
// TODO: DEBUG THIS.  HOW DOES WINDOW GROUP ORDINAL POSITION RELATE TO WINDOW ORDINAL POSITION?        
hgs
parents:
diff changeset
   209
//            iWs.SetWindowGroupOrdinalPosition( iWindowGroupId, aPosition );
hgs
parents:
diff changeset
   210
            }
hgs
parents:
diff changeset
   211
        }
hgs
parents:
diff changeset
   212
    
hgs
parents:
diff changeset
   213
    void Terminate()
hgs
parents:
diff changeset
   214
        {
hgs
parents:
diff changeset
   215
        if( iActive )
hgs
parents:
diff changeset
   216
            {
hgs
parents:
diff changeset
   217
            SendMsg( EExternalPlayer_Shutdown );
hgs
parents:
diff changeset
   218
        
hgs
parents:
diff changeset
   219
            iProcess.Close();
hgs
parents:
diff changeset
   220
            iMsgQueue.Close();
hgs
parents:
diff changeset
   221
            
hgs
parents:
diff changeset
   222
            iActive = false;
hgs
parents:
diff changeset
   223
            }
hgs
parents:
diff changeset
   224
        }
hgs
parents:
diff changeset
   225
    
hgs
parents:
diff changeset
   226
private:
hgs
parents:
diff changeset
   227
    
hgs
parents:
diff changeset
   228
    RWsSession&                        iWs;
hgs
parents:
diff changeset
   229
    RProcess                           iProcess;
hgs
parents:
diff changeset
   230
    bool                               iActive;
hgs
parents:
diff changeset
   231
    RMsgQueue<TExternalPlayerCommands> iMsgQueue;
hgs
parents:
diff changeset
   232
    RChunk                             iChunk;
hgs
parents:
diff changeset
   233
    TInt                               iWindowGroupId;
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
    };
hgs
parents:
diff changeset
   236
    
hgs
parents:
diff changeset
   237
#endif
hgs
parents:
diff changeset
   238