dvrengine/CommonRecordingEngine/inc/CCREngine.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:20:37 +0100
branchRCL_3
changeset 23 13a33d82ad98
parent 0 822a42b6c3f1
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201029 Kit: 201035

/*
* Copyright (c) 2007 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:    Engine part of the engine. Engineered to keep count*
*/




#ifndef CCRENGINE_H
#define CCRENGINE_H

//  INCLUDES
#include "CCRConnection.h"
#include <ipvideo/CRTypeDefs.h>
#include <e32base.h>

// CONSTANTS
// None

// MACROS
// None

// DATA TYPES
// None
    
// FORWARD DECLARATIONS
class CAsyncCallBack;
class CCRSession;
class CCRStreamingSession;
class CCRClientInformer;
class CRtpClipHandler;

// CLASS DECLARATION

/**
*  Server's bookkeeping part: knows what clients there are and thru which
*  client sessions, what streaming sessions there are and passes commands
*  to those sessions and sinks. 
*
*  @lib CommonRecordingEngine.lib
*  @since Series 60 3.0
*/
class CCREngine : public CObject,
                  public MCRConnectionObserver
    {

public: // Constructors and destructor

    /**
    * Two-phased constructor.
    * @return CCREngine pointer to CCREngine class
    */
    static CCREngine* NewL( void );

    /**
    * Destructor.
    */
    virtual ~CCREngine();

public: // New functions

    /**
    * Does the general message handling.
    * @since Series 60 3.0
    * @param aMessage contains data from the client.
    * @return none.
    */
    void GeneralServiceL( const RMessage2& aMessage );

    /**
    * Method that streams call to ask for resignation. 
    * @since Series 60 3.0
    * @param aSession is pointer to streamingsession that wants to quit.
    * @return none.
    */
    void SessionStop( CCRStreamingSession* aSession ); 
    
private: // Constructors and destructor

    /**
    * C++ default constructor.
    */
    CCREngine( void );

    /**
    * By default Symbian 2nd phase constructor is private.
    */
    void ConstructL();
            
public: // Methods from base classes

    /**
    * From MCRConnectionObserver.
    * receives notifications of connection status changes,
    * used to clear heuristics on streaming capabilities.
    * @since Series 60 3.0
    * @param aSessionId a session id.
    * @param aStatus is the new status of the connection.
    * @param aErr contains error code if new status is failure status.
    * @return none.
    */
    void ConnectionStatusChange( TInt aSessionId,
                                 TCRConnectionStatus aStatus,
                                 TInt aErr );
    
private: // New methods

    /**
    * Verifies needed cababilities of DVR client user.
    * @since Series 60 3.0
    * @param aMessage contains data from the client.
    * @return None.
    */
    void VerifyCapabilitiesL( const RMessage2& aMessage );

    /**
    * Sets connection.
    * @since Series 60 3.0
    * @param aIap ?.
    * @return KErrNone if succesful, otherwise system wide error code.
    */
    TInt SetConnectionId( const SCRRtspIapParams& aIap );
    
    /**
    * Cancel connetion set.
    * @since Series 60 3.0
    * @return KErrNone if succesful, otherwise system wide error code.
    */
    TInt CancelSetConnectionId();
    
    /**
    * Starts RTSP URL streaming.
    * @since Series 60 3.0
    * @param aRtspParams a RTPS params.
    * @return a session definition checksum.
    */
    TUint PlayRtspUrlL( const SCRRtspParams& aRtspParams );

    /**
    * Starts DVB-H live streaming.
    * @since Series 60 3.0
    * @param aLiveParams is set of parameters required for DVB-H.
    * @return a session definition checksum.
    */
    TUint PlayDvbhLiveL( const SCRLiveParams& aLiveParams );

    /**
    * Change service (channel) of DVB-H live stream.
    * @since Series 60 3.0
    * @param aCurrentSessionChk a current service session checksum.
    * @param aLiveParams is set of parameters required for DVB-H.
    * @return a session definition checksum.
    */
    TUint ChangeDvbhServiceL( const TUint aSessionChk,
                              const SCRLiveParams& aLiveParams );

    /**
    * Starts RTP file format playing.
    * @since Series 60 3.0
    * @param aRtpParams a RTP clip play params.
    * @return a session definition checksum.
    */
    TUint PlayRtpFileL( const SCRRtpPlayParams& aRtpParams );

    /**
    * Starts RTP file format playing.
    * @since Series 60 3.0
    * @param aFileHandle a open file handle for RTP file.
    * @return a session definition checksum.
    */
    TUint PlayRtpFileL( const RFile& aFileHandle );

    /**
    * Starts recording of current stream.
    * @since Series 60 3.0
    * @param aSessionChk a session defination checksum.
    * @param aRecordParams a recording parameters.
    * @return none.
    */
    void RecordCurrentStreamL( const TUint aSessionChk,
                               const SCRRecordParams& aRecordParams );
    
    /**
    * Starts recording of RTSP stream.
    * @since Series 60 3.0
    * @param aRtspUrl is set of parameters required for rtsp.
    * @param aRecordParams a recording parameters.
    * @return a session definition checksum.
    */
    TUint RecordRtspStreamL( const SCRRtspParams& aRtspUrl,
                             const SCRRecordParams& aRecordParams );
    
    /**
    * Starts recording of DVB-H stream.
    * @since Series 60 3.0
    * @param aLiveParams is set of parameters required for DVB-H.
    * @param aRecordParams a recording parameters.
    * @return a session definition checksum.
    */
    TUint RecordDvbhStreamL( const SCRLiveParams& aLiveParams,
                             const SCRRecordParams& aRecordParams );
    
    /**
    * Pauses/Resumes current recording.
    * @since Series 60 3.0
    * @param aSessionChk a session defination checksum.
    * @param aStart a start or end pausing.
    * @return KErrNone if succesful, otherwise system wide error code.
    */
    TInt PauseRecordStream( const TUint aSessionChk,
                            const TBool& aStart );

    /**
    * Stops current recording.
    * @since Series 60 3.0
    * @param aSessionChk a session defination checksum.
    * @return KErrNone if succesful, otherwise system wide error code.
    */
    TInt StopRecordStream( const TUint aSessionChk );

    /**
    * Starts time shifting.
    * @since Series 60 3.0
    * @param aSessionChk a session defination checksum.
    * @return KErrNone if succesful, otherwise system wide error code.
    */
    TInt StartTimeShiftL( const TUint aSessionChk );

    /**
    * Stops time shifting.
    * @since Series 60 3.0
    * @param aTimeShiftChk a session definition checksum.
    * @param aCurrentChk a session definition of existing session.
    * @return KErrNone if succesful, otherwise system wide error code.
    */
    TInt StopTimeShift( const TUint aTimeShiftChk,
                        const TUint aCurrentChk );

    /**
    * Play command for wanted source.
    * @since Series 60 3.0
    * @param aSessionChk a session definition checksum.
    * @param aStartPos is start position in seconds.
    * @param aEndPos is end position in seconds.
    * @return KErrNone if succesful, otherwise system wide error code.
    */
    TInt PlayCommand( const TUint aSessionChk,
                      const TReal aStartPos,
                      const TReal aEndPos );

    /**
    * Pause command for wanted source.
    * @since Series 60 3.0
    * @param aSessionChk a session definition checksum.
    * @return KErrNone if succesful, otherwise system wide error code.
    */
    TInt PauseCommand( const TUint aSessionChk );

    /**
    * Stop command for wanted source.
    * @since Series 60 3.0
    * @param aSessionChk a session definition checksum.
    * @return KErrNone if succesful, otherwise system wide error code.
    */
    TInt StopCommand( const TUint aSessionChk );

    /**
    * Setter for source position.
    * @since Series 60 3.0
    * @param aSessionChk a session defination checksum.
    * @param aPosition a current play position of the clip.
    * @return KErrNone if succesful, otherwise system wide error code.
    */
    TInt SetPosition( const TUint aSessionChk,
                      const TInt64 aPosition );

    /**
    * Getter for source position.
    * @since Series 60 3.0
    * @param aSessionChk a session defination checksum.
    * @param aPosition a current play position of the clip.
    * @param aDuration a duration of the clip.
    * @return KErrNone if succesful, otherwise system wide error code.
    */
    TInt GetPosition( const TUint aSessionChk,
                      TInt64& aPosition,
                      TInt64& aDuration );

    /**
    * Closes wanted source and all sinks.
    * @since Series 60 3.0
    * @param aSessionChk a session definition checksum.
    * @return KErrNone if succesful, otherwise system wide error code.
    */
    TInt CloseSession( const TUint aSessionChk );

    /**
    * Emulates live source from a .rtp clip.
    * @since Series 60 3.0
    * @param none.
    * @return a session definition checksum.
    */
    TUint PlayNullSourceL();
    
    /**
    * Sends RTSP stream packets to null sink.
    * @since Series 60 3.0
    * @param aRtspParams a RTPS params.
    * @return a session definition checksum.
    */
    TUint PlayRtspUrlToNullSinkL( const SCRRtspParams& aRtspParams );
    
    /**
    * Creates connection.
    * @since Series 60 3.0
    * @param none.
    * @return none.
    */
    void CreateConnectionL( void ); 
    
    /**
    * Creates RTP clip handler.
    * @since Series 60 3.0
    * @param none.
    * @return none.
    */
    void CreateClipHandlerL( void ); 
    
    /**
    * Verifies if RTSP session with params is already available.
    * @since Series 60 3.0
    * @param aRtspParams a RTPS params.
    * @return an index to sessions array if session found,
              otherwise KErrNotFound.
    */
    TInt VerifyRtspSessionL( const SCRRtspParams& aRtspParams );

    /**
    * Verifies if DVB-H session with params is already available.
    * @since Series 60 3.0
    * @param aLiveParams is set of parameters required for DVB-H.
    * @return an index to sessions array if session found,
              otherwise KErrNotFound.
    */
    TInt VerifyDvbhSessionL( const SCRLiveParams& aLiveParams );

    /**
    * Verifies if DVB-H session with params is already available.
    * @since Series 60 3.0
    * @param aRtpParams a RTP clip play params.
    * @return an index to sessions array if session found,
              otherwise KErrNotFound.
    */
    TInt VerifyRtpFileSessionL( const SCRRtpPlayParams& aRtpParams );

    /**
    * Verifies if session with defination name is available.
    * @since Series 60 3.0
    * @param aFileHandle a open file handle for RTP file.
    * @return an index to sessions array if names match,
              otherwise KErrNotFound.
    */
    TInt VerifyRtpFileSessionL( const RFile& aFileHandle );

    /**
    * Verifies if session with defination name is available.
    * @since Series 60 3.0
    * @param aName a definition name of the session.
    * @return an index to sessions array if names match,
              otherwise KErrNotFound.
    */
    TInt VerifySession( const TDesC& aName );

    /**
    * Verifies if session with definition checksum is available.
    * @since Series 60 3.0
    * @param aSessionChk a session checksum to verify for.
    * @return an index to sessions array if names match,
              otherwise KErrNotFound.
    */
    TInt VerifySession( const TUint aSessionChk );

    /**
    * Creates recording sin base on file format.
    * @since Series 60 3.0
    * @param aSessionIndex a session index.
    * @param aRecordParams a recording parameters.
    * @return none.
    */
    void CreateRecordingSinkL( const TInt aSessionIndex,
                               const SCRRecordParams& aRecordParams ); 
    
    /**
    * Static callback called via CAsyncCallBack to initiate cleaning of a sessions.
    * @since Series 60 3.0
    * @param aThis ?.
    * @return KErrNone if succesful, otherwise system wide error code.
    */
    static TInt SessionStopCallBack( TAny* aThis ); 
    
    /**
    * Method for cleaning a sessions. Called from StreamStopCallBack.
    * @since Series 60 3.0
    * @param none.
    * @return none.
    */
    void DoSessionStop( void ); 
    
    /**
    * Method for deleting RTP clip handler if it is not used in any session.
    * @since Series 60 3.0
    * @param aCurrentSessionIndex a index of active session.
    * @return none.
    */
    void DeleteClipHandler( const TInt aCurrentSessionIndex ); 
    
    /**
    * Reads non unicode descriptor buffer to client address space.
    * @since Series 60 3.0
    * @param aMessage an object which encapsulates a client request.
    * @param aParam a index value identifying the argument.
    * @param aDes a buffer to be read.
    * @return None.
    */
    void Read( const RMessage2& aMessage, 
               const TInt& aParam,
               TDes8& aDes );

    /**
    * Reads unicode descriptor buffer to client address space.
    * @since Series 60 3.0
    * @param aMessage an object which encapsulates a client request.
    * @param aParam a index value identifying the argument.
    * @param aDes a buffer to be read.
    * @return None.
    */
    void Read( const RMessage2& aMessage, 
               const TInt& aParam,
               TDes16& aDes );

    /**
    * Writes non unicode descriptor buffer to client address space.
    * @since Series 60 3.0
    * @param aMessage an object which encapsulates a client request.
    * @param aParam a index value identifying the argument.
    * @param aDes a data to be written.
    * @return None.
    */
    void Write( const RMessage2& aMessage, 
                const TInt& aParam,
                const TDesC8& aDes );

    /**
    * Writes unicode descriptor buffer to client address space.
    * @since Series 60 3.0
    * @param aMessage an object which encapsulates a client request.
    * @param aPtr a pointer to client address space.
    * @param aDes a data to be written.
    * @return None.
    */
    void Write( const RMessage2& aMessage, 
                const TInt& aParam,
                const TDesC16& aDes );

    /**
    * Method for panicing a client.
    * @since Series 60 3.0
    * @param aPanic is the panic reason, essentially a symbian error code.
    * @aMessage is the message causing the panic.
    * @return none.
    */
    void PanicClient( TInt aPanic, 
                      const RMessage2& aMessage );

private: // Data    
    
    /**
    * Name of the queue.
    */
    HBufC* iQueueName;
    
    /**
    * Callstack-cutter for cleanup purpose.
    */
    CAsyncCallBack* iCleanUp;
    
    /**
    * Connection manager.
    */
    CCRConnection* iConnection;
    
    /**
    * Clip handler for RTP clip.
    */
    CRtpClipHandler* iClipHandler;

    /**
    * Sends messages to client's message queue
    */
    CCRClientInformer* iInformer;

    /**
    * Socket server.
    */
    RSocketServ iSockServer;
    
    /**
    * Streamong sessions.
    */
    RPointerArray<CCRStreamingSession> iSessions;
    
    /**
    * Array of sessions that have declared that they want to be deleted
    */
    RPointerArray<CCRStreamingSession> iSessionsToDelete; 
    
    /**
    * Loopback port.
    */
    TInt iLoopbackPort;
    
    };

#endif // CCRENGINE_H

// End of file