--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipHandler/EABI/DvrRtpClipHandlerU.DEF Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,48 @@
+EXPORTS
+ _ZN15CRtpClipHandler12StopPlayBackEij @ 1 NONAME
+ _ZN15CRtpClipHandler13SetSeekPointLEj @ 2 NONAME
+ _ZN15CRtpClipHandler13StopRecordingEi @ 3 NONAME
+ _ZN15CRtpClipHandler14NextClipGroupLEv @ 4 NONAME
+ _ZN15CRtpClipHandler14SaveNextGroupLER5TPtr8jRKN21MRtpFileWriteObserver14TRtpSaveActionE @ 5 NONAME
+ _ZN15CRtpClipHandler14StartPlayBackLERK16SCRRtpPlayParamsi @ 6 NONAME
+ _ZN15CRtpClipHandler14StartPlayBackLERK5RFile @ 7 NONAME
+ _ZN15CRtpClipHandler15StartRecordingLERKN21MRtpFileWriteObserver13SRtpRecParamsERKNS0_14TRtpSaveActionE @ 8 NONAME
+ _ZN15CRtpClipHandler15TimeShiftPauseLEv @ 9 NONAME
+ _ZN15CRtpClipHandler16DefaultRecParamsERN21MRtpFileWriteObserver13SRtpRecParamsEi @ 10 NONAME
+ _ZN15CRtpClipHandler16ResumeRecordingLEv @ 11 NONAME
+ _ZN15CRtpClipHandler19UpdateRecordEndTimeERK5TTime @ 12 NONAME
+ _ZN15CRtpClipHandler20RegisterReadObserverEP20MRtpFileReadObserver @ 13 NONAME
+ _ZN15CRtpClipHandler21RegisterWriteObserverEP21MRtpFileWriteObserver @ 14 NONAME
+ _ZN15CRtpClipHandler4NewLEv @ 15 NONAME
+ _ZN15CRtpClipHandlerD0Ev @ 16 NONAME
+ _ZN15CRtpClipHandlerD1Ev @ 17 NONAME
+ _ZN15CRtpClipHandlerD2Ev @ 18 NONAME
+ _ZN15CRtpClipManager12ProtectClipLERK7TDesC16i @ 19 NONAME
+ _ZN15CRtpClipManager14FixMetaHeaderLEP22MRtpClipRepairObserverRK7TDesC16 @ 20 NONAME
+ _ZN15CRtpClipManager14FixMetaHeaderLERK7TDesC16 @ 21 NONAME
+ _ZN15CRtpClipManager15GetClipDetailsLER5RFileRNS_15SRtpClipDetailsE @ 22 NONAME
+ _ZN15CRtpClipManager15GetClipDetailsLERK7TDesC16RNS_15SRtpClipDetailsE @ 23 NONAME
+ _ZN15CRtpClipManager17DeleteRtpRepairerEP22MRtpClipRepairObserver @ 24 NONAME
+ _ZN15CRtpClipManager4NewLEv @ 25 NONAME
+ _ZN15CRtpClipManager5NewLCEv @ 26 NONAME
+ _ZN15CRtpClipManagerD0Ev @ 27 NONAME
+ _ZN15CRtpClipManagerD1Ev @ 28 NONAME
+ _ZN15CRtpClipManagerD2Ev @ 29 NONAME
+ _ZNK15CRtpClipHandler11GetClipSdpLEv @ 30 NONAME
+ _ZNK15CRtpClipHandler13WritingActiveEv @ 31 NONAME
+ _ZNK15CRtpClipHandler16GetCurrentLengthEv @ 32 NONAME
+ _ZTI10CRtpToFile @ 33 NONAME ; #<TI>#
+ _ZTI12CRtpFileBase @ 34 NONAME ; #<TI>#
+ _ZTI12CRtpFromFile @ 35 NONAME ; #<TI>#
+ _ZTI14CRtpMetaHeader @ 36 NONAME ; #<TI>#
+ _ZTI15CRtpClipHandler @ 37 NONAME ; #<TI>#
+ _ZTI15CRtpClipManager @ 38 NONAME ; #<TI>#
+ _ZTI16CRtpClipRepairer @ 39 NONAME ; #<TI>#
+ _ZTV10CRtpToFile @ 40 NONAME ; #<VT>#
+ _ZTV12CRtpFileBase @ 41 NONAME ; #<VT>#
+ _ZTV12CRtpFromFile @ 42 NONAME ; #<VT>#
+ _ZTV14CRtpMetaHeader @ 43 NONAME ; #<VT>#
+ _ZTV15CRtpClipHandler @ 44 NONAME ; #<VT>#
+ _ZTV15CRtpClipManager @ 45 NONAME ; #<VT>#
+ _ZTV16CRtpClipRepairer @ 46 NONAME ; #<VT>#
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipHandler/bwins/DvrRtpClipHandleru.def Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,30 @@
+EXPORTS
+ ??1CRtpClipHandler@@UAE@XZ @ 1 NONAME ; CRtpClipHandler::~CRtpClipHandler(void)
+ ??1CRtpClipManager@@UAE@XZ @ 2 NONAME ; CRtpClipManager::~CRtpClipManager(void)
+ ?DefaultRecParams@CRtpClipHandler@@QAEXAAVSRtpRecParams@MRtpFileWriteObserver@@H@Z @ 3 NONAME ; void CRtpClipHandler::DefaultRecParams(class MRtpFileWriteObserver::SRtpRecParams &, int)
+ ?DeleteRtpRepairer@CRtpClipManager@@QAEXPAVMRtpClipRepairObserver@@@Z @ 4 NONAME ; void CRtpClipManager::DeleteRtpRepairer(class MRtpClipRepairObserver *)
+ ?FixMetaHeaderL@CRtpClipManager@@QAEXABVTDesC16@@@Z @ 5 NONAME ; void CRtpClipManager::FixMetaHeaderL(class TDesC16 const &)
+ ?FixMetaHeaderL@CRtpClipManager@@QAEXPAVMRtpClipRepairObserver@@ABVTDesC16@@@Z @ 6 NONAME ; void CRtpClipManager::FixMetaHeaderL(class MRtpClipRepairObserver *, class TDesC16 const &)
+ ?GetClipDetailsL@CRtpClipManager@@QAEXAAVRFile@@AAVSRtpClipDetails@1@@Z @ 7 NONAME ; void CRtpClipManager::GetClipDetailsL(class RFile &, class CRtpClipManager::SRtpClipDetails &)
+ ?GetClipDetailsL@CRtpClipManager@@QAEXABVTDesC16@@AAVSRtpClipDetails@1@@Z @ 8 NONAME ; void CRtpClipManager::GetClipDetailsL(class TDesC16 const &, class CRtpClipManager::SRtpClipDetails &)
+ ?GetClipSdpL@CRtpClipHandler@@QBEPAVHBufC8@@XZ @ 9 NONAME ; class HBufC8 * CRtpClipHandler::GetClipSdpL(void) const
+ ?GetCurrentLength@CRtpClipHandler@@QBEIXZ @ 10 NONAME ; unsigned int CRtpClipHandler::GetCurrentLength(void) const
+ ?NewL@CRtpClipHandler@@SAPAV1@XZ @ 11 NONAME ; class CRtpClipHandler * CRtpClipHandler::NewL(void)
+ ?NewL@CRtpClipManager@@SAPAV1@XZ @ 12 NONAME ; class CRtpClipManager * CRtpClipManager::NewL(void)
+ ?NewLC@CRtpClipManager@@SAPAV1@XZ @ 13 NONAME ; class CRtpClipManager * CRtpClipManager::NewLC(void)
+ ?NextClipGroupL@CRtpClipHandler@@QAEXXZ @ 14 NONAME ; void CRtpClipHandler::NextClipGroupL(void)
+ ?ProtectClipL@CRtpClipManager@@QAEXABVTDesC16@@H@Z @ 15 NONAME ; void CRtpClipManager::ProtectClipL(class TDesC16 const &, int)
+ ?RegisterReadObserver@CRtpClipHandler@@QAEXPAVMRtpFileReadObserver@@@Z @ 16 NONAME ; void CRtpClipHandler::RegisterReadObserver(class MRtpFileReadObserver *)
+ ?RegisterWriteObserver@CRtpClipHandler@@QAEXPAVMRtpFileWriteObserver@@@Z @ 17 NONAME ; void CRtpClipHandler::RegisterWriteObserver(class MRtpFileWriteObserver *)
+ ?ResumeRecordingL@CRtpClipHandler@@QAEXXZ @ 18 NONAME ; void CRtpClipHandler::ResumeRecordingL(void)
+ ?SaveNextGroupL@CRtpClipHandler@@QAEXAAVTPtr8@@IABW4TRtpSaveAction@MRtpFileWriteObserver@@@Z @ 19 NONAME ; void CRtpClipHandler::SaveNextGroupL(class TPtr8 &, unsigned int, enum MRtpFileWriteObserver::TRtpSaveAction const &)
+ ?SetSeekPointL@CRtpClipHandler@@QAEXI@Z @ 20 NONAME ; void CRtpClipHandler::SetSeekPointL(unsigned int)
+ ?StartPlayBackL@CRtpClipHandler@@QAEXABUSCRRtpPlayParams@@H@Z @ 21 NONAME ; void CRtpClipHandler::StartPlayBackL(struct SCRRtpPlayParams const &, int)
+ ?StartPlayBackL@CRtpClipHandler@@QAEXABVRFile@@@Z @ 22 NONAME ; void CRtpClipHandler::StartPlayBackL(class RFile const &)
+ ?StartRecordingL@CRtpClipHandler@@QAEXABVSRtpRecParams@MRtpFileWriteObserver@@ABW4TRtpSaveAction@3@@Z @ 23 NONAME ; void CRtpClipHandler::StartRecordingL(class MRtpFileWriteObserver::SRtpRecParams const &, enum MRtpFileWriteObserver::TRtpSaveAction const &)
+ ?StopPlayBack@CRtpClipHandler@@QAEXHI@Z @ 24 NONAME ; void CRtpClipHandler::StopPlayBack(int, unsigned int)
+ ?StopRecording@CRtpClipHandler@@QAEXH@Z @ 25 NONAME ; void CRtpClipHandler::StopRecording(int)
+ ?TimeShiftPauseL@CRtpClipHandler@@QAEXXZ @ 26 NONAME ; void CRtpClipHandler::TimeShiftPauseL(void)
+ ?UpdateRecordEndTime@CRtpClipHandler@@QAEXABVTTime@@@Z @ 27 NONAME ; void CRtpClipHandler::UpdateRecordEndTime(class TTime const &)
+ ?WritingActive@CRtpClipHandler@@QBEHXZ @ 28 NONAME ; int CRtpClipHandler::WritingActive(void) const
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipHandler/group/DvrRtpClipHandler.mmp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,49 @@
+/*
+* 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: Symbian style build specification for DvrRtpClipHandler.dll.*
+*/
+
+
+
+#include <platform_paths.hrh>
+
+TARGET DvrRtpClipHandler.dll
+TARGETTYPE dll
+UID 0x1000008d 0x1020844B
+
+CAPABILITY ALL -TCB
+VENDORID VID_DEFAULT
+
+SOURCEPATH ../src
+SOURCE CRtpClipHandler.cpp
+SOURCE CRtpClipManager.cpp
+SOURCE CRtpClipRepairer.cpp
+SOURCE CRtpFileBase.cpp
+SOURCE CRtpToFile.cpp
+SOURCE CRtpFromFile.cpp
+SOURCE CRtpMetaHeader.cpp
+
+USERINCLUDE ../inc
+USERINCLUDE ../../inc
+USERINCLUDE ../../DvrRtpUtils/inc
+USERINCLUDE ../../../../conf
+
+MW_LAYER_SYSTEMINCLUDE
+
+LIBRARY euser.lib // Common
+LIBRARY bafl.lib // Bafl utils
+LIBRARY efsrv.lib // File server
+LIBRARY DvrRtpUtils.lib // DVR rtp utils
+LIBRARY flogger.lib // Debug logger
+LIBRARY PlatformEnv.lib
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipHandler/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,29 @@
+/*
+* 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: Component description file for DvrRtpClipHandler.dll.*
+*/
+
+
+
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+PRJ_EXPORTS
+../rom/dvrrtpcliphandler.iby CORE_MW_LAYER_IBY_EXPORT_PATH(dvrrtpcliphandler.iby)
+
+PRJ_MMPFILES
+DvrRtpClipHandler.mmp
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipHandler/inc/CRtpClipRepairer.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,206 @@
+/*
+* 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: RTP clip repairer for common recording engine.*
+*/
+
+
+
+
+#ifndef CRTPCLIPREPAIRER_H
+#define CRTPCLIPREPAIRER_H
+
+// INCLUDES
+#include <ipvideo/CRtpFileBase.h>
+#include "CCRRtpFileSource.h"
+#include <ipvideo/MRtpClipRepairObserver.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CRtpMetaHeader;
+
+// CLASS DECLARATION
+
+/**
+* Repairs corrupted DVB-H RTP clip.
+*
+* @lib DvrRtpClipHandler.lib
+* @since Series 60 3.0
+*/
+class CRtpClipRepairer : public CRtpFileBase
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @since Series 60 3.0
+ * @param aObs observer for repair status
+ * @return None.
+ */
+ static CRtpClipRepairer* NewL( MRtpClipRepairObserver* aObs );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CRtpClipRepairer();
+
+public: // New functions
+
+ /**
+ * Check if corrupted meta header can be fixed.
+ * @since Series 60 3.0
+ * @param aClipName a full path of the clip.
+ * @return None.
+ */
+ void CheckMetaHeaderL( const TDesC& aClipName );
+
+ /**
+ * Getter for the clip name under repairing.
+ * @since Series 60 3.0
+ * @return a full path of the clip under repairing.
+ */
+ TPtrC CurrentClipName();
+
+private: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ * @since Series 60 3.0
+ * @param aObs observer for repair status
+ */
+ CRtpClipRepairer( MRtpClipRepairObserver* aObs );
+
+ /**
+ * Symbian 2nd phase constructor can leave and is private by default.
+ */
+ void ConstructL();
+
+private: // Functions from base classes
+
+ /**
+ * From CRtpFileBase.
+ * Called when request completion event occurs.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void RunL();
+
+ /**
+ * From CRtpFileBase.
+ * Handles a leave occurring in the request completion event handler RunL().
+ * @since Series 60 3.0
+ * @param aError the leave code.
+ * @return a status of function.
+ */
+ TInt RunError( TInt aError );
+
+ /**
+ * From CRtpFileBase : Called when request completion event cancelled.
+ * @since Series 60 3.0
+ * @param none.
+ * @return None.
+ */
+ void DoCancel();
+
+private: // New functions
+
+ /**
+ * Veryfies that seek header and array are valid.
+ * @since Series 60 3.0
+ * @param none.
+ * @return true if are, otherwise false.
+ */
+ TBool ValidSeekHeaderL();
+
+ /**
+ * Scans whole clip and updates seek array for it.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void UpdateSeekArrayL();
+
+ /**
+ * Activates asyncronous group header reading.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void ReadNextGroupHeaderFromFileL();
+
+ /**
+ * Appends rec groups to seek array in 30s interval.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void GroupToSeekArrayL();
+
+ /**
+ * Adds special packet to the end.
+ * @since Series 60 3.0
+ * @param aType a type of special packet.
+ * @return none.
+ */
+ void AddSpecialPacketL( const MRtpFileWriteObserver::TRtpType aType );
+
+ /**
+ * Saves readed seek array.
+ * @since Series 60 3.0
+ * @param aError a error code.
+ * @return none.
+ */
+ void FinalizeSeekArrayL( const TInt aError );
+
+private: // Data
+
+ /**
+ * Repair observer.
+ */
+ MRtpClipRepairObserver* iObs;
+
+ /**
+ * File data buffer.
+ */
+ HBufC8* iFileData;
+
+ /**
+ * Meta header.
+ */
+ CRtpMetaHeader* iMetaHeader;
+
+ /**
+ * Last group time.
+ */
+ TUint iLastGroupTime;
+
+ /**
+ * Seek array point.
+ */
+ TInt iSeekArrayPoint;
+
+ };
+
+#endif // CRTPCLIPREPAIRER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipHandler/inc/CRtpFromFile.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,329 @@
+/*
+* 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: RTP file read format for Common Recording Engine.*
+*/
+
+
+
+
+
+#ifndef __CRTPFROMFILE_H
+#define __CRTPFROMFILE_H
+
+// INCLUDES
+#include <ipvideo/CRtpFileBase.h>
+#include <ipvideo/MRtpFileReadObserver.h>
+#include "MRtpTimerObserver.h"
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CRtpToFile;
+class CRtpTimer;
+
+// CLASS DECLARATION
+
+/**
+* RTP format read functionalities for RTP Clip Handler.
+*
+* @lib RtpClipHandler.lib
+* @since Series 60 3.0
+*/
+class CRtpFromFile : public CRtpFileBase,
+ public MRtpTimerObserver
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @param aReadObs a reference to file read observer.
+ * @param aToFile a pointer to RTP save object.
+ * @return pointer to CRtpFromFile class.
+ */
+ static CRtpFromFile* NewL( MRtpFileReadObserver& aReadObs,
+ CRtpToFile* aToFile );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CRtpFromFile();
+
+public: // New functions
+
+ /**
+ * Initiates RTP packet reading.
+ * @since Series 60 3.0
+ * @param aClipPath a full path of the clip.
+ * @param aVersion a version of the clip.
+ * @param aTimeShift a mode selection.
+ * @return none.
+ */
+ void InitRtpReadL( const TDesC& aClipPath,
+ TInt8& aVersion,
+ const TBool aTimeShift );
+
+ /**
+ * Initiates RTP packet reading.
+ * @since Series 60 3.0
+ * @param aRtpHandle a open file handle for RTP file.
+ * @param aVersion a version of the clip.
+ * @param aTimeShift a mode selection.
+ * @return none.
+ */
+ void InitRtpReadL( const RFile& aFileHandle,
+ TInt8& aVersion );
+
+ /**
+ * Swaps new clip for RTP packet reading.
+ * @since Series 60 3.0
+ * @param aClipPath a full path of clip.
+ * @return a version of the clip.
+ */
+ TInt8 SwapClipL( const TDesC& aClipPath );
+
+ /**
+ * Getter for SDP data from the clip.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a buffer keeping SDD data.
+ */
+ HBufC8* GetClipSdpL();
+
+ /**
+ * Reads next RTP packets group from a clip.
+ * @since Series 60 3.0
+ * @param aGroupPoint a group to read.
+ * @return KErrInUse if reading already active,
+ KErrEof if too close to live point,
+ KErrNone otherwise.
+ */
+ TInt ReadNextGroupL( const TInt aGroupPoint );
+
+ /**
+ * Reads skipped RTP packet from a clip.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void ReadSkippedGroup();
+
+ /**
+ * Setter for last seek addres.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void UpdateLastSeekAddr();
+
+ /**
+ * Sets Seek point of the clip.
+ * @since Series 60 3.0
+ * @param aTime a time where to seek.
+ * @return none.
+ */
+ void SetSeekPointL( const TUint aTime );
+
+ /**
+ * Stops RTP packet reading.
+ * @since Series 60 3.0
+ * @param aStatus a stopping status.
+ * @param aPlayerBuf a buffer length in player.
+ * @return none.
+ */
+ void StopRtpRead( const TInt aStatus,
+ const TUint aPlayerBuf );
+
+ /**
+ * Getter for duration of the clip.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a duration of the clip.
+ */
+ inline TUint Duration();
+
+ /**
+ * Getter for time shift mode.
+ * @since Series 60 3.0
+ * @param none.
+ * @return true if time shift ongoing, otherwise false.
+ */
+ inline TBool IsTimeShift();
+
+ /**
+ * Getter for currently active group point.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a group point of current read.
+ */
+ inline TInt ThisGroup();
+
+private: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ * @param aObs a RTP save observer.
+ * @param aToFile a pointer to RTP save object.
+ */
+ CRtpFromFile( MRtpFileReadObserver& aReadObs,
+ CRtpToFile* aToFile );
+
+ /**
+ * Symbian 2nd phase constructor can leave and is private by default.
+ */
+ void ConstructL();
+
+private: // Functions from base classes
+
+ /**
+ * From CRtpFileBase.
+ * Called when request completion event occurs.
+ * @since Series 60 3.0
+ * @return none.
+ */
+ void RunL();
+
+ /**
+ * From CRtpFileBase.
+ * Handles a leave occurring in the request completion event handler RunL().
+ * @since Series 60 3.0
+ * @param aError the leave code.
+ * @return status of run error handling.
+ */
+ TInt RunError( TInt aError );
+
+ /**
+ * From CRtpFileBase.
+ * Called when request completion event cancelled.
+ * @since Series 60 3.0
+ * @return none.
+ */
+ void DoCancel();
+
+ /**
+ * From MRmTimerObserver : Called when timer completion event occurs.
+ * @since Series 60 3.0
+ * @return none
+ */
+ void TimerEventL();
+
+ /**
+ * From MRtpTimerObserver.
+ * Handles a leave occurring in the request completion event handler RunL().
+ * @since Series 60 3.0
+ * @param aError the leave code.
+ * @return none.
+ */
+ void TimerError( const TInt aError );
+
+private: // New functions
+
+ /**
+ * Reads clip header from a clip.
+ * @since Series 60 3.0
+ * @param aVersion a version of clip.
+ * @return none.
+ */
+ void ReadClipHeaderL( TInt8& aVersion );
+
+ /**
+ * Reads meta header from a clip.
+ * @since Series 60 3.0
+ * @param aSeekHeaderPoint a seek header point in clip.
+ * @param aSeekArrayPoint a seek array point in clip.
+ * @return Version of clip.
+ */
+ TInt8 ReadMetaHeaderL( TInt& aSeekHeaderPoint,
+ TInt& aSeekArrayPoint );
+
+ /**
+ * Reads RTP payload from a clip.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void ReadNextGroupFromFileL();
+
+ /**
+ * Finds group base on seek time.
+ * @since Series 60 3.0
+ * @param aTime a time to use for search.
+ * @param aArray a array to use for search.
+ * @return point to group where time with TS exist.
+ */
+ TInt FindSeekGroup( const TUint aTime,
+ CArrayFix<SSeek>* aArray );
+
+ /**
+ * Updates playback count and spot attributes.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void UpdatePlayAttL();
+
+ /**
+ * Getter for last seek addres.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a last seek address.
+ */
+ TInt LastSeekAddr();
+
+private: // Data
+
+ /**
+ * RTP read observer.
+ */
+ MRtpFileReadObserver& iReadObs;
+
+ /**
+ * Pointer to RTP save object.
+ */
+ CRtpToFile* iToFile;
+
+ /**
+ * File data buffer.
+ */
+ HBufC8* iFileData;
+
+ /**
+ * Request skipped.
+ */
+ TBool iSkippedRead;
+
+ /**
+ * Duration of the clip.
+ */
+ TInt iDuration;
+
+ /**
+ * Group read timer.
+ */
+ CRtpTimer* iTimer;
+
+ };
+
+#include "CRtpFromFile.inl"
+
+#endif //__CRTPFROMFILE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipHandler/inc/CRtpFromFile.inl Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,55 @@
+/*
+* 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: Implementation of the Common Recording Engine RTP read format*
+*/
+
+
+
+
+
+// INCLUDE FILES
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::Duration
+// Getter for current duration of the clip.
+// -----------------------------------------------------------------------------
+//
+inline TUint CRtpFromFile::Duration()
+ {
+ return iDuration;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::ThisGroup
+// Getter for currently active group point.
+// -----------------------------------------------------------------------------
+//
+inline TInt CRtpFromFile::ThisGroup()
+ {
+ return iThisGroup;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::IsTimeShift
+// Getter for time shift mode.
+// -----------------------------------------------------------------------------
+//
+inline TBool CRtpFromFile::IsTimeShift()
+ {
+ return ( iMode == EModeTimeShift );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipHandler/inc/CRtpToFile.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,374 @@
+/*
+* 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: RTP file save format for Common Recording Engine.*
+*/
+
+
+
+
+#ifndef CRTPTOFILE_H
+#define CRTPTOFILE_H
+
+// INCLUDES
+#include <ipvideo/CRtpFileBase.h>
+#include <ipvideo/MRtpFileObserver.h>
+#include <ipvideo/MRtpFileWriteObserver.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// none
+
+// DATA TYPES
+// none
+
+// FORWARD DECLARATIONS
+class CRtpMetaHeader;
+
+// CLASS DECLARATION
+
+/**
+* RTP format write functionalities for RTP Clip Handler.
+*
+* @lib RtpClipHandler.lib
+* @since Series 60 3.0
+*/
+class CRtpToFile : public CRtpFileBase
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ static CRtpToFile* NewL( MRtpFileObserver& aObs,
+ MRtpFileWriteObserver& aHandler );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CRtpToFile();
+
+public: // New functions
+
+ /**
+ * Initiates RTP packets saving.
+ * @since Series 60 3.0
+ * @param aObs a RTP save observer.
+ * @param aParams a recording parameters.
+ * @param aAction a save action for current group.
+ * @return none.
+ */
+ void InitRtpSaveL( const MRtpFileWriteObserver::SRtpRecParams& aParams,
+ const MRtpFileWriteObserver::TRtpSaveAction& aAction );
+
+ /**
+ * Setter for packets re-use flag.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void ActivateGroupsReuseL();
+
+ /**
+ * Swaps new clip for packets saving.
+ * @since Series 60 3.0
+ * @param aParams a recording parameters.
+ * @return none.
+ */
+ void SwapClipL( const MRtpFileWriteObserver::SRtpRecParams& aParams );
+
+ /**
+ * Saves next RTP packet group to a file.
+ * @since Series 60 3.0
+ * @param aGroup a RTP group data.
+ * @param aGroupLength a length of group.
+ * @param aAction a save action for current group.
+ * @return a file location of saved group.
+ */
+ TInt SaveNextGroupL( TPtr8& aGroup,
+ TUint& aGroupLength,
+ const MRtpFileWriteObserver::TRtpSaveAction& aAction );
+
+ /**
+ * Updates previous time after pause.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void UpdatePreviousTimeL();
+
+ /**
+ * Stops RTP packet saving.
+ * @since Series 60 3.0
+ * @param aError a stop error code.
+ * @return none.
+ */
+ void StopRtpSave( const TInt aError );
+
+ /**
+ * Getter for a clip path.
+ * @since Series 60 3.0
+ * @param none.
+ * @return reference to current path.
+ */
+ HBufC* ClipPath();
+
+ /**
+ * Getter current length of the clip.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a total length of the clip.
+ */
+ TUint GetCurrentLength();
+
+ /**
+ * Setter recording end time of the clip.
+ * @since Series 60 3.0
+ * @param aEndTime new end time for the clip.
+ * @return none.
+ */
+ void UpdateRecordEndTime( const TTime& aEndTime );
+
+ /**
+ * Updates playback count and spot attributes.
+ * @since Series 60 3.0
+ * @param aNewSpot a new play start spot.
+ * @return none.
+ */
+ void UpdatePlayAttL( const TInt aNewSpot );
+
+public: // New inline functions
+
+ /**
+ * Getter for packet groups total count.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a value of groups total count variable.
+ */
+ inline TInt GroupsTotalCount();
+
+ /**
+ * Getter for first group address.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a value of first address variable.
+ */
+ inline TInt FirstSeekAddr();
+
+ /**
+ * Getter for last group address.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a value of last address variable.
+ */
+ inline TInt LastSeekAddr();
+
+ /**
+ * Getter for seek header point.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a value of seek header variable.
+ */
+ inline TInt SeekHeaderPoint();
+
+ /**
+ * Getter for seek array.
+ * @param none.
+ * @since Series 60 3.0
+ * @return a pointer to seek array.
+ */
+ inline CArrayFix<SSeek>* SeekArray();
+
+ /**
+ * Getter for current save action
+ * @param none.
+ * @since Series 60 3.0
+ * @return current saving action (status)
+ */
+ inline MRtpFileWriteObserver::TRtpSaveAction Action() const;
+
+private: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ */
+ CRtpToFile( MRtpFileObserver& aObs,
+ MRtpFileWriteObserver& aHandler );
+
+ /**
+ * Symbian 2nd phase constructor can leave and is private by default.
+ */
+ void ConstructL();
+
+private: // Functions from base classes
+
+ /**
+ * From CRtpFileBase : Called when request completion event occurs.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void RunL();
+
+ /**
+ * From CRtpFileBase : Handles a leave occurring in the request.
+ * completion event handler RunL().
+ * @since Series 60 3.0
+ * @param aError the leave code
+ * @return a status of function
+ */
+ TInt RunError( TInt aError );
+
+ /**
+ * From CRtpFileBase : Called when request completion event cancelled.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void DoCancel();
+
+private: // New functions
+
+ /**
+ * Opens new clip and creates initial headers.
+ * @since Series 60 3.0
+ * @param aParams a recording parameters.
+ * @return none.
+ */
+ void CreateNewClipL(
+ const MRtpFileWriteObserver::SRtpRecParams& aParams );
+
+ /**
+ * Sets variables for a new group.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void AddGroupL();
+
+ /**
+ * Calculates group time.
+ * @since Series 60 3.0
+ * @param aGroupLength a length of incoming group.
+ * @return none.
+ */
+ void GroupTimeL( TUint& aGroupLength );
+
+ /**
+ * Writes clip's initial meta data header of the clip.
+ * @since Series 60 3.0
+ * @param aParams a recording parameters.
+ * @return none.
+ */
+ void WriteInitialMetaHeaderL(
+ const MRtpFileWriteObserver::SRtpRecParams& aParams );
+
+ /**
+ * Writes clip's final meta data header to a clip.
+ * @since Series 60 3.0
+ * @param aStatus a status of recording.
+ * @return none.
+ */
+ void WriteFinalMetaHeaderL( const TInt aStatus );
+
+ /**
+ * Adds RTP group header to a group.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void AddGroupHeaderL();
+
+ /**
+ * Updates recording duration.
+ * @since Series 60 3.0
+ * @param aMetaHeader a pointer to meta header.
+ * @return none.
+ */
+ void UpdateDurationL( CRtpMetaHeader* aMetaHeader );
+
+ /**
+ * Getter for current network time.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void UpdateCurrentTimeL();
+
+private: // Data
+
+ /**
+ * RTP file observer.
+ */
+ MRtpFileObserver& iFileObs;
+
+ /**
+ * RTP write observer.
+ */
+ MRtpFileWriteObserver& iWriteObs;
+
+ /**
+ * Current network time.
+ */
+ TTime iCurrentTime;
+
+ /**
+ * Previous network time.
+ */
+ TInt64 iPreviousTime;
+
+ /**
+ * Previous time delta.
+ */
+ TInt iPreviousDelta;
+
+ /**
+ * Reference recording time.
+ */
+ TInt64 iReferenceTime;
+
+ /**
+ * Record end time.
+ */
+ TInt64 iRecordEndTime;
+
+ /**
+ * Reference to seek array delta.
+ */
+ TUint iSeekArrayReference;
+
+ /**
+ * Group time of the group where recording started.
+ */
+ TUint iStartGroupTime;
+
+ /**
+ * Total groups for re-use.
+ */
+ TInt iGroupReUse;
+
+ /**
+ * Current save action.
+ */
+ MRtpFileWriteObserver::TRtpSaveAction iAction;
+
+ };
+
+#include "CRtpToFile.inl"
+
+#endif // CRTPTOFILE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipHandler/inc/CRtpToFile.inl Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,86 @@
+/*
+* 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: Implementation of the Common Recording Engine RTP save format*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <ipvideo/CRtpFileBase.h>
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::GroupsTotalCount
+// Returns: Total count of packet groups.
+// -----------------------------------------------------------------------------
+//
+inline TInt CRtpToFile::GroupsTotalCount()
+ {
+ return iGroupsTotalCount;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::FirstSeekAddr
+// Returns: First group's address in RTP file.
+// -----------------------------------------------------------------------------
+//
+inline TInt CRtpToFile::FirstSeekAddr()
+ {
+ return iFirstSeekAddr;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::LastSeekAddr
+// Returns: Last group's address in RTP file.
+// -----------------------------------------------------------------------------
+//
+inline TInt CRtpToFile::LastSeekAddr()
+ {
+ return ( iMode == EModeTimeShift )? KMaxTInt:
+ ( IsActive() )? iPrevGroupPoint: iLastSeekAddr;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::SeekHeaderPoint
+// Returns: Seek header point in RTP file.
+// -----------------------------------------------------------------------------
+//
+inline TInt CRtpToFile::SeekHeaderPoint()
+ {
+ return iSeekHeaderPoint;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::SeekArray
+// Returns: Seek arry pointer.
+// -----------------------------------------------------------------------------
+//
+inline CArrayFix<CRtpFileBase::SSeek>* CRtpToFile::SeekArray()
+ {
+ return iSeekArray;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::Action
+// Returns: Current save action.
+// -----------------------------------------------------------------------------
+//
+inline MRtpFileWriteObserver::TRtpSaveAction CRtpToFile::Action() const
+ {
+ return iAction;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipHandler/rom/dvrrtpcliphandler.iby Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+
+#ifndef __DVRRTPCLIPHANDLER_IBY__
+#define __DVRRTPCLIPHANDLER_IBY__
+
+#include <data_caging_paths_for_iby.hrh>
+
+file=ABI_DIR\BUILD_DIR\DvrRtpClipHandler.dll SHARED_LIB_DIR\DvrRtpClipHandler.dll
+
+#endif // __DVRRTPCLIPHANDLER_IBY__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipHandler/src/CRtpClipHandler.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,584 @@
+/*
+* 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: Implementation of RTP clip handler class.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <ipvideo/CRtpClipHandler.h>
+#include "CRtpToFile.h"
+#include "CRtpFromFile.h"
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+const TInt KDvrMaxTimeshiftDelta( 1 * 60 * 60 ); // 1 hour
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CRtpClipHandler* CRtpClipHandler::NewL()
+ {
+ CRtpClipHandler* self = new( ELeave ) CRtpClipHandler();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::CRtpClipHandler
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CRtpClipHandler::CRtpClipHandler()
+ : iClipVersion( 0 ),
+ iSaveNameIndex( KErrNotFound ),
+ iReadNameIndex( KErrNotFound ),
+ iTsPauseState( EFalse )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CRtpClipHandler::ConstructL()
+ {
+ LOG( "CRtpClipHandler::ConstructL()" );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::~CRtpClipHandler
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CRtpClipHandler::~CRtpClipHandler()
+ {
+ LOG( "CRtpClipHandler::~CRtpClipHandler() in" );
+
+ StopRecording( KErrCancel );
+ StopPlayBack( KErrCancel, 0 );
+
+ LOG( "CRtpClipHandler::~CRtpClipHandler() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::RegisterWriteObserver
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipHandler::RegisterWriteObserver(
+ MRtpFileWriteObserver* aObs )
+ {
+ LOG1( "CRtpClipHandler::RegisterWriteObserver(), aObs: %d", aObs );
+ iWriteObs = aObs;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::RegisterReadObserver
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipHandler::RegisterReadObserver( MRtpFileReadObserver* aObs )
+ {
+ LOG1( "CRtpClipHandler::RegisterReadObserver(), aObs: %d", aObs );
+
+ iReadObs = aObs;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::StartRecordingL
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipHandler::StartRecordingL(
+ const MRtpFileWriteObserver::SRtpRecParams& aRecParams,
+ const MRtpFileWriteObserver::TRtpSaveAction& aAction )
+ {
+ LOG1( "CRtpClipHandler::StartRecordingL() in, aAction: %d", aAction );
+
+ // Stop possible existing recording
+ StopRecording( KErrNone );
+ iSaveNameIndex = 0;
+
+ // If InitRtpSaveL leaves, iRtpSave is not NULL, but is in undefined state.
+ // This causes problems - may crash when StopRecording is called.
+ // Better to trap and cleanup here.
+ TRAPD( err,
+ // Init recording ( iRtpSave deleted in StopRecording() )
+ iRtpSave = CRtpToFile::NewL( *this, *iWriteObs );
+ iRtpSave->InitRtpSaveL( aRecParams, aAction );
+ );
+ if ( err )
+ {
+ delete iRtpSave; iRtpSave = NULL;
+ User::Leave( err );
+ }
+
+ LOG( "CRtpClipHandler::StartRecordingL() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::SaveNextGroupL
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipHandler::SaveNextGroupL(
+ TPtr8& aGroup,
+ TUint aGroupLength,
+ const MRtpFileWriteObserver::TRtpSaveAction& aAction )
+ {
+ User::LeaveIfNull( iWriteObs );
+ User::LeaveIfNull( iRtpSave );
+
+ // Passes save action to ring buffer
+ const TUint seekPoint( iRtpSave->SaveNextGroupL(
+ aGroup, aGroupLength, aAction ) );
+
+ // aGroupLength is set to non zero if time shift ongoing?
+ if ( aGroupLength > 0 )
+ {
+ CRtpFileBase::STimeShiftSeek shiftSeek;
+ shiftSeek.iGroupTime = aGroupLength;
+ shiftSeek.iSeekpoint = seekPoint;
+ shiftSeek.iNameIndex = iSaveNameIndex;
+ iShiftSeek.Append( shiftSeek );
+
+ // Time shift max length
+ if ( ( ( iShiftSeek.Count() - 1 ) * KNormalRecGroupLength ) >
+ KDvrMaxTimeshiftDelta )
+ {
+ LOG( "CRtpClipHandler::SaveNextGroupL(), Timeshift max time !" );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::WritingActive
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CRtpClipHandler::WritingActive( void ) const
+ {
+ if ( iRtpSave )
+ {
+ return iRtpSave->IsActive();
+ }
+
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::GetCurrentLength
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TUint CRtpClipHandler::GetCurrentLength( void ) const
+ {
+ TUint length( 0 );
+ if ( iRtpRead )
+ {
+ length = iRtpRead->Duration();
+ }
+ else
+ {
+ if ( iRtpSave )
+ {
+ const TInt count( iShiftSeek.Count() );
+ if ( count > 0 )
+ {
+ // Time shift
+ for ( TInt i( 0 ); i < count; i++ )
+ {
+ length += iShiftSeek[i].iGroupTime;
+ }
+ }
+ else
+ {
+ // Rec ongoing
+ length = iRtpSave->GetCurrentLength();
+ }
+ }
+ }
+
+ return length;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::TimeShiftPauseL
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipHandler::TimeShiftPauseL()
+ {
+ LOG2( "CRtpClipHandler::TimeShiftPauseL(), iRtpSave: %d, iTsPauseState: %d",
+ iRtpSave, iTsPauseState );
+ User::LeaveIfNull( iRtpSave );
+ if ( !iTsPauseState )
+ {
+ // Use clip as a ring buffer
+ iRtpSave->ActivateGroupsReuseL();
+ iTsPauseState = ETrue;
+ }
+ else
+ {
+ // Switch to next file
+ iSaveNameIndex++;
+ MRtpFileWriteObserver::SRtpRecParams recParams;
+ DefaultRecParams( recParams, iSaveNameIndex );
+ iRtpSave->SwapClipL( recParams );
+ iTsPauseState = EFalse;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::DefaultRecParams
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipHandler::DefaultRecParams(
+ MRtpFileWriteObserver::SRtpRecParams& aParams,
+ const TInt aIndex )
+ {
+ aParams.iClipPath = KDvrTimeShiftFile;
+ aParams.iClipPath.AppendNum( aIndex );
+ aParams.iSdpData.Set( NULL, 0 );
+ aParams.iService.Set( KNullDesC );
+ aParams.iProgram.Set( KNullDesC );
+ aParams.iPostRule = 0;
+ aParams.iParental = 0;
+ aParams.iStartTime = 0;
+ aParams.iEndTime = TInt64( KDvrMaximumTimeShift ) * 1e6;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::UpdateRecordEndTime
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipHandler::UpdateRecordEndTime( const TTime& aEndTime )
+ {
+ if ( iRtpSave )
+ {
+ iRtpSave->UpdateRecordEndTime( aEndTime );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::ResumeRecordingL
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipHandler::ResumeRecordingL( void )
+ {
+ LOG1( "CRtpClipHandler::ResumeRecordingL(), iRtpSave: %d", iRtpSave );
+
+ if ( iRtpSave )
+ {
+ iRtpSave->UpdatePreviousTimeL();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::StopRecording
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipHandler::StopRecording( const TInt aError )
+ {
+ LOG2( "CRtpClipHandler::StopRecording(), aError: %d, iRtpSave: %d",
+ aError, iRtpSave );
+
+ if ( iRtpSave )
+ {
+ // Update clip end point if watching sametime
+ if ( iRtpRead )
+ {
+ iRtpRead->UpdateLastSeekAddr();
+ }
+
+ // Stop recording
+ iRtpSave->StopRtpSave( aError );
+
+ // Delete possible time shift files
+ if ( !iRtpRead )
+ {
+ iRtpSave->DeleteTimeShiftFiles( iShiftSeek );
+ }
+ }
+
+ delete iRtpSave; iRtpSave = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::StartPlayBackL
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipHandler::StartPlayBackL(
+ const SCRRtpPlayParams& aParams,
+ const TBool aTimeShift )
+ {
+ LOG1( "CRtpClipHandler::StartPlayBackL(), path: %S", &aParams.iFileName );
+ LOG1( "CRtpClipHandler::StartPlayBackL(), aTimeShift: %d", aTimeShift );
+
+ // Stop possible existing
+ StopPlayBack( KErrNone, 0 );
+
+ // Time shift mode?
+ if ( aTimeShift )
+ {
+ // Open file for time shift mode
+ User::LeaveIfNull( iRtpSave );
+ iRtpRead = CRtpFromFile::NewL( *iReadObs, iRtpSave );
+ iReadNameIndex = ( iShiftSeek.Count() )? iShiftSeek[0].iNameIndex: 0;
+ TPath clipPath( KDvrTimeShiftFile );
+ clipPath.AppendNum( iReadNameIndex );
+ iRtpRead->InitRtpReadL( clipPath, iClipVersion, aTimeShift );
+ }
+ else
+ {
+ // Open file, during recording?
+ if ( iRtpSave && iRtpSave->ClipPath() )
+ {
+ if ( !aParams.iFileName.Compare( iRtpSave->ClipPath()->Des() ) )
+ {
+ iRtpRead = CRtpFromFile::NewL( *iReadObs, iRtpSave );
+ }
+ }
+
+ // Open file, normal playback?
+ if ( !iRtpRead )
+ {
+ iRtpRead = CRtpFromFile::NewL( *iReadObs, NULL );
+ }
+
+ iRtpRead->InitRtpReadL( aParams.iFileName, iClipVersion, EFalse );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::StartPlayBackL
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipHandler::StartPlayBackL( const RFile& aFileHandle )
+ {
+ LOG( "CRtpClipHandler::StartPlayBackL(), with handle" );
+
+ // Stop possible existing
+ StopPlayBack( KErrNone, 0 );
+
+ // Open file, during recording?
+ if ( iRtpSave && iRtpSave->ClipPath() )
+ {
+ TPath name( KNullDesC );
+ aFileHandle.FullName( name );
+ if ( !name.Compare( iRtpSave->ClipPath()->Des() ) )
+ {
+ iRtpRead = CRtpFromFile::NewL( *iReadObs, iRtpSave );
+ }
+ }
+
+ // Open file, normal playback?
+ if ( !iRtpRead )
+ {
+ iRtpRead = CRtpFromFile::NewL( *iReadObs, NULL );
+ }
+
+ iRtpRead->InitRtpReadL( aFileHandle, iClipVersion );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::GetClipSdpL
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C HBufC8* CRtpClipHandler::GetClipSdpL( void ) const
+ {
+ HBufC8* sdp = NULL;
+ if ( iRtpRead )
+ {
+ sdp = iRtpRead->GetClipSdpL();
+ }
+
+ return sdp;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::NextClipGroupL
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipHandler::NextClipGroupL( void )
+ {
+ User::LeaveIfNull( iRtpRead );
+ if ( !iRtpRead->IsTimeShift() )
+ {
+ iRtpRead->ReadNextGroupL( KErrNotFound );
+ }
+ else
+ {
+ // Handle time shift
+ TInt err( KErrNotFound );
+ if ( iShiftSeek.Count() )
+ {
+ // Need swap file?
+ SwapClipIfNeededL();
+
+ // Read next group
+ TRAP( err, iRtpRead->ReadNextGroupL( iShiftSeek[0].iSeekpoint ) );
+ if ( err != KErrInUse )
+ {
+ iShiftSeek.Remove( 0 );
+ }
+ }
+
+ // End time shift?
+ if ( err == KErrEof )
+ {
+ LOG( "CRtpClipHandler::NextClipGroupL(), Time shift play reached live !" );
+ User::LeaveIfNull( iReadObs );
+ iReadObs->ReadStatus( MRtpFileReadObserver::ERtpTimeShifTEnd );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::SetSeekPointL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipHandler::SetSeekPointL( const TUint aTime )
+ {
+ LOG1( "CRtpClipHandler::SetSeekPointL(), aTime: %u", aTime );
+
+ User::LeaveIfNull( iRtpRead );
+ if ( !iShiftSeek.Count() )
+ {
+ iRtpRead->SetSeekPointL( aTime );
+ }
+ else
+ {
+ const TInt count( iShiftSeek.Count() );
+ if ( count > 0 )
+ {
+ TUint total( 0 );
+ for ( TInt index( 0 ); index < count && aTime > total; index++ )
+ {
+ total += iShiftSeek[0].iGroupTime;
+ SwapClipIfNeededL();
+ iShiftSeek.Remove( 0 );
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::StopPlayBack
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipHandler::StopPlayBack(
+ const TInt aError,
+ const TUint aPlayerBuf )
+ {
+ LOG2( "CRtpClipHandler::StopPlayBack(), aError: %d, iRtpRead: %d",
+ aError, iRtpRead );
+ if ( iRtpRead )
+ {
+ iRtpRead->StopRtpRead( aError, aPlayerBuf );
+
+ // Delete possible time shift files
+ if ( !iRtpSave )
+ {
+ iRtpRead->DeleteTimeShiftFiles( iShiftSeek );
+ }
+ }
+
+ delete iRtpRead; iRtpRead = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::RtpGroupSaved
+// Indicates that RPT packet save is ready.
+// -----------------------------------------------------------------------------
+//
+void CRtpClipHandler::RtpGroupSaved( const TInt aAction )
+ {
+ // Inform file reader that new group saved
+ if ( iRtpRead && aAction >= KErrNone )
+ {
+ iRtpRead->ReadSkippedGroup();
+ }
+
+ // Group saved
+ if ( iWriteObs )
+ {
+ if ( aAction != MRtpFileWriteObserver::ESaveEnd )
+ {
+ // Ready for next group
+ iWriteObs->GroupSaved();
+ }
+ else
+ {
+ // Recording full time
+ iWriteObs->WriteStatus( KErrNone );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::CurrentFileReadPoint
+// Getter for file reader current point.
+// -----------------------------------------------------------------------------
+//
+TInt CRtpClipHandler::CurrentFileReadPoint( const TInt aIndex )
+ {
+ if ( iShiftSeek.Count() > aIndex )
+ {
+ if ( iShiftSeek[aIndex].iNameIndex == iSaveNameIndex )
+ {
+ return iShiftSeek[aIndex].iSeekpoint;
+ }
+
+ return KErrNone;
+ }
+
+ return KErrNotFound;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::SwapClipIfNeededL
+// Swap to next available clip in time shift array if needed.
+// -----------------------------------------------------------------------------
+//
+void CRtpClipHandler::SwapClipIfNeededL( void )
+ {
+ if ( iShiftSeek[0].iNameIndex != iReadNameIndex )
+ {
+ iReadNameIndex = iShiftSeek[0].iNameIndex;
+ TPath clipPath( KDvrTimeShiftFile );
+ clipPath.AppendNum( iReadNameIndex );
+ iRtpRead->SwapClipL( clipPath );
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipHandler/src/CRtpClipManager.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,513 @@
+/*
+* 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: Help methods for propriatary RTP format.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <pathinfo.h>
+#include <ipvideo/CRtpClipManager.h>
+#include "CRtpClipRepairer.h"
+#include <BaUtils.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+const TInt EContentRightsRecordingAllowed( 0 );
+const TInt EContentRightsLockToDevice( 2 );
+const TInt KMaxProgramChars( 8 );
+const TInt KFirstFileIndex( 1 );
+const TInt KMaxFileIndex( 99 );
+_LIT( KDvrClipExtension, ".rtp" );
+_LIT( KIndexFormat, "(%02d)" );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CRtpClipManager::NewL
+// Static two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CRtpClipManager* CRtpClipManager::NewL()
+ {
+ CRtpClipManager* self = CRtpClipManager::NewLC();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipManager::NewLC
+// Static two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CRtpClipManager* CRtpClipManager::NewLC()
+ {
+ CRtpClipManager* self = new( ELeave ) CRtpClipManager();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipManager::CRtpClipManager
+//
+// -----------------------------------------------------------------------------
+//
+CRtpClipManager::CRtpClipManager()
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipManager::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CRtpClipManager::ConstructL()
+ {
+ LOG( "CRtpClipManager::ConstructL() in" );
+
+ // IMEI
+ TName buf( KNullDesC );
+ CRtpUtil::GetImeiL( buf );
+ iImei = buf.AllocL();
+ LOG1( "CRtpClipManager::ConstructL(), IMEI: %S", &*iImei );
+
+ // File server
+ User::LeaveIfError( iFs.Connect() );
+
+ LOG( "CRtpClipManager::ConstructL() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipManager::~CRtpClipManager
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CRtpClipManager::~CRtpClipManager()
+ {
+ LOG( "CRtpClipManager::~CRtpClipManager()" );
+
+ delete iImei;
+ iRepairQueue.ResetAndDestroy();
+ delete iClipRepairer;
+ iFile.Close();
+ iFs.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipManager::GetClipDetailsL
+// Getter for clip details.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipManager::GetClipDetailsL(
+ const TDesC& aClipPath,
+ SRtpClipDetails& aDetails )
+ {
+ iFile.Close();
+ TBool clipOpen( EFalse );
+ iFs.IsFileOpen( aClipPath, clipOpen );
+ User::LeaveIfError( iFile.Open( iFs, aClipPath,
+ EFileShareAny | EFileStream | EFileRead ) );
+ CRtpMetaHeader* metaheader = CRtpMetaHeader::NewLC(
+ iFile, CRtpMetaHeader::EMetaRead );
+ // Attributes
+ CRtpMetaHeader::SAttributes att;
+ metaheader->ReadAttributesL( att );
+
+ // Under version 2 clips not work any longer
+ // Recording ongoing without file open indicates interrupted recording
+ if ( att.iVersion < 2 || ( att.iOngoing && !clipOpen ) )
+ {
+ LOG3( "CRtpClipManager::GetClipDetailsL(), iVersion: %d, iOngoing: %d, clipOpen: %d",
+ att.iVersion, att.iOngoing, clipOpen );
+ iFile.Close();
+ User::Leave( KErrGeneral );
+ }
+
+ // Details
+ GetDetailsL( att, aDetails, metaheader );
+ CleanupStack::PopAndDestroy( metaheader );
+ iFile.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipManager::GetClipDetailsL
+// Getter for clip details.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipManager::GetClipDetailsL(
+ RFile& aFile,
+ SRtpClipDetails& aDetails )
+ {
+ CRtpMetaHeader* metaheader = CRtpMetaHeader::NewLC(
+ aFile, CRtpMetaHeader::EMetaRead );
+ // Attributes
+ CRtpMetaHeader::SAttributes att;
+ metaheader->ReadAttributesL( att );
+
+ // Details
+ GetDetailsL( att, aDetails, metaheader );
+ CleanupStack::PopAndDestroy( metaheader );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipManager::ProtectClipL
+// Protects clip from deleting automatically during recording.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipManager::ProtectClipL(
+ const TDesC& aClipPath,
+ const TBool aProtected )
+ {
+ LOG1( "CRtpClipManager::ProtectClipL(), aClipPath: %S", &aClipPath );
+ LOG1( "CRtpClipManager::ProtectClipL(), aProtected: %d", aProtected );
+
+ iFile.Close();
+ User::LeaveIfError( iFile.Open( iFs, aClipPath,
+ EFileShareExclusive | EFileStream | EFileWrite ) );
+ CRtpMetaHeader* metaheader = CRtpMetaHeader::NewLC(
+ iFile, CRtpMetaHeader::EMetaUpdate );
+ // Read Attributes
+ CRtpMetaHeader::SAttributes att;
+ metaheader->ReadAttributesL( att );
+ // Update protected attribute
+ if ( aProtected != att.iProtected )
+ {
+ att.iProtected = aProtected;
+ metaheader->WriteAttributesL( att );
+ }
+
+ CleanupStack::PopAndDestroy( metaheader );
+ iFile.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipManager::FixMetaHeaderL
+// Fixes corrupted clip's meta header.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipManager::FixMetaHeaderL(
+ MRtpClipRepairObserver* aObs,
+ const TDesC& aClipPath )
+ {
+ LOG( "RM-CRtpClipManager::FixMetaHeaderL()" );
+
+ iFile.Close();
+ if ( !iClipRepairer )
+ {
+ LOG1( "CRtpClipManager::FixMetaHeaderL(), Fix started: %S", &aClipPath );
+ AddClipToRepairQueueL( aClipPath );
+ iClipRepairer = CRtpClipRepairer::NewL( aObs );
+ iClipRepairer->CheckMetaHeaderL( aClipPath );
+ }
+ else
+ {
+ // Verify that not exist in queue
+ TInt loop( iRepairQueue.Count() - 1 );
+ for ( ; loop >= 0; loop-- )
+ {
+ if ( !aClipPath.CompareC( iRepairQueue[loop]->Des() ) )
+ {
+ break;
+ }
+ }
+
+ // Add to queue
+ if ( loop < 0 )
+ {
+ LOG1( "CRtpClipManager::FixMetaHeaderL(), Fix queued: %S", &aClipPath );
+ AddClipToRepairQueueL( aClipPath );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipManager::FixMetaHeaderL
+// Fixes corrupted clip's meta header syncronously.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipManager::FixMetaHeaderL( const TDesC& aClipPath )
+ {
+ LOG1( "CRtpClipManager::FixMetaHeaderL(), aClipPath: %S", &aClipPath );
+
+ iFile.Close();
+ delete iClipRepairer; iClipRepairer = NULL;
+ iClipRepairer = CRtpClipRepairer::NewL( NULL );
+ iClipRepairer->CheckMetaHeaderL( aClipPath );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipManager::DeleteRtpRepairer
+// Kills clip repairer after work done.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpClipManager::DeleteRtpRepairer( MRtpClipRepairObserver* aObs )
+ {
+ // Remove handled name from the queue first
+ iFile.Close();
+ TInt last( iRepairQueue.Count() - 1 );
+ if ( last > KErrNotFound && iClipRepairer &&
+ !iRepairQueue[last]->Des().Compare( iClipRepairer->CurrentClipName() ) )
+ {
+ delete iRepairQueue[last];
+ iRepairQueue[last] = NULL;
+ iRepairQueue.Remove( last );
+ }
+
+ // Repairer must be deleted in any case
+ delete iClipRepairer; iClipRepairer = NULL;
+ TInt err( KErrNotFound );
+ last = iRepairQueue.Count() - 1;
+ LOG1( "CRtpClipManager::DeleteRtpRepairer(), queue count: %d", iRepairQueue.Count() );
+
+ while ( last > KErrNotFound && err )
+ {
+ // Create new repairer and start it
+ TPath path( iRepairQueue[last]->Des() );
+ TRAP( err, iClipRepairer = CRtpClipRepairer::NewL( aObs ) );
+ if ( !err )
+ {
+ TRAP( err, iClipRepairer->CheckMetaHeaderL( path ) );
+ if ( err )
+ {
+ LOG1( "CRtpClipManager::DeleteRtpRepairerL(), CheckMetaHeaderL Leaved: %d", err );
+
+ // Remove clip which can't be repaired from the queue
+ delete iRepairQueue[last];
+ iRepairQueue[last] = NULL;
+ iRepairQueue.Remove( last );
+
+ // Ready for the next clip
+ last = iRepairQueue.Count() - 1;
+ delete iClipRepairer; iClipRepairer = NULL;
+ }
+ }
+ else
+ {
+ LOG1( "CRtpClipManager::DeleteRtpRepairerL(), No memory for new repairer: %d", err );
+ break;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipManager::VerifyPostRuleL
+// Verifies post acqusition rule of clip.
+// -----------------------------------------------------------------------------
+//
+TInt CRtpClipManager::VerifyPostRuleL(
+ const TUint8 aPostRule,
+ CRtpMetaHeader* aMetaHeader )
+ {
+ LOG( "CRtpClipManager::VerifyPostRule()" );
+
+ switch ( aPostRule )
+ {
+ case EContentRightsRecordingAllowed:
+ LOG( "CRtpClipManager::VerifyPostRule(), EContentRightsRecordingAllowed !" );
+ break;
+
+ case EContentRightsLockToDevice:
+ {
+ TName imei( KNullDesC );
+ aMetaHeader->ReadDeviceInfoL( imei );
+ if ( !iImei || imei.Compare( iImei->Des() ) )
+ {
+ LOG( "CRtpClipManager::VerifyPostRule(), EContentRightsLockToDevice" );
+ LOG1( "CRtpClipManager::VerifyPostRule(), ERmPlayDeviceLockError: %S", &imei );
+ LOG1( "CRtpClipManager::VerifyPostRule(), Phone's IMEI: %S", &*iImei );
+ return KErrAccessDenied;
+ }
+ }
+ break;
+
+ default:
+ LOG1( "RM-CRtpClipManager::VerifyPostRule(), Default case: %d", aPostRule );
+ break;
+ }
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipManager::GetDetailsL
+// Updates details from meta header attributes.
+// -----------------------------------------------------------------------------
+//
+void CRtpClipManager::GetDetailsL(
+ const CRtpMetaHeader::SAttributes& aAttributes,
+ SRtpClipDetails& aDetails,
+ CRtpMetaHeader* aMetaHeader )
+ {
+ aDetails.iRecOngoing = aAttributes.iOngoing;
+ aDetails.iCompleted = aAttributes.iCompleted;
+ aDetails.iProtected = aAttributes.iProtected;
+ aDetails.iFailed = aAttributes.iFailed;
+ aDetails.iQuality = aAttributes.iQuality;
+ aDetails.iPlayCount = aAttributes.iPlayCount;
+ aDetails.iPlaySpot = aAttributes.iPlaySpot;
+ aDetails.iParental = aAttributes.iParental;
+
+ LOG1( "CRtpClipManager::GetDetailsL(), iRecOngoing: %d", aDetails.iRecOngoing );
+ LOG1( "CRtpClipManager::GetDetailsL(), iCompleted: %d", aDetails.iCompleted );
+ LOG1( "CRtpClipManager::GetDetailsL(), iProtected: %d", aDetails.iProtected );
+ LOG1( "CRtpClipManager::GetDetailsL(), iFailed: %d", aDetails.iFailed );
+ LOG1( "CRtpClipManager::GetDetailsL(), iQuality: %d", aDetails.iQuality );
+ LOG1( "CRtpClipManager::GetDetailsL(), iPlayCount: %d", aDetails.iPlayCount );
+ LOG1( "CRtpClipManager::GetDetailsL(), iPlaySpot: %d", aDetails.iPlaySpot );
+ LOG1( "CRtpClipManager::GetDetailsL(), iParental: %d", aDetails.iParental );
+
+ // ESG
+ aMetaHeader->ReadEsgDataL( aDetails.iService, aDetails.iProgram );
+ LOG1( "CRtpClipManager::GetDetailsL(), iService: %S", &aDetails.iService );
+ LOG1( "CRtpClipManager::GetDetailsL(), iProgram: %S", &aDetails.iProgram );
+
+ // Start time
+ aMetaHeader->ReadStartTimeL( aDetails.iStartTime );
+
+ // End time
+ aMetaHeader->ReadEndTimeL( aDetails.iEndTime );
+
+#if defined( LIVE_TV_RDEBUG_TRACE ) || defined( LIVE_TV_FILE_TRACE )
+ TName time( KNullDesC ); aDetails.iEndTime.FormatL( time, KTimeDateFormat );
+ LOG1( "CRtpClipManager::GetDetailsL(), End time: %S", &time );
+#endif // LIVE_TV_RDEBUG_TRACE || LIVE_TV_FILE_TRACE
+
+ // Duration
+ aMetaHeader->ReadDurationL( aDetails.iDuration );
+ LOG1( "CRtpClipManager::GetDetailsL(), iDuration: %d", aDetails.iDuration );
+ aDetails.iDuration/= 1000; // convert to seconds
+
+ // Post acquisition
+ aDetails.iPostRuleOk = !VerifyPostRuleL( aAttributes.iPostRule, aMetaHeader );
+ LOG1( "CRtpClipManager::GetDetailsL(), iPostRuleOk: %d", aDetails.iPostRuleOk );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipManager::NewClipRootL
+// Root path of the new clip, depends on user media setting.
+// If memory card is selected, but not available, default saving to phone memory.
+// -----------------------------------------------------------------------------
+//
+void CRtpClipManager::NewClipRootL( TDes& aClipPath, const TDriveNumber aDrive )
+ {
+ // Begin of the save path
+ if ( aDrive == EDriveC )
+ {
+ aClipPath = PathInfo::PhoneMemoryRootPath();
+ aClipPath.Append( PathInfo::VideosPath() );
+ }
+ else
+ {
+ aClipPath = PathInfo::MemoryCardRootPath();
+ aClipPath.Append( PathInfo::VideosPath() );
+ }
+
+ // Verify and create path if not exist
+ if ( !BaflUtils::PathExists( iFs, aClipPath ) )
+ {
+ TInt err( iFs.MkDirAll( aClipPath ) );
+ if ( err && aDrive != EDriveC )
+ {
+ LOG1( "CRtpClipManager::NewClipRootL(), Forced to Use Phone Memory !", err );
+
+ // Memorycard not acceptable -> Use phone memory
+ err = KErrNone;
+ aClipPath = PathInfo::PhoneMemoryRootPath();
+ aClipPath.Append( PathInfo::VideosPath() );
+ BaflUtils::EnsurePathExistsL( iFs, aClipPath );
+ }
+
+ User::LeaveIfError( err );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipManager::NewIndexNameL
+// Creates new clip name from program name (eigth first letters + index).
+// If program name allready in use, adds indexing to the end of name.
+// -----------------------------------------------------------------------------
+//
+void CRtpClipManager::NewIndexNameL( TDes& aClipPath, const TDesC& aProgram )
+ {
+ LOG1( "CRtpClipManager::NewIndexNameL(), aClipPath : %S", &aClipPath );
+ LOG1( "CRtpClipManager::NewIndexNameL(), aProgram : %S", &aProgram );
+
+ // Remove special characters
+ TBuf<KMaxProgramChars> program( aProgram.Left( KMaxProgramChars ) );
+ for ( TInt i( program.Length() - 1 ); i >= 0; i-- )
+ {
+ TChar letter( program[i] );
+ // Remove if not alpha nor space
+ if ( !letter.IsAlphaDigit() && !letter.IsSpace() )
+ {
+ program.Delete( i, 1 );
+ }
+ }
+ program.TrimRight();
+
+ TInt index( KFirstFileIndex );
+
+ // Test name for existing clip check
+ TPath testName( aClipPath );
+ if ( program.Length() )
+ {
+ testName.Append( program );
+ }
+ else
+ {
+ // Zero length program name, start from "(01).rtp"
+ testName.AppendFormat( KIndexFormat, index++ );
+ }
+
+ // Name already used ?
+ testName.Append( KDvrClipExtension );
+ if ( BaflUtils::FileExists( iFs, testName ) )
+ {
+ do
+ {
+ LOG1( "CRtpClipManager::NewIndexNameL(), Clip exist: %S", &testName );
+
+ // Abort if file index exceeds "(99)"
+ User::LeaveIfError( ( index > KMaxFileIndex ) * KErrOverflow );
+
+ // New test name
+ testName.Copy( aClipPath );
+ testName.Append( program );
+ testName.AppendFormat( KIndexFormat, index++ );
+ testName.Append( KDvrClipExtension );
+ }
+ while ( BaflUtils::FileExists( iFs, testName ) );
+ }
+
+ // Return suitable filename
+ aClipPath.Copy( testName );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipManager::AddClipToRepairQueueL
+// Inserts new clip name to the first in queue.
+// -----------------------------------------------------------------------------
+//
+void CRtpClipManager::AddClipToRepairQueueL( const TDesC& aClipPath )
+ {
+ HBufC* clip = aClipPath.AllocLC();
+ User::LeaveIfError( iRepairQueue.Insert( clip, 0 ) );
+ CleanupStack::Pop( clip );
+ }
+
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipHandler/src/CRtpClipRepairer.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,432 @@
+/*
+* 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: Implementation of the common recording engine file repairer class.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CRtpClipRepairer.h"
+#include <ipvideo/CRtpMetaHeader.h>
+#include <ipvideo/CRtpUtil.h>
+#include <e32math.h>
+#include <bsp.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+const TInt KMaxGroupTime( 4000 ); // 4s
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CRtpClipRepairer::NewL
+// Static two-phased constructor. Leaves object to cleanup stack.
+// -----------------------------------------------------------------------------
+//
+CRtpClipRepairer* CRtpClipRepairer::NewL( MRtpClipRepairObserver* aObs )
+ {
+ CRtpClipRepairer* self = new( ELeave ) CRtpClipRepairer( aObs );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRepairer::CRtpClipRepairer
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CRtpClipRepairer::CRtpClipRepairer( MRtpClipRepairObserver* aObs )
+ : CRtpFileBase(),
+ iObs( aObs ),
+ iSeekArrayPoint( KErrNotFound )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRepairer::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CRtpClipRepairer::ConstructL()
+ {
+ LOG( "CRtpClipRepairer::ConstructL()" );
+
+ CRtpFileBase::ConstructL();
+ }
+
+// -----------------------------------------------------------------------------
+// Destructor
+//
+CRtpClipRepairer::~CRtpClipRepairer()
+// -----------------------------------------------------------------------------
+ {
+ LOG( "CRtpClipRepairer::~CRtpClipRepairer()" );
+
+ Cancel();
+ delete iFileData;
+ delete iMetaHeader;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRepairer::CurrentClipName
+// Getter for the clip name under repairing.
+// -----------------------------------------------------------------------------
+//
+TPtrC CRtpClipRepairer::CurrentClipName()
+ {
+ if ( iCurrentPath )
+ {
+ return iCurrentPath->Des();
+ }
+
+ return KNullDesC();
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRepairer::CheckMetaHeaderL
+// Checks if corrupted meta header of clip is possible to fix.
+// -----------------------------------------------------------------------------
+//
+void CRtpClipRepairer::CheckMetaHeaderL( const TDesC& aClipName )
+ {
+ LOG1( "CRtpClipRepairer::CheckMetaHeaderL(), aClipName: %S", &aClipName );
+
+ // Only one repair at the time
+ if ( iMetaHeader || iCurrentPath )
+ {
+ User::Leave( KErrAlreadyExists );
+ }
+
+ // Open clip and read the meta header
+ delete iCurrentPath; iCurrentPath = NULL;
+ iCurrentPath = aClipName.AllocL();
+ if ( !iFs.Handle() )
+ {
+ User::LeaveIfError( iFs.Connect() );
+ }
+ iFile.Close();
+ User::LeaveIfError( iFile.Open( iFs, aClipName,
+ EFileShareExclusive | EFileStream | EFileWrite ) );
+ delete iMetaHeader; iMetaHeader = NULL;
+ iMetaHeader = CRtpMetaHeader::NewL( iFile, CRtpMetaHeader::EMetaUpdate );
+
+ // Attributes
+ CRtpMetaHeader::SAttributes att;
+ TRAPD( err, iMetaHeader->ReadAttributesL( att ) );
+
+ // Verify that clip version not too old?
+ if ( att.iVersion < KMinValidClipVersion )
+ {
+ LOG( "CRtpClipRepairer::CheckMetaHeaderL(), Not Valid Clip Version" );
+ User::Leave( KErrGeneral );
+ }
+
+ // If error or rec ongoing -> recording interrupted ie. battery removed
+ if ( err || att.iOngoing )
+ {
+ att.iOngoing = EFalse;
+ att.iPlayCount = 0;
+ att.iPlaySpot = KErrNone;
+ iMetaHeader->WriteAttributesL( att );
+ }
+
+ // Duration
+ TInt duration( 0 );
+ iMetaHeader->ReadDurationL( duration );
+ LOG1( "CRtpClipRepairer::CheckMetaHeaderL(), duration: %d", duration );
+
+ // Update seek array
+ if ( ( !duration || duration > KSeekArrayInterval ) && !ValidSeekHeaderL() )
+ {
+ UpdateSeekArrayL();
+ }
+ else
+ {
+ // Set start time to file date
+ TTime startTime( 0 );
+ iMetaHeader->ReadStartTimeL( startTime );
+ iFile.SetModified( startTime );
+ iFile.Close();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRepairer::RunL
+// -----------------------------------------------------------------------------
+//
+void CRtpClipRepairer::RunL()
+ {
+ User::LeaveIfError( iStatus.Int() );
+ const TUint prevTime( iGroupTime );
+ UpdateGroupHeaderVariablesL( iDataPtr );
+ delete iFileData; iFileData = NULL;
+
+ // Current header valid?
+ if ( iThisGroup > iNextGroupPoint || iThisGroup < iPrevGroupPoint ||
+ iGroupTime < prevTime || iGroupTime > ( prevTime + KMaxGroupTime ) )
+ {
+ iLastSeekAddr = iPrevGroupPoint;
+ iThisGroup = iSeekArrayPoint;
+ }
+ else
+ {
+ // Handle readed group
+ GroupToSeekArrayL();
+ }
+
+ // Continue with next group if repair asyncronous?
+ if ( iObs )
+ {
+ if ( iThisGroup < iSeekArrayPoint )
+ {
+ // Asyncronous ( normal clip repairing )
+ ReadNextGroupHeaderFromFileL();
+ }
+ else
+ {
+ // All done, finalize the clip
+ AddSpecialPacketL( MRtpFileWriteObserver::ERtpClipEnd );
+ FinalizeSeekArrayL( KErrNone );
+ iObs->RtpClipRepaired( KErrNone );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRepairer::RunError
+// Returns: System wide error code of indication send leave reason
+// -----------------------------------------------------------------------------
+//
+TInt CRtpClipRepairer::RunError( TInt aError )
+ {
+ LOG1( "CRtpClipRepairer::RunError(), RunL Leaved: %d", aError );
+
+ TRAP_IGNORE( FinalizeSeekArrayL( aError ) );
+ if ( iObs )
+ {
+ iObs->RtpClipRepaired( ( iGroupsTotalCount )? KErrNone: aError );
+ }
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRepairer::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CRtpClipRepairer::DoCancel()
+ {
+ LOG( "CRtpClipRepairer::DoCancel()" );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRepairer::ValidSeekHeaderL
+// Verifies if seek header and seek array are valid.
+// -----------------------------------------------------------------------------
+//
+TBool CRtpClipRepairer::ValidSeekHeaderL()
+ {
+ // Seek header
+ iSeekHeaderPoint = iMetaHeader->SeekHeaderPoint();
+ ReadSeekHeaderL();
+
+ // Seek array point
+ iMetaHeader->ReadSeekArrayPointL( iSeekArrayPoint );
+
+ // Verify seek array
+ if ( iLastSeekAddr > iFirstSeekAddr && iSeekArrayPoint > iLastSeekAddr )
+ {
+ TInt count( KErrNotFound );
+ TRAPD( err, count = ReadSeekArrayL( iSeekArrayPoint ) );
+ if ( !err && count > 0 )
+ {
+ // Seek array is ok
+ return ETrue;
+ }
+ }
+
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRepairer::UpdateSeekArrayL
+// Scans all packet groups in clip and updates seek array.
+// -----------------------------------------------------------------------------
+//
+void CRtpClipRepairer::UpdateSeekArrayL()
+ {
+ LOG( "CRtpClipRepairer::UpdateSeekArrayL()" );
+
+ // Scan complete clip for seek array
+ ResetSeekArray();
+ User::LeaveIfError( iFile.Size( iSeekArrayPoint ) );
+ iThisGroup = iFirstSeekAddr;
+ iGroupTime = 0;
+ iNextGroupPoint = 0;
+ iGroupsTotalCount = 0;
+
+ // Start reading
+ if ( iObs )
+ {
+ // Asyncronous
+ ReadNextGroupHeaderFromFileL();
+ }
+ else
+ {
+ // Syncronous
+ TInt err( KErrNone );
+ do
+ {
+ ReadNextGroupHeaderFromFileL();
+ TRAP( err, RunL() );
+ }
+ while ( !err && iThisGroup < iSeekArrayPoint );
+
+ // All done, finalize the clip
+ AddSpecialPacketL( MRtpFileWriteObserver::ERtpClipPause );
+ FinalizeSeekArrayL( KErrNone );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRepairer::ReadNextGroupHeaderFromFileL
+// Reads RTP payload from a file.
+// Payload is allways after data header, so read position set is not needed.
+// -----------------------------------------------------------------------------
+//
+void CRtpClipRepairer::ReadNextGroupHeaderFromFileL()
+ {
+ iLastSeekAddr = iThisGroup;
+
+ iFileData = HBufC8::NewL( KGroupHeaderBytes );
+ iDataPtr.Set( iFileData->Des() );
+ if ( iObs )
+ {
+ iFile.Read( iThisGroup, iDataPtr, KGroupHeaderBytes, iStatus );
+ SetActive();
+ }
+ else
+ {
+ iStatus = iFile.Read( iThisGroup, iDataPtr, KGroupHeaderBytes );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRepairer::GroupToSeekArrayL
+// Appends next rec group's group time to seek array if interval time exeeded.
+// -----------------------------------------------------------------------------
+//
+void CRtpClipRepairer::GroupToSeekArrayL()
+ {
+ iGroupsTotalCount++;
+ const TInt delta( iGroupTime - iLastGroupTime );
+ if ( delta > KSeekArrayInterval )
+ {
+ LOG2( "CRtpClipRepairer::GroupToSeekArrayL(), iGroupsTotalCount: %d, iThisGroup: %d",
+ iGroupsTotalCount, iThisGroup );
+ iLastGroupTime = iGroupTime;
+ AppendSeekArrayL( iGroupTime, iThisGroup );
+ }
+
+ iPrevGroupPoint = iThisGroup;
+ iThisGroup = iNextGroupPoint;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRepairer::AddSpecialPacketL
+// Adds special packet to a new group to the end of clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpClipRepairer::AddSpecialPacketL(
+ const MRtpFileWriteObserver::TRtpType aType )
+ {
+ LOG1( "CRtpClipRepairer::AddSpecialPacketL(), aType: %d", aType );
+
+ // Read last group header
+ iThisGroup = iPrevGroupPoint;
+ ReadGroupHeaderL();
+
+ // End packet
+ HBufC8* bytes = CRtpUtil::SpecialPacketL( aType );
+ CleanupStack::PushL( bytes );
+ iFile.Write( iThisGroup + iGroupTotalLen, bytes->Des(), KSpecialPacketLength );
+ CleanupStack::PopAndDestroy( bytes );
+
+ // Update group total size (GTS)
+ iGroupTotalLen+= KSpecialPacketLength;
+ bytes = CRtpUtil::MakeBytesLC( iGroupTotalLen );
+ iFile.Write( iThisGroup, bytes->Des(), KIntegerBytes );
+ CleanupStack::PopAndDestroy( bytes );
+
+ // Update next group point (NGP)
+ iNextGroupPoint+= KSpecialPacketLength;
+ bytes = CRtpUtil::MakeBytesLC( iNextGroupPoint );
+ iFile.Write( iThisGroup + KIntegerBytes, bytes->Des(), KIntegerBytes );
+ CleanupStack::PopAndDestroy( bytes );
+
+ // Read packets total count (PTC)
+ bytes = HBufC8::NewLC( KPacketsCountBytes );
+ TPtr8 ptr( bytes->Des() );
+ iFile.Read( iThisGroup + KGroupHeaderBytes, ptr, KPacketsCountBytes );
+ const TInt packetsCount( CRtpUtil::GetValueL( ptr ) );
+ User::LeaveIfError( packetsCount );
+ CleanupStack::PopAndDestroy( bytes );
+
+ // Increment packets tolal count (PTC) by one
+ bytes = CRtpUtil::MakeBytesLC( packetsCount + 1 );
+ iFile.Write( iThisGroup + KGroupHeaderBytes, bytes->Des(), KPacketsCountBytes );
+ CleanupStack::PopAndDestroy( bytes );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRepairer::FinalizeSeekArrayL
+// Appends next rec group to seek array.
+// -----------------------------------------------------------------------------
+//
+void CRtpClipRepairer::FinalizeSeekArrayL( const TInt aError )
+ {
+ LOG1( "CRtpClipRepairer::FinalizeSeekArrayL(), aError: %d", aError );
+
+ // New seek array point
+ iMetaHeader->WriteSeekArrayPointL( iNextGroupPoint );
+
+ // Update duration
+ iMetaHeader->WriteDurationL( iGroupTime );
+
+ // Last group time
+ CRtpMetaHeader::SAttributes att;
+ iMetaHeader->ReadAttributesL( att );
+ att.iFailed = !( !aError );
+ att.iOngoing = EFalse;
+ att.iPlayCount = 0;
+ att.iPlaySpot = KErrNone;
+ iMetaHeader->WriteAttributesL( att );
+
+ // Finalise
+ SaveSeekArrayL();
+ WriteSeekHeaderL();
+ iFile.Flush();
+
+ // Set start time to file date
+ TTime startTime( 0 );
+ iMetaHeader->ReadStartTimeL( startTime );
+ iFile.SetModified( startTime );
+ iFile.Close();
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipHandler/src/CRtpFileBase.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,354 @@
+/*
+* 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: Implementation of the Common Recording Engine RTP file base class.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <ipvideo/CRtpFileBase.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+const TInt KFirstIntegerPoint( 0 );
+const TInt KSecondIntegerPoint( KFirstIntegerPoint + KIntegerBytes );
+const TInt KThirdIntegerPoint( KSecondIntegerPoint + KIntegerBytes );
+const TInt KFourthIntegerPoint( KThirdIntegerPoint + KIntegerBytes );
+const TInt KSeekArrayGranularity( 20 );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CRtpFileBase::CRtpFileBase
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CRtpFileBase::CRtpFileBase()
+ : CActive( CActive::EPriorityStandard ),
+ iMode( EModeNone ),
+ iThisGroup( KErrNotFound ),
+ iGroupsTotalCount( KErrNotFound ),
+ iFirstSeekAddr( KErrNotFound ),
+ iLastSeekAddr( KErrNotFound ),
+ iGroupTotalLen( KErrNotFound ),
+ iNextGroupPoint( KErrNotFound ),
+ iPrevGroupPoint( KErrNotFound ),
+ iGroupTime( 0 ),
+ iSeekHeaderPoint( KErrNotFound ),
+ iDataPtr( 0, 0 )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFileBase::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CRtpFileBase::ConstructL()
+ {
+ LOG( "CRtpFileBase::ConstructL()" );
+
+ iSeekArray = new( ELeave ) CArrayFixFlat<SSeek>( KSeekArrayGranularity );
+ }
+
+// -----------------------------------------------------------------------------
+// Destructor
+//
+// -----------------------------------------------------------------------------
+//
+CRtpFileBase::~CRtpFileBase()
+ {
+ LOG( "CRtpFileBase::~CRtpFileBase()" );
+ // Do not call Cancel here, it will cause crashes (DoCancel of inherited
+ // class is never called, instead it jumps to foobar address)
+ iFile.Close();
+ iFs.Close();
+ delete iCurrentPath;
+ delete iSeekArray;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFileBase::DeleteTimeShiftFiles
+// Deletes files used during time shift mode.
+// -----------------------------------------------------------------------------
+//
+void CRtpFileBase::DeleteTimeShiftFiles( RArray<STimeShiftSeek>& aShiftSeek )
+ {
+ LOG1( "CRtpFileBase::DeleteTimeShiftFiles(), count: %d", aShiftSeek.Count() );
+
+ TInt index( KErrNotFound );
+ const TInt count( aShiftSeek.Count() );
+ for ( TInt i( 0 ); i < count; i++ )
+ {
+ if ( aShiftSeek[i].iNameIndex != index )
+ {
+ TPath clipPath( KDvrTimeShiftFile );
+ index = aShiftSeek[i].iNameIndex;
+ clipPath.AppendNum( index );
+ iFs.Delete( clipPath );
+ LOG1( "CRtpFileBase::DeleteTimeShiftFiles(), deleted: %S", &clipPath );
+ }
+ }
+
+ aShiftSeek.Reset();
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFileBase::WriteSeekHeaderL
+// Writes seek header of all groups.
+// -----------------------------------------------------------------------------
+//
+void CRtpFileBase::WriteSeekHeaderL()
+ {
+ User::LeaveIfError( iSeekHeaderPoint );
+
+ HBufC8* data = HBufC8::NewLC( KSeekHeaderBytes );
+ TPtr8 ptr( data->Des() );
+
+ HBufC8* bytes = CRtpUtil::MakeBytesLC( iGroupsTotalCount );
+ ptr.Copy( bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+
+ bytes = CRtpUtil::MakeBytesLC( iFirstSeekAddr );
+ ptr.Append( bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+
+ bytes = CRtpUtil::MakeBytesLC( iLastSeekAddr );
+ ptr.Append( bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+
+ User::LeaveIfError( iFile.Write( iSeekHeaderPoint, ptr, KSeekHeaderBytes ) );
+ CleanupStack::PopAndDestroy( data );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFileBase::ReadSeekHeaderL
+// Readss seek header of all groups.
+// -----------------------------------------------------------------------------
+//
+void CRtpFileBase::ReadSeekHeaderL()
+ {
+ User::LeaveIfError( iSeekHeaderPoint );
+
+ HBufC8* bytes = HBufC8::NewLC( KSeekHeaderBytes );
+ TPtr8 ptr( bytes->Des() );
+ User::LeaveIfError( iFile.Read( iSeekHeaderPoint, ptr, KSeekHeaderBytes ) );
+ if ( ptr.Length() < KSeekHeaderBytes )
+ {
+ LOG( "CRtpFileBase::ReadSeekHeaderL(), Seek Header Corrupted" );
+ User::Leave( KErrCorrupt );
+ }
+
+ iGroupsTotalCount = CRtpUtil::GetValueL( ptr.Mid( KFirstIntegerPoint,
+ KIntegerBytes ) );
+ User::LeaveIfError( iGroupsTotalCount );
+ iFirstSeekAddr = CRtpUtil::GetValueL( ptr.Mid( KSecondIntegerPoint,
+ KIntegerBytes ) );
+ User::LeaveIfError( iFirstSeekAddr );
+ iLastSeekAddr = CRtpUtil::GetValueL( ptr.Mid( KThirdIntegerPoint,
+ KIntegerBytes ) );
+ User::LeaveIfError( iLastSeekAddr );
+ CleanupStack::PopAndDestroy( bytes );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFileBase::ReadGroupHeaderL
+// Reads group header.
+// -----------------------------------------------------------------------------
+//
+void CRtpFileBase::ReadGroupHeaderL()
+ {
+ User::LeaveIfError( iThisGroup );
+
+ HBufC8* bytes = HBufC8::NewLC( KGroupHeaderBytes );
+ TPtr8 ptr( bytes->Des() );
+
+ User::LeaveIfError( iFile.Read( iThisGroup, ptr, KGroupHeaderBytes ) );
+ UpdateGroupHeaderVariablesL( ptr );
+
+ CleanupStack::PopAndDestroy( bytes );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFileBase::UpdateGroupHeaderVariablesL
+// Updates group header variables from readed data.
+// -----------------------------------------------------------------------------
+//
+void CRtpFileBase::UpdateGroupHeaderVariablesL( const TDesC8& aDataPtr )
+ {
+ if ( aDataPtr.Length() < KGroupHeaderBytes )
+ {
+ LOG( "CRtpFileBase::UpdateGroupHeaderVariablesL(), Group Header Corrupted" );
+ User::Leave( KErrCorrupt );
+ }
+
+ iGroupTotalLen = CRtpUtil::GetValueL( aDataPtr.Mid( KFirstIntegerPoint ,
+ KIntegerBytes ) );
+ User::LeaveIfError( iGroupTotalLen );
+ iNextGroupPoint = CRtpUtil::GetValueL( aDataPtr.Mid( KSecondIntegerPoint,
+ KIntegerBytes ) );
+ User::LeaveIfError( iNextGroupPoint );
+ iPrevGroupPoint = CRtpUtil::GetValueL( aDataPtr.Mid( KThirdIntegerPoint,
+ KIntegerBytes ) );
+ User::LeaveIfError( iPrevGroupPoint );
+ iGroupTime = CRtpUtil::GetValueL( aDataPtr.Mid( KFourthIntegerPoint,
+ KIntegerBytes ) );
+ User::LeaveIfError( iGroupTime );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFileBase::AppendSeekArrayL
+// Appends one item to seek array.
+// -----------------------------------------------------------------------------
+//
+void CRtpFileBase::AppendSeekArrayL( const TUint aTime, const TInt aPoint )
+ {
+#ifdef CR_ALL_LOGS
+ LOG2( "CRtpFileBase::AppendSeekArrayL(), aTime: %u, aPoint: %d",
+ aTime, aPoint );
+#endif // CR_ALL_LOGS
+
+ SSeek seek;
+ seek.iTime = aTime;
+ seek.iPoint = aPoint;
+ iSeekArray->AppendL( seek );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFileBase::SaveSeekArrayL
+//
+// -----------------------------------------------------------------------------
+//
+void CRtpFileBase::SaveSeekArrayL()
+ {
+ LOG1( "CRtpFileBase::SaveSeekArrayL(), count: %d", iSeekArray->Count() );
+
+ const TInt len( KIntegerBytes + iSeekArray->Count() * 2 * KIntegerBytes );
+ HBufC8* data = HBufC8::NewLC( len );
+ TPtr8 ptr( data->Des() );
+
+ // Total count
+ HBufC8* bytes = CRtpUtil::MakeBytesLC( iSeekArray->Count() );
+ ptr.Copy( bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+
+ for ( TInt i( 0 ); i < iSeekArray->Count(); i++ )
+ {
+ // Time
+ bytes = CRtpUtil::MakeBytesLC( iSeekArray->At( i ).iTime );
+ ptr.Append( bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+
+ // Point
+ bytes = CRtpUtil::MakeBytesLC( iSeekArray->At( i ).iPoint );
+ ptr.Append( bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+
+#ifdef CR_ALL_LOGS
+ LOG3( "CRtpFileBase::SaveSeekArrayL(), ind: %d, time: %u, point: %d",
+ i, iSeekArray->At( i ).iTime, iSeekArray->At( i ).iPoint );
+#endif // CR_ALL_LOGS
+ }
+
+ User::LeaveIfError( iFile.Write( iNextGroupPoint, ptr, len ) );
+ CleanupStack::PopAndDestroy( data );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFileBase::ReadSeekArrayL
+//
+// -----------------------------------------------------------------------------
+//
+TBool CRtpFileBase::ReadSeekArrayL( const TInt aPoint )
+ {
+ User::LeaveIfError( aPoint );
+ HBufC8* bytes = HBufC8::NewLC( KIntegerBytes );
+ TPtr8 ptr( bytes->Des() );
+
+ // Verify read point
+ TInt size( KErrNotFound );
+ iFile.Size( size );
+ User::LeaveIfError( ( aPoint > ( size - KIntegerBytes ) ) * KErrCorrupt );
+
+ // Total count
+ User::LeaveIfError( iFile.Read( aPoint, ptr, KIntegerBytes ) );
+ const TInt count( CRtpUtil::GetValueL( ptr ) );
+ CleanupStack::PopAndDestroy( bytes );
+ LOG1( "CRtpFileBase::ReadSeekArrayL(), count: %d", count );
+
+ // Any point stored?
+ if ( count > 0 )
+ {
+ // Read array from clip
+ User::LeaveIfError( ( count > ( KMaxTInt / 2 / KIntegerBytes ) ) * KErrCorrupt );
+ const TInt len( count * 2 * KIntegerBytes );
+ HBufC8* data = HBufC8::NewLC( len );
+ ptr.Set( data->Des() );
+ User::LeaveIfError( iFile.Read( aPoint + KIntegerBytes, ptr, len ) );
+
+ // Set seek array
+ for ( TInt i( 0 ); i < count; i++ )
+ {
+ const TInt next( i * 2 * KIntegerBytes );
+ if ( ptr.Length() < ( next + ( 2 * KIntegerBytes ) ) )
+ {
+ LOG( "CRtpFileBase::ReadSeekArrayL(), Seek Array Corrupted" );
+ User::Leave( KErrCorrupt );
+ }
+
+ // Time
+ TUint time( CRtpUtil::GetValueL( ptr.Mid( next, KIntegerBytes ) ) );
+ // Point
+ TInt point( CRtpUtil::GetValueL( ptr.Mid( next + KIntegerBytes,
+ KIntegerBytes ) ) );
+ User::LeaveIfError( point );
+ AppendSeekArrayL( time, point );
+#ifdef CR_ALL_LOGS
+ LOG3( "CRtpFileBase::ReadSeekArrayL(), ind: %d, time: %u, point: %d",
+ i, time, point );
+#endif // CR_ALL_LOGS
+ }
+
+ CleanupStack::PopAndDestroy( data );
+ }
+
+ return ( count > 0 );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFileBase::LogVariables
+// -----------------------------------------------------------------------------
+//
+void CRtpFileBase::LogVariables( const TDesC& aMethod )
+ {
+#ifdef CR_ALL_LOGS
+ LOG1( "CRtpFileBase::LogVariables(), Method: %S", &aMethod );
+ LOG1( "CRtpFileBase::LogVariables(), iMode : %d", iMode );
+ LOG1( "CRtpFileBase::LogVariables(), GTC : %d", iGroupsTotalCount );
+ LOG1( "CRtpFileBase::LogVariables(), FSA : %d", iFirstSeekAddr );
+ LOG1( "CRtpFileBase::LogVariables(), LSA : %d", iLastSeekAddr );
+ LOG1( "CRtpFileBase::LogVariables(), This : %d", iThisGroup );
+ LOG1( "CRtpFileBase::LogVariables(), GTL : %d", iGroupTotalLen );
+ LOG1( "CRtpFileBase::LogVariables(), NGP : %d", iNextGroupPoint );
+ LOG1( "CRtpFileBase::LogVariables(), PGP : %d", iPrevGroupPoint );
+ LOG1( "CRtpFileBase::LogVariables(), GTime : %u", iGroupTime );
+#else // CR_ALL_LOGS
+ ( void )aMethod;
+#endif // CR_ALL_LOGS
+ }
+
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipHandler/src/CRtpFromFile.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,663 @@
+/*
+* 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: Implementation of the DVB-H Recording Manager RTP read class.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CRtpToFile.h"
+#include "CRtpFromFile.h"
+#include <ipvideo/CRtpMetaHeader.h>
+#include <ipvideo/CRtpClipManager.h>
+#include "CRtpTimer.h"
+#include <bsp.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+const TInt KReadTimerInterval( 1000 );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::NewL
+// Static two-phased constructor. Leaves object to cleanup stack.
+// -----------------------------------------------------------------------------
+//
+CRtpFromFile* CRtpFromFile::NewL(
+ MRtpFileReadObserver& aReadObs,
+ CRtpToFile* aToFile )
+ {
+ CRtpFromFile* self = new( ELeave ) CRtpFromFile( aReadObs, aToFile );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::CRtpFromFile
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CRtpFromFile::CRtpFromFile( MRtpFileReadObserver& aReadObs, CRtpToFile* aToFile )
+ : CRtpFileBase(),
+ iReadObs( aReadObs ),
+ iToFile( aToFile ),
+ iSkippedRead( EFalse ),
+ iDuration( 0 )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CRtpFromFile::ConstructL()
+ {
+ LOG( "CRtpFromFile::ConstructL()" );
+
+ CRtpFileBase::ConstructL();
+ }
+
+// -----------------------------------------------------------------------------
+// Destructor
+//
+CRtpFromFile::~CRtpFromFile()
+// -----------------------------------------------------------------------------
+ {
+ LOG( "CRtpFromFile::~CRtpFromFile()" );
+
+ Cancel();
+ delete iTimer; iTimer = NULL;
+ delete iFileData; iFileData = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::InitRtpReadL
+// Sets path of RTP file.
+// -----------------------------------------------------------------------------
+//
+void CRtpFromFile::InitRtpReadL(
+ const TDesC& aClipPath,
+ TInt8& aVersion,
+ const TBool aTimeShift )
+ {
+ LOG1( "CRtpFromFile::InitRtpReadL(), aClipPath: %S", &aClipPath );
+
+ // File server
+ if ( !iFs.Handle() )
+ {
+ User::LeaveIfError( iFs.Connect() );
+ }
+
+ // Open clip
+ aVersion = SwapClipL( aClipPath );
+
+ // Mode
+ iMode = ( aTimeShift )? EModeTimeShift: EModeNormal;
+
+#ifdef CR_ALL_LOGS
+ LogVariables( _L( "InitRtpReadL()" ) );
+#endif // CR_ALL_LOGS
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::InitRtpReadL
+// Sets path of RTP file.
+// -----------------------------------------------------------------------------
+//
+void CRtpFromFile::InitRtpReadL(
+ const RFile& aFileHandle,
+ TInt8& aVersion )
+ {
+ LOG( "CRtpFromFile::InitRtpReadL(), with handle" );
+
+ // File handle
+ if ( !iFs.Handle() )
+ {
+ User::LeaveIfError( iFs.Connect() );
+ }
+
+ // Duplicate handle
+ iFile.Close();
+ iFile.Duplicate( aFileHandle );
+
+ // File header
+ ReadClipHeaderL( aVersion );
+ delete iCurrentPath; iCurrentPath = NULL;
+ TFileName name( KNullDesC );
+ iFile.FullName( name );
+ iCurrentPath = name.AllocL();
+
+ // Mode
+ iMode = EModeNormal;
+
+#ifdef CR_ALL_LOGS
+ LogVariables( _L( "InitRtpReadL()" ) );
+#endif // CR_ALL_LOGS
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::SwapClipL
+// Sets new path of RTP file.
+// -----------------------------------------------------------------------------
+//
+TInt8 CRtpFromFile::SwapClipL( const TDesC& aClipPath )
+ {
+ LOG1( "CRtpFromFile::SwapClipL(), aClipPath: %S", &aClipPath );
+
+ iFile.Close();
+ if ( !iFs.Handle() )
+ {
+ User::Leave( KErrBadHandle );
+ }
+
+ // Delete used clip
+ if ( iMode == EModeTimeShift )
+ {
+ iFs.Delete( *iCurrentPath );
+ }
+
+ // Open new
+ User::LeaveIfError( iFile.Open( iFs, aClipPath,
+ EFileShareAny | EFileStream | EFileRead ) );
+ // File header
+ TInt8 version( 0 );
+ ReadClipHeaderL( version );
+ delete iCurrentPath; iCurrentPath = NULL;
+ iCurrentPath = aClipPath.AllocL();
+
+ return version;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::ReadNextGroupL
+// Reads next RTP packets group from a specified file.
+// -----------------------------------------------------------------------------
+//
+TInt CRtpFromFile::ReadNextGroupL( const TInt aGroupPoint )
+ {
+ User::LeaveIfError( iMode );
+ TBool delayedRead( EFalse );
+
+ // Allready active??
+ if ( iFileData )
+ {
+ if ( iTimer || IsActive() )
+ {
+ return KErrInUse; // Read already started, indication, not error
+ }
+ else
+ {
+ // Packet read may happen during iReadObs.RtpGroupReaded() call
+ LOG( "CRtpFromFile::ReadNextGroupL(), Delayed read !" );
+ delayedRead = ETrue;
+ }
+ }
+
+ // Is watch during recording too close to live?
+ if ( iToFile && iNextGroupPoint >= LastSeekAddr() )
+ {
+ iSkippedRead = ETrue;
+ LOG( "CRtpFromFile::ReadNextGroupL(), Too close to live !" );
+ return KErrEof; // No read actions now, indication, not error
+ }
+
+ // Group
+ iThisGroup = ( aGroupPoint > KErrNotFound )? aGroupPoint: iNextGroupPoint;
+
+ // Ok to read more?
+ if ( iThisGroup > iLastSeekAddr || iGroupTime >= iDuration )
+ {
+ LOG( "CRtpFromFile::ReadNextGroupL(), All packets readed !" );
+ User::Leave( KErrEof );
+ }
+
+ // Read group
+ if ( delayedRead )
+ {
+ delete iTimer; iTimer = NULL;
+ iTimer = CRtpTimer::NewL( *this );
+ iTimer->After( KReadTimerInterval );
+ }
+ else
+ {
+ ReadGroupHeaderL();
+ ReadNextGroupFromFileL();
+ }
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::GetClipSdpL
+// Reads SDP from a current clip. SDP is stored to meta header during recording.
+// -----------------------------------------------------------------------------
+//
+HBufC8* CRtpFromFile::GetClipSdpL()
+ {
+ User::LeaveIfError( iMode );
+ CRtpMetaHeader* metaheader = CRtpMetaHeader::NewLC(
+ iFile, CRtpMetaHeader::EMetaRead );
+ HBufC8* sdp = metaheader->ReadSdpDataL();
+ CleanupStack::PopAndDestroy( metaheader );
+ return sdp;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::ReadSkippedGroup
+// Reads one RTP packet from a specified file if previous read was skipped.
+// -----------------------------------------------------------------------------
+//
+void CRtpFromFile::ReadSkippedGroup()
+ {
+ if ( iSkippedRead && iNextGroupPoint < LastSeekAddr() &&
+ iMode != EModeNone && iFileData != NULL )
+ {
+ iSkippedRead = EFalse;
+ iThisGroup = iNextGroupPoint;
+ TRAP_IGNORE( ReadGroupHeaderL();
+ ReadNextGroupFromFileL() );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::UpdateLastSeekAddr
+// Updates final last seek addres from clip write when recording stopped.
+// -----------------------------------------------------------------------------
+//
+void CRtpFromFile::UpdateLastSeekAddr()
+ {
+ if ( iToFile )
+ {
+ iDuration = iToFile->GetCurrentLength();
+ iLastSeekAddr = iToFile->LastSeekAddr();
+
+ LOG2( "CRtpFromFile::UpdateLastSeekAddr(), iLastSeekAddr: %d, iDuration: %d",
+ iLastSeekAddr, iDuration );
+ // Recording is stopped
+ iToFile = NULL;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::SetSeekPointL
+// Sets the seek point of the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpFromFile::SetSeekPointL( const TUint aTime )
+ {
+ Cancel();
+ delete iTimer; iTimer = NULL;
+ delete iFileData; iFileData = NULL;
+ User::LeaveIfError( iMode );
+
+ // Group from the seek array, accuracy 30s
+ iThisGroup = FindSeekGroup( aTime, ( iToFile )? iToFile->SeekArray(): iSeekArray );
+ LOG2( "CRtpFromFile::SetSeekPointL(), aTime: %d, group from seek array: %d",
+ aTime, iThisGroup );
+ if ( iThisGroup == KErrNotFound )
+ {
+ iThisGroup = iFirstSeekAddr;
+ }
+ ReadGroupHeaderL();
+
+ // Find group basing on the seek time, accuracy 0 - 3 s
+ if ( aTime > 0 )
+ {
+ while ( aTime > iGroupTime && iNextGroupPoint < iLastSeekAddr )
+ {
+ // Next group
+ iThisGroup = iNextGroupPoint;
+ ReadGroupHeaderL();
+#ifdef CR_ALL_LOGS
+ LOG2( "CRtpFromFile::SetSeekPointL(), iThisGroup: %u, iGroupTime: %u",
+ iThisGroup, iGroupTime );
+#endif // CR_ALL_LOGS
+ }
+ }
+
+ // Prepare for next read, one extra group back looks better
+ iNextGroupPoint = ( iPrevGroupPoint > iFirstSeekAddr ) ?
+ iPrevGroupPoint : iThisGroup;
+ delete iFileData; iFileData = NULL;
+
+ LOG1( "CRtpFromFile::SetSeekPointL(), iNextGroupPoint: %d",
+ iNextGroupPoint );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::StopRtpRead
+// Stops file reading.
+// -----------------------------------------------------------------------------
+//
+void CRtpFromFile::StopRtpRead( const TInt aStatus, const TUint aPlayerBuf )
+ {
+ LOG2( "CRtpFromFile::StopRtpRead(), aStatus: %d, aPlayerBuf: %u",
+ aStatus, aPlayerBuf );
+ LOG2( "CRtpFromFile::StopRtpRead(), iMode: %d, iGroupTime: %d",
+ iMode, iGroupTime );
+ Cancel();
+ if ( iMode != EModeNone )
+ {
+ iFile.ReadCancel();
+
+#ifdef CR_ALL_LOGS
+ LogVariables( _L( "StopRtpRead()" ) );
+#endif // CR_ALL_LOGS
+ }
+
+ delete iTimer; iTimer = NULL;
+ delete iFileData; iFileData = NULL;
+ if ( iMode == EModeNormal || iMode == EModeHandle )
+ {
+ // Try to seek back to what user sees for continue play spot
+ if ( !aStatus & iThisGroup > 0 && iThisGroup < iLastSeekAddr )
+ {
+ const TInt thisGroup( iThisGroup );
+ TRAPD( err, SetSeekPointL( iGroupTime - aPlayerBuf ) );
+ if ( err )
+ {
+ LOG1( "CRtpFromFile::StopRtpRead(), SetSeekPointL Leaved: %d", err );
+ iThisGroup = thisGroup;
+ }
+ }
+
+ // Update meta header if no error
+ if ( !aStatus )
+ {
+ TInt err ( KErrNone );
+ if ( iToFile )
+ {
+ TRAP( err, iToFile->UpdatePlayAttL( iThisGroup ) );
+ }
+ else
+ {
+ TRAP( err, UpdatePlayAttL() );
+ }
+
+ // Possible error ignored
+ if ( err )
+ {
+ LOG1( "CRtpFromFile::StopRtpRead(), UpdatePlayAttL Leaved: %d", err );
+ }
+ }
+ }
+
+ iMode = EModeNone;
+ iFile.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::RunL
+// -----------------------------------------------------------------------------
+//
+void CRtpFromFile::RunL()
+ {
+ User::LeaveIfError( iStatus.Int() );
+
+ // All groups readed?
+ if ( iThisGroup >= iLastSeekAddr ||
+ ( iNextGroupPoint >= iLastSeekAddr &&
+ iToFile && iToFile->Action() == MRtpFileWriteObserver::ESavePause ) )
+ {
+ LOG2( "CRtpFromFile::RunL(), All groups readed ! total: %d, iDuration: %d",
+ iThisGroup, iDuration );
+ iGroupTime = iDuration;
+ }
+
+ iReadObs.GroupReadedL( iDataPtr, iGroupTime, ( iGroupTime >= iDuration ) );
+ delete iFileData; iFileData = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::RunError
+// -----------------------------------------------------------------------------
+//
+TInt CRtpFromFile::RunError( TInt aError )
+ {
+ LOG1( "CRtpFromFile::RunError(), RunL Leaved: %d", aError );
+
+ iReadObs.ReadStatus( aError );
+ StopRtpRead( aError, 0 );
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CRtpFromFile::DoCancel()
+ {
+ LOG( "CRtpFromFile::DoCancel()" );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::TimerEventL
+// Internal timer call this when triggered.
+// -----------------------------------------------------------------------------
+//
+void CRtpFromFile::TimerEventL()
+ {
+ LOG( "CRtpFromFile::TimerEventL() in" );
+
+ ReadGroupHeaderL();
+ ReadNextGroupFromFileL();
+ delete iTimer; iTimer = NULL;
+
+ LOG( "CRtpFromFile::TimerEventL() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::TimerError
+// Internal timer call this when TimerEventL() leaves.
+// -----------------------------------------------------------------------------
+//
+void CRtpFromFile::TimerError( const TInt aError )
+ {
+ LOG1( "CRtpFromFile::TimerError(), TimerEventL Leaved: %d", aError );
+
+ StopRtpRead( aError, 0 );
+ delete iTimer; iTimer = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::ReadClipHeaderL
+// Reads meta data and seek header from the beginning of the file.
+// -----------------------------------------------------------------------------
+//
+void CRtpFromFile::ReadClipHeaderL( TInt8& aVersion )
+ {
+ LOG1( "CRtpFromFile::ReadClipHeaderL(), iToFile: %d", iToFile );
+
+ if ( !iToFile )
+ {
+ TInt seekArrayPoint( KErrNotFound );
+ aVersion = ReadMetaHeaderL( iSeekHeaderPoint, seekArrayPoint );
+ ReadSeekHeaderL();
+
+ // Read seek array if exist
+ if ( seekArrayPoint > iLastSeekAddr )
+ {
+ ReadSeekArrayL( seekArrayPoint );
+ }
+ }
+ else // Recording ongoing with the same clip
+ {
+ aVersion = KCurrentClipVersion;
+ iSeekHeaderPoint = iToFile->SeekHeaderPoint();
+ iGroupsTotalCount = iToFile->GroupsTotalCount();
+ iFirstSeekAddr = iToFile->FirstSeekAddr();
+ iLastSeekAddr = iToFile->LastSeekAddr();
+ }
+
+ iNextGroupPoint = iFirstSeekAddr;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::ReadMetaHeaderL
+// Reads meta data header from the beginning of the file.
+// -----------------------------------------------------------------------------
+//
+TInt8 CRtpFromFile::ReadMetaHeaderL(
+ TInt& aSeekHeaderPoint,
+ TInt& aSeekArrayPoint )
+ {
+ CRtpMetaHeader* metaheader = CRtpMetaHeader::NewLC(
+ iFile, CRtpMetaHeader::EMetaRead );
+ aSeekHeaderPoint = metaheader->SeekHeaderPoint();
+ metaheader->ReadSeekArrayPointL( aSeekArrayPoint );
+ LOG2( "CRtpFromFile::ReadMetaHeaderL(), aSeekHeaderPoint: %d, aSeekArrayPoint: %d",
+ aSeekHeaderPoint, aSeekArrayPoint );
+ // Clip version
+ CRtpMetaHeader::SAttributes att;
+ metaheader->ReadAttributesL( att );
+ metaheader->ReadDurationL( iDuration );
+
+ // Verify post rule
+ CRtpClipManager* clipManager = CRtpClipManager::NewLC();
+ clipManager->VerifyPostRuleL( att.iPostRule, metaheader );
+ CleanupStack::PopAndDestroy( clipManager );
+ CleanupStack::PopAndDestroy( metaheader );
+
+ LOG2( "CRtpFromFile::ReadMetaHeaderL(), Version: %d, Duration: %d",
+ att.iVersion, iDuration );
+ return att.iVersion;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::ReadNextGroupFromFileL
+// Reads RTP payload from a file.
+// Payload is allways after data header, so read position set is not needed.
+// -----------------------------------------------------------------------------
+//
+void CRtpFromFile::ReadNextGroupFromFileL()
+ {
+ LOG2( "CRtpFromFile::ReadNextGroupFromFileL(), iThisGroup: %d, iGroupTime: %u",
+ iThisGroup, iGroupTime );
+#ifdef CR_ALL_LOGS
+ LogVariables( _L( "ReadNextGroupFromFileL()" ) );
+#endif // CR_ALL_LOGS
+
+ const TInt len( iGroupTotalLen - KGroupHeaderBytes );
+ if ( len <= 0 || iThisGroup < iFirstSeekAddr || iThisGroup > iLastSeekAddr )
+ {
+#ifdef CR_ALL_LOGS
+ LogVariables( _L( "ReadNextGroupFromFileL()" ) );
+#endif // CR_ALL_LOGS
+
+ LOG( "CRtpFromFile::ReadNextGroupFromFileL(), No More Groups" );
+ User::Leave( KErrEof );
+ }
+
+ // Reading should never be active at this point
+ if ( iFileData != NULL )
+ {
+ LOG( "CRtpFromFile::ReadNextGroupFromFileL(), Invalid usage of class !" );
+ User::Leave( KErrGeneral );
+ }
+
+ // Start reading group
+ iFileData = HBufC8::NewL( len );
+ iDataPtr.Set( iFileData->Des() );
+ iFile.Read( iThisGroup + KGroupHeaderBytes, iDataPtr, len, iStatus );
+ SetActive();
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::FindSeekGroup
+// Finds closes point with seek array, accuracy about 0 - 30 s.
+// -----------------------------------------------------------------------------
+//
+TInt CRtpFromFile::FindSeekGroup( const TUint aTime, CArrayFix<SSeek>* aArray )
+ {
+ if ( aArray->Count() && aTime >= aArray->At( 0 ).iTime )
+ {
+ for ( TInt i( aArray->Count() - 1 ); i > 0 ; i-- )
+ {
+#ifdef CR_ALL_LOGS
+ LOG3( "CRtpFromFile::FindSeekGroup(), ind: %d, aTime: %u, array time: %u",
+ i, aTime, aArray->At( i ).iTime );
+#endif //CR_ALL_LOGS
+
+ if ( aTime > aArray->At( i ).iTime )
+ {
+ return aArray->At( i ).iPoint;
+ }
+ }
+
+ return aArray->At( 0 ).iPoint;
+ }
+
+ return KErrNotFound;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::UpdatePlayAttL
+// Updates clip's playback count and spot attributes after watching.
+// -----------------------------------------------------------------------------
+//
+void CRtpFromFile::UpdatePlayAttL()
+ {
+ // Update attributes
+ if ( iMode == EModeNormal )
+ {
+ iFile.Close();
+ User::LeaveIfError( iFile.Open( iFs, *iCurrentPath,
+ EFileShareAny | EFileStream | EFileWrite ) );
+ }
+
+ CRtpMetaHeader* metaheader = CRtpMetaHeader::NewLC(
+ iFile, CRtpMetaHeader::EMetaUpdate );
+ TTime startTime( 0 );
+ metaheader->ReadStartTimeL( startTime );
+
+ CRtpMetaHeader::SAttributes att;
+ metaheader->ReadAttributesL( att );
+
+ // Step playback counter by one
+ att.iPlayCount++;
+ // Update play spot
+ att.iPlaySpot = ( iThisGroup > 0 && iThisGroup < iLastSeekAddr )? iThisGroup:
+ KErrNone;
+ metaheader->WriteAttributesL( att );
+ CleanupStack::PopAndDestroy( metaheader );
+ LOG2( "CRtpFromFile::UpdatePlayAttL(), New play count: %d, spot: %d",
+ att.iPlayCount, att.iPlaySpot );
+ // Set start time to file date
+ iFile.SetModified( startTime );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::LastSeekAddr
+// Gets last seek addres.
+// It is either from opened clip or from file writer when recording is ongoing.
+// -----------------------------------------------------------------------------
+//
+TInt CRtpFromFile::LastSeekAddr()
+ {
+ if ( iToFile )
+ {
+ iLastSeekAddr = iToFile->LastSeekAddr();
+ }
+
+ return iLastSeekAddr;
+ }
+
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipHandler/src/CRtpMetaHeader.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,625 @@
+/*
+* 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: Implementation of the Common Recording Engine RTP read class.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <ipvideo/CRtpMetaHeader.h>
+#include <bsp.h>
+#include <etelmm.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+// None
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::NewL
+// Static two-phased constructor. Leaves object to cleanup stack.
+// -----------------------------------------------------------------------------
+//
+CRtpMetaHeader* CRtpMetaHeader::NewL( RFile& aFile, const TMetaMode& aMode )
+ {
+ CRtpMetaHeader* self = CRtpMetaHeader::NewLC( aFile, aMode );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::NewLC
+// Static two-phased constructor. Leaves object to cleanup stack.
+// -----------------------------------------------------------------------------
+//
+CRtpMetaHeader* CRtpMetaHeader::NewLC( RFile& aFile, const TMetaMode& aMode )
+ {
+ CRtpMetaHeader* self = new( ELeave ) CRtpMetaHeader( aFile, aMode );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::CRtpMetaHeader
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CRtpMetaHeader::CRtpMetaHeader( RFile& aFile, const TMetaMode& aMode )
+ : iFile( aFile ),
+ iMode( aMode ),
+ iMetaData( NULL ),
+ iDataPtr( 0, 0 ),
+ iEsgDataPoint( KErrNotFound ),
+ iSrtpDataPoint( KErrNotFound ),
+ iSdpDataPoint( KErrNotFound ),
+ iMetaTotal( KErrNotFound )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::ConstructL()
+ {
+ LOG( "CRtpMetaHeader::ConstructL()" );
+
+ // Mode
+ if ( iMode == EMetaRead || iMode == EMetaUpdate )
+ {
+ // Read whole meta area
+ ReadTintFromFileL( KMetaLengthPoint, iMetaTotal );
+
+ // Meta header has reasonable length?
+ if ( iMetaTotal > KMaxMetaHeaderLength || iMetaTotal <= 0 )
+ {
+ LOG( "CRtpMetaHeader::ConstructL(), Meta Total Corrupted" );
+ User::Leave( KErrCorrupt );
+ }
+
+ // Room for header
+ iMetaData = HBufC8::NewL( iMetaTotal );
+ iDataPtr.Set( iMetaData->Des() );
+ User::LeaveIfError( iFile.Read( KMetaLengthPoint, iDataPtr, iMetaTotal ) );
+
+ // All data exist in meta header?
+ if ( iDataPtr.Length() < iMetaTotal )
+ {
+ LOG( "CRtpMetaHeader::ConstructL(), Meta Header Corrupted" );
+ User::Leave( KErrCorrupt );
+ }
+
+ // ESG data point ( device info point + device info data )
+ iEsgDataPoint = KDeviceInfoPoint + KStringLengthBytes +
+ iDataPtr[KDeviceInfoPoint];
+
+ // SRTP data point ( ESG data point + Service name + Program name )
+ TInt snp( iEsgDataPoint + KStringLengthBytes + iDataPtr[iEsgDataPoint] );
+ iSrtpDataPoint = snp + KStringLengthBytes + iDataPtr[snp];
+
+ // SDD file point ( SRTP data point + SRTP data )
+ const TInt srtplen( CRtpUtil::GetValueL(
+ iDataPtr.Mid( iSrtpDataPoint, KIntegerBytes ) ) );
+ User::LeaveIfError( srtplen );
+ iSdpDataPoint = iSrtpDataPoint + KIntegerBytes + srtplen;
+ }
+ else // Write
+ {
+ iMetaData = HBufC8::NewL( 0 );
+ // Room for meta length
+ iMetaTotal = KMetaLengthPoint;
+ AddIntegerL( KMetaLengthPoint, KErrNotFound );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// Destructor
+//
+CRtpMetaHeader::~CRtpMetaHeader()
+// -----------------------------------------------------------------------------
+ {
+ LOG( "CRtpMetaHeader::~CRtpMetaHeader()" );
+
+ delete iMetaData;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::SeekHeaderPoint
+// Getter for seek header point.
+// Returns: Point to seek header
+// -----------------------------------------------------------------------------
+//
+TInt CRtpMetaHeader::SeekHeaderPoint()
+ {
+ return iMetaTotal;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::CommitL
+// Writes meta header to the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::CommitL()
+ {
+ LOG( "CRtpMetaHeader::CommitL() in" );
+
+ User::LeaveIfError( iMetaTotal );
+ User::LeaveIfError( ( iMetaTotal > KMaxMetaHeaderLength ) * KErrCorrupt );
+
+ if ( iMode == EMetaWrite )
+ {
+ User::LeaveIfError( iEsgDataPoint );
+ User::LeaveIfError( iSrtpDataPoint );
+ User::LeaveIfError( iSdpDataPoint );
+
+ // Meta length
+ iDataPtr.Delete( KMetaLengthPoint, KIntegerBytes );
+ AddIntegerL( KMetaLengthPoint, iMetaTotal );
+
+ User::LeaveIfError( iFile.Write( iDataPtr, iMetaTotal ) );
+ }
+
+ LOG( "CRtpMetaHeader::CommitL() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::WriteAttributesL
+// Writes atributes to meta data header of the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::WriteAttributesL( const SAttributes& aAtt )
+ {
+ TInt data( 0 );
+ data|= aAtt.iOngoing << KOngoingFlagShift;
+ data|= aAtt.iCompleted << KCompletedFlagShift;
+ data|= aAtt.iProtected << KProtectedFlagShift;
+ data|= aAtt.iFailed << KFailedFlagShift;
+ data|= aAtt.iVersion << KVersionFieldShift;
+ data|= aAtt.iQuality << KQualityFieldShift;
+ data|= aAtt.iPostRule << KPostRuleFieldShift;
+ data|= aAtt.iParental << KParentalFieldShift;
+
+ AddIntegerL( KAttributesPoint, data );
+ AddIntegerL( KPlayCountPoint, aAtt.iPlayCount );
+ AddIntegerL( KPlaySpotPoint, aAtt.iPlaySpot );
+
+ // Reserved room for 4 integers
+ AddIntegerL( KReservedPoint1, 0 );
+ AddIntegerL( KReservedPoint2, 0 );
+ AddIntegerL( KReservedPoint3, 0 );
+ AddIntegerL( KReservedPoint4, 0 );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::WriteStartTimeL
+// Writes start date/time info to meta header of the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::WriteStartTimeL( const TTime& aTime )
+ {
+ AddTimeL( KStartTimePoint, aTime );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::WriteEndTimeL
+// Writes end date/time info to meta header of the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::WriteEndTimeL( const TTime& aTime )
+ {
+ AddTimeL( KEndTimePoint, aTime );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::WriteDurationL
+// Writes duration of clip to meta header of the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::WriteDurationL( const TInt aDuration )
+ {
+ AddIntegerL( KDurationPoint, aDuration );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::WriteSeekArrayPointL
+// Writes seek array point of clip to meta header of the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::WriteSeekArrayPointL( const TInt aPoint )
+ {
+ AddIntegerL( KSeekArrayPoint, aPoint );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::WriteUserIdL
+// Writes user id to meta header of the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::WriteUserIdL( const TDesC& aId )
+ {
+ WriteStringDataL( KUserIdPoint, aId );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::WriteDeviceInfoL
+// Writes device info to meta header of the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::WriteDeviceInfoL( const TDesC& aInfo )
+ {
+ WriteStringDataL( KDeviceInfoPoint, aInfo );
+ iEsgDataPoint = KDeviceInfoPoint + KStringLengthBytes + aInfo.Length();
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::WriteEsgDataL
+// Writes ESG data to meta header of the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::WriteEsgDataL( const TDesC& aService, const TDesC& aProgram )
+ {
+ // Device info must exist first
+ User::LeaveIfError( iEsgDataPoint );
+
+ // Service name
+ WriteStringDataL( iEsgDataPoint, aService );
+
+ // Program name
+ const TInt prog( iEsgDataPoint + KStringLengthBytes + aService.Length() );
+ WriteStringDataL( prog, aProgram );
+ iSrtpDataPoint = prog + KStringLengthBytes + aProgram.Length();
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::WriteSrtpDataL
+// Writes SRTP data to meta header of the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::WriteSrtpDataL( const TDesC8& aSrtpData )
+ {
+ // ESG data must exist first
+ User::LeaveIfError( iSrtpDataPoint );
+ User::LeaveIfError( ( iMode!=EMetaWrite ) * KErrAccessDenied );
+
+ AddIntegerL( iSrtpDataPoint, aSrtpData.Length() );
+ AddDataL( iSrtpDataPoint + KIntegerBytes, aSrtpData );
+ iSdpDataPoint = iSrtpDataPoint + KIntegerBytes + aSrtpData.Length();
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::WriteSdpDataL
+// Writes SDP file data to meta header of the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::WriteSdpDataL( const TDesC8& aSdpData )
+ {
+ // SRTP data must exist first
+ User::LeaveIfError( iSdpDataPoint );
+ User::LeaveIfError( ( iMode != EMetaWrite ) * KErrAccessDenied );
+
+ if ( aSdpData.Length() )
+ {
+ AddIntegerL( iSdpDataPoint, aSdpData.Length() );
+ AddDataL( iSdpDataPoint + KIntegerBytes, aSdpData );
+ }
+ else
+ {
+ AddIntegerL( iSdpDataPoint, 0 );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::ReadAttributesL
+// Reads attributes of meta data header from clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::ReadAttributesL( SAttributes& aAtt )
+ {
+ aAtt.iVersion = 0;
+
+ // Attributes
+ HBufC8* bytes = iDataPtr.Mid( KAttributesPoint, KIntegerBytes ).AllocLC();
+ TUint data( CRtpUtil::GetValueL( bytes->Des() ) );
+ CleanupStack::PopAndDestroy( bytes );
+ aAtt.iOngoing = ( data >> KOngoingFlagShift ) & ETrue;
+ aAtt.iCompleted = ( data >> KCompletedFlagShift ) & ETrue;
+ aAtt.iProtected = ( data >> KProtectedFlagShift ) & ETrue;
+ aAtt.iFailed = ( data >> KFailedFlagShift ) & ETrue;
+ aAtt.iVersion = ( TUint8 )( ( data >> KVersionFieldShift ) & 0xF );
+ aAtt.iQuality = ( TUint8 )( ( data >> KQualityFieldShift ) & KMaxTUint8 );
+ aAtt.iPostRule = ( TUint8 )( ( data >> KPostRuleFieldShift ) & KMaxTUint8 );
+ aAtt.iParental = ( TUint8 )( ( data >> KParentalFieldShift ) & KMaxTUint8 );
+
+ // Play count
+ bytes = iDataPtr.Mid( KPlayCountPoint, KIntegerBytes ).AllocLC();
+ aAtt.iPlayCount = CRtpUtil::GetValueL( bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+
+ // Play start spot
+ bytes = iDataPtr.Mid( KPlaySpotPoint, KIntegerBytes ).AllocLC();
+ aAtt.iPlaySpot = CRtpUtil::GetValueL( bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+
+ // Reserved room for 4 integers
+ /*
+ bytes = iDataPtr.Mid( KReservedPoint1, KIntegerBytes ).AllocLC();
+ aAtt.iReservedX = CRtpUtil::GetValueL( bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+
+ bytes = iDataPtr.Mid( KReservedPoint2, KIntegerBytes ).AllocLC();
+ aAtt.iReservedX = CRtpUtil::GetValueL( bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+
+ bytes = iDataPtr.Mid( KReservedPoint3, KIntegerBytes ).AllocLC();
+ aAtt.iReservedX = CRtpUtil::GetValueL( bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+
+ bytes = iDataPtr.Mid( KReservedPoint4, KIntegerBytes ).AllocLC();
+ aAtt.iReservedX = CRtpUtil::GetValueL( bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+ */
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::ReadStartTimeL
+// Reads date/time of meta header from the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::ReadStartTimeL( TTime& aTime )
+ {
+ GetTimeL( KStartTimePoint, aTime );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::ReadEndTimeL
+// Reads date/time of meta header from the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::ReadEndTimeL( TTime& aTime )
+ {
+ GetTimeL( KEndTimePoint, aTime );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::ReadDurationL
+// Reads clip duration of meta header from the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::ReadDurationL( TInt& aDuration )
+ {
+ HBufC8* bytes = iDataPtr.Mid( KDurationPoint, KIntegerBytes ).AllocLC();
+ aDuration = CRtpUtil::GetValueL( bytes->Des() );
+ User::LeaveIfError( aDuration );
+ CleanupStack::PopAndDestroy( bytes );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::ReadSeekArrayPointL
+// Reads seek array point of meta header from the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::ReadSeekArrayPointL( TInt& aPoint )
+ {
+ HBufC8* bytes = iDataPtr.Mid( KSeekArrayPoint, KIntegerBytes ).AllocLC();
+ aPoint = CRtpUtil::GetValueL( bytes->Des() );
+ User::LeaveIfError( aPoint );
+ CleanupStack::PopAndDestroy( bytes );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::ReadUserIdL
+// Reads user id of meta header from the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::ReadUserIdL( TDes& aId )
+ {
+ ReadStringDataL( KUserIdPoint, aId );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::ReadDeviceInfoL
+// Reads device info of meta header from the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::ReadDeviceInfoL( TDes& aInfo )
+ {
+ ReadStringDataL( KDeviceInfoPoint, aInfo );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::ReadEsgDataL
+// Reads ESG data of meta header from the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::ReadEsgDataL( TDes& aService, TDes& aProgram )
+ {
+ User::LeaveIfError( iEsgDataPoint );
+
+ // Service name
+ ReadStringDataL( iEsgDataPoint, aService );
+
+ // Program name
+ const TInt prog( iEsgDataPoint + KStringLengthBytes + aService.Length() );
+ ReadStringDataL( prog, aProgram );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::ReadSrtpDataL
+// Reads SRTP data of meta header from the clip.
+// -----------------------------------------------------------------------------
+//
+HBufC8* CRtpMetaHeader::ReadSrtpDataL()
+ {
+ User::LeaveIfError( iSrtpDataPoint );
+
+ // Length
+ const TInt len( CRtpUtil::GetValueL(
+ iDataPtr.Mid( iSrtpDataPoint, KIntegerBytes ) ) );
+ // Data
+ const TInt total( iSrtpDataPoint + KIntegerBytes + len );
+ User::LeaveIfError( ( len < 0 || total > iDataPtr.MaxLength() ) * KErrCorrupt );
+ HBufC8* buf = iDataPtr.Mid( iSrtpDataPoint + KIntegerBytes, len ).AllocL();
+ return buf;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::ReadSdpDataL
+// Reads SDP file data of meta header from the clip.
+// -----------------------------------------------------------------------------
+//
+HBufC8* CRtpMetaHeader::ReadSdpDataL()
+ {
+ User::LeaveIfError( iSdpDataPoint );
+
+ // Length
+ const TInt len( CRtpUtil::GetValueL(
+ iDataPtr.Mid( iSdpDataPoint, KIntegerBytes ) ) );
+ // Data
+ const TInt total( iSdpDataPoint + KIntegerBytes + len );
+ User::LeaveIfError( ( len <= 0 || total > iDataPtr.MaxLength() ) * KErrCorrupt );
+ HBufC8* buf = iDataPtr.Mid( iSdpDataPoint + KIntegerBytes, len ).AllocL();
+ return buf;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::WriteStringDataL
+// Writes data with length info to meta header of the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::WriteStringDataL( const TInt aPosition, const TDesC& aData )
+ {
+ const TInt len( aData.Length() );
+ User::LeaveIfError( ( len > TInt( KMaxTUint8 ) ) * KErrArgument );
+ User::LeaveIfError( ( iMode != EMetaWrite ) * KErrAccessDenied );
+
+ // Length
+ TBuf8<KStringLengthBytes> buf( KNullDesC8 );
+ buf.Append( KCharSpace );
+ buf[0] = ( TUint8 )( len );
+ AddDataL( aPosition, buf );
+
+ // Data to 8-bit
+ HBufC8* data = HBufC8::NewLC( aData.Length() );
+ TPtr8 ptr( data->Des() );
+ ptr.Copy( aData );
+ AddDataL( aPosition + KStringLengthBytes, ptr );
+ CleanupStack::PopAndDestroy( data );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::ReadStringDataL
+// Reads data with length info of meta header from the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::ReadStringDataL( const TInt aPosition, TDes& aData )
+ {
+ User::LeaveIfError( ( aPosition < 0 || aPosition > iDataPtr.Length() )
+ * KErrArgument );
+ const TInt len( iDataPtr[aPosition] );
+ User::LeaveIfError( ( len < 0 || len > TInt( KMaxTUint8 ) ) * KErrCorrupt );
+ User::LeaveIfError( ( len > aData.MaxLength() ) * KErrArgument );
+
+ aData.Copy( iDataPtr.Mid( aPosition + KStringLengthBytes, len ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::AddTimeL
+// Writes data/time or duration of clip to meta header of the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::AddTimeL( const TInt aPosition, const TTime& aTime )
+ {
+ HBufC8* bytes = CRtpUtil::MakeBytesLC( I64LOW( aTime.Int64() ) );
+ AddDataL( aPosition, bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+
+ bytes = CRtpUtil::MakeBytesLC( I64HIGH( aTime.Int64() ) );
+ AddDataL( aPosition + KIntegerBytes, bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::GetTimeL
+// Reads time value of meta header from the clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::GetTimeL( const TInt aPosition, TTime& aTime )
+ {
+ TUint low( CRtpUtil::GetValueL(
+ iDataPtr.Mid( aPosition, KIntegerBytes ) ) );
+ TUint high( CRtpUtil::GetValueL(
+ iDataPtr.Mid( aPosition + KIntegerBytes, KIntegerBytes ) ) );
+
+ aTime = TInt64( MAKE_TINT64( high, low ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::AddIntegerL
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::AddIntegerL( const TInt aPosition, const TInt aValue )
+ {
+ HBufC8* bytes = CRtpUtil::MakeBytesLC( aValue );
+ AddDataL( aPosition, bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::AddDataL
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::AddDataL( const TInt aPosition, const TDesC8& aData )
+ {
+ // Write must be in certain order
+ User::LeaveIfError( ( aPosition > iMetaTotal ) * KErrWrite );
+
+ switch ( iMode )
+ {
+ case EMetaWrite:
+ iMetaTotal = iMetaData->Length() + aData.Length();
+ iMetaData = iMetaData->ReAllocL( iMetaTotal );
+ iDataPtr.Set( iMetaData->Des() );
+ iDataPtr.Insert( aPosition, aData );
+ break;
+
+ case EMetaUpdate:
+ User::LeaveIfError( iFile.Write( aPosition, aData, aData.Length() ) );
+ break;
+
+ default:
+ User::Leave( KErrNotSupported );
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpMetaHeader::ReadTintFromFileL
+// -----------------------------------------------------------------------------
+//
+void CRtpMetaHeader::ReadTintFromFileL( const TInt& aPosition, TInt& aValue )
+ {
+ HBufC8* bytes = HBufC8::NewLC( KIntegerBytes );
+ TPtr8 ptr( bytes->Des() );
+ User::LeaveIfError( iFile.Read( aPosition, ptr, KIntegerBytes ) );
+
+ aValue = CRtpUtil::GetValueL( ptr );
+ CleanupStack::PopAndDestroy( bytes );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipHandler/src/CRtpToFile.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,712 @@
+/*
+* 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: Implementation of the Common Recording Engine RTP save format class.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CRtpToFile.h"
+#include <ipvideo/CRtpMetaHeader.h>
+#include <e32math.h>
+#include <bsp.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+const TUint KMaxValidDelta( 500 ); // 0.5 s
+const TUint8 KDummyFullQuality( 100 ); // 100%
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::NewL
+// Static two-phased constructor. Leaves object to cleanup stack.
+// -----------------------------------------------------------------------------
+//
+CRtpToFile* CRtpToFile::NewL(
+ MRtpFileObserver& aFileObs,
+ MRtpFileWriteObserver& aWriteObs )
+ {
+ CRtpToFile* self = new( ELeave ) CRtpToFile( aFileObs, aWriteObs );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::CRtpToFile
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CRtpToFile::CRtpToFile(
+ MRtpFileObserver& aFileObs,
+ MRtpFileWriteObserver& aWriteObs )
+ : CRtpFileBase(),
+ iFileObs( aFileObs ),
+ iWriteObs( aWriteObs ),
+ iCurrentTime( 0 ),
+ iPreviousTime( 0 ),
+ iPreviousDelta( 0 ),
+ iReferenceTime( 0 ),
+ iRecordEndTime( 0 ),
+ iSeekArrayReference( 0 ),
+ iGroupReUse( KErrNotFound ),
+ iAction( MRtpFileWriteObserver::ESaveEnd )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CRtpToFile::ConstructL()
+ {
+ LOG( "CRtpToFile::ConstructL()" );
+
+ CRtpFileBase::ConstructL();
+ iCurrentPath = HBufC::NewL( 0 );
+ }
+
+// -----------------------------------------------------------------------------
+// Destructor
+//
+CRtpToFile::~CRtpToFile()
+// -----------------------------------------------------------------------------
+ {
+ LOG( "CRtpToFile::~CRtpToFile()" );
+
+ Cancel();
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::InitRtpSaveL
+// Sets path of RTP file and initiates variables.
+// -----------------------------------------------------------------------------
+//
+void CRtpToFile::InitRtpSaveL(
+ const MRtpFileWriteObserver::SRtpRecParams& aParams,
+ const MRtpFileWriteObserver::TRtpSaveAction& aAction )
+ {
+ LOG1( "CRtpToFile::InitRtpSaveL() in, ClipPath: %S", &aParams.iClipPath );
+ User::LeaveIfError( ( iMode != EModeNone ) * KErrInUse );
+
+ // Mode
+ switch ( aAction )
+ {
+ case MRtpFileWriteObserver::ESaveTimeShift:
+ iMode = EModeTimeShift;
+ break;
+
+ default:
+ iMode = EModeNormal;
+ break;
+ }
+
+ // File server
+ if ( !iFs.Handle() )
+ {
+ User::LeaveIfError( iFs.Connect() );
+ }
+
+ // Create clip
+ CreateNewClipL( aParams );
+
+ // Real clip's end time
+ iPreviousTime = 0;
+ iReferenceTime = iGroupTime * KSiKilo;
+ UpdateCurrentTimeL();
+ TInt64 duration( aParams.iEndTime.Int64() -
+ aParams.iStartTime.Int64() );
+ iRecordEndTime = iCurrentTime.Int64() + duration;
+
+ // Prepare variables
+ iSeekArrayReference = iGroupTime;
+ iStartGroupTime = iGroupTime;
+
+ LOG( "CRtpToFile::InitRtpSaveL() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::ActivateGroupsReuseL
+// Starts reuse packet groups for live record when they are played.
+// -----------------------------------------------------------------------------
+//
+void CRtpToFile::ActivateGroupsReuseL()
+ {
+ LOG2( "CRtpToFile::ActivateGroupsReuseL(), iMode: %d, iGroupReUse: %d",
+ iMode, iGroupReUse );
+ if ( iGroupReUse != KErrNotFound || iMode != EModeTimeShift )
+ {
+ User::Leave( KErrInUse );
+ }
+
+ iGroupReUse = KErrInUse;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::SwapClipL
+// Sets new path of RTP file and initiates variables.
+// -----------------------------------------------------------------------------
+//
+void CRtpToFile::SwapClipL( const MRtpFileWriteObserver::SRtpRecParams& aParams )
+ {
+ LOG1( "CRtpToFile::SwapClipL(), aClipPath: %S", &aParams.iClipPath );
+
+ User::LeaveIfError( ( iMode != EModeTimeShift ) * KErrGeneral );
+
+ // Update old clip
+ WriteSeekHeaderL();
+ iGroupReUse = KErrNotFound;
+
+ // Open new clip
+ CreateNewClipL( aParams );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::SaveNextRtpGroupL
+// Saves one RTP packet group to a specified file.
+// -----------------------------------------------------------------------------
+//
+TInt CRtpToFile::SaveNextGroupL(
+ TPtr8& aGroup,
+ TUint& aGroupLength,
+ const MRtpFileWriteObserver::TRtpSaveAction& aAction )
+ {
+ // Verify data and mode
+ User::LeaveIfError( iMode );
+
+ // Group
+ iDataPtr.Set( aGroup );
+
+ // Set group variables
+ AddGroupL();
+ GroupTimeL( aGroupLength );
+ AddGroupHeaderL();
+
+ // Write to file
+ iAction = aAction;
+ iFile.Write( iThisGroup, iDataPtr, iGroupTotalLen, iStatus );
+ SetActive();
+
+ LOG2( "CRtpToFile::SaveNextGroupL(), iThisGroup: %d, iGroupTime: %u",
+ iThisGroup, iGroupTime );
+#ifdef CR_ALL_LOGS
+ LogVariables( _L( "SaveNextGroupL()" ) );
+#endif // CR_ALL_LOGS
+
+ return iThisGroup;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::UpdatePreviousTimeL
+// Updates previous time after pause.
+// -----------------------------------------------------------------------------
+//
+void CRtpToFile::UpdatePreviousTimeL()
+ {
+ UpdateCurrentTimeL();
+ iPreviousTime = iCurrentTime.Int64();
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::StopRtpSave
+// Stops file saving and finalizes header.
+// -----------------------------------------------------------------------------
+//
+void CRtpToFile::StopRtpSave( const TInt aError )
+ {
+ Cancel();
+ const TRtpFileMode mode( iMode );
+
+ // If active
+ if ( mode != EModeNone )
+ {
+#ifdef CR_ALL_LOGS
+ LogVariables( _L( "StopRtpSave()" ) );
+#endif // CR_ALL_LOGS
+ iMode = EModeNone;
+
+ // Update clip headers
+ if ( mode != EModeTimeShift )
+ {
+ TRAP_IGNORE( WriteFinalMetaHeaderL( aError ) );
+ }
+ else
+ {
+ iLastSeekAddr = KMaxTInt;
+ TRAP_IGNORE( WriteSeekHeaderL() );
+ }
+
+ // Close file
+ iFile.Flush();
+ iFile.Close();
+
+ if ( aError == KErrNoMemory && !iGroupsTotalCount )
+ {
+ // Failed due to insufficient disk space, and couldn't save any
+ // packets to clip. Happens when recording is started with disk
+ // space already below threshold, and failed to free any space.
+ // Delete the clip completely, otherwise we are just consuming
+ // space below threshold(s).
+ LOG( "CRtpToFile::StopRtpSave(), deleting file without packets !" );
+ iFs.Delete( *iCurrentPath );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::GetClipPath
+// Getter for full path of currently recorded clip.
+// -----------------------------------------------------------------------------
+//
+HBufC* CRtpToFile::ClipPath()
+ {
+ return iCurrentPath;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::GetCurrentLength
+// Gets the current length of the clip during recording.
+// -----------------------------------------------------------------------------
+//
+TUint CRtpToFile::GetCurrentLength()
+ {
+ return iGroupTime;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpFromFile::UpdateRecordEndTime
+// Uppdates the current recording end time.
+// -----------------------------------------------------------------------------
+//
+void CRtpToFile::UpdateRecordEndTime( const TTime& aEndTime )
+ {
+ if ( aEndTime > iCurrentTime )
+ {
+ iRecordEndTime = aEndTime.Int64();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::UpdatePlayAttL
+// Updates clip's playback count and spot attributes after watching.
+// -----------------------------------------------------------------------------
+//
+void CRtpToFile::UpdatePlayAttL( const TInt aNewSpot )
+ {
+ CRtpMetaHeader* metaheader = CRtpMetaHeader::NewLC(
+ iFile, CRtpMetaHeader::EMetaUpdate );
+ CRtpMetaHeader::SAttributes att;
+ metaheader->ReadAttributesL( att );
+
+ // Step playback counter by one
+ att.iPlayCount++;
+ // Update playback spot
+ att.iPlaySpot = ( aNewSpot > 0 && aNewSpot < iLastSeekAddr )? aNewSpot:
+ KErrNone;
+ metaheader->WriteAttributesL( att );
+ CleanupStack::PopAndDestroy( metaheader );
+ LOG2( "CRtpToFile::UpdatePlayAttL(), New playback count: %d, spot: %d",
+ att.iPlayCount, att.iPlaySpot );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::RunL
+// -----------------------------------------------------------------------------
+//
+void CRtpToFile::RunL()
+ {
+ User::LeaveIfError( iStatus.Int() );
+ User::LeaveIfError( iFile.Flush() );
+
+ // Start packets re-use?
+ if ( iGroupReUse == KErrInUse )
+ {
+ const TInt point( iFileObs.CurrentFileReadPoint( 0 ) );
+ if ( point > ( iSeekHeaderPoint + KSeekHeaderBytes ) )
+ {
+ iGroupReUse = KErrNone;
+ }
+ }
+
+ // Stop recording if time shift too close to live
+ if ( iGroupReUse > KErrNone &&
+ iFileObs.CurrentFileReadPoint( 1 ) < KErrNone )
+ {
+ iAction = MRtpFileWriteObserver::ESaveEnd;
+ LOG( "CRtpToFile::RunL(), Time shift play too close to record !" );
+ }
+
+ // Stop recording if end time reached
+ if ( iCurrentTime.Int64() > iRecordEndTime )
+ {
+ iAction = MRtpFileWriteObserver::ESaveEnd;
+ LOG( "CRtpToFile::RunL(), Record end time reached !" );
+ }
+
+ iFileObs.RtpGroupSaved( iAction );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::RunError
+// -----------------------------------------------------------------------------
+//
+TInt CRtpToFile::RunError( TInt aError )
+ {
+ LOG1( "CRtpToFile::RunError(), RunL Leaved: %d", aError );
+
+ if ( &iWriteObs )
+ {
+ iWriteObs.WriteStatus( aError );
+ }
+
+ StopRtpSave( aError );
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CRtpToFile::DoCancel()
+ {
+ LOG( "CRtpToFile::DoCancel()" );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::CreateNewClipL
+// Opens new clip and creates initial headers.
+// -----------------------------------------------------------------------------
+//
+void CRtpToFile::CreateNewClipL(
+ const MRtpFileWriteObserver::SRtpRecParams& aParams )
+ {
+ // Open file
+ iFile.Close();
+ User::LeaveIfError( iFile.Replace( iFs, aParams.iClipPath,
+ EFileShareAny | EFileStream | EFileWrite ) );
+ // Headers
+ WriteInitialMetaHeaderL( aParams );
+ WriteSeekHeaderL();
+ const TInt firstGroup( iSeekHeaderPoint + KSeekHeaderBytes );
+
+ // Variables
+ iGroupTime = 0;
+ iGroupsTotalCount = 0;
+ iFirstSeekAddr = firstGroup;
+ iLastSeekAddr = firstGroup;
+ iNextGroupPoint = firstGroup;
+ delete iCurrentPath; iCurrentPath = NULL;
+ iCurrentPath = aParams.iClipPath.AllocL();
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::AddGroupL
+// Updates file and packet group header variables for a new group.
+// -----------------------------------------------------------------------------
+//
+void CRtpToFile::AddGroupL()
+ {
+ // New group
+ iThisGroup = iNextGroupPoint;
+
+ // Group header
+ // Note ! KGroupHeaderBytes size is allocated to incoming group in
+ // CCRRtpRecordSink::ResetGroupVariables(), but data does not exits
+ // before CRtpToFile::AddGroupHeaderL() method is called.
+ iGroupTotalLen = KGroupHeaderBytes + iDataPtr.Length();
+ iNextGroupPoint = iThisGroup + iGroupTotalLen;
+ const TInt prevGroup( iLastSeekAddr );
+
+ // Time shift handling
+ if ( iGroupReUse > KErrNone )
+ {
+ iGroupReUse--;
+ }
+ else
+ {
+ iGroupsTotalCount++;
+ iLastSeekAddr = ( iMode != EModeTimeShift )? iThisGroup: 0;
+ }
+
+ // Start write to the beginning of the clip?
+ if ( iGroupReUse == KErrNone )
+ {
+ iGroupReUse = iGroupsTotalCount;
+ iNextGroupPoint = iSeekHeaderPoint + KSeekHeaderBytes;
+ LOG2( "CRtpToFile::AddGroupL(), iGroupReUse: %d, iNextGroupPoint: %d",
+ iGroupReUse, iNextGroupPoint );
+ }
+
+ // First group in clip?
+ if ( iGroupsTotalCount == 1 )
+ {
+ iPrevGroupPoint = 0;
+ WriteSeekHeaderL();
+ iSeekArrayReference = iGroupTime;
+ }
+ else
+ {
+ iPrevGroupPoint = prevGroup;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::GroupTimeL
+// Generates group time from group length reported by ring buffer and actual
+// network time difference to previous group. Reference time is used to avoid
+// running time error caused by network burst.
+// -----------------------------------------------------------------------------
+//
+void CRtpToFile::GroupTimeL( TUint& aGroupLength )
+ {
+ UpdateCurrentTimeL();
+ TUint syncLength( 0 );
+
+ // previous time initiated?
+ if ( iPreviousTime > 0 )
+ {
+ const TInt64 delta( iCurrentTime.Int64() - iPreviousTime );
+ iReferenceTime+= delta;
+ const TInt timeDelta( delta / KSiKilo );
+ const TInt burstDelta( Abs( timeDelta - iPreviousDelta ) );
+#ifdef CR_ALL_LOGS
+ LOG3( "CRtpToFile::GroupTimeL(), aGroupLength: %u, burstDelta: %d, timeDelta: %d",
+ aGroupLength, burstDelta, timeDelta );
+#endif // CR_ALL_LOGS
+
+ // Use reference time?
+ if ( timeDelta > KNormalRecGroupLength &&
+ Abs( burstDelta - aGroupLength ) < KMaxValidDelta )
+ {
+ iPreviousDelta = 0;
+ syncLength = iReferenceTime / KSiKilo;
+ }
+ else
+ {
+ iPreviousDelta = timeDelta;
+ syncLength = aGroupLength;
+ }
+ }
+ else
+ {
+ // In record start and after pause uses only the reported group length
+ iPreviousDelta = 0;
+ syncLength = aGroupLength;
+ iReferenceTime+= aGroupLength * KSiKilo;
+ }
+
+ // Update group time
+ iGroupTime += syncLength;
+ iPreviousTime = iCurrentTime.Int64();
+
+ // Time shift ongoing?
+ if ( iMode == EModeTimeShift )
+ {
+ aGroupLength = syncLength;
+ }
+ else
+ {
+ // Update seek array
+ aGroupLength = 0;
+ if ( ( iGroupTime - iSeekArrayReference ) >= KSeekArrayInterval )
+ {
+ AppendSeekArrayL( iGroupTime, iThisGroup );
+ iSeekArrayReference = iGroupTime;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::WriteInitialMetaHeaderL
+// Writes initial meta data header of clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpToFile::WriteInitialMetaHeaderL(
+ const MRtpFileWriteObserver::SRtpRecParams& aParams )
+ {
+ LOG( "CRtpToFile::WriteInitialMetaHeaderL() in" );
+
+ CRtpMetaHeader* metaheader = CRtpMetaHeader::NewLC(
+ iFile, CRtpMetaHeader::EMetaWrite );
+ // Attributes
+ CRtpMetaHeader::SAttributes att;
+ att.iOngoing = ETrue;
+ att.iCompleted = EFalse;
+ att.iProtected = EFalse;
+ att.iFailed = EFalse;
+ att.iVersion = KCurrentClipVersion;
+ att.iQuality = KDummyFullQuality;
+ att.iPostRule = aParams.iPostRule;
+ att.iParental = aParams.iParental;
+ att.iPlayCount = 0;
+ att.iPlaySpot = KErrNone;
+ metaheader->WriteAttributesL( att );
+ LOG1( "CRtpToFile::WriteInitialMetaHeaderL(), iPostRule: %d", att.iPostRule );
+ LOG1( "CRtpToFile::WriteInitialMetaHeaderL(), iParental: %d", att.iParental );
+
+ // Start date/time
+ metaheader->WriteStartTimeL( aParams.iStartTime );
+ TName buf( KNullDesC );
+#if defined( LIVE_TV_RDEBUG_TRACE ) || defined( LIVE_TV_FILE_TRACE )
+ aParams.iStartTime.FormatL( buf, KTimeDateFormat );
+ LOG1( "CRtpToFile::WriteInitialMetaHeaderL(), iStartTime: %S", &buf );
+#endif // LIVE_TV_RDEBUG_TRACE || LIVE_TV_FILE_TRACE
+
+ // End time
+ metaheader->WriteEndTimeL( aParams.iEndTime );
+
+ // Duration
+ metaheader->WriteDurationL( 0 );
+
+ // Seek array point
+ metaheader->WriteSeekArrayPointL( 0 );
+
+ // Mime info
+ CRtpUtil::GetMimeInfo( buf );
+ metaheader->WriteUserIdL( buf );
+ LOG1( "CRtpToFile::WriteInitialMetaHeaderL(), Mime: %S", &buf );
+
+ // Device info
+ CRtpUtil::GetImeiL( buf );
+ metaheader->WriteDeviceInfoL( buf );
+ LOG1( "CRtpToFile::WriteInitialMetaHeaderL(), IMEI: %S", &buf );
+
+ // ESG info
+ metaheader->WriteEsgDataL( aParams.iService, aParams.iProgram );
+ LOG1( "CRtpToFile::WriteInitialMetaHeaderL(), Service: %S",
+ &aParams.iService );
+ LOG1( "CRtpToFile::WriteInitialMetaHeaderL(), Program: %S",
+ &aParams.iProgram );
+ // SRTP data ( Reserved for future use )
+ TBuf8<3> srtp;
+ srtp.Num( KErrNotFound );
+ metaheader->WriteSrtpDataL( srtp );
+
+ // SDP file
+ metaheader->WriteSdpDataL( aParams.iSdpData );
+ LOG1( "CRtpToFile::WriteInitialMetaHeaderL(), SDP length: %d",
+ aParams.iSdpData.Length() );
+ metaheader->CommitL();
+ iSeekHeaderPoint = metaheader->SeekHeaderPoint();
+ CleanupStack::PopAndDestroy( metaheader );
+
+ LOG( "CRtpToFile::WriteInitialMetaHeaderL() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::WriteFinalMetaHeaderL
+// Writes final meta data header of clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpToFile::WriteFinalMetaHeaderL( const TInt aStatus )
+ {
+ LOG( "CRtpToFile::WriteFinalMetaHeaderL() in" );
+ CRtpMetaHeader* metaheader = CRtpMetaHeader::NewLC(
+ iFile, CRtpMetaHeader::EMetaUpdate );
+ // Update duration
+ UpdateDurationL( metaheader );
+
+ // Attributes
+ CRtpMetaHeader::SAttributes att;
+ metaheader->ReadAttributesL( att );
+ att.iOngoing = EFalse;
+ att.iCompleted = !aStatus;
+ att.iFailed = !iGroupsTotalCount;
+ metaheader->WriteAttributesL( att );
+ LOG1( "CRtpToFile::WriteFinalMetaHeaderL(), Completed: %d", att.iCompleted );
+ LOG1( "CRtpToFile::WriteFinalMetaHeaderL(), iFailed : %d", att.iFailed );
+
+ // End date/time
+ metaheader->ReadStartTimeL( iCurrentTime );
+ iRecordEndTime = iCurrentTime.Int64() + iGroupTime;
+ metaheader->WriteEndTimeL( iRecordEndTime );
+#if defined( LIVE_TV_RDEBUG_TRACE ) || defined( LIVE_TV_FILE_TRACE )
+ TName buf( KNullDesC ); TTime( iRecordEndTime ).FormatL( buf, KTimeDateFormat );
+ LOG1( "CRtpToFile::WriteFinalMetaHeaderL(), endTime: %S", &buf );
+#endif // LIVE_TV_RDEBUG_TRACE || LIVE_TV_FILE_TRACE
+
+ // Seek array point
+ metaheader->WriteSeekArrayPointL( iNextGroupPoint );
+ LOG1( "CRtpToFile::WriteFinalMetaHeaderL(), Seek array: %d", iNextGroupPoint );
+ CleanupStack::PopAndDestroy( metaheader );
+
+ // Final seek header
+ SaveSeekArrayL();
+ WriteSeekHeaderL();
+
+ // Set orginal start time as file date
+ iFile.SetModified( iCurrentTime );
+
+ LOG( "CRtpToFile::WriteFinalMetaHeaderL() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::AddGroupHeaderL
+// Adds header of one RTP group.
+// Room for group header bytes and packets count comes from CCRRtpRecordSink.
+// -----------------------------------------------------------------------------
+//
+void CRtpToFile::AddGroupHeaderL()
+ {
+ // Packets count (PTC) is added in CCRRtpRecordSink::SaveGroup()
+
+ // Group time
+ HBufC8* bytes = CRtpUtil::MakeBytesLC( iGroupTime );
+ iDataPtr.Insert( 0, bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+
+ // Previous group point
+ bytes = CRtpUtil::MakeBytesLC( iPrevGroupPoint );
+ iDataPtr.Insert( 0, bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+
+ // Next Group point
+ bytes = CRtpUtil::MakeBytesLC( iNextGroupPoint );
+ iDataPtr.Insert( 0, bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+
+ // Group total size
+ bytes = CRtpUtil::MakeBytesLC( iGroupTotalLen );
+ iDataPtr.Insert( 0, bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::UpdateDurationL
+// Updates clip's duration.
+// -----------------------------------------------------------------------------
+//
+void CRtpToFile::UpdateDurationL( CRtpMetaHeader* aMetaHeader )
+ {
+ aMetaHeader->WriteDurationL( TInt( iGroupTime ) );
+ LOG1( "CRtpToFile::UpdateDurationL(), new duration: %u", iGroupTime );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpToFile::UpdateCurrentTimeL
+// Gets current time as network time.
+// -----------------------------------------------------------------------------
+//
+void CRtpToFile::UpdateCurrentTimeL()
+ {
+ iCurrentTime.UniversalTime();
+ }
+
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipRecognizer/data/10208445.rss Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) 2009 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: Resource file containg the data for Rtp clip recognizer.*
+*/
+
+
+
+
+#include <ecom/RegistryInfo.rh>
+
+RESOURCE REGISTRY_INFO r_registry
+ {
+ dll_uid = 0x10208445; // dll uid
+
+ interfaces =
+ {
+ INTERFACE_INFO
+ {
+ interface_uid = 0x101F7D87; // Const for all data recognizers
+ implementations =
+ {
+ IMPLEMENTATION_INFO
+ {
+ implementation_uid = 0x10208446; // implementation uid
+ version_no = 1;
+ display_name = "RTP clip recognizer";
+ default_data = "RTP clip recognizer";
+ opaque_data = "";
+ }
+ };
+ }
+ };
+ }
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipRecognizer/group/RtpClipRecognizer.mmp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,51 @@
+/*
+* 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: Symbian style build specification for RtpClipRecognizer.dll.*
+*/
+
+
+
+#include <platform_paths.hrh>
+
+//OPTION ARMCC --asm --interleave
+ALWAYS_BUILD_AS_ARM
+
+TARGET RtpClipRecognizer.dll
+TARGETTYPE PLUGIN
+UID 0x10009D8D 0x10208445
+
+CAPABILITY CAP_ECOM_PLUGIN
+
+SOURCEPATH ../data
+
+START RESOURCE 10208445.rss
+#ifdef SYMBIAN_SECURE_ECOM
+TARGET RtpClipRecognizer.rsc
+#endif
+END
+
+VENDORID VID_DEFAULT
+
+SOURCEPATH ../src
+SOURCE CRtpClipRecognizer.cpp
+
+USERINCLUDE ../inc
+
+MW_LAYER_SYSTEMINCLUDE
+
+LIBRARY euser.lib
+LIBRARY apmime.lib
+LIBRARY etel.lib
+LIBRARY etelmm.lib
+LIBRARY flogger.lib
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipRecognizer/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,29 @@
+/*
+* 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: Recognizer for DVB-H proprietary file format.*
+*/
+
+
+
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+PRJ_EXPORTS
+../rom/dvrrtpcliprecognizer.iby CORE_MW_LAYER_IBY_EXPORT_PATH(dvrrtpcliprecognizer.iby)
+
+PRJ_MMPFILES
+RtpClipRecognizer.mmp
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipRecognizer/inc/CRtpClipRecognizer.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,181 @@
+/*
+* 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: Implementation of RTP file recognizer class.*
+*/
+
+
+
+
+#ifndef CRTPCLIPRECOGNIZER_H
+#define CRTPCLIPRECOGNIZER_H
+
+// INCLUDES
+#include <apmrec.h>
+#include <etelmm.h>
+
+// CONSTANTS
+const TInt KUserIdLength( RMobilePhone::KIMSISize );
+const TInt KDeviceIdLength( RMobilePhone::KPhoneSerialNumberSize );
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+
+/**
+* Class to make recognisation for RTP propriatary clip.
+*
+* @lib RtpClipRecognizer.lib
+* @since Series 60 3.0
+*/
+class CRtpClipRecognizer : public CApaDataRecognizerType
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * Static method to create instance of this recognizer. This method is called
+ * by the framework. Method pointer is delivered to the framework by
+ * ImplementationTable table returned by ImplementationGroupProxy.
+ * @since Series 60 3.0
+ * @param none.
+ * @return Pointer to newly created instance of the recognizer.
+ */
+ static CApaDataRecognizerType* CreateRecognizerL();
+
+ /**
+ * C++ default constructor. Calls CApaDataRecognizerType in it's initializer
+ * list to complete construction.
+ */
+ CRtpClipRecognizer();
+
+private: // Functions from base classes
+
+ /**
+ * From CApaDataRecognizerType.
+ * Method called by the framework. This method returns the amount of data
+ * to be wanted for recognisation.
+ * @since Series 60 3.0
+ * @param none.
+ * @return Preferred buffer size for recognisation.
+ */
+ virtual TUint PreferredBufSize();
+
+ /**
+ * From CApaDataRecognizerType.
+ * Method to deliver supported data types by this recognizer.
+ * @since Series 60 3.0
+ * @param aIndex a index pointing out which data type
+ * of the supported ones is returned.
+ * @return Corresponding data type of the requested index.
+ */
+ virtual TDataType SupportedDataTypeL( TInt aIndex ) const;
+
+ /**
+ * From CApaDataRecognizerType.
+ * Overwritten method to handle recognisation.
+ * @param aName the name of the data. Typically this is a file name
+ * containing the data to be recognized.
+ * @param aBuffer a buffer containing PreferredBufSize() from the
+ * beginning of the file to be recognized.
+ * @return none.
+ */
+ virtual void DoRecognizeL( const TDesC& aName,
+ const TDesC8& aBuffer );
+
+private: // New methods
+
+ /**
+ * Converts bytes to integer.
+ * @since Series 60 3.0
+ * @param aBytes a buffer to convert.
+ * @return an integer converted from bytes.
+ */
+ TInt GetValueL( const TDesC8& aBytes );
+
+ /**
+ * Converts bytes to integer.
+ * @since Series 60 3.0
+ * @param aBytes a buffer to convert.
+ * @param aValue a integer converted from bytes.
+ * @return none.
+ */
+ void GetValueL( const TDesC8& aBytes, TInt& aValue );
+
+ /**
+ * Converts bytes to integer.
+ * @since Series 60 3.0
+ * @param aBytes a buffer to convert.
+ * @param aValue a integer converted from bytes.
+ * @return a system wide error code.
+ */
+ TInt GetValue( const TDesC8& aBytes, TInt& aValue );
+
+ /**
+ * Converts bytes to integer.
+ * @since Series 60 3.0
+ * @param aBytes a buffer to convert.
+ * @param aValue a integer converted from bytes.
+ * @return a system wide error code.
+ */
+ TInt GetValue( const TDesC8& aBytes, TUint& aValue );
+
+ /**
+ * Converts bytes to 64 bit integer (TInt64).
+ * @since Series 60 3.0
+ * @param aBytes a buffer to convert.
+ * @return a integer value converted from bytes.
+ */
+ TInt64 GetTInt64L( const TDesC8& aBytes );
+
+ /**
+ * Getter for RTP clip mime type info.
+ * @since Series 60 3.0
+ * @param aBuf on return contains the mime type.
+ * @return None.
+ */
+ void GetMimeInfo( TDes8& aMime );
+
+ /**
+ * Reads IMEI of the phone HW.
+ * @since Series 60 3.0
+ * @param aBuf on return contains the IMEI.
+ * @return none.
+ */
+ void GetImeiL( TDes& aImsi );
+
+ /**
+ * Reads mobile info of the phone.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void GetMobilePhoneInfoL( RTelServer& aServer,
+ RMobilePhone& aPhone );
+
+private: // Data
+
+ TBuf8<KDeviceIdLength> iImei;
+
+ };
+
+#endif // CRTPCLIPRECOGNIZER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipRecognizer/rom/dvrrtpcliprecognizer.iby Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+
+#ifndef __DVRRTPCLIPRECOGNIZER_IBY__
+#define __DVRRTPCLIPRECOGNIZER_IBY__
+
+#include <data_caging_paths_for_iby.hrh>
+
+ECOM_PLUGIN(RtpClipRecognizer.dll,RtpClipRecognizer.rsc)
+
+#endif // __DVRRTPCLIPRECOGNIZER_IBY__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpClipRecognizer/src/CRtpClipRecognizer.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,399 @@
+/*
+* 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: Implementation of RTP file recognizer class.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CRtpClipRecognizer.h"
+#include <ecom/ImplementationProxy.h>
+#include <mmtsy_names.h>
+
+// CONSTANTS
+const TInt KIntegerBytes( 4 );
+const TInt KStringLengthBytes( 1 );
+const TInt KMaxMetaHeaderLength( 2048 );
+const TInt KMetaLengthPoint( 0 );
+const TInt KVersionFieldShift( 4 );
+const TInt KPostRuleFieldShift( 16 );
+const TInt KAttributesPoint( KMetaLengthPoint + KIntegerBytes ); // 4
+const TInt KPlayCountPoint( KAttributesPoint + KIntegerBytes ); // 8
+const TInt KPlaySpotPoint( KPlayCountPoint + KIntegerBytes ); // 12
+const TInt KReservedPoint1( KPlaySpotPoint + KIntegerBytes ); // 16
+const TInt KReservedPoint2( KReservedPoint1 + KIntegerBytes ); // 20
+const TInt KReservedPoint3( KReservedPoint2 + KIntegerBytes ); // 24
+const TInt KReservedPoint4( KReservedPoint3 + KIntegerBytes ); // 28
+const TInt KStartTimePoint( KReservedPoint4 + KIntegerBytes ); // 32
+const TInt KEndTimePoint( KStartTimePoint + 2 * KIntegerBytes ); // 40
+const TInt KDurationPoint( KEndTimePoint + 2 * KIntegerBytes ); // 48
+const TInt KSeekArrayPoint( KDurationPoint + KIntegerBytes ); // 52
+const TInt KUserIdPoint( KSeekArrayPoint + KIntegerBytes ); // 56
+const TInt KDeviceInfoPoint( KUserIdPoint + KStringLengthBytes + // 72
+ KUserIdLength );
+
+const TInt KMaxRtpPostRule( 3 );
+const TInt KMinRtpVersion( 2 );
+const TInt KMaxRtpVersion( 8 );
+const TInt KMaxDuration( 24 * 60 * 60 * 1000 );
+const TInt KMaxDurationError( 60 * 1000 );
+const TInt EContentRightsLockToDevice( 2 );
+const TInt KSupportedMimeTypes( 1 );
+const TInt KRtpClipRecogImplUIDValue( 0x10208446 );
+const TUid KUidMimeRtpClipRecognizer = { 0x10208445 };
+const TUint KNeededMetaBytes( KDeviceInfoPoint + KDeviceIdLength );
+// Result of: TInt64( 1000 * 60 * 60 * 24 ) * TInt64( 365 * 2000 )
+const TInt64 KSecondInMillenium( 63072000000000 );
+_LIT8( KRtpClipMimetype, "application/x-nokia-teh-rtp" );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CRtpClipRecognizer::CreateRecognizerL
+// Static method to create instance of CRtpClipRecognizer
+// -----------------------------------------------------------------------------
+//
+CApaDataRecognizerType* CRtpClipRecognizer::CreateRecognizerL()
+ {
+ CApaDataRecognizerType* rtpRecogType = NULL;
+ rtpRecogType = new( ELeave ) CRtpClipRecognizer();
+ return rtpRecogType; // NULL if new failed
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRecognizer::CRtpClipRecognizer
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CRtpClipRecognizer::CRtpClipRecognizer()
+ : CApaDataRecognizerType( KUidMimeRtpClipRecognizer,
+ CApaDataRecognizerType::EHigh )
+ {
+ iImei.Zero();
+ iCountDataTypes = KSupportedMimeTypes;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRecognizer::PreferredBufSize
+// Overwritten method from CApaDataRecognizerType
+// -----------------------------------------------------------------------------
+//
+TUint CRtpClipRecognizer::PreferredBufSize()
+ {
+ return KNeededMetaBytes;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRecognizer::SupportedDataTypeL
+// Overwritten method from CApaDataRecognizerType
+// -----------------------------------------------------------------------------
+//
+TDataType CRtpClipRecognizer::SupportedDataTypeL( TInt aIndex ) const
+ {
+ __ASSERT_DEBUG( aIndex >= 0 &&
+ aIndex < KSupportedMimeTypes, User::Invariant() );
+
+ switch ( aIndex )
+ {
+ case 0:
+ {
+ TDataType type( KRtpClipMimetype );
+ return type;
+ }
+
+ default:
+ break;
+ }
+
+ return TDataType();
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRecognizer::DoRecognizeL
+// Overwritten method from CApaDataRecognizerType
+// -----------------------------------------------------------------------------
+//
+void CRtpClipRecognizer::DoRecognizeL(
+ const TDesC& /*aName*/,
+ const TDesC8& aBuffer )
+ {
+ iConfidence = ENotRecognized;
+ iDataType = TDataType();
+
+ // Verify invest buffer length
+ if ( aBuffer.Length() < KNeededMetaBytes )
+ {
+ return; // Nothing to recognize
+ }
+
+ // Meta length
+ const TInt metaLength( GetValueL(
+ aBuffer.Mid( KMetaLengthPoint, KIntegerBytes ) ) );
+ if ( metaLength > KErrNotFound && metaLength < KMaxMetaHeaderLength )
+ {
+ // Attributes
+ TUint attr( GetValueL(
+ aBuffer.Mid( KAttributesPoint, KIntegerBytes ) ) );
+ TUint8 ver( ( TUint8 )( ( attr >> KVersionFieldShift ) & 0xF ) );
+ TUint8 post( ( TUint8 )( ( attr >> KPostRuleFieldShift ) & KMaxTUint8 ) );
+
+ // Atributes valid?
+ if ( post <= KMaxRtpPostRule &&
+ ver >= KMinRtpVersion && ver <= KMaxRtpVersion )
+ {
+ // Verify mime
+ TBool certain( EFalse );
+ TBuf8<KUserIdLength> info( KNullDesC8 );
+ GetMimeInfo( info );
+ const TInt len( aBuffer[KUserIdPoint] );
+ if ( len == KUserIdLength )
+ {
+ TPtrC8 mime( aBuffer.Mid( KUserIdPoint + KStringLengthBytes, len ) );
+ if ( !mime.Compare( info ) )
+ {
+ certain = ETrue;
+ }
+ else // old clip without mime in meta header
+ {
+ // Star time, end time, duration
+ TInt64 start( GetTInt64L(
+ aBuffer.Mid( KStartTimePoint, KIntegerBytes * 2 ) ) );
+ TInt64 end( GetTInt64L(
+ aBuffer.Mid( KEndTimePoint, KIntegerBytes * 2 ) ) );
+ TUint dur( GetValueL(
+ aBuffer.Mid( KDurationPoint, KIntegerBytes ) ) );
+ const TInt delta( TInt( ( end - start ) / 1000 ) );
+
+ if ( start > KSecondInMillenium &&
+ end > KSecondInMillenium &&
+ delta > 0 && dur < KMaxDuration &&
+ delta > ( ( dur > KMaxDurationError )?
+ dur - KMaxDurationError: 0 ) )
+ {
+ certain = ETrue;
+ }
+ }
+ }
+
+ // Verify content rights
+ if ( certain && post == EContentRightsLockToDevice )
+ {
+ // IMSI from the phone
+ if ( !iImei.Length() )
+ {
+ TBuf<KDeviceIdLength> buf;
+ GetImeiL( buf );
+ iImei.Copy( buf );
+ }
+
+ // Verify IMEI
+ const TInt len( aBuffer[KDeviceInfoPoint] );
+ TPtrC8 imei( NULL, 0 );
+ if ( len == KDeviceIdLength )
+ {
+ imei.Set( aBuffer.Mid( KDeviceInfoPoint +
+ KStringLengthBytes, len ) );
+ }
+ if ( len != KDeviceIdLength || imei.Compare( iImei ) )
+ {
+ certain = EFalse;
+ }
+ }
+
+ // Set confidence and mime
+ if ( certain )
+ {
+ iConfidence = ECertain;
+ iDataType = TDataType( KRtpClipMimetype );
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRecognizer::GetValueL
+// -----------------------------------------------------------------------------
+//
+TInt CRtpClipRecognizer::GetValueL( const TDesC8& aBytes )
+ {
+ TInt value( KErrNotFound );
+ GetValueL( aBytes, value );
+ return value;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRecognizer::GetValueL
+// -----------------------------------------------------------------------------
+//
+void CRtpClipRecognizer::GetValueL( const TDesC8& aBytes, TInt& aValue )
+ {
+ User::LeaveIfError( GetValue( aBytes, aValue ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRecognizer::GetValue
+// -----------------------------------------------------------------------------
+//
+TInt CRtpClipRecognizer::GetValue( const TDesC8& aBytes, TInt& aValue )
+ {
+ TUint value( 0 );
+ TInt err( GetValue( aBytes, value ) );
+ aValue = ( TInt )( value );
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRecognizer::GetValue
+// -----------------------------------------------------------------------------
+//
+TInt CRtpClipRecognizer::GetValue( const TDesC8& aBytes, TUint& aValue )
+ {
+ if ( aBytes.Length() >= KIntegerBytes )
+ {
+ aValue = ( TUint )( aBytes[0] );
+ aValue <<= 8;
+ aValue |= ( TUint )( aBytes[1] );
+ aValue <<= 8;
+ aValue |= ( TUint )( aBytes[2] );
+ aValue <<= 8;
+ aValue |= ( TUint )( aBytes[3] );
+ return KErrNone;
+ }
+
+ return KErrUnderflow;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRecognizer::GetTInt64L
+// Reads 64 bits integer from descriptor.
+// -----------------------------------------------------------------------------
+//
+TInt64 CRtpClipRecognizer::GetTInt64L( const TDesC8& aBytes )
+ {
+ TUint low( GetValueL( aBytes.Mid( 0, KIntegerBytes ) ) );
+ TUint high( GetValueL( aBytes.Mid( KIntegerBytes,
+ KIntegerBytes ) ) );
+ return TInt64( MAKE_TINT64( high, low ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRecognizer::GetMimeInfo
+// Mime type info of propriatary RTP clip.
+// -----------------------------------------------------------------------------
+//
+void CRtpClipRecognizer::GetMimeInfo( TDes8& aMime )
+ {
+ // Meta header has constant room as user info (IMSI) in old clips
+ aMime.Copy( KRtpClipMimetype().Right( KUserIdLength ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRecognizer::GetImeiL
+// Read IMEI on phone HW, use dummy under WINS
+// -----------------------------------------------------------------------------
+//
+void CRtpClipRecognizer::GetImeiL( TDes& aImei )
+ {
+ aImei.Zero();
+
+#if defined( __WINS__ ) || defined( __WINSCW__ )
+ _LIT( KEmulatorImei, "147407051877780445" );
+ aImei.Copy( KEmulatorImei);
+#else // __WINS__ || __WINSCW__
+
+ RTelServer server;
+ CleanupClosePushL( server );
+ RMobilePhone phone;
+ CleanupClosePushL( phone );
+ GetMobilePhoneInfoL( server, phone );
+
+ // Get IMEI code
+ TRequestStatus status;
+ RMobilePhone::TMobilePhoneIdentityV1 phoneIdentity;
+ phone.GetPhoneId( status, phoneIdentity );
+ User::WaitForRequest( status );
+ if ( !status.Int() )
+ {
+ TPtrC imei( phoneIdentity.iSerialNumber );
+ for ( TInt i( 0 ); i < imei.Length() && i < aImei.MaxLength(); i++ )
+ {
+ if ( TChar( imei[i] ).IsDigit() )
+ {
+ aImei.Append( TChar( imei[i] ) );
+ }
+ }
+ }
+
+ CleanupStack::PopAndDestroy( &phone );
+ CleanupStack::PopAndDestroy( &server );
+
+#endif // __WINS__ || __WINSCW__
+ }
+
+//-----------------------------------------------------------------------------
+// CRtpClipRecognizer::GetMobilePhoneInfo
+//-----------------------------------------------------------------------------
+//
+void CRtpClipRecognizer::GetMobilePhoneInfoL(
+ RTelServer& aServer,
+ RMobilePhone& aPhone )
+ {
+ TInt numPhone( 0 );
+ RTelServer::TPhoneInfo phoneInfo;
+ User::LeaveIfError( aServer.Connect() );
+ User::LeaveIfError( aServer.LoadPhoneModule( KMmTsyModuleName ) );
+ User::LeaveIfError( aServer.EnumeratePhones( numPhone ) );
+
+ TInt found( KErrNotFound );
+ TName tsyName( KNullDesC );
+ for ( TInt i( 0 ); i < numPhone && found == KErrNotFound; i++ )
+ {
+ User::LeaveIfError( aServer.GetPhoneInfo( i, phoneInfo ) );
+ User::LeaveIfError( aServer.GetTsyName( i, tsyName ) );
+ if ( tsyName.CompareF( KMmTsyModuleName ) == 0 )
+ {
+ found = KErrNone;
+ }
+ }
+
+ User::LeaveIfError( found );
+ User::LeaveIfError( aPhone.Open( aServer, phoneInfo.iName ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpClipRecognizer::ImplementationTable
+// Table containing the data concerning CRtpClipRecognizer
+// -----------------------------------------------------------------------------
+//
+const TImplementationProxy ImplementationTable[] =
+ {
+ IMPLEMENTATION_PROXY_ENTRY( KRtpClipRecogImplUIDValue,
+ CRtpClipRecognizer::CreateRecognizerL )
+ };
+
+// -----------------------------------------------------------------------------
+// CRtpClipRecognizer::ImplementationGroupProxy
+// Function called by framework to return data about this recognizer
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
+ {
+ aTableCount = sizeof( ImplementationTable ) /
+ sizeof( TImplementationProxy );
+
+ return ImplementationTable;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpUtils/EABI/DvrRtpUtilsU.DEF Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,46 @@
+EXPORTS
+ _ZN10CRtpPacket12SetTimeStampEm @ 1 NONAME
+ _ZN10CRtpPacket4NewLEv @ 2 NONAME
+ _ZN10CRtpPacket5NewLCEv @ 3 NONAME
+ _ZN10CRtpPacket8ParseRtpERK6TDesC8 @ 4 NONAME
+ _ZN10CRtpPacketD0Ev @ 5 NONAME
+ _ZN10CRtpPacketD1Ev @ 6 NONAME
+ _ZN10CRtpPacketD2Ev @ 7 NONAME
+ _ZN15CRtpTsConverter10UnInitiateEv @ 8 NONAME
+ _ZN15CRtpTsConverter4InitERK6TDesC8 @ 9 NONAME
+ _ZN15CRtpTsConverter4InitERKj @ 10 NONAME
+ _ZN15CRtpTsConverter4NewLEj @ 11 NONAME
+ _ZN15CRtpTsConverter9ConvertTsEji @ 12 NONAME
+ _ZN15CRtpTsConverter9InitiatedEv @ 13 NONAME
+ _ZN15CRtpTsConverterD0Ev @ 14 NONAME
+ _ZN15CRtpTsConverterD1Ev @ 15 NONAME
+ _ZN15CRtpTsConverterD2Ev @ 16 NONAME
+ _ZN8CRtpUtil10MakeBytesLERKiR5TDes8 @ 17 NONAME
+ _ZN8CRtpUtil11GetMimeInfoER5TDes8 @ 18 NONAME
+ _ZN8CRtpUtil11GetMimeInfoER6TDes16 @ 19 NONAME
+ _ZN8CRtpUtil11MakeBytesLCERKi @ 20 NONAME
+ _ZN8CRtpUtil14SpecialPacketLEi @ 21 NONAME
+ _ZN8CRtpUtil4NewLEv @ 22 NONAME
+ _ZN8CRtpUtil5NewLCEv @ 23 NONAME
+ _ZN8CRtpUtil8GetImeiLER6TDes16 @ 24 NONAME
+ _ZN8CRtpUtil8GetValueERK6TDesC8Ri @ 25 NONAME
+ _ZN8CRtpUtil8GetValueERK6TDesC8Rj @ 26 NONAME
+ _ZN8CRtpUtil9GetValueLERK6TDesC8 @ 27 NONAME
+ _ZN8CRtpUtil9GetValueLERK6TDesC8Ri @ 28 NONAME
+ _ZN8CRtpUtil9MakeBytesERKiR5TDes8 @ 29 NONAME
+ _ZN8CRtpUtilD0Ev @ 30 NONAME
+ _ZN8CRtpUtilD1Ev @ 31 NONAME
+ _ZN8CRtpUtilD2Ev @ 32 NONAME
+ _ZN9CRtpTimer4NewLER17MRtpTimerObserverRKN7CActive9TPriorityE @ 33 NONAME
+ _ZN9CRtpTimerD0Ev @ 34 NONAME
+ _ZN9CRtpTimerD1Ev @ 35 NONAME
+ _ZN9CRtpTimerD2Ev @ 36 NONAME
+ _ZTI10CRtpPacket @ 37 NONAME ; #<TI>#
+ _ZTI15CRtpTsConverter @ 38 NONAME ; #<TI>#
+ _ZTI8CRtpUtil @ 39 NONAME ; #<TI>#
+ _ZTI9CRtpTimer @ 40 NONAME ; #<TI>#
+ _ZTV10CRtpPacket @ 41 NONAME ; #<VT>#
+ _ZTV15CRtpTsConverter @ 42 NONAME ; #<VT>#
+ _ZTV8CRtpUtil @ 43 NONAME ; #<VT>#
+ _ZTV9CRtpTimer @ 44 NONAME ; #<VT>#
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpUtils/bwins/DvrRtpUtilsu.def Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,30 @@
+EXPORTS
+ ??1CRtpPacket@@UAE@XZ @ 1 NONAME ; CRtpPacket::~CRtpPacket(void)
+ ??1CRtpTimer@@UAE@XZ @ 2 NONAME ; CRtpTimer::~CRtpTimer(void)
+ ??1CRtpTsConverter@@UAE@XZ @ 3 NONAME ; CRtpTsConverter::~CRtpTsConverter(void)
+ ??1CRtpUtil@@UAE@XZ @ 4 NONAME ; CRtpUtil::~CRtpUtil(void)
+ ?ConvertTs@CRtpTsConverter@@QAEIIH@Z @ 5 NONAME ; unsigned int CRtpTsConverter::ConvertTs(unsigned int, int)
+ ?GetImeiL@CRtpUtil@@SAXAAVTDes16@@@Z @ 6 NONAME ; void CRtpUtil::GetImeiL(class TDes16 &)
+ ?GetMimeInfo@CRtpUtil@@SAXAAVTDes16@@@Z @ 7 NONAME ; void CRtpUtil::GetMimeInfo(class TDes16 &)
+ ?GetMimeInfo@CRtpUtil@@SAXAAVTDes8@@@Z @ 8 NONAME ; void CRtpUtil::GetMimeInfo(class TDes8 &)
+ ?GetValue@CRtpUtil@@SAHABVTDesC8@@AAH@Z @ 9 NONAME ; int CRtpUtil::GetValue(class TDesC8 const &, int &)
+ ?GetValue@CRtpUtil@@SAHABVTDesC8@@AAI@Z @ 10 NONAME ; int CRtpUtil::GetValue(class TDesC8 const &, unsigned int &)
+ ?GetValueL@CRtpUtil@@SAHABVTDesC8@@@Z @ 11 NONAME ; int CRtpUtil::GetValueL(class TDesC8 const &)
+ ?GetValueL@CRtpUtil@@SAXABVTDesC8@@AAH@Z @ 12 NONAME ; void CRtpUtil::GetValueL(class TDesC8 const &, int &)
+ ?Init@CRtpTsConverter@@QAEXABI@Z @ 13 NONAME ; void CRtpTsConverter::Init(unsigned int const &)
+ ?Init@CRtpTsConverter@@QAEXABVTDesC8@@@Z @ 14 NONAME ; void CRtpTsConverter::Init(class TDesC8 const &)
+ ?Initiated@CRtpTsConverter@@QAEHXZ @ 15 NONAME ; int CRtpTsConverter::Initiated(void)
+ ?MakeBytes@CRtpUtil@@SAHABHAAVTDes8@@@Z @ 16 NONAME ; int CRtpUtil::MakeBytes(int const &, class TDes8 &)
+ ?MakeBytesL@CRtpUtil@@SAXABHAAVTDes8@@@Z @ 17 NONAME ; void CRtpUtil::MakeBytesL(int const &, class TDes8 &)
+ ?MakeBytesLC@CRtpUtil@@SAPAVHBufC8@@ABH@Z @ 18 NONAME ; class HBufC8 * CRtpUtil::MakeBytesLC(int const &)
+ ?NewL@CRtpPacket@@SAPAV1@XZ @ 19 NONAME ; class CRtpPacket * CRtpPacket::NewL(void)
+ ?NewL@CRtpTimer@@SAPAV1@AAVMRtpTimerObserver@@ABW4TPriority@CActive@@@Z @ 20 NONAME ; class CRtpTimer * CRtpTimer::NewL(class MRtpTimerObserver &, enum CActive::TPriority const &)
+ ?NewL@CRtpTsConverter@@SAPAV1@I@Z @ 21 NONAME ; class CRtpTsConverter * CRtpTsConverter::NewL(unsigned int)
+ ?NewL@CRtpUtil@@SAPAV1@XZ @ 22 NONAME ; class CRtpUtil * CRtpUtil::NewL(void)
+ ?NewLC@CRtpPacket@@SAPAV1@XZ @ 23 NONAME ; class CRtpPacket * CRtpPacket::NewLC(void)
+ ?NewLC@CRtpUtil@@SAPAV1@XZ @ 24 NONAME ; class CRtpUtil * CRtpUtil::NewLC(void)
+ ?ParseRtp@CRtpPacket@@QAEHABVTDesC8@@@Z @ 25 NONAME ; int CRtpPacket::ParseRtp(class TDesC8 const &)
+ ?SetTimeStamp@CRtpPacket@@QAEXK@Z @ 26 NONAME ; void CRtpPacket::SetTimeStamp(unsigned long)
+ ?SpecialPacketL@CRtpUtil@@SAPAVHBufC8@@H@Z @ 27 NONAME ; class HBufC8 * CRtpUtil::SpecialPacketL(int)
+ ?UnInitiate@CRtpTsConverter@@QAEXXZ @ 28 NONAME ; void CRtpTsConverter::UnInitiate(void)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpUtils/group/DvrRtpUtils.mmp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,47 @@
+/*
+* 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: Symbian style build specification for DvrRtpUtils.dll.*
+*/
+
+
+
+#include <platform_paths.hrh>
+
+TARGET DvrRtpUtils.dll
+TARGETTYPE dll
+UID 0x1000008d 0x10208451
+
+CAPABILITY ALL -TCB
+VENDORID VID_DEFAULT
+
+SOURCEPATH ../src
+SOURCE CRtpUtil.cpp
+SOURCE CRtpTimer.cpp
+SOURCE CRtpPacket.cpp
+SOURCE CRtpTsConverter.cpp
+
+USERINCLUDE ../inc
+USERINCLUDE ../../inc
+USERINCLUDE ../../../../conf
+
+MW_LAYER_SYSTEMINCLUDE
+
+
+LIBRARY euser.lib // Common
+LIBRARY bafl.lib // Bafl utils
+LIBRARY etel.lib //
+LIBRARY etelmm.lib //
+LIBRARY flogger.lib // Debug logger
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpUtils/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,29 @@
+/*
+* 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: Component description file for DvrRtpUtils.dll.*
+*/
+
+
+
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+PRJ_EXPORTS
+../rom/dvrrtputils.iby CORE_MW_LAYER_IBY_EXPORT_PATH(dvrrtputils.iby)
+
+PRJ_MMPFILES
+DvrRtpUtils.mmp
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpUtils/inc/CRtpPacket.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,127 @@
+/*
+* 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: Class to parse RTP packets.*
+*/
+
+
+
+
+#ifndef CRTPPACKET_H
+#define CRTPPACKET_H
+
+// INCLUDES
+#include <RtpHeader.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+
+/**
+* Class for RTP header.
+*
+* @lib RtpClipHandler.lib
+* @since Series 60 3.0
+*/
+class CRtpPacket : public CBase
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @return a pointer to the newly created RTP packet object.
+ */
+ IMPORT_C static CRtpPacket* NewL();
+
+ /**
+ * Two-phased constructor.
+ * @return a pointer to the newly created RTP packet object.
+ */
+ IMPORT_C static CRtpPacket* NewLC();
+
+ /**
+ * Destructor.
+ */
+ IMPORT_C virtual ~CRtpPacket();
+
+public: // New functions
+
+ /**
+ * Parse RTCP packet buffer to retrive RTCP fields.
+ * @since Series 60 3.0
+ * @param aPktBuf a RTP packet.
+ * @return system wide error code.
+ */
+ IMPORT_C TInt ParseRtp( const TDesC8& aPktBuf );
+
+ /**
+ * Sets syncronised time stamp of packet.
+ * @since Series 60 3.0
+ * @param aTs a new timestamp value.
+ * @return none.
+ */
+ IMPORT_C void SetTimeStamp( const TUint32 aTs );
+
+private: // Constructors and destructor
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ /**
+ * C++ default constructor.
+ * @since Series 60 3.0
+ */
+ CRtpPacket();
+
+private: // New functions
+
+ /**
+ * Read 32 bits from current offset.
+ * @since Series 60 3.0
+ * @param aPktBuf a packet buffer.
+ * @param aByte a byte index.
+ * @return an readed unsigned integer.
+ */
+ TUint Read32Bits( const TPtrC8& aPktBuf,
+ TInt& aByte );
+
+public: // Data
+
+ /**
+ * Header of the packet.
+ */
+ TRtpRecvHeader iRtpRecvHeader;
+
+ /**
+ * Payload off the packet.
+ */
+ TPtrC8 iPayload;
+
+ };
+
+#endif // CRTPPACKET_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpUtils/inc/CRtpTimer.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,106 @@
+/*
+* 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: A timer.*
+*/
+
+
+
+
+#ifndef CRTPTIMER_H
+#define CRTPTIMER_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+_LIT( KPaniCRtpTimerError, "RTP Timer panic" );
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class MRtpTimerObserver;
+
+// CLASS DECLARATION
+
+/**
+* A timer for RTP handler.
+*
+* @lib RtpClipHandler.lib
+* @since Series 60 3.0
+*/
+class CRtpTimer : public CTimer
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @param aObs a notifier which informs when the time passed.
+ * @param aPrior a priority of the timer.
+ */
+ IMPORT_C static CRtpTimer* NewL(
+ MRtpTimerObserver& aObs,
+ const TPriority& aPrior = EPriorityStandard );
+
+ /**
+ * Destructor.
+ */
+ IMPORT_C virtual ~CRtpTimer();
+
+private: // Constructors and destructor
+
+ /**
+ * C++ parameter constructor.
+ * @param aObs The notifier which informs when the time passed
+ * @param aPrior a priority of the timer.
+ */
+ CRtpTimer( MRtpTimerObserver& aObs, const TPriority& aPrior );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+private: // Functions from base classes
+
+ /**
+ * From CActive : Called when request completion event occurs.
+ * @since Series 60 3.0
+ * @return none
+ */
+ void RunL();
+
+ /**
+ * From CActive : Handles a leave occurring in the request
+ * completion event handler RunL().
+ * @since Series 60 3.0
+ * @param aError the leave code
+ * @return a status of function
+ */
+ TInt RunError( TInt aError );
+
+private: // Data
+
+ // Observer
+ MRtpTimerObserver& iObs;
+
+ };
+
+#endif // CRTPTIMER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpUtils/inc/CRtpTsConverter.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,156 @@
+/*
+* 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: Class to provide TS conversion for an RTP-stream based on*
+*/
+
+
+
+
+
+#ifndef CRTPTSCONVERTER_H
+#define CRTPTSCONVERTER_H
+
+// INCLUDES
+#include <RtpHeader.h>
+
+// CONSTANTS
+const TUint KPipelineClockRate( 1000 );
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+
+/**
+* Class for converting RTP-timestamps.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CRtpTsConverter : public CBase
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @param aClockRate the clockrate for the media stream.
+ */
+ IMPORT_C static CRtpTsConverter* NewL( const TUint aClockRate );
+
+ /**
+ * Destructor.
+ */
+ IMPORT_C virtual ~CRtpTsConverter();
+
+public: // New functions
+
+ /**
+ * Initialize timestamp converter
+ * @since Series 60 3.0
+ * @param aRtcpPkt a RTCP packet for the media stream to be sychronized.
+ * @return none.
+ */
+ IMPORT_C void Init( const TDesC8& aRtcpPkt );
+
+ /**
+ * Initialize timestamp converter
+ * @since Series 60 3.0
+ * @param aTs intial value of RTP timestamp
+ * @return none.
+ */
+ IMPORT_C void Init( const TUint& aTs );
+
+ /**
+ * Gets status on initialization.
+ * @since Series 60 3.0
+ * @param none.
+ * @return true if converter initialized, otherwise false.
+ */
+ IMPORT_C TBool Initiated();
+
+ /**
+ * Uninitializes the converter.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ IMPORT_C void UnInitiate();
+
+ /**
+ * Gets time stamp from a RTP packet.
+ * @since Series 60 3.0
+ * @param aTimestamp a RTP packet's TS to convert.
+ * @param aUseWallClock if true converts to wall clock time.
+ * @return a time stamp value.
+ */
+ IMPORT_C TUint ConvertTs( const TUint aTimestamp,
+ const TBool aUseWallClock = EFalse );
+
+private: // Constructors and destructor
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ /**
+ * C++ default constructor.
+ * @param aClockRate the clockrate for the media stream.
+ */
+ CRtpTsConverter( const TUint aClockRate );
+
+
+private: // New functions
+
+ /**
+ * Calculate the offset for adjusting the RTP timestamps.
+ * @since Series 60 3.0
+ * @param aRtpTime a RTP time stamp.
+ * @param aSeekTime a wall clock time.
+ * @param clockRate a wall clock time.
+ * @return a offset for RTP TS adjustment.
+ */
+ TUint ComputeOffset( const TUint aRtpTime,
+ const TUint aSeekTime,
+ const TInt clockRate );
+
+private: // Data
+
+ /**
+ * Clockrate.
+ */
+ const TUint iClockRate;
+
+ /**
+ * Offset.
+ */
+ TUint iOffset;
+
+ /**
+ * Initiated.
+ */
+ TBool iInitiated;
+
+ };
+
+#endif // CRTPTSCONVERTER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpUtils/inc/MRtpTimerObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,71 @@
+/*
+* 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: A timer observer.*
+*/
+
+
+
+
+#ifndef MRTPTIMEROBSERVER_H
+#define MRTPTIMEROBSERVER_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+
+/**
+* A timer observer.
+*
+* @lib RtpClipHandler.lib
+* @since Series 60 3.0
+*/
+class MRtpTimerObserver
+ {
+
+public: // New functions
+
+ /**
+ * Called when timer completion event occurs
+ * @since Series 60 3.0
+ * @return none
+ */
+ virtual void TimerEventL() = 0;
+
+ /**
+ * Handles a leave occurring in the request
+ * completion event handler RunL().
+ * @since Series 60 3.0
+ * @param aError the leave code.
+ * @return None.
+ */
+ virtual void TimerError( const TInt aError ) = 0;
+
+ };
+
+#endif // MRTPTIMEROBSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpUtils/rom/dvrrtputils.iby Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+
+#ifndef __DVRRTPUTILS_IBY__
+#define __DVRRTPUTILS_IBY__
+
+#include <data_caging_paths_for_iby.hrh>
+
+file=ABI_DIR\BUILD_DIR\DvrRtpUtils.dll SHARED_LIB_DIR\DvrRtpUtils.dll
+
+#endif // __DVRRTPUTILS_IBY__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpUtils/src/CRtpPacket.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,207 @@
+/*
+* 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: Class to RTP packet parsing.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CRtpPacket.h"
+
+// CONSTANTS
+const TInt KRtpPacketVersion( 2 );
+const TInt KRtpMinHeaderLength( 12 );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CRtpPacket::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CRtpPacket* CRtpPacket::NewL()
+ {
+ CRtpPacket* self = CRtpPacket::NewLC();
+ CleanupStack::Pop();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpPacket::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CRtpPacket* CRtpPacket::NewLC()
+ {
+ CRtpPacket* self = new( ELeave ) CRtpPacket();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpPacket::CRtpPacket
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CRtpPacket::CRtpPacket() : iPayload( NULL, 0 )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpPacket::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CRtpPacket::ConstructL()
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpPacket::CRtpPacket
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CRtpPacket::~CRtpPacket()
+ {
+ if ( iRtpRecvHeader.iHeaderExtension )
+ {
+ // Remove iData
+ delete[] ( iRtpRecvHeader.iHeaderExtension )->iData;
+ delete iRtpRecvHeader.iHeaderExtension;
+ }
+
+ if ( iRtpRecvHeader.iCsrcList )
+ {
+ delete[] iRtpRecvHeader.iCsrcList;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpPacket::ParseRtcp
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CRtpPacket::ParseRtp( const TDesC8& aPktBuf )
+ {
+ if ( aPktBuf.Length() < KRtpMinHeaderLength )
+ {
+ SetTimeStamp( 0 );
+ iPayload.Set( NULL, 0 );
+ return KErrUnderflow;
+ }
+
+ // 1st byte
+ TInt byte( 0 );
+ TUint8 version_flag( ( aPktBuf[byte] & 0xc0 ) >> 6 );
+ // v=2 is mandatory
+ if ( version_flag != KRtpPacketVersion )
+ {
+ SetTimeStamp( 0 );
+ iPayload.Set( NULL, 0 );
+ return KErrNotSupported;
+ }
+
+ iRtpRecvHeader.iPadding = ( aPktBuf[byte] >> 5 ) & 1;
+ iRtpRecvHeader.iExtension = ( aPktBuf[byte] >> 4 ) & 1;
+ iRtpRecvHeader.iCsrcCount = aPktBuf[byte++] & 0xf;
+
+ // 2nd byte
+ iRtpRecvHeader.iMarker = ( aPktBuf[byte] >> 7 ) & 1;
+ iRtpRecvHeader.iPayloadType = aPktBuf[byte++] & 0x7f;
+
+ // 3rd - 4th bytes
+ TUint16 seq_no( aPktBuf[byte++] << 8 );
+ seq_no |= aPktBuf[byte++];
+ iRtpRecvHeader.iSeqNum = seq_no;
+
+ // 5th - 8th bytes
+ TUint32 timestamp( Read32Bits( aPktBuf, byte ) );
+ iRtpRecvHeader.iTimestamp = timestamp;
+
+ // 9th - 12th bytes
+ TInt32 ssrc( Read32Bits( aPktBuf, byte ) );
+
+ // 13th - bytes (optional)
+ // total len = 4 * csrc_len (bytes)
+ if ( iRtpRecvHeader.iCsrcCount > 0 )
+ {
+ iRtpRecvHeader.iCsrcList = new TUint32[iRtpRecvHeader.iCsrcCount];
+ //TInt32* csrc = new TInt32[csrc_len];
+ for ( TInt i( 0 ); i < iRtpRecvHeader.iCsrcCount; i++ )
+ {
+ iRtpRecvHeader.iCsrcList[i] = Read32Bits( aPktBuf, byte );
+ }
+ }
+
+ // optional extension field
+ if ( iRtpRecvHeader.iExtension == 1 )
+ {
+ /*
+ iRtpRecvHeader.iHeaderExtension = new TRtpHeaderExtension();
+ // 16 bits
+ TInt16 op_code( aPktBuf[byte++] << 8 );
+ op_code |= aPktBuf[byte++];
+ iRtpRecvHeader.iHeaderExtension->iType = op_code;
+
+ // 16 bits
+ TInt16 op_code_data_length = aPktBuf[byte++] << 8;
+ op_code_data_length |= aPktBuf[byte++];
+ iRtpRecvHeader.iHeaderExtension->iLength = op_code_data_length;
+
+ op_code_data_length * 4 bytes of extension data
+ op_code_data = new TInt32[op_code_data_length];
+ iRtpRecvHeader.iHeaderExtension->iData = new TInt32[op_code_data_length];
+ for ( TInt i( 0 ); i < op_code_data_length; i++ )
+ {
+ iRtpRecvHeader.iHeaderExtension)->iData[i] = Read32Bits( aPktBuf, byte );
+ }
+ */
+ }
+
+ // The rest is payload data
+ iPayload.Set( aPktBuf.Mid( byte ) );
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpPacket::SetTimeStamp
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpPacket::SetTimeStamp( const TUint32 aTs )
+ {
+ iRtpRecvHeader.iTimestamp = aTs;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpPacket::Read32Bits
+//
+// -----------------------------------------------------------------------------
+//
+TUint CRtpPacket::Read32Bits( const TPtrC8& aPktBuf, TInt& aByte )
+ {
+ TUint ret( ( ( TUint )( aPktBuf[aByte++] ) ) << 24 );
+ ret |= ( ( TUint )( aPktBuf[aByte++] ) ) << 16;
+ ret |= ( ( TUint )( aPktBuf[aByte++] ) ) << 8;
+ ret |= ( ( TUint )( aPktBuf[aByte++] ) );
+
+ return ret;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpUtils/src/CRtpTimer.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,98 @@
+/*
+* 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: A timer.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CRtpTimer.h"
+#include "MRtpTimerObserver.h"
+
+// CONSTANTS
+// None.
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CRtpTimer::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CRtpTimer* CRtpTimer::NewL(
+ MRtpTimerObserver& aObs,
+ const TPriority& aPrior )
+ {
+ CRtpTimer* self= new( ELeave ) CRtpTimer( aObs, aPrior );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpTimer::CRtpTimer
+// C++ parameter constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CRtpTimer::CRtpTimer( MRtpTimerObserver& aObs, const TPriority& aPrior )
+ : CTimer( aPrior ),
+ iObs( aObs )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpTimer::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CRtpTimer::ConstructL()
+ {
+ CTimer::ConstructL();
+ CActiveScheduler::Add( this );
+ }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CRtpTimer::~CRtpTimer()
+ {
+ Cancel();
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpTimer::RunL
+// To inform the notifier that time is up.
+// -----------------------------------------------------------------------------
+//
+void CRtpTimer::RunL()
+ {
+ iObs.TimerEventL();
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpTimer::RunError
+// Returns: System wide error code of indication send leave reason
+// -----------------------------------------------------------------------------
+//
+TInt CRtpTimer::RunError( TInt aError )
+ {
+ iObs.TimerError( aError );
+ return KErrNone;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpUtils/src/CRtpTsConverter.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,222 @@
+/*
+* 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: Class to provide TS conversion for an RTP-stream based on*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CRtpTsConverter.h"
+#include <ipvideo/CRtpUtil.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+const TInt KValidRtcpType( 200 );
+const TInt KTypeBytesPoint( 1 );
+const TInt KNtpSecBytesPoint( 8 );
+const TInt KNtpFracBytesPoint( 12 );
+const TInt KRtcpTsBytesPoint( 16 );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CRtpTsConverter::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CRtpTsConverter* CRtpTsConverter::NewL( const TUint aClockRate )
+ {
+ CRtpTsConverter* self = new( ELeave ) CRtpTsConverter( aClockRate );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpTsConverter::CRtpTsConverter
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CRtpTsConverter::CRtpTsConverter( const TUint aClockRate )
+ : iClockRate( aClockRate ),
+ iOffset( 0 ),
+ iInitiated( EFalse )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpTsConverter::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CRtpTsConverter::ConstructL()
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpTsConverter::CRtpTsConverter
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CRtpTsConverter::~CRtpTsConverter()
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpTsConverter::Init
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpTsConverter::Init( const TDesC8& aRtcpPkt )
+ {
+ // Verify packet type?
+ if ( aRtcpPkt.Length() > ( KRtcpTsBytesPoint + KIntegerBytes ) &&
+ aRtcpPkt[KTypeBytesPoint] == KValidRtcpType && iClockRate > 0 )
+ {
+ // Handle RTCP packet
+ TUint ntp_sec( 0 );
+ TUint ntp_frac( 0 );
+ TUint rtcp_ts( 0 );
+ TInt err( CRtpUtil::GetValue(
+ aRtcpPkt.Mid( KNtpSecBytesPoint, KIntegerBytes ), ntp_sec ) );
+ if ( !err )
+ {
+ LOG1( "CRtpTsConverter::Init(), NTP Timestamp, MSW: %u", ntp_sec );
+ err = CRtpUtil::GetValue(
+ aRtcpPkt.Mid( KNtpFracBytesPoint, KIntegerBytes ), ntp_frac );
+ }
+ if ( !err )
+ {
+ LOG1( "CRtpTsConverter::Init(), NTP Timestamp, LSW: %u", ntp_frac );
+ err = CRtpUtil::GetValue(
+ aRtcpPkt.Mid( KRtcpTsBytesPoint, KIntegerBytes ), rtcp_ts );
+ }
+
+ if ( !err )
+ {
+ LOG1( "CRtpTsConverter::Init(), RTP Timestamp: %u", rtcp_ts );
+ // Calculate the wallclock time when this RTCP packet is generated
+ TUint wallClock( ( ntp_sec & 0x00FF ) * 1000 );
+ wallClock += ( ( ( ntp_frac >> 16 ) & 0x0000FFFF ) * 1000 ) >> 16;
+
+ // Compute the proper time offset
+ iOffset = ComputeOffset( rtcp_ts, wallClock, iClockRate );
+ }
+ }
+ }
+// -----------------------------------------------------------------------------
+// CRtpTsConverter::Init
+// Compute the proper time offset. No wallclok time available.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpTsConverter::Init( const TUint& aTs )
+ {
+ iOffset = ComputeOffset( aTs, 0, iClockRate );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpTsConverter::Initiated
+// Returns: initiated status of converter.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CRtpTsConverter::Initiated()
+ {
+ return iInitiated;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpTsConverter::UnInitiate
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpTsConverter::UnInitiate()
+ {
+ iInitiated = EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpTsConverter::ConvertTs
+// Returns: converted unsigned integer value of timestamp.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TUint CRtpTsConverter::ConvertTs(
+ const TUint aTimestamp,
+ TBool aUseWallClock )
+ {
+ TUint ret( KMaxTUint );
+
+ if ( iClockRate == KPipelineClockRate )
+ {
+ ret = aTimestamp - iOffset;
+ }
+ else
+ {
+ if ( iClockRate > 0 )
+ {
+ ret = aTimestamp - iOffset;
+
+ if ( aUseWallClock )
+ {
+ TUint sec( ret / iClockRate );
+ TUint subSec( ret % iClockRate );
+ ret = ( ( sec * KPipelineClockRate ) +
+ ( subSec * KPipelineClockRate ) / iClockRate );
+ }
+ }
+ }
+
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpTsConverter::ComputeOffset
+// Returns: offset of the RTP timestamp.
+// -----------------------------------------------------------------------------
+//
+TUint CRtpTsConverter::ComputeOffset(
+ TUint aRtpTime,
+ TUint aSeekTime,
+ TInt aClockRate )
+ {
+ TUint ret( KMaxTUint );
+
+ if ( aClockRate )
+ {
+ TUint rtpSec( aRtpTime / aClockRate );
+ TUint rtpFracSecTU( aRtpTime % aClockRate ); // transport units
+ TUint seekSec( aSeekTime / 1000 );
+ TUint seekFracSecTU( ( ( aSeekTime % 1000) * aClockRate ) / 1000 );
+
+ TUint offsetSec( rtpSec - seekSec );
+ TUint offsetFracSecTU( rtpFracSecTU - seekFracSecTU );
+
+ if ( rtpFracSecTU < seekFracSecTU )
+ {
+ offsetSec--;
+ offsetFracSecTU = aClockRate + rtpFracSecTU - seekFracSecTU;
+ }
+
+ ret = ( offsetSec * aClockRate ) + offsetFracSecTU;
+ iInitiated = ETrue;
+ }
+
+ return ret;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrRtpUtils/src/CRtpUtil.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,303 @@
+/*
+* 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: Implementation of the Common Recording Engine RTP convertions.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <ipvideo/CRtpUtil.h>
+#include <mmtsy_names.h>
+#include <bsp.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+// None
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CRtpUtil::NewL()
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CRtpUtil* CRtpUtil::NewL()
+ {
+ CRtpUtil* self = CRtpUtil::NewLC();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpUtil::NewLC()
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CRtpUtil* CRtpUtil::NewLC()
+ {
+ CRtpUtil* self = new ( ELeave ) CRtpUtil;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpUtil::CRtpUtil
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CRtpUtil::CRtpUtil()
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpUtil::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CRtpUtil::ConstructL()
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// Destructor
+//
+EXPORT_C CRtpUtil::~CRtpUtil()
+// -----------------------------------------------------------------------------
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpUtil::MakeBytesLC
+// Returns: Buffer of four bytes where integer is stored
+// -----------------------------------------------------------------------------
+//
+EXPORT_C HBufC8* CRtpUtil::MakeBytesLC( const TInt& aValue )
+ {
+ HBufC8* bytes = HBufC8::NewLC( KIntegerBytes );
+ TPtr8 ptr( bytes->Des() );
+ MakeBytesL( aValue, ptr );
+ return bytes;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpUtil::MakeBytes
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpUtil::MakeBytesL( const TInt& aValue, TDes8& aBuf )
+ {
+ User::LeaveIfError( MakeBytes( aValue, aBuf ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpUtil::MakeBytes
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CRtpUtil::MakeBytes( const TInt& aValue, TDes8& aBuf )
+ {
+ if ( aBuf.MaxLength() >= KIntegerBytes )
+ {
+ aBuf.SetLength( KIntegerBytes );
+ aBuf[0] = ( TUint8 )( aValue >> 24 );
+ aBuf[1] = ( TUint8 )( aValue >> 16 );
+ aBuf[2] = ( TUint8 )( aValue >> 8 );
+ aBuf[3] = ( TUint8 )( aValue );
+ return KErrNone;
+ }
+
+ return KErrUnderflow;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpUtil::GetValueL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CRtpUtil::GetValueL( const TDesC8& aBytes )
+ {
+ TInt value( KErrNotFound );
+ GetValueL( aBytes, value );
+ return value;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpUtil::GetValueL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpUtil::GetValueL( const TDesC8& aBytes, TInt& aValue )
+ {
+ User::LeaveIfError( GetValue( aBytes, aValue ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpUtil::GetValue
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CRtpUtil::GetValue( const TDesC8& aBytes, TInt& aValue )
+ {
+ TUint value( 0 );
+ TInt err( GetValue( aBytes, value ) );
+ aValue = ( TInt )( value );
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpUtil::GetValue
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CRtpUtil::GetValue( const TDesC8& aBytes, TUint& aValue )
+ {
+ if ( aBytes.Length() >= KIntegerBytes )
+ {
+ aValue = ( TUint )( aBytes[0] );
+ aValue <<= 8;
+ aValue |= ( TUint )( aBytes[1] );
+ aValue <<= 8;
+ aValue |= ( TUint )( aBytes[2] );
+ aValue <<= 8;
+ aValue |= ( TUint )( aBytes[3] );
+ return KErrNone;
+ }
+
+ return KErrUnderflow;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpUtil::SpecialPacketL
+// Generates new special packet.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C HBufC8* CRtpUtil::SpecialPacketL( const TInt aType )
+ {
+ // Create buffer
+ HBufC8* packet = HBufC8::NewLC( KSpecialPacketLength );
+ TPtr8 ptr( packet->Des() );
+
+ // Packet length (PTL)
+ HBufC8* bytes = MakeBytesLC( KSpecialPacketLength );
+ ptr.Copy( bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+
+ // Packet type
+ ptr.Append( KCharSpace );
+ ptr[KPacketTypeBytePoint] = ( TUint8 )( aType );
+
+ // Dummy payload
+ bytes = MakeBytesLC( KMaxTUint );
+ ptr.Append( bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+
+ CleanupStack::Pop( packet );
+ return packet;
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpUtil::GetMimeInfo
+// Mime type info of propriatary RTP clip.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpUtil::GetMimeInfo( TDes& aMime )
+ {
+ // Meta header has constant room as user info (IMSI) in old clips
+ aMime.Copy( KRtpClipMimetype().Right( KUserIdLength ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpUtil::GetMimeInfo
+// Mime type info of propriatary RTP clip.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpUtil::GetMimeInfo( TDes8& aMime )
+ {
+ // Meta header has constant room as user info (IMSI) in old clips
+ aMime.Copy( KRtpClipMimetype().Right( KUserIdLength ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CRtpUtil::GetImeiL
+// Read IMEI on phone HW, use dummy under WINS
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CRtpUtil::GetImeiL( TDes& aImei )
+ {
+ aImei.Zero();
+
+#if defined( __WINS__ ) || defined( __WINSCW__ )
+ _LIT( KEmulatorImei, "147407051877780445" );
+ aImei.Copy( KEmulatorImei);
+#else // __WINS__ || __WINSCW__
+
+ RTelServer server;
+ CleanupClosePushL( server );
+ RMobilePhone phone;
+ CleanupClosePushL( phone );
+ GetMobilePhoneInfoL( server, phone );
+
+ // Get IMEI code
+ TRequestStatus status;
+ RMobilePhone::TMobilePhoneIdentityV1 phoneIdentity;
+ phone.GetPhoneId( status, phoneIdentity );
+ User::WaitForRequest( status );
+ if ( !status.Int() )
+ {
+ TPtrC imei( phoneIdentity.iSerialNumber );
+ for ( TInt i( 0 ); i < imei.Length() && i < aImei.MaxLength(); i++ )
+ {
+ if ( TChar( imei[i] ).IsDigit() )
+ {
+ aImei.Append( TChar( imei[i] ) );
+ }
+ }
+ }
+
+ CleanupStack::PopAndDestroy( &phone );
+ CleanupStack::PopAndDestroy( &server );
+
+#endif // __WINS__ || __WINSCW__
+ }
+
+//-----------------------------------------------------------------------------
+// CRtpUtil::GetMobilePhoneInfo
+//-----------------------------------------------------------------------------
+//
+void CRtpUtil::GetMobilePhoneInfoL(
+ RTelServer& aServer,
+ RMobilePhone& aPhone )
+ {
+ TInt numPhone( 0 );
+ RTelServer::TPhoneInfo phoneInfo;
+ User::LeaveIfError( aServer.Connect() );
+ User::LeaveIfError( aServer.LoadPhoneModule( KMmTsyModuleName ) );
+ User::LeaveIfError( aServer.EnumeratePhones( numPhone ) );
+
+ TInt found( KErrNotFound );
+ TName tsyName( KNullDesC );
+ for ( TInt i( 0 ); i < numPhone && found == KErrNotFound; i++ )
+ {
+ User::LeaveIfError( aServer.GetPhoneInfo( i, phoneInfo ) );
+ User::LeaveIfError( aServer.GetTsyName( i, tsyName ) );
+ if ( tsyName.CompareF( KMmTsyModuleName ) == 0 )
+ {
+ found = KErrNone;
+ }
+ }
+
+ User::LeaveIfError( found );
+ User::LeaveIfError( aPhone.Open( aServer, phoneInfo.iName ) );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrSdpParser/EABI/DvrSdpParserU.DEF Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,36 @@
+EXPORTS
+ _ZN13CDvrSdpParser11AudioIpAddrEv @ 1 NONAME
+ _ZN13CDvrSdpParser11DataStreamsEv @ 2 NONAME
+ _ZN13CDvrSdpParser11VideoIpAddrEv @ 3 NONAME
+ _ZN13CDvrSdpParser12AudioBitrateEv @ 4 NONAME
+ _ZN13CDvrSdpParser12IsLiveStreamEv @ 5 NONAME
+ _ZN13CDvrSdpParser12VideoBitrateEv @ 6 NONAME
+ _ZN13CDvrSdpParser13AudioStreamIdEv @ 7 NONAME
+ _ZN13CDvrSdpParser13VideoStreamIdEv @ 8 NONAME
+ _ZN13CDvrSdpParser14IsMultiCastSdpEv @ 9 NONAME
+ _ZN13CDvrSdpParser15AudioAttributesEv @ 10 NONAME
+ _ZN13CDvrSdpParser15VideoAttributesEv @ 11 NONAME
+ _ZN13CDvrSdpParser16AudioControlAddrEv @ 12 NONAME
+ _ZN13CDvrSdpParser16SupportedContentEv @ 13 NONAME
+ _ZN13CDvrSdpParser16VideoControlAddrEv @ 14 NONAME
+ _ZN13CDvrSdpParser17SessionAttributesEv @ 15 NONAME
+ _ZN13CDvrSdpParser18IsRealMediaContentEv @ 16 NONAME
+ _ZN13CDvrSdpParser20MediaIdentifierAudioEv @ 17 NONAME
+ _ZN13CDvrSdpParser20MediaIdentifierVideoEv @ 18 NONAME
+ _ZN13CDvrSdpParser21AudioTimerGranularityEv @ 19 NONAME
+ _ZN13CDvrSdpParser21VideoTimerGranularityEv @ 20 NONAME
+ _ZN13CDvrSdpParser4NewLEv @ 21 NONAME
+ _ZN13CDvrSdpParser5NewLCEv @ 22 NONAME
+ _ZN13CDvrSdpParser6GetSdpER6TPtrC8 @ 23 NONAME
+ _ZN13CDvrSdpParser8NewLineLEiRK6TDesC8 @ 24 NONAME
+ _ZN13CDvrSdpParser9AudioPortEv @ 25 NONAME
+ _ZN13CDvrSdpParser9IsIpv4SdpEv @ 26 NONAME
+ _ZN13CDvrSdpParser9TryParseLERK6TDesC8 @ 27 NONAME
+ _ZN13CDvrSdpParser9TryParseLERK6TDesC8S2_ @ 28 NONAME
+ _ZN13CDvrSdpParser9VideoPortEv @ 29 NONAME
+ _ZN13CDvrSdpParserD0Ev @ 30 NONAME
+ _ZN13CDvrSdpParserD1Ev @ 31 NONAME
+ _ZN13CDvrSdpParserD2Ev @ 32 NONAME
+ _ZTI13CDvrSdpParser @ 33 NONAME ; #<TI>#
+ _ZTV13CDvrSdpParser @ 34 NONAME ; #<VT>#
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrSdpParser/bwins/DvrSdpParseru.def Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,32 @@
+EXPORTS
+ ??1CDvrSdpParser@@UAE@XZ @ 1 NONAME ; CDvrSdpParser::~CDvrSdpParser(void)
+ ?AudioAttributes@CDvrSdpParser@@QAEAAV?$RArray@VTPtrC8@@@@XZ @ 2 NONAME ; class RArray<class TPtrC8> & CDvrSdpParser::AudioAttributes(void)
+ ?AudioBitrate@CDvrSdpParser@@QAEHXZ @ 3 NONAME ; int CDvrSdpParser::AudioBitrate(void)
+ ?AudioControlAddr@CDvrSdpParser@@QAE?AVTPtrC8@@XZ @ 4 NONAME ; class TPtrC8 CDvrSdpParser::AudioControlAddr(void)
+ ?AudioIpAddr@CDvrSdpParser@@QAE?AVTPtrC8@@XZ @ 5 NONAME ; class TPtrC8 CDvrSdpParser::AudioIpAddr(void)
+ ?AudioPort@CDvrSdpParser@@QAEHXZ @ 6 NONAME ; int CDvrSdpParser::AudioPort(void)
+ ?AudioStreamId@CDvrSdpParser@@QAEHXZ @ 7 NONAME ; int CDvrSdpParser::AudioStreamId(void)
+ ?AudioTimerGranularity@CDvrSdpParser@@QAEKXZ @ 8 NONAME ; unsigned long CDvrSdpParser::AudioTimerGranularity(void)
+ ?DataStreams@CDvrSdpParser@@QAEAAV?$RArray@VTPtrC8@@@@XZ @ 9 NONAME ; class RArray<class TPtrC8> & CDvrSdpParser::DataStreams(void)
+ ?GetSdp@CDvrSdpParser@@QAEHAAVTPtrC8@@@Z @ 10 NONAME ; int CDvrSdpParser::GetSdp(class TPtrC8 &)
+ ?IsIpv4Sdp@CDvrSdpParser@@QAEHXZ @ 11 NONAME ; int CDvrSdpParser::IsIpv4Sdp(void)
+ ?IsLiveStream@CDvrSdpParser@@QAEHXZ @ 12 NONAME ; int CDvrSdpParser::IsLiveStream(void)
+ ?IsMultiCastSdp@CDvrSdpParser@@QAEHXZ @ 13 NONAME ; int CDvrSdpParser::IsMultiCastSdp(void)
+ ?IsRealMediaContent@CDvrSdpParser@@QAEHXZ @ 14 NONAME ; int CDvrSdpParser::IsRealMediaContent(void)
+ ?MediaIdentifierAudio@CDvrSdpParser@@QAEHXZ @ 15 NONAME ; int CDvrSdpParser::MediaIdentifierAudio(void)
+ ?MediaIdentifierVideo@CDvrSdpParser@@QAEHXZ @ 16 NONAME ; int CDvrSdpParser::MediaIdentifierVideo(void)
+ ?NewL@CDvrSdpParser@@SAPAV1@XZ @ 17 NONAME ; class CDvrSdpParser * CDvrSdpParser::NewL(void)
+ ?NewLC@CDvrSdpParser@@SAPAV1@XZ @ 18 NONAME ; class CDvrSdpParser * CDvrSdpParser::NewLC(void)
+ ?NewLineL@CDvrSdpParser@@QAEXHABVTDesC8@@@Z @ 19 NONAME ; void CDvrSdpParser::NewLineL(int, class TDesC8 const &)
+ ?SessionAttributes@CDvrSdpParser@@QAEAAV?$RArray@VTPtrC8@@@@XZ @ 20 NONAME ; class RArray<class TPtrC8> & CDvrSdpParser::SessionAttributes(void)
+ ?SupportedContent@CDvrSdpParser@@QAE?AW4TDvrPacketProvidings@1@XZ @ 21 NONAME ; enum CDvrSdpParser::TDvrPacketProvidings CDvrSdpParser::SupportedContent(void)
+ ?TryParseL@CDvrSdpParser@@QAEXABVTDesC8@@0@Z @ 22 NONAME ; void CDvrSdpParser::TryParseL(class TDesC8 const &, class TDesC8 const &)
+ ?TryParseL@CDvrSdpParser@@QAEXABVTDesC8@@@Z @ 23 NONAME ; void CDvrSdpParser::TryParseL(class TDesC8 const &)
+ ?VideoAttributes@CDvrSdpParser@@QAEAAV?$RArray@VTPtrC8@@@@XZ @ 24 NONAME ; class RArray<class TPtrC8> & CDvrSdpParser::VideoAttributes(void)
+ ?VideoBitrate@CDvrSdpParser@@QAEHXZ @ 25 NONAME ; int CDvrSdpParser::VideoBitrate(void)
+ ?VideoControlAddr@CDvrSdpParser@@QAE?AVTPtrC8@@XZ @ 26 NONAME ; class TPtrC8 CDvrSdpParser::VideoControlAddr(void)
+ ?VideoIpAddr@CDvrSdpParser@@QAE?AVTPtrC8@@XZ @ 27 NONAME ; class TPtrC8 CDvrSdpParser::VideoIpAddr(void)
+ ?VideoPort@CDvrSdpParser@@QAEHXZ @ 28 NONAME ; int CDvrSdpParser::VideoPort(void)
+ ?VideoStreamId@CDvrSdpParser@@QAEHXZ @ 29 NONAME ; int CDvrSdpParser::VideoStreamId(void)
+ ?VideoTimerGranularity@CDvrSdpParser@@QAEKXZ @ 30 NONAME ; unsigned long CDvrSdpParser::VideoTimerGranularity(void)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrSdpParser/group/DvrSdpparser.mmp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,42 @@
+/*
+* 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: Symbian style build specification for DvrSdpParser.dll.*
+*/
+
+
+
+#include <platform_paths.hrh>
+
+TARGET DvrSdpParser.dll
+TARGETTYPE dll
+UID 0x1000008d 0x1020844D
+
+CAPABILITY ALL -TCB
+VENDORID VID_DEFAULT
+
+SOURCEPATH ../src
+SOURCE CDvrSdpParser.cpp
+
+USERINCLUDE ../inc
+USERINCLUDE ../../inc
+USERINCLUDE ../../../../conf
+
+MW_LAYER_SYSTEMINCLUDE
+
+LIBRARY euser.lib // Common
+LIBRARY efsrv.lib // File server
+LIBRARY insock.lib // Inet address
+LIBRARY flogger.lib // Debug logger
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrSdpParser/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,29 @@
+/*
+* 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: Component description file for DvrSdpParser.dll.*
+*/
+
+
+
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+PRJ_EXPORTS
+../rom/dvrsdpparser.iby CORE_MW_LAYER_IBY_EXPORT_PATH(dvrsdpparser.iby)
+
+PRJ_MMPFILES
+DvrSdpParser.mmp
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrSdpParser/rom/dvrsdpparser.iby Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+
+#ifndef __DVRSDPPARSER_IBY__
+#define __DVRSDPPARSER_IBY__
+
+#include <data_caging_paths_for_iby.hrh>
+
+file=ABI_DIR\BUILD_DIR\DvrSdpParser.dll SHARED_LIB_DIR\DvrSdpParser.dll
+
+#endif // __DVRSDPPARSER_IBY__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/DvrSdpParser/src/CDvrSdpParser.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,1063 @@
+/*
+* 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: Parses SDP file.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <ipvideo/CDvrSdpParser.h>
+#include <in_sock.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+_LIT8( KKeyIpv4Addr, "c=IN IP4 " );
+_LIT8( KKeyIpv6Addr, "c=IN IP6 " );
+_LIT8( KKeyAttribute, "a=" );
+_LIT8( KKeyMedia, "m=" );
+_LIT8( KKeyMediaAudio, "m=audio " );
+_LIT8( KKeyMediaVideo, "m=video " );
+_LIT8( KKeyMediaTitle, "m=title " );
+_LIT8( KKeyDataStream, "m=data " );
+_LIT8( KKeyClockRate, "a=rtpmap:" );
+_LIT8( KKeyControl, "a=control:" );
+//_LIT8( KKeyStreamId, "a=control:streamid=" );
+_LIT8( KRealMediaIndicator, "/x-pn-real" );
+_LIT8( KKeyBandWidth, "b=AS:" );
+_LIT8( KCRSDPRtspUriBegin, "rtsp://" );
+_LIT8( KSPStr, " ");
+_LIT8( KCRStr, "\r");
+_LIT8( KLFStr, "\n");
+_LIT8( KCRLFStr, "\r\n");
+_LIT8( KSLStr, "/" );
+_LIT8( KSdpLiveStream, "a=LiveStream:integer;1");
+_LIT8( KSdpRangeHeaderLiveStream, "a=range:npt=now-" );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CDvrSdpParser* CDvrSdpParser::NewL()
+ {
+ CDvrSdpParser* self = CDvrSdpParser::NewLC();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CDvrSdpParser* CDvrSdpParser::NewLC()
+ {
+ CDvrSdpParser* self = new( ELeave ) CDvrSdpParser();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::CDvrSdpParser
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CDvrSdpParser::CDvrSdpParser()
+ : iAudioPort( KErrNotFound ),
+ iVideoPort( KErrNotFound ),
+ iTitlePort( KErrNotFound ),
+ iAudioBitrate( KErrNotFound ),
+ iVideoBitrate( KErrNotFound ),
+ iAudioStreamId( KErrNotFound ),
+ iVideoStreamId( KErrNotFound ),
+ iVideoTimerGranularity( KMaxTUint32 ),
+ iAudioTimerGranularity( KMaxTUint32 )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CDvrSdpParser::ConstructL()
+ {
+ LOG( "CDvrSdpParser::ConstructL()" );
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::~CDvrSdpParser
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CDvrSdpParser::~CDvrSdpParser()
+ {
+ LOG( "CDvrSdpParser::~CDvrSdpParser()" );
+ delete iBaseUrl; iBaseUrl = NULL;
+ DeleteVariables();
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::TryParseL
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CDvrSdpParser::TryParseL( const TDesC8& aSdp, const TDesC8& aBaseUrl )
+ {
+#if defined( LIVE_TV_RDEBUG_TRACE ) || defined( LIVE_TV_FILE_TRACE )
+ HBufC* baseLog = HBufC::NewLC( aBaseUrl.Length() );
+ TPtr ptr = baseLog->Des();
+ ptr.Copy( aBaseUrl );
+ LOG2( "CDvrSdpParser::TryParseL(), aSdp length: %d, aBaseUrl: %S",
+ aSdp.Length(), &ptr );
+ CleanupStack::PopAndDestroy( baseLog );
+#endif
+
+ if ( aBaseUrl.Length() )
+ {
+ delete iBaseUrl; iBaseUrl = NULL;
+ iBaseUrl = aBaseUrl.AllocL();
+ }
+
+ TryParseL( aSdp );
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::TryParseL
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CDvrSdpParser::TryParseL( const TDesC8& aSdp )
+ {
+ LOG1( "CDvrSdpParser::TryParseL(), aSdp length: %d", aSdp.Length() );
+
+ // Find medias
+ FindMediasL( aSdp );
+
+ // Append found medias to the array
+ for ( TInt i( 0 ); i < iMediaBuf.Count(); i++ )
+ {
+ TInt port( KErrNotFound );
+ TPtrC8 ptr( iMediaBuf[i] );
+
+ // Audio media info found ?
+ port = GetIntL( ptr, KKeyMediaAudio );
+ if ( port != KErrNotFound )
+ {
+ iAudioPort = port;
+ LOG1( "CDvrSdpParser::TryParseL(), iAudioPort: %d", iAudioPort );
+ UpdateMediaInfoL( ptr, iAudioIpAddr );
+ // Stream id (Helix takes medias in appearance order)
+ iAudioStreamId = i;
+ // Audio clock rate
+ iAudioTimerGranularity = GetClockRateL( ptr );
+ iAudioBitrate = GetIntL( ptr, KKeyBandWidth );
+ // Audio attributes
+ FindAttributesL( ptr, iAudioAttributes );
+ // Audio control
+ GetControlL( ptr, iAudioControlAddr );
+ // Find media id 97 from a=rtpmap:97 MP4A-LATM/32000/2
+ iMediaIdentifierAudio = GetIntL( ptr, KKeyClockRate );
+ }
+ else
+ {
+ // Video media info found ?
+ port = GetIntL( ptr, KKeyMediaVideo );
+ if ( port != KErrNotFound )
+ {
+ iVideoPort = port;
+ LOG1( "CDvrSdpParser::TryParseL(), iVideoPort: %d", iVideoPort );
+ UpdateMediaInfoL( ptr, iVideoIpAddr );
+ // Stream id (Helix takes medias in appearance order)
+ iVideoStreamId = i;
+ // Video clock rate
+ iVideoTimerGranularity = GetClockRateL( ptr );
+ iVideoBitrate = GetIntL( ptr, KKeyBandWidth );
+ // Video attributes
+ FindAttributesL( ptr, iVideoAttributes );
+ // Video control
+ GetControlL( ptr, iVideoControlAddr );
+ // Find media id 96 from a=rtpmap:96 H264/90000 line
+ iMediaIdentifierVideo = GetIntL( ptr, KKeyClockRate );
+ }
+ else
+ {
+ port = GetIntL( ptr, KKeyMediaTitle );
+ if ( port != KErrNotFound )
+ {
+ iTitlePort = port;
+ LOG1( "CDvrSdpParser::TryParseL(), iTitlePort: %d", iTitlePort );
+ }
+ }
+ }
+ }
+
+ iMediaBuf.Reset();
+ delete iBaseUrl; iBaseUrl = NULL;
+ delete iCommonIp; iCommonIp = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::NewLineL
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CDvrSdpParser::NewLineL(
+ const TInt aStreamId,
+ const TDesC8& aLine )
+ {
+ User::LeaveIfNull( iSdp );
+ const TInt newLen( iSdp->Length() + aLine.Length() + KCRLFStr().Length() );
+ LOG2( "CDvrSdpParser::NewLineL(), aStreamId: %d, New sdp length: %d",
+ aStreamId, newLen );
+ switch( aStreamId )
+ {
+ case KErrNotFound: // Common
+ {
+ // Alloc more room
+ iSdp = iSdp->ReAllocL( newLen );
+ TPtr8 ptr( iSdp->Des() );
+
+ // Find first attribute for new line point
+ const TInt insertPoint( ptr.Find( KKeyAttribute ) );
+ User::LeaveIfError( insertPoint );
+ ptr.Insert( insertPoint, KCRLFStr );
+ ptr.Insert( insertPoint, aLine );
+ }
+ break;
+
+ case 0: // Audio (usually)
+ case 1: // Video (usually)
+ {
+ iSdp = iSdp->ReAllocL( newLen );
+ InserNewLineL( aStreamId, aLine );
+ }
+ break;
+
+ default:
+ User::Leave( KErrCompletion );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::GetSdp
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CDvrSdpParser::GetSdp( TPtrC8& aSdp )
+ {
+ if ( iSdp )
+ {
+ aSdp.Set( iSdp->Des() );
+ return KErrNone;
+ }
+
+ return KErrNotFound;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::SupportedContent
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CDvrSdpParser::TDvrPacketProvidings CDvrSdpParser::SupportedContent( void )
+ {
+ TDvrPacketProvidings retval( EDvrNoProgramAtAll );
+
+ if ( iAudioPort > KErrNotFound && iVideoPort > KErrNotFound )
+ {
+ retval = EDvrBothAudioAndVideo;
+ }
+ else if ( iAudioPort > KErrNotFound && iVideoPort <= KErrNotFound )
+ {
+ retval = EDvrAudioOnly;
+ }
+ else if ( iVideoPort > KErrNotFound && iAudioPort <= KErrNotFound )
+ {
+ retval = EDvrVideoOnly;
+ }
+ else
+ {
+ LOG( "CDvrSdpParser::SupportedContent(), No media !" );
+ }
+
+ return retval;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::SessionAttributes
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RArray<TPtrC8>& CDvrSdpParser::SessionAttributes( void )
+ {
+ return iSessionAttributes;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::AudioAttributes
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RArray<TPtrC8>& CDvrSdpParser::AudioAttributes( void )
+ {
+ return iAudioAttributes;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::VideoAttributes
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RArray<TPtrC8>& CDvrSdpParser::VideoAttributes( void )
+ {
+ return iVideoAttributes;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::DataStreams
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RArray<TPtrC8>& CDvrSdpParser::DataStreams( void )
+ {
+ return iDataStreams;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::IsIpv4Sdp
+// Checks if Ipv4 address in use.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CDvrSdpParser::IsIpv4Sdp( void )
+ {
+ return iIsIpv4;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::IsMultiCastSdp
+// Checks if c= line did specify a multicast addr
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CDvrSdpParser::IsMultiCastSdp( void )
+ {
+ return iIsMulticast;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::AudioControlAddr
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TPtrC8 CDvrSdpParser::AudioControlAddr( void )
+ {
+ return ( iAudioControlAddr )? TPtrC8( *iAudioControlAddr ):
+ TPtrC8( KNullDesC8 );
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::VideoControlAddr
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TPtrC8 CDvrSdpParser::VideoControlAddr( void )
+ {
+ return ( iVideoControlAddr )? TPtrC8( *iVideoControlAddr ):
+ TPtrC8( KNullDesC8 );
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::AudioIpAddr
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TPtrC8 CDvrSdpParser::AudioIpAddr( void )
+ {
+ return ( iAudioIpAddr )? TPtrC8( *iAudioIpAddr ): TPtrC8( KNullDesC8 );
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::VideoIpAddr
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TPtrC8 CDvrSdpParser::VideoIpAddr( void )
+ {
+ return ( iVideoIpAddr )? TPtrC8( *iVideoIpAddr ): TPtrC8( KNullDesC8 );
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::AudioPort
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CDvrSdpParser::AudioPort( void )
+ {
+ return iAudioPort;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::VideoPort
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CDvrSdpParser::VideoPort( void )
+ {
+ return iVideoPort;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::AudioBitrate
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CDvrSdpParser::AudioBitrate( void )
+ {
+ return iAudioBitrate;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::VideoBitrate
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CDvrSdpParser::VideoBitrate( void )
+ {
+ return iVideoBitrate;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::AudioStreamId
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CDvrSdpParser::AudioStreamId( void )
+ {
+ return iAudioStreamId;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::VideoStreamId
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CDvrSdpParser::VideoStreamId( void )
+ {
+ return iVideoStreamId;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::VideoTimerGranularity
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TUint32 CDvrSdpParser::VideoTimerGranularity( void )
+ {
+ return iVideoTimerGranularity;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::AudioTimerGranularity
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TUint32 CDvrSdpParser::AudioTimerGranularity( void )
+ {
+ return iAudioTimerGranularity;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::IsRealMediaContent
+// Check for realmedia content.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CDvrSdpParser::IsRealMediaContent( void )
+ {
+ if ( iSdp && iSdp->Des().Find( KRealMediaIndicator ) != KErrNotFound )
+ {
+ LOG( "CDvrSdpParser::IsRealMediaContent(), Yes" );
+ return ETrue;
+ }
+
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::MediaIdentifierAudio
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CDvrSdpParser::MediaIdentifierAudio( void )
+ {
+ return iMediaIdentifierAudio ;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::MediaIdentifierVideo
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CDvrSdpParser::MediaIdentifierVideo( void )
+ {
+ return iMediaIdentifierVideo ;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::IsLiveStream
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CDvrSdpParser::IsLiveStream( void )
+ {
+ TBool isLiveStream = EFalse;
+ if ( iSdp &&
+ ( iSdp->Des().Find( KSdpLiveStream ) != KErrNotFound ||
+ iSdp->Des().Find( KSdpRangeHeaderLiveStream ) != KErrNotFound ) )
+ {
+ LOG( "CDvrSdpParser::IsLiveStream(), Yes" );
+ isLiveStream = ETrue;
+ }
+
+ return isLiveStream;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::FindMediasL
+//
+// -----------------------------------------------------------------------------
+//
+void CDvrSdpParser::FindMediasL( const TDesC8& aSdp )
+ {
+ LOG1( "CDvrSdpParser::FindMediasL(), aSdp length: %d", aSdp.Length() );
+
+ // Find medias from SDP
+ DeleteVariables();
+ iSdp = aSdp.AllocL();
+ RArray<SMediaPoint> points;
+ CleanupClosePushL( points );
+ FindMediaPointsL( points );
+ MakeMediaBuffersL( points );
+ FindSessionAttributesL( points );
+ CleanupStack::PopAndDestroy( &points );
+ FindDataStreamsL( iSdp->Des(), iDataStreams );
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::FindMediaPointsL
+// Find points of all medias.
+// -----------------------------------------------------------------------------
+//
+void CDvrSdpParser::FindMediaPointsL( RArray<SMediaPoint>& aPoints )
+ {
+ TInt lastPoint( 0 );
+ User::LeaveIfNull( iSdp );
+ TPtrC8 ptr( iSdp->Des() );
+ TInt start( MediaSectionStart( ptr ) );
+
+ // Loop all media sections
+ while ( start > KErrNotFound && lastPoint < iSdp->Length() )
+ {
+ // Find whole media section, up to next media or EOF
+ start += lastPoint;
+ TInt len( MediaSectionStart( ptr.Mid( start + KKeyMedia().Length() ) ) );
+ len = ( len > KErrNotFound )? len + KKeyMedia().Length() - 1:
+ ptr.Length() - start - 1;
+ // New media point
+ SMediaPoint point;
+ point.iStart = start;
+ point.iLength = len;
+ lastPoint = ( start + len );
+ User::LeaveIfError( aPoints.Append( point ) );
+ LOG3( "CDvrSdpParser::FindMediaPointsL(), start: %d, len: %d, lastPoint: %d",
+ start, len, lastPoint );
+ // Next section
+ start = MediaSectionStart( ptr.Mid( lastPoint ) );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::MediaSectionStart
+//
+// -----------------------------------------------------------------------------
+//
+TInt CDvrSdpParser::MediaSectionStart( const TDesC8& aPtr )
+ {
+ TInt start( aPtr.Find( KKeyMedia ) );
+ while ( start > KErrNotFound )
+ {
+ // Verify that not data stream keyword? ( i.e not 'm=data' )
+ const TInt keywordlen( KKeyDataStream().Length() );
+ TPtrC8 ptr( aPtr.Mid( start, keywordlen ) );
+ if ( ptr.Find( KKeyDataStream ) == KErrNotFound )
+ {
+ // Audio, video or subtitle
+ return start;
+ }
+
+ start += keywordlen;
+ const TInt next( aPtr.Mid( start ).Find( KKeyMedia ) );
+ start = ( next > KErrNotFound )? start + next: KErrNotFound;
+ }
+
+ return start;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::MakeMediaBuffersL
+// Make media buffers
+// -----------------------------------------------------------------------------
+//
+void CDvrSdpParser::MakeMediaBuffersL( RArray<SMediaPoint>& aPoints )
+ {
+ User::LeaveIfNull( iSdp );
+ for ( TInt i( 0 ); i < aPoints.Count(); i++ )
+ {
+ TPtrC8 media( iSdp->Des().Mid( aPoints[i].iStart, aPoints[i].iLength ) );
+ User::LeaveIfError( iMediaBuf.Append( media ) );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::FindSessionAttributesL
+// Find session attributes (common section before any media)
+// -----------------------------------------------------------------------------
+//
+void CDvrSdpParser::FindSessionAttributesL( RArray<SMediaPoint>& aPoints )
+ {
+ User::LeaveIfNull( iSdp );
+ if ( aPoints.Count() )
+ {
+ TPtrC8 common( iSdp->Des().Left( aPoints[0].iStart ) );
+ FindAttributesL( common, iSessionAttributes );
+
+ // IP in common section
+ delete iCommonIp; iCommonIp = NULL;
+ iCommonIp = GetIpAddrL( common );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::InserNewLineL
+//
+// -----------------------------------------------------------------------------
+//
+void CDvrSdpParser::InserNewLineL(
+ TInt aStreamId,
+ const TDesC8& aLine )
+ {
+ RArray<SMediaPoint> points;
+ CleanupClosePushL( points );
+ FindMediaPointsL( points );
+
+ // Add new line to first after media description
+ if ( aStreamId >= 0 && aStreamId < points.Count() )
+ {
+ User::LeaveIfNull( iSdp );
+ TPtr8 ptr( iSdp->Des() );
+ TInt insertPoint( GetLen( ptr.Mid( points[aStreamId].iStart,
+ points[aStreamId].iLength ), ETrue ) );
+ User::LeaveIfError( insertPoint );
+ ptr.Insert( insertPoint, aLine );
+ ptr.Insert( insertPoint, KCRLFStr );
+ }
+ else
+ {
+ User::Leave( KErrCompletion );
+ }
+
+ CleanupStack::PopAndDestroy( &points );
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::UpdateMediaInfoL
+//
+// -----------------------------------------------------------------------------
+//
+void CDvrSdpParser::UpdateMediaInfoL(
+ const TDesC8& aMediaPtr,
+ HBufC8*& aAddress )
+ {
+ // Search for IP address (Ipv6/Ipv4)
+ aAddress = GetIpAddrL( aMediaPtr );
+ if ( !aAddress && iCommonIp )
+ {
+ aAddress = iCommonIp->AllocL();
+ }
+ User::LeaveIfNull( aAddress );
+ TPtr8 ptr( aAddress->Des() );
+
+ // IP Address
+ if ( iIsIpv4 )
+ {
+ LOG( "CDvrSdpParser::UpdateMediaInfoL(), Removing v4 subnet mask" );
+ // Remove possible subnet mask (e.g. c=IN IP4 225.0.1.15/64)
+ const TInt maskPos( aAddress->Find( KSLStr ) );
+ if ( maskPos != KErrNotFound )
+ {
+ ptr.SetLength( maskPos );
+ }
+ }
+
+#if defined( LIVE_TV_RDEBUG_TRACE ) || defined( LIVE_TV_FILE_TRACE )
+ TName buf; buf.Copy( ptr );
+ LOG1( "CDvrSdpParser::UpdateMediaInfoL(), aAddress: %S", &buf );
+#endif // LIVE_TV_RDEBUG_TRACE || LIVE_TV_FILE_TRACE
+
+ /* Stream Id
+ const TInt streamId( GetIntL( aMediaPtr, KKeyStreamId ) );
+ LOG1( "CDvrSdpParser::UpdateMediaInfoL(), Stream Id: %d", streamId );
+ return streamId;
+ */
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::GetIpAddrL
+//
+// -----------------------------------------------------------------------------
+//
+HBufC8* CDvrSdpParser::GetIpAddrL( const TDesC8& aPtr )
+ {
+ iIsIpv4 = EFalse;
+ HBufC8* ipAddr = GetStringL( aPtr, KKeyIpv6Addr );
+ if ( !ipAddr )
+ {
+ ipAddr = GetStringL( aPtr, KKeyIpv4Addr );
+ if ( ipAddr )
+ {
+ iIsIpv4 = ETrue;
+ }
+ }
+
+ // Verify multicast
+ if ( ipAddr )
+ {
+ TPtrC8 addr( ipAddr->Des() );
+ if ( addr.Length() <= KMaxName )
+ {
+ CheckForMulticast( addr );
+ }
+ else
+ {
+ LOG1( "Ipaddress length too long: %d, leaving....", addr.Length() );
+ delete ipAddr; ipAddr = NULL;
+ User::Leave( KErrOverflow );
+ }
+ }
+
+ return ipAddr;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::GetClockRateL
+//
+// -----------------------------------------------------------------------------
+//
+TUint CDvrSdpParser::GetClockRateL( const TDesC8& aPtr )
+ {
+ // Find clock rate keyword
+ TInt start( FindStart( aPtr, KKeyClockRate ) );
+ User::LeaveIfError( start );
+
+ // Len up to first slash ( i.e: rtpmap:97 MP4A-LATM/32000/2 )
+ TInt slash( aPtr.Mid( start ).Find( KSLStr ) );
+ User::LeaveIfError( slash );
+ start += ( slash + KSLStr().Length() );
+ TInt len( GetLen( aPtr, start ) );
+
+ // Len up to second slash ( i.e: rtpmap:97 MP4A-LATM/32000/2 )
+ slash = aPtr.Mid( start, len ).Find( KSLStr );
+ len = ( slash != KErrNotFound )? slash: len;
+ return StrToUint( aPtr.Mid( start, len ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::GetControlL()
+// Checks if a=control line specifies a control for media.
+// -----------------------------------------------------------------------------
+//
+void CDvrSdpParser::GetControlL( const TDesC8& aMediaPtr, HBufC8*& aControlAddr )
+ {
+ delete aControlAddr; aControlAddr = NULL;
+ HBufC8* control = GetStringL( aMediaPtr, KKeyControl );
+ if ( control )
+ {
+ CleanupStack::PushL( control );
+ if ( control->Des().FindC( KCRSDPRtspUriBegin ) == KErrNotFound )
+ {
+ // relative url
+ if ( iBaseUrl )
+ {
+ aControlAddr = HBufC8::NewL( iBaseUrl->Des().Length() +
+ control->Des().Length() +
+ KSLStr().Length() );
+ aControlAddr->Des().Append ( iBaseUrl->Des() );
+ aControlAddr->Des().Append ( KSLStr ) ;
+ aControlAddr->Des().Append ( control->Des() );
+ }
+ }
+ else
+ {
+ // absolute url
+ aControlAddr = control->Des().AllocL();
+ }
+
+ CleanupStack::PopAndDestroy( control );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::CheckForMulticast()
+// Checks if c= line specifies a multicast addr
+// -----------------------------------------------------------------------------
+//
+void CDvrSdpParser::CheckForMulticast( const TDesC8& aLine )
+ {
+ TInetAddr controladdr;
+ TName addr( KNullDesC );
+ addr.Copy( aLine );
+ TInt err( controladdr.Input( addr ) );
+ if ( err != KErrNone )
+ {
+ LOG1( "CDvrSdpParser: invalid control address in SDP connection line '%S'", &addr );
+ }
+ else
+ {
+ // just do check for multicast, actual address is taken from SETUP response
+ iIsMulticast = controladdr.IsMulticast();
+
+#if defined( LIVE_TV_RDEBUG_TRACE ) || defined( LIVE_TV_FILE_TRACE )
+ /* Commented out, for some reason can crash with RTP playback in debug.
+ if ( iIsMulticast )
+ {
+ LOG1( "CDvrSdpParser: detected MULTICAST (%S) control address in SDP", &addr );
+ }
+ else
+ {
+ LOG1( "CDvrSdpParser: detected unicast (%S) control address in SDP", &addr );
+ }
+ */
+#endif // LIVE_TV_RDEBUG_TRACE || LIVE_TV_FILE_TRACE
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::FindAttributesL
+//
+// -----------------------------------------------------------------------------
+//
+void CDvrSdpParser::FindAttributesL(
+ const TDesC8& aSdpSection,
+ RArray<TPtrC8>& aAttributeList )
+ {
+ TInt last( 0 );
+ TInt start( KErrNotFound );
+ do
+ {
+ // Rest of the SDP section
+ TPtrC8 rest( aSdpSection.Mid( last ) );
+ start = rest.Find( KKeyAttribute );
+ if ( start > KErrNotFound )
+ {
+ last += start;
+ TInt len( GetLen( rest, start, ETrue ) );
+ if ( len > 0 )
+ {
+ // Add other than control attribute
+ if ( rest.Mid( start, len ).Find( KKeyControl ) == KErrNotFound )
+ {
+ TPtrC8 ptr( rest.Mid( start, len ) );
+ User::LeaveIfError( aAttributeList.Append( ptr ) );
+ }
+
+ last += len;
+ }
+ }
+ }
+ while( start > KErrNotFound );
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::FindDataStreamsL
+//
+// -----------------------------------------------------------------------------
+//
+void CDvrSdpParser::FindDataStreamsL(
+ const TDesC8& aSdpSection,
+ RArray<TPtrC8>& aStreamsList )
+ {
+ TInt last( 0 );
+ TInt start( KErrNotFound );
+ do
+ {
+ // Rest of the SDP block
+ TPtrC8 rest( aSdpSection.Mid( last ) );
+ start = rest.Find( KKeyDataStream );
+ if ( start > KErrNotFound )
+ {
+ last += start;
+ TInt len( GetLen( rest, start, ETrue ) );
+ if ( len > 0 )
+ {
+ TPtrC8 ptr( rest.Mid( start, len ) );
+ User::LeaveIfError( aStreamsList.Append( ptr ) );
+ last += len;
+ }
+ }
+ }
+ while( start > KErrNotFound );
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::GetIntL
+//
+// -----------------------------------------------------------------------------
+//
+TInt CDvrSdpParser::GetIntL( const TDesC8& aPtr, const TDesC8& aKeyword )
+ {
+ TInt ret( KErrNotFound );
+ HBufC8* buf = GetStringL( aPtr, aKeyword );
+ if ( buf )
+ {
+ ret = StrToUint( buf->Des() );
+ delete buf;
+ }
+
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::GetStringL
+//
+// -----------------------------------------------------------------------------
+//
+HBufC8* CDvrSdpParser::GetStringL( const TDesC8& aPtr, const TDesC8& aKeyword )
+ {
+ const TInt start( FindStart( aPtr, aKeyword ) );
+ const TInt len( GetLen( aPtr, start ) );
+
+ HBufC8* buf = NULL;
+ if ( start > KErrNotFound && len > 0 && ( start + len ) <= aPtr.Length() )
+ {
+ buf = aPtr.Mid( start, len ).AllocL();
+ }
+
+ return buf;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::FindStart
+//
+// -----------------------------------------------------------------------------
+//
+TInt CDvrSdpParser::FindStart( const TDesC8& aPtr, const TDesC8& aKeyword )
+ {
+ TInt start( aPtr.Find( aKeyword ) );
+
+ if ( start > KErrNotFound )
+ {
+ start += aKeyword.Length();
+ }
+
+ return start;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::GetLen
+//
+// -----------------------------------------------------------------------------
+//
+TInt CDvrSdpParser::GetLen(
+ const TDesC8& aPtr,
+ const TInt aStart,
+ const TBool aIgnoreSpace )
+ {
+ if ( aStart > KErrNotFound && aStart < aPtr.Length() )
+ {
+ // Find next LF, CR or CRLF combination
+ TInt len1( MinNonError( aPtr.Mid( aStart ).Find( KLFStr ),
+ aPtr.Mid( aStart ).Find( KCRStr ) ) );
+ // Find space
+ TInt len2( ( aIgnoreSpace )? KErrNotFound:
+ aPtr.Mid( aStart ).Find( KSPStr ) );
+
+ if ( len1 == KErrNotFound && len2 == KErrNotFound )
+ {
+ // Rest of the buffer
+ return ( aPtr.Length() - aStart );
+ }
+ else
+ {
+ // CRLF or space
+ return MinNonError( len1, len2 );
+ }
+ }
+
+ return KErrNotFound;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::MinNonError
+//
+// -----------------------------------------------------------------------------
+//
+TInt CDvrSdpParser::MinNonError( const TInt aValue1, const TInt aValue2 )
+ {
+ if ( aValue1 > KErrNotFound && aValue2 > KErrNotFound )
+ {
+ return Min( aValue1, aValue2 );
+ }
+
+ return ( ( aValue1 > KErrNotFound )? aValue1:
+ ( aValue2 > KErrNotFound )? aValue2: KErrNotFound );
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::StrToUint
+// Convert string to integer.
+// -----------------------------------------------------------------------------
+//
+TUint CDvrSdpParser::StrToUint( const TDesC8& aString )
+ {
+ TLex8 templex;
+ templex.Assign( aString );
+ TUint ret( KMaxTUint );
+ templex.Val( ret );
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CDvrSdpParser::DeleteVariables
+//
+// -----------------------------------------------------------------------------
+//
+void CDvrSdpParser::DeleteVariables( void )
+ {
+ delete iSdp; iSdp = NULL;
+ delete iCommonIp; iCommonIp = NULL;
+ iMediaBuf.Reset();
+ iSessionAttributes.Reset();
+ iAudioAttributes.Reset();
+ iVideoAttributes.Reset();
+ iDataStreams.Reset();
+ delete iAudioControlAddr; iAudioControlAddr = NULL;
+ delete iVideoControlAddr; iVideoControlAddr = NULL;
+ delete iAudioIpAddr; iAudioIpAddr = NULL;
+ delete iVideoIpAddr; iVideoIpAddr = NULL;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/group/CommonRecordingEngine.mmp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,101 @@
+/*
+* 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: Symbian style build specification common recording engine*
+*/
+
+
+
+#include <platform_paths.hrh>
+#include "../inc/CRServerConsts.hrh"
+#include "../inc/VideoServiceUtilsConf.hrh"
+
+//OPTION ARMCC --asm --interleave
+ALWAYS_BUILD_AS_ARM
+
+TARGET CommonRecordingEngine.exe
+TARGETTYPE exe
+UID 0x1000008d KCRServerUid
+
+CAPABILITY CAP_APPLICATION NetworkControl -DRM -AllFiles
+VENDORID VID_DEFAULT
+
+SOURCEPATH ../src
+SOURCE CCRServer.cpp
+SOURCE CCRSession.cpp
+SOURCE CCREngine.cpp
+SOURCE CCRPacketBuffer.cpp
+SOURCE CCRRtspSink.cpp
+SOURCE CCRNullSink.cpp
+SOURCE CCRStreamingSession.cpp
+SOURCE CCRRtspPacketSource.cpp
+SOURCE CCRRtpTcpStreamer.cpp
+SOURCE CCRRtpTcpStream.cpp
+SOURCE CCRConnection.cpp
+SOURCE CCRRtspResponse.cpp
+SOURCE CCRRtspCommand.cpp
+SOURCE CCRRtspCommon.cpp
+SOURCE CCRSock.cpp
+SOURCE CCRTimer.cpp
+SOURCE CCRPacketSinkBase.cpp
+SOURCE CCRPacketSourceBase.cpp
+SOURCE CCRPunchPacketSender.cpp
+SOURCE CCRClientInformer.cpp
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+SOURCE CCRRtpFileSource.cpp
+SOURCE CCRNullSource.cpp
+SOURCE CCRRtpRecordSink.cpp
+SOURCE CCRXpsSink.cpp
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+
+USERINCLUDE ../inc
+USERINCLUDE ../../../conf/
+
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+USERINCLUDE ../DvrRtpClipHandler/inc
+USERINCLUDE ../DvrRtpUtils/inc
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+
+MW_LAYER_SYSTEMINCLUDE
+
+LIBRARY euser.lib
+LIBRARY esock.lib // Network connection
+LIBRARY insock.lib // Inet address
+LIBRARY inetprotutil.lib // URI parsing utils
+LIBRARY commdb.lib // TCommDbConnPref et al.
+LIBRARY hash.lib // CMD5 class
+LIBRARY rtp.lib // RTP
+LIBRARY efsrv.lib // File server
+LIBRARY connmon.lib // RConnectionMonitor
+LIBRARY centralrepository.lib //
+LIBRARY DvrSdpparser.lib // DVR SDP parser
+LIBRARY flogger.lib // File logger
+LIBRARY PlatformEnv.lib
+LIBRARY imut.lib // TImCodecB64
+
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+STATICLIBRARY XPSPacketSink.lib // XPS packet sink
+LIBRARY DvrRtpclipHandler.lib // Propriatary rtp format
+LIBRARY DvrRtpUtils.lib // DVR rtp utils
+#ifdef VIA_FEA_IPTV_USE_IPDC
+LIBRARY H264GenrToLocalDepack.lib
+#endif // VIA_FEA_IPTV_USE_IPDC
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+
+START WINS
+//EXPORTUNFROZEN
+END
+
+START MARM
+// ?marm_specific_information
+END
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2006 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: Common recording engine server side build info file*
+*/
+
+
+
+
+#include "../DvrSdpParser/group/bld.inf"
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+PRJ_EXPORTS
+../rom/commonrecordingengine.iby CORE_MW_LAYER_IBY_EXPORT_PATH(commonrecordingengine.iby)
+
+PRJ_MMPFILES
+CommonRecordingEngine.mmp
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRClientInformer.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,86 @@
+/*
+* 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: Sends message to client with message queue.*
+*/
+
+
+
+
+#ifndef CCRCLIENTINFORMER_H
+#define CCRCLIENTINFORMER_H
+
+// INCLUDES
+#include <e32base.h>
+#include <ipvideo/CRTypeDefs.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+
+/**
+* Packet sink that does not forward packets. Good for testing.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRClientInformer : public CBase
+ {
+
+public: // Constructors and destructors
+
+ /**
+ * Two-phased constructor.
+ * @return CCRClientInformer pointer.
+ */
+ static CCRClientInformer* NewL( void );
+
+ /**
+ * Destructor
+ */
+ virtual ~CCRClientInformer( );
+
+public: // New methods
+
+ /**
+ * Send a message thrue the message queue.
+ * @since Series 60 3.0
+ * @param aQueueName a name of queue.
+ * @param aInfo a info of the message.
+ * @return a system wide error code.
+ */
+ TInt SendMessage( const TDes& aQueueName,
+ SCRQueueEntry& aInfo );
+
+private: // Constructors and destructors
+
+ /**
+ * By default default constructor is private
+ */
+ CCRClientInformer();
+
+ };
+
+#endif // CCRCLIENTINFORMER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRConnection.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,351 @@
+/*
+* 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: Class for wrapping RConnection*
+*/
+
+
+
+
+#ifndef __CCRCONNECTION_H
+#define __CCRCONNECTION_H
+
+// INCLUDES
+#include "MCRConnectionObserver.h"
+#include <e32base.h>
+#include <es_sock.h>
+#include <CommDbConnPref.h>
+#include <es_enum.h>
+#include <rconnmon.h>
+
+// CONSTANTS
+/** Max Bandwidth constants -- from Helix Player, R1_Mobile_4_0_Factory.cfg : GRPS */
+const TInt KCRBandwidthGPRS( 40200 );
+/** Max Bandwidth constants -- from Helix Player, R1_Mobile_4_0_Factory.cfg : EGRPS */
+const TInt KCRBandwidthEdgeGPRS( 89600 );
+/** Max Bandwidth constants -- from Helix Player, R1_Mobile_4_0_Factory.cfg : 3G */
+const TInt KCRBandwidthWCDMA( 384000 );
+/** Max Bandwidth constants -- from Helix Player, R1_Mobile_4_0_Factory.cfg : WLAN */
+const TInt KCRBandwidthWLAN( 1432572 );
+/** Max Bandwidth constants -- from Helix Player, R1_Mobile_4_0_Factory.cfg : LAN */
+const TInt KCRBandwidthLAN( 3000000 );
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CCRConnection;
+
+// CLASS DECLARATION
+
+/**
+* RConnection wrapper
+*/
+class CCRConnection : public CActive,
+ public MConnectionMonitorObserver
+ {
+
+public: // Data types
+
+ /**
+ * Enumeration for different connection stages
+ */
+ enum TConnectionState
+ {
+ EIdle, /**< Connection idle */
+ EFindingAP, /**< Search access point */
+ EFindingBearer, /**< Finding bearer */
+ EOpen, /**< Opening connection */
+ EConnecting /**< Connecting */
+ };
+
+ /**
+ * Heuristics for the connection, ie, characteristics from the
+ * connection discovered during run-time and that may affect it's usage.
+ */
+ enum TConnectionHeuristic
+ {
+ /**
+ * Connection is unable to stream RTP over UDP,
+ * most likely due to firewall blocking.
+ */
+ EUdpStreamingBlocked = 0
+ };
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @param aSockServer
+ * @return CCRConnection pointer to CCRConnection class
+ */
+ static CCRConnection* NewL( RSocketServ& aSockServer );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CCRConnection( );
+
+public: // New methods
+ /**
+ * Method for starting and attaching a connection.
+ * @since Series 60 3.0
+ * @param aConnectionId Connection id.
+ * @return none.
+ */
+ void Attach( TUint aConnectionId );
+
+ /**
+ * Method for getting the rconnection to use. This is useful only
+ * when connection state is open.
+ * @since Series 60 3.0
+ * @param none.
+ * @return reference to RConnection.
+ */
+ RConnection& Connection( void );
+
+ /**
+ * Method for getting state of the connection.
+ * @since Series 60 3.0
+ * @param none.
+ * @return connection state.
+ */
+ TConnectionState State( void ) const;
+
+ /**
+ * Gets bearer for current connection.
+ * @since Series 60 3.0
+ * @param none.
+ * @return bearer type
+ */
+ TConnMonBearerType BearerType() const;
+
+ /**
+ * Gets (estimated) maximum available connection bandwidth.
+ * @since Series 60 3.0
+ * @param none.
+ * @return bandwidth in bit/s, zero if unkown or connection not available.
+ */
+ TInt MaximumBandwidth();
+
+ /**
+ * Check if bearer is considered 3G, WLAN or similar
+ * @since Series 60 3.0
+ * @param none.
+ * @return TBool
+ */
+ TBool IsBearerWLANor3G( TConnMonBearerType aBearer );
+
+ /**
+ * Add observer for connection status.
+ * @since Series 60 3.0
+ * @param aObserver new observer
+ * @return TInt
+ */
+ TInt RegisterObserver( MCRConnectionObserver* aObserver );
+
+ /**
+ * remove observer for connection status.
+ * @since Series 60 3.0
+ * @param aObserver observer to be removed.
+ * @return TInt.
+ */
+ TInt UnregisterObserver( MCRConnectionObserver* aObserver );
+
+ /**
+ * Retrives a heuristic associated with the connection.
+ * @since Series 60 3.0
+ * @param aHeuristic
+ * @return value associated with the heuristic.
+ */
+ TBool GetHeuristic( TConnectionHeuristic aHeuristic );
+
+ /**
+ * Sets a heuristic associated with the connection
+ * @since Series 60 3.0
+ * @param aHeuristic
+ * @param aValue value associated with the heuristic.
+ * @return none.
+ */
+ void SetHeuristic( TConnectionHeuristic aHeuristic,
+ TBool aValue );
+
+private: // Methods from base classes
+
+ /**
+ * From CActive.
+ * Cancel protocol implementation.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void DoCancel();
+
+ /**
+ * From CActive.
+ * Outstanding request completed.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void RunL();
+
+ /**
+ * From CActive.
+ * Handle error.
+ * @since Series 60 3.0
+ * @param aError Error code.
+ * @return KErrNone.
+ */
+ TInt RunError( TInt aError );
+
+ /**
+ * From MConnectionMonitorObserver.
+ * Receives event notifications from connection monitor,
+ * specifically for bearer changes.
+ * @since Series 60 3.0
+ * @param aConnMonEvent
+ * @return none.
+ */
+ void EventL( const CConnMonEventBase& aConnMonEvent );
+
+private: // New methods
+
+ /**
+ * Method for sending connection error events to message queue.
+ * @since Series 60 3.0
+ * @param aError is Error code.
+ * @return none
+ */
+ void SendConnectionErrorToQueue( TInt aError );
+
+ /**
+ * Close internal RConnection iConnection.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none
+ */
+ void CloseRConnection();
+
+ /**
+ * Finds access point.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none
+ */
+ TInt FindApL();
+
+ /**
+ * Finds bearer.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none
+ */
+ void FindBearerL();
+
+ /**
+ * Notify UI about connection.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none
+ */
+ void NotificationL();
+
+private: // Constructors and destructors
+
+ /**
+ * default constructor
+ * @param aSockServer a reference to socket server.
+ */
+ CCRConnection( RSocketServ& aSockServer );
+
+ /**
+ * 2nd phase constructor
+ */
+ void ConstructL();
+
+private: // Data
+
+ /**
+ * Socker server.
+ */
+ RSocketServ& iSockServer;
+
+ /**
+ * Connection.
+ */
+ RConnection iConnection;
+
+ /**
+ * Observers.
+ */
+ RPointerArray<MCRConnectionObserver> iObservers;
+
+ /**
+ * Current state.
+ */
+ TConnectionState iState;
+
+ /**
+ * Connection preference.
+ */
+ TCommDbConnPref iConnPref;
+
+ /**
+ * variable for getting notification when interface goes up or down
+ */
+ TNifProgressBuf iNotification;
+
+ /**
+ * Connection id to be used
+ */
+ TUint iCurrentConnectionId;
+
+ /**
+ * Connection monitor
+ */
+ RConnectionMonitor iConMon;
+
+ /**
+ * How many active connections were found by connection monitor
+ */
+ TUint iConnectionCount;
+
+ /**
+ * Heuristics for connection
+ */
+ TUint32 iHeuristics;
+
+ /**
+ * Bearer type for current connection
+ */
+ TConnMonBearerType iBearerType;
+
+ /**
+ * Bearer type detected after change
+ */
+ TConnMonBearerType iNewBearerType;
+
+ /**
+ * Whether we have connection progress notification pending or not
+ */
+ TBool iConMonProgressNotifyPending ;
+
+ };
+
+#endif // __CCRCONNECTION_H
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCREngine.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,538 @@
+/*
+* 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
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRNullSink.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,165 @@
+/*
+* 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: Packet sink where no-one gets the streaming*
+*/
+
+
+
+
+#ifndef CCRNULLSINK_H
+#define CCRNULLSINK_H
+
+// INCLUDES
+#include "CCRPacketSinkBase.h"
+#include "CCRPacketBuffer.h"
+#include "MCRTimerObserver.h"
+#include <e32base.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CCRConnection;
+class RSocketServ;
+class CCRStreamingSession;
+class CCRTimer;
+class MCRConnectionObserver;
+
+// CLASS DECLARATION
+
+/**
+* Packet sink that does not forward packets. Good for testing.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRNullSink : public CCRPacketSinkBase,
+ public MCRTimerObserver
+ {
+
+public: // Constructors and destructors
+
+ /**
+ * Two-phased constructor.
+ * @return CCRNullSink pointer.
+ */
+ static CCRNullSink* NewL( CCRStreamingSession::TCRSinkId aSinkId,
+ CCRStreamingSession& aOwningSession );
+
+ /**
+ * Destructor
+ */
+ virtual ~CCRNullSink();
+
+public: // Public methods, testing purpose
+ /**
+ * Register a test observer to receive streaming information
+ * @param aObserver pointer to observer
+ */
+ void RegisterConnectionObs( MCRConnectionObserver* aObserver );
+
+ /**
+ * Method that source uses to communicate its status.
+ * @since Series 60 3.0
+ * @param aNewState is the new state of the source.
+ * @return none.
+ */
+ virtual void StatusChanged( MCRPacketSource::TCRPacketSourceState aNewState );
+
+protected: // Constructors and destructors
+
+ /**
+ * By default default constructor is private
+ * @param aSinkId that this class needs to use when reporting progress back to owner
+ * @param aOwningSession is the streaming session that owns this instance
+ */
+ CCRNullSink( CCRStreamingSession::TCRSinkId aSinkId,
+ CCRStreamingSession& aOwningSession );
+
+ /**
+ * Second phase of 2-phased construction
+ */
+ void ConstructL();
+
+private: // Methods from base classes
+
+ /**
+ * From CCRPacketSinkBase.
+ * Connects the given buffer with this sink.
+ * @since Series 60 3.0
+ * @param aBuffer is the buffer to connect with.
+ * @return none.
+ */
+ void SetBuffer( CCRPacketBuffer* aBuffer );
+
+ /**
+ * From CCRPacketSinkBase.
+ * Method for setting the sdp in use.
+ * @since Series 60 3.0
+ * @param aSdp is the new sdp.
+ * @return none.
+ */
+ void SetSdpL( const TDesC8& aSdp );
+
+ /**
+ * From CCRPacketSinkBase.
+ * Adds packet to the sink.
+ * @since Series 60 3.0
+ * @return none.
+ */
+ void NewPacketAvailable();
+
+ /**
+ * From MCRTimerObserver.
+ * The function to be called when a timeout occurs.
+ * @since Series 60 3.0
+ * @param aTimer a pointer to timer.
+ * @return none.
+ */
+ void TimerExpired( CCRTimer* aTimer );
+
+private: // Data
+
+ /**
+ * SDP in use.
+ */
+ HBufC8* iSdp;
+
+ /**
+ * Flow control timer.
+ */
+ CCRTimer* iFlowTimer;
+
+ /**
+ * when TBool in iPacketPendingInBuffer is ETrue it means that the buffer
+ * in iBuffer having same array index as said TBool has a packet.
+ * waiting to be sent to rop
+ */
+ TBool iPacketPendingInBuffer;
+
+ /**
+ * Test client observer
+ */
+ MCRConnectionObserver* iObserver;
+ };
+
+#endif // CCRNULLSINK_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRNullSource.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,256 @@
+/*
+* 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: Class that reads packets from a .rtp clip for testing purposes.*
+*/
+
+
+
+
+#ifndef CCRNULLSOURCE_H
+#define CCRNULLSOURCE_H
+
+// INCLUDES
+#include "CCRPacketSourceBase.h"
+#include <ipvideo/MRtpFileReadObserver.h>
+#include <ipvideo/MRtpFileWriteObserver.h>
+#include "MRtpTimerObserver.h"
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CRtpClipHandler;
+class CRtpTimer;
+
+// CLASS DECLARATION
+
+/**
+* Class that negotiaties RTP stream using RTSP.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRNullSource : public CCRPacketSourceBase,
+ public MRtpFileReadObserver,
+ public MRtpTimerObserver
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @return CCRNullSource pointer to CCRNullSource class
+ */
+ static CCRNullSource* NewL( const TDesC& aClipName,
+ MCRStreamObserver& aSessionObs,
+ CCRStreamingSession& aOwningSession );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CCRNullSource();
+
+public: // New functions
+
+ /**
+ *
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ //void PunchPacketsSent();
+
+private: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ * @param aSessionObs a session observer.
+ * @param aOwningSession a owning session.
+ */
+ CCRNullSource( MCRStreamObserver& aSessionObs,
+ CCRStreamingSession& aOwningSession );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL( const TDesC& aClipName );
+
+private: // Methods from base classes
+
+ /**
+ * From CCRPacketSourceBase.
+ * Method for acquiring sdp.
+ * @since Series 60 3.0
+ * @param aSdp is string pointer that will be .Set() to contain the sdp.
+ * If no sdp is available no .Set() will occur.
+ * @return KErrNotReady if no sdp available.
+ */
+ TInt GetSdp( TPtrC8& aSdp );
+
+ /**
+ * From CCRPacketSourceBase.
+ * Method for setting buffers to packet source
+ * @since Series 60 3.0
+ * @param aBuffer is buffer to be set.
+ * @return none.
+ */
+ void SetBuffer( CCRPacketBuffer* aBuffer );
+
+ /**
+ * From CCRPacketSourceBase.
+ * Post action after source initialized.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void PostActionL();
+
+ /**
+ * From CCRPacketSourceBase.
+ * Method for requesting more packets to buffer.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void Restore();
+
+ /**
+ * From CCRPacketSourceBase.
+ * Method for ordering "play" for packet source.
+ * @since Series 60 3.0
+ * @param aStartPos is start position in seconds.
+ * @param aEndPos is end position in seconds.
+ * @return a system wide error code.
+ */
+ TInt Play( const TReal& aStartPos,
+ const TReal& aEndPos );
+
+ /**
+ * From CCRPacketSourceBase.
+ * Method for stopping play from source.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a system wide error code.
+ */
+ TInt Stop();
+
+ /**
+ * From CCRPacketSourceBase.
+ * Getter for current position.
+ * @since Series 60 3.0
+ * @param aPosition a postion of playback.
+ * @param aDuration a duration of playback.
+ * @return a system wide error code.
+ */
+ TInt GetPosition( TInt64& aPosition,
+ TInt64& aDuration );
+
+ /**
+ * From MRtpFileReadObserver.
+ * Called when RTP packets group readed from a file.
+ * @since Series 60 3.0
+ * @param aGroup a RTP data readed from a file.
+ * @param aGroupTime a group time in milli seconds.
+ * @param aLastGroup a indication of last group in clip.
+ * @return none.
+ */
+ void GroupReadedL( const TDesC8& aGroup,
+ const TUint aGroupTime,
+ const TBool aLastGroup );
+
+ /**
+ * From MRtpFileReadObserver.
+ * File handler status of playback.
+ * @since Series 60 3.0
+ * @param aStatus a status of file reading.
+ * @return none.
+ */
+ void ReadStatus( TInt aStatus );
+
+ /**
+ * From MRtpTimerObserver.
+ * Called when timer completion event occurs
+ * @since Series 60 3.0
+ * @return none
+ */
+ void TimerEventL();
+
+ /**
+ * From MRtpTimerObserver.
+ * Handles a leave occurring in the request
+ * completion event handler RunL().
+ * @since Series 60 3.0
+ * @param aError the leave code.
+ * @return None.
+ */
+ void TimerError( const TInt aError );
+
+private: // New methods
+
+ /**
+ * Method for requesting more packets to buffer.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a system wide error code.
+ */
+ TInt NextClipGroup();
+
+ /**
+ * Converts old RTP propriatary format packet type to stream id.
+ * @since Series 60 3.0
+ * @param aType a packet type from a clip.
+ * @param aStream a stream id to update.
+ * @return true if packet valid, otherwise false.
+ */
+ TBool TypeToStream( const MRtpFileWriteObserver::TRtpType& aType,
+ MCRPacketSource::TCRPacketStreamId& aStream );
+
+private: // Data
+
+ /**
+ * Session observer.
+ */
+ MCRStreamObserver& iSessionObs;
+
+ /**
+ * RTP clip handler.
+ */
+ CRtpClipHandler* iClipHandler;
+
+ /**
+ * SDP data.
+ */
+ HBufC8* iSdp;
+
+ /**
+ * Packets flow timer.
+ */
+ CRtpTimer* iFlowTimer;
+
+ /**
+ * Time of last readed group.
+ */
+ TUint iGroupTime;
+
+ };
+
+#endif // CCRNULLSOURCE_H
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRPacketBuffer.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,351 @@
+/*
+* 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: Ring buffer for storing packets from source.*
+*/
+
+
+
+
+#ifndef _CCRPACKETBUFFER_H
+#define _CCRPACKETBUFFER_H
+
+// INCLUDES
+#include "MCRPacketSource.h"
+#include "CCRPacketSinkBase.h"
+#include <e32base.h>
+#include <e32cmn.h>
+
+// CONSTANTS
+const TInt KStreamTypeBytePoint( 0 );
+const TInt KStreamTypeBytesLength( 1 );
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CCRPacketSinkBase;
+
+// CLASS DECLARATION
+
+/**
+* Ring buffer where to store RTP packets.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRPacketBuffer : public CBase
+ {
+
+public: // Constructors and destructors
+
+ /**
+ * Allocation method for buffer.
+ * @param aMaxPackets a maximum packets count in buffer.
+ * @return buffer id.
+ */
+ static CCRPacketBuffer* NewL( const TInt aMaxPackets );
+
+ /**
+ * De-allocation method.
+ */
+ ~CCRPacketBuffer();
+
+public: // New methods
+
+ /**
+ * Method for setting sink for buffer
+ * @since Series 60 3.0
+ * @param aSink is the sink to set
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ TInt AddSink( CCRPacketSinkBase* aSink );
+
+ /**
+ * Method for adding a packet to buf. Succeeds always.
+ * If memory allocation fails this silently fails.
+ * @since Series 60 3.0
+ * @param aStream a type of packet.
+ * @param aHeader a pointer to packet header.
+ * @param aPacket a pointer to packet payload.
+ * @return none
+ */
+ void AddPacket( const MCRPacketSource::TCRPacketStreamId& aStream,
+ const TDesC8& aHeader,
+ const TDesC8& aPacket );
+
+ /**
+ * Method for adding a packet to buf.
+ * If memory allocation fails this silently fails.
+ * @since Series 60 3.0
+ * @param aStream a type of packet.
+ * @param aPacket is pointer to data that will be stored to buf.
+ * @return none
+ */
+ void AddPacket( const MCRPacketSource::TCRPacketStreamId& aStream,
+ const TDesC8& aPacket );
+
+ /**
+ * Setter for buffer's flow control mode.
+ * @since Series 60 3.0
+ * @param aState a state to set.
+ * @return none
+ */
+ void ContinousStream( const TBool aState );
+
+ /**
+ * Getter for buffer's flow control mode.
+ * @since Series 60 3.0
+ * @return true if continous stream,
+ false if needs flow control.
+ */
+ TBool ContinousStream();
+
+ /**
+ * Setter for buffer's flow control state.
+ * @since Series 60 3.0
+ * @param aState a state to set.
+ * @return none
+ */
+ void MoreComing( const TBool aState );
+
+ /**
+ * Getter for buffer's flow control state.
+ * @since Series 60 3.0
+ * @return more coming state.
+ */
+ TBool MoreComing();
+
+ /**
+ * Getter for stream of next packet.
+ * @since Series 60 3.0
+ * @param aId a id of requester.
+ * @param a stream of the packet.
+ * @return a book keeping index of sink.
+ */
+ TInt GetStream( const CCRStreamingSession::TCRSinkId& aId,
+ MCRPacketSource::TCRPacketStreamId& aStreamId );
+
+ /**
+ * Getter for stream of packet in given offset.
+ * @since Series 60 3.0
+ * @param aId a id of requester.
+ * @param a stream of the packet.
+ * @return a book keeping index of sink.
+ */
+ TInt GetStream( const CCRStreamingSession::TCRSinkId& aId,
+ const TInt aOffset,
+ MCRPacketSource::TCRPacketStreamId& aStreamId );
+
+ /**
+ * Method for taking packet from a buffer.
+ * @since Series 60 3.0
+ * @param aId a id of requester.
+ * @param aReturnedData is pointer where the data is read.
+ * NULL if nothing found.
+ * @return none.
+ */
+ void GetPacket( const CCRStreamingSession::TCRSinkId& aId,
+ TPtr8& aReturnedData );
+
+ /**
+ * Method for taking packet from a buffer.
+ * @since Series 60 3.0
+ * @param aBookKeeping a book keeping index.
+ * @param aReturnedData is pointer where the data is read.
+ * NULL if nothing found.
+ * @return none.
+ */
+ void GetPacket( const TInt aBookKeeping,
+ TPtr8& aReturnedData );
+
+ /**
+ * Method for peeking at a packet in particular offset. This does not
+ * set the packet to be removed from the buffer.
+ *
+ * @since S60 v3.0
+ * @param aId a id of requester.
+ * @param aReturnedData is pointer where the data is read.
+ * NULL if nothing found.
+ * @param aOffset offset of the packet to be peeked. If zero, the next
+ * packet in the buffer is peeked.
+ */
+ void PeekPacket( const CCRStreamingSession::TCRSinkId& aId,
+ TPtr8& aReturnedData,
+ const TInt aOffset );
+
+ /**
+ * Method for peeking at a packet in particular offset. This does not
+ * set the packet to be removed from the buffer.
+ *
+ * @since S60 v3.0
+ * @param aBookKeeping a book keeping index.
+ * @param aReturnedData is pointer where the data is read.
+ * NULL if nothing found.
+ * @param aOffset offset of the packet to be peeked. If zero, the next
+ * packet in the buffer is peeked.
+ */
+ void PeekPacket( const TInt aBookKeeping,
+ TPtr8& aReturnedData,
+ const TInt aOffset );
+
+ /**
+ * Method for asking how much packets there are in buf for certain sink.
+ * @since Series 60 3.0
+ * @param aId a id of requester.
+ * @return number of packets in buffer.
+ */
+ TInt PacketsCount( const CCRStreamingSession::TCRSinkId& aId );
+
+ /**
+ * Method for asking how much packets there are in buf in any sink.
+ * @since Series 60 3.0
+ * @param none.
+ * @return minimum number of packets in buffer.
+ */
+ TInt PacketsMinCount();
+
+ /**
+ * Method for removing a sink.
+ * @since Series 60 3.0
+ * @param aSink is the sink to delete
+ * @return number of sinks remaining
+ */
+ TInt RemoveSink( CCRPacketSinkBase* aSink );
+
+ /**
+ * Method for handle buffer wrapping.
+ * @since Series 60 3.0
+ * @return None.
+ */
+ void HandleBufferSize();
+
+ /**
+ * Method for handle buffer size adjust.
+ * @since Series 60 3.0
+ * @return None.
+ */
+ void AdjustBuffer();
+
+ /**
+ * Method for handle buffer resetting.
+ * @since Series 60 3.0
+ * @return None.
+ */
+ void ResetBuffer();
+
+private: // Constructors and destructor
+
+ /**
+ * Second pat of construction
+ */
+ void ConstructL();
+
+ /**
+ * Default constructor is private.
+ * @param aMaxPackets a maximum packets count in buffer.
+ */
+ CCRPacketBuffer( const TInt aMaxPackets );
+
+private: // New methods
+
+ /**
+ * Method for handling maximum packets in buffer.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void VerifyRoom();
+
+ /**
+ * Method for taking book keeping index from sink id.
+ * @since Series 60 3.0
+ * @param aId a id of requester.
+ * @return a book keeping index of sink.
+ */
+ TInt GetBookKeeping( const CCRStreamingSession::TCRSinkId& aId );
+
+ /**
+ * Method for taking book keeping index from sink id.
+ * @since Series 60 3.0
+ * @param aBookKeeping a book keeping index.
+ * @return an buffer index base on sink.
+ */
+ TInt GetBufferIndex( const TInt aBookKeeping );
+
+ /**
+ * Method for update book keeping of the packets.
+ * @since Series 60 3.0
+ * @param aDataLength a data length of packet.
+ * @return None.
+ */
+ void PacketToBookKeeping();
+
+private: // Data types
+
+ // Book keeping array
+ class SBookKeeping
+ {
+
+ public: // Data
+
+ /**
+ * Sink id.
+ */
+ CCRStreamingSession::TCRSinkId iId;
+
+ /**
+ * Buffer index.
+ */
+ TInt iIndex;
+
+ };
+
+private: // Data
+
+ /**
+ * Maximum memory usage.
+ */
+ const TInt iMaxPackets;
+
+ /**
+ * Flow control mode.
+ */
+ TBool iContinousStream;
+
+ /**
+ * Flow control state.
+ */
+ TBool iMoreComing;
+
+ /**
+ * Buffer to keep packets.
+ */
+ RPointerArray<HBufC8> iBuffer;
+
+ /**
+ * Keeps track of point of each user.
+ */
+ RArray<SBookKeeping> iBookKeeping;
+
+ /**
+ * Zero or more packet sinks that are fed via this buffer.
+ */
+ RPointerArray<CCRPacketSinkBase> iSinkArray;
+
+ };
+
+#endif // _CCRPACKETBUFFER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRPacketSinkBase.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,182 @@
+/*
+* 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: Common interface for sinks*
+*/
+
+
+
+
+#ifndef CCRPACKETSINKBASE_H
+#define CCRPACKETSINKBASE_H
+
+// INCLUDES
+#include <e32base.h>
+#include "CCRStreamingSession.h"
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CCRPacketBuffer;
+
+// CLASS DECLARATION
+
+/**
+* Interface to sink.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRPacketSinkBase : public CBase
+ {
+
+public: // Constructors and destructors
+
+ /**
+ * Destructor
+ */
+ virtual ~CCRPacketSinkBase();
+
+public: // New methods
+
+ /**
+ * Connects the given buffer with this sink.
+ * @since Series 60 3.0
+ * @param aBuffer is the buffer to connect with.
+ * @param aBufId a id of the buffer.
+ * @return none.
+ */
+ void SetBuffer( CCRPacketBuffer* aBuffer );
+
+ /**
+ * Method for setting the sdp in use.
+ * @since Series 60 3.0
+ * @param aSdp is the new sdp.
+ * @return none.
+ */
+ virtual void SetSdpL( const TDesC8& aSdp ) = 0;
+
+ /**
+ * Adds packet to sink
+ * @since Series 60 3.0
+ * @return none.
+ */
+ virtual void NewPacketAvailable() = 0;
+
+ /**
+ * Buffer reset info for the sink.
+ * @since Series 60 3.0
+ * @return none.
+ */
+ virtual void BufferResetDone();
+
+ /**
+ * Method that source uses to communicate its status.
+ * @since Series 60 3.0
+ * @param aNewState is the new state of the source.
+ * @return none.
+ */
+ virtual void StatusChanged( MCRPacketSource::TCRPacketSourceState aNewState );
+
+ /**
+ * Method that owner of sink may utilitze to distinguish between sinks.
+ * @since Series 60 3.0
+ * @param none.
+ * @return Id that may have been set.
+ */
+ virtual CCRStreamingSession::TCRSinkId Id( void ) const;
+
+ /**
+ * Method for pause action for sink.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a system wide error code.
+ */
+ virtual TInt Pause();
+
+ /**
+ * Method for restore action for sink.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a system wide error code.
+ */
+ virtual TInt Restore();
+
+ /**
+ * Method for stopping action for sink.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ virtual void Stop();
+
+ /**
+ * method for setting initial seq+ts _before_ the stream is played.
+ * @since Series 60 3.0
+ * @param aAudioSeq is the initial rtp seq number for audio packets.
+ * @param aAudioTS is the initial rtp timestamp number for audio packets.
+ * @param aVideoSeq is the initial rtp seq number for video packets.
+ * @param aVideoTS is the initial rtp timestamp number for video packets.
+ * @return none.
+ */
+ virtual void SetSeqAndTS( TUint& aAudioSeq,
+ TUint& aAudioTS,
+ TUint& aVideoSeq,
+ TUint& aVideoTS );
+
+ /**
+ * method for setting play range before the stream is played.
+ * @param aLower is where clip range begins, in seconds.
+ * @param aUpper is where clip range ends, usually clip end, in seconds.
+ * @return none.
+ */
+ virtual void SetRange( TReal aLower,
+ TReal aUpper );
+
+protected: // Constructors and destructors
+
+ /**
+ * Default constructor
+ */
+ CCRPacketSinkBase( CCRStreamingSession& aSession,
+ CCRStreamingSession::TCRSinkId aSinkId );
+
+protected: // Data
+
+ /**
+ * Pointer to streaming session that owns us.
+ */
+ CCRStreamingSession& iOwningSession;
+
+ /**
+ * Buffer used by sinks.
+ */
+ CCRPacketBuffer* iBuffer;
+
+ /**
+ * Sink id, set by owner.
+ */
+ const CCRStreamingSession::TCRSinkId iSinkId;
+
+ };
+
+#endif // CCRPACKETSINKBASE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRPacketSourceBase.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,226 @@
+/*
+* 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: Common interface for sources*
+*/
+
+
+
+#ifndef MCRPACKETSOURCEBASE_H
+#define MCRPACKETSOURCEBASE_H
+
+// INCLUDES
+#include "CCRStreamingSession.h"
+#include "MCRPacketSource.h"
+#include "MCRConnectionObserver.h"
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+// None
+
+/**
+* Interface to source.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRPacketSourceBase : public CBase,
+ public MCRPacketSource
+ {
+
+public: // Constructors and destructors
+
+ /**
+ * Destructor
+ */
+ virtual ~CCRPacketSourceBase();
+
+public: // Methods from base classes
+
+ /**
+ * From MCRPacketSource.
+ * Method for setting buffers to packet source.
+ * @since Series 60 3.0
+ * @param aBuffer is buffer to be set.
+ * @return none.
+ */
+ virtual void SetBuffer( CCRPacketBuffer* aBuffer );
+
+ /**
+ * From MCRPacketSource.
+ * Method for acquiring sdp.
+ * @since Series 60 3.0
+ * @param aSdp is string pointer that will be .Set() to contain the sdp.
+ * If no sdp is available no .Set() will occur.
+ * @return KErrNotReady if no sdp available.
+ */
+ virtual TInt GetSdp( TPtrC8& aSdp ) = 0;
+
+ /**
+ * From MCRPacketSource.
+ * Method for acquiring (almost) up-to-date sequence and ts numbers.
+ * @since Series 60 3.0
+ * @param aAudioSeq is reference to TUint that will be set by this
+ * method to contain latest available sequence number for
+ * audio stream being received via this packet source.
+ * @param aAudioTS rtp timestamp for audio.
+ * @param aVideoSeq rtp seq for video. If no video, value will not be touched.
+ * @param aVideoTS rtp ts for video.
+ * @return KErrNone if data available.
+ */
+ virtual TInt SeqAndTS( TUint& aAudioSeq,
+ TUint& aAudioTS,
+ TUint& aVideoSeq,
+ TUint& aVideoTS );
+
+ /**
+ * From MCRPacketSource.
+ * Method for ordering "play" for packet source.
+ * @since Series 60 3.0
+ * @param aStartPos is start position in seconds.
+ * @param aEndPos is end position in seconds.
+ * @return a system wide error code.
+ */
+ virtual TInt Play( const TReal& aStartPos,
+ const TReal& aEndPos );
+
+ /**
+ * From MCRPacketSource.
+ * Method for pausing play from source.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a system wide error code.
+ */
+ virtual TInt Pause();
+
+ /**
+ * From MCRPacketSource.
+ * Method for stopping play from source.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a system wide error code.
+ */
+ virtual TInt Stop();
+
+ /**
+ * From MCRPacketSource.
+ * Setter for current position.
+ * @since Series 60 3.0
+ * @param aPosition a postion of playback.
+ * @return a system wide error code.
+ */
+ virtual TInt SetPosition( const TInt64 aPosition );
+
+ /**
+ * From MCRPacketSource.
+ * Getter for current position.
+ * @since Series 60 3.0
+ * @param aPosition a postion of playback.
+ * @param aDuration a duration of playback.
+ * @return a system wide error code.
+ */
+ virtual TInt GetPosition( TInt64& aPosition,
+ TInt64& aDuration );
+
+ /**
+ * From MCRPacketSource.
+ * Method for getting range of stream. If no range/duration
+ * is available this method will set the return values to
+ * 0.0,-1.0 and that may be quite normal state live streams.
+ * @since Series 60 3.0
+ * @param aLower is where to start from.
+ If no value available, value of aLower must be set to 0.
+ * @param aUpper is where to stop. Negative values mean eternity.
+ * @return none.
+ */
+ virtual void GetRange( TReal& aLower,
+ TReal& aUpper );
+
+ /**
+ * From MCRPacketSource.
+ * Post action after source initialized.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ virtual void PostActionL();
+
+ /**
+ * From MCRPacketSource.
+ * Method for requesting more packets to buffer.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ virtual void Restore();
+
+public: // New methods
+
+ /**
+ * Method that owner of source may utilitze to distinguish
+ * between sources
+ * @since Series 60 3.0
+ * @param none.
+ * @return Id that may have been set.
+ */
+ virtual CCRStreamingSession::TCRSourceId Id( void ) const;
+
+ /**
+ * Registers connection observer.
+ * @since Series 60 3.0
+ * @param aObserver aObserver.
+ * @return none.
+ */
+ virtual void RegisterConnectionObs( MCRConnectionObserver* aObserver );
+
+protected: // Constructors and destructors
+
+ /**
+ * Default constructor
+ */
+ CCRPacketSourceBase( CCRStreamingSession& aSession,
+ CCRStreamingSession::TCRSourceId aSourceId );
+
+protected: // Data
+
+ /**
+ * Pointer to streaming session that owns us.
+ */
+ CCRStreamingSession& iOwningSession;
+
+ /**
+ * Buffer used by sources.
+ */
+ CCRPacketBuffer* iBuffer;
+
+ /**
+ * Source id, set by owner
+ */
+ const CCRStreamingSession::TCRSourceId iSourceId;
+
+ };
+
+#endif // MCRPACKETSOURCEBASE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRPunchPacketSender.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,188 @@
+/*
+* 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: Class for sending a punch packet*
+*/
+
+
+
+
+#ifndef __CCRPUNCHPACKRTSENDER_H
+#define __CCRPUNCHPACKRTSENDER_H
+
+// INCLUDES
+#include <e32base.h>
+#include "CCRSock.h"
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CCRConnection;
+class CAsyncCallBack;
+class CCRRtspPacketSource;
+
+// CLASS DECLARATION
+
+/**
+* Class that punches holes to firewall.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRPunchPacketSender : public CBase, public MCRSockObserver
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @return CCRPunchPacketSender pointer to CCRPunchPacketSender class
+ */
+ static CCRPunchPacketSender* NewL( RConnection& aConnection,
+ RSocketServ& aSockServer,
+ TInetAddr& aFromAddr,
+ TInetAddr& aRemoteAddr ,
+ TUint32 aMySSRC,
+ CCRRtspPacketSource& aOwner );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CCRPunchPacketSender( );
+
+private: // Methods from base classes
+
+ /**
+ * From MCRSockObserver.
+ * This method is called after some data has been received from socket.
+ * @since Series 60 3.0
+ * @param aData is descriptor containing the data received.
+ * ownership of data is not passed via this call.
+ * @return none.
+ */
+ void DataReceived( TInt aSockId,
+ const TDesC8 &aData );
+
+ /**
+ * From MCRSockObserver.
+ * This method is called after status of socket changes.
+ * @since Series 60 3.0
+ * @param aStatus is sock status.
+ * @return none.
+ */
+ void SockStatusChange( TInt aSockId,
+ CCRSock::TCRSockStatus aStatus,
+ TInt aError );
+
+private:
+
+ /**
+ * Default constructor.
+ * @param aConnection a connection.
+ * @param aSockServer a socket server.
+ * @param aFromAddr a address.
+ * @param aRemoteAddr
+ * @param aMySSRC
+ * @param aOwner
+ */
+ CCRPunchPacketSender( RConnection& aConnection,
+ RSocketServ& aSockServer,
+ TInetAddr& aFromAddr,
+ TInetAddr& aRemoteAddr ,
+ TUint32 aMySSRC,
+ CCRRtspPacketSource& aOwner );
+
+ /**
+ * 2nd phase constructor
+ */
+ void ConstructL();
+
+private: // new methods
+
+ /**
+ * Method that is called when this instace is finishing business.
+ * @since Series 60 3.0
+ * @param aSelf
+ * @return TInt
+ */
+ static TInt CleanupCallBack ( TAny* aSelf );
+
+private: // Data types
+
+ /**
+ * Connection.
+ */
+ RConnection& iConnection;
+
+ /**
+ * Socket server.
+ */
+ RSocketServ& iSockServer;
+
+ /**
+ * Socket 1.
+ */
+ CCRSock* iSock1;
+
+ /**
+ * Socket 2
+ */
+ CCRSock* iSock2;
+
+ /**
+ * Address.
+ */
+ TInetAddr iFromAddr;
+
+ /**
+ * Remote address.
+ */
+ TInetAddr iRemoteAddr;
+
+ /**
+ * Sender report.
+ */
+ TUint32 iMySSRC;
+
+ /**
+ * Owner.
+ */
+ CCRRtspPacketSource& iOwner;
+
+ /**
+ * Asyncronic cleanup.
+ */
+ CAsyncCallBack* iCleanUp;
+
+ /**
+ * Socket 1 state.
+ */
+ TBool iSentViaSock1;
+
+ /**
+ * Socket 2 state.
+ */
+ TBool iSentViaSock2;
+
+ };
+
+#endif // __CCRPUNCHPACKRTSENDER_H
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRRTSPCommand.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,310 @@
+/*
+* Copyright (c) 2009 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: Class for parsing and producing a command string*
+*/
+
+
+
+
+#ifndef CCRRTSPCOMMAND_H
+#define CCRRTSPCOMMAND_H
+
+// INCLUDES
+#include "CRRtspCommon.h"
+#include <Hash.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+
+/**
+* Class that parses and produces rtsp commands as in rfc2326.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRRtspCommand : public CCRRtspCommon
+ {
+
+public: // Data types
+
+ /**
+ * Enum for subset of RTSP commands
+ */
+ enum TCommand
+ {
+ ERTSPCommandPLAY = 0, /**< Command for triggering clip that has been SETUP */
+ ERTSPCommandPAUSE, /**< Command for pausing a clip that is already playing */
+ ERTSPCommandTEARDOWN, /**< Command for quitting a session */
+ ERTSPCommandOPTIONS, /**< No operation, except ping */
+ ERTSPCommandDESCRIBE, /**< Command for acquiring an SDP */
+ ERTSPCommandSETUP, /**< Command for setting up audio or video stream */
+ ERTSPCommandNOCOMMAND /**< init value, no-operation */
+ };
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @return CCRRtspCommand pointer to CCRRtspCommand class.
+ */
+ static CCRRtspCommand* NewL();
+
+ /**
+ * Destructor.
+ */
+ virtual ~CCRRtspCommand( );
+
+public: // New functions
+
+ /**
+ * Method that is used to give rtsp command to this class.
+ * command is something alike:
+ * "PLAY rtsp://vishnu.wipsl.com/oops/winter_fun.mp4/ RTSP/1.0\r\n..."
+ * @since Series 60 3.0
+ * @param aString is the response string
+ * @return none.
+ * May leave with symbian error codes. At least following may be
+ * seen: KErrUnderflow if there is \r\n\r\n sequence in the string
+ * marking end of response or if there is content (like SDP) and the
+ * content lenght is too short; KErrNotSupported if it doesn't look
+ * like RTSP at all.
+ */
+ void TryParseL( const TDesC8 &aString );
+
+ /**
+ * Method for getting URL.
+ * @since Series 60 3.0
+ * @param aURL is string descriptor allocated by caller that
+ * will have its content set to block allocated by instance
+ * of this class containing the session id.
+ * @return KErrNone if no error, KErrNotFound if URL is not there.
+ */
+ TInt URL( TPtrC8& aURL );
+
+ /**
+ * Method for setting URL.
+ * @since Series 60 3.0
+ * @param aURL is string descriptor allocated by caller.
+ * @return none.
+ */
+ void SetURL( const TDesC8& aURL );
+
+ /**
+ * Method for setting command.
+ * @since Series 60 3.0
+ * @param aCommand is the command that will be set.
+ * @return none.
+ */
+ void SetCommand( TCommand aCommand );
+
+ /**
+ * Method for setting authentication info.
+ * @since Series 60 3.0
+ * @param aAuth is ETrue if authentication is to be used.
+ * When constructing command string, authentication headers
+ * will be added. See also SetUserNameL et al.
+ * @return none.
+ */
+ void SetAuthentication( TBool aAuth );
+
+ /**
+ * Sets identification string to be sent as 'UserAgent' header.
+ * No header is sent if not identification is not set.
+ * @since Series 60 3.0
+ * @param aUserAgent user agent identification.
+ * @return none.
+ */
+ void SetUserAgentL( const TDesC8& aUserAgent );
+
+ /**
+ * Sets connection bandwidth to be sent as 'Bandwidth' header.
+ * No header is sent if bandwidth is not set.
+ * @since Series 60 3.0
+ * @param aBandwidth connection bandwidth in bit/s.
+ * @return none.
+ */
+ void SetBandwidth( TInt aBandwidth );
+
+ /**
+ * Sets profile identification for 'x-wap-profile' header.
+ * @since Series 60 3.0
+ * No header is sent if identification is not set.
+ * @param aWapProfile profile identification.
+ * @return none.
+ */
+ void SetWapProfileL( const TDesC8& aWapProfile );
+
+ /**
+ * Method for getting command.
+ * @since Series 60 3.0
+ * @param none.
+ * @return the command.
+ */
+ CCRRtspCommand::TCommand Command( void ) const;
+
+ /**
+ * Method that does opposite of parse: it produces a RTSP command.
+ * @since Series 60 3.0
+ * @param none.
+ * @return string descriptor containing the command
+ */
+ TPtrC8& ProduceL( void );
+
+ /**
+ * Appends string to the buffer.
+ * @since Series 60 3.0
+ * @param aBuffer a buffer where to add text.
+ * @param aTxt a string to append.
+ * @return none.
+ */
+ void AppendL( HBufC8*& aBuffer,
+ const TDesC8& aTxt );
+
+ /**
+ * Appends integer value as text to the buffer.
+ * @since Series 60 3.0
+ * @param aBuffer a buffer where to add text.
+ * @param aNum a numerical value to append.
+ * @return none.
+ */
+ void AppendNumL( HBufC8*& aBuffer,
+ const TInt aNum );
+
+ /**
+ * Appends formatted text to the buffer.
+ * @since Series 60 3.0
+ * @param aBuffer a buffer where to add text.
+ * @param aFmt a format string to use.
+ * @return none.
+ */
+ void AppendFormatL( HBufC8*& aBuffer,
+ TRefByValue<const TDesC8> aFmt, ... );
+
+private: // Constructors and destructors
+
+ /**
+ * default constructor
+ */
+ CCRRtspCommand();
+
+ /**
+ * 2nd phase constructor
+ */
+ void ConstructL();
+
+private: // new methods:
+
+ /**
+ * Method for finding the URL this command is about
+ * @since Series 60 3.0
+ * @param none.
+ * @return none but will leave with KErrNotSupported
+ * if it doesn't look like RTSP
+ */
+ void FindURLL( void );
+
+ /**
+ * Generates authentication header iAuthHeader using given values.
+ * Method described in RFC 2069 "An Extension to HTTP : Digest Access
+ * Authentication".
+ * @since Series 60 3.0
+ * @param aMethod Method name (e.g. "DESCRIBE" / "SETUP" / etc.)
+ */
+ void CalculateDigestResponseL( const TDesC8& aMethod );
+
+ /**
+ * Generates authentication header iAuthHeader using given values.
+ * Method described in RFC 2617 "HTTP Authentication: Basic and Digest
+ * Access Authentication".
+ * @since Series 60 3.0
+ * @param aMethod Method name (e.g. "DESCRIBE" / "SETUP" / etc.)
+ */
+ void CalculateBasicResponseL( const TDesC8& aMethod );
+
+ /**
+ * Calculates MD5 hash of the message.
+ * @since Series 60 3.0
+ * @param aMessage Message.
+ * @param aHash On return, contains message hash.
+ */
+ void HashL( const TDesC8& aMessage, TDes8& aHash );
+
+private: // Data
+
+ /**
+ * What command this is.
+ */
+ TCommand iCommand;
+
+ /**
+ * What is the URL that this command is about.
+ */
+ TPtrC8 iURL;
+
+ /**
+ * String descriptor that we retur with ProduceL.
+ */
+ TPtrC8 iProductDescriptor;
+
+ /**
+ * Authentication header.
+ */
+ HBufC8* iAuthHeader;
+
+ /**
+ * MD5 message digest class. Required for HTTP digest authentication.
+ */
+ CMD5* iMD5Calculator;
+
+ /**
+ * If authentication is needed.
+ */
+ TBool iAuthenticationNeeded;
+
+ /**
+ * User Agent header if present.
+ */
+ HBufC8* iUserAgent;
+
+ /**
+ * Connection bandwidth in bit/s for 'Bandwidth' header.
+ */
+ TInt iBandwidth;
+
+ /**
+ * Bandwidth present.
+ */
+ TBool iBandwidthAvailable;
+
+ /**
+ * x-wap-profile if present.
+ */
+ HBufC8* iWapProfile;
+
+ };
+
+#endif // CCRRTSPCOMMAND_H
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRRTSPPacketSource.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,1052 @@
+/*
+* 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: Class that negotiaties RTP stream using RTSP*
+*/
+
+
+
+
+#ifndef CCRRTSPPACKETSOURCE_H
+#define CCRRTSPPACKETSOURCE_H
+
+// INCLUDES
+#include "CCRPacketSourceBase.h"
+#include "CCRStreamingSession.h"
+#include "CCRConnection.h"
+#include "CCRRtspResponse.h"
+#include "CCRRtpTcpObserver.h"
+#include "CCRSock.h"
+#include "MCRTimerObserver.h"
+#include <rtp.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CCRRtspCommand;
+class CDvrSdpParser;
+class RRtpSession;
+class RRtpReceiveSource;
+class TRtpEvent;
+class CCRTimer;
+class CCRPunchPacketSender;
+class CCRRtpTcpStreamer;
+
+// CLASS DECLARATION
+
+/**
+* Class that negotiaties RTP stream using RTSP.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRRtspPacketSource : public CCRPacketSourceBase,
+ public MCRSockObserver,
+ public MCRRtpTcpObserver,
+ public MCRConnectionObserver,
+ public MCRTimerObserver
+ {
+
+public: // Data types
+
+ /**
+ * RTP packet memory layout structure
+ */
+ struct TCRRtpMessageHeader
+ {
+ TUint iVersion:2;
+ TUint iPadding:1;
+ TUint iExtension:1;
+ TUint iCsrcCount:4;
+ TUint iMarker:1;
+ TUint iPayloadType:7;
+ TUint iSeq:16;
+ TUint32 iTimestamp;
+ TUint32 iSSRC;
+ };
+
+ /**
+ * RTCP sender report memory layout
+ */
+ struct TCRRtpSRReportHeader
+ {
+ // Note the order of first 3 items:
+ unsigned char iReportCount:5; // this and
+ unsigned char iPadding:1; // this and
+ unsigned char iVersion:2; // this are first 8 bits.
+ // Note that above order is reversed from spec.
+ unsigned char iPacketType;
+ TUint16 iLength;
+ TUint32 iSenderSSRC;
+ TUint32 iMSWTimestamp;
+ TUint32 iLSWTimestamp;
+ TUint32 iRTPTimestamp;
+ TUint32 iSenderPacketCount;
+ TUint32 iSenderOctetCount;
+ };
+
+ /**
+ * Enum for identifying sockets. Sockets return this via Id()
+ * and this is also used as an array index.
+ */
+ enum TCRRTPSockId
+ {
+ ERTPControl=0, /**< placeholder for RTSP sock */
+ ERTPVideoSend1, /**< RTP video payload */
+ ERTPVideoSend2, /**< RTCP video */
+ ERTPAudioSend1, /**< RTP audio payload */
+ ERTPAudioSend2, /**< RTCP audio */
+ ERTPMaxSockets /**< Just max value, no real socket assigned for this */
+ };
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * Calling this method will finally cause a call to DoConnectL() so
+ * this class will start connecting as soon as it is constructed,
+ * address where to connect to is in aParams.
+ * @param aParams is the stream address
+ * @param aConnection is handle to RConnection wrapper to use
+ * @param aSessionObs is pointer to our observer
+ * @aOwningSession is the streaming session that owns this packet source
+ * @return CCRRtspPacketSource pointer to CCRRtspPacketSource class
+ */
+ static CCRRtspPacketSource* NewL( const SCRRtspParams& aParams,
+ CCRConnection& aConnection,
+ RSocketServ& aSockServer,
+ MCRStreamObserver& aSessionObs,
+ CCRStreamingSession& aOwningSession );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CCRRtspPacketSource();
+
+public: // New functions
+
+ /**
+ * Method for aquiring the URI being streamed here
+ * @since Series 60 3.0
+ * @param none.
+ * @return URI.
+ */
+ TPtr URI();
+
+ /**
+ * Method that packet puncher calls to tell
+ * it has finished punching the firewall.
+ * @since Series 60 3.0
+ * @param aPuncher tells the number of the port
+ * where the punch packet was sent to.
+ * @return none.
+ */
+ void PunchPacketsSent( CCRPunchPacketSender* aPuncher );
+
+ /**
+ * Method for setting observer that this source will report its status to.
+ * @since Series 60 3.0
+ * @param aObserver is the observer instance implementing MCRConnectionObserver.
+ * @return none.
+ */
+ void RegisterConnectionObs( MCRConnectionObserver* aObserver );
+
+ /**
+ * Method for removing status observer
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void UnregisterConnectionObs();
+
+public: // Methods from base classes
+
+ /**
+ * From CCRPacketSourceBase.
+ * Method for acquiring sdp.
+ * @since Series 60 3.0
+ * @param aSdp is string pointer that will be .Set() to contain the sdp.
+ * If no sdp is available no .Set() will occur.
+ * @return KErrNotReady if no sdp available.
+ */
+ TInt GetSdp( TPtrC8& aSdp );
+
+ /**
+ * From CCRPacketSourceBase.
+ * Method for acquiring (almost) up-to-date sequence and ts numbers.
+ * @since Series 60 3.0
+ * @param aAudioSeq is reference to TUint that will be set by this
+ * method to contain latest available sequence number for
+ * audio stream being received via this packet source.
+ * @param aAudioTS rtp timestamp for audio.
+ * @param aVideoSeq rtp seq for video. If no video, value will not be touched.
+ * @param aVideoTS rtp ts for video.
+ * @return KErrNone if data available.
+ */
+ TInt SeqAndTS( TUint& aAudioSeq,
+ TUint& aAudioTS,
+ TUint& aVideoSeq,
+ TUint& aVideoTS );
+
+ /**
+ * From CCRPacketSourceBase.
+ * Post action after source initialized.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void PostActionL();
+
+ /**
+ * From CCRPacketSourceBase.
+ * Method for ordering "play" for packet source.
+ * @since Series 60 3.0
+ * @param aStartPos is start position in seconds.
+ * @param aEndPos is end position in seconds.
+ * @return a system wide error code.
+ */
+ TInt Play( const TReal& aStartPos,
+ const TReal& aEndPos );
+
+ /**
+ * From CCRPacketSourceBase.
+ * Method for pausing play from source.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a system wide error code.
+ */
+ TInt Pause();
+
+ /**
+ * From CCRPacketSourceBase.
+ * Method for stopping play from source.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a system wide error code.
+ */
+ TInt Stop();
+
+ /**
+ * From CCRPacketSourceBase.
+ * Method for getting range of stream. If no range/duration
+ * is available this method will set the return values to
+ * 0.0,-1.0 and that may be quite normal state live streams.
+ * @since Series 60 3.0
+ * @param aLower is where to start from. If no value available,
+ * value of aLower must be set to 0
+ * @param aUpper is where to stop. Negative values mean eternity.
+ * @return none.
+ */
+ void GetRange( TReal& aLower,
+ TReal& aUpper );
+
+ /**
+ * From CCRPacketSourceBase.
+ * Setter for current position.
+ * @since Series 60 3.0
+ * @param aPosition a postion of playback.
+ * @return a system wide error code.
+ */
+ virtual TInt SetPosition( const TInt64 aPosition ) ;
+
+ /**
+ * From MCRSockObserver.
+ * This method is called after some data has been received from socket.
+ * @since Series 60 3.0
+ * @param aSockId identifies the socket where the data came from.
+ * @param aData is descriptor containing the data received.
+ * ownership of data is not passed via this call.
+ * @return none.
+ */
+ void DataReceived( TInt aSockId,
+ const TDesC8& aData );
+
+ /**
+ * From MCRSockObserver.
+ * This method is called after status of socket changes.
+ * @since Series 60 3.0
+ * @param aSockId Identifies the socket that had the status change
+ * @param aStatus is the new status of the sock
+ * @param aError if aStatus was an error-status, this may contain error code
+ * @return none.
+ */
+ void SockStatusChange( TInt aSockId,
+ CCRSock::TCRSockStatus aStatus,
+ TInt aError );
+
+ /**
+ * From MCRRtpTcpObserver.
+ * Signals an available incoming RTSP control message
+ * @since Series 60 3.0
+ * @param aData a RTSP meaage data.
+ * @return none.
+ */
+ void RtspMsgAvailable( const TDesC8& aData );
+
+ /**
+ * From MCRRtpTcpObserver.
+ * Receives a RTP/RTCP packet available from TCP streamer and
+ * forwards to streaming sessions (buffers).
+ * @since Series 60 3.0
+ * @param aChannel specifies channel if in TCP streaming case, in practice
+ * tells if it is a video/audio packet and if it is RTP or RTCP.
+ * @param aPacket is the payload of the packet
+ * @return none.
+ */
+ void RtpTcpPacketAvailable( TInt aChannel,
+ const TDesC8& aPacket );
+
+ /**
+ * From MCRRtpTcpObserver.
+ * Receives a RTP/RTCP packet and forward to streaming server
+ * @since Series 60 3.0
+ * @param aChunk contains RTP packet with headers suitable to be sent to remote
+ * via RTSP control socket.
+ * @return none.
+ */
+ void ForwardRtpTcpChunck( const TDesC8& aChunk );
+
+ /**
+ * 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 );
+
+ /**
+ * From MCRTimerObserver.
+ * The function to be called when a timeout occurs.
+ * @since Series 60 3.0
+ * @param aTimer is pointer to timer instance that caused call to this method.
+ * @return none.
+ */
+ void TimerExpired( CCRTimer* aTimer );
+
+private: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ * @param aConnection is RConnection wrapper to use.
+ * @param aSockServer is socket server to use when opening sockets.
+ * @param aSessionObs is pointer to our observer.
+ * @param aOwningSession is pointer to session that owns this source.
+ */
+ CCRRtspPacketSource( CCRConnection& aConnection,
+ RSocketServ& aSockServer,
+ MCRStreamObserver& aSessionObs,
+ CCRStreamingSession& aOwningSession );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ * @aParams aParams contains stream address parameters that this packet source
+ * will try to use to obtain the stream.
+ * @return none
+ */
+ void ConstructL( const SCRRtspParams& aParams );
+
+private: // New methods
+
+ /**
+ * Method for connecting.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void DoConnectL();
+
+ /**
+ * Method for cleaning up.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void CleanUp();
+
+ /**
+ * Method for initiating cleanup.
+ * @since Series 60 3.0
+ * @param aSelfPtr is pointer to "this".
+ * @return none.
+ */
+ static TInt CleanUpCallback( TAny* aSelfPtr );
+
+ /**
+ * Method for asking for cleanup in async way.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void DoCleanup();
+
+ /**
+ * Method for sending RTSP command. Command in question depends on state.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void SendRtspCommandL();
+
+ /**
+ * Method for parsing and reacting to RTSP reply.
+ * @since Series 60 3.0
+ * @param aData a RTSP response data.
+ * @return none.
+ */
+ void ProcessRtspResponseL( const TDesC8& aData );
+
+ /**
+ * Method for parsing and reacting to RTSP command that
+ * remote server may send to us
+ * @since Series 60 3.0
+ * @param aData a RTSP response data.
+ * @return none.
+ */
+ void ProcessRTSPCommandL( const TDesC8& aData );
+
+ /**
+ * Method for sending error indication to client side
+ * if rtsp response was something errorneous.
+ * @since Series 60 3.0
+ * @param aErrorCode is RTSP response code,something else than 200 OK.
+ * @return none.
+ */
+ void ProcessRtspErrorResponseL( CCRRtspResponse::TResponseCode aErrorCode );
+
+ /**
+ * Method for doing SETUP.
+ * @since Series 60 3.0
+ * @param aControlAddr is either absolute or relative controladdr for stream.
+ * @param aForAudio is ETrue if control addr is for audio.
+ * @return client port number.
+ */
+ TInt SendSetupCommandL( const TDesC8& aControlAddr,
+ TBool aForAudio );
+
+ /**
+ * Method for doing PLAY.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void SendPlayCommandL();
+
+ /**
+ * Method for doing PAUSE that is sent to remote server.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void SendPauseCommandL();
+
+ /**
+ * Method for doing OPTIONS ping that is sent to remote server.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void SendOptionsCommandL();
+
+ /**
+ * Method for doing TEARDOWN.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void SendTearDownCommandL();
+
+ /**
+ * Method that sets up rtp sessions. Must be called before play is issued.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ TInt SetupRTPSessions();
+
+ /**
+ * Method that starts RTSP command response timeout.
+ * @since Series 60 3.0
+ * @param aTime a timer interval.
+ * @return none.
+ */
+ void StartRtspTimeout( TTimeIntervalMicroSeconds32 aTime );
+
+ /**
+ * Callback method from RTP session for audio.
+ * @since Series 60 3.0
+ * @param aPtr is pointer to "this".
+ * @param aEvent is the event. In practice it contains RTP packet or RTCP packet.
+ * @return none.
+ */
+ static void AudioRTPCallBack( CCRRtspPacketSource* aPtr,
+ const TRtpEvent& aEvent );
+
+ /**
+ * Callback method from RTP session for video.
+ * @since Series 60 3.0
+ * @param aPtr is pointer to "this".
+ * @param aEvent is the event. In practice it contains RTP packet or RTCP packet.
+ * @return none.
+ */
+ static void VideoRTPCallBack( CCRRtspPacketSource* aPtr,
+ const TRtpEvent& aEvent );
+
+ /**
+ * Callback for RTSP timeout. Just ask session to start cleanup.
+ * @since Series 60 3.0
+ * @param aPtr is pointer to "this".
+ * @return none.
+ */
+ static TInt RtspTimeoutCallback( TAny* aPtr );
+
+ /**
+ * Method for creating sender report header.
+ * @param aPtr is pointer to "this".
+ * @param aEvent is the rtp packet event received.
+ * @param aStreamId a stream id.
+ * @return none
+ */
+ static void SenderReport( CCRRtspPacketSource* aPtr,
+ const TRtpEvent& aEvent,
+ MCRPacketSource::TCRPacketStreamId aStreamId );
+
+ /**
+ * Method for handling audio.
+ * @param aPtr is pointer to "this".
+ * @param aSource a receiver source.
+ * @param aEvent is the rtp packet event received.
+ * @return none
+ */
+ static void HandleNewSourceL( CCRRtspPacketSource* aPtr,
+ RRtpReceiveSource& aSource,
+ const TRtpEvent& aEvent,
+ TRtpCallbackFunction aCallback );
+
+ /**
+ * Generate DESCRIBE message with authentication information.
+ * used when server responses with 401 or 407.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void SendAuthDescribeL();
+
+ /**
+ * Adds authentication info to given command.
+ * @since Series 60 3.0
+ * @param aCommand the command where to add authentication info.
+ * @return none.
+ */
+ void AddAuthenticationL( TInt aCommand );
+
+ /**
+ * Setup sessions for RTP stack and issue play command
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void SetupSessionsAndPlay();
+
+ /**
+ * Initiates sending of punch packets
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void SendPunchPacketsL();
+
+ /**
+ * Creates a socket in iRTPSockArr for multicast streaming:
+ * binds to local port and join multicast group
+ *
+ * @since Series 60 3.0
+ * @param aSockId id for RTP socket in iRTPSockArr
+ * @param aGroupAddr multicast group address, in IPv6 or mapped IPv4
+ * @param aPort local UDP port to listen
+ * @return system error code
+ */
+ TInt CreateMulticastSocket( TCRRTPSockId aSockId,
+ const TInetAddr& aGroupAddr,
+ TInt aPort );
+
+ /**
+ * Creates a socket in iRTPSockArr for unicast streaming:
+ * binds to local port and connects to remote address
+ *
+ * @since Series 60 3.0
+ * @param aSockId id for RTP socket in iRTPSockArr
+ * @param aLocalAddr local address and port to listen
+ * @param aRemoteAddr remote address and port to connect to
+ * @return system error code
+ */
+ TInt CreateUnicastSocket( TCRRTPSockId aSockId,
+ const TInetAddr& aLocalAddr,
+ const TInetAddr& aRemoteAddr );
+
+ /**
+ * Method that handles rtp payload packet to buffer.
+ * @since Series 60 3.0
+ * @param aEvent is the rtp packet event received.
+ * @param aIsAudio indicates whether this is audio or video packet.
+ * @return none.
+ */
+ void RTPPayloadProcessor ( const TRtpEvent& aEvent,
+ const TBool aIsAudio );
+
+ /**
+ * Method for setting session parameters.
+ * @since Series 60 3.0
+ * @param aSession is reference to either audio or video rtp session.
+ * from instance variables of this class ; the parameters will
+ * be set in similar way for both audio and video
+ * @param aGranularity is number of clock ticks per second, usually found from SDP
+ * @return none.
+ */
+ void SetRtpSession( RRtpSession& aSession ,
+ TReal aGranularity );
+
+ /**
+ * Method for initiating cleanup.
+ * @since Series 60 3.0
+ * @param aSelfPtr is pointer to "this".
+ * @return symbian error code.
+ */
+ static TInt SendRtspPing( TAny* aSelfPtr );
+
+ /**
+ * Method for synchronizing of timestamps and notifying sinks.
+ * This should be called after sender reports are received
+ * and with normal packet reception in the beginning of the stream.
+ * In practice this will be called for about every packet while
+ * iNoRtpInfoHeader is on, when we know the seq+ts then
+ * iNoRtpInfoHeader will be turned off and this method will be no longer
+ * used ; detection of no rtp info header in rtsp play reply will turn
+ * iNoRtpInfoHeader on.
+ *
+ * @param aStreamId identifies the stream
+ * @param aMSWTimestamp more significant part of wall-clock. Seconds.
+ * @param aLSWTimestamp less significant part of wall-clock. Fraction of seconds.
+ * @param aRTPTimestamp rtptimestamp of aMSW+aLSWTimestamp
+ * @param aSeq sequence number of aRTPTimestamp
+ */
+ void ConstructSeqAndTsForSink ( MCRPacketSource::TCRPacketStreamId aStreamId,
+ TUint32 aMSWTimestamp,
+ TUint32 aLSWTimestamp,
+ TUint32 aRTPTimestamp,
+ TUint aSeq );
+
+ /**
+ * Method for setting up multicast or tcp streaming from setup reply.
+ * @param none
+ * @return none
+ */
+ void ConditionallySetupMultiCastOrTcpStreamingL();
+
+ /**
+ * Method checks that we all receiveing from all streams, if not returns false.
+ * @param none
+ * @return ETrue if receiving from all streams.
+ */
+ TBool CheckReceiveOfStreams();
+
+ /**
+ * Method that flags given stream as receiving stream.
+ * @param aStreamType stream that is receiving
+ * @return none
+ */
+ void StreamFound( TCRPacketStreamId aStreamType );
+
+ /**
+ * Method that resets all created receive streams as non receiving.
+ * @param none
+ * @return none
+ */
+ void ResetStreamFlags();
+
+#if defined ( LIVE_TV_FILE_TRACE ) || defined ( LIVE_TV_RDEBUG_TRACE )
+ /**
+ * Method for showing a packet header.
+ * @since Series 60 3.0
+ * @param aRtcpHeader a pointer to packet header.
+ * @param aEvent is the rtp packet event received.
+ * @return none.
+ */
+ static void ShowHeader( const TDesC8& aRtcpHeader,
+ const TCRRtpSRReportHeader& aSrReport );
+#endif // LIVE_TV_FILE_TRACE || LIVE_TV_RDEBUG_TRACE
+
+private: // Data
+
+ /**
+ * rtsp URL we're supposed to view.
+ */
+ HBufC* iRtspUri;
+
+ /**
+ * Hostname -part of iRTSPURI.
+ */
+ TPtrC iRtspUriHost;
+ /**
+ * rtsp URL in 8bit descriptor, only because there is no uri parser in 8 bit.
+ */
+ HBufC8* iRtspUri8;
+ /**
+ * possible username, if server requires.
+ */
+ HBufC* iUserName;
+
+ /**
+ * possible password, if server requires.
+ */
+ HBufC* iPassword;
+
+ /**
+ * Sequence number from rtp info header concerning audio.
+ */
+ TUint iSeqFromRtpInfoForAudio;
+
+ /**
+ * Sequence number from rtp info header concerning video.
+ */
+ TUint iSeqFromRtpInfoForVideo;
+
+ /**
+ * RTP Session for audio.
+ */
+ RRtpSession iAudioSession;
+
+ /**
+ * RTP Session for video.
+ */
+ RRtpSession iVideoSession;
+
+ /**
+ * Receive stream for audio.
+ */
+ RRtpReceiveSource iRtpRecvSrcAudio;
+
+ /**
+ * Receive stream for audio.
+ */
+ RRtpReceiveSource iRtpRecvSrcVideo;
+
+ /*
+ * Socket server reference ; all sockets we use must be via common sock serv.
+ */
+ RSocketServ& iSockServer;
+
+ /*
+ * RConnection wrapper reference ; all sockets we use must share an RConnection.
+ */
+ CCRConnection& iConnection;
+
+ /*
+ * Socket to use to talk RTSP to remote server.
+ */
+ CCRSock* iRtspSock;
+
+ /**
+ * Sockets for incoming multicast RTP data, to bypass RTP stack limitations.
+ */
+ CCRSock* iRTPSockArr[ERTPMaxSockets];
+
+ /**
+ * pointer to data sent by us via socket.
+ */
+ HBufC8* iSentData;
+
+ /**
+ * State of this rtsp client, or stage in discussion.
+ */
+ TCRRTSPStage iStage;
+
+ /**
+ * Pointers to previous commands sent in various stages.
+ */
+ CCRRtspCommand* iPrevCommands[ERTSPLastStage];
+
+ /**
+ * Pointers to responses of various commands.
+ */
+ CCRRtspResponse* iResponses[ERTSPLastStage];
+
+ /**
+ * CSeq for rtsp negotiation.
+ */
+ TInt iCSeq;
+
+ /**
+ * SDP parser.
+ */
+ CDvrSdpParser* iSdpParser;
+
+ /**
+ * Client portbase. Value used for video, for audio it is this value + 2.
+ */
+ TInt iClientPort;
+
+ /**
+ * Transport method for RTP.
+ */
+ TCRRTPTransport iTransport;
+
+ /**
+ * Timer for UDP reception timeout, to fire TCP usage.
+ */
+ CCRTimer* iUdpReceptionTimer;
+
+ /**
+ * IP packet parser.
+ */
+ CCRRtpTcpStreamer* iRtpTcpStreamer;
+
+ /**
+ * Session id from server.
+ */
+ TPtrC8 iSessionId;
+
+ /**
+ * If sink is ready.
+ */
+ TBool iReadyToPlay;
+
+ /**
+ * RTP time initial value for audio.
+ */
+ TUint32 iRTPTimeStampAudio;
+
+ /**
+ * RTP time initial value for video.
+ */
+ TUint32 iRTPTimeStampVideo;
+
+ /**
+ * If authentication is needed.
+ */
+ TBool iAuthenticationNeeded;
+
+ /**
+ * Nonce of the authentication header.
+ */
+ HBufC8* iNonce;
+
+ /**
+ * Realm of the authentication header.
+ */
+ HBufC8* iRealm;
+
+ /**
+ * Authentication type ("Basic" or "Digest").
+ */
+ HBufC8* iAuthType;
+
+ /**
+ * Opaque of the authentication header.
+ */
+ HBufC8* iOpaque;
+
+ /**
+ * User Agent header if present.
+ */
+ HBufC8* iUserAgent;
+
+ /**
+ * Connection bandwidth in bit/s for 'Bandwidth' header.
+ */
+ TInt iBandwidth;
+
+ /**
+ * x-wap-profile if present.
+ */
+ HBufC8* iWapProfile;
+
+ /**
+ * Number of times authentication has failed.
+ */
+ TInt iAuthFailedCount;
+
+ /**
+ * Our observer.
+ */
+ MCRStreamObserver& iSessionObs;
+
+ /**
+ * Number of bytes sent in audio rtp packets.
+ */
+ TUint32 iAudioBytes;
+
+ /**
+ * Number os audio rtp packets sent.
+ */
+ TUint32 iAudioPackets;
+
+ /**
+ * Number of bytes sent in video rtp packets.
+ */
+ TUint32 iVideoBytes;
+
+ /**
+ * Number of video packets sent.
+ */
+ TUint32 iVideoPackets;
+
+ /**
+ * Instance for punch packet sender ; lifetime will be from setup stage
+ * to delivery of first audio packet.
+ */
+ CCRPunchPacketSender* iPunchPacketSenderAudio;
+
+ /**
+ * Instance for punch packet sender ; lifetime will be from setup stage
+ * to delivery of first video packet.
+ */
+ CCRPunchPacketSender* iPunchPacketSenderVideo;
+
+ /**
+ * Flag for successful sending of punch packets for audio stream.
+ */
+ TBool iPunchPacketSentForAudio;
+
+ /**
+ * Flag for successful sending of punch packets for video stream.
+ */
+ TBool iPunchPacketSentForVideo;
+
+ /**
+ * Connection status observer.
+ */
+ MCRConnectionObserver* iObserver;
+
+ /**
+ * Position where playback will start. Usually will have value 0 but will
+ * be changed if user seeks the clip.
+ */
+ TReal iStartPos;
+
+ /**
+ * Position where playback is supposed to end. Most streaming servers won't
+ * obey this at all but rtsp gives possibility to specify end position so
+ * we'll support that anyway.
+ */
+ TReal iEndPos;
+
+ /**
+ * Sends RTSP ping.
+ */
+ CPeriodic* iRtspPingTimer;
+
+ /**
+ * Timer started when RTSP message is sent and cancelled when reply is received.
+ * If this timer fires, it means that we didn't get reply in time that in turn
+ * forces cleanup of this source.
+ */
+ CPeriodic* iRtspTimeout;
+
+ /**
+ * Sequence number of last rtsp reply received.
+ */
+ TInt iLastReceivedSeq;
+
+ /**
+ * We have a play-command pending, not yet sent.
+ */
+ TInt iPostPonedPlay;
+
+ /**
+ * Proxy server addr to use while streaming.
+ */
+ TName iProxyServerAddr;
+
+ /**
+ * Proxy server port to use while streaming.
+ */
+ TInt iProxyServerPort;
+
+ /**
+ * Flag telling that there has been no rtp-info header.
+ * in play-response
+ */
+ TBool iNoRtpInfoHeader;
+
+ /**
+ * Wall-clock timestamp MSW part for syncronizing.
+ */
+ TUint32 iMSWTimestamp;
+
+ /**
+ * Wall-clock timestamp LSW part for syncronizing.
+ */
+ TUint32 iLSWTimestamp;
+
+ /**
+ * Flag set when we manage to get UDP traffic. If we some reason loose
+ * traffic completely (eg staying too long in PAUSE -state while streaming)
+ * we dont try TCP at first but after we have tried UDP again.
+ */
+ TBool iUdpFound;
+
+ /**
+ * Simple container class representing one receive stream.
+ */
+ class TReceiveStream
+ {
+ public:
+
+ /**
+ * Default constructor setting default values.
+ */
+ TReceiveStream()
+ {
+ iStreamType = EStreamIdCount;
+ iDataReceived = EFalse;
+ };
+
+ /**
+ * Stream type, defined in MCRPacketSource.
+ */
+ TCRPacketStreamId iStreamType;
+
+ /**
+ * Boolean flagging if we have traffic from this stream.
+ */
+ TBool iDataReceived;
+ };
+
+ /**
+ * Array of receive streams.
+ */
+ RArray<TReceiveStream> iReceiveStreams;
+
+ /**
+ * Boolean flagging if we have found traffic from all receive streams.
+ */
+ TBool iTrafficFound;
+
+ };
+
+#endif // CCRRTSPPACKETSOURCE_H
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRRTSPResponse.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,261 @@
+/*
+* Copyright (c) 2009 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: Class for parsing and producing a response string of RTSP as rfc2326*
+*/
+
+
+
+
+#ifndef CCRRTSPRESPONSE_H
+#define CCRRTSPRESPONSE_H
+
+// INCLUDES
+#include "CRRtspCommon.h"
+#include <e32base.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+
+/**
+* Class for parsing and producing RTSP responses.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRRtspResponse : public CCRRtspCommon
+ {
+
+public: // Data types
+
+ /**
+ * RTSP response code. From RFC 2326
+ */
+ enum TResponseCode
+ {
+ ERTSPRespContinue = 100,
+ ERTSPRespOK = 200, /**< OK code, everything ok */
+ ERTSPRespCreated = 201, /**< Same as 200 */
+ ERTSPRespLowOnStorageSpace = 250,
+ ERTSPRespMultipleChoices = 300,
+ ERTSPRespMovedPermanently = 301,
+ ERTSPRespMovedTemporarily = 302,
+ ERTSPRespSeeOther = 303,
+ ERTSPRespNotModified = 304,
+ ERTSPRespUseProxy = 305,
+ ERTSPRespBadRequest = 400,
+ ERTSPRespUnauthorized = 401 , /**< We must re-issue command with authentication headers */
+ ERTSPRespPaymentRequired = 402,
+ ERTSPRespForbidden = 403,
+ ERTSPRespNotFound = 404,
+ ERTSPRespMethodNotAllowed = 405,
+ ERTSPRespNotAcceptable = 406,
+ ERTSPRespProxyAuthenticationRequired = 407 , /**< We must re-issue command with authentication headers */
+ ERTSPRespRequestTimeOut = 408,
+ ERTSPRespGone = 410,
+ ERTSPRespLengthRequired = 411,
+ ERTSPRespPreconditionFailed = 412,
+ ERTSPRespRequestEntityTooLarge = 413,
+ ERTSPRespRequestURITooLarge = 414,
+ ERTSPRespUnsupportedMediaType = 415,
+ ERTSPRespParameterNotUnderstood = 451,
+ ERTSPRespConferenceNotFound = 452,
+ ERTSPRespNotEnoughBandwidth = 453,
+ ERTSPRespSessionNotFound = 454,
+ ERTSPRespMethodNotValidInThisState = 455,
+ ERTSPRespHeaderFieldNotValidForResource = 456,
+ ERTSPRespInvalidRange = 457,
+ ERTSPRespParameterIsReadOnly = 458,
+ ERTSPRespAggregateOperationNotAllowed = 459,
+ ERTSPRespOnlyAggregateOperationAllowed = 460,
+ ERTSPRespUnsupportedTransport = 461,
+ ERTSPRespDestinationUnreachable = 462,
+ ERTSPRespInternalServerError = 500,
+ ERTSPRespNotImplemented = 501,
+ ERTSPRespBadGateway = 502,
+ ERTSPRespServiceUnavailable = 503,
+ ERTSPRespGatewayTimeOut = 504,
+ ERTSPRespRTSPVersionNotSupported = 505,
+ ERTSPRespOptionNotSupported = 551
+ };
+
+ /**
+ * Structure for storing rtp-info header contents.
+ * if len of iFirstURL is zero, then the header has
+ * not been seen or parsed. Normally rtp-info-header
+ * has 2 urls and seq+ts for both.
+ */
+ struct SRTPInfoHeader
+ {
+ TPtrC8 iFirstURL ; /**< URL string of first url found from header */
+ TUint iFirstSeq ; /**< Seq of first URL */
+ TUint iFirstTS ; /**< TS of first URL */
+ TPtrC8 iSecondURL ;/**< URL string of second url found from header */
+ TUint iSecondSeq ; /**< Seq of second URL */
+ TUint iSecondTS ; /**< TS of second URL */
+ };
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @return CCRRtspResponse pointer to CCRRtspResponse class
+ */
+ static CCRRtspResponse* NewL();
+
+ /**
+ * Destructor.
+ */
+ virtual ~CCRRtspResponse();
+
+public: // New functions
+
+ /**
+ * Method that is used to give rtsp response to this class.
+ * Response is something alike "RTSP/1.0 200 OK\rCSeq: 200000\r..."
+ * @since Series 60 3.0
+ * @param aString is the response string.
+ * @return none. May leave with symbian error codes. At least following may be
+ * seen: KErrUnderflow if there is \r\n\r\n sequence in the string
+ * marking end of response or if there is content (like SDP) and the
+ * content lenght is too short; KErrNotSupported if it doesn't look
+ * like RTSP at all.
+ */
+ virtual void TryParseL( const TDesC8 &aString );
+
+ /**
+ * Method for acquiring the response code from command string that was successfully
+ * parsed. If TryParseL did leave, this may return anything.
+ * @since Series 60 3.0
+ * @param none.
+ * @return response code, like ERTSPRespOK if it was 200 OK.
+ */
+ CCRRtspResponse::TResponseCode StatusCode( void );
+
+ /**
+ * Method for getting server port.
+ * @since Series 60 3.0
+ * @param none.
+ * @return server port of KErrNotFound if none found.
+ */
+ TInt ServerPort( void );
+
+ /**
+ * Method for getting SSRC.
+ * @since Series 60 3.0
+ * @param aSSRC is string descriptor allocated by caller that
+ * will have its content set to block allocated by instance
+ * of this class containing the SSRC.
+ * @return KErrNone if no error, KErrNotFound if SSRC is not there.
+ */
+ TInt SSRC( TPtrC8& aSSRC );
+
+
+ /**
+ * Method for getting RTP-Info header.
+ * @since Series 60 3.0
+ * @param aRTPInfoHeader is header struct allocated by caller that
+ * will have its content set to strings (and numbers) allocated
+ * by instance of this class so once instance of this class
+ * is deleted, it is not wise to try referring to those
+ * values any more.
+ * @return KErrNone if no error,
+ KErrNotFound if rtp-info header is not there.
+ */
+ TInt RTPInfoHeader( CCRRtspResponse::SRTPInfoHeader &aRTPInfoHeader );
+
+protected: // New Methods
+
+ /**
+ * Method for digging out server ports from (setup) reply
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void FindServerPorts( void );
+
+ /**
+ * Method for digging out SSRC from (setup) reply
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void FindSSRC( void );
+
+ /**
+ * Method for digging out and partially parsing RTP-Info -header
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void FindRTPInfoHeader( void );
+
+ /**
+ * Method for digging out and partially parsing RTP-authentication -header
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void FindRTPAuthenticationL( void );
+
+private: // Constructors and destructors
+
+ /**
+ * default constructor
+ */
+ CCRRtspResponse( void );
+
+ /**
+ * 2nd phase constructor
+ */
+ void ConstructL();
+
+private: // Data types
+
+ /**
+ * Code how the command went.
+ */
+ TResponseCode iStatusCode;
+
+ /**
+ * Possible server port.
+ */
+ TInt iServerPort;
+
+ /**
+ * Possible synchronization source id.
+ */
+ TPtrC8 iSSRC;
+
+ /**
+ * Possible contents of rtp info header.
+ */
+ SRTPInfoHeader iRTPInfoHeader;
+
+ };
+
+#endif // CCRRTSPRESPONSE_H
+
+// End of file
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRRtpFileSource.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,268 @@
+/*
+* 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: Class that reads RTP packets from propriatary file format.*
+*/
+
+
+
+
+#ifndef CCRRTPFILESOURCE_H
+#define CCRRTPFILESOURCE_H
+
+// INCLUDES
+#include "CCRPacketSourceBase.h"
+#include <ipvideo/MRtpFileReadObserver.h>
+#include <ipvideo/MRtpFileWriteObserver.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CRtpClipHandler;
+
+// CLASS DECLARATION
+
+/**
+* Class that negotiaties RTP stream using RTSP.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRRtpFileSource : public CCRPacketSourceBase,
+ public MRtpFileReadObserver
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @return CCRRtpFileSource pointer to CCRRtpFileSource class
+ */
+ static CCRRtpFileSource* NewL( const SCRRtpPlayParams& aParams,
+ CRtpClipHandler*& aClipHandler,
+ MCRStreamObserver& aSessionObs,
+ CCRStreamingSession& aOwningSession );
+
+ /**
+ * Two-phased constructor.
+ * @return CCRRtpFileSource pointer to CCRRtpFileSource class
+ */
+ static CCRRtpFileSource* NewL( const RFile& aRtpHandle,
+ CRtpClipHandler*& aClipHandler,
+ MCRStreamObserver& aSessionObs,
+ CCRStreamingSession& aOwningSession );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CCRRtpFileSource();
+
+public: // New functions
+
+ /**
+ *
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ //void PunchPacketsSent();
+
+private: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ * @param aSessionObs a session observer.
+ * @param aOwningSession a owning session.
+ */
+ CCRRtpFileSource( CRtpClipHandler*& aClipHandler,
+ MCRStreamObserver& aSessionObs,
+ CCRStreamingSession& aOwningSession );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL( const SCRRtpPlayParams& aParams );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL( const RFile& aRtpHandle );
+
+private: // Methods from base classes
+
+ /**
+ * From CCRPacketSourceBase.
+ * Method for acquiring sdp.
+ * @since Series 60 3.0
+ * @param aSdp is string pointer that will be .Set() to contain the sdp.
+ * If no sdp is available no .Set() will occur.
+ * @return KErrNotReady if no sdp available.
+ */
+ TInt GetSdp( TPtrC8& aSdp );
+
+ /**
+ * From CCRPacketSourceBase.
+ * Method for setting buffers to packet source
+ * @since Series 60 3.0
+ * @param aBuffer is buffer to be set.
+ * @return none.
+ */
+ void SetBuffer( CCRPacketBuffer* aBuffer );
+
+ /**
+ * From CCRPacketSourceBase.
+ * Post action after source initialized.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void PostActionL();
+
+ /**
+ * From CCRPacketSourceBase.
+ * Method for requesting more packets to buffer.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void Restore();
+
+ /**
+ * From CCRPacketSourceBase.
+ * Method for ordering "play" for packet source.
+ * @since Series 60 3.0
+ * @param aStartPos is start position in seconds.
+ * @param aEndPos is end position in seconds.
+ * @return a system wide error code.
+ */
+ TInt Play( const TReal& aStartPos,
+ const TReal& aEndPos );
+
+ /**
+ * From CCRPacketSourceBase.
+ * Method for stopping play from source.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a system wide error code.
+ */
+ TInt Stop();
+
+ /**
+ * From CCRPacketSourceBase.
+ * Setter for current position.
+ * @since Series 60 3.0
+ * @param aPosition a postion of playback.
+ * @return a system wide error code.
+ */
+ TInt SetPosition( const TInt64 aPosition );
+
+ /**
+ * From CCRPacketSourceBase.
+ * Getter for current position.
+ * @since Series 60 3.0
+ * @param aPosition a postion of playback.
+ * @param aDuration a duration of playback.
+ * @return a system wide error code.
+ */
+ TInt GetPosition( TInt64& aPosition,
+ TInt64& aDuration );
+
+ /**
+ * From MRtpFileReadObserver.
+ * Called when RTP packets group readed from a file.
+ * @since Series 60 3.0
+ * @param aGroup a RTP data readed from a file.
+ * @param aGroupTime a group time in milli seconds.
+ * @param aLastGroup a indication of last group in clip.
+ * @return none.
+ */
+ void GroupReadedL( const TDesC8& aGroup,
+ const TUint aGroupTime,
+ const TBool aLastGroup );
+
+ /**
+ * From MRtpFileReadObserver.
+ * File handler status of playback.
+ * @since Series 60 3.0
+ * @param aStatus a status of file reading.
+ * @return none.
+ */
+ void ReadStatus( TInt aStatus );
+
+private: // New methods
+
+ /**
+ * Method for requesting more packets to buffer.
+ * @since Series 60 3.0
+ * @param aForce if true, forces read packets even buffer more than threshold.
+ * @return a system wide error code.
+ */
+ TInt NextClipGroup( const TBool aForce );
+
+ /**
+ * Setter for current position of .rtp clip.
+ * @since Series 60 3.0
+ * @param aPosition a postion of playback.
+ * @return a system wide error code.
+ */
+ TInt RtpPosition( const TUint aPosition );
+
+ /**
+ * Converts old RTP propriatary format packet type to stream id.
+ * @since Series 60 3.0
+ * @param aType a packet type from a clip.
+ * @param aStream a stream id to update.
+ * @return true if packet valid, otherwise false.
+ */
+ TBool TypeToStream( const MRtpFileWriteObserver::TRtpType& aType,
+ MCRPacketSource::TCRPacketStreamId& aStream );
+
+private: // Data
+
+ /**
+ * Clip handler for RTP clip.
+ */
+ CRtpClipHandler*& iClipHandler;
+
+ /**
+ * Session observer.
+ */
+ MCRStreamObserver& iSessionObs;
+
+ /**
+ * SDP data.
+ */
+ HBufC8* iSdp;
+
+ /**
+ * Time of initialy readed group.
+ */
+ TUint iInitialTime;
+
+ /**
+ * Pause packet sent to sink from a clip.
+ */
+ TInt iClipPauseSent;
+
+ };
+
+#endif // CCRRTPFILESOURCE_H
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRRtpRecordSink.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,326 @@
+/*
+* 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: Packet sink where no-one gets the streaming*
+*/
+
+
+
+#ifndef CCRRTPRECORDSINK_H
+#define CCRRTPRECORDSINK_H
+
+// INCLUDES
+#include "CCRPacketSinkBase.h"
+#include <ipvideo/MRtpFileWriteObserver.h>
+#include "MCRTimerObserver.h"
+#include <CXPSPktSinkObserver.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CCRPacketBuffer;
+class CCRStreamingSession;
+class MCRConnectionObserver;
+class CRtpClipHandler;
+class CRtpTsConverter;
+
+// CLASS DECLARATION
+
+/**
+* Packet sink that does not forward packets. Good for testing.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRRtpRecordSink : public CCRPacketSinkBase,
+ public MRtpFileWriteObserver
+ {
+
+public: // Constructors and destructors
+
+ /**
+ * Two-phased constructor.
+ * @param aRecordParams a recording parameters.
+ * @param aSinkId that this class needs to use when reporting progress back to owner.
+ * @param aOwningSession is the streaming session that owns this instance.
+ * @param aObserver a pointer to connection observer.
+ * @param aClipHandler a reference pointer to .rtp clip handler.
+ * @return CCRRtpRecordSink pointer.
+ */
+ static CCRRtpRecordSink* NewL( const SCRRecordParams& aRecordParams,
+ CCRStreamingSession::TCRSinkId aSinkId,
+ CCRStreamingSession& aOwningSession,
+ MCRConnectionObserver* aObserver,
+ CRtpClipHandler*& aClipHandler );
+
+ /**
+ * Destructor
+ */
+ virtual ~CCRRtpRecordSink();
+
+protected: // Constructors and destructors
+
+ /**
+ * By default default constructor is private
+ * @param aSinkId that this class needs to use when reporting progress back to owner.
+ * @param aObserver a pointer to connection observer.
+ * @param aClipHandler a reference pointer to .rtp clip handler.
+ * @param aOwningSession is the streaming session that owns this instance.
+ */
+ CCRRtpRecordSink( CCRStreamingSession::TCRSinkId aSinkId,
+ CCRStreamingSession& aOwningSession,
+ MCRConnectionObserver* aObserver,
+ CRtpClipHandler*& aClipHandler );
+
+ /**
+ * Second phase of 2-phased construction
+ * @param aRecordParams a recording parameters.
+ */
+ void ConstructL( const SCRRecordParams& aRecordParams );
+
+private: // Methods from base classes
+
+ /**
+ * From CCRPacketSinkBase.
+ * Method for setting the sdp in use.
+ * @since Series 60 3.0
+ * @param aSdp is the new sdp.
+ * @return none.
+ */
+ void SetSdpL( const TDesC8& aSdp );
+
+ /**
+ * From CCRPacketSinkBase.
+ * Adds packet to the sink.
+ * @since Series 60 3.0
+ * @return none.
+ */
+ void NewPacketAvailable();
+
+ /**
+ * From CCRPacketSinkBase.
+ * Buffer reset info for the sink.
+ * @since Series 60 3.0
+ * @return none.
+ */
+ void BufferResetDone();
+
+ /**
+ * From CCRPacketSinkBase.
+ * Method for pause action for sink.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a system wide error code.
+ */
+ TInt Pause();
+
+ /**
+ * From CCRPacketSinkBase.
+ * Method for restore action for sink.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a system wide error code.
+ */
+ TInt Restore();
+
+ /**
+ * From CCRPacketSinkBase.
+ * Method for stopping action for sink.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void Stop();
+
+ /**
+ * From MRtpFileWriteObserver.
+ * Group saved indication.
+ * @since Series 60 3.0
+ * @return none.
+ */
+ void GroupSaved();
+
+ /**
+ * From MRtpFileWriteObserver.
+ * Clip handler status of recording.
+ * @since Series 60 3.0
+ * @param aStatus a status of file writing.
+ * @return none.
+ */
+ void WriteStatus( const TInt aStatus );
+
+private: // New methods
+
+ /**
+ * Adds RTP packet(s) to a group.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void AddToGroup();
+
+ /**
+ * Adds one RTP packet to a group.
+ * @since Series 60 3.0
+ * @param aPacket a packet data.
+ * @param aType a packet type.
+ * @return none.
+ */
+ void AddPacketToGroupL( const TDesC8& aPacket,
+ const MRtpFileWriteObserver::TRtpType& aType );
+
+ /**
+ * Saves one RTP packet group to a clip.
+ * @since Series 60 3.0
+ * @param aAction a saving action.
+ * @return none.
+ */
+ void SaveGroup( MRtpFileWriteObserver::TRtpSaveAction aAction );
+
+ /**
+ * Saves one RTP packet group to a clip.
+ * @since Series 60 3.0
+ * @param aAction a saving action.
+ * @return none.
+ */
+ void SaveGroupL( MRtpFileWriteObserver::TRtpSaveAction aAction );
+
+ /**
+ * Converts stream id to old RTP propriatary format packet type.
+ * @since Series 60 3.0
+ * @param aType a packet type from a clip.
+ * @param aStream a stream id to update.
+ * @return true if packet valid, otherwise false.
+ */
+ TBool StreamToType( const MCRPacketSource::TCRPacketStreamId& aStream,
+ MRtpFileWriteObserver::TRtpType& aType );
+
+ /**
+ * Handles TS delta calculation from audio packets.
+ * @since Series 60 3.0
+ * @param aPacket a packet data.
+ * @return a TS of packet.
+ */
+ TUint TsFromPacketL( const TDesC8& aPacket );
+
+ /**
+ * Wrapper for AddPausePacketL().
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void AddPausePacket();
+
+ /**
+ * Adds pause packet to group buffer.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void AddPausePacketL();
+
+ /**
+ * Resets packets group variables.
+ * @since Series 60 3.0
+ * @param aStatus a reason for recording end.
+ * @return none.
+ */
+ void ForceStopRecording( const TInt& aStatus );
+
+ /**
+ * Resets packets group variables.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void ResetGroupVariables();
+
+private: // Data
+
+ /**
+ * Packets group buffer.
+ */
+ HBufC8* iGroupBuffer;
+
+ /**
+ * Connection status observer.
+ */
+ MCRConnectionObserver* iObserver;
+
+ /**
+ * Clip handler for RTP clip.
+ */
+ CRtpClipHandler*& iClipHandler;
+
+ /**
+ * Packets group pointer.
+ */
+ TPtr8 iGroupPointer;
+
+ /**
+ * Current group size in bytes.
+ */
+ TInt iGroupSize;
+
+ /**
+ * Current group packets count.
+ */
+ TInt iPacketsCount;
+
+ /**
+ * Wanted group size.
+ */
+ TInt iWantedGroup;
+
+ /**
+ * TS converter for audio.
+ */
+ CRtpTsConverter* iAudioConv;
+
+ /**
+ * Time stamp of oldest audio packet.
+ */
+ TUint iOldestTs;
+
+ /**
+ * Latest audio packet.
+ */
+ TPtrC8 iLatestAudio;
+
+ /**
+ * Record mode, can be either normal of time shift.
+ */
+ MRtpFileWriteObserver:: TRtpSaveAction iSaveMode;
+
+ /**
+ * Next packet(s) mode, can be: normal, pause, end.
+ */
+ MRtpFileWriteObserver:: TRtpSaveAction iGroupMode;
+
+ /**
+ * Recording parameters.
+ */
+ MRtpFileWriteObserver::SRtpRecParams iRecParams;
+
+ };
+
+#endif // CCRRTPRECORDSINK_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRRtpTcpObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,84 @@
+/*
+* 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: Observer for RTP/TCP streamer.*
+*/
+
+
+
+
+#ifndef CCRRTPTCPOBSERVER_H
+#define CCRRTPTCPOBSERVER_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+
+/**
+* Observer for RTP/TCP streamer
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class MCRRtpTcpObserver
+ {
+
+public: // New methods
+
+ /**
+ * Signals an available incoming RTSP control message
+ * @since Series 60 3.0
+ * @param aData a RTSP meaage data.
+ * @return none.
+ */
+ virtual void RtspMsgAvailable( const TDesC8& aData ) = 0;
+
+ /**
+ * Signals an available incoming RTP/RTCP packet from RTSP/TCP streaming
+ * @since Series 60 3.0
+ * @param aChannel channel through which packet was received.
+ * Actual interpretation and mapping to media stream (audio, video)
+ * done by user.
+ * @param aPacket a RTP/RTCP packet received.
+ * @return none.
+ */
+ virtual void RtpTcpPacketAvailable( TInt aChannel,
+ const TDesC8& aPacket ) = 0;
+
+ /**
+ * Signals an outgoing RTP/RTCP packet to be sent over RTSP/TCP
+ * @since Series 60 3.0
+ * @param aChannel a channel through which packet was received.
+ * Actual interpretation and mapping to media stream (audio, video)
+ * done by user.
+ * @param aPacket RTP/RTCP packet received
+ * @return none.
+ */
+ virtual void ForwardRtpTcpChunck( const TDesC8& aChunk ) = 0;
+
+ };
+
+#endif // CCRRTPTCPOBSERVER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRRtpTcpStream.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,89 @@
+/*
+* 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: Abstraction for a media stream for RTP/TCP streamer*
+*/
+
+
+
+
+#ifndef CCRRTPTCPSTREAM_H
+#define CCRRTPTCPSTREAM_H
+
+// INCLUDE FILES
+#include <e32base.h>
+
+// FORWARD DECLARATIONS
+class MCRRtpTcpObserver;
+
+/**
+* RTP media stream for RTP/TCP streamer
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRRtpTcpStream : public CBase
+ {
+
+public: // Constructors and destructors
+
+ /**
+ * Two-phased constructor
+ * @param aObserver
+ */
+ static CCRRtpTcpStream* NewL( MCRRtpTcpObserver& aObserver );
+
+ /**
+ * Destructor
+ */
+ virtual ~CCRRtpTcpStream();
+
+public: // New methods
+
+ /**
+ * Handles incoming RTP or RTCP packet
+ * @since Series 60 3.0
+ * @param aChannel Interleaved channel.
+ * @return none.
+ */
+ void PacketAvailable( TInt aChannel );
+
+private: // Constructors and destructors
+
+ /**
+ * C++ default constructor
+ */
+ CCRRtpTcpStream( MCRRtpTcpObserver& aObserver );
+
+ /**
+ * Second phase constructor
+ */
+ void ConstructL();
+
+private: // Data
+
+ /**
+ * Observer for streaming session.
+ */
+ MCRRtpTcpObserver& iObserver;
+
+ /**
+ * SSRC for this media stream.
+ */
+ TUint32 iSSRC;
+
+ };
+
+#endif // CCRRTPTCPSTREAM_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRRtpTcpStreamer.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,164 @@
+/*
+* 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: RTP/TCP streamer for RTSP source.*
+*/
+
+
+
+
+#ifndef CCRRTPTCPSTREAMER_H
+#define CCRRTPTCPSTREAMER_H
+
+// INCLUDE FILES
+#include <e32base.h>
+
+// CONSTANTS
+const TInt KCRRtpTcpStreamCount( 2 ); /** Max of two streams, audio and video */
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class MCRRtpTcpObserver;
+class CCRRtpTcpStream;
+
+// CLASS DECLARATION
+
+/**
+* RTP/TCP streamer for RTSP packet source.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRRtpTcpStreamer : public CBase
+ {
+
+public: // Constructors and destructors
+
+ /**
+ * Two-phased constructor
+ * @param aObserver a observer to TCP streamer.
+ */
+ static CCRRtpTcpStreamer* NewL( MCRRtpTcpObserver& aObserver );
+
+ /**
+ * Destructor
+ */
+ virtual ~CCRRtpTcpStreamer();
+
+public: // New methods
+
+ /**
+ * Signals that input IP packet is available for parsing.
+ * @since Series 60 3.0
+ * @param aIpData raw RTSP/RTP/TCP data received (IP packet).
+ * @param aInterleaved a TCP interleaving state.
+ * @return none.
+ */
+ void DataAvailable( const TDesC8& aIpData,
+ const TBool& aInterleaved );
+
+private: // Constructors and destructors
+
+ /**
+ * C++ default constructor
+ */
+ CCRRtpTcpStreamer( MCRRtpTcpObserver& aObserver );
+
+ /**
+ * Second phase constructor
+ */
+ void ConstructL();
+
+private: // New methods
+
+ /**
+ * Handles IP packet when more data is expected.
+ * @since Series 60 3.0
+ * @param aIpData a data of IP packet.
+ * @return true if not enougth data in IP packet.
+ */
+ TBool HandleMoreExpected( TPtrC8& aData );
+
+ /**
+ * Handles TCP interleave packet.
+ * @since Series 60 3.0
+ * @param aData a data of IP packet.
+ * @return true if not enougth data in IP packet.
+ */
+ TBool HandleTcpPacket( TPtrC8& aData );
+
+ /**
+ * Handles RTSP control response.
+ * @since Series 60 3.0
+ * @param aData a data of IP packet.
+ * @param aInterleaved a TCP interleaving state.
+ * @return true if not enougth data in IP packet.
+ */
+ TBool HandleRtspResponse( TPtrC8& aData,
+ const TBool& aInterleaved );
+
+ /**
+ * Creates an packet from IP data buffer.
+ * @since Series 60 3.0
+ * @param aData a data of IP packet.
+ * @param aLength a length of RTSP/RTP packet.
+ * @return none.
+ */
+ void MakePacket( TPtrC8& aData, const TInt aLength );
+
+ /**
+ * Handles incoming RTP or RTCP packet, forwards to user and to RTCP engine.
+ * @since Series 60 3.0
+ * @param aPacket a data of RTP packet.
+ * @return none.
+ */
+ void ForwardPacket( const TDesC8& aPacket );
+
+private: // Data
+
+ /**
+ * Observer for streaming session.
+ */
+ MCRRtpTcpObserver& iObserver;
+
+ /**
+ * More expected bytes count.
+ */
+ TInt iMoreExpected;
+
+ /**
+ * Data received so far.
+ */
+ HBufC8* iIpData;
+
+ /**
+ * RTSP data received so far.
+ */
+ HBufC8* iRtspData;
+
+ /**
+ * Media streams
+ */
+ CCRRtpTcpStream* iStreams[KCRRtpTcpStreamCount];
+
+ };
+
+#endif // CCRTCPSTREAMER_H
+
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRRtspSink.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,427 @@
+/*
+* 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: Packet sink where real one player gets media stream.*
+*/
+
+
+
+
+#ifndef CCRRTSPSINK_H
+#define CCRRTSPSINK_H
+
+// INCLUDES
+#include "CCRSock.h"
+#include "CCRRtspCommand.h"
+#include "CCRRtspResponse.h"
+#include "CCRPacketBuffer.h"
+#include "CCRStreamingSession.h"
+#include "CCRPacketSinkBase.h"
+#include <e32base.h>
+
+// CONSTANTS
+// None.
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CDvrSdpParser;
+class CCRConnection;
+class RSocketServ;
+class CCRStreamingSession;
+
+// CLASS DECLARATION
+/**
+* Packet sink that forwards stream to rop plugin via rtsp.
+* Implements rtsp server.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+ */
+class CCRRtspSink : public CCRPacketSinkBase,
+ public MCRSockObserver
+ {
+
+public:
+
+ /**
+ * Enum for 5 socket to use to play to rop plugin.
+ */
+ enum TCRROPSockId
+ {
+ EROPControl = 0, /**< control sock, rtsp in tcp spoken here */
+ EROPVideoSend1, /**< RTP video payload */
+ EROPVideoSend2, /**< RTCP video */
+ EROPAudioSend1, /**< RTP audio payload */
+ EROPAudioSend2, /**< RTCP audio */
+ EROPMaxSockets /**< Just max value, no real socket assigned for this */
+ };
+
+public: // Constructors and destructors
+
+ /**
+ * Two-phased constructor.
+ * @param aConnection a connection rerefrence.
+ * @param aSockServer a socket server refrence.
+ * @param aSinkId a id of this sink.
+ * @param aOwningSession a reference to owning session.
+ * @param aLoopbackPort a RTSP port for loopback socket.
+ * @return CCRRtspSink pointer.
+ */
+ static CCRRtspSink* NewL( CCRConnection& aConnection,
+ RSocketServ& aSockServer,
+ CCRStreamingSession::TCRSinkId aSinkId,
+ const TInt& aLoopbackPort,
+ CCRStreamingSession& aOwningSession );
+
+ /**
+ * Destructor
+ */
+ virtual ~CCRRtspSink();
+
+private: // Methods from base classes
+
+ /**
+ * From CCRPacketSinkBase.
+ * Connects the given buffer with this sink.
+ * @since Series 60 3.0
+ * @param aBuffer is the buffer to connect with.
+ * @return none.
+ */
+ void SetBuffer( CCRPacketBuffer* aBuffer );
+
+ /**
+ * From CCRPacketSinkBase.
+ * Adds packet to the sink.
+ * @since Series 60 3.0
+ * @return none.
+ */
+ void NewPacketAvailable();
+
+ /**
+ * From CCRPacketSinkBase.
+ * Method for setting the sdp in use
+ * @since Series 60 3.0
+ * @param aSdp is the new sdp
+ * @return none
+ */
+ void SetSdpL( const TDesC8& aSdp );
+
+ /**
+ * From CCRPacketSinkBase.
+ * Method for setting initial seq+ts _before_ the stream is played.
+ * @since Series 60 3.0
+ * @param aAudioSeq is the initial rtp seq number for audio packets.
+ * @param aAudioTS is the initial rtp timestamp number for audio packets.
+ * @param aVideoSeq is the initial rtp seq number for video packets.
+ * @param aVideoTS is the initial rtp timestamp number for video packets.
+ * @return none.
+ */
+ void SetSeqAndTS( TUint& aAudioSeq,
+ TUint& aAudioTS,
+ TUint& aVideoSeq,
+ TUint& aVideoTS );
+
+ /**
+ * From CCRPacketSinkBase.
+ * method for setting play range before the stream is played.
+ * @since Series 60 3.0
+ * @param aLower is where clip range begins, in seconds.
+ * @param aUpper is where clip range ends, usually clip end, in seconds.
+ * @return none.
+ */
+ void SetRange( TReal aLower,
+ TReal aUpper );
+
+ /**
+ * From CCRPacketSinkBase.
+ * Method that source uses to communicate its status.
+ * @since Series 60 3.0
+ * @param aNewState is the new state of the source.
+ * @return none.
+ */
+ void StatusChanged( MCRPacketSource::TCRPacketSourceState aNewState );
+
+ /**
+ * From MCRSockObserver.
+ * This method is called after some data has been received from socket.
+ * @since Series 60 3.0
+ * @param aData is descriptor containing the data received.
+ * ownership of data is not passed via this call.
+ * @return none.
+ */
+ void DataReceived( TInt aSockId, const TDesC8 &aData );
+
+ /**
+ * From MCRSockObserver.
+ * This method is called after status of socket changes.
+ * @param aSockId
+ * @param aStatus is sock status.
+ * @param aError
+ * @return none.
+ */
+ void SockStatusChange( TInt aSockId,
+ CCRSock::TCRSockStatus aStatus,
+ TInt aError );
+
+public: // Constructors and destructors
+
+ /**
+ * By default default constructor is private
+ * @param aConnection is the IAP representative that we need to use
+ * @param aSockServer is the socketserver to use when opening socks
+ * @param aSinkId that this class needs to use when reporting progress back to owner
+ * @param aOwningSession is the streaming session that owns this instance
+ */
+ CCRRtspSink( CCRConnection& aConnection,
+ RSocketServ& aSockServer,
+ CCRStreamingSession::TCRSinkId aSinkId,
+ CCRStreamingSession& aOwningSession );
+
+ /**
+ * second phase of 2-phased construction
+ * @param aLoopbackPort a RTSP port for loopback socket.
+ */
+ void ConstructL( const TInt& aLoopbackPort );
+
+protected: // New methods
+
+ /**
+ * Method that produces sdp for rop plugin consumption.
+ * Needs to have iSDP and parser.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void ProduceSDPForRopL();
+
+ /**
+ * Method for doing something with commands rop has sent to us
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void ProcessRtspCommandL();
+
+ /**
+ * Method for doing something after rop has said something to use.
+ * @since Series 60 3.0
+ * @param aLastCommand is the last command rop has sent
+ * @return none.
+ */
+ void ProduceRtspReplyL( CCRRtspCommand::TCommand aLastCommand );
+
+ /**
+ * Method for replying to "options" command.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void ReplyToOptionsL();
+
+ /**
+ * Method for replying to "describe" command.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void ReplyToDescribeL();
+
+ /**
+ * Method for replying to "setup" command
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void ReplyToSetupL();
+
+ /**
+ * Method for replying to "play" command, reply is sent to rop.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void ReplyToPlayL();
+
+ /**
+ * Method for replying to "pause" command.
+ * @since Series 60 3.0
+ * @param symbian error code telling if pausing was ok.
+ * @return none.
+ */
+ void ReplyToPauseL( TInt aErrorCode );
+
+ /**
+ * Method for replying to "teardown" command.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void ReplyToTearDownL();
+
+private: // New methods
+
+ /**
+ * Getter for socket sink id basing on stream.
+ * @since Series 60 3.0
+ * @param aStreamId a stream id of packet.
+ * @return a socket sink id.
+ */
+ TCRROPSockId SocketFromStream( MCRPacketSource::TCRPacketStreamId aStreamId );
+
+ /**
+ * Appends string to the buffer.
+ * @since Series 60 3.0
+ * @param aBuffer a buffer where to add text.
+ * @param aTxt a string to append.
+ * @return none.
+ */
+ void AppendL( HBufC8*& aBuffer,
+ const TDesC8& aTxt );
+
+ /**
+ * Appends integer value as text to the buffer.
+ * @since Series 60 3.0
+ * @param aBuffer a buffer where to add text.
+ * @param aNum a numerical value to append.
+ * @return none.
+ */
+ void AppendNumL( HBufC8*& aBuffer,
+ const TInt aNum );
+
+ /**
+ * Appends formatted text to the buffer.
+ * @since Series 60 3.0
+ * @param aBuffer a buffer where to add text.
+ * @param aFmt a format string to use.
+ * @return none.
+ */
+ void AppendFormatL( HBufC8*& aBuffer,
+ TRefByValue<const TDesC8> aFmt, ... );
+
+ /**
+ * Sends control data to the player.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void SendControlData();
+
+ /**
+ * This meyhod is called after received data from EROPControl socket.
+ * @since Series 60 3.1
+ * @param aData is descriptor containing the data received.
+ */
+ void HandleReceivedEROPControlL( const TDesC8& aData );
+
+private: // Data
+
+ /**
+ * RConnection wrapper we use for sockets. no ownership.
+ */
+ CCRConnection& iConnection;
+
+ /**
+ * Socket server we use for sockets. no ownership.
+ */
+ RSocketServ& iSockServer;
+
+ /**
+ * When TBool in iPacketPendingInBuffer is ETrue it means that the buffer
+ * in iBuffers having same array index. As said TBool has a packet
+ * waiting to be sent to rop.
+ */
+ TBool iPacketPendingInBuffer;
+
+ /**
+ * Have our own sdp parser for parsing the sdp.
+ */
+ CDvrSdpParser* iSdpParser;
+
+ /**
+ * SDP to give to rop.
+ */
+ HBufC8* iSdpForRop;
+
+ /**
+ * Sockets for speaking with rop.
+ */
+ CCRSock* iSockArr[EROPMaxSockets];
+
+ /**
+ * Stage in rtsp discussions with rop plugin.
+ */
+ TCRRTSPStage iStage;
+
+ /**
+ * Stage for setup repply received.
+ */
+ TInt iSetupReceived;
+
+ /**
+ * Pointer to data sent to us via socket from rop.
+ */
+ HBufC8* iReceivedData;
+
+ /**
+ * Pointers to commands sent by rop in various stages.
+ */
+ CCRRtspCommand *iCommands[CCRRtspCommand::ERTSPCommandNOCOMMAND];
+
+ /**
+ * Pointer to string sent to rop.
+ */
+ HBufC8* iRopResponse;
+
+ /**
+ * Audio seq to begin with.
+ */
+ TUint32 iAudioSeq;
+
+ /**
+ * Audio TS to begin with.
+ */
+ TUint32 iAudioTS;
+
+ /**
+ * Video seq to begin with.
+ */
+ TUint32 iVideoSeq;
+
+ /**
+ * Video TS to begin with
+ */
+ TUint32 iVideoTS;
+
+ /**
+ * TBool telling if above 4 things (seq+ts*2) has been seen.
+ */
+ TBool iSeqAndTSSet;
+
+ /**
+ * Range begin pos in play command header.
+ */
+ TReal iLowerRange;
+
+ /**
+ * Range end pos in play command header.
+ */
+ TReal iUpperRange;
+
+ };
+
+#endif // CCRRTSPSINK_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRServer.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,203 @@
+/*
+* 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: Server class in client/server paradigm of symbian.*
+*/
+
+
+
+
+#ifndef __CCRSERVER_H
+#define __CCRSERVER_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+
+// FORWARD DECLARATIONS
+class CCREngine;
+
+// CLASS DECLARATION
+
+/**
+* Server class.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRServer : public CPolicyServer
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @param aSemaphore a void pointer to semaphore.
+ */
+ static CCRServer* NewLC();
+
+ /**
+ * Destructor.
+ */
+ virtual ~CCRServer();
+
+public: // New functions
+
+ /**
+ * Thread function, creates cleanup stack for the thread.
+ * @since Series 60 3.0
+ * @return KErrNone
+ */
+ static TInt ThreadFunction( );
+
+ /**
+ * Thread function, the active scheduler is installed and started.
+ * @since Series 60 3.0
+ * @return None.
+ */
+ static void ThreadFunctionL( );
+
+ /**
+ * Signals client that server is started.
+ * @since Series 60 3.0
+ * @return None.
+ */
+ static void SignalClientL();
+
+ /**
+ * Panics server.
+ * @since Series 60 3.0
+ * @param aPanic panic code.
+ * @return None.
+ */
+ static void PanicServer( TInt aPanic );
+
+ /**
+ * Starts the server thread.
+ * @since Series 60 3.0
+ * @return None.
+ */
+ static TInt StartThread();
+
+ /**
+ * Dec
+ * @since Series 60 3.0
+ * @return None.
+ */
+ void Dec();
+
+ /**
+ * Inc
+ * @since Series 60 3.0
+ * @return None.
+ */
+ void Inc();
+
+ /**
+ * Create new Session.
+ * @since Series 60 3.0
+ * @param aVersion server version number.
+ * @return CSharableSession pointer to new created session.
+ */
+ CSession2* NewSessionL( const TVersion &aVersion,
+ const RMessage2& aMessage ) const;
+
+ /**
+ * Gets engine object.
+ * @since Series 60 3.0
+ * @return CCREngine pointer.
+ */
+ CCREngine* GetEngineObjectL();
+
+protected:
+
+// From CPolicyServer
+
+ /**
+ * Called by framework to perform custom security check for any
+ * client messages.
+ *
+ * @param aMsg Message.
+ * @param aAction Action.
+ * @param aMissing Security info.
+ * @return Result of security check.
+ */
+ TCustomResult CustomSecurityCheckL(
+ const RMessage2 &aMsg,
+ TInt &aAction,
+ TSecurityInfo &aMissing );
+
+private: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ */
+ CCRServer();
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL( );
+
+private: // Methods from base classes
+
+ /**
+ * Stops the server thread.
+ * @since Series 60 3.0
+ * @return None.
+ */
+ void StopServer();
+
+private: // New methods
+
+ /**
+ * Deletes CR engine.
+ * @since Series 60 3.0
+ * @return None.
+ */
+ void DeleteRtpEngine();
+
+private: // Data
+
+ /**
+ * Object container index.
+ */
+ CObjectConIx* iContainerIx;
+
+ /**
+ * Object container.
+ */
+ CObjectCon* iObjectCon;
+
+ /**
+ * CR engine object.
+ */
+ CCREngine* iEngine;
+
+ /**
+ * Number of sessions.
+ */
+ TInt iSessionCount;
+
+ };
+
+#endif // __CCRSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRSession.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,173 @@
+/*
+* 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: Session part of the client/server paradigm.*
+*/
+
+
+
+
+#ifndef __CCRSESSION_H
+#define __CCRSESSION_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+// None.
+
+// MACROS
+// None.
+
+// DATA TYPES
+enum TCRPanic
+ {
+ ECRPanicServiceHandle,
+ ECRPanicBadDescriptor,
+ ECRPanicInvalidRequestType,
+ ECRPanicRequestAsyncTwice,
+ ECRPanicBadSubSessionHandle,
+ ECRPanicZeroLengthDes,
+ ECRPanicDesLengthNegative,
+ ECRPanicNullPtrArray,
+ ECRPanicNullHandle,
+ ECRPanicHandleNotOpen,
+ ECRPanicIndexOutOfRange,
+ ECRPanicHandleNotClosed,
+ ECRPanicBadRequest,
+ ECRPanicPanicBadName
+ };
+
+// FORWARD DECLARATIONS
+class CCREngine;
+class CCRServer;
+
+// CLASS DECLARATION
+
+/**
+* CCRSession is the server side session that client applications
+* talk with. This merely passes commands to CCREngine
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRSession : public CSession2
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @Param aClient reference client thread
+ * @Param aServer pointer to Server
+ * @return CCRSession pointer to CCRSession class
+ */
+ static CCRSession* NewL( CCRServer* aServer );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CCRSession();
+
+public: // New methods
+
+ /**
+ * Server.
+ * @since Series 60 3.0
+ * @return a pointer to server.
+ */
+ inline CCRServer* Server() const
+ {
+ return REINTERPRET_CAST( CCRServer*,
+ CONST_CAST( CServer2*, CSession2::Server() ) );
+ }
+
+ /**
+ * Service.
+ * @since Series 60 3.0
+ * @param aMessage contains data from the client.
+ * @return None.
+ */
+ void ServiceL( const RMessage2& aMessage );
+
+private: // New methods
+
+ /**
+ * Dispatch message.
+ * @since Series 60 3.0
+ * @param aMessage contains data from the client.
+ * @return None.
+ */
+ void DispatchMessageL( const RMessage2& aMessage );
+
+ /**
+ * New Object.
+ * @since Series 60 3.0
+ * @param aMessage contains data from the client.
+ * @return None.
+ */
+ void NewObjectL( const RMessage2& aMessage );
+
+ /**
+ * Deletes object, can't fail - can panic client.
+ * @since Series 60 3.0
+ * @param aHandle handle.
+ * @return None.
+ */
+ void DeleteObject( TUint aHandle );
+
+ /**
+ * Counts resources
+ * @return Number of resources
+ */
+ TInt CountResources();
+
+ /**
+ * Panics client.
+ * @since Series 60 3.0
+ * @param aPanic panic code.
+ * @return None.
+ */
+ void PanicClient( TInt aPanic ) const;
+
+private: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ * @Param aClient reference client thread.
+ */
+ CCRSession();
+
+ /**
+ * Symbian 2nd phase constructor.
+ * @Param aServer pointer to Server.
+ */
+ void ConstructL( CCRServer* aServer );
+
+private: // Data
+
+ /**
+ * Object index for this session.
+ */
+ CObjectIx* iObjects;
+
+ /**
+ * Total number of resources allocated.
+ */
+ TInt iResourceCount;
+
+ };
+
+#endif // __CCRSESSION_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRSock.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,521 @@
+/*
+* 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: Class for wrapping RSocket and CActive*
+*/
+
+
+
+
+#ifndef CCRSOCK_H
+#define CCRSOCK_H
+
+// INCLUDES
+#include <in_sock.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+const TInt KMaxDataSize( 8192 );
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CCRSock;
+class MCRSockObserver;
+
+// CLASS DECLARATION
+
+/**
+* Class for receiving data via socket.
+*
+* This is solely owned by CCRSock and considered a helper class.
+* Because there may be send and receive operations outstanding
+* at the same time, one RSocket needs 2 CActive instances.
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRSockReader : public CActive
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @param aSock is reference to socket object
+ * that this class instance serves.
+ * @since Series 60 3.0
+ * @param aConnection a connection.
+ * @param aSockServer a socket server.
+ * @return CCRSockReader pointer to CCRSockReader class.
+ */
+ static CCRSockReader* NewL( CCRSock& aSock,
+ RConnection& aConnection,
+ RSocketServ& aSockServer );
+ /**
+ * Destructor.
+ */
+ virtual ~CCRSockReader();
+
+public: // New Methods
+
+ /**
+ * Method for starting reading.
+ * @since Series 60 3.0
+ * @param none
+ * @return always succeeds
+ */
+ void IssueRead( void );
+
+private: // Constructors and destructors
+
+ /**
+ * Default constructor
+ */
+ CCRSockReader( CCRSock& aSock,
+ RConnection& aConnection,
+ RSocketServ& aSockServer );
+ /**
+ * 2nd phase constructor
+ */
+ void ConstructL();
+
+private: // Methods from base classes
+
+ /**
+ * From CActive.
+ * This is the work-horse of this class.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void RunL();
+
+ /**
+ * From CActive.
+ * This cancels work in progress.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void DoCancel();
+
+ /**
+ * From CActive.
+ * This handles errors.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none an status of method.
+ */
+ TInt RunError( TInt aError );
+
+private: // Data
+
+ /**
+ * Socket.
+ */
+ CCRSock& iSock;
+
+ /**
+ * connection to use.
+ */
+ RConnection& iConnection;
+
+ /**
+ * Socket server.
+ */
+ RSocketServ& iSockServer;
+
+#if defined ( LIVE_TV_FILE_TRACE ) || defined ( LIVE_TV_RDEBUG_TRACE )
+ TUint recvCount;
+ TUint recvBytes;
+#endif // LIVE_TV_FILE_TRACE || LIVE_TV_RDEBUG_TRACE
+ };
+
+/**
+* Encapsulates a socket in easy-to-use way
+*/
+class CCRSock : public CActive
+ {
+
+public: // Data types
+
+ /**
+ * Enum for communicating what is going on with this socket
+ */
+ enum TCRSockStatus
+ {
+ EInitNeeded = 1000,
+ EIdle, /**< Nothing in progress */
+ EResolving, /**< Finding out addr to connect to */
+ EConnecting, /**< Addr found but no connection yet */
+ ESending, /**< Request to send has been issued but not yet completed */
+ EListening, /**< Request to wait for incoming connection is not yet compl. */
+ EFailed /**< Something went wrong */
+ };
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @param aObserver is reference to object that
+ * gets notified when something happens
+ * @param aSockId is a number that this class instance
+ * will keep, do nothing with, and us the same
+ * number when reporting statuses back to observer.
+ * motivation here is that same observer may have
+ * several instances of this class all reporting
+ * via same method.
+ * @param aProtoTCP ETrue for TCP socket, EFalse for UDP
+ * @param aIssueRead ETrue to automatically receive data from
+ * socket and return to observer through DataReceived.
+ * EFalse to let user handle receiving data.
+ * @return CCRSock pointer to CCRSock class
+ */
+ static CCRSock* NewL( MCRSockObserver& aObserver,
+ TInt aSockId,
+ RConnection& aConnection,
+ RSocketServ& aSockServer,
+ TBool aProtoTCP,
+ TBool aIssueRead );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CCRSock();
+
+public: // New methods
+
+ /**
+ * method for causing the socket to connect to remote addr.
+ * @since Series 60 3.0
+ * @param aAddr is the addr to connect to
+ * @param aPort is ip port number to connect to
+ * @param aLocalPort specifies the local port to bind to. If 0 random
+ * port is selected
+ * @return KErrNone is returned if connection is all right
+ */
+ TInt ConnectSock( const TDesC& aAddr,
+ TUint aPort,
+ TInt aLocalPort = 0 );
+
+ /**
+ * method for causing the socket to connect to remote addr without
+ * doing DNS lookup.
+ * @since Series 60 3.0
+ * @param aAddr is the addr to connect to
+ * @param aLocalPort specifies the local port to bind to. If 0 random
+ * port is selected
+ * @return KErrNone is returned if connection is all right
+ */
+ TInt ConnectSock( const TSockAddr& aAddr,
+ TInt aLocalPort = 0);
+
+ /**
+ * method for causing the socket to start listening at part.
+ * @since Series 60 3.0
+ * @param aPort is the port to listen to
+ * @return KErrNone is returned if connection is all right
+ */
+ TInt ListenPort( TUint aPort );
+
+ /**
+ * method for joining a multicast group
+ * @since Series 60 3.0
+ * @param aGruopAddr IPv6 address of the group to join
+ * @return KErrNone on success
+ */
+ TInt JoinGroup( const TInetAddr& aGroupAddr );
+
+ /**
+ * method for sending data over the sock
+ * @since Series 60 3.0
+ * @param aData is the data that is sent over sock
+ * @return none, succeeds always, if something goes wrong, it does it in async way
+ */
+ void SendData( const TDesC8& aDataThatIsSentOverSocket );
+
+ /**
+ * Method for asking the status: what is going on
+ * @since Series 60 3.0
+ * @param none.
+ * @return socket status.
+ */
+ CCRSock::TCRSockStatus SockStatus( void ) const;
+
+ /**
+ * Helper class may frobnicate our private parts:
+ */
+ friend class CCRSockReader;
+
+ /**
+ * Method for getting the addr this socket is connected to in the other end
+ * @since Series 60 3.0
+ * @param none.
+ * @return the addr
+ */
+ TInetAddr ConnectedAddr( void );
+
+ /**
+ * Method for getting the addr this socket is connected to in the local end
+ * @since Series 60 3.0
+ * @param none.
+ * @return the addr
+ */
+ TInetAddr LocalAddr( void );
+
+ /**
+ * Method for setting the "where to send addr" and this is applicable for UDP socks
+ * @param aAddr is the new addr.
+ * @return none
+ */
+ void SetToAddr( const TInetAddr &aAddr );
+
+ /**
+ * Gets reference underlying Symbian socket implementation. To be used with caution.
+ * @since Series 60 3.0
+ * @param none.
+ * @return reference to underlying ES_SOCK socket
+ */
+ RSocket& Socket();
+
+private: // Constructors and destructors
+
+ /**
+ * default constructor
+ */
+ CCRSock( MCRSockObserver& aObserver,
+ TInt aSockId,
+ RConnection& aConnection,
+ RSocketServ& aSockServer,
+ TBool aProtoTCP,
+ TBool aIssueRead );
+
+ /**
+ * 2nd phase constructor
+ */
+ void ConstructL();
+
+private: // Methods from base classes
+
+ /**
+ * From CActive.
+ * This is the work-horse of this class.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void RunL();
+
+ /**
+ * From CActive.
+ * This cancels work in progress.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void DoCancel();
+
+ /**
+ * From CActive.
+ * This handles errors.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none an status of method.
+ */
+ TInt RunError( TInt aError );
+
+private: // New methods
+
+ /**
+ * Handles send buffer.
+ */
+ void CopySendData( const TDesC8& aData );
+
+ /**
+ * Performs cleanup.
+ */
+ void CleanUp();
+
+private: // Data types
+
+ /**
+ * This is used to read/write.
+ */
+ RSocket iSocket;
+
+ /**
+ * status for above socket.
+ */
+ TBool iIsiSocketOpen;
+
+ /**
+ * This is used to listen.
+ * Not used when we use this class for outgoing connection.
+ */
+ RSocket iListenSocket;
+
+ /**
+ * Status for above socket.
+ */
+ TBool iIsiListenSocketOpen;
+
+ /**
+ * This is used to find out addr by name.
+ */
+ RHostResolver iResolver;
+ /**
+ * This is needed to get hold of RSocket.
+ */
+ RSocketServ& iSockServer;
+
+ /**
+ * This is where we connect to.
+ */
+ TNameEntry iHostAddress;
+
+ /**
+ * this is our internal status.
+ */
+ TCRSockStatus iSockStatus;
+
+ /**
+ * Our observer.
+ */
+ MCRSockObserver& iObserver;
+
+ /**
+ * Our own internal id.
+ */
+ const TInt iSockId;
+
+ /**
+ * This tells whether we're about to connect via udp or tcp.
+ */
+ TBool iProtoTCP;
+
+ /**
+ * This tells whether receiving data from socket is handled by CCRSockReader or used.
+ */
+ TBool iIssueRead;
+
+ /**
+ * This tells the port we're about to connect.
+ */
+ TUint iPort;
+
+ /**
+ * This tells the port we're binding locally.
+ */
+ TUint iLocalPort;
+
+ /**
+ * This is where we keep the data received.
+ */
+ HBufC8* iReceivedDataBuf;
+
+ /**
+ * Pointer to received data buffer.
+ */
+ TPtr8 iReceivedData;
+
+ /**
+ * This is where we keep the data being sent.
+ */
+ HBufC8* iSentDataBuf;
+
+ /**
+ * Pointer to send data buffer.
+ */
+ TPtr8 iSentData;
+
+ /**
+ * This tells how much data we got.
+ */
+ TSockXfrLength iReceivedDataLen;
+
+ /**
+ * This tells how much data we sent.
+ */
+ TSockXfrLength iSentDataLen;
+
+ /**
+ * This tells where the packet was received from.
+ */
+ TInetAddr iFromAddr;
+
+ /**
+ * This tells if we've been listening or receiving in the past
+ */
+ TBool iWasListening;
+
+ /**
+ * This is instance of a helper class doing the reading part.
+ */
+ CCRSockReader *iReader;
+
+ /**
+ * This tells where to send UDP packets.
+ */
+ TInetAddr iToAddr;
+
+ /**
+ * Connection to use.
+ */
+ RConnection& iConnection;
+
+#if defined ( LIVE_TV_FILE_TRACE ) || defined ( LIVE_TV_RDEBUG_TRACE )
+ TUint sendCount;
+ TUint sendBytes;
+#endif // LIVE_TV_FILE_TRACE || LIVE_TV_RDEBUG_TRACE
+
+ };
+
+/**
+* Class for live tv socket "client" e.g. the user of class CCRSock.
+*/
+class MCRSockObserver
+ {
+
+public:
+
+ /**
+ * This method is called after some data has been received from socket.
+ * @since Series 60 3.0
+ * @param aData is descriptor containing the data received.
+ * ownership of data is not passed via this call.
+ * @return none.
+ */
+ virtual void DataReceived( TInt aSockId,
+ const TDesC8& aData ) = 0;
+
+ /**
+ * This method is called after status of socket changes.
+ * @since Series 60 3.0
+ * @param aSockId a socket id.
+ * @param aStatus is sock status.
+ * @param aError a error code.
+ * @return none
+ */
+ virtual void SockStatusChange( TInt aSockId,
+ CCRSock::TCRSockStatus aStatus,
+ TInt aError ) = 0;
+ };
+
+#endif // CCRSOCK_H
+
+// End of file
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRStreamingSession.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,469 @@
+/*
+* 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: Streaming session, eg one url, one channel...*
+*/
+
+
+
+
+#ifndef _CCRSTREAMINGSESSION_
+#define _CCRSTREAMINGSESSION_
+
+// INCLUDES
+#include <ipvideo/CRTypeDefs.h>
+#include "MCRStreamObserver.h"
+#include <e32base.h>
+#include <es_sock.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CCRPacketBuffer;
+class CAsyncCallBack;
+class CCRConnection;
+class CCRPacketSourceBase;
+class CCRPacketSinkBase;
+class CRtpClipHandler;
+class CCREngine;
+class MCRPacketSource;
+
+// CLASS DECLARATION
+
+/**
+* Streaming session.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+
+class CCRStreamingSession : public CBase,
+ public MCRStreamObserver
+ {
+
+public: // Datatype definitions
+
+ enum TCRSinkId
+ {
+ ECRRtspSinkId = 7000,
+ ECRXpsSinkId,
+ ECR3gpRecSinkId,
+ ECRRtpRecSinkId,
+ ECRNullSinkId
+ };
+
+ enum TCRSourceId
+ {
+ ECRRtspSourceId = 7100,
+ ECRDvbhSourceId,
+ ECRRtpSourceId,
+ ECRNullSourceId
+ };
+
+public: // Constructors and destructors
+
+ /**
+ * Two-phased constructor.
+ * @return CCRStreamingSession pointer.
+ */
+ static CCRStreamingSession* NewL( RSocketServ& aSockServer,
+ CCRConnection* aConnection,
+ CCREngine& aEngine );
+
+ /**
+ * Destructor
+ */
+ virtual ~CCRStreamingSession();
+
+public: // New methods
+
+ /**
+ * Method used to start a new RTSP session with parameters.
+ * @since Series 60 3.0
+ * @param aParams specifies the connection addr.
+ * @param aClipHandler a reference pointer to RTP clip handler.
+ * @param aSessionDefinition a session definition string.
+ * @return none.
+ */
+ void OpenSourceL( const SCRRtspParams& aParams,
+ const TDesC& aSessionDefinition );
+
+ /**
+ * Method used to start a new RTP session with parameters.
+ * @since Series 60 3.0
+ * @param aParams specifies the RTP clip parameters.
+ * @param aClipHandler a reference pointer to RTP clip handler.
+ * @param aSessionDefinition a session definition string.
+ * @return none.
+ */
+ void OpenSourceL( const SCRRtpPlayParams& aParams,
+ CRtpClipHandler*& aClipHandler,
+ const TDesC& aSessionDefinition );
+
+ /**
+ * Method used to start a new RTP session with parameters.
+ * @since Series 60 3.0
+ * @param aRtpHandle a open file handle for RTP file.
+ * @param aParams specifies the RTP clip parameters.
+ * @param aSessionDefinition a session definition string.
+ * @return none.
+ */
+ void OpenSourceL( const RFile& aRtpHandle,
+ CRtpClipHandler*& aClipHandler,
+ const TDesC& aSessionDefinition );
+
+ /**
+ * Method used to start a new DVB-H session with parameters.
+ * @since Series 60 3.0
+ * @param aLiveParams specifies DVB-H live parameters.
+ * @param aSessionDefinition a session definition string.
+ * @return none.
+ */
+ void OpenSourceL( const SCRLiveParams& aLiveParams,
+ const TDesC& aSessionDefinition );
+
+ /**
+ * Method used to start a new Null source session.
+ * @since Series 60 3.0
+ * @param aSessionDefinition a session definition string.
+ * @return none.
+ */
+ void OpenSourceL( const TDesC& aSessionDefinition );
+
+ /**
+ * Calculates source definition checksum: URL, file name etc.
+ * @since Series 60 3.0
+ * @param aName a pointer to defination name.
+ * @return none.
+ */
+ TUint SourceDefinition( const TDesC& aName );
+
+ /**
+ * Getter for source definition checksum.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a value of source definition checksum.
+ */
+ TUint SourceChecksum();
+
+ /**
+ * Method that creates a set of buffers depending on
+ * number of rtp streams to handle.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void CreateAndSetBufferL();
+
+ /**
+ * Method that creates a packet sink that forwards
+ * packets to rop plugin for rendering.
+ * @since Series 60 3.0
+ * @param aLoopbackPort a RTSP port for loopback socket.
+ * @return none.
+ */
+ void CreateRtspSinkL( const TInt& aLoopbackPort );
+
+ /**
+ * Creates XPS sink for passing packets to Helix player.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void CreateXpsSinkL();
+
+ /**
+ * Creates RTP clip sink for saving packets to a clip.
+ * @since Series 60 3.0
+ * @param aRecordParams a recording parameters.
+ * @return none.
+ */
+ void Create3gpRecordSinkL( const SCRRecordParams& aRecordParams );
+
+ /**
+ * Creates RTP clip sink for saving packets to a clip.
+ * @since Series 60 3.0
+ * @param aRecordParams a recording parameters.
+ * @param aClipHandler a reference pointer to RTP clip handler.
+ * @return none.
+ */
+ void CreateRtpRecordSinkL( const SCRRecordParams& aRecordParams,
+ CRtpClipHandler*& aClipHandler );
+
+ /**
+ * Post action after source initialized.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void PostActionL();
+
+ /**
+ * Play command for current source.
+ * @since Series 60 3.0
+ * @param aStartPos is start position in seconds.
+ * @param aEndPos is end position in seconds.
+ * @return a system wide error code.
+ */
+ TInt PlayCommand( const TReal& aStartPos,
+ const TReal& aEndPos );
+
+ /**
+ * Pause command for current source.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a system wide error code.
+ */
+ TInt PauseCommand();
+
+ /**
+ * Stop command for current source.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a system wide error code.
+ */
+ TInt StopCommand();
+
+ /**
+ * Setter for source position.
+ * @since Series 60 3.0
+ * @param aPosition a current play position of the clip.
+ * @return a system wide error code.
+ */
+ TInt SetPosition( const TInt64 aPosition );
+
+ /**
+ * Getter for source position.
+ * @since Series 60 3.0
+ * @param aPosition a current play position of the clip.
+ * @param aDuration a duration of the clip.
+ * @return a system wide error code.
+ */
+ TInt GetPosition( TInt64& aPosition,
+ TInt64& aDuration );
+
+ /**
+ * Pause command for wanted sink.
+ * @since Series 60 3.0
+ * @param aSinkId identifies the sink.
+ * @return a system wide error code.
+ */
+ TInt PauseCommand( const TCRSinkId& aSinkId );
+
+ /**
+ * Restore command for wanted sink.
+ * @since Series 60 3.0
+ * @param aSinkId identifies the sink.
+ * @return a system wide error code.
+ */
+ TInt RestoreCommand( const TCRSinkId& aSinkId );
+
+ /**
+ * Stop command for wanted sink.
+ * @since Series 60 3.0
+ * @param aSinkId identifies the sink.
+ * @return a system wide error code.
+ */
+ TInt StopCommand( const TCRSinkId& aSinkId );
+
+ /**
+ * Method to transfer ownership of existing sink.
+ * @since Series 60 3.0
+ * @param aSinkId identifies the sink.
+ * @param aTargetSession identifies the sink.
+ * @return a system wide error code.
+ */
+ TInt TransferSink( const TCRSinkId& aSinkId,
+ CCRStreamingSession& aTargetSession );
+
+ /**
+ * Method to add new sink to session.
+ * @since Series 60 3.0
+ * @param aSink a pointer to the sink to add.
+ * @return a system wide error code.
+ */
+ TInt AddNewSink( CCRPacketSinkBase* aSink );
+
+ /**
+ * Veryfies if source or any sink on session uses RTP clip handler.
+ * @since Series 60 3.0
+ * @param none.
+ * @return true if clip handler user, otherwise false.
+ */
+ TBool ClipHandlerUsed();
+
+ /**
+ * Method that creates a packet sink that forwards.
+ * packets to bit bucket.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void CreateNullSinkL();
+
+ /**
+ * Sets SDP and buffer for sinks.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void InitializeSinks();
+
+ /**
+ * Set timestamp and sequence numbers from source to sinks.
+ * If Range is available, sets it too.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void SetSeqAndTs();
+
+ /**
+ * Method that sink calls to communicate that it wants to quit its business.
+ * It is now our responsibility to delete the sink after buffers have been
+ * notified about the situation.
+ * @since Series 60 3.0
+ * @param aSinkId identifies the sink.
+ * @return none.
+ */
+ void SinkStops( const TCRSinkId& aSinkId );
+
+ /**
+ * Method that source uses to communicate that it wants more packets.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void SourceRestore();
+
+ /**
+ * Method that source uses to communicate that it wants to be deleted.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void SourceStop();
+
+private: // Constructors and destructors
+
+ /**
+ * by default default constructor is private
+ * @param aSockServer is the socketserver to use when opening socks.
+ * @param aConnection
+ * @param aEngine
+ */
+ CCRStreamingSession( RSocketServ& aSockServer,
+ CCRConnection* aConnection,
+ CCREngine& aEngine );
+
+ /**
+ * second phase of 2-phased construction
+ */
+ void ConstructL();
+
+private: // Functions from base classes
+
+ /**
+ * From MCRStreamObserver.
+ * Source status indication.
+ * @since Series 60 3.0
+ * @param aStatus
+ * @return none.
+ */
+ void StatusChanged( MCRPacketSource::TCRPacketSourceState aStatus );
+
+private: // New methods
+
+ /**
+ * Static callback called via CAsyncCallBack to initiate cleaning of a sink
+ * @since Series 60 3.0
+ * @param aThis a pointer to owner of call back.
+ * @return none.
+ */
+ static TInt SinkStopCallBack( TAny* aThis );
+
+ /**
+ * Method for cleaning a sink. Called from SinkStopCallBack
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void DoSinkStop( void );
+
+ /**
+ * Method that deletes a packet sink.
+ * @since Series 60 3.0
+ * @param aSinkId identifies the sink.
+ * @return none.
+ */
+ void DeleteSink( const TCRSinkId& aSinkId );
+
+public: // Data
+
+ /**
+ * Socket server.
+ */
+ RSocketServ& iSockServer;
+
+ /**
+ * Connections.
+ */
+ CCRConnection* iConnection;
+
+ /**
+ * Reference to engine object owning this instance.
+ */
+ CCREngine& iEngine;
+
+ /**
+ * Callback for cutting the call stack in cleanup.
+ */
+ CAsyncCallBack *iCleanUp;
+
+ /**
+ * Packet sources.
+ */
+ CCRPacketSourceBase* iSource;
+
+ /**
+ * Source definition checksum.
+ */
+ TUint iSourceChecksum;
+
+ /**
+ * Packet buffer.
+ */
+ CCRPacketBuffer* iBuffer;
+
+ /**
+ * Packet sinks.
+ */
+ RPointerArray<CCRPacketSinkBase> iSinks;
+
+ /**
+ * Array of sinks that have declared that they want to be deleted.
+ */
+ RArray<TCRSinkId> iSinksToDelete;
+
+};
+
+#endif // _CCRSTREAMINGSESSION_
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRTimer.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,121 @@
+/*
+* 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: Wrapper for CTimer*
+*/
+
+
+
+
+#ifndef CCRTIMER_H
+#define CCRTIMER_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class MCRTimerObserver;
+
+/**
+* CCRTimer
+*
+* This class will notify an object after a specified timeout.
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRTimer : public CTimer
+ {
+
+public: // Constructors and destructors
+
+ /**
+ * Two-phased constructor.
+ * Creates a CCRTimer object using two phase construction,
+ * and returns a pointer to the created object.
+ * @since Series 60 3.0
+ * @param aPriority Priority to use for this timer.
+ * @param aTimeOutNotify Object to notify of timeout event.
+ * @return A pointer to the created instance of CCRTimer.
+ */
+ IMPORT_C static CCRTimer* NewL( const TInt aPriority,
+ MCRTimerObserver& aTimerObserver );
+
+ /**
+ * Two-phased constructor.
+ * Creates a CCRTimer object using two phase construction,
+ * and returns a pointer to the created object.
+ * @since Series 60 3.0
+ * @param aPriority Priority to use for this timer.
+ * @param aTimerObserver Object to notify of timeout event.
+ * @return A pointer to the created instance of CCRTimer.
+ */
+ IMPORT_C static CCRTimer* NewLC( const TInt aPriority,
+ MCRTimerObserver& aTimerObserver );
+
+ /**
+ * Destructor.
+ * Destroys the object and release all memory objects.
+ */
+ virtual IMPORT_C ~CCRTimer();
+
+protected: // Functions from base classes
+
+ /**
+ * From CActive.
+ * Called when operation completes.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ IMPORT_C void RunL();
+
+private: // Constructors and destructors
+
+ /**
+ * C++ default constructor.
+ * Performs the first phase of two phase construction.
+ * @since Series 60 3.0
+ * @param aPriority Priority to use for this timer.
+ * @param aTimeOutNotify An observer to notify.
+ * @return none.
+ */
+ IMPORT_C CCRTimer( const TInt aPriority,
+ MCRTimerObserver& aTimerObserver );
+
+ /**
+ * ConstructL.
+ * 2nd phase constructor.
+ */
+ IMPORT_C void ConstructL();
+
+private: // Data
+
+ /**
+ * iNotify, the observer for this objects events.
+ */
+ MCRTimerObserver& iObserver;
+
+ };
+
+#endif // CCRTIMER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CCRXpsSink.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,325 @@
+/*
+* 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: Packet sink where XPS gets the streaming.*
+*/
+
+
+
+#ifndef CCRXPSSINK_H
+#define CCRXPSSINK_H
+
+// INCLUDES
+#include "CCRPacketSinkBase.h"
+#include "MCRTimerObserver.h"
+#include "VideoServiceUtilsConf.hrh"
+#include <CXPSPktSinkObserver.h>
+#include <RtpDef.h>
+#include "videoserviceutilsLogger.h"
+#ifdef VIA_FEA_IPTV_USE_IPDC
+#include <H264Mpeg4GenrToFileFormat.h>
+#endif // VIA_FEA_IPTV_USE_IPDC
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CCRPacketBuffer;
+class CXPSPacketSink;
+class CCRStreamingSession;
+class CRtpTsConverter;
+class CRtpPacket;
+class CCRTimer;
+
+// CLASS DECLARATION
+
+/**
+* Packet sink that does not forward packets. Good for testing.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRXpsSink : public CCRPacketSinkBase,
+ public MCRTimerObserver,
+ public MXPSPktSinkObserver
+ {
+
+public: // Constructors and destructors
+
+ /**
+ * Two-phased constructor.
+ * @return CCRXpsSink pointer.
+ */
+ static CCRXpsSink* NewL( CCRStreamingSession::TCRSinkId aSinkId,
+ CCRStreamingSession& aOwningSession );
+
+ /**
+ * Destructor
+ */
+ virtual ~CCRXpsSink();
+
+protected: // Constructors and destructors
+
+ /**
+ * By default default constructor is private
+ * @param aConnection is the IAP representative that we need to use
+ * @param aSockServer is the socketserver to use when opening socks
+ * @param aSinkId that this class needs to use when reporting progress back to owner
+ * @param aOwningSession is the streaming session that owns this instance
+ */
+ CCRXpsSink( CCRStreamingSession::TCRSinkId aSinkId,
+ CCRStreamingSession& aOwningSession );
+
+ /**
+ * Second phase of 2-phased construction
+ */
+ void ConstructL();
+
+private: // Methods from base classes
+
+ /**
+ * From CCRPacketSinkBase.
+ * Method for setting the sdp in use.
+ * @since Series 60 3.0
+ * @param aSdp is the new sdp.
+ * @return none.
+ */
+ void SetSdpL( const TDesC8& aSdp );
+
+ /**
+ * From CCRPacketSinkBase.
+ * Adds packet to the sink.
+ * @since Series 60 3.0
+ * @return none.
+ */
+ void NewPacketAvailable();
+
+ /**
+ * From CCRPacketSinkBase.
+ * Buffer reset info for the sink.
+ * @since Series 60 3.0
+ * @return none.
+ */
+ void BufferResetDone();
+
+ /**
+ * From MCRTimerObserver.
+ * The function to be called when a timeout occurs.
+ * @since Series 60 3.0
+ * @param aTimer a pointer to timer.
+ * @return none.
+ */
+ void TimerExpired( CCRTimer* aTimer );
+
+ /**
+ * From MXPSPktSinkObserver.
+ * API to inform for resumption of packet supply.
+ * @since Series 60 3.0
+ * @param uStreamId a stream id.
+ * @return none.
+ */
+ void RestorePacketSupply( TUint uStreamId );
+
+private: // New methods
+
+ /**
+ * Restores sink for new packets.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void RestoreSink();
+
+ /**
+ * Sends one RTP packet to a player.
+ * @since Series 60 3.0
+ * @param none.
+ * @return ETrue if packet was sent, EFalse if not.
+ */
+ TBool SendPacket();
+
+ /**
+ * Adjust time stamp and enque audio packet to player.
+ * @since Series 60 3.0
+ * @param aPacket a packet payload to send.
+ * @return a system wide error code of sending.
+ */
+ TInt SendAudioPacket( const TDesC8& aPacket );
+
+ /**
+ * Adjust time stamp and enque video packet to player.
+ * @since Series 60 3.0
+ * @param aPacket a packet payload to send.
+ * @return a system wide error code of sending.
+ */
+ TInt SendVideoPacket( const TDesC8& aPacket );
+
+ /**
+ * Adjust time stamp and enque sub title packet to player.
+ * @since Series 60 3.0
+ * @param aPacket a packet payload to send.
+ * @return a system wide error code of sending.
+ */
+ TInt SendTitlePacket( const TDesC8& aPacket );
+
+ /**
+ * Sends packet to the player.
+ * @since Series 60 3.0
+ * @param aStreamId a stream id of packet.
+ * @return a system wide error code of sending.
+ */
+ TInt EnqueuePacket( const TUint aStreamId );
+
+ /**
+ * Serach if buffer contains control stream packets.
+ * If not, in non continous stream ask more packets to buffer.
+ *
+ * @since S60 v3.0
+ * @return none.
+ */
+ void SearchForControlStreamPackets();
+
+ /**
+ * Checks if the buffer contains control stream packets. This is needed
+ * if we receive packets for stream that has not yet received any control
+ * stream packets, so that we do not have to discard the packets. If any
+ * control stream packets are found for a stream that has not been
+ * initiated, then that control stream packet is used to initiate that
+ * stream.
+ *
+ * @since S60 v3.0
+ * @return ETrue if a control stream packet was found, EFalse othervise.
+ */
+ TBool CheckBufferForControlStreamPackets();
+
+ /**
+ * Starts flow timer.
+ * @since Series 60 3.0
+ * @param aInterval a timer interval.
+ * @return none.
+ */
+ void StartTimer( const TInt& aInterval );
+
+ /**
+ * Starts flow timer.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void StopTimer();
+
+#ifdef VIA_FEA_IPTV_USE_IPDC
+ /**
+ * Serach for fmtp string.
+ * @since Series 60 3.0
+ * @param aSdpData a SDP data.
+ * @return smtp string from SDP.
+ */
+ HBufC8* FindFmtpLC( const TDesC8& aSdpData );
+
+#endif // VIA_FEA_IPTV_USE_IPDC
+
+private: // Data
+
+ /**
+ * XPS packet sink.
+ */
+ CXPSPacketSink* iPacketSink;
+
+ /**
+ * Status of XPS buffer.
+ */
+ TInt iWaitPlayer;
+
+ /**
+ * Requested packet after overflow.
+ */
+ TInt iRequested;
+
+ /**
+ * Status for XPS reset.
+ */
+ TBool iXpsResetOk;
+
+ /**
+ * Status of range.
+ */
+ TBool iRangeKnown;
+
+ /**
+ * Flow control timer.
+ */
+ CCRTimer* iFlowTimer;
+
+ /**
+ * Audio stream id for XPS.
+ */
+ TInt iAudioStreamId;
+
+ /**
+ * Audio stream id for XPS.
+ */
+ TInt iVideoStreamId;
+
+ /**
+ * Sub title stream id for XPS.
+ */
+ TInt iTitleStreamId;
+
+ /**
+ * TS converter for audio.
+ */
+ CRtpTsConverter* iAudioConv;
+
+ /**
+ * TS converter for video.
+ */
+ CRtpTsConverter* iVideoConv;
+
+ /**
+ * TS converter for video.
+ */
+ CRtpTsConverter* iTitleConv;
+
+ /**
+ * RTP packet to enqueue.
+ */
+ CRtpPacket* iRtpPacket;
+
+#ifdef VIA_FEA_IPTV_USE_IPDC
+ /**
+ * Depacketizer for video stream (ISMACryp).
+ */
+ CH264Mpeg4GenrToFileformat * iVideoDepacketizer;
+
+#endif // VIA_FEA_IPTV_USE_IPDC
+
+#if defined( LIVE_TV_RDEBUG_TRACE ) || defined( LIVE_TV_FILE_TRACE )
+ /**
+ * Debug purposes.
+ */
+ TInt iLogXps;
+
+#endif // LIVE_TV_RDEBUG_TRACE || LIVE_TV_FILE_TRACE
+
+ };
+
+#endif // CCRXPSSINK_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CRRTSPCommon.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,610 @@
+/*
+* 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: Common definitions for rtsp implementation*
+*/
+
+
+
+
+#ifndef CCRRTSPCOMMON_H
+#define CCRRTSPCOMMON_H
+
+// INCLUDES
+#include <e32base.h>
+#include <in_sock.h>
+
+// CONSTANTS
+/** Max len for synchronization source id texttual presentation. SSRC is 32-bit number
+ * so this needs to be able to hold 2^^32 numerical value */
+const TInt KSSRCMaxLen( 30 );
+/** Max expected RTP packet len, given to symbian rtp stack that wants to know */
+const TInt KAverageExpectedRtpPacketMaxSize( 1500 );
+
+// following five are guestimates
+/** Average expected audio packet size */
+const TInt KAverageAudioPacketSize( 400 );
+/** Average expected video packet size */
+const TInt KAverageVideoPacketSize( 700 );
+/** Average expected rtp control packet size */
+const TInt KAverageRTPControlPacketSize( 30 );
+/** Number of rtp packets in our buffer, max */
+const TInt KRTPDataPacketBufferLen( 100 );
+/** Number of rtpc packets in our buffer, max */
+const TInt KRTPControlPacketBufferLen( 20 );
+
+// followint strings _MAY_NOT_ be localized.
+_LIT8( KCR2NewLines, "\r\n\r\n" );
+_LIT8( KCRCSeq, "CSeq: " );
+_LIT8( KCRRTSP10, "RTSP/1.0" );
+_LIT8( KCROPTIONS, "OPTIONS " );
+_LIT8( KCROPTIONSNoSpace, "OPTIONS" );
+_LIT8( KCRDESCRIBE, "DESCRIBE " );
+_LIT8( KCRDESCRIBENoSpace, "DESCRIBE" );
+_LIT8( KCRTEARDOWN,"TEARDOWN " );
+_LIT8( KCRTEARDOWNNoSpace,"TEARDOWN" );
+_LIT8( KCRPAUSE,"PAUSE " );
+_LIT8( KCRPAUSENoSpace,"PAUSE" );
+_LIT8( KCRSETUP, "SETUP " );
+_LIT8( KCRSETUPNoSpace, "SETUP" );
+_LIT8( KCRClient_Port, "client_port=" );
+_LIT8( KCRInterleaved, "interleaved=" );
+_LIT8( KCRAcceptSDP, "Accept: application/sdp\r\n" );
+_LIT8( KCRPort, "port=" );
+_LIT8( KCRDestination, "destination=" );
+_LIT8( KCRPLAY, "PLAY " );
+_LIT8( KCRPLAYNoSpace, "PLAY" );
+_LIT8( KCRRTSPReplyHeader, "RTSP/1.0 " );
+_LIT8( KCRRTSPContentLength, "Content-length: " );
+_LIT8( KCRRTSPDefaultUserAgent, "NokiaVideoCenter" );
+_LIT8( KCRRTSPUserAgentHeader, "User-Agent: %S\r\n" );
+_LIT8( KCRRTSPXWapProfile, "x-wap-profile: %S\r\n" );
+_LIT8( KCRRTSPBandwidth, "Bandwidth: %d\r\n" );
+_LIT8( KCRSessionStr, "Session: " );
+_LIT8( KCRNewLine, "\r\n" );
+_LIT8( KCRSpace, " " );
+_LIT8( KCRSemiColon, ";" );
+_LIT8( KCRDash, "-" );
+_LIT8( KCRLineFeed, "\n" );
+_LIT8( KCRSDPmLine, "m=" );
+_LIT8( KCRSDPmLineIsVideo, "m=video" );
+_LIT8( KCRSDPRTPAVP, "RTP/AVP" );
+_LIT8( KCRSDPRTPAVPTCP, "RTP/AVP/TCP" );
+_LIT8( KCRSDPRTPAVPUDP, "RTP/AVP/UDP" );
+_LIT8( KCRSDPMulticast, "multicast" );
+_LIT8( KCRSDPmLineIsAudio, "m=audio" );
+_LIT8( KCRSDPcLine, "c=" );
+_LIT8( KCRSDPbLine, "b=AS" );
+_LIT8( KCRNlAndSession, "\r\nSession: " );
+_LIT8( KCRRtpInfo, "RTP-Info: " );
+_LIT8( KCRUrlStr, "url=" );
+_LIT8( KCRSeqStr, "seq=" );
+_LIT8( KCRRtptimeStr, "rtptime=" );
+_LIT8( KCRServerPort, "server_port" );
+_LIT8( KCRSSRC, ";ssrc=" );
+_LIT8( KCRTransportHeaderUDP, "Transport: RTP/AVP;unicast;"
+ "client_port=%d-%d;mode=play\r\n" );
+_LIT8( KCRTransportHeaderTCP, "Transport: RTP/AVP/TCP;interleaved=%d-%d\r\n" );
+_LIT8( KCRTransportHeaderMulticast, "Transport: RTP/AVP;multicast\r\n" );
+_LIT8( KCRRangeHeader, "Range: npt=" );
+_LIT8( KCRRangeHeaderLiveStream, "Range: npt=now-" );
+_LIT8( KCRRtpMap, "a=rtpmap" );
+_LIT8( KCROptionsReply,
+ "RTSP/1.0 200 OK\r\nCseq: %d\r\n"
+ "Public: DESCRIBE, SETUP, PAUSE, "
+ "TEARDOWN, PLAY, OPTIONS\r\n\r\n" );
+
+// Authentication strings
+_LIT8( KCRAuthBasic, "Basic" );
+_LIT8( KCRAuthDigest, "Digest" );
+_LIT8( KCRAuthRealm, "realm=\"" );
+_LIT8( KCRAuthNonce, "nonce=\"" );
+_LIT8( KCRAuthOpaque, "opaque=\"" );
+_LIT8( KCRAuthorizationHeader,
+ "Authorization: Digest username=\"%S\", realm=\"%S\","
+ " nonce=\"%S\", uri=\"%S\", response=\"%S\", opaque=\"%S\"\r\n" );
+_LIT8( KCRAuthorizationHeaderNoOpaque,
+ "Authorization: Digest username=\"%S\","
+ " realm=\"%S\", nonce=\"%S\", uri=\"%S\", response=\"%S\"\r\n" );
+_LIT8( KCRContentBaseHeader, "Content-Base: ") ;
+_LIT8( KCRAuthorizationBasicHeader, "Authorization: Basic %S\r\n" );
+
+// MACROS
+// None
+
+// DATA TYPES
+/**
+* TCRRTSPStage is used by both RTSP packet source and ROP sink. It is used
+* to indicate the stage in RTSP negotiation where the packet source or rop sink
+* currently is in
+*/
+enum TCRRTSPStage
+ {
+ ERTSPInit = 0, /**< nothing done yet , must have numerical id 0 */
+ ERTSPOptSent, /**< Options command has been sent */
+ ERTSPDescSent, /**< Describe command has been sent */
+ ERTSPDelayedSetup, /**< Setup command need to be delayed */
+ ERTSPSetupAudioSent, /**< Setup command for audio has been sent */
+ ERTSPSetupVideoSent, /**< Setup command has video been sent */
+ ERTSPReadyToPlay, /**< Everything in order with remote server */
+ ERTSPPlaySent, /**< Play command has been sent */
+ ERTSPPauseSent, /**< Pause command has been sent */
+ ERTSPPlaying, /**< Play command has been sent and 200 OK received */
+ ERTSPTearDownSent, /**< Teardown command has been sent */
+ ERTSPLastStage /**< This is not a real stage, keep this identifier as item, used for indexing */
+ };
+
+/**
+ * Enum indicating which transport to use for RTP streaming
+ */
+enum TCRRTPTransport
+ {
+ ERTPOverUDP = 0, /**< stream RTP over UDP, default */
+ ERTPOverTCP, /**< stream RTP over TCP, interleaved in RTSP stream */
+ ERTPOverMulticast /**< stream RTP over multicast UDP */
+ };
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+
+/**
+* Base-class for RTSP commands and responses.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CCRRtspCommon : public CBase
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * Destructor.
+ */
+ virtual ~CCRRtspCommon( );
+
+public: // New functions
+
+ /**
+ * Method that is used to give rtsp response / command to this class.
+ * @since Series 60 3.0
+ * @param aString is the response string
+ * @return none. May leave with symbian error codes. At least following may be
+ * seen: KErrUnderflow if there is \r\n\r\n sequence in the string
+ * marking end of response or if there is content(like SDP) and the
+ * content lenght is too short; KErrNotSupported if it doesn't look
+ * like RTSP at all.
+ */
+ virtual void TryParseL( const TDesC8 &aString ) = 0;
+
+ /**
+ * Method for getting content len. KErrNotFound if no content. KErrNotReady
+ * if TryParseL previously did leave
+ * @since Series 60 3.0
+ * @param none .
+ * @return content len.
+ */
+ TInt ContentLen( void );
+
+ /**
+ * Method for getting content. Most usually the content is SDP.
+ * @since Series 60 3.0
+ * @param none
+ * @return tring descriptor allocated by this class so when
+ * this class instance gets deleted, the buffer
+ * content will point to invalid data.
+ */
+ TPtrC8& Content( void );
+
+ /**
+ * Method for getting sequence number
+ * @since Series 60 3.0
+ * @param none.
+ * @return CSeq.
+ */
+ TInt CSeq( void );
+
+ /**
+ * Method for setting sequence number
+ * @since Series 60 3.0
+ * @param aCSeq is CSeq number.
+ * @return none.
+ */
+ void SetCSeq( TInt aCSeq );
+
+ /**
+ * Method for getting session id.
+ * @since Series 60 3.0
+ * @param aId is string descriptor allocated by caller that
+ * will have its content set to block allocated by instance
+ * of this class containing the session id.
+ * @return KErrNone if no error, KErrNotFound if session id is not there.
+ */
+ TInt SessionId( TPtrC8& aId );
+
+ /**
+ * Method for setting session id.
+ * @since Series 60 3.0
+ * @param aId is string descriptor allocated by caller that contains
+ * new session id and whose content(memory area pointed by pointer
+ * returned by Ptr() method call) will remain intact for the
+ * lifetime of instance of this class.
+ * @return none.
+ */
+ void SetSessionId( TPtrC8& aId );
+
+ /**
+ * Method for getting client port
+ * @since Series 60 3.0
+ * @param none.
+ * @return client port of KErrNotFound if none found.
+ */
+ TInt ClientPort( void );
+
+ /**
+ * Method for setting client port
+ * @since Series 60 3.0
+ * @param aPort is the client port number.
+ * @return none.
+ */
+ void SetClientPort( TInt aPort );
+
+ /**
+ * Method for setting range
+ * @since Series 60 3.0
+ * @param aLower is where to start from.
+ * @param aUpper is where to stop. Negative values mean eternity.
+ * @return none
+ */
+ void SetRange( TReal aLower, TReal aUpper );
+
+ /**
+ * Method for getting range
+ * @since Series 60 3.0
+ * @param aLower is where to start from.
+ * @param aUpper is where to stop. Negative values mean eternity.
+ * @return none.
+ */
+ void GetRange( TReal& aLower, TReal& aUpper );
+
+ /**
+ * Method for parsing range header
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void ParseRange( void );
+
+ /**
+ * Method for getting session opaque
+ * @since Series 60 3.0
+ * @param none.
+ * @return reference to opaque or NULL.
+ */
+ TDesC8& OpaqueL( void );
+
+ /**
+ * Method for getting session realm
+ * @since Series 60 3.0
+ * @param none.
+ * @return reference to realm or NULL.
+ */
+ TDesC8& RealmL( void );
+
+ /**
+ * Method for getting authentication type.
+ * @since Series 60 3.0
+ * @param none.
+ * @return Reference to auth type found from RTSP reply.
+ */
+ TDesC8& AuthenticationTypeL( void );
+
+ /**
+ * Method for getting session Nonce
+ * @since Series 60 3.0
+ * @param none.
+ * @return Reference to nonce found from RTSP reply.
+ */
+ TDesC8& NonceL( void );
+
+ /**
+ * Method for setting session nonce
+ * @since Series 60 3.0
+ * @param aNonce is the nonce part of authenticated RTSP command/response.
+ * @return none.
+ */
+ void SetNonceL( const TDesC& aNonce );
+
+ /**
+ * Mothod for setting authentication type
+ * @since Series 60 3.0
+ * @param aAuthType is the authentication type.
+ * @return none.
+ */
+ void SetAuthenticationTypeL( const TDesC8& aAuthType );
+
+ /**
+ * Method for setting session opaque
+ * @since Series 60 3.0
+ * @param aOpaque is the opaque part of authenticated response.
+ * @return none.
+ */
+ void SetOpaqueL( const TDesC& aOpaque );
+
+ /**
+ * Method for setting session realm
+ * @since Series 60 3.0
+ * @param aRealm is the realm part of authenticated rtsp command.
+ * @return none.
+ */
+ void SetRealmL( const TDesC& aRealm );
+
+ /**
+ * Method for setting session nonce
+ * @since Series 60 3.0
+ * @param aNonce is the new nonce that will be sent with the command.
+ * @return none.
+ */
+ void SetNonceL( const TDesC8& aNonce );
+
+ /**
+ * Method for setting session opaque
+ * @since Series 60 3.0
+ * @param aOpaque is the new opaque that will be sent with the command.
+ * @return none.
+ */
+ void SetOpaqueL( const TDesC8& aOpaque );
+
+ /**
+ * Method for setting session realm
+ * @since Series 60 3.0
+ * @param aRealm is the new realm that will be sent with the command.
+ * @return none.
+ */
+ void SetRealmL( const TDesC8& aRealm );
+
+ /**
+ * Method for setting rtsp username.
+ * @since Series 60 3.0
+ * @param aUserName is the new username
+ * @return none.
+ */
+ void SetUserNameL( const TDesC& aUserName );
+
+ /**
+ * Method for setting session password.
+ * @since Series 60 3.0
+ * @param aPassWd is the password to use when generating digest for authenticated rtsp
+ * @return none.
+ */
+ void SetPassWdL( const TDesC& aPassWd );
+
+ /**
+ * Method for setting session rtsp uri.
+ * @since Series 60 3.0
+ * @param aUri is the string that will in RTSP command be written between command and text RTSP/1.0 strings.
+ * @return none.
+ */
+ void SetRtspUriL( const TDesC& aUri );
+
+ /**
+ * Gets transport method.
+ * @since Series 60 3.0
+ * @param none.
+ * @return transport method, default(ERTPOverUDP) if not present on command
+ */
+ TCRRTPTransport Transport();
+
+ /**
+ * Sets transport method.
+ * @since Series 60 3.0
+ * @param aTransport is the transport method to. This is used when constructing
+ * a SETUP command.
+ * @return none.
+ */
+ void SetTransport( TCRRTPTransport aTransport );
+
+ /**
+ * Gets destination IP address if present
+ * @since Series 60 3.0
+ * @param none.
+ * @return destination IP address or KAFUnspec
+ */
+ const TInetAddr& Destination();
+
+ /**
+ * Gets flag whether stream is a live stream.
+ * @since Series 60 3.0
+ * @param none.
+ * @return ETrue if stream is known to be a live stream.
+ */
+ TBool IsLiveStream( void );
+
+ /**
+ * Getter for Content-base rtsp header content
+ * @since Series 60 3.0
+ * @param none.
+ * @return content of content-base header or empty string
+ */
+ TPtrC8 ContentBase( void );
+
+protected: // Constructors and destructor
+
+ /**
+ * default constructor
+ */
+ CCRRtspCommon( void );
+
+protected: // New methods
+
+ /**
+ * Method for digging out CSeq from response.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none but will leave with KErrNotSupported if CSeq is not there.
+ */
+ void FindCSeqL( void );
+
+ /**
+ * Method for digging out session id from response. Id will be stored in instance variable for future use.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void FindSessionIdL( void );
+
+ /**
+ * Method for digging ContentBase
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void FindContentBase( void );
+
+ /**
+ * Method for digging out content/content len from response
+ * @since Series 60 3.0
+ * @param none.
+ * @return none but will leave will KErrUnderflow
+ * if all content not yet received.
+ */
+ void FindContentL( void );
+
+ /**
+ * method for finding client port from response or command.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void FindClientPorts( void );
+
+ /**
+ * finds transport method from response or command.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void FindTransport();
+
+ /**
+ * finds destination IP address from SETUP response or command
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void FindDestination();
+
+protected: // Data
+
+ /**
+ * Buffer that holds the text being parsed.
+ */
+ HBufC8* iRtspText;
+
+ /**
+ * Len of possible content.
+ */
+ TInt iContentLen;
+
+ /**
+ * Possible content, if no content, set to( NULL, 0 ).
+ */
+ TPtrC8 iContent;
+
+ /**
+ * Sequence number, must be there.
+ */
+ TInt iCSeq;
+
+ /**
+ * Possible session id.
+ */
+ TPtrC8 iSessionId;
+
+ /**
+ * Possible client_port.
+ */
+ TInt iClientPort;
+
+ /**
+ * Transport method.
+ */
+ TCRRTPTransport iTransport;
+
+ /**
+ * Destination address
+ */
+ TInetAddr iDestination;
+
+ /**
+ * Range lower limit for Range: header.
+ */
+ TReal iLowerRange;
+
+ /**
+ * Range lower limit for Range: header.
+ */
+ TReal iUpperRange;
+
+ /**
+ * Authentication type.
+ */
+ HBufC8* iAuthType;
+
+ /**
+ * Realm.
+ */
+ HBufC8* iRealm;
+
+ /**
+ * Nonce.
+ */
+ HBufC8* iNonce;
+
+ /**
+ * Opaque.
+ */
+ HBufC8* iOpaque;
+
+ /**
+ * possible username, if server requires.
+ */
+ HBufC8* iUserName;
+
+ /**
+ * rtsp URL in 8bit descriptor.
+ */
+ HBufC8* iUri;
+
+ /**
+ * possible password, if server requires.
+ */
+ HBufC8* iPassword;
+
+ /**
+ * When this is set, it indicates that rtsp command/reply
+ * describes a live stream that cannot be paused or position set.
+ */
+ TBool iIsLiveStream;
+
+ /**
+ * Content of Content-base -header
+ */
+ TPtrC8 iContentBase ;
+ };
+
+#endif // CCRRTSPCOMMON_H
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/CRServerConsts.hrh Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,29 @@
+/*
+* Copyright (c) 2006 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: Common constant definitions*
+*/
+
+
+
+
+
+#ifndef __CRSERVERCONSTS_H
+#define __CRSERVERCONSTS_H
+
+#define KCRServerUid 0x1028242D
+
+#endif // __CRSERVERCONSTS_H
+
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/MCRConnectionObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,92 @@
+/*
+* 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: Observer class for wrapping RConnection.*
+*/
+
+
+
+
+#ifndef MCRCONNECTIONOBSERVER_H
+#define MCRCONNECTIONOBSERVER_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+
+/**
+* Observer for connection interface status.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class MCRConnectionObserver
+ {
+
+public: // Data types
+
+ /**
+ * TCRConnectionStatus is set of indications to be sent to client
+ */
+ enum TCRConnectionStatus
+ {
+ ECRBearerChanged, /**< Indicates change in network bearer */
+ ECRIapDown, /**< Network connection lost */
+ ECRConnectionError, /**< Unable to open connection in RTP engine & CR engine */
+ ECRConnecting, /**< Indicates "connection on progress" state to ui */
+ ECRAuthenticationNeeded, /**< Used to request username/password from ui */
+ ECRNotEnoughBandwidth, /**< Stream has too high bitrate for our network */
+ ECRNormalEndOfStream, /**< Clip ends normally */
+ ECRSwitchingToTcp, /**< Indicates a udp->tcp switch, client may need to reset player */
+ ECRStreamIsLiveStream, /**< Indicates that we have stream that can't be paused */
+ ECRAttachCompleted, /**< Sent when attached to RConnection */
+ ECRStreamIsRealMedia, /**< Indicates that stream is (unsupported) realmedia format */
+ ECRTestSinkData, /**< Data from TestSink (former NullSink) to test client observer */
+ ECRSdpAvailable, /**< Used to communicate availability of SDP */
+ ECRReadyToSeek, /**< Used to communicate seeking posibility */
+ ECRRecordingStarted, /**< Used to communicate recording state */
+ ECRRecordingPaused, /**< Used to communicate recording state */
+ ECRRecordingEnded /**< Used to communicate recording state */
+ };
+
+ /**
+ * This method is called after connection status changes or there is an error
+ * @since Series 60 3.0
+ * @param aSessionId Id to session generating the status change or message. 0 points to no session.
+ * @param aConnection Reference to connection object being used.
+ * @param aInterfaceUp flags if interface has gone up (ETrue)
+ * or down (EFalse).
+ * @param aError error value associated.
+ * @return none.
+ */
+ virtual void ConnectionStatusChange( TInt aSessionId,
+ const TCRConnectionStatus aStatus,
+ TInt aErr ) = 0;
+ };
+
+#endif // MCRCONNECTIONOBSERVER_H
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/MCRPacketSource.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,190 @@
+/*
+* 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: Class for all rtp packet sources*
+*/
+
+
+
+#ifndef MCRPACKRTSOURCE_H
+#define MCRPACKRTSOURCE_H
+
+// INCLUDES
+#include <e32def.h>
+#include <e32cmn.h>
+
+// CONSTANTS
+const TReal KRealZero( 0.0 );
+const TReal KRealMinusOne( -1.0 );
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CCRPacketBuffer;
+
+// CLASS DECLARATION
+
+/**
+* Interface for packet sources
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class MCRPacketSource
+ {
+
+public: // Data types
+
+ /**
+ * Enum for indicating what stream an individual rtp packet belongs to.
+ */
+ enum TCRPacketStreamId
+ {
+ EAudioStream = 0, /**< This rtp stream carries audio content data */
+ EAudioControlStream = 1, /**< This rtp stream carries audio control data */
+ EVideoStream = 2, /**< This rtp stream carries video content data */
+ EVideoControlStream = 3, /**< This rtp stream carries video control data */
+ ESubTitleStream = 4, /**< This rtp stream carries sub title content data */
+ ESubTitleControlStream = 5, /**< This rtp stream carries sub title control data */
+ EDisContinousStream = 6, /**< This is info of discontinous point in stream */
+ EStreamEndTag = 7, /**< This is info of end point of stream */
+ EStreamIdCount /**< Number of different sources */
+ };
+
+ /**
+ * Enum for indicating rtp packet source state.
+ */
+ enum TCRPacketSourceState
+ {
+ ERtpStateIdle = 0, /**< Nothing started yet */
+ ERtpStateSdpAvailable, /**< SDP received */
+ ERtpStateSeqAndTSAvailable, /**< Should be ready for prime-time */
+ ERtpStateSetupRepply, /**< Setup repply received */
+ ERtpStatePlaying, /**< Stream is playing */
+ ERtpStateClosing, /**< Stream is about to end */
+ ERtpStateCount /**< Count number of different states */
+ };
+
+public: // New methods
+
+ /**
+ * Method for acquiring sdp.
+ * @since Series 60 3.0
+ * @param aSdp is string pointer that will be .Set() to contain
+ * the sdp. If no sdp is available no .Set() will occur.
+ * @return KErrNotReady if no sdp available.
+ */
+ virtual TInt GetSdp( TPtrC8& aSdp ) = 0;
+
+ /**
+ * Method for acquiring (almost) up-to-date sequence and ts numbers.
+ * @since Series 60 3.0
+ * @param aAudioSeq is reference to TUint that will be set by this
+ * method to contain latest available sequence number for
+ * audio stream being received via this packet source.
+ * @param aAudioTS rtp timestamp for audio
+ * @param aVideoSeq rtp seq for video. If no video,
+ value will not be touched.
+ * @param aVideoTS rtp ts for video.
+ * @return KErrNone if data available.
+ */
+ virtual TInt SeqAndTS( TUint& aAudioSeq,
+ TUint& aAudioTS,
+ TUint& aVideoSeq,
+ TUint& aVideoTS ) = 0;
+
+ /**
+ * Method for ordering "play" for packet source.
+ * @since Series 60 3.0
+ * @param aStartPos is start position in sends.
+ * @param aEndPos is play end position in seconds.
+ * @return a system wide error code.
+ */
+ virtual TInt Play( const TReal& aStartPos,
+ const TReal& aEndPos ) = 0;
+
+ /**
+ * Method for ordering "pause" for packet source.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a system wide error code.
+ */
+ virtual TInt Pause() = 0;
+
+ /**
+ * Method for stopping play from source.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a system wide error code.
+ */
+ virtual TInt Stop() = 0;
+
+ /**
+ * Method for getting range of stream. If no range/duration
+ * is available this method will set the return values to
+ * 0.0,-1.0 and that may be quite normal state live streams.
+ * Also, depending on type of source this data may not be always
+ * available, for instance rtsp sources know the range after
+ * play command has been issued but not before.
+ * @since Series 60 3.0
+ * @param aLower is where to start from. If no value available,
+ * value of aLower must be set to 0
+ * @param aUpper is where to stop. Negative values mean eternity.
+ * @return none
+ */
+ virtual void GetRange( TReal& aLower,
+ TReal& aUpper ) = 0;
+
+ /**
+ * Post action after source initialized.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ virtual void PostActionL() = 0;
+
+ /**
+ * Method for requesting more packets to buffer.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ virtual void Restore() = 0;
+
+ /**
+ * Setter for current position.
+ * @since Series 60 3.0
+ * @param aPosition a postion of playback.
+ * @return a system wide error code.
+ */
+ virtual TInt SetPosition( const TInt64 aPosition ) = 0;
+
+ /**
+ * Getter for current position.
+ * @since Series 60 3.0
+ * @param aPosition a postion of playback.
+ * @param aDuration a duration of playback.
+ * @return a system wide error code.
+ */
+ virtual TInt GetPosition( TInt64& aPosition,
+ TInt64& aDuration ) = 0;
+
+ };
+
+#endif // MCRPACKRTSOURCE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/MCRStreamObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,49 @@
+/*
+* 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: Streaming observer definition for streaming session.*
+*/
+
+
+
+
+#ifndef _MCRSTREAMOBSERVER_H
+#define _MCRSTREAMOBSERVER_H
+
+// INCLUDES
+#include "MCRPacketSource.h"
+
+/**
+* Stream observer.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class MCRStreamObserver
+ {
+
+public: // New methods
+
+ /**
+ * Source status indication.
+ * @since Series 60 3.0
+ * @param aStatus
+ * @return none.
+ */
+ virtual void StatusChanged( MCRPacketSource::TCRPacketSourceState aStatus ) = 0;
+
+ };
+
+#endif // _MCRSTREAMOBSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/MCRTimerObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,66 @@
+/*
+* 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: Observer for CCRTimer*
+*/
+
+
+
+
+#ifndef CCRTIMEROBSERVER_H
+#define CCRTIMEROBSERVER_H
+
+// INCLUDES
+// None
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CCRTimer;
+
+// CLASS DECLARATION
+
+/**
+* This class specifies the function to be called when a timeout occurs.
+* Used in conjunction with CCRTimer class.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class MCRTimerObserver
+ {
+
+public:
+
+ /**
+ * The function to be called when a timeout occurs.
+ * @since Series 60 3.0
+ * @param aTimer a pointer to timer.
+ * @return none.
+ */
+ virtual void TimerExpired( CCRTimer* aTimer ) = 0;
+
+ };
+
+#endif // CCRTIMEROBSERVER_H
+
+// End of File
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/VideoServiceUtilsConf.hrh Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+
+/**
+* Flag for .rtp clip support.
+* This flag is copied from videocenterconf.hrh
+* Do not turn this flag on. Must be always undefined!
+*/
+#undef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+
+/**
+* Flag for ipdc database usage.
+* This flag is copied from videocenterconf.hrh
+* Do not turn this flag on. Must be always undefined!
+*/
+#undef VIA_FEA_IPTV_USE_IPDC
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/inc/videoserviceutilsLogger.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,72 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+
+#ifndef __VIDEOSERVICEUTILSLOGGER_H__
+#define __VIDEOSERVICEUTILSLOGGER_H__
+
+#include <e32debug.h>
+#include <flogger.h>
+
+_LIT( KDirectory, "livetv" );
+_LIT( KFileName, "livetv2.log" );
+_LIT( KTimeDateFormat,"%D%M%Y%/0%1%/1%2%/2%3%/3 %-B%:0%J%:1%T%:2%S%:3%+B");
+
+//#define LIVE_TV_RDEBUG_TRACE
+#ifdef _DEBUG
+#define LIVE_TV_FILE_TRACE
+#endif // _DEBUG
+#ifdef LIVE_TV_RDEBUG_TRACE
+ #define LIVE_TV_TRACE1(a) RDebug::Print(a)
+ #define LIVE_TV_TRACE2(a,b) RDebug::Print(a,b)
+ #define LIVE_TV_TRACE3(a,b,c) RDebug::Print(a,b,c)
+ #define LIVE_TV_TRACE4(a,b,c,d) RDebug::Print(a,b,c,d)
+ #define LIVE_TV_TRACE5(a,b,c,d,e) RDebug::Print(a,b,c,d,e)
+ #define LOG(AAA) { LIVE_TV_TRACE1(_L(AAA)); }
+ #define LOG1(AAA,BBB) { LIVE_TV_TRACE2(_L(AAA),BBB); }
+ #define LOG2(AAA,BBB,CCC) { LIVE_TV_TRACE3(_L(AAA),BBB,CCC); }
+ #define LOG3(AAA,BBB,CCC,DDD) { LIVE_TV_TRACE4(_L(AAA),BBB,CCC,DDD); }
+ #define LOG4(AAA,BBB,CCC,DDD,EEE) { LIVE_TV_TRACE4(_L(AAA),BBB,CCC,DDD,EEE); }
+#else
+ #ifdef LIVE_TV_FILE_TRACE
+ #define LIVE_TV_TRACE1(a) { RFileLogger::Write( KDirectory, KFileName, EFileLoggingModeAppend, a ); }
+ #define LIVE_TV_TRACE2(a,b) { RFileLogger::WriteFormat( KDirectory, KFileName, EFileLoggingModeAppend, a, b );}
+ #define LIVE_TV_TRACE3(a,b,c) { RFileLogger::WriteFormat( KDirectory, KFileName, EFileLoggingModeAppend, a, b, c ); }
+ #define LIVE_TV_TRACE4(a,b,c,d) { RFileLogger::WriteFormat( KDirectory, KFileName, EFileLoggingModeAppend, a, b, c, d ); }
+ #define LIVE_TV_TRACE5(a,b,c,d,e) { RFileLogger::WriteFormat( KDirectory, KFileName, EFileLoggingModeAppend, a, b, c, d, e ); }
+ #define LOG(AAA) { LIVE_TV_TRACE1(_L(AAA)); }
+ #define LOG1(AAA,BBB) { LIVE_TV_TRACE2(_L(AAA),BBB); }
+ #define LOG2(AAA,BBB,CCC) { LIVE_TV_TRACE3(_L(AAA),BBB,CCC); }
+ #define LOG3(AAA,BBB,CCC,DDD) { LIVE_TV_TRACE4(_L(AAA),BBB,CCC,DDD); }
+ #define LOG4(AAA,BBB,CCC,DDD,EEE) { LIVE_TV_TRACE4(_L(AAA),BBB,CCC,DDD,EEE); }
+ #else
+ #define LIVE_TV_TRACE1(a)
+ #define LIVE_TV_TRACE2(a,b)
+ #define LIVE_TV_TRACE3(a,b,c)
+ #define LIVE_TV_TRACE4(a,b,c,d)
+ #define LIVE_TV_TRACE5(a,b,c,d,e)
+ #define LOG(AAA)
+ #define LOG1(AAA,BBB)
+ #define LOG2(AAA,BBB,CCC)
+ #define LOG3(AAA,BBB,CCC,DDD)
+ #define LOG4(AAA,BBB,CCC,DDD,EEE)
+ #endif
+#endif
+
+#endif// __VIDEOSERVICEUTILSLOGGER_H__
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/rom/commonrecordingengine.iby Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+
+#ifndef __COMMONRECORDINGENGINE_IBY__
+#define __COMMONRECORDINGENGINE_IBY__
+
+#include <data_caging_paths_for_iby.hrh>
+
+file=ABI_DIR\BUILD_DIR\CommonRecordingEngine.exe PROGRAMS_DIR\CommonRecordingEngine.exe
+
+#endif // __COMMONRECORDINGENGINE_IBY__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRClientInformer.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,88 @@
+/*
+* 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: Sends message to client with message queue.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCRClientInformer.h"
+#include <e32msgqueue.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+// None
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRClientInformer::NewL
+// -----------------------------------------------------------------------------
+//
+CCRClientInformer* CCRClientInformer::NewL()
+ {
+ CCRClientInformer* self = new( ELeave ) CCRClientInformer();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRClientInformer::CCRClientInformer
+// -----------------------------------------------------------------------------
+//
+CCRClientInformer::CCRClientInformer()
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRClientInformer::~CCRClientInformer
+// -----------------------------------------------------------------------------
+//
+CCRClientInformer::~CCRClientInformer()
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRClientInformer::SendMessage
+// -----------------------------------------------------------------------------
+//
+TInt CCRClientInformer::SendMessage(
+ const TDes& aQueueName,
+ SCRQueueEntry& aInfo )
+ {
+ LIVE_TV_TRACE2( _L( "CCRClientInformer::SendMessage: aInfo.iErr:%d" ), aInfo.iErr );
+
+ RMsgQueue<SCRQueueEntry> queue;
+ TInt err( queue.OpenGlobal( aQueueName ) );
+ if ( err == KErrNone )
+ {
+ err = queue.Send( aInfo );
+ if ( err != KErrNone )
+ {
+ LIVE_TV_TRACE2(_L("CCRClientInformer::SendMessage() queue.Send() FAILED: %d"), err);
+ }
+
+ queue.Close();
+ }
+ else
+ {
+ LIVE_TV_TRACE2(_L("CCRClientInformer::SendMessage() queue.OpenGlobal() FAILED: %d"), err);
+ }
+
+ return err;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRConnection.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,586 @@
+/*
+* 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: Wrap rconnection*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCRConnection.h"
+#include <e32msgqueue.h>
+#include <ipvideo/CRTypeDefs.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+// None.
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRConnection::CCRConnection
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCRConnection::CCRConnection( RSocketServ& aSockServer )
+ : CActive( EPriorityStandard ),
+ iSockServer( aSockServer ),
+ iState( CCRConnection::EIdle )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCRConnection* CCRConnection::NewL( RSocketServ& aSockServer )
+ {
+ CCRConnection* self = new( ELeave ) CCRConnection( aSockServer );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCRConnection::ConstructL()
+ {
+ CActiveScheduler::Add( this );
+ User::LeaveIfError( iConnection.Open( iSockServer ) );
+ User::LeaveIfError( iConMon.ConnectL() );
+
+ // Request bearer changes events from RConnectionMonitor
+ User::LeaveIfError( iConMon.NotifyEventL( *this ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::~CCRConnection
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRConnection::~CCRConnection()
+ {
+ LOG( "CCRConnection::~CCRConnection()" );
+
+ if ( iConMonProgressNotifyPending && iConnection.SubSessionHandle() )
+ {
+ LOG( "~CCRConnection CancelProgressNotification" );
+ iConnection.CancelProgressNotification();
+ }
+
+ Cancel();
+ iConMon.CancelNotifications();
+ iConMon.Close();
+ CloseRConnection();
+ iObservers.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::Start
+// -----------------------------------------------------------------------------
+//
+void CCRConnection::Attach( TUint aConnectionId )
+ {
+ LOG1( "CCRConnection::Attach: aConnectionId: %u", aConnectionId );
+ Cancel();
+ iCurrentConnectionId = aConnectionId;
+ iConMon.GetConnectionCount( iConnectionCount, iStatus );
+ SetActive();
+ iState = CCRConnection::EFindingAP;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::DoCancel
+// If we need to cancel.
+// -----------------------------------------------------------------------------
+//
+void CCRConnection::DoCancel()
+ {
+ LOG( "CCRConnection::DoCancel" );
+
+ if ( iState == CCRConnection::EFindingAP )
+ {
+ LOG( "CCRConnection::DoCancel in EFindingAP" );
+ iConMon.CancelAsyncRequest( EConnMonGetConnectionCount );
+ }
+ else if ( iState == CCRConnection::EFindingBearer )
+ {
+ LOG( "CCRConnection::DoCancel in EFindingBearer" );
+ iConMon.CancelAsyncRequest( EConnMonGetIntAttribute );
+ }
+ else if ( iState == CCRConnection::EOpen && iConnection.SubSessionHandle() )
+ {
+ LOG( "CCRConnection::DoCancel in EOpen" );
+ iConMonProgressNotifyPending = EFalse;
+ iConnection.CancelProgressNotification();
+ }
+ else if ( iState == CCRConnection::EConnecting )
+ {
+ LOG( "CCRConnection::DoCancel in EConnecting" );
+ // How to cancel a RConnection::Start?
+ }
+
+ LOG( "CCRConnection::DoCancel() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::RunL
+// Request succesful completion.
+// -----------------------------------------------------------------------------
+//
+void CCRConnection::RunL()
+ {
+ LOG2( "CCRConnection::RunL(), iState: %d, iStatus: %d",
+ ( TInt )iState, iStatus.Int() );
+
+ // Not pending any longer
+ iConMonProgressNotifyPending = EFalse;
+
+ // Handle state
+ TInt err( KErrNone );
+ if ( iStatus.Int() == KErrNone )
+ {
+ if ( iState == CCRConnection::EFindingAP )
+ {
+ err = FindApL();
+ }
+ else if ( iState == CCRConnection::EFindingBearer )
+ {
+ FindBearerL();
+ }
+ else if ( iState == CCRConnection::EOpen )
+ {
+ NotificationL();
+ }
+ }
+ else
+ {
+ SendConnectionErrorToQueue( iStatus.Int() );
+ }
+
+ // Verify status
+ if ( err )
+ {
+ LOG1( "CCRConnection::RunL(), err: %d", err );
+ SendConnectionErrorToQueue( err );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::SendConnectionErrorToQueue
+// -----------------------------------------------------------------------------
+//
+void CCRConnection::SendConnectionErrorToQueue( TInt aError )
+ {
+ LOG1( "CCRConnection::SendConnectionErrorToQueue() aError: %d", aError );
+
+ iState = CCRConnection::EIdle;
+ iCurrentConnectionId = 0;
+ iBearerType = EBearerUnknown;
+ CloseRConnection();
+ MCRConnectionObserver::TCRConnectionStatus status;
+ status = MCRConnectionObserver::ECRConnectionError;
+
+ for ( TInt i( 0 ); i < iObservers.Count(); i++ )
+ {
+ iObservers[i]->ConnectionStatusChange( 0, status, aError );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::RunError
+// If anything goes wrong.
+// -----------------------------------------------------------------------------
+//
+TInt CCRConnection::RunError( TInt aError )
+ {
+ LOG1( "CCRConnection::RunError: aError %d", aError );
+ ( void )aError; // Prevent compiler warning
+ iState = CCRConnection::EIdle;
+ iCurrentConnectionId = 0;
+ iBearerType = EBearerUnknown;
+ CloseRConnection();
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::CloseRConnection
+// -----------------------------------------------------------------------------
+//
+void CCRConnection::CloseRConnection()
+ {
+ LOG( "CCRConnection::CloseRConnection()" );
+
+ if ( iConnection.SubSessionHandle() )
+ {
+ iConnection.Close();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::Connection
+// Returns the connection.
+// -----------------------------------------------------------------------------
+//
+RConnection& CCRConnection::Connection ( void )
+ {
+ return iConnection;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::State
+// Returns state of connection.
+// -----------------------------------------------------------------------------
+//
+CCRConnection::TConnectionState CCRConnection::State( void ) const
+ {
+ return iState;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::BearerType
+// -----------------------------------------------------------------------------
+//
+TConnMonBearerType CCRConnection::BearerType() const
+ {
+ return iBearerType;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::RegisterObserver
+// -----------------------------------------------------------------------------
+//
+TInt CCRConnection::RegisterObserver( MCRConnectionObserver* aObserver )
+ {
+ LOG( "CCRConnection::RegisterObserver" );
+ return iObservers.Append( aObserver );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::UnregisterObserver
+// -----------------------------------------------------------------------------
+//
+TInt CCRConnection::UnregisterObserver( MCRConnectionObserver* aObserver )
+ {
+ LOG( "CCRConnection::UnregisterObserver" );
+ TInt pos = iObservers.Find( aObserver );
+ if ( pos < KErrNone )
+ {
+ return pos;
+ }
+
+ iObservers.Remove( pos );
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::GetHeuristic
+// -----------------------------------------------------------------------------
+//
+TBool CCRConnection::GetHeuristic( TConnectionHeuristic aHeuristic )
+ {
+ TInt bit( 1 << ( TInt )aHeuristic );
+ return ( TBool )( iHeuristics & bit );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::SetHeuristic
+// -----------------------------------------------------------------------------
+//
+void CCRConnection::SetHeuristic( TConnectionHeuristic aHeuristic, TBool aValue )
+ {
+ TInt mask( 1 << ( TInt )aHeuristic );
+ if ( aValue )
+ {
+ iHeuristics |= mask;
+ }
+ else
+ {
+ iHeuristics &= ~mask;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::EventL
+// -----------------------------------------------------------------------------
+//
+void CCRConnection::EventL( const CConnMonEventBase& aEvent )
+ {
+ // bearer change events
+ if( aEvent.EventType()==EConnMonBearerChange && iState==EOpen )
+ {
+ // IMPORTANT: EConnMonBearerChange event report changes in *some* connection, not
+ // necessarly ours and aEvent.ConnectionId() doest *not* contain plain 'connection id',
+ // it has 'bearer id'. So make a new bearertype query to make sure it's ours.
+ LOG2( "CCRConnection::EventL: bearer changed, id=%d, bearer=%d",
+ aEvent.ConnectionId(), ( ( CConnMonBearerChange* )( &aEvent) )->Bearer() );
+
+ // Cancel ongoing requests
+ if ( IsActive() )
+ {
+ Cancel();
+ }
+
+ iState = CCRConnection::EFindingBearer;
+ iConMon.GetIntAttribute( iCurrentConnectionId, 0, KBearer,
+ ( TInt& )iNewBearerType, iStatus );
+ SetActive();
+ }
+ // other unhandled events
+ else
+ {
+ LOG2( "CCRConnection::EventL: unknown event=%d, connection=%d",
+ aEvent.EventType(), aEvent.ConnectionId() );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::IsBearerWLANor3G
+// -----------------------------------------------------------------------------
+//
+TBool CCRConnection::IsBearerWLANor3G( TConnMonBearerType aBearer )
+ {
+ return aBearer == EBearerWCDMA || // from CIptvNetworkEngine::IsBearer3GOrWLAN,
+ aBearer == EBearerWLAN || // EBearerLAN is returned by emulator
+ aBearer == EBearerCDMA2000 ||
+ aBearer == EBearerLAN;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::MaximumBandwidth
+// -----------------------------------------------------------------------------
+//
+TInt CCRConnection::MaximumBandwidth()
+ {
+ // Determine bandwidth based on bearer or from ConnectionMonitor attributes
+ // (KMaximumBitrateDownlink, KGuaranteedBitrateDownlink) when QoS is supported
+ TConnMonBearerType bearer = BearerType();
+ TInt bandwidth( 0 );
+
+ switch( bearer )
+ {
+ case EBearerGPRS:
+ bandwidth = KCRBandwidthGPRS;
+ break;
+
+ case EBearerEdgeGPRS:
+ bandwidth = KCRBandwidthEdgeGPRS;
+ break;
+
+ case EBearerWCDMA:
+ bandwidth = KCRBandwidthWCDMA;
+ break;
+
+ case EBearerWLAN:
+ bandwidth = KCRBandwidthWLAN;
+ break;
+
+ case EBearerLAN:
+ bandwidth = KCRBandwidthLAN;
+ break;
+
+ default:
+ // None
+ break;
+ }
+
+ return bandwidth;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::FindApL
+// Request succesful completion.
+// -----------------------------------------------------------------------------
+//
+TInt CCRConnection::FindApL()
+ {
+ CloseRConnection();
+ TInt err( iConnection.Open( iSockServer ) );
+ if ( err )
+ {
+ LOG1( "CCRConnection::FindApL(), Open iConnection err: %d", err );
+ return err;
+ }
+
+ // Connections
+ TUint foundConnections( 0 );
+ err = iConnection.EnumerateConnections( foundConnections );
+ if ( err )
+ {
+ LOG1( "CCRConnection::FindApL(), EnumerateConnections fail: %d", err );
+ return err;
+ }
+
+ // Active connection found
+ TUint conId( 0 ); // connection id
+ TUint subId( 0 ); // subconnection id
+ TUint conToUse( 0 );
+ for ( TInt i( 1 ); i <= foundConnections && !err; i++ )
+ {
+ err = iConMon.GetConnectionInfo( i, conId, subId );
+ if ( !err && conId == iCurrentConnectionId )
+ {
+ conToUse = i;
+ i = foundConnections + 1; // break from loop
+ }
+ }
+ if ( err )
+ {
+ LOG1( "CCRConnection::FindApL() GetConnectionInfo loop err: %d", err );
+ return err;
+ }
+
+ // Connection info
+ TPckgBuf<TConnectionInfo> info;
+ err = iConnection.GetConnectionInfo( conToUse, info );
+ if ( err )
+ {
+ LOG1( "CCRConnection::FindApL(), GetConnectionInfo 2 fail: %d", err );
+ return err;
+ }
+
+ // Attach
+ err = iConnection.Attach( info, RConnection::EAttachTypeNormal );
+ if ( err )
+ {
+ LOG1( "CCRConnection::FindApL(), Attach failed: %d", err );
+ }
+
+ // Bearer type
+ iState = CCRConnection::EFindingBearer;
+ iBearerType = EBearerUnknown;
+ iConMon.GetIntAttribute(
+ iCurrentConnectionId, 0, KBearer, ( TInt& )iNewBearerType, iStatus );
+ SetActive();
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::FindBearerL
+// Request succesful completion.
+// -----------------------------------------------------------------------------
+//
+void CCRConnection::FindBearerL()
+ {
+ LOG2( "CCRConnection::FindBearerL(), iCurrentConnectionId: %d, iNewBearerType: %d",
+ iCurrentConnectionId, iNewBearerType );
+
+ iState = CCRConnection::EOpen;
+ TBool was3g( IsBearerWLANor3G( iBearerType ) );
+ TBool is3g( IsBearerWLANor3G( iNewBearerType ) );
+ TBool genChanged( was3g^is3g );
+ TBool justConnected( iBearerType == EBearerUnknown );
+ iBearerType = iNewBearerType;
+
+ // Notify if connection has just gone up
+ if ( justConnected )
+ {
+ // Broadcast IapUp&Running for observers
+ MCRConnectionObserver::TCRConnectionStatus status;
+ status = MCRConnectionObserver::ECRAttachCompleted;
+ for ( TInt i( 0 ); i < iObservers.Count(); i++ )
+ {
+ iObservers[i]->ConnectionStatusChange( 0, status, iStatus.Int() );
+ }
+ }
+
+ // Notify if connection has just gone up or generation changed
+ if ( genChanged )
+ {
+ // Broadcast IapUp&Running for observers
+ MCRConnectionObserver::TCRConnectionStatus status;
+ status = MCRConnectionObserver::ECRBearerChanged;
+ for( TInt i=0 ; i<iObservers.Count() ; i++ )
+ {
+ iObservers[i]->ConnectionStatusChange( 0, status, iStatus.Int() );
+ }
+ }
+ if ( iConnection.SubSessionHandle() )
+ {
+ // Request connection progress notifications from RConnection
+ iConMonProgressNotifyPending = ETrue;
+ iConnection.ProgressNotification( iNotification, iStatus );
+ SetActive();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRConnection::NotificationL
+// Request succesful completion.
+// -----------------------------------------------------------------------------
+//
+void CCRConnection::NotificationL()
+ {
+ TNifProgress notification = iNotification();
+ LOG2( "CCRConnection::NotificationL stage: %d err: %d",
+ ( TInt )( notification.iStage ), ( TInt )( notification.iError ) );
+
+ if ( notification.iError != KErrNone )
+ {
+ // Notify UI
+ iState = CCRConnection::EIdle;
+
+ MCRConnectionObserver::TCRConnectionStatus status;
+ status = MCRConnectionObserver::ECRIapDown;
+ for ( TInt i( 0 ); i < iObservers.Count(); i++ )
+ {
+ iObservers[i]->ConnectionStatusChange( 0, status, notification.iError );
+ }
+
+ if ( iConnection.SubSessionHandle() )
+ {
+ iConnection.CancelProgressNotification();
+ iConMonProgressNotifyPending = EFalse;
+ CloseRConnection();
+ }
+
+ iCurrentConnectionId = 0;
+ iBearerType = EBearerUnknown;
+ }
+ else
+ {
+ switch ( notification.iStage )
+ {
+ case KLinkLayerOpen:
+ // this means we're open
+ break;
+
+ case KConfigDaemonStartingDeregistration:
+ case KConfigDaemonUnloading:
+ case KConfigDaemonUnloaded:
+ case KLinkLayerClosed:
+ // And we're closed or closing
+ break;
+
+ default:
+ // Do nothing in rest of the cases
+ break;
+ }
+
+ if ( iConnection.SubSessionHandle() )
+ {
+ iConnection.ProgressNotification( iNotification, iStatus );
+ iConMonProgressNotifyPending = ETrue;
+ SetActive();
+ }
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCREngine.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,1592 @@
+/*
+* 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. In practice keeps count on*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <pathinfo.h>
+#include "VideoServiceUtilsConf.hrh"
+#include "CCREngine.h"
+#include "CCRStreamingSession.h"
+#include "CCRSession.h"
+#include "CCRClientInformer.h"
+#include "CCRConnection.h"
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+#include <ipvideo/CRtpUtil.h>
+#include <ipvideo/CRtpClipHandler.h>
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+#include <e32msgqueue.h>
+#include <ipvideo/CRTypeDefs.h>
+#include <e32std.h>
+#include <es_sock.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+const TUint KCRELoopbackPortStart( 1106 );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCREngine::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCREngine* CCREngine::NewL( void )
+ {
+ CCREngine* self = new( ELeave ) CCREngine();
+
+ // Use CleanupClosePushL to make sure the Close function defined in CObject
+ // base class gets called. CObject will delete itself once its reference count
+ // reaches zero. Using CleanupStack::PushL here results in E32USER-CBase panic 33
+ // if there is a leave somewhere in construction
+ CleanupClosePushL( *self );
+
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::CCREngine
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCREngine::CCREngine( void ) : iLoopbackPort( KCRELoopbackPortStart )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCREngine::ConstructL()
+ {
+ LOG( "CCREngine::ConstructL()" );
+
+ // Note, quite high priority
+ iCleanUp = new ( ELeave ) CAsyncCallBack( CActive::EPriorityStandard );
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::~CCREngine
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCREngine::~CCREngine()
+ {
+ LOG( "CCREngine::~CCREngine()" );
+
+ delete iCleanUp;
+ iSessions.ResetAndDestroy();
+ iSessionsToDelete.Reset();
+ delete iConnection;
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ delete iClipHandler;
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ iSockServer.Close();
+ delete iInformer;
+ delete iQueueName;
+ }
+
+// -----------------------------------------------------------------------------
+// Method for actual message handling.
+//
+// -----------------------------------------------------------------------------
+//
+void CCREngine::GeneralServiceL( const RMessage2& aMessage )
+ {
+#if defined( LIVE_TV_RDEBUG_TRACE ) || defined( LIVE_TV_FILE_TRACE )
+ if ( aMessage.Function() != ECRGetPosition )
+ {
+ LOG1( "CCREngine::GeneralService(), aMessage: %d", aMessage.Function() );
+ }
+#endif // LIVE_TV_RDEBUG_TRACE || LIVE_TV_FILE_TRACE
+
+ // Verify cababilities
+ VerifyCapabilitiesL( aMessage );
+
+ // Handle message
+ TInt err( KErrNone );
+ switch( aMessage.Function() )
+ {
+ case ECRSetIap:
+ {
+ TPckgBuf<SCRRtspIapParams> pckg;
+ Read( aMessage, 0, pckg );
+ err = SetConnectionId( pckg() );
+ aMessage.Complete( err );
+ }
+ break;
+
+ case ECRCancelSetIap:
+ aMessage.Complete( CancelSetConnectionId() );
+ break;
+
+ case ECRPlayRtspUrl:
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ TPckgBuf<SCRRtspParams> pckg1;
+ Read( aMessage, 1, pckg1 );
+ TRAP( err, pckg0() = PlayRtspUrlL( pckg1() ) );
+ if ( !err )
+ {
+ Write( aMessage, 0, pckg0 );
+ }
+ aMessage.Complete( err );
+ }
+ break;
+
+ case ECRPlayDvbhLive:
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ TPckgBuf<SCRLiveParams> pckg1;
+ Read( aMessage, 1, pckg1 );
+ TRAP( err, pckg0() = PlayDvbhLiveL( pckg1() ) );
+ if ( !err )
+ {
+ Write( aMessage, 0, pckg0 );
+ }
+ aMessage.Complete( err );
+ }
+ break;
+
+ case ECRChangeService:
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ TPckgBuf<SCRLiveParams> pckg1;
+ Read( aMessage, 0, pckg0 );
+ Read( aMessage, 1, pckg1 );
+ TRAP( err, pckg0() = ChangeDvbhServiceL( pckg0(), pckg1() ) );
+ if ( !err )
+ {
+ Write( aMessage, 0, pckg0 );
+ }
+ aMessage.Complete( err );
+ }
+ break;
+
+ case ECRPlayRtpFile:
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ TPckgBuf<SCRRtpPlayParams> pckg1;
+ Read( aMessage, 1, pckg1 );
+ TRAP( err, pckg0() = PlayRtpFileL( pckg1() ) );
+ if ( !err )
+ {
+ Write( aMessage, 0, pckg0 );
+ }
+ aMessage.Complete( err );
+ }
+ break;
+
+ case ECRPlayRtpHandle:
+ {
+ RFile fileHandle;
+ err = fileHandle.AdoptFromClient( aMessage, 1, 2 );
+ if ( !err )
+ {
+ TPckgBuf<TUint> pckg( 0 );
+ TRAP( err, pckg() = PlayRtpFileL( fileHandle ) );
+ if ( !err )
+ {
+ Write( aMessage, 0, pckg );
+ }
+ }
+ fileHandle.Close();
+ aMessage.Complete( err );
+ }
+ break;
+
+ case ECRRecordCurrentStream:
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ Read( aMessage, 0, pckg0 );
+ TPckgBuf<SCRRecordParams> pckg1;
+ Read( aMessage, 1, pckg1 );
+ TRAP( err, RecordCurrentStreamL( pckg0(), pckg1() ) );
+ aMessage.Complete( err );
+ }
+ break;
+
+ case ECRRecordRtspStream:
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ TPckgBuf<SCRRtspParams> pckg1;
+ Read( aMessage, 1, pckg1 );
+ TPckgBuf<SCRRecordParams> pckg2;
+ Read( aMessage, 2, pckg2 );
+ TRAP( err, pckg0() = RecordRtspStreamL( pckg1(), pckg2() ) );
+ aMessage.Complete( err );
+ }
+ break;
+
+ case ECRRecordDvbhStream:
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ TPckgBuf<SCRLiveParams> pckg1;
+ Read( aMessage, 1, pckg1 );
+ TPckgBuf<SCRRecordParams> pckg2;
+ Read( aMessage, 2, pckg2 );
+ TRAP( err, pckg0() = RecordDvbhStreamL( pckg1(), pckg2() ) );
+ aMessage.Complete( err );
+ }
+ break;
+
+ case ECRPauseRecordStream:
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ Read( aMessage, 0, pckg0 );
+ TPckgBuf<TBool> pckg1( 0 );
+ Read( aMessage, 1, pckg1 );
+ aMessage.Complete( PauseRecordStream( pckg0(), pckg1() ) );
+ }
+ break;
+
+ case ECRStopRecordStream:
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ Read( aMessage, 0, pckg0 );
+ aMessage.Complete( StopRecordStream( pckg0() ) );
+ }
+ break;
+
+ case ECRStartTimeShift:
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ TPckgBuf<TUint> pckg1( 0 );
+ Read( aMessage, 1, pckg1 );
+ TRAP( err, pckg0() = StartTimeShiftL( pckg1() ) );
+ if ( !err )
+ {
+ Write( aMessage, 0, pckg0 );
+ }
+ aMessage.Complete( err );
+ }
+ break;
+
+ case ECRStopTimeShift:
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ TPckgBuf<TUint> pckg1( 0 );
+ Read( aMessage, 0, pckg0 );
+ Read( aMessage, 1, pckg1 );
+ aMessage.Complete( StopTimeShift( pckg0(), pckg1() ) );
+ }
+ break;
+
+ case ECRPlayCommand:
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ Read( aMessage, 0, pckg0 );
+ TPckgBuf<TInt64> pckg1( 0 );
+ Read( aMessage, 1, pckg1 );
+ TPckgBuf<TInt64> pckg2( 0 );
+ Read( aMessage, 2, pckg2 );
+ aMessage.Complete( PlayCommand( pckg0(), pckg1(), pckg2() ) );
+ }
+ break;
+
+ case ECRPauseCommand:
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ Read( aMessage, 0, pckg0 );
+ aMessage.Complete( PauseCommand( pckg0() ) );
+ }
+ break;
+
+ case ECRStopCommand:
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ Read( aMessage, 0, pckg0 );
+ aMessage.Complete( StopCommand( pckg0() ) );
+ }
+ break;
+
+ case ECRSetPosition:
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ Read( aMessage, 0, pckg0 );
+ TPckgBuf<TInt64> pckg1( 0 );
+ Read( aMessage, 1, pckg1 );
+ err = SetPosition( pckg0(), pckg1() );
+ aMessage.Complete( err );
+ }
+ break;
+
+ case ECRGetPosition:
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ Read( aMessage, 0, pckg0 );
+ TPckgBuf<TInt64> pckg1( 0 );
+ Read( aMessage, 1, pckg1 );
+ TPckgBuf<TInt64> pckg2( 0 );
+ err = GetPosition( pckg0(), pckg1(), pckg2() );
+ Write( aMessage, 1, pckg1 );
+ Write( aMessage, 2, pckg2 );
+ aMessage.Complete( err );
+ }
+ break;
+
+ case ECRCloseSession:
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ Read( aMessage, 0, pckg0 );
+ aMessage.Complete( CloseSession( pckg0() ) );
+ }
+ break;
+
+ case ECRPlayNullSource:
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ TRAP( err, pckg0() = PlayNullSourceL() );
+ Write( aMessage, 0, pckg0 );
+ aMessage.Complete( err );
+ }
+ break;
+
+ case ECRPlayRtspUrlToNullSink:
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ TPckgBuf<SCRRtspParams> pckg1;
+ Read( aMessage, 1, pckg1 );
+ TRAP( err, pckg0() = PlayRtspUrlToNullSinkL( pckg1() ) );
+ Write( aMessage, 0, pckg0 );
+ aMessage.Complete( err );
+ }
+ break;
+
+ default:
+ aMessage.Complete( KErrNotSupported );
+ break;
+ }
+ }
+
+//-----------------------------------------------------------------------------
+// CCREngine::SessionStop()
+// So, a session wants to quit. we can't just delete it here as return.
+// Statement would then take us to deleted instance: put up a cleanup
+// CAsyncCallBack and return.
+//-----------------------------------------------------------------------------
+//
+void CCREngine::SessionStop( CCRStreamingSession* aSession )
+ {
+ LOG1( "CCREngine::SessionStop(), Delete count: %d", iSessionsToDelete.Count() );
+
+ // InsertInAddressOrder checks for duplicate, if there is already
+ // entry for that session, the array will remain unchanged
+ TRAPD( err, iSessionsToDelete.InsertInAddressOrderL( aSession ) );
+ if ( err )
+ {
+ LOG1( "CCREngine::SessionStop(), InsertInAddressOrder leaved: %d", err );
+ }
+
+ // If not already active and sessions to delete?
+ if ( !iCleanUp->IsActive() && iSessionsToDelete.Count() )
+ {
+ TCallBack cb( SessionStopCallBack, this );
+ iCleanUp->Set( cb );
+ iCleanUp->CallBack();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::ConnectionStatusChange
+//
+// -----------------------------------------------------------------------------
+//
+void CCREngine::ConnectionStatusChange(
+ TInt aSessionId,
+ TCRConnectionStatus aStatus,
+ TInt aErr )
+ {
+ LOG3( "CCREngine::ConnectionStatusChange(), aSessionId: %d, aStatus: %d, Error: %d",
+ aSessionId, aStatus, aErr );
+
+ SCRQueueEntry entry = { ECRMsgQueueConnectionError, KErrNone };
+ entry.iSessionId = aSessionId;
+
+ switch ( aStatus )
+ {
+ case ECRConnectionError:
+ {
+ entry.iMsg = ECRMsgQueueConnectionError;
+ entry.iErr = aErr;
+ }
+ break;
+
+ case ECRAuthenticationNeeded:
+ {
+ entry.iMsg = ECRMsgQueueAuthenticationNeeded;
+ entry.iErr = KErrNone;
+ }
+ break;
+
+ case ECRNotEnoughBandwidth:
+ {
+ entry.iMsg = ECRMsgQueueNotEnoughBandwidth;
+ entry.iErr = KErrNone;
+ }
+ break;
+
+ case ECRNormalEndOfStream:
+ {
+ entry.iMsg = ECRMsgQueueNormalEndOfStream;
+ entry.iErr = aErr;
+ }
+ break;
+
+ case ECRAttachCompleted: // fall through
+ case ECRSwitchingToTcp:
+ {
+ aStatus == ECRAttachCompleted ?
+ ( entry.iMsg = ECRMsgQueueAttachCompleted ) :
+ ( entry.iMsg = ECRMsgQueueSwitchingToTcp );
+
+ if ( aErr == KErrNone )
+ {
+ // Releasing RSocket takes almost 40 seconds so we need
+ // to always use different port number, otherwise an
+ // "Already in use" error will be occurred.
+ TTime now;
+ now.UniversalTime();
+ TInt port = KCRELoopbackPortStart + now.DateTime().Second();
+ iLoopbackPort == port ? ( iLoopbackPort = port + 1 ) :
+ ( iLoopbackPort = port );
+
+ // Loopback port for VIA
+ entry.iErr = iLoopbackPort;
+ }
+ else
+ {
+ entry.iErr = aErr;
+ }
+ }
+ break;
+
+ case ECRStreamIsLiveStream:
+ {
+ entry.iMsg = ECRMsgQueueStreamIsLiveStream;
+ entry.iErr = aErr;
+ }
+ break;
+
+ case ECRStreamIsRealMedia:
+ {
+ entry.iMsg = ECRMsgQueueStreamIsRealMedia;
+ entry.iErr = aErr;
+ }
+ break;
+
+ case ECRBearerChanged:
+ {
+ // Nobody is interested about this on the other side...
+ return;
+ }
+
+ case ECRTestSinkData:
+ {
+ entry.iMsg = ECRMsgQueueTestSinkData;
+ entry.iErr = aErr;
+ }
+ break;
+
+ case ECRSdpAvailable:
+ {
+ entry.iMsg = ECRMsgQueueSdpAvailable;
+ entry.iErr = aErr;
+ }
+ break;
+
+ case ECRReadyToSeek:
+ {
+ entry.iMsg = ECRMsgQueueReadyToSeek;
+ entry.iErr = aErr;
+ }
+ break;
+
+ case ECRRecordingStarted:
+ {
+ entry.iMsg = ECRMsgQueueRecordingStarted;
+ entry.iErr = aErr;
+ }
+ break;
+
+ case ECRRecordingPaused:
+ {
+ entry.iMsg = ECRMsgQueueRecordingPaused;
+ entry.iErr = aErr;
+ }
+ break;
+
+ case ECRRecordingEnded:
+ {
+ entry.iMsg = ECRMsgQueueRecordingEnded;
+ entry.iErr = aErr;
+ }
+ break;
+
+ default:
+ // None
+ break;
+ }
+
+ if ( iQueueName && iInformer )
+ {
+ iInformer->SendMessage( iQueueName->Des(), entry );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::VerifyCapabilitiesL
+// Checks capabilities of user of DVR API.
+// -----------------------------------------------------------------------------
+//
+void CCREngine::VerifyCapabilitiesL( const RMessage2& aMessage )
+ {
+ if ( !aMessage.HasCapability( ECapabilityNetworkServices,
+ __PLATSEC_DIAGNOSTIC_STRING( "NetworkServices" ) ) )
+ {
+ LOG( "CCREngine::VerifyRbfCapabilitiesL(), Missing: NetworkServices !" );
+ User::Leave( KErrPermissionDenied );
+ }
+
+ if ( !aMessage.HasCapability( ECapabilityReadUserData,
+ __PLATSEC_DIAGNOSTIC_STRING( "ReadUserData" ) ) )
+ {
+ LOG( "CCREngine::VerifyRbfCapabilitiesL(), Missing: ReadUserData !" );
+ User::Leave( KErrPermissionDenied );
+ }
+
+ if ( !aMessage.HasCapability( ECapabilityWriteUserData,
+ __PLATSEC_DIAGNOSTIC_STRING( "WriteUserData" ) ) )
+ {
+ LOG( "CCREngine::VerifyRbfCapabilitiesL(), Missing: WriteUserData !" );
+ User::Leave( KErrPermissionDenied );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::SetConnectionId
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCREngine::SetConnectionId( const SCRRtspIapParams& aIap )
+ {
+ LOG( "CCREngine::SetConnectionId() in" );
+
+ TRAPD ( err, CreateConnectionL() ) ;
+ if ( err == KErrNone )
+ {
+ delete iQueueName; iQueueName = NULL;
+ TRAP( err, iQueueName = aIap.iQueueName.AllocL() );
+ if ( err == KErrNone )
+ {
+ iConnection->Attach( aIap.iConnectionId );
+ }
+
+ }
+ LOG1( "CCREngine::SetConnectionId() out, err: %d", err );
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::CancelSetConnectionId
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCREngine::CancelSetConnectionId()
+ {
+ LOG( "CCREngine::CancelSetConnectionId() in" );
+
+ TInt err( KErrNone );
+ if ( iConnection )
+ {
+ iSessions.ResetAndDestroy();
+ delete iConnection; iConnection = NULL;
+ iSockServer.Close();
+ err = iSockServer.Connect( KESockDefaultMessageSlots * 3 );
+ if ( err == KErrNone )
+ {
+ TRAP( err, iConnection = CCRConnection::NewL( iSockServer ) );
+ if ( err == KErrNone && iConnection )
+ {
+ err = iConnection->RegisterObserver( this );
+ }
+ }
+ }
+
+ LOG1( "CCREngine::CancelSetConnectionId() out, err: %d", err );
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::PlayRtspUrlL
+// Go through stream sessions and try to find if given url is already playing.
+// If not, create new RTSP session and add sink to it.
+// -----------------------------------------------------------------------------
+//
+TUint CCREngine::PlayRtspUrlL( const SCRRtspParams& aRtspParams )
+ {
+ LOG( "CCREngine::PlayRtspUrlL() in" );
+
+ const TInt sessionIndex( VerifyRtspSessionL( aRtspParams ) );
+ iSessions[sessionIndex]->CreateRtspSinkL( iLoopbackPort );
+ TUint sessionChk( iSessions[sessionIndex]->SourceChecksum() );
+ LOG1( "CCREngine::PlayRtspUrlL() out, sessionChk: %d", sessionChk );
+ return sessionChk;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::PlayDvbhLiveL
+// Go through stream sessions and try to find if current service is already
+// If not, create new DVB-H session and add sink to it.
+// -----------------------------------------------------------------------------
+//
+TUint CCREngine::PlayDvbhLiveL( const SCRLiveParams& aLiveParams )
+ {
+ LOG( "CCREngine::PlayDvbhLiveL() in" );
+
+ const TInt sessionIndex( VerifyDvbhSessionL( aLiveParams ) );
+ iSessions[sessionIndex]->CreateXpsSinkL();
+ iSessions[sessionIndex]->PostActionL();
+ TUint sessionChk( iSessions[sessionIndex]->SourceChecksum() );
+ LOG1( "CCREngine::PlayDvbhLiveL() out, sessionChk: %d", sessionChk );
+ return sessionChk;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::ChangeDvbhServiceL
+// Go through stream sessions and try to find if current service is already
+// If not, create new DVB-H session and add sink to it.
+// -----------------------------------------------------------------------------
+//
+TUint CCREngine::ChangeDvbhServiceL(
+ const TUint aSessionChk,
+ const SCRLiveParams& aLiveParams )
+ {
+ LOG( "CCREngine::ChangeDvbhServiceL() in" );
+
+ // Verify exist session
+ const TInt currentSession( VerifySession( aSessionChk ) );
+ User::LeaveIfError( currentSession );
+
+ // Can't perform if recording or timeshift ongoing
+ if ( iSessions[currentSession]->ClipHandlerUsed() )
+ {
+ User::Leave( KErrInUse );
+ }
+
+ // New session for new service
+ const TInt sessionIndex( VerifyDvbhSessionL( aLiveParams ) );
+ if ( sessionIndex == currentSession )
+ {
+ // Same service, no actions
+ return aSessionChk;
+ }
+
+ // Stop sockets of DVB-H source (filters released)
+ User::LeaveIfError( iSessions[currentSession]->StopCommand() );
+
+ // Transfer ownership of existing XPS sink to a new session
+ User::LeaveIfError( iSessions[currentSession]->TransferSink(
+ CCRStreamingSession::ECRXpsSinkId, *iSessions[sessionIndex] ) );
+ iSessions[sessionIndex]->PostActionL();
+ TUint sessionChk( iSessions[sessionIndex]->SourceChecksum() );
+
+ // Delete existing unused session
+ SessionStop( iSessions[currentSession] );
+ LOG1( "CCREngine::ChangeDvbhServiceL() out, sessionChk: %d", sessionChk );
+ return sessionChk;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::PlayRtpFileL
+//
+// -----------------------------------------------------------------------------
+//
+TUint CCREngine::PlayRtpFileL( const SCRRtpPlayParams& aRtpParams )
+ {
+ LOG( "CCREngine::PlayRtpFileL() in" );
+
+ const TInt sessionIndex( VerifyRtpFileSessionL( aRtpParams ) );
+ iSessions[sessionIndex]->CreateXpsSinkL();
+ iSessions[sessionIndex]->PostActionL();
+ TUint sessionChk( iSessions[sessionIndex]->SourceChecksum() );
+ LOG1( "CCREngine::PlayRtpFileL() out, sessionChk: %d", sessionChk );
+ return sessionChk;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::PlayRtpFileL
+//
+// -----------------------------------------------------------------------------
+//
+TUint CCREngine::PlayRtpFileL( const RFile& aFileHandle )
+ {
+ LOG( "CCREngine::PlayRtpFileL() in, with hadle" );
+
+ TInt sessionIndex( VerifyRtpFileSessionL( aFileHandle ) );
+ iSessions[sessionIndex]->CreateXpsSinkL();
+ iSessions[sessionIndex]->PostActionL();
+ TUint sessionChk( iSessions[sessionIndex]->SourceChecksum() );
+ LOG1( "CCREngine::PlayRtpFileL() out, sessionChk: %d", sessionChk );
+ return sessionChk;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::RecordCurrentStreamL
+//
+// -----------------------------------------------------------------------------
+//
+void CCREngine::RecordCurrentStreamL(
+ const TUint aSessionChk,
+ const SCRRecordParams& aRecordParams )
+ {
+ LOG1( "CCREngine::StartRecordStreamL() in, aSessionChk: %d", aSessionChk );
+
+ // Verify session
+ const TInt sessionIndex( VerifySession( aSessionChk ) );
+
+ // Session exist?
+ if ( sessionIndex > KErrNotFound )
+ {
+ CreateRecordingSinkL( sessionIndex, aRecordParams );
+ iSessions[sessionIndex]->PostActionL();
+ }
+
+ LOG1( "CCREngine::StartRecordStreamL() out, sessionIndex: %d", sessionIndex );
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::RecordRtspStreamL
+//
+// -----------------------------------------------------------------------------
+//
+TUint CCREngine::RecordRtspStreamL(
+ const SCRRtspParams& aRtspParams,
+ const SCRRecordParams& aRecordParams )
+ {
+ LOG( "CCREngine::RecordRtspStreamL() in" );
+
+ // Verify session
+ const TInt sessionIndex( VerifyRtspSessionL( aRtspParams ) );
+
+ // Recording sink
+ CreateRecordingSinkL( sessionIndex, aRecordParams );
+ TUint sessionChk( iSessions[sessionIndex]->SourceChecksum() );
+ LOG1( "CCREngine::RecordRtspStreamL() out, sessionChk: %d", sessionChk );
+ return sessionChk;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::RecordDvbhStreamL
+//
+// -----------------------------------------------------------------------------
+//
+TUint CCREngine::RecordDvbhStreamL(
+ const SCRLiveParams& aLiveParams,
+ const SCRRecordParams& aRecordParams )
+ {
+ LOG( "CCREngine::RecordDvbhStreamL() in" );
+
+ // Verify session
+ const TInt sessionIndex( VerifyDvbhSessionL( aLiveParams ) );
+
+ // Recording sink
+ CreateRecordingSinkL( sessionIndex, aRecordParams );
+ iSessions[sessionIndex]->PostActionL();
+ TUint sessionChk( iSessions[sessionIndex]->SourceChecksum() );
+ LOG1( "CCREngine::RecordDvbhStreamL() out, sessionChk: %d", sessionChk );
+ return sessionChk;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::PauseRecordStream
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCREngine::PauseRecordStream( const TUint aSessionChk, const TBool& aStart )
+ {
+ LOG2( "CCREngine::PauseRecordStream() in, aSessionChk: %d, aStart: %d",
+ aSessionChk, aStart );
+ // Verify session
+ const TInt sessionIndex( VerifySession( aSessionChk ) );
+
+ // Session exist?
+ if ( sessionIndex > KErrNotFound )
+ {
+ TInt err( KErrNone );
+ if ( aStart )
+ {
+ // Clip format not known, so all types must try to pause
+ err = iSessions[sessionIndex]->PauseCommand(
+ CCRStreamingSession::ECRRtpRecSinkId );
+ if ( err == KErrCompletion )
+ {
+ err = iSessions[sessionIndex]->PauseCommand(
+ CCRStreamingSession::ECR3gpRecSinkId );
+ }
+
+ ConnectionStatusChange( aSessionChk, ECRRecordingPaused, err );
+ }
+ else
+ {
+ // Clip format not known, so all types must try to pause
+ err = iSessions[sessionIndex]->RestoreCommand(
+ CCRStreamingSession::ECRRtpRecSinkId );
+ if ( err == KErrCompletion )
+ {
+ err = iSessions[sessionIndex]->RestoreCommand(
+ CCRStreamingSession::ECR3gpRecSinkId );
+ }
+
+ ConnectionStatusChange( aSessionChk, ECRRecordingStarted, err );
+ }
+
+ LOG1( "CCREngine::PauseRecordStream() out, err: %d", err );
+ return err;
+ }
+
+ LOG1( "CCREngine::PauseRecordStream() out, sessionIndex: %d", sessionIndex );
+ return sessionIndex;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::StopRecordStream
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCREngine::StopRecordStream( const TUint aSessionChk )
+ {
+ LOG1( "CCREngine::StopRecordStream() in, aSessionChk: %d", aSessionChk );
+
+ // Verify session
+ const TInt sessionIndex( VerifySession( aSessionChk ) );
+
+ // Session exist?
+ if ( sessionIndex > KErrNotFound )
+ {
+ // Clip format not known, so all types must try to stop
+ iSessions[sessionIndex]->StopCommand(
+ CCRStreamingSession::ECRRtpRecSinkId );
+ iSessions[sessionIndex]->StopCommand(
+ CCRStreamingSession::ECR3gpRecSinkId );
+ // Possible error(s) ignored
+ }
+
+ LOG1( "CCREngine::StopRecordStream() out, sessionIndex: %d", sessionIndex );
+ return sessionIndex;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::StartTimeShift
+// Existing stream play will be splitted to two sessions. Existing source will
+// be directed to recording and existing sink will get new source from playback.
+// -----------------------------------------------------------------------------
+//
+TInt CCREngine::StartTimeShiftL( const TUint aSessionChk )
+ {
+ LOG1( "CCREngine::StartTimeShiftL() in, aSessionChk: %d", aSessionChk );
+
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+
+ // Verify session
+ const TInt currentSession( VerifySession( aSessionChk ) );
+ User::LeaveIfError( currentSession );
+
+ // Initial time shift clip name
+ TPath initialName( KDvrTimeShiftFile );
+ initialName.AppendNum( 0 );
+
+ // RTP clip handler
+ CreateClipHandlerL();
+
+ // Start recording of stream
+ SCRRecordParams recordParams;
+ recordParams.iFileName.Set( initialName );
+ recordParams.iFormat = ECRRecordTimeShift;
+ iSessions[currentSession]->CreateRtpRecordSinkL( recordParams, iClipHandler );
+ iSessions[currentSession]->PostActionL();
+
+ // Create new session for time shift clip playback
+ SCRRtpPlayParams params;
+ params.iFileName = initialName;
+ const TInt timeShiftSession( VerifyRtpFileSessionL( params ) );
+ iSessions[timeShiftSession]->PostActionL();
+
+ // Transfer ownership of existing XPS sink to a new session
+ User::LeaveIfError( iSessions[currentSession]->TransferSink(
+ CCRStreamingSession::ECRXpsSinkId, *iSessions[timeShiftSession] ) );
+
+ // Session checksum
+ TUint sessionChk( iSessions[timeShiftSession]->SourceChecksum() );
+ LOG1( "CCREngine::StartTimeShiftL() out, sessionChk: %d", sessionChk );
+ return sessionChk;
+
+#else // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ ( void )aSessionChk;
+ return KErrNotSupported;
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::StopTimeShift
+// Streaming is set back to one session. Streaming orginal source stays and sink
+// from temporary playback will be moved back to orginal session.
+// -----------------------------------------------------------------------------
+//
+TInt CCREngine::StopTimeShift(
+ const TUint aTimeShiftChk,
+ const TUint aCurrentChk )
+ {
+ LOG2( "CCREngine::StopTimeShift() in, aTimeShiftChk: %d, aCurrentChk: %d",
+ aTimeShiftChk, aCurrentChk );
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+
+ // Verify session
+ int ret( KErrNotFound );
+ const TInt currentSession( VerifySession( aCurrentChk ) );
+ const TInt timeShiftSession( VerifySession( aTimeShiftChk ) );
+
+ // Session exist?
+ if ( currentSession > KErrNotFound && timeShiftSession > KErrNotFound )
+ {
+ // Stop time shift clip recording
+ iSessions[currentSession]->StopCommand(
+ CCRStreamingSession::ECR3gpRecSinkId );
+
+ // Stop time shift clip playback
+ iSessions[timeShiftSession]->StopCommand();
+
+ // Transfer ownership of existing XPS sink back to the old session
+ ret = iSessions[timeShiftSession]->TransferSink(
+ CCRStreamingSession::ECRXpsSinkId, *iSessions[currentSession] );
+
+ // Delete second session
+ SessionStop( iSessions[timeShiftSession] );
+ }
+
+ // Clip handler not needed any longer
+ DeleteClipHandler( currentSession );
+
+ LOG1( "CCREngine::StopTimeShift() out, ret: %d", ret );
+ return ret;
+
+#else // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ ( void )aTimeShiftChk;
+ ( void )aCurrentChk;
+ return KErrNotSupported;
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::PlayCommand
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCREngine::PlayCommand(
+ const TUint aSessionChk,
+ const TReal aStartPos,
+ const TReal aEndPos )
+ {
+ LOG1( "CCREngine::PlayCommand(), aSessionChk: %d", aSessionChk );
+
+ // Verify session
+ const TInt sessionIndex( VerifySession( aSessionChk ) );
+
+ // New session needed?
+ if ( sessionIndex > KErrNotFound )
+ {
+ return iSessions[sessionIndex]->PlayCommand( aStartPos, aEndPos );
+ }
+
+ return KErrNotReady;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::PauseCommand
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCREngine::PauseCommand( const TUint aSessionChk )
+ {
+ LOG1( "CCREngine::PauseCommand(), aSessionChk: %d", aSessionChk );
+
+ // Verify session
+ const TInt sessionIndex( VerifySession( aSessionChk ) );
+
+ // New session needed?
+ if ( sessionIndex > KErrNotFound )
+ {
+ return iSessions[sessionIndex]->PauseCommand();
+ }
+
+ return KErrNotReady;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::StopCommand
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCREngine::StopCommand( const TUint aSessionChk )
+ {
+ LOG1( "CCREngine::StopCommand(), aSessionChk: %d", aSessionChk );
+
+ // Verify session
+ const TInt sessionIndex( VerifySession( aSessionChk ) );
+
+ // New session needed?
+ if ( sessionIndex > KErrNotFound )
+ {
+ return iSessions[sessionIndex]->StopCommand();
+ }
+
+ return KErrNotReady;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::SetPosition
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCREngine::SetPosition(
+ const TUint aSessionChk,
+ const TInt64 aPosition )
+ {
+ LOG1( "CCREngine::SetPosition(), aSessionChk: %d", aSessionChk );
+
+ const TInt sessionIndex( VerifySession( aSessionChk ) );
+ if ( sessionIndex > KErrNotFound )
+ {
+ return iSessions[sessionIndex]->SetPosition( aPosition );
+ }
+
+ return KErrNotReady;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::GetPosition
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCREngine::GetPosition(
+ const TUint aSessionChk,
+ TInt64& aPosition,
+ TInt64& aDuration )
+ {
+ const TInt sessionIndex( VerifySession( aSessionChk ) );
+ if ( sessionIndex > KErrNotFound )
+ {
+ return iSessions[sessionIndex]->GetPosition( aPosition, aDuration );
+ }
+
+ return KErrNotReady;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::CloseSession
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCREngine::CloseSession( const TUint aSessionChk )
+ {
+ LOG1( "CCREngine::CloseSession(), aSessionChk: %d", aSessionChk );
+
+ // Verify session
+ const TInt sessionIndex( VerifySession( aSessionChk ) );
+ if ( sessionIndex > KErrNotFound )
+ {
+ SessionStop( iSessions[sessionIndex] );
+ }
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::PlayNullSourceL
+//
+// -----------------------------------------------------------------------------
+//
+TUint CCREngine::PlayNullSourceL()
+ {
+ LOG( "CCREngine::PlayNullSourceL() in" );
+
+ _LIT( KNullSourceClip, "NullSource.rtp" );
+ TFileName nullSourcePath;
+#if ( defined( __WINS__ ) || defined( __WINSCW__ ) )
+ nullSourcePath = PathInfo::PhoneMemoryRootPath();
+#else // __WINS__ || __WINSCW__
+ nullSourcePath = PathInfo::MemoryCardRootPath();
+#endif // __WINS__ || __WINSCW__
+ nullSourcePath.Append( KNullSourceClip );
+
+ TInt sessionIndex( VerifySession( nullSourcePath ) );
+ if ( sessionIndex == KErrNotFound )
+ {
+ CCRStreamingSession* session = CCRStreamingSession::NewL(
+ iSockServer, iConnection, *this );
+ CleanupStack::PushL( session );
+ User::LeaveIfError( iSessions.Append( session ) );
+ CleanupStack::Pop( session );
+
+ // Only one source per session
+ sessionIndex = iSessions.Count() - 1;
+ iSessions[sessionIndex]->OpenSourceL( nullSourcePath );
+ }
+
+ iSessions[sessionIndex]->CreateXpsSinkL();
+ //iSessions[sessionIndex]->CreateNullSinkL();
+ iSessions[sessionIndex]->PostActionL();
+ TUint sessionChk( iSessions[sessionIndex]->SourceChecksum() );
+ LOG1( "CCREngine::PlayNullSourceL() out, sessionChk: %d", sessionChk );
+ return sessionChk;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::PlayRtspUrlToNullSinkL
+//
+// -----------------------------------------------------------------------------
+//
+TUint CCREngine::PlayRtspUrlToNullSinkL( const SCRRtspParams& aRtspParams )
+ {
+ LOG( "CCREngine::PlayRtspUrlToNullSinkL() in" );
+
+ const TInt sessionIndex( VerifyRtspSessionL( aRtspParams ) );
+ iSessions[sessionIndex]->CreateNullSinkL();
+ TUint sessionChk( iSessions[sessionIndex]->SourceChecksum() );
+ LOG1( "CCREngine::PlayRtspUrlToNullSinkL() out, sessionChk: %d", sessionChk );
+ return sessionChk;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::CreateConnectionL
+//
+// -----------------------------------------------------------------------------
+//
+void CCREngine::CreateConnectionL( void )
+ {
+ LOG( "CCREngine::CreateConnectionL() in" );
+
+ if ( iConnection == NULL )
+ {
+ User::LeaveIfError( iSockServer.Connect( KESockDefaultMessageSlots * 3 ) );
+ iConnection = CCRConnection::NewL( iSockServer );
+ User::LeaveIfError( iConnection->RegisterObserver( this ) );
+
+ // Informer
+ if ( iInformer == NULL )
+ {
+ iInformer = CCRClientInformer::NewL();
+ }
+ }
+
+ LOG( "CCREngine::CreateConnectionL() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::CreateClipHandlerL
+//
+// -----------------------------------------------------------------------------
+//
+void CCREngine::CreateClipHandlerL( void )
+ {
+ LOG1( "CCREngine::CreateClipHandlerL(), iClipHandler: %d", iClipHandler );
+
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+
+ if ( !iClipHandler )
+ {
+ iClipHandler = CRtpClipHandler::NewL();
+ }
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::VerifyRtspSessionL
+// Go through stream sessions and try to find if RTSP stream is already playing.
+// -----------------------------------------------------------------------------
+//
+TInt CCREngine::VerifyRtspSessionL( const SCRRtspParams& aRtspParams )
+ {
+ TInt sessionIndex( VerifySession( aRtspParams.iUrl ) );
+
+ // New session needed?
+ if ( sessionIndex == KErrNotFound )
+ {
+ CCRStreamingSession* session = CCRStreamingSession::NewL(
+ iSockServer, iConnection, *this );
+ CleanupStack::PushL( session );
+ User::LeaveIfError( iSessions.Append( session ) );
+ CleanupStack::Pop( session );
+
+ // Only one source per session
+ sessionIndex = iSessions.Count() - 1;
+ iSessions[sessionIndex]->OpenSourceL( aRtspParams, aRtspParams.iUrl );
+ }
+
+ User::LeaveIfError( sessionIndex );
+ return sessionIndex;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::VerifyDvbhSessionL
+// Go through stream sessions and try to find if DVB-H live is already playing.
+// -----------------------------------------------------------------------------
+//
+TInt CCREngine::VerifyDvbhSessionL( const SCRLiveParams& aLiveParams )
+ {
+ // Verify session
+ HBufC* definition = HBufC::NewLC( aLiveParams.iSdpData.Length() );
+ definition->Des().Copy( aLiveParams.iSdpData );
+ TInt sessionIndex( VerifySession( *definition ) );
+
+ // New session needed?
+ if ( sessionIndex == KErrNotFound )
+ {
+ CCRStreamingSession* session = CCRStreamingSession::NewL(
+ iSockServer, iConnection, *this );
+ CleanupStack::PushL( session );
+ User::LeaveIfError( iSessions.Append( session ) );
+ CleanupStack::Pop( session );
+
+ // Only one source per session
+ sessionIndex = iSessions.Count() - 1;
+ iSessions[sessionIndex]->OpenSourceL( aLiveParams, *definition );
+ }
+
+ CleanupStack::PopAndDestroy( definition );
+ User::LeaveIfError( sessionIndex );
+ return sessionIndex;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::VerifyRtpFileSessionL
+// Go through stream sessions and try to find if RTP clip is already playing.
+// -----------------------------------------------------------------------------
+//
+TInt CCREngine::VerifyRtpFileSessionL( const SCRRtpPlayParams& aRtpParams )
+ {
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+
+ // Verify session
+ TInt sessionIndex( VerifySession( aRtpParams.iFileName ) );
+
+ // New session needed?
+ if ( sessionIndex == KErrNotFound )
+ {
+
+ CCRStreamingSession* session = CCRStreamingSession::NewL(
+ iSockServer, iConnection, *this );
+ CleanupStack::PushL( session );
+ User::LeaveIfError( iSessions.Append( session ) );
+ CleanupStack::Pop( session );
+
+ // RTP clip handler
+ CreateClipHandlerL();
+
+ // Only one source per session
+ sessionIndex = iSessions.Count() - 1;
+ iSessions[sessionIndex]->OpenSourceL( aRtpParams, iClipHandler,
+ aRtpParams.iFileName );
+ }
+
+ User::LeaveIfError( sessionIndex );
+ return sessionIndex;
+
+#else // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ ( void )aRtpParams;
+ return KErrNotSupported;
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::VerifyRtpFileSessionL
+// Go through stream sessions and try to find if RTP clip is already playing.
+// -----------------------------------------------------------------------------
+//
+TInt CCREngine::VerifyRtpFileSessionL( const RFile& aFileHandle )
+ {
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+
+ TFileName fileName( KNullDesC );
+ aFileHandle.FullName( fileName );
+ TInt sessionIndex( VerifySession( fileName ) );
+
+ // New session needed?
+ if ( sessionIndex == KErrNotFound )
+ {
+ CCRStreamingSession* session = CCRStreamingSession::NewL(
+ iSockServer, iConnection, *this );
+ CleanupStack::PushL( session );
+ User::LeaveIfError( iSessions.Append( session ) );
+ CleanupStack::Pop( session );
+
+ // RTP clip handler
+ CreateClipHandlerL();
+
+ // Only one source per session
+ sessionIndex = iSessions.Count() - 1;
+ iSessions[sessionIndex]->OpenSourceL( aFileHandle, iClipHandler, fileName );
+ }
+
+ User::LeaveIfError( sessionIndex );
+ return sessionIndex;
+
+#else // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ ( void )aFileHandle;
+ return KErrNotSupported;
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::VerifySession
+// Go through stream sessions and try to find stream is already playing.
+// -----------------------------------------------------------------------------
+//
+TInt CCREngine::VerifySession( const TDesC& aName )
+ {
+ if ( iSessions.Count() > 0 )
+ {
+ for ( TInt i( iSessions.Count() - 1 ); i >= 0; i-- )
+ {
+ const TUint chksm( iSessions[i]->SourceDefinition( aName ) );
+ if ( chksm == iSessions[i]->SourceChecksum() )
+ {
+ return i;
+ }
+ }
+ }
+
+ return KErrNotFound;
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::VerifySession
+// Go through stream sessions and try to find session index from active sessions.
+// -----------------------------------------------------------------------------
+//
+TInt CCREngine::VerifySession( const TUint aSessionChk )
+ {
+ if ( iSessions.Count() > 0 )
+ {
+ for ( TInt i( iSessions.Count() - 1 ); i >= 0; i-- )
+ {
+ if ( aSessionChk == iSessions[i]->SourceChecksum() )
+ {
+ return i;
+ }
+ }
+ }
+
+ return KErrNotFound;
+ }
+
+//-----------------------------------------------------------------------------
+// CCREngine::CreateRecordingSinkL
+//
+//-----------------------------------------------------------------------------
+//
+void CCREngine::CreateRecordingSinkL(
+ const TInt aSessionIndex,
+ const SCRRecordParams& aRecordParams )
+ {
+ LOG1( "CCREngine::CreateRecordingSinkL(), aSessionIndex: %d", aSessionIndex );
+
+ User::LeaveIfError( aSessionIndex );
+ switch ( aRecordParams.iFormat )
+ {
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ case ECRRecordFormatRtp:
+ // RTP clip handler
+ CreateClipHandlerL();
+ iSessions[aSessionIndex]->CreateRtpRecordSinkL(
+ aRecordParams, iClipHandler );
+ break;
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+
+ case ECRRecordFormat3gp:
+ iSessions[aSessionIndex]->Create3gpRecordSinkL( aRecordParams );
+ break;
+
+ default:
+ LOG( "CCREngine::CreateRecordingSinkL(), Clip format invalid !");
+ User::Leave( KErrNotSupported );
+ break;
+ }
+ }
+
+//-----------------------------------------------------------------------------
+// CCREngine::SessionStopCallBack
+//
+//-----------------------------------------------------------------------------
+//
+TInt CCREngine::SessionStopCallBack ( TAny* aThis )
+ {
+ LOG( "CCREngine::SessionStopCallBack()" );
+
+ CCREngine* self = static_cast<CCREngine*>( aThis );
+ self->DoSessionStop();
+ return self->iSessionsToDelete.Count();
+ }
+
+//-----------------------------------------------------------------------------
+// CCREngine::DoSessionStop
+//
+//-----------------------------------------------------------------------------
+//
+void CCREngine::DoSessionStop( void )
+ {
+ LOG1( "CCREngine::DoSessionStop() in, iSessionsToDelete.Count = %d", iSessionsToDelete.Count() );
+
+ for ( TInt i( iSessionsToDelete.Count() - 1 ); i >= 0; i-- )
+ {
+ for ( TInt j( iSessions.Count() - 1 ); j >= 0; j-- )
+ {
+ if ( iSessions[j] == iSessionsToDelete[i] )
+ {
+ delete iSessions[j];
+ iSessions.Remove( j );
+ }
+ }
+ }
+
+ // Supposed to be empty by now
+ DeleteClipHandler( KErrNotFound );
+ iSessionsToDelete.Reset();
+ LOG( "CCREngine::DoSessionStop() out" );
+ }
+
+//-----------------------------------------------------------------------------
+// CCREngine::DeleteClipHandler
+//
+//-----------------------------------------------------------------------------
+//
+void CCREngine::DeleteClipHandler( const TInt aCurrentSessionIndex )
+ {
+ LOG1( "CCREngine::DeleteClipHandler(), aCurrentSessionIndex: %d",
+ aCurrentSessionIndex );
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+
+ if ( iClipHandler )
+ {
+ // Find out clip handler usage
+ TBool notUsed( ETrue );
+ for ( TInt i( iSessions.Count() - 1 ); i >= 0; i-- )
+ {
+ if ( i != aCurrentSessionIndex && iSessions[i]->ClipHandlerUsed() )
+ {
+ notUsed = EFalse;
+ }
+ }
+
+ // Clip handler not needed any longer?
+ if ( notUsed )
+ {
+ delete iClipHandler; iClipHandler = NULL;
+ LOG( "CCREngine::DeleteClipHandler(), RTP ClipHandler deleted !" );
+ }
+ }
+
+#else // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ ( void )aCurrentSessionIndex;
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::Read
+// Read from the client thread, if unsuccessful, panic the client.
+// -----------------------------------------------------------------------------
+//
+void CCREngine::Read(
+ const RMessage2& aMessage,
+ const TInt& aParam,
+ TDes8& aDes )
+ {
+ TRAPD( err, aMessage.ReadL( aParam, aDes ) );
+ if ( err )
+ {
+ PanicClient( ECRPanicBadDescriptor, aMessage );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::Read
+// Read from the client thread, if unsuccessful, panic the client.
+// -----------------------------------------------------------------------------
+//
+void CCREngine::Read(
+ const RMessage2& aMessage,
+ const TInt& aParam,
+ TDes16& aDes )
+ {
+ TRAPD( err, aMessage.ReadL( aParam, aDes ) );
+ if ( err )
+ {
+ PanicClient( ECRPanicBadDescriptor, aMessage );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::Write
+// Write to the client thread, if unsuccessful, panic the client.
+// -----------------------------------------------------------------------------
+//
+void CCREngine::Write(
+ const RMessage2& aMessage,
+ const TInt& aParam,
+ const TDesC8& aDes )
+ {
+ TRAPD( err, aMessage.WriteL( aParam, aDes ) );
+ if ( err )
+ {
+ PanicClient( ECRPanicBadDescriptor, aMessage );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::Write
+// Write to the client thread, if unsuccessful, panic the client.
+// -----------------------------------------------------------------------------
+//
+void CCREngine::Write(
+ const RMessage2& aMessage,
+ const TInt& aParam,
+ const TDesC16& aDes )
+ {
+ TRAPD( err, aMessage.WriteL( aParam, aDes ) );
+ if ( err )
+ {
+ PanicClient( ECRPanicBadDescriptor, aMessage );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCREngine::PanicClient
+//
+// -----------------------------------------------------------------------------
+//
+void CCREngine::PanicClient( TInt aPanic, const RMessage2& aMessage )
+ {
+ // Panic the client on server side
+ _LIT( KRbfClientFault, "Common recording engine" );
+ aMessage.Panic( KRbfClientFault, aPanic );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRNullSink.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,191 @@
+/*
+* 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: Class that takes packet from buffer and does not put them*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCRNullSink.h"
+#include "CCRPacketBuffer.h"
+#include "CCRStreamingSession.h"
+#include "CCRTimer.h"
+#include "MCRConnectionObserver.h"
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+// None
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRNullSink::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCRNullSink* CCRNullSink::NewL(
+ CCRStreamingSession::TCRSinkId aSinkId,
+ CCRStreamingSession& aOwningSession )
+ {
+ CCRNullSink* self = new( ELeave ) CCRNullSink( aSinkId, aOwningSession );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSink::CCRNullSink
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCRNullSink::CCRNullSink(
+ CCRStreamingSession::TCRSinkId aSinkId,
+ CCRStreamingSession& aOwningSession )
+ : CCRPacketSinkBase( aOwningSession, aSinkId )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSink::ConstructL
+// 2nd phase.
+// -----------------------------------------------------------------------------
+//
+void CCRNullSink::ConstructL()
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSink::~CCRNullSink
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRNullSink::~CCRNullSink()
+ {
+ delete iSdp;
+ delete iFlowTimer;
+ iBuffer = NULL; // does not delete and it is right thing.
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSink::SetSdpL
+// as a side-effect causes parsing of the sdp.
+// -----------------------------------------------------------------------------
+//
+void CCRNullSink::SetSdpL( const TDesC8& aSdp )
+ {
+ LOG1( "CCRNullSink::SetSdpL(), aSdp len: %d", aSdp.Length() );
+
+ delete iSdp; iSdp = NULL;
+ iSdp = aSdp.AllocL();
+ iOwningSession.PlayCommand( KRealZero, KRealMinusOne );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSink::NewPacketAvailable
+//
+// -----------------------------------------------------------------------------
+//
+void CCRNullSink::NewPacketAvailable()
+ {
+ if ( iBuffer )
+ {
+ TPtr8 packet( NULL, 0 );
+ MCRPacketSource::TCRPacketStreamId streamId;
+ const TInt book( iBuffer->GetStream( iSinkId, streamId ) );
+ iBuffer->GetPacket( book, packet );
+ const TUint8* pointer( &packet[2] );
+ TInt seq( BigEndian::Get16( pointer ) );
+ LOG2( "CCRNullSink::NewPacketAvailable(), streamId: %u, seq: %u",
+ streamId, seq );
+ // Keep buffer size reasonable
+ iBuffer->HandleBufferSize();
+
+ // Handle flow control
+ if ( !iBuffer->ContinousStream() && !iFlowTimer )
+ {
+ TRAPD( err, iFlowTimer = CCRTimer::NewL( CActive::EPriorityLow, *this ) );
+ if ( !err )
+ {
+ if ( iBuffer->PacketsCount( iSinkId ) > KErrNotFound )
+ {
+ iFlowTimer->After( 0 );
+ }
+ else
+ {
+ iFlowTimer->At( 2e6 );
+ }
+ }
+ else
+ {
+ delete iFlowTimer; iFlowTimer = NULL;
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSink::TimerExpired
+// -----------------------------------------------------------------------------
+//
+void CCRNullSink::TimerExpired( CCRTimer* /*aTimer*/ )
+ {
+ if ( iBuffer->PacketsCount( iSinkId ) > KErrNotFound )
+ {
+ NewPacketAvailable();
+ }
+ else
+ {
+ iOwningSession.SourceRestore();
+ }
+
+ delete iFlowTimer; iFlowTimer = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSink::RegisterConnectionObs
+// -----------------------------------------------------------------------------
+//
+void CCRNullSink::RegisterConnectionObs( MCRConnectionObserver* aObserver )
+ {
+ iObserver = aObserver;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSink::StatusChanged
+// -----------------------------------------------------------------------------
+//
+void CCRNullSink::StatusChanged( MCRPacketSource::TCRPacketSourceState aNewState )
+ {
+ if( iObserver )
+ {
+ TCRTestSinkData data = aNewState==MCRPacketSource::ERtpStateIdle ? ECRTestSinkStateIdle :
+ aNewState==MCRPacketSource::ERtpStateSdpAvailable ? ECRTestSinkStateSdpAvailable :
+ aNewState==MCRPacketSource::ERtpStateSeqAndTSAvailable ? ECRTestSinkStateSeqAndTSAvailable :
+ aNewState==MCRPacketSource::ERtpStatePlaying ? ECRTestSinkStatePlaying :
+ /*aNewState==MCRPacketSource::ERtpStateClosing?*/ ECRTestSinkStateClosing;
+
+ LOG3( "CCRNullSink::StatusChanged: newState=%d -> ECRTestSinkData, checksum=%d, data=%d",
+ (TInt)aNewState, (TInt)iOwningSession.SourceChecksum(), (TInt)data );
+ iObserver->ConnectionStatusChange( iOwningSession.SourceChecksum(),
+ MCRConnectionObserver::ECRTestSinkData,
+ (TInt)data );
+ }
+ }
+
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRNullSource.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,433 @@
+/*
+* 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: Class that reads packets from a .rtp clip for testing purposes.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCRNullSource.h"
+#include <ipvideo/CRtpClipHandler.h>
+#include "CCRPacketBuffer.h"
+#include "CRtpTimer.h"
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+const TInt KGroupsCountPoint( 0 );
+const TInt KBufferThesholdCount( 20 );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRNullSource::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCRNullSource* CCRNullSource::NewL(
+ const TDesC& aClipName,
+ MCRStreamObserver& aSessionObs,
+ CCRStreamingSession& aOwningSession )
+ {
+ CCRNullSource* self = new( ELeave )
+ CCRNullSource( aSessionObs, aOwningSession );
+ CleanupStack::PushL( self );
+ self->ConstructL( aClipName );
+ CleanupStack::Pop();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSource::CCRNullSource
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCRNullSource::CCRNullSource(
+ MCRStreamObserver& aSessionObs,
+ CCRStreamingSession& aOwningSession )
+ : CCRPacketSourceBase( aOwningSession, CCRStreamingSession::ECRNullSourceId ),
+ iSessionObs( aSessionObs ),
+ iGroupTime( KMaxTUint )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSource::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCRNullSource::ConstructL( const TDesC& aClipName )
+ {
+ LOG1( "CCRNullSource::ConstructL() in, aClipName: %S", &aClipName );
+
+ iClipHandler = CRtpClipHandler::NewL();
+ iClipHandler->RegisterReadObserver( this );
+
+ // Start playback
+ SCRRtpPlayParams params;
+ params.iFileName = aClipName;
+ iClipHandler->StartPlayBackL( params );
+
+ LOG( "CCRNullSource::ConstructL() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSource::~CCRNullSource
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRNullSource::~CCRNullSource()
+ {
+ LOG( "CCRNullSource::~CCRNullSource()" );
+
+ if ( iClipHandler )
+ {
+ iClipHandler->StopPlayBack( KErrNone, 0 );
+ }
+
+ delete iClipHandler; iClipHandler = NULL;
+ delete iFlowTimer;
+ delete iSdp;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSource::GetSdp
+// -----------------------------------------------------------------------------
+//
+TInt CCRNullSource::GetSdp( TPtrC8& aSdp )
+ {
+ if ( iSdp )
+ {
+ aSdp.Set( iSdp->Des() );
+ return KErrNone;
+ }
+
+ return KErrNotReady;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSource::SetBuffer
+// -----------------------------------------------------------------------------
+//
+void CCRNullSource::SetBuffer( CCRPacketBuffer* aBuffer )
+ {
+ iBuffer = aBuffer;
+ iBuffer->ContinousStream( EFalse );
+ iBuffer->MoreComing( EFalse );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSource::PostActionL
+// -----------------------------------------------------------------------------
+//
+void CCRNullSource::PostActionL()
+ {
+ LOG( "CCRNullSource::PostActionL(), SDP will be handled !" );
+
+ // SDP
+ iSdp = iClipHandler->GetClipSdpL();
+
+ // Notify that SDP available
+ iSessionObs.StatusChanged( MCRPacketSource::ERtpStateSdpAvailable );
+ delete iSdp; iSdp = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSource::Restore
+// -----------------------------------------------------------------------------
+//
+void CCRNullSource::Restore()
+ {
+ delete iFlowTimer; iFlowTimer = NULL;
+ const TInt err( NextClipGroup() );
+ if ( err )
+ {
+ LOG1( "CCRNullSource::Restore(), NextClipGroup() err: %d", err );
+ iSessionObs.StatusChanged( MCRPacketSource::ERtpStateClosing );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSource::Play
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCRNullSource::Play( const TReal& aStartPos, const TReal& aEndPos )
+ {
+ LOG2( "CCRNullSource::Play(), aStartPos: %f, aEndPos: %f",
+ aStartPos, aEndPos );
+
+ if ( aStartPos == KRealZero && aEndPos == KRealZero )
+ {
+ Restore();
+ }
+
+ return KErrNone;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCRNullSource::Stop
+// -----------------------------------------------------------------------------
+//
+TInt CCRNullSource::Stop()
+ {
+ iClipHandler->StopPlayBack( KErrNone, 0 );
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSource::GetPosition
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCRNullSource::GetPosition( TInt64& aPosition, TInt64& aDuration )
+ {
+ if ( iBuffer )
+ {
+ if ( iGroupTime != KMaxTUint )
+ {
+ aPosition += TInt64( iGroupTime ) * KSiKilo;
+ }
+
+ aDuration = TInt64( iClipHandler->GetCurrentLength() ) * KSiKilo;
+#ifdef CR_ALL_LOGS
+ LOG2( "CCRNullSource::GetPosition(), aPosition: %u, aDuration: %u",
+ ( TUint )( aPosition / KSiKilo ), ( TUint )( aDuration / KSiKilo ) );
+#endif // CR_ALL_LOGS
+ return KErrNone;
+ }
+
+ return KErrCompletion;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSource::GroupReadedL
+// Adds packets to the buffer when finished asyncronous group reading.
+// -----------------------------------------------------------------------------
+//
+void CCRNullSource::GroupReadedL(
+ const TDesC8& aGroup,
+ const TUint aGroupTime,
+ const TBool aLastGroup )
+ {
+ // Group time
+ if ( iGroupTime == KMaxTUint )
+ {
+ iGroupTime = aGroupTime;
+ }
+
+ // Data valid?
+ TInt point( KGroupsCountPoint + KPacketsCountBytes );
+ const TInt total( aGroup.Length() );
+ if ( point > total )
+ {
+ LOG( "CCRNullSource::GroupReadedL(), No Packets Total Count !" );
+ User::Leave( KErrCorrupt );
+ }
+
+ // Packets total count (PTC)
+ const TInt totalCount( CRtpUtil::GetValueL(
+ aGroup.Mid( KGroupsCountPoint, KPacketsCountBytes ) ) );
+ if ( totalCount > 0 )
+ {
+ iBuffer->ContinousStream( ETrue );
+ }
+
+ // Loop all packets
+ for ( TInt i( 0 ); i < totalCount; i++ )
+ {
+ // Corrupted?
+ if ( ( point + KPacketSizeBytesLen ) > total )
+ {
+ LOG( "CCRNullSource::GroupReadedL(), No Packets Size !" );
+ User::Leave( KErrCorrupt );
+ }
+
+ // Packet total Size (PTS)
+ TInt packetSize( CRtpUtil::GetValueL(
+ aGroup.Mid( point, KPacketSizeBytesLen ) ) );
+ // Corrupted?
+ if ( packetSize <= 0 || ( point + packetSize ) > total )
+ {
+ LOG( "CCRNullSource::GroupReadedL(), No Packets Payload !" );
+ User::Leave( KErrCorrupt );
+ }
+
+ // Packet type
+ point += KPacketSizeBytesLen;
+ const MRtpFileWriteObserver::TRtpType type(
+ ( MRtpFileWriteObserver::TRtpType )( aGroup[point] ) );
+ point += KPacketTypeBytesLen;
+ packetSize -= ( KPacketSizeBytesLen + KPacketTypeBytesLen );
+
+ // Insert packet to the buffer
+ const TPtrC8 packet( aGroup.Mid( point, packetSize ) );
+
+#ifdef CR_ALL_LOGS
+ const TUint8* pointer( &packet[2] );
+ TInt seq( BigEndian::Get16( pointer ) );
+ LOG3( "CCRNullSource::GroupReadedL(), type: %d, packet: %d, seq: %d",
+ type, packet.Length(), seq );
+ //RFileLogger::WriteFormat( _L( "livetv" ), _L( "play.log" ), EFileLoggingModeAppend,
+ // _L( "GroupReadedL(), type: %d, packet: %d, seq: %d" ), type, packet.Length(), seq );
+#endif // CR_ALL_LOGS
+
+ MCRPacketSource::TCRPacketStreamId stream( MCRPacketSource::EStreamIdCount );
+ if ( TypeToStream( type, stream ) )
+ {
+ // Last packet in group?
+ if ( i >= ( totalCount - 1 ) )
+ {
+ iBuffer->ContinousStream( EFalse );
+ if ( aLastGroup && stream != MCRPacketSource::EStreamEndTag )
+ {
+ LOG( "CCRNullSource::GroupReadedL(), Misses last group from clip !" );
+ stream = MCRPacketSource::EStreamEndTag;
+ }
+ }
+
+ // Packet to buffer
+ iBuffer->AddPacket( stream, packet );
+ }
+
+ point+= packetSize;
+ }
+
+ if ( !iFlowTimer )
+ {
+ iFlowTimer = CRtpTimer::NewL( *this );
+ iFlowTimer->After( KNormalRecGroupLength * KSiKilo );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSource::ReadStatus
+// -----------------------------------------------------------------------------
+//
+void CCRNullSource::ReadStatus( TInt aStatus )
+ {
+ LOG1( "CCRNullSource::ReadStatus(), aStatus: %d", aStatus );
+
+ switch ( aStatus )
+ {
+ case MRtpFileReadObserver::ERtpTimeShifTEnd:
+ break;
+
+ default:
+ iSessionObs.StatusChanged( MCRPacketSource::ERtpStateClosing );
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSource::TimerEventL
+// Internal timer call this when triggered.
+// -----------------------------------------------------------------------------
+//
+void CCRNullSource::TimerEventL()
+ {
+ User::LeaveIfError( NextClipGroup() );
+ delete iFlowTimer; iFlowTimer = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSource::TimerError
+// Internal timer call this when TimerEventL() leaves.
+// -----------------------------------------------------------------------------
+//
+void CCRNullSource::TimerError( const TInt aError )
+ {
+ LOG1( "CCRNullSource::TimerError(), TimerEventL() leaved: %d", aError );
+ ( void )aError; // Prevent compiler warning
+
+ delete iFlowTimer; iFlowTimer = NULL;
+ iSessionObs.StatusChanged( MCRPacketSource::ERtpStateClosing );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSource::NextClipGroup
+// -----------------------------------------------------------------------------
+//
+TInt CCRNullSource::NextClipGroup()
+ {
+ if ( iBuffer && iClipHandler )
+ {
+ if ( iBuffer->PacketsMinCount() < KBufferThesholdCount )
+ {
+ TRAPD( err, iClipHandler->NextClipGroupL() );
+ return err;
+ }
+
+ return KErrNone;
+ }
+
+ return KErrNotReady;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRNullSource::TypeToStream
+// -----------------------------------------------------------------------------
+//
+TBool CCRNullSource::TypeToStream(
+ const MRtpFileWriteObserver::TRtpType& aType,
+ MCRPacketSource::TCRPacketStreamId& aStream )
+ {
+ switch ( aType )
+ {
+ case MRtpFileWriteObserver::ERtpAudio:
+ aStream = MCRPacketSource::EAudioStream;
+ break;
+
+ case MRtpFileWriteObserver::ERtcpAudio:
+ aStream = MCRPacketSource::EAudioControlStream;
+ break;
+
+ case MRtpFileWriteObserver::ERtpVideo:
+ aStream = MCRPacketSource::EVideoStream;
+ break;
+
+ case MRtpFileWriteObserver::ERtcpVideo:
+ aStream = MCRPacketSource::EVideoControlStream;
+ break;
+
+ case MRtpFileWriteObserver::ERtpSubTitle:
+ aStream = MCRPacketSource::ESubTitleStream;
+ break;
+
+ case MRtpFileWriteObserver::ERtcpSubTitle:
+ aStream = MCRPacketSource::ESubTitleControlStream;
+ break;
+
+ case MRtpFileWriteObserver::ERtpClipPause:
+ LOG( "CCRNullSource::TypeToStream(), ERtpClipPause" );
+ aStream = MCRPacketSource::EDisContinousStream;
+ break;
+
+ case MRtpFileWriteObserver::ERtpClipEnd:
+ LOG( "CCRNullSource::TypeToStream(), ERtpClipEnd" );
+ aStream = MCRPacketSource::EStreamEndTag;
+ break;
+
+ default:
+ LOG1( "CCRNullSource::TypeToStream(), Default case, aType: %d",
+ aType );
+ return EFalse;
+ }
+
+ return ETrue;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRPacketBuffer.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,544 @@
+/*
+* 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: Hold rtp packets waiting to be sent*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCRPacketBuffer.h"
+#include <e32cmn.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+// None.
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCRPacketBuffer* CCRPacketBuffer::NewL( const TInt aMaxPackets )
+ {
+ CCRPacketBuffer* self = new( ELeave ) CCRPacketBuffer( aMaxPackets );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::CCRPacketBuffer
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCRPacketBuffer::CCRPacketBuffer( const TInt aMaxPackets )
+ : iMaxPackets( aMaxPackets ),
+ iContinousStream( EFalse ),
+ iMoreComing( EFalse )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCRPacketBuffer::ConstructL()
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::~CCRPacketBuffer
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRPacketBuffer::~CCRPacketBuffer()
+ {
+ LOG( "CCRPacketBuffer::~CCRPacketBuffer" );
+
+ iBuffer.ResetAndDestroy();
+ iBookKeeping.Close();
+ iSinkArray.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::AddSink
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCRPacketBuffer::AddSink( CCRPacketSinkBase* aSink )
+ {
+ LOG( "CCRPacketBuffer::AddSink() in" );
+
+ // Check if sink exist already?
+ TBool exist( EFalse );
+ for ( TInt i( iBookKeeping.Count() - 1 ); i >= 0 && !exist; i-- )
+ {
+ exist = ( aSink->Id() == iBookKeeping[i].iId );
+ }
+
+ // If not, add sink to list
+ TInt err( KErrNone );
+ if ( !exist )
+ {
+ SBookKeeping book;
+ book.iId = aSink->Id();
+ book.iIndex = KErrNotFound;
+ err = iBookKeeping.Append( book );
+ if ( !err )
+ {
+ err = iSinkArray.Append( aSink );
+ if ( err )
+ {
+ // Remove last from book keeping, because sink append failed
+ LOG1( "CCRPacketBuffer::AddSink(), Sink append error: %d", err );
+ iBookKeeping.Remove( iBookKeeping.Count() - 1 );
+ }
+ }
+ }
+
+ LOG3( "CCRPacketBuffer::AddSink() out, err: %d, iSinkArray count: %d, iBookKeeping count: %d",
+ err, iSinkArray.Count(), iBookKeeping.Count() );
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::AddPacket
+// Method for add.
+// -----------------------------------------------------------------------------
+//
+void CCRPacketBuffer::AddPacket(
+ const MCRPacketSource::TCRPacketStreamId& aStream,
+ const TDesC8& aHeader,
+ const TDesC8& aPacket )
+ {
+ // Room
+ VerifyRoom();
+
+ // Add packet
+ const TInt total( KStreamTypeBytesLength +
+ aHeader.Length() + aPacket.Length() );
+ HBufC8* packet = HBufC8::New( total );
+ if ( packet )
+ {
+ TPtr8 ptr( packet->Des() );
+ ptr.SetLength( KStreamTypeBytesLength );
+ ptr[KStreamTypeBytePoint] = ( TUint8 )( aStream );
+ ptr.Append( aHeader );
+ ptr.Append( aPacket );
+ if ( iBuffer.Insert( packet, 0 ) )
+ {
+ delete packet;
+ }
+ else
+ {
+ PacketToBookKeeping();
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::AddPacket
+// Method for add.
+// -----------------------------------------------------------------------------
+//
+void CCRPacketBuffer::AddPacket(
+ const MCRPacketSource::TCRPacketStreamId& aStream,
+ const TDesC8& aPacket )
+ {
+ // Room
+ VerifyRoom();
+
+ // Add packet
+ const TInt total( KStreamTypeBytesLength + aPacket.Length() );
+ HBufC8* packet = HBufC8::New( total );
+ if ( packet )
+ {
+ TPtr8 ptr( packet->Des() );
+ ptr.SetLength( KStreamTypeBytesLength );
+ ptr[KStreamTypeBytePoint] = ( TUint8 )( aStream );
+ ptr.Append( aPacket );
+ if ( iBuffer.Insert( packet, 0 ) )
+ {
+ delete packet;
+ }
+ else
+ {
+ PacketToBookKeeping();
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::ContinousStream
+// Method for set buffer estimate when it ends.
+// -----------------------------------------------------------------------------
+//
+void CCRPacketBuffer::ContinousStream( const TBool aState )
+ {
+ LOG1( "CCRPacketBuffer::ContinousStream(), aState: %d", aState );
+ iContinousStream = aState;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::ContinousStream
+// Method for get the time when buffer should end.
+// -----------------------------------------------------------------------------
+//
+TBool CCRPacketBuffer::ContinousStream()
+ {
+ return iContinousStream;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer:::MoreComing
+// Method for set more coming state.
+// -----------------------------------------------------------------------------
+//
+void CCRPacketBuffer::MoreComing( const TBool aState )
+ {
+ iMoreComing = aState;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer:::MoreComing
+// Method for get more coming state.
+// -----------------------------------------------------------------------------
+//
+TBool CCRPacketBuffer::MoreComing()
+ {
+ return iMoreComing;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::GetStream
+// -----------------------------------------------------------------------------
+//
+TInt CCRPacketBuffer::GetStream(
+ const CCRStreamingSession::TCRSinkId& aId,
+ MCRPacketSource::TCRPacketStreamId& aStreamId )
+ {
+ return GetStream( aId, 0, aStreamId );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::GetStream
+// -----------------------------------------------------------------------------
+//
+TInt CCRPacketBuffer::GetStream(
+ const CCRStreamingSession::TCRSinkId& aId,
+ const TInt aOffset,
+ MCRPacketSource::TCRPacketStreamId& aStreamId )
+ {
+ const TInt bookKeeping( GetBookKeeping( aId ) );
+ if ( bookKeeping > KErrNotFound )
+ {
+ const TInt index( GetBufferIndex( bookKeeping ) - aOffset );
+ if ( index > KErrNotFound && index < iBuffer.Count() )
+ {
+ aStreamId = MCRPacketSource::TCRPacketStreamId(
+ iBuffer[index]->Des()[KStreamTypeBytePoint] );
+ }
+ }
+
+ return bookKeeping;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::GetPacket
+// Method for remove
+// -----------------------------------------------------------------------------
+//
+void CCRPacketBuffer::GetPacket(
+ const CCRStreamingSession::TCRSinkId& aId,
+ TPtr8& aReturnedData )
+ {
+ const TInt bookKeeping( GetBookKeeping( aId ) );
+ GetPacket( bookKeeping, aReturnedData );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::GetPacket
+// Method for remove
+// -----------------------------------------------------------------------------
+//
+void CCRPacketBuffer::GetPacket( const TInt aBookKeeping, TPtr8& aReturnedData )
+ {
+ PeekPacket( aBookKeeping, aReturnedData, 0 );
+
+ if ( aReturnedData.Ptr() || aReturnedData.Length() > 0 )
+ {
+ // One packet used
+ iBookKeeping[aBookKeeping].iIndex--;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::PeekPacket
+// Method for peeking
+// -----------------------------------------------------------------------------
+//
+void CCRPacketBuffer::PeekPacket(
+ const CCRStreamingSession::TCRSinkId& aId,
+ TPtr8& aReturnedData,
+ const TInt aOffset )
+ {
+ const TInt bookKeeping( GetBookKeeping( aId ) );
+ PeekPacket( bookKeeping, aReturnedData, aOffset );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::PeekPacket
+// Method for peeking
+// -----------------------------------------------------------------------------
+//
+void CCRPacketBuffer::PeekPacket(
+ const TInt aBookKeeping,
+ TPtr8& aReturnedData,
+ const TInt aOffset )
+ {
+ aReturnedData.Set( NULL, 0, 0 );
+
+ if ( aBookKeeping > KErrNotFound && aBookKeeping < iBookKeeping.Count() )
+ {
+ const TInt index( GetBufferIndex( aBookKeeping ) - aOffset );
+ if ( index > KErrNotFound && index < iBuffer.Count() )
+ {
+ // Data
+ aReturnedData.Set(
+ iBuffer[index]->Des().MidTPtr( KStreamTypeBytesLength ) );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::PacketsCount
+// Method for asking count of packet available.
+// -----------------------------------------------------------------------------
+//
+TInt CCRPacketBuffer::PacketsCount( const CCRStreamingSession::TCRSinkId& aId )
+ {
+ const TInt bookKeeping( GetBookKeeping( aId ) );
+ if ( bookKeeping > KErrNotFound )
+ {
+ return iBookKeeping[bookKeeping].iIndex;
+ }
+
+ return KErrNotFound;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::PacketsMinCount
+// Method for asking minimum count of packet available in any sink.
+// -----------------------------------------------------------------------------
+//
+TInt CCRPacketBuffer::PacketsMinCount()
+ {
+ TInt ret( KMaxTInt );
+ for ( TInt i( iBookKeeping.Count() - 1 ); i >= 0 ; i-- )
+ {
+ if ( iBookKeeping[i].iIndex < ret )
+ {
+ ret = iBookKeeping[i].iIndex;
+ }
+ }
+
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::HandleBufferSize
+// Removes packets which are used in all book keepings.
+// -----------------------------------------------------------------------------
+//
+void CCRPacketBuffer::HandleBufferSize()
+ {
+ // Find maximum index
+ TInt max( KErrNotFound );
+ for ( TInt i( 0 ); i < iBookKeeping.Count(); i++ )
+ {
+ max = Max( max, iBookKeeping[i].iIndex );
+ }
+
+ // Delete used packets
+ const TInt oldCount( iBuffer.Count() );
+ for ( TInt i( oldCount - 1 ); ( i > max ) && ( i > KErrNotFound ); i-- )
+ {
+ delete iBuffer[i];
+ iBuffer.Remove( i );
+ }
+
+ // Compress if packets deleted
+ if ( iBuffer.Count() < oldCount )
+ {
+ iBuffer.Compress();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::AdjustBuffer
+// Drops packets to 25% of buffers max size.
+// -----------------------------------------------------------------------------
+//
+void CCRPacketBuffer::AdjustBuffer()
+ {
+ const TInt limit( iMaxPackets / 4 );
+ for ( TInt i( iBookKeeping.Count() - 1 ); i >= 0 ; i-- )
+ {
+ if ( iBookKeeping[i].iIndex > limit )
+ {
+ LOG3( "CCRPacketBuffer::AdjustBuffer(), book: %d, index: %d, limit: %d",
+ i, iBookKeeping[i].iIndex, limit );
+ iBookKeeping[i].iIndex = limit;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::ResetBuffer
+//
+// -----------------------------------------------------------------------------
+//
+void CCRPacketBuffer::ResetBuffer()
+ {
+ // Reset book keeping
+ for ( TInt i( iBookKeeping.Count() - 1 ); i >= 0 ; i-- )
+ {
+ LOG2( "CCRPacketBuffer::ResetBuffer(), book: %d, index: %d",
+ i, iBookKeeping[i].iIndex );
+ iBookKeeping[i].iIndex = KErrNotFound;
+ }
+
+ // Notify sinks
+ for ( TInt i( iSinkArray.Count() - 1 ); i >= 0; i-- )
+ {
+ iSinkArray[i]->BufferResetDone();
+ }
+
+ // Reset items
+ iBuffer.ResetAndDestroy();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::RemoveSink
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCRPacketBuffer::RemoveSink( CCRPacketSinkBase* aSink )
+ {
+ // Sink
+ for ( TInt i( iSinkArray.Count() - 1 ); i >= 0; i-- )
+ {
+ if ( iSinkArray[i] == aSink )
+ {
+ iSinkArray.Remove( i );
+ LOG1( "CCRPacketBuffer::RemoveSink(), removed Sink: %d", i );
+ }
+ }
+
+ // Book keeping
+ for ( TInt i( iBookKeeping.Count() - 1 ); i >= 0; i-- )
+ {
+ if ( iBookKeeping[i].iId == aSink->Id() )
+ {
+ iBookKeeping.Remove( i );
+ LOG1( "CCRPacketBuffer::RemoveSink(), removed Book keeping: %d", i );
+ }
+ }
+
+ return iSinkArray.Count();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::VerifyRoom()
+// Verify maximum packets in buffer. Will drop packets count to 1/4 if maximum
+// size reached.
+// -----------------------------------------------------------------------------
+//
+void CCRPacketBuffer::VerifyRoom()
+ {
+ TInt count( iBuffer.Count() );
+ if ( count >= iMaxPackets )
+ {
+ LOG1( "CCRPacketBuffer::VerifyRoom(), Buffer full ! count: %d", count );
+ AdjustBuffer();
+
+ // Make sure memory not run out because of asyncronous packets deleting
+ if ( count >= ( iMaxPackets * 2 ) )
+ {
+ ResetBuffer();
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::GetBookKeeping
+// Updates book keeping index basing on sink id.
+// -----------------------------------------------------------------------------
+//
+TInt CCRPacketBuffer::GetBookKeeping( const CCRStreamingSession::TCRSinkId& aId )
+ {
+ for ( TInt i( 0 ); i < iBookKeeping.Count(); i++ )
+ {
+ if ( iBookKeeping[i].iId == aId )
+ {
+ return i;
+ }
+ }
+
+ return KErrNotFound;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::GetBufferIndex
+// Getter for buffer index from book keeping.
+// -----------------------------------------------------------------------------
+//
+TInt CCRPacketBuffer::GetBufferIndex( const TInt aBookKeeping )
+ {
+ if ( aBookKeeping > KErrNotFound && aBookKeeping < iBookKeeping.Count() )
+ {
+ return iBookKeeping[aBookKeeping].iIndex;
+ }
+
+ return KErrNotFound;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketBuffer::PacketToBookKeeping
+//
+// -----------------------------------------------------------------------------
+//
+void CCRPacketBuffer::PacketToBookKeeping()
+ {
+ // New packet to book keeping
+ for ( TInt i( 0 ); i < iBookKeeping.Count(); i++ )
+ {
+ iBookKeeping[i].iIndex++;
+ }
+
+ // New packet available
+ for ( TInt i( 0 ); i < iSinkArray.Count(); i++ )
+ {
+ iSinkArray[i]->NewPacketAvailable();
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRPacketSinkBase.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,144 @@
+/*
+* 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: Base class for all packet sinks*
+*/
+
+
+
+
+// INCLUDES
+#include "CCRPacketSinkBase.h"
+
+// CONSTANTS
+// None
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRPacketSinkBase::CCRPacketSinkBase
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCRPacketSinkBase::CCRPacketSinkBase(
+ CCRStreamingSession& aSession,
+ CCRStreamingSession::TCRSinkId aSinkId )
+ : iOwningSession( aSession ),
+ iSinkId( aSinkId )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSinkBase::CCRPacketSinkBase
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRPacketSinkBase::~CCRPacketSinkBase()
+ {
+ iBuffer = NULL; // Does not delete and it is right thing.
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSinkBase::SetBuffer
+//
+// -----------------------------------------------------------------------------
+//
+void CCRPacketSinkBase::SetBuffer( CCRPacketBuffer* aBuffer )
+ {
+ iBuffer = aBuffer;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSinkBase::BufferResetDone
+//
+// -----------------------------------------------------------------------------
+//
+void CCRPacketSinkBase::BufferResetDone()
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSinkBase::StatusChanged
+//
+// -----------------------------------------------------------------------------
+//
+void CCRPacketSinkBase::StatusChanged(
+ MCRPacketSource::TCRPacketSourceState /*aNewState*/ )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSinkBase::Id
+//
+// -----------------------------------------------------------------------------
+//
+CCRStreamingSession::TCRSinkId CCRPacketSinkBase::Id( void ) const
+ {
+ return iSinkId;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSinkBase::Pause
+// -----------------------------------------------------------------------------
+//
+TInt CCRPacketSinkBase::Pause()
+ {
+ return KErrCompletion;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSinkBase::Restore
+// -----------------------------------------------------------------------------
+//
+TInt CCRPacketSinkBase::Restore()
+ {
+ return KErrCompletion;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSinkBase::Stop
+// -----------------------------------------------------------------------------
+//
+void CCRPacketSinkBase::Stop()
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSinkBase::SetSeqAndTS
+//
+// -----------------------------------------------------------------------------
+//
+void CCRPacketSinkBase::SetSeqAndTS(
+ TUint& /*aAudioSeq*/,
+ TUint& /*aAudioTS*/,
+ TUint& /*aVideoSeq*/,
+ TUint& /*aVideoTS*/ )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSinkBase::SetRange
+//
+// -----------------------------------------------------------------------------
+//
+void CCRPacketSinkBase::SetRange( TReal /*aLower*/, TReal /*aUpper*/ )
+ {
+ // None
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRPacketSourceBase.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,191 @@
+/*
+* 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: Base class for all packet sources*
+*/
+
+
+
+
+// INCLUDES
+#include "CCRPacketSourceBase.h"
+#include "CCRPacketBuffer.h"
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+// None
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRPacketSourceBase::CCRPacketSourceBase
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCRPacketSourceBase::CCRPacketSourceBase(
+ CCRStreamingSession& aSession,
+ CCRStreamingSession::TCRSourceId aSourceId )
+ : iOwningSession( aSession ),
+ iSourceId( aSourceId )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSourceBase::CCRPacketSourceBase
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRPacketSourceBase::~CCRPacketSourceBase()
+ {
+ iBuffer = NULL; // Does not delete and it is right thing.
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSourceBase::SetBuffer
+//
+// -----------------------------------------------------------------------------
+//
+void CCRPacketSourceBase::SetBuffer( CCRPacketBuffer* aBuffer )
+ {
+ iBuffer = aBuffer;
+ // By default variables are set for continous streaming
+ iBuffer->ContinousStream( ETrue );
+ iBuffer->MoreComing( ETrue );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSourceBase::SeqAndTS
+// -----------------------------------------------------------------------------
+//
+TInt CCRPacketSourceBase::SeqAndTS(
+ TUint& /*aAudioSeq*/,
+ TUint& /*aAudioTS*/,
+ TUint& /*aVideoSeq*/,
+ TUint& /*aVideoTS*/ )
+ {
+ return KErrNotReady;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSourceBase::Id
+//
+// -----------------------------------------------------------------------------
+//
+CCRStreamingSession::TCRSourceId CCRPacketSourceBase::Id( void ) const
+ {
+ return iSourceId;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSourceBase::RegisterConnectionObs
+// -----------------------------------------------------------------------------
+//
+void CCRPacketSourceBase::RegisterConnectionObs(
+ MCRConnectionObserver* /*aObserver*/ )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSourceBase::Play
+// -----------------------------------------------------------------------------
+//
+TInt CCRPacketSourceBase::Play(
+ const TReal& /*aStartPos*/,
+ const TReal& /*aEndPos*/ )
+ {
+ LOG( "CCRPacketSourceBase::Play(), KErrCompletion !" );
+
+ return KErrCompletion;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSourceBase::Pause
+// -----------------------------------------------------------------------------
+//
+TInt CCRPacketSourceBase::Pause()
+ {
+ LOG( "CCRPacketSourceBase::Pause(), KErrCompletion !" );
+
+ return KErrCompletion;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSourceBase::Stop
+// -----------------------------------------------------------------------------
+//
+TInt CCRPacketSourceBase::Stop()
+ {
+ LOG( "CCRPacketSourceBase::Stop(), KErrCompletion" );
+
+ return KErrCompletion;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSourceBase::SetPosition
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCRPacketSourceBase::SetPosition( const TInt64 /*aPosition*/ )
+ {
+ LOG( "CCRPacketSourceBase::SetPosition(), KErrCompletion !" );
+
+ return KErrCompletion;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSourceBase::GetPosition
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCRPacketSourceBase::GetPosition( TInt64& aPosition, TInt64& aDuration )
+ {
+ LOG( "CCRPacketSourceBase::GetPosition(), KErrCompletion !" );
+
+ aPosition = 0;
+ aDuration = 0;
+ return KErrCompletion;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSourceBase::GetRange
+// -----------------------------------------------------------------------------
+//
+void CCRPacketSourceBase::GetRange( TReal& aLower, TReal& aUpper )
+ {
+ aLower = KRealZero;
+ aUpper = KRealMinusOne;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSourceBase::PostActionL
+// -----------------------------------------------------------------------------
+//
+void CCRPacketSourceBase::PostActionL()
+ {
+ LOG( "CCRPacketSourceBase::PostActionL(), Leaves KErrCompletion !" );
+
+ User::Leave( KErrCompletion );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPacketSourceBase::Restore
+// -----------------------------------------------------------------------------
+//
+void CCRPacketSourceBase::Restore()
+ {
+ // None
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRPunchPacketSender.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,212 @@
+/*
+* 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: Firewall/nat box puncher*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCRPunchPacketSender.h"
+#include "CCRRtspPacketSource.h"
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+// None.
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRPunchPacketSender::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCRPunchPacketSender* CCRPunchPacketSender::NewL(
+ RConnection& aConnection,
+ RSocketServ& aSockServer,
+ TInetAddr& aFromAddr,
+ TInetAddr& aRemoteAddr ,
+ TUint32 aMySSRC,
+ CCRRtspPacketSource& aOwner )
+ {
+ CCRPunchPacketSender* self = new( ELeave ) CCRPunchPacketSender(
+ aConnection, aSockServer, aFromAddr, aRemoteAddr, aMySSRC, aOwner );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPunchPacketSender::CCRPunchPacketSender
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCRPunchPacketSender::CCRPunchPacketSender(
+ RConnection& aConnection,
+ RSocketServ& aSockServer,
+ TInetAddr& aFromAddr,
+ TInetAddr& aRemoteAddr ,
+ TUint32 aMySSRC,
+ CCRRtspPacketSource& aOwner )
+ : iConnection( aConnection ),
+ iSockServer( aSockServer ),
+ iFromAddr( aFromAddr ),
+ iRemoteAddr( aRemoteAddr ),
+ iMySSRC( aMySSRC ),
+ iOwner( aOwner )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPunchPacketSender::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCRPunchPacketSender::ConstructL()
+ {
+ iSock1 = CCRSock::NewL( *this, 1, iConnection, iSockServer, EFalse, EFalse );
+ User::LeaveIfError( iSock1->ConnectSock( iRemoteAddr, iFromAddr.Port() ) );
+ iSock2 = CCRSock::NewL( *this, 2, iConnection, iSockServer, EFalse, EFalse );
+ TInetAddr remoteAddr2 = iRemoteAddr;
+ remoteAddr2.SetPort ( iRemoteAddr.Port() + 1 );
+ User::LeaveIfError( iSock2->ConnectSock( remoteAddr2, iFromAddr.Port() + 1 ) );
+ iCleanUp = new ( ELeave ) CAsyncCallBack( CActive::EPriorityStandard ) ;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPunchPacketSender::~CCRPunchPacketSender
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRPunchPacketSender::~CCRPunchPacketSender()
+ {
+ LOG( "CCRPunchPacketSender::~CCRPunchPacketSender" );
+
+ delete iSock1;
+ delete iSock2;
+ delete iCleanUp;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPunchPacketSender::DataReceived
+//
+// This is called when data is received from socket.
+// -----------------------------------------------------------------------------
+//
+void CCRPunchPacketSender::DataReceived( TInt /*aSockId*/, const TDesC8& /*aData*/ )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRPunchPacketSender::SockStatusChange
+//
+// This is called when socket status changes.
+// -----------------------------------------------------------------------------
+//
+void CCRPunchPacketSender::SockStatusChange(
+ TInt aSockId,
+ CCRSock::TCRSockStatus aStatus,
+ TInt aError )
+ {
+ if ( aStatus == CCRSock::EFailed )
+ {
+ LOG3( "CCRPunchPacketSender::SockStatusChange(), aSockId: id: %d, aStatus: %d, aError: %d",
+ aSockId, ( TInt )aStatus, aError );
+ iOwner.SockStatusChange( aSockId, aStatus, aError );
+ }
+ else if ( aStatus == CCRSock::EIdle )
+ {
+ if ( iSentViaSock2 && iSentViaSock1 )
+ {
+
+ if ( !iCleanUp->IsActive() )
+ {
+ TCallBack cb( CleanupCallBack, this );
+ iCleanUp->Set( cb );
+ iCleanUp->CallBack();
+ }
+ }
+ else
+ {
+ // here send
+ TDesC8* packet = NULL;
+ if ( iMySSRC )
+ {
+ // construct valid packet only if we have SSRC
+ TBuf8<8> receiverReport;
+ receiverReport.Zero();
+ receiverReport.AppendFill( 0x0, 7 );
+ TUint8 *rrPtr = const_cast<TUint8 *>( receiverReport.PtrZ() );
+ rrPtr[0] = 0x80; // version and count
+ rrPtr[1] = 0xC9; // packet type 201 = rr
+ rrPtr[2] = 0x00; // packet len high bits = 0
+ rrPtr[3] = 0x01; // packet len low bits = 1 e.g. len = 1
+ BigEndian::Put32( ( TUint8* )( &rrPtr[4] ), iMySSRC );
+ packet = &receiverReport;
+ }
+ else
+ {
+ // Atleast construct a kind-of valid packet.
+ TBuf8<12> appPacket;
+ appPacket.Zero();
+ appPacket.AppendFill( 0x0, 11 );
+ TUint8 *rrPtr = const_cast<TUint8 *>( appPacket.PtrZ() );
+ rrPtr[0] = 0x80; // version and subtype
+ rrPtr[1] = 0xCC; // packet type 204 = APP
+ rrPtr[2] = 0x00; // packet len high bits = 0
+ rrPtr[3] = 0x01; // packet len low bits = 1 e.g. len = 1
+ // this is not a valid SSRC
+ BigEndian::Put32( ( TUint8* )( &rrPtr[4] ), iMySSRC );
+ rrPtr[8] = 0x44; // ASCII: D
+ rrPtr[9] = 0x56; // ASCII: V
+ rrPtr[10] = 0x52; // ASCII: R
+ rrPtr[11] = 0x45; // ASCII: E
+ packet = &appPacket;
+ }
+ if ( aSockId == 1 && iSock1 && !iSentViaSock1 )
+ {
+ iSock1->SendData( *packet );
+ iSentViaSock1 = ETrue;
+ }
+ else if ( aSockId == 2 && iSock2 && !iSentViaSock2 )
+ {
+ iSock2->SendData( *packet );
+ iSentViaSock2 = ETrue;
+ }
+ else
+ {
+ // None
+ }
+ }
+ }
+ }
+
+//-----------------------------------------------------------------------------
+// CCRPunchPacketSender::CleanupCallBack()
+//-----------------------------------------------------------------------------
+TInt CCRPunchPacketSender::CleanupCallBack( TAny* aSelf )
+ {
+ LOG( "CCRPunchPacketSender::CleanupCallBack()" );
+
+ CCRPunchPacketSender* self = static_cast<CCRPunchPacketSender*>( aSelf );
+ delete self->iSock1; self->iSock1 = NULL;
+ delete self->iSock2; self->iSock2 = NULL;
+ self->iOwner.PunchPacketsSent( self );
+ return KErrNone;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRRTSPCommand.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,761 @@
+/*
+* 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: RTSP command parser and producer*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCRRtspCommand.h"
+#include "CCRSock.h"
+#include <imcvcodc.h>
+#include <Hash.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+const TReal KRealZero( 0.0 );
+const TReal KRealMinusOne( -1.0 );
+// Length of a digest hash before converting to hex.
+const TInt KCRRawHashLength( 16 );
+// Length of a digest hash when represented in hex
+const TInt KCRHashLength( 32 );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCRRtspCommand* CCRRtspCommand::NewL()
+ {
+ CCRRtspCommand* self = new( ELeave ) CCRRtspCommand();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::CCRRtspCommand
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCRRtspCommand::CCRRtspCommand()
+ : iCommand( ERTSPCommandNOCOMMAND )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommand::ConstructL()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::~CCRRtspCommand
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRRtspCommand::~CCRRtspCommand()
+ {
+ LOG( "CCRRtspCommand::~CCRRtspCommand" );
+
+ // iRtspText is deleted in base class destructor
+ delete iAuthHeader;
+ delete iMD5Calculator;
+ delete iUserAgent;
+ delete iWapProfile;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::TryParseL
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommand::TryParseL( const TDesC8 &aString )
+ {
+ // try to find out if end of the command has been received
+ // "RTSP/1.0 XXX\r\n\r\n" at least..
+ const TInt KDVRMinCommandLen( 14 );
+ TInt replyEndOffSet( ( aString.Length() < KDVRMinCommandLen )?
+ KDVRMinCommandLen: aString.Find( KCR2NewLines() ) );
+ if ( replyEndOffSet == KErrNotFound )
+ {
+ // need to have more, do nothing yet
+ LOG( "CCRRtspCommand::TryParseL() out because response not complete" );
+ User::Leave( KErrUnderflow );
+ }
+
+ // copy the stuff into local variable:
+ delete iRtspText; iRtspText = NULL;
+ iRtspText = aString.AllocL();
+ iCommand = ERTSPCommandNOCOMMAND;
+
+ // try each command in order:
+ if ( iRtspText->Find( KCROPTIONS() ) == 0 )
+ {
+ // it was OPTIONS command
+ LOG( "CCRRtspCommand::TryParseL() -> OPTIONS" );
+ iCommand = ERTSPCommandOPTIONS;
+ }
+ else if ( iRtspText->Find( KCRDESCRIBE() ) == 0 )
+ {
+ LOG( "CCRRtspCommand::TryParseL() -> DESCRIBE" );
+ iCommand = ERTSPCommandDESCRIBE;
+ }
+ else if ( iRtspText->Find( KCRTEARDOWN() ) == 0 )
+ {
+ LOG( "CCRRtspCommand::TryParseL() -> TEARDOWN" );
+ iCommand = ERTSPCommandTEARDOWN;
+ }
+ else if ( iRtspText->Find( KCRPAUSE() ) == 0 )
+ {
+ LOG( "CCRRtspCommand::TryParseL() -> PAUSE" );
+ iCommand = ERTSPCommandPAUSE;
+ }
+ else if ( iRtspText->Find( KCRSETUP() ) == 0 )
+ {
+ LOG( "CCRRtspCommand::TryParseL() -> SETUP" );
+ iCommand = ERTSPCommandSETUP;
+ }
+ else if ( iRtspText->Find( KCRPLAY() ) == 0 )
+ {
+ LOG( "CCRRtspCommand::TryParseL() -> PLAY" );
+ iCommand = ERTSPCommandPLAY;
+ }
+ else
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+ // then find CSeq
+ FindCSeqL();
+ // then find session id
+ FindSessionIdL();
+ // then find possible content. for commands it is usually not there
+ FindContentL();
+ // find URL
+ FindURLL();
+ // find possible transport method
+ // IMPORTANT: should be done before parsing client port
+ FindTransport();
+ // find possible client port
+ FindClientPorts();
+ // find possible range-header
+ ParseRange();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::FindURLL
+// in rtsp the URL is between first and second whitespace.
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommand::FindURLL( void )
+ {
+#ifdef _DEBUG
+ _LIT( KPanicStr, "RTSPCommon" );
+ __ASSERT_DEBUG( iRtspText,
+ User::Panic( KPanicStr, KErrBadHandle ) );
+#endif
+
+ iURL.Set( NULL, 0 );
+ TInt spaceOffset( iRtspText->Locate( ' ' ) );
+ if ( spaceOffset < 0 )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+ TPtrC8 beginningFromUrl( iRtspText->Right( iRtspText->Length() -
+ ( spaceOffset + 1 ) ) ) ;
+ spaceOffset = beginningFromUrl.Locate( ' ' );
+ if ( spaceOffset < 0 )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+ iURL.Set( beginningFromUrl.Left( spaceOffset ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::URL
+//
+// method that returns URL
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtspCommand::URL( TPtrC8& aURL )
+ {
+ if ( iURL.Ptr() != NULL )
+ {
+ aURL.Set ( iURL );
+ return KErrNone;
+ }
+
+ return KErrNotFound;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::SetURL
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommand::SetURL ( const TDesC8& aURL )
+ {
+ iURL.Set ( aURL );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::SetAuthentication
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommand::SetAuthentication( TBool aAuth )
+ {
+ iAuthenticationNeeded = aAuth;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::SetUserAgentL
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommand::SetUserAgentL( const TDesC8& aUserAgent )
+ {
+ delete iUserAgent; iUserAgent = NULL;
+ iUserAgent = aUserAgent.AllocL();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::SetBandwidth
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommand::SetBandwidth( TInt aBandwidth )
+ {
+ iBandwidth = aBandwidth;
+ iBandwidthAvailable = ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::SetWapProfileL
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommand::SetWapProfileL( const TDesC8& aWapProfile )
+ {
+ delete iWapProfile; iWapProfile = NULL;
+ iWapProfile = aWapProfile.AllocL();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::SetCommand
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommand::SetCommand( TCommand aCommand )
+ {
+ iCommand = aCommand;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::Command
+//
+// -----------------------------------------------------------------------------
+//
+CCRRtspCommand::TCommand CCRRtspCommand::Command( void ) const
+ {
+ return iCommand;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::ProduceL
+//
+// -----------------------------------------------------------------------------
+//
+TPtrC8& CCRRtspCommand::ProduceL( void )
+ {
+ // First common part for all commands, except actual command
+ delete iRtspText; iRtspText = NULL;
+ iRtspText = HBufC8::NewL( KMaxName );
+ iRtspText->Des().Zero();
+
+ switch ( iCommand )
+ {
+ case ERTSPCommandOPTIONS:
+ AppendL( iRtspText, KCROPTIONS );
+ break;
+
+ case ERTSPCommandDESCRIBE:
+ AppendL( iRtspText, KCRDESCRIBE );
+ break;
+
+ case ERTSPCommandTEARDOWN:
+ AppendL( iRtspText, KCRTEARDOWN );
+ break;
+
+ case ERTSPCommandPAUSE:
+ AppendL( iRtspText, KCRPAUSE );
+ break;
+
+ case ERTSPCommandSETUP:
+ AppendL( iRtspText, KCRSETUP );
+ break;
+
+ case ERTSPCommandPLAY :
+ AppendL( iRtspText, KCRPLAY );
+ break;
+
+ default:
+ User::Leave( KErrNotSupported );
+ break;
+ }
+
+ AppendL( iRtspText, iURL );
+ AppendL( iRtspText, KCRSpace );
+ AppendL( iRtspText, KCRRTSP10 );
+ AppendL( iRtspText, KCRNewLine );
+ AppendL( iRtspText, KCRCSeq );
+ AppendNumL( iRtspText, iCSeq );
+ AppendL( iRtspText, KCRNewLine );
+
+ if ( iUserAgent )
+ {
+ TPtrC8 useragent( iUserAgent->Des() );
+ AppendFormatL( iRtspText, KCRRTSPUserAgentHeader, &useragent );
+ }
+
+ // then variable tail depending on command
+ switch ( iCommand )
+ {
+ case ERTSPCommandOPTIONS:
+ if ( iSessionId.Ptr() != NULL )
+ {
+ AppendL( iRtspText, KCRSessionStr() );
+ AppendL( iRtspText, iSessionId ); // now only session number
+ AppendL( iRtspText, KCRNewLine );
+ }
+ break;
+
+ case ERTSPCommandDESCRIBE:
+ {
+ AppendL( iRtspText, KCRAcceptSDP );
+ if ( iWapProfile )
+ {
+ TPtrC8 profile = iWapProfile->Des();
+ AppendFormatL( iRtspText, KCRRTSPXWapProfile, &profile );
+ }
+ if ( iBandwidthAvailable )
+ {
+ AppendFormatL( iRtspText, KCRRTSPBandwidth, iBandwidth );
+ }
+ }
+ break;
+
+ case ERTSPCommandTEARDOWN:
+ if ( iSessionId.Ptr() != NULL )
+ {
+ AppendL( iRtspText, KCRSessionStr() );
+ AppendL( iRtspText, iSessionId ); // now only session number
+ AppendL( iRtspText, KCRNewLine );
+ }
+ break;
+
+ case ERTSPCommandPAUSE:
+ if ( iSessionId.Ptr() != NULL )
+ {
+ AppendL( iRtspText, KCRSessionStr() );
+ AppendL( iRtspText, iSessionId ); // now only session number
+ AppendL( iRtspText, KCRNewLine );
+ }
+ break;
+
+ case ERTSPCommandSETUP:
+ {
+ // build transport header according to chosen method
+ switch ( iTransport )
+ {
+ case ERTPOverUDP:
+ AppendFormatL( iRtspText, KCRTransportHeaderUDP,
+ iClientPort, iClientPort + 1 );
+ break;
+ case ERTPOverTCP:
+ AppendFormatL( iRtspText, KCRTransportHeaderTCP,
+ iClientPort, iClientPort + 1 );
+ break;
+
+ case ERTPOverMulticast:
+ AppendL( iRtspText, KCRTransportHeaderMulticast );
+ break;
+ }
+
+ // Session: 5273458854096827704
+ if ( iSessionId.Ptr() != NULL )
+ {
+ AppendL( iRtspText, KCRSessionStr );
+ AppendL( iRtspText, iSessionId ); // now only session number
+ AppendL( iRtspText, KCRNewLine );
+ }
+ if ( iWapProfile )
+ {
+ TPtrC8 profile( iWapProfile->Des() );
+ AppendFormatL( iRtspText, KCRRTSPXWapProfile, &profile );
+ }
+ }
+ break;
+
+ case ERTSPCommandPLAY:
+ {
+ if ( !( iLowerRange == KRealZero && iUpperRange == KRealMinusOne ) )
+ {
+ // Range was something else than 0,-1
+ TBuf8<KMaxName> buf( KCRRangeHeader );
+ TRealFormat format( 10, 3 );
+ format.iTriLen = 0;
+ format.iPoint = '.';
+ buf.AppendNum( iLowerRange, format );
+ buf.Append( '-' );
+ if ( iUpperRange > KRealZero )
+ {
+ buf.AppendNum( iUpperRange, format );
+ }
+
+ buf.Append( KCRNewLine );
+ AppendL( iRtspText, buf );
+ }
+ if ( iSessionId.Ptr() != NULL )
+ {
+ AppendL( iRtspText, KCRSessionStr() );
+ AppendL( iRtspText, iSessionId ); // now only session number
+ AppendL( iRtspText, KCRNewLine );
+ }
+ }
+ break;
+
+ default:
+ User::Leave( KErrNotSupported );
+ break;
+ }
+
+ if ( iAuthenticationNeeded )
+ {
+ TBool useDigest( EFalse );
+
+ if ( iAuthType && ( iAuthType->FindC( KCRAuthDigest ) != KErrNotFound ) )
+ {
+ useDigest = ETrue;
+ }
+
+ switch ( iCommand )
+ {
+ case ERTSPCommandOPTIONS :
+ useDigest ? CalculateDigestResponseL( KCROPTIONSNoSpace ) :
+ CalculateBasicResponseL( KCROPTIONSNoSpace );
+
+ if ( iAuthHeader )
+ {
+ AppendL( iRtspText, iAuthHeader->Des() );
+ }
+ break;
+
+ case ERTSPCommandDESCRIBE :
+ useDigest ? CalculateDigestResponseL( KCRDESCRIBENoSpace ) :
+ CalculateBasicResponseL( KCRDESCRIBENoSpace );
+
+ if ( iAuthHeader )
+ {
+ AppendL( iRtspText, iAuthHeader->Des() );
+ }
+ break;
+
+ case ERTSPCommandTEARDOWN :
+ useDigest ? CalculateDigestResponseL( KCRTEARDOWNNoSpace ) :
+ CalculateBasicResponseL( KCRTEARDOWNNoSpace );
+
+ if ( iAuthHeader )
+ {
+ AppendL( iRtspText, iAuthHeader->Des() );
+ }
+ break;
+
+ case ERTSPCommandPAUSE :
+ useDigest ? CalculateDigestResponseL( KCRPAUSENoSpace ) :
+ CalculateBasicResponseL( KCRPAUSENoSpace );
+
+ if ( iAuthHeader )
+ {
+ AppendL( iRtspText, iAuthHeader->Des() );
+ }
+ break;
+
+ case ERTSPCommandSETUP :
+ useDigest ? CalculateDigestResponseL( KCRSETUPNoSpace ) :
+ CalculateBasicResponseL( KCRSETUPNoSpace );
+
+ if ( iAuthHeader )
+ {
+ AppendL( iRtspText, iAuthHeader->Des() );
+ }
+ break;
+
+ case ERTSPCommandPLAY :
+ useDigest ? CalculateDigestResponseL( KCRPLAYNoSpace ) :
+ CalculateBasicResponseL( KCRPLAYNoSpace );
+
+ if ( iAuthHeader )
+ {
+ AppendL( iRtspText, iAuthHeader->Des() );
+ }
+ break;
+
+ default:
+ User::Leave( KErrNotSupported );
+ break;
+ }
+ }
+
+ AppendL( iRtspText, KCRNewLine );
+ iProductDescriptor.Set( *iRtspText );
+ return iProductDescriptor;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::AppendL
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommand::AppendL( HBufC8*& aBuffer, const TDesC8& aStr )
+ {
+ TPtr8 ptr( aBuffer->Des() );
+ if ( ( ptr.Length() + aStr.Length() ) >= ptr.MaxLength() )
+ {
+ const TInt newLength( ptr.Length() + aStr.Length() + KMaxName );
+ aBuffer = aBuffer->ReAllocL( newLength );
+ ptr.Set( aBuffer->Des() );
+ }
+
+ ptr.Append( aStr );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::AppendNumL
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommand::AppendNumL( HBufC8*& aBuffer, const TInt aNum )
+ {
+ TPtr8 ptr( aBuffer->Des() );
+ if ( ( ptr.Length() + KMaxInfoName ) >= ptr.MaxLength() )
+ {
+ const TInt newLength( ptr.Length() + KMaxInfoName + KMaxName );
+ aBuffer = aBuffer->ReAllocL( newLength );
+ ptr.Set( aBuffer->Des() );
+ }
+
+ ptr.AppendNum( aNum );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::AppendFormatL
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommand::AppendFormatL(
+ HBufC8*& aBuffer,
+ TRefByValue<const TDesC8> aFmt, ... )
+ {
+ VA_LIST list;
+ VA_START( list, aFmt );
+ HBufC8* buf = HBufC8::NewLC( KMaxDataSize );
+ buf->Des().FormatList( aFmt, list );
+ VA_END( list );
+
+ TPtr8 ptr( aBuffer->Des() );
+ if ( ( ptr.Length() + buf->Length() ) >= ptr.MaxLength() )
+ {
+ const TInt newLength( ptr.Length() + buf->Length() + KMaxName );
+ aBuffer = aBuffer->ReAllocL( newLength );
+ ptr.Set( aBuffer->Des() );
+ }
+
+ ptr.Append( *buf );
+ CleanupStack::PopAndDestroy( buf );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::Hash
+// Calculates hash value ( from S60 HttpFilters )
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommand::HashL( const TDesC8& aMessage, TDes8& aHash )
+ {
+ LOG( "CCRRtspCommand::HashL() in" );
+ // check if md5 calculator is already constructed
+ if ( !iMD5Calculator )
+ {
+ iMD5Calculator = CMD5::NewL();
+ }
+ // Calculate the 128 bit (16 byte) hash
+ iMD5Calculator->Reset();
+ TPtrC8 hash = iMD5Calculator->Hash( aMessage );
+
+ // Now print it as a 32 byte hex number
+ aHash.Zero();
+ _LIT8( formatStr, "%02x" );
+ TBuf8<2> scratch;
+ for ( TInt i( 0 ); i < KCRRawHashLength; i++ )
+ {
+ scratch.Zero();
+ scratch.Format( formatStr, hash[i] );
+ aHash.Append( scratch );
+ }
+
+ LOG( "CCRRtspCommand::HashL() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::CalculateBasicResponseL
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommand::CalculateBasicResponseL( const TDesC8& /*aMethod*/ )
+ {
+ LOG( "CCRRtspCommand::CalculateBasicResponseL() in" );
+
+ if ( !( iUserName && iPassword ) )
+ {
+ LOG( "CCRRtspCommand::CalculateBasicResponseL() out, username or password not set" );
+ delete iAuthHeader;
+ iAuthHeader = NULL;
+ return; // no can do
+ }
+
+ HBufC8* plainData = HBufC8::NewL( iUserName->Length() + 1 + // ':'
+ iPassword->Length() );
+
+ CleanupStack::PushL( plainData );
+
+ plainData->Des().Append( *iUserName );
+ plainData->Des().Append( ':' );
+ plainData->Des().Append( *iPassword );
+
+ // Max size = ((Bytes + 3 - (Bytes MOD 3)) /3) x 4
+ TInt base64MaxSize = ( ( plainData->Length() + 3 -
+ ( plainData->Length() % 3 ) ) / 3 ) * 4;
+
+ HBufC8* encodedData = HBufC8::NewL( base64MaxSize );
+ TPtr8 dataPrt( encodedData->Des() );
+ CleanupStack::PushL( encodedData );
+
+ TImCodecB64 b64enc;
+ b64enc.Initialise();
+ b64enc.Encode( *plainData, dataPrt );
+
+ delete iAuthHeader;
+ iAuthHeader = NULL;
+ iAuthHeader = HBufC8::NewL( KCRAuthorizationBasicHeader().Length() + encodedData->Length() );
+ iAuthHeader->Des().Format( KCRAuthorizationBasicHeader, encodedData );
+
+ CleanupStack::PopAndDestroy( encodedData );
+ CleanupStack::PopAndDestroy( plainData );
+
+ LOG( "CCRRtspCommand::CalculateBasicResponseL() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommand::CalculateDigestResponseL
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommand::CalculateDigestResponseL( const TDesC8& aMethod )
+ {
+ LOG( "CCRRtspCommand::CalculateDigestResponseL() in" );
+
+ if ( !( iUserName && iPassword && iNonce && iOpaque && iRealm && iUri ) )
+ {
+ LOG( "CCRRtspCommand::CalculateDigestResponseL() out, username or password not set" );
+ delete iAuthHeader; iAuthHeader = NULL;
+ return; // no can do
+ }
+
+ TBuf8<KCRHashLength> hash1;
+ TBuf8<KCRHashLength> hash2;
+ TBuf8<KCRHashLength> finalHash;
+
+ // calculate the hash1 using "username:realm:password"
+ HBufC8* hashPtr = HBufC8::NewL ( iUserName->Length() + 1 + // ':'
+ iRealm->Length() + 1 + // ':'
+ iPassword->Length() );
+ hashPtr->Des().Append( *iUserName );
+ hashPtr->Des().Append( ':' );
+ hashPtr->Des().Append( *iRealm );
+ hashPtr->Des().Append( ':' );
+ hashPtr->Des().Append( *iPassword );
+
+ HashL( *hashPtr, hash1 );
+ delete hashPtr; hashPtr = NULL;
+
+ // calculate hash2 using "Method:uri"
+ HBufC8* hashPtr2 = HBufC8::NewL(aMethod.Length() + 1 + iUri->Length() );
+ hashPtr2->Des().Append( aMethod );
+ hashPtr2->Des().Append( ':' );
+ hashPtr2->Des().Append( *iUri );
+
+ HashL( *hashPtr2, hash2 );
+ delete hashPtr2; hashPtr2 = NULL;
+
+ // calculate finalHash to be sent to remote server using
+ // hash1 + ":" + nonce + ":" + hash2
+ HBufC8* hashPtr3 = HBufC8::NewL( hash1.Length() + 1 + // ':'
+ iNonce->Length() + 1 + // ':'
+ hash2.Length() );
+ hashPtr3->Des().Append( hash1 );
+ hashPtr3->Des().Append( ':' );
+ hashPtr3->Des().Append( *iNonce );
+ hashPtr3->Des().Append( ':' );
+ hashPtr3->Des().Append( hash2 );
+
+ HashL( *hashPtr3, finalHash );
+ delete hashPtr3; hashPtr3 = NULL;
+
+ // generate the authentication header
+ if ( iOpaque->Length() )
+ {
+ delete iAuthHeader; iAuthHeader = NULL;
+ iAuthHeader = HBufC8::NewL( KCRAuthorizationHeader().Length() +
+ iUserName->Length() + iRealm->Length() + iNonce->Length() +
+ iUri->Length() + finalHash.Length() + iOpaque->Length() );
+
+ iAuthHeader->Des().Format( KCRAuthorizationHeader, iUserName,
+ iRealm, iNonce, iUri, &finalHash, iOpaque );
+ }
+ else
+ {
+ delete iAuthHeader; iAuthHeader = NULL;
+ iAuthHeader = HBufC8::NewL( KCRAuthorizationHeaderNoOpaque().Length() +
+ iUserName->Length() + iRealm->Length() + iNonce->Length() +
+ iUri->Length() + finalHash.Length() );
+
+ iAuthHeader->Des().Format( KCRAuthorizationHeaderNoOpaque, iUserName,
+ iRealm, iNonce, iUri, &finalHash );
+ }
+
+ LOG( "CCRRtspCommand::CalculateDigestResponseL() out" );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRRTSPCommon.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,706 @@
+/*
+* 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: RTSP command/response common part*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CRRtspCommon.h"
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+const TReal KRealZero( 0.0 );
+const TReal KRealMinusOne( -1.0 );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::CCRRtspCommon
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCRRtspCommon::CCRRtspCommon ()
+ : iContentLen( KErrNotFound ),
+ iContent( NULL, 0 ),
+ iCSeq( KErrNotFound ),
+ iSessionId( NULL, 0 ),
+ iClientPort( KErrNotFound ),
+ iLowerRange( KRealZero ),
+ iUpperRange( KRealMinusOne ),
+ iIsLiveStream( EFalse )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::~CCRRtspCommon
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRRtspCommon::~CCRRtspCommon()
+ {
+ LOG( "CCRRtspCommon::~CCRRtspCommon()" );
+
+ delete iRtspText;
+ delete iRealm;
+ delete iOpaque;
+ delete iNonce;
+ delete iUserName;
+ delete iUri;
+ delete iPassword;
+ delete iAuthType;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::CSeq
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtspCommon::CSeq( void )
+ {
+ return iCSeq;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::SetCSeq
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::SetCSeq( TInt aCSeq )
+ {
+ iCSeq = aCSeq;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::FindCSeqL
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::FindCSeqL( void )
+ {
+ TInt offSet( iRtspText->FindC( KCRCSeq() ) );
+ if ( offSet == KErrNotFound )
+ {
+ LOG( "CCRRtspCommon::FindCSeqL FAILED, 'CSeq' not found [1]" );
+ User::Leave ( KErrNotSupported );
+ }
+
+ offSet += KCRCSeq().Length();
+ TInt eolOffSet = iRtspText->Right ( iRtspText->Length() -
+ offSet ).Find ( KCRNewLine() );
+ if ( eolOffSet == KErrNotFound )
+ {
+ LOG1( "CCRRtspCommon::FindCSeqL FAILED, 'CSeq' not found [2], offset=%d", offSet );
+ User::Leave ( KErrNotSupported );
+ }
+ TPtrC8 CSeqString ( iRtspText->Mid ( offSet, eolOffSet ) );
+ TLex8 CSeqNumberLex( CSeqString );
+ User::LeaveIfError ( CSeqNumberLex.Val( iCSeq ) ) ;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::FindSessionIdL
+//
+// method that finds session id from RTSP response
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::FindSessionIdL( void )
+ {
+ iSessionId.Set( NULL, 0 );
+ TInt sessionStringOffset( iRtspText->FindC( KCRNlAndSession() ) );
+ if ( sessionStringOffset > 0 )
+ {
+ TPtrC8 beginningFromSession( iRtspText->Right( iRtspText->Length() -
+ ( sessionStringOffset + 11 ) ) );
+ TInt lfStringOffset( beginningFromSession.Find( KCRNewLine ) );
+ if ( lfStringOffset != KErrNotFound )
+ {
+ iSessionId.Set( beginningFromSession.Mid( 0, lfStringOffset ) );
+ // with some servers there is;Timeout=xxx after the session id;
+ // lets strip that out:
+ TInt semicolonOffset( iSessionId.Locate( ';' ) );
+ if ( semicolonOffset > 0 )
+ {
+ iSessionId.Set( iSessionId.Mid( 0, semicolonOffset ) );
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::SessionId
+//
+// method that returns session id string
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtspCommon::SessionId( TPtrC8& aId )
+ {
+ if ( iSessionId.Ptr() != NULL )
+ {
+ aId.Set( iSessionId );
+ return KErrNone;
+ }
+ else
+ {
+ return KErrNotFound;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::SetSessionId
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::SetSessionId( TPtrC8& aId )
+ {
+ iSessionId.Set( aId );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::FindContentL
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::FindContentL( void )
+ {
+#ifdef _DEBUG
+ _LIT(KPanicStr, "RTSPCommon");
+ __ASSERT_DEBUG( iRtspText,
+ User::Panic( KPanicStr, KErrBadHandle ) );
+#endif
+ // find possible content:
+ //
+ TInt replyEndOffSet( iRtspText->Find( KCR2NewLines ) );
+ if ( replyEndOffSet > KErrNotFound )
+ {
+ replyEndOffSet += KCR2NewLines().Length();
+ }
+
+ // next thing to check if there is content-length-header,
+ // it seems like it may follow about any response..
+ //
+ TInt contentLenOffset( KErrNotFound );
+ iContentLen = KErrNotFound; // this will hold (usually SDP) length
+ if ( ( contentLenOffset = iRtspText->Des().FindC(
+ KCRRTSPContentLength() ) ) != KErrNotFound )
+ {
+ TLex8 contentLenLex( iRtspText->Des().Mid( contentLenOffset + 16, 5 ) );
+ User::LeaveIfError( contentLenLex.Val( iContentLen ) );
+ }
+
+ LOG1( "CCRRtspCommon::FindContentL(), iContentLen: %d", iContentLen );
+
+ // then set content in place
+ if ( replyEndOffSet > iRtspText->Length() )
+ {
+ LOG( "CCRRtspCommon::FindContentL() out because too litle data !" );
+ User::Leave( KErrUnderflow );
+ }
+ if ( iContentLen > KErrNotFound )
+ {
+ iContent.Set( iRtspText->Des().Mid( replyEndOffSet, iContentLen ) );
+ }
+ else
+ {
+ iContent.Set( NULL, 0 );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::ContentLen
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtspCommon::ContentLen( void )
+ {
+ return iContentLen;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::Content
+//
+// -----------------------------------------------------------------------------
+//
+TPtrC8& CCRRtspCommon::Content( void )
+ {
+ return iContent ;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::FindClientPorts
+//
+// method that finds client port numeric value
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::FindClientPorts( void )
+ {
+ iClientPort = KErrNotFound;
+
+ // Bend concept of client port to mean also the interleaved channel for TCP streaming
+ const TDesC8& portdes( ( iTransport == ERTPOverTCP )? KCRInterleaved():
+ ( iTransport == ERTPOverMulticast )? KCRPort():
+ KCRClient_Port() );
+
+ TInt portNumberOffset( iRtspText->FindC( portdes ) );
+ if ( portNumberOffset != KErrNotFound )
+ {
+ TPtrC8 portNumberStr( iRtspText->Mid( portNumberOffset + portdes.Length() ) );
+ TInt endoffset = portNumberStr.FindC( KCRDash() );
+ if ( endoffset >= 0 )
+ {
+ portNumberStr.Set( portNumberStr.Left( endoffset ) );
+ }
+ else
+ {
+ endoffset = portNumberStr.FindC( KCRSemiColon() );
+ if ( endoffset >= 0 )
+ {
+ portNumberStr.Set( portNumberStr.Left( endoffset ) );
+ }
+ }
+ TLex8 portNumberLex( portNumberStr );
+ if ( portNumberLex.Val( iClientPort ) != KErrNone )
+ { // something wrong?
+ LOG( "CCRRtspCommon::FindClientPorts val != KErrNone" );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::ClientPort
+//
+// method that returns client port numeric value
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtspCommon::ClientPort( void )
+ {
+ return iClientPort;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::SetClientPort
+//
+// method that sets client port numeric value
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::SetClientPort( TInt aPort )
+ {
+ iClientPort = aPort;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::FindTransport
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::FindTransport()
+ {
+ // User TCP streaming if 'RTP/AVP/TCP' found
+ if ( iRtspText->FindC( KCRSDPRTPAVPTCP ) != KErrNotFound )
+ {
+ iTransport = ERTPOverTCP;
+ }
+ // multicast UDP if 'multicast' present
+ else if ( iRtspText->FindC( KCRSDPMulticast ) != KErrNotFound ||
+ iRtspText->FindC( KCRSDPRTPAVPUDP ) != KErrNotFound &&
+ iRtspText->FindC( KCRDestination ) != KErrNotFound )
+ {
+ iTransport = ERTPOverMulticast;
+ }
+ // otherwise, plain unicast UDP
+ else
+ {
+ iTransport = ERTPOverUDP;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::Transport
+// -----------------------------------------------------------------------------
+//
+TCRRTPTransport CCRRtspCommon::Transport()
+ {
+ return iTransport;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::SetTransport
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::SetTransport( TCRRTPTransport aTransport )
+ {
+ iTransport = aTransport;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::FindDestination
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::FindDestination()
+ {
+ // resets destination to KAFUnspec
+ iDestination = TInetAddr();
+
+ // search for destination
+ TInt startoffset = iRtspText->FindC( KCRDestination() );
+ if ( startoffset >= 0 )
+ {
+ startoffset += KCRDestination().Length();
+ TPtrC8 destdes = iRtspText->Mid( startoffset );
+ TInt endoffset = destdes.FindC( KCRSemiColon() );
+ if ( endoffset >= 0 )
+ {
+ destdes.Set( destdes.Left(endoffset) );
+ }
+
+ TBuf<128> destbuf;
+ destbuf.Copy( destdes.Left(128) );
+ TInt err = iDestination.Input( destbuf );
+ if ( err != KErrNone )
+ {
+ LOG1( "CCRRtspCommon::FindDestination(), INVALID destination address '%S'", &destbuf );
+ }
+ else
+ {
+ LOG1( "CCRRtspCommon::FindDestination(), multicast address '%S'", &destbuf );
+ iDestination.ConvertToV4Mapped();
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::Destination
+// -----------------------------------------------------------------------------
+//
+const TInetAddr& CCRRtspCommon::Destination()
+ {
+ return iDestination;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::SetRange
+//
+// method that sets Range: header values
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::SetRange( TReal aLower , TReal aUpper )
+ {
+ iLowerRange = aLower;
+ iUpperRange = aUpper;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::GetRange
+//
+// method that gets Range: header values
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::GetRange( TReal& aLower , TReal& aUpper )
+ {
+ aLower = iLowerRange;
+ aUpper = iUpperRange;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::ParseRange
+//
+// method that tries to parse contents of possible Range: header
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::ParseRange( void )
+ {
+ if ( iRtspText )
+ {
+ TInt rangeHeaderOffset( iRtspText->Des().FindC( KCRRangeHeader ) );
+ if ( rangeHeaderOffset > 0 )
+ {
+ // check for live-stream specific range "Range: npt=now-"
+ if ( iRtspText->Des().FindC( KCRRangeHeaderLiveStream ) > KErrNotFound )
+ { // yes, this is a live stream
+ iLowerRange = KRealZero;
+ iUpperRange = KRealMinusOne;
+ iIsLiveStream = ETrue;
+ LOG( "CCRRtspCommon::ParseRange(), Found livestream range" );
+ }
+ else
+ {
+ TPtrC8 rangeHeader = iRtspText->Des().Mid(
+ rangeHeaderOffset + KCRRangeHeader().Length() );
+ TInt minusSignOffset( rangeHeader.Locate( '-' ) );
+ if ( minusSignOffset > 0 )
+ {
+ TPtrC8 startPosStr = rangeHeader.Left( minusSignOffset );
+ TLex8 startPosLex ( startPosStr );
+ startPosLex.Val ( iLowerRange ) ; // if .Val fails, value will just remain zero
+ LOG1( "CCRRtspCommon::ParseRange(), start: %f", iLowerRange );
+ }
+
+ TInt lineFeedOffset( rangeHeader.Locate( '\n' ) );
+ if ( lineFeedOffset > ( minusSignOffset + 2 ) )
+ {
+ TPtrC8 endPosStr = rangeHeader.Mid( minusSignOffset + 1,
+ lineFeedOffset - ( minusSignOffset + 1 ) );
+ TLex8 endPosLex ( endPosStr );
+ endPosLex.Val ( iUpperRange ) ; // if .Val fails, value will just remain -1.0
+ LOG1( "CCRRtspCommon::ParseRange(), end: %f", iUpperRange );
+ }
+ else
+ {
+ iUpperRange = KRealMinusOne;
+ LOG( "CCRRtspCommon::ParseRange(), Setting end range to -1.0" );
+ }
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRTSPResponse::AuthenticationTypeL
+//
+// method that returns authentication type
+// -----------------------------------------------------------------------------
+//
+
+TDesC8& CCRRtspCommon::AuthenticationTypeL( void )
+ {
+ if ( !iAuthType )
+ {
+ iAuthType = HBufC8::NewL( 0 );
+ }
+
+ return *iAuthType;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRTSPResponse::NonceL
+//
+// method that returns session nonce
+// -----------------------------------------------------------------------------
+//
+TDesC8& CCRRtspCommon::NonceL( void )
+ {
+ if ( !iNonce )
+ {
+ iNonce = HBufC8::NewL( 0 );
+ }
+
+ return *iNonce;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRTSPResponse::RealmL
+//
+// method that returns session realm
+// -----------------------------------------------------------------------------
+//
+TDesC8& CCRRtspCommon::RealmL( void )
+ {
+ if ( !iRealm )
+ {
+ iRealm = HBufC8::NewL( 0 );
+ }
+
+ return *iRealm;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRTSPResponse::OpaqueL
+//
+// method that returns session opaque value
+// -----------------------------------------------------------------------------
+//
+TDesC8& CCRRtspCommon::OpaqueL( void )
+ {
+ if ( !iOpaque )
+ {
+ iOpaque = HBufC8::NewL( 0 );
+ }
+
+ return *iOpaque;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRTSPResponse::SetNonce
+//
+// method that sets session nonce
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::SetNonceL( const TDesC& aNonce )
+ {
+ delete iNonce; iNonce = NULL;
+ iNonce = HBufC8::NewL( aNonce.Length() );
+ iNonce->Des().Copy( aNonce );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRTSPResponse::SetNonce
+//
+// method that sets session nonce
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::SetNonceL( const TDesC8& aNonce )
+ {
+ delete iNonce; iNonce = NULL;
+ iNonce = aNonce.AllocL();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRTSPResponse::SetAuthenticationTypeL
+//
+// method that sets authentication type
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::SetAuthenticationTypeL( const TDesC8& aAuthType )
+ {
+ delete iAuthType;
+ iAuthType = NULL;
+ iAuthType = aAuthType.AllocL();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRTSPResponse::SetRealmL
+//
+// method that sets session realm
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::SetRealmL( const TDesC& aRealm )
+ {
+ delete iRealm; iRealm = NULL;
+ iRealm = HBufC8::NewL( aRealm.Length());
+ iRealm->Des().Copy( aRealm );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRTSPResponse::SetRealmL
+//
+// method that sets session realm
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::SetRealmL( const TDesC8& aRealm )
+ {
+ delete iRealm; iRealm = NULL;
+ iRealm = aRealm.AllocL();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRTSPResponse::SetOpaqueL
+//
+// method that sets session opaque
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::SetOpaqueL( const TDesC& aOpaque )
+ {
+ delete iOpaque; iOpaque = NULL;
+ iOpaque = HBufC8::NewL( aOpaque.Length());
+ iOpaque->Des().Copy( aOpaque );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRTSPResponse::SetOpaqueL
+//
+// method that sets session opaque
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::SetOpaqueL( const TDesC8& aOpaque )
+ {
+ delete iOpaque; iOpaque = NULL;
+ iOpaque = aOpaque.AllocL();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRTSPResponse::SetUserNameL
+//
+// method that sets session user name
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::SetUserNameL( const TDesC& aUserName )
+ {
+ delete iUserName; iUserName = NULL;
+ iUserName = HBufC8::NewL( aUserName.Length() );
+ iUserName->Des().Copy( aUserName );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::SetPassWdL
+//
+// method that sets session password
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::SetPassWdL( const TDesC& aPassWd )
+ {
+ delete iPassword; iPassword = NULL;
+ iPassword = HBufC8::NewL( aPassWd.Length() );
+ iPassword->Des().Copy( aPassWd );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::SetRtspUriL
+//
+// method that sets session uri
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::SetRtspUriL( const TDesC& aUri )
+ {
+ delete iUri; iUri = NULL;
+ iUri = HBufC8::NewL( aUri.Length() );
+ iUri->Des().Copy( aUri );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::IsLiveStream
+//
+// getter method for livelihood of a stream
+// -----------------------------------------------------------------------------
+//
+TBool CCRRtspCommon::IsLiveStream( void )
+ {
+ return iIsLiveStream;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::FindContentBase
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspCommon::FindContentBase( void )
+ {
+ iContentBase.Set( NULL, 0 );
+ TInt cbStringOffset( iRtspText->FindC( KCRContentBaseHeader() ) );
+ if ( cbStringOffset > 0 )
+ {
+ TPtrC8 beginningFromCb( iRtspText->Right( iRtspText->Length() -
+ ( cbStringOffset + KCRContentBaseHeader().Length() ) ) );
+ TInt lfStringOffset( beginningFromCb.Find( KCRNewLine ) );
+ if ( lfStringOffset != KErrNotFound )
+ {
+ LOG1( "### setting content-base, len = %d", lfStringOffset - 1 );
+ iContentBase.Set( beginningFromCb.Mid( 0, lfStringOffset - 1 ) ); // -1 to cut trailing /
+ }
+ }
+ }
+// -----------------------------------------------------------------------------
+// CCRRtspCommon::ContentBase
+//
+// -----------------------------------------------------------------------------
+//
+TPtrC8 CCRRtspCommon::ContentBase( void )
+ {
+ return iContentBase;
+ }
+
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRRTSPPacketSource.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,2855 @@
+/*
+* 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: RTSP Client impl.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCRRtspPacketSource.h"
+#include "CCRPunchPacketSender.h"
+#include "CCRRtpTcpStreamer.h"
+#include "CCRRtspCommand.h"
+#include "CCRPacketBuffer.h"
+#include <ipvideo/CDvrSdpParser.h>
+#include "CCRTimer.h"
+#include <Uri16.h>
+#include <e32msgqueue.h>
+#include <centralrepository.h>
+#include <WebUtilsInternalCRKeys.h>
+#include <mmf/common/mmferrors.h> // ROP error codes
+
+// DATA TYPES
+// ######################################################
+// WARNING: JUMBOJET-SIZED KLUDGE AHEAD:
+// ######################################################
+#define private public
+// Explanation: timestamp getter in rtcp sender report
+// class is broken beyond repair. It may be fixed but the
+// broken version is already shipped to millions of phones
+// around the world. The broken getter method can't
+// be overridden as it requires access to private part
+// of sender reports instance variables. The item we
+// need (ntp timestamp) is there intact in private instance
+// variables but there is useless getter for that.
+#include <rtcp.h>
+
+/* sender report (SR) */
+class TRtcpSRPart
+ {
+public:
+ TUint32 ssrc; /**< sender generating this report */
+ TUint32 ntp_sec; /**< NTP timestamp */
+ TUint32 ntp_frac; /**< Fractal seconds */
+ TUint32 rtp_ts; /**< RTP timestamp */
+ TUint32 psent; /**< packets sent */
+ TUint32 osent; /**< octets sent */
+ };
+#undef private
+// ######################################################
+// Major kludge ends here.
+// ######################################################
+
+// CONSTANTS
+const TInt KCRPortNumberBase( 16670 );
+const TInt KCSeqForRtspNegoation( 42 );
+const TInt KRtspPortNumber( 554 );
+const TInt KRtpPacketVersion( 2 );
+const TUint KSenderReportPacketType( 0xC8 ); // 200 decimal
+const TInt KDVR10Seconds( 10000000 );
+
+// The number of sequential packets that must be received
+// before a stream is considered good. 1 means no delay, start
+// from very first packet
+const TInt KDVRMinSequential( 1 );
+// The maximum number of dropped packets to be considered a
+// dropout, as opposed to an ended and restarted stream.
+const TInt KDVRMaxMisorder( 50 );
+// The maximum number of packets by which a packet can be delayed
+// before it is considered dropped.
+const TInt KDVRMaxDropOut( 3000 );
+_LIT( KRtspPortString, "554" );
+_LIT8( KCRCName, "N++ " );
+// Timeout for RTP/UDP reception before switching to TCP mode
+const TTimeIntervalMicroSeconds32 KCRRtspRtpUdpTimeout( 10 * 1e6 );
+// Timeout for waiting for server response to any RTSP command
+const TTimeIntervalMicroSeconds32 KCRRtspResponseTimeout( 15 * 1e6 );
+// Timeout for waiting for server response to TIERDOWN command
+const TTimeIntervalMicroSeconds32 KCRRtspTierdownTimeout( 3 * 1e6 );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCRRtspPacketSource* CCRRtspPacketSource::NewL(
+ const SCRRtspParams& aParams,
+ CCRConnection& aConnection,
+ RSocketServ& aSockServer,
+ MCRStreamObserver& aSessionObs,
+ CCRStreamingSession& aOwningSession )
+ {
+ CCRRtspPacketSource* self = new( ELeave )
+ CCRRtspPacketSource( aConnection, aSockServer, aSessionObs, aOwningSession );
+ CleanupStack::PushL( self );
+ self->ConstructL( aParams );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::CCRRtspPacketSource
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCRRtspPacketSource::CCRRtspPacketSource(
+ CCRConnection& aConnection,
+ RSocketServ& aSockServer,
+ MCRStreamObserver& aSessionObs,
+ CCRStreamingSession& aOwningSession )
+ : CCRPacketSourceBase( aOwningSession, CCRStreamingSession::ECRRtspSourceId ),
+ iSockServer( aSockServer ),
+ iConnection( aConnection ),
+ iStage( ERTSPInit ),
+ iCSeq( KCSeqForRtspNegoation ),
+ iClientPort( KCRPortNumberBase ),
+ iSessionId(NULL, 0 ),
+ iReadyToPlay(EFalse),
+ iSessionObs( aSessionObs ),
+ iStartPos( KRealZero ),
+ iEndPos( KRealMinusOne ),
+ iUdpFound( EFalse ),
+ iTrafficFound( EFalse )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::ConstructL( const SCRRtspParams& aParams )
+ {
+ LOG( "CCRRtspPacketSource::ConstructL() in" );
+ if ( aParams.iUrl.Length() == 0 )
+ {
+ User::Leave ( KErrArgument );
+ }
+
+ iSentData = HBufC8::NewL ( KCROptionsReply().Length() + KMaxInfoName );
+ iRtpTcpStreamer = CCRRtpTcpStreamer::NewL( *this );
+ iRtspUri = aParams.iUrl.AllocL();
+ iRtspUri8 = HBufC8::NewL( aParams.iUrl.Length());
+ iRtspUri8->Des().Copy( aParams.iUrl );
+ iUserName = aParams.iUserName.AllocL();
+ iPassword = aParams.iPassword.AllocL();
+ User::LeaveIfError( iConnection.RegisterObserver( this ) );
+ iUdpReceptionTimer = CCRTimer::NewL( EPriorityLow, *this );
+ iProxyServerAddr = aParams.iProxyServerAddr;
+ iProxyServerPort = aParams.iProxyServerPort;
+ DoConnectL(); // Makes no sense to construct without immediately connecting
+
+ LOG( "CCRRtspPacketSource::ConstructL() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::~CCRRtspPacketSource
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRRtspPacketSource::~CCRRtspPacketSource()
+ {
+ LOG( "CCRRtspPacketSource::~CCRRtspPacketSource() in" );
+ // Deletes everything related to session
+ CleanUp();
+ delete iRtspTimeout;
+ delete iSentData;
+ delete iAuthType;
+ delete iRtspUri8;
+ delete iUserName;
+ delete iPassword;
+ delete iNonce;
+ delete iOpaque;
+ delete iRealm;
+ delete iRtpTcpStreamer;
+ delete iUdpReceptionTimer;
+ iReceiveStreams.Reset();
+ iObserver = NULL;
+ iConnection.UnregisterObserver( this );
+ LOG( "CCRRtspPacketSource::~CCRRtspPacketSource() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::CleanUp
+// Callback method called from cleanup-cidle that just calls the actual
+// cleanup method.
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::CleanUp()
+ {
+ LOG( "CCRRtspPacketSource::CleanUp() in" );
+ if ( iUdpReceptionTimer )
+ {
+ iUdpReceptionTimer->Cancel();
+ }
+ delete iRtspPingTimer;
+ iRtspPingTimer = NULL;
+
+ iRtpRecvSrcAudio.Close();
+ iRtpRecvSrcVideo.Close();
+ iAudioSession.Close();
+ iVideoSession.Close();
+ iReadyToPlay = EFalse;
+ delete iSdpParser; iSdpParser = NULL;
+ delete iRtspUri; iRtspUri = NULL;
+ delete iRtspSock; iRtspSock = NULL;
+
+ for ( TInt i( 0 ); i < ERTPMaxSockets; i++ )
+ {
+ delete iRTPSockArr[i];
+ iRTPSockArr[i] = NULL;
+ }
+ for ( TInt i( 0 ); i < ERTSPLastStage; i++ )
+ {
+ delete iPrevCommands[i];
+ iPrevCommands[i] = NULL;
+ delete iResponses[i];
+ iResponses[i] = NULL;
+ }
+
+ iSessionId.Set( NULL, 0 );
+ delete iPunchPacketSenderAudio; iPunchPacketSenderAudio = NULL;
+ delete iPunchPacketSenderVideo; iPunchPacketSenderVideo = NULL;
+ delete iUserAgent; iUserAgent = NULL;
+ delete iWapProfile; iWapProfile = NULL;
+ iStartPos = KRealZero;
+ iEndPos = KRealMinusOne;
+
+ LOG( "CCRRtspPacketSource::CleanUp() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::DoConnectL
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::DoConnectL( void )
+ {
+ if ( !iRtspUri )
+ {
+ User::Leave( KErrNotReady );
+ }
+ if ( iRtspSock )
+ {
+ delete iRtspSock; iRtspSock = NULL;
+ }
+
+ iRtspSock = CCRSock::NewL( *this, ERTPControl, iConnection.Connection(),
+ iSockServer, ETrue, ETrue );
+ TUriParser uriParser;
+ User::LeaveIfError( uriParser.Parse( iRtspUri->Des() ) );
+ iRtspUriHost.Set( uriParser.Extract( EUriHost ) );
+ TPtrC portString( KRtspPortString );
+ if ( uriParser.IsPresent( EUriPort ) )
+ {
+ portString.Set( uriParser.Extract( EUriPort ) );
+ }
+
+ TLex portLex( portString );
+ TInt port( KRtspPortNumber );
+ if ( portLex.Val( port ) != KErrNone )
+ {
+ User::Leave( KErrMMInvalidURL );
+ }
+ if ( iProxyServerAddr.Length() && iProxyServerPort )
+ {
+ LOG2( "CCRRtspPacketSource::DoConnectL(), Proxy: %S port: %d",
+ &iProxyServerAddr, iProxyServerPort );
+ User::LeaveIfError( iRtspSock->ConnectSock( iProxyServerAddr, iProxyServerPort ) );
+ }
+ else
+ {
+ User::LeaveIfError(iRtspSock->ConnectSock( iRtspUriHost, port ) );
+ }
+ iCSeq = KCSeqForRtspNegoation;
+
+ TTime now;
+ now.UniversalTime();
+ iClientPort =
+ KCRPortNumberBase + ( ( now.DateTime().MicroSecond() / 1000 ) * 2 );
+
+ // Get transport method from connection heuristics
+ iTransport = ( iConnection.GetHeuristic(
+ CCRConnection::EUdpStreamingBlocked ) )? ERTPOverTCP: ERTPOverUDP;
+ LOG1( "CCRRtspPacketSource::DoConnectL(), RTP transport: %d (0=UDP, 1=TCP)", iTransport );
+
+ // Get user agent, bandwidth and wap profile based on connection bearer (3G or not)
+ TConnMonBearerType bearer = iConnection.BearerType();
+ TBool is3g( iConnection.IsBearerWLANor3G( bearer ) );
+
+ // Fetch wap profile from WebUtils repository
+ if ( !iWapProfile )
+ {
+ CRepository* repository = CRepository::NewLC( KCRUidWebUtils );
+ TUint32 profilekey = ( is3g )? KWebUtilsUaProf3G: KWebUtilsUaProf;
+ TFileName profilebuf( KNullDesC );
+ if ( !repository->Get( profilekey, profilebuf ) )
+ {
+ iWapProfile = HBufC8::NewL( profilebuf.Length() );
+ iWapProfile->Des().Copy( profilebuf );
+ }
+
+ CleanupStack::PopAndDestroy( repository );
+ LOG1( "CCRRtspPacketSource::DoConnectL(), iWapProfile: %S", &profilebuf );
+ }
+
+ // Fetch user agent
+ // Should we add version information to user agent string?
+ delete iUserAgent; iUserAgent = NULL;
+ iUserAgent = KCRRTSPDefaultUserAgent().AllocL();
+
+ // Get bandwidth from connection
+ iBandwidth = iConnection.MaximumBandwidth();
+
+ LOG( "CCRRtspPacketSource::DoConnectL out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::URI
+// -----------------------------------------------------------------------------
+//
+TPtr CCRRtspPacketSource::URI(void)
+ {
+ __ASSERT_DEBUG( iRtspUri != NULL , User::Panic( _L( "RTSP source" ), KErrBadHandle ) );
+ TPtr retval ( NULL , 0 );
+ if ( iRtspUri )
+ {
+ retval.Set( iRtspUri->Des() );
+ }
+ else
+ {
+ LOG( "CCRRtspPacketSource::URI iRtspUri was NULL !!!!!!!!!! " );
+ }
+ return retval;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::GetSdp
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtspPacketSource::GetSdp( TPtrC8& aSdp )
+ {
+ TInt retval( KErrNotReady );
+ if ( iSdpParser )
+ {
+ return iSdpParser->GetSdp( aSdp );
+ }
+
+ return retval;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::SeqAndTS
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtspPacketSource::SeqAndTS(
+ TUint& aAudioSeq,
+ TUint& aAudioTS,
+ TUint& aVideoSeq,
+ TUint& aVideoTS )
+ {
+ TInt retval( KErrNotReady );
+ if ( iSeqFromRtpInfoForVideo != 0 || iSeqFromRtpInfoForAudio != 0 )
+ {
+ aAudioSeq = iSeqFromRtpInfoForAudio;
+ aAudioTS = iRTPTimeStampAudio;
+ aVideoSeq = iSeqFromRtpInfoForVideo;
+ aVideoTS = iRTPTimeStampVideo;
+ retval = KErrNone;
+ }
+
+ return retval;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::PostActionL
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::PostActionL()
+ {
+ LOG1( "CCRRtspPacketSource::PostActionL(), SDP will be handled, iSdpParser: %d",
+ iSdpParser );
+ User::LeaveIfNull( iSdpParser );
+ iSessionObs.StatusChanged( MCRPacketSource::ERtpStateSdpAvailable );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::Play
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtspPacketSource::Play( const TReal& aStartPos, const TReal& aEndPos )
+ {
+ LOG2( "CCRRtspPacketSource::Play(), aStartPos: %f, aEndPos: %f",
+ aStartPos, aEndPos );
+ LOG2( "CCRRtspPacketSource::Play(), sent seq: %d, rec: %d",
+ iCSeq, iLastReceivedSeq );
+ iReadyToPlay = ETrue;
+ iStartPos = aStartPos;
+ iEndPos = aEndPos;
+ ResetStreamFlags();
+
+ // In xps case we never get startpos with this method.
+ // instead setposition will be called
+ if ( iBuffer )
+ {
+ iBuffer->ResetBuffer();
+ }
+
+ // If both audio and video sessions are closed, we
+ // need to open at least one of them:
+ TInt err( KErrNone );
+ if ( iStage == ERTSPReadyToPlay || iStage == ERTSPPauseSent )
+ {
+ if ( iStage == ERTSPReadyToPlay || iCSeq == ( iLastReceivedSeq + 1 ) )
+ {
+ TRAP( err, SendPlayCommandL() );
+ }
+ else
+ {
+ // We have a fast-fingered user in charge; play has been issued
+ // but the previous pause has not been completed yet: postpone this
+ // operation
+ iPostPonedPlay = ETrue;
+ }
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::Pause
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtspPacketSource::Pause()
+ {
+ LOG1( "CCRRTSPPacketSource::Pause() stage %d", iStage );
+ TInt err( KErrNotReady );
+ if ( iStage == ERTSPPlaying )
+ {
+ if ( iResponses[ERTSPPlaySent]->IsLiveStream() || iSdpParser->IsLiveStream() )
+ {
+ err = KErrNotSupported;
+ }
+ else
+ {
+ TRAP( err, SendPauseCommandL() );
+ }
+ }
+ if ( iStage == ERTSPPauseSent )
+ {
+ err = KErrNone;
+ }
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::Stop
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtspPacketSource::Stop()
+ {
+ LOG( "CCRRtspPacketSource::Stop()" );
+
+ iReadyToPlay = EFalse;
+ iPostPonedPlay = EFalse;
+ iStartPos = KRealZero;
+ TInt err( KErrDisconnected );
+
+ if ( iStage == ERTSPPlaySent || iStage == ERTSPPlaying ||
+ iStage == ERTSPPauseSent || iStage == ERTSPSetupAudioSent ||
+ iStage == ERTSPSetupVideoSent )
+ {
+ err = KErrNone;
+ if ( iRtspSock )
+ {
+ iRtspSock->Cancel();
+ }
+
+ TRAP_IGNORE( SendTearDownCommandL() ); // if this fails, we don't care
+ iStage = ERTSPTearDownSent;
+ StartRtspTimeout( KCRRtspTierdownTimeout );
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::SetPosition
+// -----------------------------------------------------------------------------
+
+TInt CCRRtspPacketSource::SetPosition( const TInt64 aPosition )
+ {
+ LOG1( "CCRRtspPacketSource::SetPosition(), iStartPos: %f", iStartPos );
+
+ if ( aPosition == -2 )
+ {
+ if ( iStage != ERTSPPlaySent && iObserver )
+ {
+ iObserver->ConnectionStatusChange(
+ iOwningSession.SourceChecksum(),
+ ECRReadyToSeek, KErrNone );
+ }
+ }
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::GetRange
+// -----------------------------------------------------------------------------
+void CCRRtspPacketSource::GetRange( TReal& aLower, TReal& aUpper )
+ {
+ aLower = KRealZero;
+ aUpper = KRealMinusOne;
+
+ if ( ( iStage == ERTSPPlaySent || iStage == ERTSPPlaying ) &&
+ iResponses[ERTSPPlaySent] )
+ {
+ iResponses[ERTSPPlaySent]->GetRange(aLower,aUpper);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::DataReceived
+// This is called when data is received from socket.
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::DataReceived( TInt /*aSockId*/, const TDesC8& aData )
+ {
+ // Find out RTCP message or RTP packet from IP packet
+ iRtpTcpStreamer->DataAvailable( aData, ( iTransport == ERTPOverTCP ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::RtspMsgAvailable
+// This is called when data is received from socket.
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::RtspMsgAvailable( const TDesC8& aData )
+ {
+#if defined ( LIVE_TV_FILE_TRACE ) || defined ( LIVE_TV_RDEBUG_TRACE )
+ if ( aData.Length() > 0 )
+ {
+ LOG1( "CCRRtspPacketSource::RtspMsgAvailable(), aData len: %d", aData.Length() );
+ TName d( KNullDesC );
+ for( TInt i( 0 ); i < aData.Length(); i++ )
+ {
+ TChar c = aData[i];
+ d.Append( c );
+ if ( ( i > 0 ) && ( i % 80 ) == 0 )
+ {
+ LOG1( ">%S<", &d );
+ d.Zero();
+ }
+ }
+
+ LOG1( ">%S<", &d );
+ }
+#endif // LIVE_TV_FILE_TRACE || LIVE_TV_RDEBUG_TRACE
+
+ TRAPD( err, ProcessRtspResponseL( aData ) );
+ if ( err )
+ {
+ LOG1( "CCRRtspPacketSource::RtspMsgAvailable(), ProcessRtspResponseL Leaved, err: %d", err );
+ if ( err == KErrNotSupported )
+ {
+ // The response did not look like rtsp response at all.
+ // some servers decide to send rtsp commands to us so lets
+ // try interpreting it as a command
+ err = KErrNone;
+ TRAP( err, ProcessRTSPCommandL( aData ) )
+ if ( err )
+ {
+ iOwningSession.SourceStop();
+ }
+ }
+ else
+ {
+ iOwningSession.SourceStop();
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::SockStatusChange
+// This is called when socket status changes.
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::SockStatusChange(
+ TInt aSockId,
+ CCRSock::TCRSockStatus aStatus,
+ TInt aError )
+ {
+#if defined ( LIVE_TV_FILE_TRACE ) || defined ( LIVE_TV_RDEBUG_TRACE )
+ if ( aStatus == CCRSock::EFailed )
+ {
+ LOG3( "CCRRtspPacketSource::SockStatusChange(), aSockId: %d, aStatus: %d, aError: %d",
+ aSockId, aStatus, aError );
+ }
+#else // LIVE_TV_FILE_TRACE || LIVE_TV_RDEBUG_TRACE
+ ( void )aSockId;
+ ( void )aError;
+#endif // LIVE_TV_FILE_TRACE || LIVE_TV_RDEBUG_TRACE
+
+ if ( aStatus == CCRSock::EFailed )
+ {
+ // Ask session to perform cleanup
+ iOwningSession.SourceStop();
+
+ if ( iStage == ERTSPInit && aSockId == ERTPControl && aError == KErrCouldNotConnect )
+ {
+ // map error to different error id, so we can know that showing reconnect query is pointless.
+ aError = KErrEof;
+ }
+
+ // Inform the observer that there is a problem. Exclude case where we're closing
+ // and the error is KErrEof
+ if ( ! ( iStage == ERTSPTearDownSent && aError == KErrEof ) )
+ {
+ if ( iObserver )
+ {
+ iObserver->ConnectionStatusChange(
+ iOwningSession.SourceChecksum(), ECRConnectionError, aError );
+ }
+ }
+ else
+ {
+ LOG( "CCRRtspPacketSource::SockStatusChange(), eof in closing: normal" );
+ }
+ }
+ else if ( aSockId == ERTPControl && aStatus == CCRSock::EIdle &&
+ iStage == ERTSPInit )
+ {
+ // Called once from here for lifetime of this object
+ TRAPD( err, SendRtspCommandL() );
+ if ( err )
+ {
+ LOG1( "CCRRtspPacketSource::SockStatusChange(), SendRtspCommandL Leaved: %d", err );
+
+ // Ask session to perform cleanup
+ iOwningSession.SourceStop();
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::RtpTcpPacketAvailable
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::RtpTcpPacketAvailable(
+ TInt aChannel,
+ const TDesC8& aPacket )
+ {
+ // Map embedded TCP channel to streamid:
+ // video: channel=(0,1) --> id=(2,3)
+ // audio: channel=(2,3) --> id=(0,1) when video present
+ // audio: channel=(0,1) --> id=(0,1) when audio only
+ TInt mappedChannel( ( iSdpParser->VideoControlAddr().Length() )?
+ ( aChannel + 2 ) % 4: aChannel );
+ MCRPacketSource::TCRPacketStreamId streamid(
+ ( MCRPacketSource::TCRPacketStreamId )( mappedChannel ) );
+
+ iBuffer->AddPacket( streamid, aPacket );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::ForwardRtpTcpChunk
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::ForwardRtpTcpChunck( const TDesC8& aChunk )
+ {
+ if ( iRtspSock )
+ {
+ iRtspSock->SendData( aChunk );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::TimerExpired
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::TimerExpired( CCRTimer* )
+ {
+ LOG( "CCRRtspPacketSource::TimerExpired: RTP/UDP timer expired, switching to RTP/TCP" );
+
+ if ( !iUdpFound )
+ {
+ // Signal heuristic for TCP streaming
+ LOG( "CCRRtspPacketSource::TimerExpired - Switch to TCP" );
+ iConnection.SetHeuristic( CCRConnection::EUdpStreamingBlocked, ETrue );
+ }
+ else
+ {
+ // We had UDP before in this session but now it is lost for some reason.
+ // Try UDP again.
+
+ // Flag UDP found away
+ iUdpFound = EFalse;
+ iTrafficFound = EFalse;
+
+ // Clear stream followup
+ iReceiveStreams.Reset();
+
+ LOG( "CCRRtspPacketSource::TimerExpired - Trying UDP again" );
+ }
+
+ // Notify client to close us and start a new session
+ if ( iObserver )
+ {
+ // Notify client
+ iObserver->ConnectionStatusChange(
+ iOwningSession.SourceChecksum(), ECRSwitchingToTcp, KErrNone );
+ }
+ else
+ {
+ // If no client observer, teardown and cleanup ourselves
+ iPostPonedPlay = EFalse;
+ TRAPD( err, SendTearDownCommandL() );
+ if ( err != KErrNone )
+ {
+ LOG1( "CCRRtspPacketSource::TimerExpired() Send TEARDOWN failed: %d", err );
+ }
+
+ CleanUp();
+ iSessionObs.StatusChanged( MCRPacketSource::ERtpStateClosing );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::ProcessRTSPCommandL
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::ProcessRTSPCommandL( const TDesC8& aData )
+ {
+ LOG1( "CCRRtspPacketSource::ProcessRTSPCommandL(), iStage: %d", ( int )iStage );
+
+ CCRRtspCommand* cmd = CCRRtspCommand::NewL();
+ CleanupStack::PushL( cmd );
+ cmd->TryParseL( aData );
+
+ switch ( cmd->Command() )
+ {
+ case CCRRtspCommand::ERTSPCommandOPTIONS:
+ iSentData->Des().Format( KCROptionsReply, cmd->CSeq() );
+ iRtspSock->SendData( iSentData->Des() );
+ break;
+
+ default:
+ // Server sent us a command and it is not options.
+ // for sure they want us to stop ; is there
+ iOwningSession.SourceStop();
+ break;
+ }
+
+ CleanupStack::PopAndDestroy( cmd );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::ProcessRtspResponseL
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::ProcessRtspResponseL( const TDesC8& aData )
+ {
+ LOG1( "CCRRtspPacketSource::ProcessRtspResponseL(), iStage: %d", iStage );
+
+ // Cancel timeout timer
+ if ( iRtspTimeout )
+ {
+ iRtspTimeout->Cancel();
+ }
+
+ // The server responded to our TEARDOWN command. No need to parse the response
+ // since we don't care what the server said. Ask session to clean us up.
+ if ( iStage == ERTSPTearDownSent )
+ {
+ iOwningSession.SourceStop();
+ return;
+ }
+
+ // First parse response
+ CCRRtspResponse* resp = CCRRtspResponse::NewL();
+ CleanupStack::PushL( resp );
+ resp->TryParseL( aData );
+
+ // Then find the command that this resp is associated with:
+ iLastReceivedSeq = resp->CSeq();
+ TBool commandFound( EFalse );
+ for ( TInt i( 0 ); i < ERTSPLastStage && !commandFound; i++ )
+ {
+ LOG2( "CCRRtspPacketSource:: prevcommand stage: %d cseq: %d",
+ i, ( iPrevCommands[i] )? iPrevCommands[i]->CSeq(): KErrNotFound );
+
+ if ( iPrevCommands[i] && ( iPrevCommands[i]->CSeq() == resp->CSeq() ) )
+ {
+ LOG1( "CCRRtspPacketSource::ProcessRtspResponseL(), matching command: %d", i );
+ LOG1( "CCRRtspPacketSource::ProcessRtspResponseL(), cseq was: %d", resp->CSeq() );
+ delete iResponses[i];
+ CleanupStack::Pop( resp );
+ iResponses[i] = resp;
+ commandFound = ETrue;
+ if ( i == ERTSPOptSent )
+ {
+ // Process options no further, used only for ping here
+ return;
+ }
+ }
+ }
+
+ // Delete response if sequency not match
+ if ( !commandFound )
+ {
+ CleanupStack::PopAndDestroy( resp );
+ LOG1( "CCRRtspPacketSource::ProcessRtspResponseL(), Command not found, cseq: %d", resp->CSeq() );
+ }
+ else
+ {
+ if ( iResponses[iStage]->StatusCode() == CCRRtspResponse::ERTSPRespOK || // 200
+ iResponses[iStage]->StatusCode() == CCRRtspResponse::ERTSPRespCreated ) // 201
+ {
+ // Extract useful information from response depending on stage:
+ switch ( iStage )
+ {
+ case ERTSPSetupAudioSent: // From setups take session id
+ case ERTSPSetupVideoSent:
+ if ( !iSessionId.Ptr() )
+ {
+ iResponses[iStage]->SessionId( iSessionId );
+ }
+ // If we see that we don't need to send further setups,
+ // do send punch packets now.
+ if ( iSdpParser && // if we have sdp parser
+ ( iSdpParser->VideoControlAddr().Length() && // and it shows we have video
+ iResponses[ERTSPSetupVideoSent] && // and we have video se tup
+ iSdpParser->AudioControlAddr().Length() && // and it shows we have audio
+ iResponses[ERTSPSetupAudioSent] ) || // and we have audio set up
+ ( !iSdpParser->VideoControlAddr().Length() && // or it shows we have no video
+ !iResponses[ERTSPSetupVideoSent] && // and we've video not set up
+ iSdpParser->AudioControlAddr().Length() && // and it shows we have audio
+ iResponses[ERTSPSetupAudioSent] ) || // and we've audio set up
+ ( iSdpParser->VideoControlAddr().Length() && // or it shows we've video
+ iResponses[ERTSPSetupVideoSent] && // and we have video set up
+ !iSdpParser->AudioControlAddr().Length() && // and we have no audio
+ !iResponses[ERTSPSetupAudioSent] ) )// and we have no audio set up
+ {
+ // Only send punch packets for UDP transport
+ // TCP or multicast: session setup and PLAY in SendRTSPCommand
+ if ( iTransport == ERTPOverUDP )
+ {
+ SendPunchPacketsL();
+ }
+ }
+
+ // Notify sink that SETUP repply received
+ iSessionObs.StatusChanged(
+ MCRPacketSource::ERtpStateSetupRepply );
+ break;
+
+ case ERTSPDescSent: // From desc take sdp
+ if ( iObserver && iResponses[iStage]->ContentLen() <= 0 )
+ {
+ // This should not happen
+ if ( iObserver )
+ {
+ iObserver->ConnectionStatusChange(
+ iOwningSession.SourceChecksum(), ECRConnectionError, KErrUnderflow );
+ }
+ iOwningSession.SourceStop();
+ }
+ else
+ {
+ delete iSdpParser; iSdpParser = NULL;
+ iSdpParser = CDvrSdpParser::NewL();
+ if ( iResponses[iStage]->ContentBase().Length() )
+ {
+ iSdpParser->TryParseL( iResponses[iStage]->Content(),
+ iResponses[iStage]->ContentBase() );
+ }
+ else
+ {
+ iSdpParser->TryParseL( iResponses[iStage]->Content(),
+ iRtspUri8->Des() );
+ }
+ // Check for multicast address in SDP
+ if ( iSdpParser->IsMultiCastSdp() )
+ {
+ iTransport = ERTPOverMulticast;
+ }
+ if ( iObserver && iSdpParser->IsRealMediaContent() )
+ {
+ iObserver->ConnectionStatusChange(
+ iOwningSession.SourceChecksum(),
+ ECRStreamIsRealMedia, KErrNotSupported );
+ iOwningSession.SourceStop();
+ return; // Make sure we don't continue with SETUP commands
+ }
+ else // do not send realmedia sdp to sinks
+ {
+ if ( iObserver && iSdpParser->IsLiveStream() )
+ {
+ iObserver->ConnectionStatusChange(
+ iOwningSession.SourceChecksum(),
+ ECRStreamIsLiveStream, KErrNone );
+ }
+
+ // then check for bandwidth requirements even before we start:
+ if ( iObserver )
+ {
+ // Unknown bitrate or bandwidth are returned as zero.
+ // Bitrates in kbit/s
+ TInt bitrate( iSdpParser->VideoBitrate() +
+ iSdpParser->AudioBitrate() );
+ TInt bandwidth( iConnection.MaximumBandwidth() / 1000 );
+ if ( bitrate && bandwidth && bandwidth < bitrate )
+ {
+ LOG2( "CCRRtspPacketSource::ProcessRtspResponseL(), bitrate:%d, bandwidth: %d -> NotEnoughBandwidth",
+ bitrate, bandwidth);
+ iObserver->ConnectionStatusChange(
+ iOwningSession.SourceChecksum(),
+ ECRNotEnoughBandwidth, KErrNone );
+ return; // Make sure we don't tell sinks anything about
+ // sdp that has too high bitrate for our network bearer
+ }
+ }
+
+ // But if we didn't have realmedia stream and the bandwidth check
+ // is also all right, then go on and tell the sinks ->
+ iSessionObs.StatusChanged(
+ MCRPacketSource::ERtpStateSdpAvailable );
+ }
+ }
+ break;
+
+ case ERTSPPlaySent:
+ {
+ CCRRtspResponse::SRTPInfoHeader rtpInfo;
+ iResponses[ERTSPPlaySent]->RTPInfoHeader( rtpInfo );
+
+ TPtrC8 videoAddr ( NULL, 0 );
+ if ( iSdpParser->VideoControlAddr().Length() )
+ {
+ videoAddr.Set ( iSdpParser->VideoControlAddr() );
+ }
+ TPtrC8 audioAddr ( NULL , 0 );
+ if ( iSdpParser->AudioControlAddr().Length() )
+ {
+ audioAddr.Set ( iSdpParser->AudioControlAddr() );
+ }
+
+ if ( iSdpParser->VideoControlAddr().Length() &&
+ rtpInfo.iFirstURL.Length() &&
+ videoAddr.Find( rtpInfo.iFirstURL ) >= 0 )
+ {
+ iRTPTimeStampVideo = rtpInfo.iFirstTS ? rtpInfo.iFirstTS : 1;
+ iSeqFromRtpInfoForVideo = rtpInfo.iFirstSeq;
+ }
+ if ( iSdpParser->VideoControlAddr().Length() &&
+ rtpInfo.iSecondURL.Length() &&
+ videoAddr.Find( rtpInfo.iSecondURL ) >= 0 )
+ {
+ iRTPTimeStampVideo = rtpInfo.iSecondTS ? rtpInfo.iSecondTS : 1;
+ iSeqFromRtpInfoForVideo = rtpInfo.iSecondSeq;
+ }
+ if ( iSdpParser->AudioControlAddr().Length() &&
+ rtpInfo.iFirstURL.Length() &&
+ audioAddr.Find( rtpInfo.iFirstURL) >= 0 )
+ {
+ iRTPTimeStampAudio = rtpInfo.iFirstTS ? rtpInfo.iFirstTS : 1;
+ iSeqFromRtpInfoForAudio = rtpInfo.iFirstSeq;
+ }
+ if ( iSdpParser->AudioControlAddr().Length() &&
+ rtpInfo.iSecondURL.Length() &&
+ audioAddr.Find( rtpInfo.iSecondURL) >= 0 )
+ {
+ iRTPTimeStampAudio = rtpInfo.iSecondTS ? rtpInfo.iSecondTS : 1;
+ iSeqFromRtpInfoForAudio = rtpInfo.iSecondSeq;
+ }
+
+ // ok, if we don't have rtp-info header, we don't know yet.
+ if ( rtpInfo.iFirstURL.Length() == 0 &&
+ rtpInfo.iSecondURL.Length() == 0 )
+ {
+ iNoRtpInfoHeader++;
+ }
+ else
+ {
+ // We have RTP-info, so control stream is no longer mandatory
+ // Mark control streams as "found"
+ StreamFound( EAudioControlStream );
+ StreamFound( EVideoControlStream );
+ //StreamFound( ESubTitleControlStream );
+
+ iSessionObs.StatusChanged(
+ MCRPacketSource::ERtpStateSeqAndTSAvailable );
+ }
+
+ // Live state
+ if ( iResponses[ERTSPPlaySent]->IsLiveStream() || iSdpParser->IsLiveStream() )
+ {
+ if ( iObserver )
+ {
+ iObserver->ConnectionStatusChange(
+ iOwningSession.SourceChecksum(),
+ ECRStreamIsLiveStream, KErrNone );
+ }
+ }
+
+ // Notify seeking
+ if ( iObserver )
+ {
+ iObserver->ConnectionStatusChange(
+ iOwningSession.SourceChecksum(),
+ ECRReadyToSeek, KErrNone );
+ }
+ }
+ break;
+
+ default:
+ // by default extract no information
+ break;
+ }
+
+ // Then continue with business:
+ SendRtspCommandL(); // will change iStage also
+ }
+
+ // Authentication needed..
+ else if ( iResponses[iStage]->StatusCode() ==
+ CCRRtspResponse::ERTSPRespUnauthorized || // 401
+ iResponses[iStage]->StatusCode() ==
+ CCRRtspResponse::ERTSPRespProxyAuthenticationRequired ) // 407
+ {
+ iAuthFailedCount++;
+ if ( iUserName &&
+ iUserName->Length() &&
+ iPassword &&
+ iAuthFailedCount == 1 )
+ {
+ iAuthenticationNeeded = ETrue;
+ iAuthType = iResponses[iStage]->AuthenticationTypeL().AllocL();
+ iRealm = iResponses[iStage]->RealmL().AllocL();
+ iOpaque = iResponses[iStage]->OpaqueL().AllocL();
+ iNonce = iResponses[iStage]->NonceL().AllocL();
+ SendAuthDescribeL();
+ }
+ else
+ {
+ iAuthFailedCount = 0;
+ LOG( "CCRRtspPacketSource::ProcessRtspResponseL() Authentication failure !" );
+
+ // Cleanup
+ iOwningSession.SourceStop();
+ if ( iObserver )
+ {
+ iObserver->ConnectionStatusChange(
+ iOwningSession.SourceChecksum(),
+ ECRAuthenticationNeeded, KErrNone );
+ }
+ }
+ }
+ else if ( iResponses[iStage]->StatusCode() == CCRRtspResponse::ERTSPRespUnsupportedTransport ) // 461
+ {
+ LOG1( "CCRRtspPacketSource::ProcessRtspResponseL() - Unsupported Transport: %d", iTransport );
+
+ if ( iConnection.GetHeuristic( CCRConnection::EUdpStreamingBlocked ) )
+ {
+ // Using TCP, change to UDP
+ LOG( "CCRRtspPacketSource::ProcessRtspResponseL() - Change TCP to UDP" );
+ iConnection.SetHeuristic( CCRConnection::EUdpStreamingBlocked, EFalse );
+ // Notify observer at client side:
+ ProcessRtspErrorResponseL( iResponses[iStage]->StatusCode() );
+ }
+ else
+ {
+ // Using UDP, change to TCP
+ LOG( "CCRRtspPacketSource::ProcessRtspResponseL() - Change UDP to TCP");
+ iConnection.SetHeuristic( CCRConnection::EUdpStreamingBlocked, ETrue );
+ // Notify observer at client side:
+ ProcessRtspErrorResponseL( iResponses[iStage]->StatusCode() );
+ }
+ }
+ else
+ {
+ // before doing cleanup, notify observer at client side:
+ ProcessRtspErrorResponseL( iResponses[iStage]->StatusCode() );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::ProcessRtspErrorResponseL
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::ProcessRtspErrorResponseL(
+ CCRRtspResponse::TResponseCode aErrorCode )
+ {
+ SCRQueueEntry entry;
+ entry.iMsg = ECRMsgQueueConnectionError;
+
+ switch ( aErrorCode )
+ {
+ case CCRRtspResponse::ERTSPRespLowOnStorageSpace:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespMultipleChoices:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespMovedPermanently:
+ entry.iErr = KErrNotFound;
+ break;
+
+ case CCRRtspResponse::ERTSPRespMovedTemporarily:
+ entry.iErr = KErrNotFound;
+ break;
+
+ case CCRRtspResponse::ERTSPRespSeeOther:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespNotModified:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespUseProxy:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespBadRequest:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespPaymentRequired:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespForbidden:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespGone:
+ case CCRRtspResponse::ERTSPRespConferenceNotFound:
+ case CCRRtspResponse::ERTSPRespNotFound:
+ entry.iErr = KErrNotFound;
+ break;
+
+ case CCRRtspResponse::ERTSPRespMethodNotAllowed:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespNotAcceptable:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespRequestTimeOut:
+ entry.iErr = KErrTimedOut;
+ break;
+
+ case CCRRtspResponse::ERTSPRespLengthRequired:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespPreconditionFailed:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespRequestEntityTooLarge:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespRequestURITooLarge:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespParameterNotUnderstood:
+ entry.iErr = KErrArgument;
+ break;
+
+ case CCRRtspResponse::ERTSPRespNotEnoughBandwidth:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespSessionNotFound:
+ entry.iErr = KErrCouldNotConnect;
+ break;
+
+ case CCRRtspResponse::ERTSPRespMethodNotValidInThisState:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespHeaderFieldNotValidForResource:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespInvalidRange:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespParameterIsReadOnly:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespAggregateOperationNotAllowed:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespOnlyAggregateOperationAllowed:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespUnsupportedTransport:
+ entry.iErr = KErrCouldNotConnect;
+ break;
+
+ case CCRRtspResponse::ERTSPRespDestinationUnreachable:
+ entry.iErr = KErrCouldNotConnect;
+ break;
+
+ case CCRRtspResponse::ERTSPRespInternalServerError:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespNotImplemented:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespBadGateway:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespServiceUnavailable:
+ entry.iErr = KErrCouldNotConnect;
+ break;
+
+ case CCRRtspResponse::ERTSPRespGatewayTimeOut:
+ entry.iErr = KErrGeneral;
+ break;
+
+ case CCRRtspResponse::ERTSPRespUnsupportedMediaType:
+ case CCRRtspResponse::ERTSPRespOptionNotSupported:
+ case CCRRtspResponse::ERTSPRespRTSPVersionNotSupported:
+ entry.iErr = KErrNotSupported;
+ break;
+
+ default:
+ entry.iErr = KErrGeneral;
+ break;
+ }
+
+ if ( iObserver )
+ {
+ iObserver->ConnectionStatusChange(
+ iOwningSession.SourceChecksum(), ECRConnectionError, entry.iErr );
+ }
+
+ // Try tear down first
+ if ( Stop() == KErrDisconnected )
+ {
+ iOwningSession.SourceStop();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::StartRtspTimeout
+// Starts RTSP command response timeout.
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::StartRtspTimeout( TTimeIntervalMicroSeconds32 aTime )
+ {
+ // Start a timeout timer to wait for the server to respond.
+ // If the server doesn't respond in time, cleanup will be initialized.
+ if ( !iRtspTimeout )
+ {
+ TRAPD( err, iRtspTimeout =
+ CPeriodic::NewL( CActive::EPriorityStandard ) );
+ if ( err != KErrNone )
+ {
+ // Timer creation failed, start cleanup immediately
+ iOwningSession.SourceStop();
+ }
+ }
+ else
+ {
+ iRtspTimeout->Cancel();
+ }
+
+ // Start timeout timer
+ iRtspTimeout->Start(
+ aTime,
+ aTime,
+ TCallBack( RtspTimeoutCallback, this ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::RtspTimeoutCallback
+// Callback for RTSP response timeout. Just ask session to start cleanup
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtspPacketSource::RtspTimeoutCallback( TAny* aPtr )
+ {
+ LOG( "CCRRtspPacketSource::RtspTimeoutCallback()" );
+
+ CCRRtspPacketSource* self = static_cast<CCRRtspPacketSource*>( aPtr );
+ self->iRtspTimeout->Cancel();
+ self->iOwningSession.SourceStop();
+ return 0;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::SendRtspCommandL
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::SendRtspCommandL()
+ {
+ LOG1( "CCRRtspPacketSource::SendRtspCommandL(), iStage: %d", iStage );
+
+ if ( iPostPonedPlay )
+ {
+ iPostPonedPlay = EFalse;
+ Play( iStartPos, iEndPos );
+ }
+ else
+ {
+ switch ( iStage )
+ {
+ case ERTSPInit:
+ case ERTSPOptSent:
+ {
+ delete iPrevCommands[ERTSPDescSent];
+ iPrevCommands[ERTSPDescSent] = NULL;
+ iPrevCommands[ERTSPDescSent] = CCRRtspCommand::NewL();
+ iPrevCommands[ERTSPDescSent]->SetCommand(
+ CCRRtspCommand::ERTSPCommandDESCRIBE );
+
+ TPtrC8 uriDes ( iRtspUri8->Des() );
+ iPrevCommands[ERTSPDescSent]->SetURL( uriDes );
+ iPrevCommands[ERTSPDescSent]->SetCSeq( iCSeq++ );
+ if ( iUserAgent )
+ {
+ iPrevCommands[ERTSPDescSent]->SetUserAgentL( *iUserAgent );
+ }
+ if ( iWapProfile )
+ {
+ iPrevCommands[ERTSPDescSent]->SetWapProfileL( *iWapProfile );
+ }
+ if ( iBandwidth )
+ {
+ iPrevCommands[ERTSPDescSent]->SetBandwidth( iBandwidth );
+ }
+
+ if ( iRtspSock )
+ {
+ iRtspSock->SendData( iPrevCommands[ERTSPDescSent]->ProduceL() );
+ StartRtspTimeout( KCRRtspResponseTimeout );
+ iStage = ERTSPDescSent;
+ }
+ }
+ break;
+
+ case ERTSPDescSent:
+ if ( iSdpParser )
+ {
+ const TInt audio( iSdpParser->MediaIdentifierAudio() );
+ const TInt video( iSdpParser->MediaIdentifierVideo() );
+ TBool videoExists( iSdpParser->VideoControlAddr().Length() > 0 );
+ TBool audioExists( iSdpParser->AudioControlAddr().Length() > 0 );
+
+ /* If both medias are reported with dynamic payload
+ * type and audio stream is reported with lower
+ * payload type, then some servers don't work correctly
+ * if the SETUP commands are not in correct order, ie.
+ * we need to first SETUP the audio stream here.
+ */
+ const TBool audioBeforeVideo(
+ audioExists && audio >= 96 && video >= 96 && audio < video );
+
+ if ( videoExists && !audioBeforeVideo )
+ {
+ SendSetupCommandL( iSdpParser->VideoControlAddr(), EFalse );
+ iStage = ERTSPSetupVideoSent;
+ }
+ else if ( audioExists )
+ {
+ SendSetupCommandL( iSdpParser->AudioControlAddr(), ETrue );
+ iStage = ERTSPSetupAudioSent;
+ }
+ else
+ {
+ LOG1( "CCRRtspPacketSource::SendRtspCommand stag %d have no audio nor video",
+ ( TInt )iStage );
+ // no audio, no video, el panique grande
+ iOwningSession.SourceStop();
+ }
+ }
+ break;
+
+ case ERTSPSetupAudioSent:
+ {
+ const TInt audio( iSdpParser->MediaIdentifierAudio() );
+ const TInt video( iSdpParser->MediaIdentifierVideo() );
+
+ if ( audio >= 96 && video >= 96 && audio < video &&
+ iSdpParser && iSdpParser->VideoControlAddr().Length() )
+ {
+ // Video exists also and has not been setup before, so
+ // let's setup it now.
+
+ TPtrC8 ctrlAddr ( iSdpParser->VideoControlAddr() );
+ SendSetupCommandL( ctrlAddr, EFalse );
+ iStage = ERTSPSetupVideoSent;
+ }
+ else
+ {
+ ConditionallySetupMultiCastOrTcpStreamingL();
+ }
+ }
+ break;
+
+ case ERTSPSetupVideoSent:
+ {
+ const TInt audio( iSdpParser->MediaIdentifierAudio() );
+ const TInt video( iSdpParser->MediaIdentifierVideo() );
+
+ // Check explanation for this in case ERTSPDescSent above.
+ const TBool audioBeforeVideo(
+ audio >= 96 && video >= 96 && audio < video );
+
+ // Then send audio, if applicable:
+ if ( iSdpParser && iSdpParser->AudioControlAddr().Length() &&
+ !audioBeforeVideo )
+ {
+ TPtrC8 ctrlAddr ( iSdpParser->AudioControlAddr() );
+ SendSetupCommandL( ctrlAddr, ETrue );
+ iStage = ERTSPSetupAudioSent;
+ }
+ else
+ {
+ // there is no audio that need setup so lets check also multicast+tcp
+ ConditionallySetupMultiCastOrTcpStreamingL();
+ }
+ }
+ break;
+
+ case ERTSPPauseSent:
+ // If we're paused, do zero the buffer, in tcp streaming case
+ // some servers seem to send packets even after play..
+ break;
+
+ case ERTSPReadyToPlay:
+ // In these stages send no further commands
+ break;
+
+ case ERTSPPlaySent:
+ // Start timer for UDP reception and start streaming
+ if ( iTransport == ERTPOverUDP )
+ {
+ iUdpReceptionTimer->Cancel();
+ iUdpReceptionTimer->After( KCRRtspRtpUdpTimeout );
+ }
+
+ iStage = ERTSPPlaying;
+ if ( !iNoRtpInfoHeader )
+ {
+ iSessionObs.StatusChanged( MCRPacketSource::ERtpStatePlaying );
+ }
+ break;
+
+ case ERTSPPlaying:
+ // None
+ break;
+
+ case ERTSPTearDownSent:
+ iPostPonedPlay = EFalse;
+ iOwningSession.SourceStop();
+ break;
+
+ default:
+ // By default send no further commands
+ break;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::SendPlayCommandL
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::SendPlayCommandL(void)
+ {
+ delete iPrevCommands[ERTSPPlaySent];
+ iPrevCommands[ERTSPPlaySent] = NULL;
+ iPrevCommands[ERTSPPlaySent] = CCRRtspCommand::NewL();
+ iPrevCommands[ERTSPPlaySent]->SetCommand ( CCRRtspCommand::ERTSPCommandPLAY );
+ TPtrC8 uriDes( iRtspUri8->Des() );
+ iPrevCommands[ERTSPPlaySent]->SetURL( uriDes );
+ iPrevCommands[ERTSPPlaySent]->SetCSeq( iCSeq ++ );
+ iPrevCommands[ERTSPPlaySent]->SetRange( iStartPos , iEndPos );
+
+ if ( iUserAgent )
+ {
+ iPrevCommands[ERTSPPlaySent]->SetUserAgentL( *iUserAgent );
+ }
+ if ( iSessionId.Ptr() )
+ {
+ iPrevCommands[ERTSPPlaySent]->SetSessionId( iSessionId );
+ }
+ if ( iAuthenticationNeeded )
+ {
+ AddAuthenticationL( ERTSPPlaySent );
+ }
+
+ if ( iRtspSock )
+ {
+ iRtspSock->SendData( iPrevCommands[ERTSPPlaySent]->ProduceL() );
+ StartRtspTimeout( KCRRtspResponseTimeout );
+ iStage = ERTSPPlaySent;
+ }
+
+ iStartPos = KRealZero;
+ iEndPos = KRealMinusOne;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::SendPauseCommandL
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::SendPauseCommandL(void)
+ {
+ delete iPrevCommands[ERTSPPauseSent];
+ iPrevCommands[ERTSPPauseSent] = NULL;
+ iPrevCommands[ERTSPPauseSent] = CCRRtspCommand::NewL();
+ iPrevCommands[ERTSPPauseSent]->SetCommand ( CCRRtspCommand::ERTSPCommandPAUSE );
+ TPtrC8 uriDes( iRtspUri8->Des() );
+ iPrevCommands[ERTSPPauseSent]->SetURL( uriDes );
+ iPrevCommands[ERTSPPauseSent]->SetCSeq( iCSeq ++ );
+
+ if ( iUserAgent )
+ {
+ iPrevCommands[ERTSPPauseSent]->SetUserAgentL( *iUserAgent );
+ }
+ if ( iSessionId.Ptr() )
+ {
+ iPrevCommands[ERTSPPauseSent]->SetSessionId( iSessionId );
+ }
+ if ( iAuthenticationNeeded )
+ {
+ AddAuthenticationL( ERTSPPauseSent );
+ }
+
+ if ( iRtspSock )
+ {
+ iRtspSock->SendData( iPrevCommands[ERTSPPauseSent]->ProduceL() );
+ StartRtspTimeout( KCRRtspResponseTimeout );
+ iStage = ERTSPPauseSent;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::SendSetupCommandL
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtspPacketSource::SendSetupCommandL(
+ const TDesC8& aControlAddr,
+ TBool aForAudio )
+ {
+ TCRRTSPStage newStage = aForAudio ? ERTSPSetupAudioSent : ERTSPSetupVideoSent;
+
+ delete iPrevCommands[newStage];
+ iPrevCommands[newStage] = NULL;
+ iPrevCommands[newStage] = CCRRtspCommand::NewL();
+ iPrevCommands[newStage]->SetCommand ( CCRRtspCommand::ERTSPCommandSETUP );
+ iPrevCommands[newStage]->SetURL( aControlAddr );
+ iPrevCommands[newStage]->SetCSeq( iCSeq ++ );
+ iPrevCommands[newStage]->SetTransport( iTransport );
+
+ // Map stream to port number (when streaming over UDP) or channel (over TCP)
+ // base: iClientPort for UDP, 0 for TCP
+ // video: (base+0, base+1)
+ // audio: (base+2, base+3) or (base+0, base+1) when audio only
+ TInt portbase( ( iTransport == ERTPOverUDP )? iClientPort: 0 );
+ TInt portoffset( ( aForAudio && iSdpParser->VideoControlAddr().Length() )? 2: 0 );
+ iPrevCommands[newStage]->SetClientPort( portbase + portoffset );
+
+ if ( iSessionId.Ptr() )
+ {
+ iPrevCommands[newStage]->SetSessionId ( iSessionId );
+ }
+ if ( iAuthenticationNeeded )
+ {
+ AddAuthenticationL( newStage );
+ }
+ if ( iUserAgent )
+ {
+ iPrevCommands[newStage]->SetUserAgentL( *iUserAgent );
+ }
+ if ( iWapProfile )
+ {
+ iPrevCommands[newStage]->SetWapProfileL( *iWapProfile );
+ }
+
+ if ( iRtspSock )
+ {
+ iRtspSock->SendData( iPrevCommands[newStage]->ProduceL() );
+ StartRtspTimeout( KCRRtspResponseTimeout );
+ }
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::SendTearDownCommandL
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::SendTearDownCommandL()
+ {
+ CCRRtspCommand*& teardowncmd = iPrevCommands[ERTSPTearDownSent];
+ iPostPonedPlay = EFalse;
+ if ( teardowncmd )
+ {
+ delete teardowncmd; teardowncmd = NULL;
+ }
+
+ teardowncmd = CCRRtspCommand::NewL();
+ teardowncmd->SetCommand( CCRRtspCommand::ERTSPCommandTEARDOWN );
+ TPtrC8 uri( iRtspUri8->Des() );
+ teardowncmd->SetURL( uri );
+ teardowncmd->SetCSeq( iCSeq++ );
+
+ if ( iSessionId.Ptr() )
+ {
+ teardowncmd->SetSessionId( iSessionId );
+ }
+ if ( iUserAgent )
+ {
+ teardowncmd->SetUserAgentL( *iUserAgent );
+ }
+ if ( iAuthenticationNeeded )
+ {
+ AddAuthenticationL( ERTSPTearDownSent );
+ }
+
+ if ( iRtspSock )
+ {
+ iRtspSock->SendData( teardowncmd->ProduceL() );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::SendOptionsCommandL
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::SendOptionsCommandL(void)
+ {
+ delete iPrevCommands[ERTSPOptSent];
+ iPrevCommands[ERTSPOptSent] = NULL;
+ iPrevCommands[ERTSPOptSent] = CCRRtspCommand::NewL();
+ iPrevCommands[ERTSPOptSent]->SetCommand ( CCRRtspCommand::ERTSPCommandOPTIONS );
+ TPtrC8 uriDes ( iRtspUri8->Des() );
+ iPrevCommands[ERTSPOptSent]->SetURL ( uriDes );
+ iPrevCommands[ERTSPOptSent]->SetCSeq ( iCSeq ++ );
+
+ if ( iUserAgent )
+ {
+ iPrevCommands[ERTSPOptSent]->SetUserAgentL( *iUserAgent );
+ }
+ if ( iSessionId.Ptr() )
+ {
+ iPrevCommands[ERTSPOptSent]->SetSessionId ( iSessionId );
+ }
+ if ( iAuthenticationNeeded )
+ {
+ AddAuthenticationL( ERTSPOptSent );
+ }
+
+ if ( iRtspSock )
+ {
+ iRtspSock->SendData( iPrevCommands[ERTSPOptSent]->ProduceL() );
+ }
+ // Sending options ping does not change our state
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::SetupRTPSessions
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtspPacketSource::SetupRTPSessions( void )
+ {
+ TInt retval( KErrNone );
+ if ( !iRtspSock )
+ {
+ retval = KErrNotReady;
+ }
+ else
+ {
+ TInetAddr localAddr( iRtspSock->LocalAddr() );
+ TInetAddr remoteAddr( iRtspSock->ConnectedAddr() );
+
+ // Clear used streams
+ iReceiveStreams.Reset();
+ iTrafficFound = EFalse;
+
+ // First audio:
+ if ( iRtspSock && iResponses[ERTSPSetupAudioSent] )
+ {
+ if ( iTransport == ERTPOverMulticast )
+ {
+ retval = CreateMulticastSocket( ERTPAudioSend1,
+ iResponses[ERTSPSetupAudioSent]->Destination(),
+ iResponses[ERTSPSetupAudioSent]->ClientPort() );
+ if ( retval == KErrNone )
+ {
+ retval = CreateMulticastSocket( ERTPAudioSend2,
+ iResponses[ERTSPSetupAudioSent]->Destination(),
+ iResponses[ERTSPSetupAudioSent]->ClientPort()+1 );
+ }
+ }
+ else
+ {
+ localAddr.SetPort( iResponses[ERTSPSetupAudioSent]->ClientPort() );
+ remoteAddr.SetPort( iResponses[ERTSPSetupAudioSent]->ServerPort() );
+
+#if defined ( LIVE_TV_FILE_TRACE ) || defined ( LIVE_TV_RDEBUG_TRACE )
+ TName _addr;
+ localAddr.Output( _addr );
+ LOG2( "localaddr for video is %S:%d", &_addr, localAddr.Port() );
+ remoteAddr.Output( _addr );
+ LOG2( "remoteAddr for video is %S:%d", &_addr, remoteAddr.Port() );
+#endif // LIVE_TV_FILE_TRACE || LIVE_TV_RDEBUG_TRACE
+
+ retval = CreateUnicastSocket( ERTPAudioSend1, localAddr, remoteAddr );
+ if ( retval == KErrNone )
+ {
+ localAddr.SetPort( localAddr.Port()+1 );
+ remoteAddr.SetPort( remoteAddr.Port()+1 );
+ retval = CreateUnicastSocket( ERTPAudioSend2, localAddr, remoteAddr );
+ }
+ }
+
+ if ( retval == KErrNone )
+ {
+ TRAP( retval, iAudioSession.OpenL(
+ iRTPSockArr[ERTPAudioSend1]->Socket(),
+ KAverageExpectedRtpPacketMaxSize,
+ iRTPSockArr[ERTPAudioSend2]->Socket(),
+ EPriorityNormal, KCRCName() ) );
+ }
+
+ LOG1( "CCRRtspPacketSource::SetupRTPSessions audio sess open: %d", retval );
+ if ( !retval )
+ {
+ SetRtpSession( iAudioSession , iSdpParser->AudioTimerGranularity() );
+ iAudioSession.SetBandwidth( iSdpParser->AudioBitrate() * 1000 );
+ TRAP( retval, iAudioSession.PrivRegisterEventCallbackL( ERtpNewSource,
+ ( TRtpCallbackFunction )CCRRtspPacketSource::AudioRTPCallBack, this ) );
+
+ TReceiveStream audioDataStream;
+ audioDataStream.iStreamType = EAudioStream;
+ audioDataStream.iDataReceived = EFalse;
+ iReceiveStreams.Append( audioDataStream );
+ LOG( "CCRRtspPacketSource::SetupRTPSessions - AudioStream found" );
+ TReceiveStream audioControlStream;
+ audioControlStream.iStreamType = EAudioControlStream;
+ audioControlStream.iDataReceived = EFalse;
+ LOG( "CCRRtspPacketSource::SetupRTPSessions - AudioControlStream found" );
+ iReceiveStreams.Append( audioControlStream );
+
+ LOG2( "CCRRtspPacketSource::SetupRTPSessions audio stat: %d, ts: %u",
+ retval, ( TUint )iRTPTimeStampAudio );
+ }
+ else
+ {
+ if ( iObserver )
+ {
+ iObserver->ConnectionStatusChange(
+ iOwningSession.SourceChecksum(),
+ ECRConnectionError, retval );
+ }
+ iOwningSession.SourceStop();
+ }
+ }
+
+ // Then video
+ if ( retval == KErrNone && iRtspSock && iResponses[ERTSPSetupVideoSent] )
+ {
+ if ( iTransport==ERTPOverMulticast )
+ {
+ retval = CreateMulticastSocket( ERTPVideoSend1,
+ iResponses[ERTSPSetupVideoSent]->Destination(),
+ iResponses[ERTSPSetupVideoSent]->ClientPort() );
+ if ( retval==KErrNone )
+ {
+ retval = CreateMulticastSocket( ERTPVideoSend2,
+ iResponses[ERTSPSetupVideoSent]->Destination(),
+ iResponses[ERTSPSetupVideoSent]->ClientPort()+1 );
+ }
+ }
+ else
+ {
+ localAddr.SetPort( iResponses[ERTSPSetupVideoSent]->ClientPort() );
+ remoteAddr.SetPort( iResponses[ERTSPSetupVideoSent]->ServerPort() );
+
+#if defined ( LIVE_TV_FILE_TRACE ) || defined ( LIVE_TV_RDEBUG_TRACE )
+ TName _addr;
+ localAddr.Output( _addr );
+ LOG2( "localaddr for video is %S:%d", &_addr, localAddr.Port() );
+ remoteAddr.Output( _addr );
+ LOG2( "remoteAddr for video is %S:%d", &_addr, remoteAddr.Port() );
+#endif // LIVE_TV_FILE_TRACE || LIVE_TV_RDEBUG_TRACE
+
+ retval = CreateUnicastSocket( ERTPVideoSend1, localAddr, remoteAddr );
+ if ( retval == KErrNone )
+ {
+ localAddr.SetPort( localAddr.Port() + 1 );
+ remoteAddr.SetPort( remoteAddr.Port() + 1 );
+ retval = CreateUnicastSocket( ERTPVideoSend2, localAddr, remoteAddr );
+ }
+ }
+
+ if ( retval == KErrNone )
+ {
+ TRAP( retval, iVideoSession.OpenL( iRTPSockArr[ERTPVideoSend1]->Socket(),
+ KAverageExpectedRtpPacketMaxSize, iRTPSockArr[ERTPVideoSend2]->Socket(),
+ EPriorityNormal, KCRCName() ) );
+ }
+
+ LOG1( "CCRRtspPacketSource::SetupRTPSessions video sess open: %d", retval );
+ if ( !retval )
+ {
+ SetRtpSession( iVideoSession , iSdpParser->VideoTimerGranularity() );
+ iVideoSession.SetBandwidth( iSdpParser->VideoBitrate() * 1000 );
+ TRAP( retval, iVideoSession.PrivRegisterEventCallbackL( ERtpNewSource,
+ ( TRtpCallbackFunction )CCRRtspPacketSource::VideoRTPCallBack, this ) );
+
+ TReceiveStream videoDataStream;
+ videoDataStream.iStreamType = EVideoStream;
+ videoDataStream.iDataReceived = EFalse;
+ LOG( "CCRRtspPacketSource::SetupRTPSessions - VideoStream found" );
+ iReceiveStreams.Append( videoDataStream );
+ TReceiveStream videoControlStream;
+ videoControlStream.iStreamType = EVideoControlStream;
+ videoControlStream.iDataReceived = EFalse;
+ LOG( "CCRRtspPacketSource::SetupRTPSessions - VideoControlStream found" );
+ iReceiveStreams.Append( videoControlStream );
+
+ LOG2( "CCRRtspPacketSource::SetupRTPSessions video stat: %d, ts: %u",
+ retval, ( TUint )iRTPTimeStampVideo );
+ }
+ else
+ {
+ if ( iObserver )
+ {
+ iObserver->ConnectionStatusChange(
+ iOwningSession.SourceChecksum(),
+ ECRConnectionError, retval );
+ }
+ iOwningSession.SourceStop();
+ }
+ }
+ }
+
+ return retval;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::CreateMulticastSocket
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtspPacketSource::CreateMulticastSocket(
+ TCRRTPSockId aSockId,
+ const TInetAddr& aGroupAddr,
+ TInt aPort )
+ {
+ // Alias for socket being created
+ CCRSock*& sock = iRTPSockArr[aSockId];
+
+ // Delete if already existing
+ if ( sock )
+ {
+ delete sock;
+ sock = NULL;
+ }
+
+ // Create socket
+ TRAPD( err, sock = CCRSock::NewL( *this, aSockId, iConnection.Connection(),
+ iSockServer, EFalse, EFalse) );
+ if ( err != KErrNone )
+ {
+ LOG2( "CCRRtspPacketSource::CreateMulticastSocket: CCRSock::NewL FAILED, sockId: %d, err: %d",
+ aSockId, err );
+ return err;
+ }
+
+ // Bind socket to local UDP port, issue no reads -> handled by RRtpSession
+ err = sock->ListenPort( aPort );
+ if ( err != KErrNone )
+ {
+ LOG2( "CCRRtspPacketSource::CreateMulticastSocket: ListenPort FAILED, port: %d, err: %d",
+ aPort, err );
+ return err;
+ }
+
+ err = sock->JoinGroup( aGroupAddr );
+ if ( err != KErrNone )
+ {
+ LOG1( "CCRRtspPacketSource::CreateMulticastSocket: JoinGroup FAILED, err: %d", err );
+ return err;
+ }
+
+#if defined(LIVE_TV_FILE_TRACE) || defined(LIVE_TV_RDEBUG_TRACE)
+ TName group;
+ aGroupAddr.Output( group );
+ LOG3( "CCRRtspPacketSource::CreateMulticastSocket: sockid: %d, group: '%S', port: %d OK",
+ aSockId, &group, aPort );
+#endif // LIVE_TV_FILE_TRACE || LIVE_TV_RDEBUG_TRACE
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::CreateUnicastSocket
+// -----------------------------------------------------------------------------
+TInt CCRRtspPacketSource::CreateUnicastSocket(
+ TCRRTPSockId aSockId,
+ const TInetAddr& aLocalAddr,
+ const TInetAddr& /*aRemoteAddr*/ )
+ {
+ // Alias for socket being created
+ CCRSock*& sock = iRTPSockArr[aSockId];
+
+ // Delete if already existing
+ if ( sock )
+ {
+ delete sock;
+ sock = NULL;
+ }
+
+ // Create socket: EFalse=UDP, EFalse=issue no read (handled by RRtpSession)
+ TRAPD( err, sock = CCRSock::NewL( *this,aSockId, iConnection.Connection(),
+ iSockServer, EFalse, EFalse ) );
+ if ( err != KErrNone )
+ {
+ LOG2( "CCRRtspPacketSource::CreateUnicastSocket: CCRSock::NewL FAILED, sockId: %d, err: %d",
+ aSockId, err );
+ return err;
+ }
+
+ // Bind to local port, ignore remote address and port
+ TInt port = aLocalAddr.Port();
+ err = sock->ListenPort( port );
+ if ( err != KErrNone )
+ {
+ LOG2( "CCRRtspPacketSource::CreateUnicastSocket: ListenPort FAILED, port: %d, err: %d",
+ port, err );
+ return err;
+ }
+
+#if defined(LIVE_TV_FILE_TRACE) || defined(LIVE_TV_RDEBUG_TRACE)
+ LOG2( "CCRRtspPacketSource::CreateUnicastSocket: sockid: %d, port: %d OK",
+ aSockId, port );
+#endif // LIVE_TV_FILE_TRACE || LIVE_TV_RDEBUG_TRACE
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::RTPPayloadProcessor
+// This is called from audio and video callbacks when real payload packet
+// is received from rtp stack.
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::RTPPayloadProcessor(
+ const TRtpEvent& aEvent,
+ const TBool aIsAudio )
+ {
+ // If udp traffic hasn't been flagged as found
+ // keep marking streams as found
+ if ( !iTrafficFound )
+ {
+ if ( aIsAudio )
+ {
+ StreamFound( EAudioStream );
+ }
+ else
+ {
+ StreamFound( EVideoStream );
+ }
+
+ // Cancel UDP timer, so as not to trigger TCP streaming
+ if ( CheckReceiveOfStreams() )
+ {
+ // We have traffic from all needed streams, cancel reception timer
+ // and set UDP flag.
+ iUdpReceptionTimer->Cancel();
+ iUdpFound = ETrue;
+ iTrafficFound = ETrue;
+ }
+ }
+
+ // Here process packet
+ RRtpReceivePacket p = aEvent.ReceiveSource().Packet();
+ TUint32 flag( 0 );
+ BigEndian::Put32( ( TUint8* )&flag, p.Flags() );
+
+ // Header
+ TCRRtpMessageHeader packetHeader;
+ memcpy( &packetHeader, &flag, sizeof( flag ) );
+ BigEndian::Put32( ( TUint8* )&packetHeader.iTimestamp, p.Timestamp() );
+ BigEndian::Put32( ( TUint8* )&packetHeader.iSSRC, p.SSRC() );
+ TPtrC8 rtpHeader( ( TUint8* )&packetHeader, sizeof( packetHeader ) );
+
+ if ( iNoRtpInfoHeader )
+ {
+ ConstructSeqAndTsForSink(
+ aIsAudio ? MCRPacketSource::EAudioStream : MCRPacketSource::EVideoStream,
+ 0 /*nop*/, 0 /*nop*/, 0 /*nop*/, p.SequenceNumber() );
+ }
+
+ // Stream
+ MCRPacketSource::TCRPacketStreamId stream(
+ ( aIsAudio )? MCRPacketSource::EAudioStream :
+ MCRPacketSource::EVideoStream );
+ iBuffer->AddPacket( stream, rtpHeader, p.Payload() );
+
+ // Count of packets
+ if ( aIsAudio )
+ {
+ iAudioBytes += p.Payload( ).Length();
+ iAudioPackets ++;
+ }
+ else
+ {
+ iVideoBytes += p.Payload( ).Length();
+ iVideoPackets ++;
+ }
+
+ p.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::AudioRTPCallBack
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::AudioRTPCallBack(
+ CCRRtspPacketSource* aPtr,
+ const TRtpEvent& aEvent )
+ {
+ switch ( aEvent.Type() )
+ {
+ case ERtpPacketReceived:
+ static_cast<CCRRtspPacketSource*>( aPtr )->
+ RTPPayloadProcessor( aEvent, ETrue );
+ break;
+
+ // RTCP
+ case ERtpSR:
+ {
+ // We have audio control traffic
+ if ( !aPtr->iTrafficFound )
+ {
+ aPtr->StreamFound( EAudioControlStream );
+ if ( aPtr->CheckReceiveOfStreams() )
+ {
+ // Cancel UDP timer, so as not to trigger TCP streaming
+ aPtr->iUdpReceptionTimer->Cancel();
+ aPtr->iUdpFound = ETrue;
+ aPtr->iTrafficFound = ETrue;
+ }
+ }
+
+ // Sender report
+ SenderReport( aPtr, aEvent, MCRPacketSource::EAudioControlStream );
+ }
+ break;
+
+ case ERtpNewSource:
+ {
+ // Handle audio
+ TRAPD( err, HandleNewSourceL( aPtr, aPtr->iRtpRecvSrcAudio, aEvent,
+ ( TRtpCallbackFunction )CCRRtspPacketSource::AudioRTPCallBack ) );
+ if ( err )
+ {
+ LOG1( "CCRRtspPacketSource::AudioRTPCallBack(), HandleNewSourceL Leaved: %d", err );
+ aPtr->iOwningSession.SourceStop();
+ }
+ }
+ break;
+
+ case ERtpSessionFail:
+ case ERtpSourceFail:
+ LOG( "CCRRtspPacketSource::VideoRTPCallBack(), source/session fail" );
+ aPtr->iOwningSession.SourceStop();
+ if ( aPtr->iObserver )
+ {
+ aPtr->iObserver->ConnectionStatusChange(
+ aPtr->iOwningSession.SourceChecksum(),
+ ECRNormalEndOfStream, KErrSessionClosed );
+ }
+ break;
+
+ case ERtpBYE:
+ LOG( "CCRRtspPacketSource::AudioRTPCallBack(), ERtpBYE" );
+ if ( aPtr->iObserver )
+ {
+ aPtr->iObserver->ConnectionStatusChange(
+ aPtr->iOwningSession.SourceChecksum(),
+ ECRNormalEndOfStream, KErrNone );
+ }
+ break;
+
+ default:
+ LOG1( "CCRRtspPacketSource::AudioRTPCallBack default case, type 0x%x",
+ ( TUint )( aEvent.Type() ) );
+ // by do nothing
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::VideoRTPCallBack
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::VideoRTPCallBack(
+ CCRRtspPacketSource* aPtr,
+ const TRtpEvent& aEvent )
+ {
+ switch ( aEvent.Type() )
+ {
+ case ERtpPacketReceived:
+ static_cast<CCRRtspPacketSource*>( aPtr )->
+ RTPPayloadProcessor( aEvent, EFalse );
+ break;
+
+ // RTCP
+ case ERtpSR:
+ {
+ // We have video control traffic
+ if ( !aPtr->iTrafficFound )
+ {
+ aPtr->StreamFound( EVideoControlStream );
+ if ( aPtr->CheckReceiveOfStreams() )
+ {
+ // Cancel UDP timer, so as not to trigger TCP streaming
+ aPtr->iUdpReceptionTimer->Cancel();
+ aPtr->iUdpFound = ETrue;
+ aPtr->iTrafficFound = ETrue;
+ }
+ }
+
+ // Sender report
+ SenderReport( aPtr, aEvent, MCRPacketSource::EVideoControlStream );
+ }
+ break;
+
+ case ERtpNewSource:
+ {
+ // Handle video
+ TRAPD( err, HandleNewSourceL( aPtr, aPtr->iRtpRecvSrcVideo, aEvent,
+ ( TRtpCallbackFunction )CCRRtspPacketSource::VideoRTPCallBack ) );
+ if ( err )
+ {
+ LOG1( "CCRRtspPacketSource::VideoRTPCallBack(), HandleNewSourceL Leaved: %d", err );
+ aPtr->iOwningSession.SourceStop();
+ }
+ }
+ break;
+
+ case ERtpSessionFail:
+ case ERtpSourceFail:
+ LOG( "CCRRtspPacketSource::VideoRTPCallBack(), Source/session fail" );
+ aPtr->iOwningSession.SourceStop();
+ if ( aPtr->iObserver )
+ {
+ aPtr->iObserver->ConnectionStatusChange(
+ aPtr->iOwningSession.SourceChecksum(),
+ ECRNormalEndOfStream, KErrSessionClosed );
+ }
+ break;
+
+ case ERtpBYE:
+ LOG( "CCRRtspPacketSource::VideoRTPCallBack(), ERtpBYE" );
+ if ( aPtr->iObserver )
+ {
+ aPtr->iObserver->ConnectionStatusChange(
+ aPtr->iOwningSession.SourceChecksum(),
+ ECRNormalEndOfStream, KErrNone );
+ }
+ break;
+
+ default:
+ LOG1( "CCRRtspPacketSource::VideoRTPCallBack default case, type 0x%x",
+ ( TUint )( aEvent.Type() ) );
+ // By do nothing
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::SenderReport
+// rfc-1305:
+// NTP timestamps are represented as a 64-bit unsigned fixed-
+// point number, in seconds relative to 0h on 1 January 1900.
+// The integer part is in the first 32 bits and the fraction
+// part in the last 32 bits.
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::SenderReport(
+ CCRRtspPacketSource* aPtr,
+ const TRtpEvent& aEvent,
+ MCRPacketSource::TCRPacketStreamId aStreamId )
+ {
+ TCRRtpSRReportHeader srReport;
+ srReport.iVersion = KRtpPacketVersion; // value is 2
+ srReport.iPadding = 0;
+ srReport.iReportCount = 0;
+ srReport.iPacketType = KSenderReportPacketType;
+ RRtpReceiveSource source( aEvent.ReceiveSource() );
+ BigEndian::Put16( ( TUint8* )&srReport.iLength, 6 );
+ BigEndian::Put32( ( TUint8* )&srReport.iSenderSSRC,
+ source.SSRC() );
+ BigEndian::Put32( ( TUint8* )&srReport.iMSWTimestamp,
+ source.GetSR().iSrPtr.ntp_sec );
+ BigEndian::Put32( ( TUint8* )&srReport.iLSWTimestamp,
+ source.GetSR().iSrPtr.ntp_frac );
+ BigEndian::Put32( ( TUint8* )&srReport.iRTPTimestamp,
+ source.GetSR().RTPTimestamp() );
+ BigEndian::Put32( ( TUint8* )&srReport.iSenderPacketCount,
+ aPtr->iAudioPackets );
+ BigEndian::Put32( ( TUint8* )&srReport.iSenderOctetCount,
+ aPtr->iAudioBytes );
+ TPtrC8 rtcpHeader( ( TUint8* )&srReport, sizeof( srReport ) );
+ aPtr->iBuffer->AddPacket( aStreamId, rtcpHeader );
+
+ // Verify Seq and Ts
+ if ( aPtr->iNoRtpInfoHeader )
+ {
+ aPtr->ConstructSeqAndTsForSink (
+ aStreamId,
+ source.GetSR().iSrPtr.ntp_sec,
+ source.GetSR().iSrPtr.ntp_frac,
+ source.GetSR().RTPTimestamp(),
+ 0 ); // 0 not used
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::HandleNewSourceL
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::HandleNewSourceL(
+ CCRRtspPacketSource* aPtr,
+ RRtpReceiveSource& aSource,
+ const TRtpEvent& aEvent,
+ TRtpCallbackFunction aCallback )
+ {
+ // Cancel UDP timer, so as not to trigger TCP streaming
+ aPtr->iUdpReceptionTimer->Cancel();
+ delete aPtr->iPunchPacketSenderAudio;
+ aPtr->iPunchPacketSenderAudio = NULL;
+ if ( aSource.IsOpen() )
+ {
+ aSource.Close();
+ }
+
+ // Source
+ aSource = aEvent.Session().NewReceiveSourceL();
+ aSource.PrivRegisterEventCallbackL( ERtpPacketReceived, aCallback, aPtr );
+ aSource.PrivRegisterEventCallbackL( ERtpSR, aCallback, aPtr );
+ aSource.PrivRegisterEventCallbackL( ERtpBYE, aCallback, aPtr );
+ aSource.PrivRegisterEventCallbackL( ERtpSessionFail, aCallback, aPtr );
+ aSource.PrivRegisterEventCallbackL( ERtpSourceFail, aCallback, aPtr );
+
+ // Ping Timer
+ if ( !aPtr->iRtspPingTimer )
+ {
+ aPtr->iRtspPingTimer = CPeriodic::NewL( CActive::EPriorityLow );
+ aPtr->iRtspPingTimer->Start(
+ KDVR10Seconds, 2 * KDVR10Seconds, TCallBack( SendRtspPing, aPtr ) );
+ }
+
+ aEvent.Session().SendAPPL( KCRCName() );
+ aEvent.Session().SetRTCPAutoSend( ETrue );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::SendAuthDescribeL
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::SendAuthDescribeL( )
+ {
+ delete iPrevCommands[ERTSPDescSent];
+ iPrevCommands[ERTSPDescSent] = NULL;
+ iPrevCommands[ERTSPDescSent] = CCRRtspCommand::NewL();
+ iPrevCommands[ERTSPDescSent]->SetCommand (
+ CCRRtspCommand::ERTSPCommandDESCRIBE );
+ TPtrC8 uriDes ( iRtspUri8->Des() );
+ iPrevCommands[ERTSPDescSent]->SetURL ( uriDes );
+ iPrevCommands[ERTSPDescSent]->SetCSeq ( iCSeq ++ );
+
+ if ( iAuthType )
+ {
+ iPrevCommands[ERTSPDescSent]->SetAuthenticationTypeL( iAuthType->Des() );
+ }
+ if ( iNonce )
+ {
+ iPrevCommands[ERTSPDescSent]->SetNonceL( iNonce->Des() );
+ }
+ if ( iRealm )
+ {
+ iPrevCommands[ERTSPDescSent]->SetRealmL( iRealm->Des() );
+ }
+ if ( iOpaque )
+ {
+ iPrevCommands[ERTSPDescSent]->SetOpaqueL( iOpaque->Des() );
+ }
+ if ( iUserAgent )
+ {
+ iPrevCommands[ERTSPDescSent]->SetUserAgentL( *iUserAgent );
+ }
+ if ( iWapProfile )
+ {
+ iPrevCommands[ERTSPDescSent]->SetWapProfileL( *iWapProfile );
+ }
+ if ( iBandwidth )
+ {
+ iPrevCommands[ERTSPDescSent]->SetBandwidth( iBandwidth );
+ }
+
+ iPrevCommands[ERTSPDescSent]->SetUserNameL( iUserName->Des() );
+ iPrevCommands[ERTSPDescSent]->SetPassWdL( iPassword->Des() );
+ iPrevCommands[ERTSPDescSent]->SetRtspUriL( iRtspUri->Des() );
+ iPrevCommands[ERTSPDescSent]->SetAuthentication ( iAuthenticationNeeded );
+ if ( iRtspSock )
+ {
+ iRtspSock->SendData( iPrevCommands[ERTSPDescSent]->ProduceL() );
+ StartRtspTimeout( KCRRtspResponseTimeout );
+ }
+ iStage = ERTSPDescSent;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::AddAuthenticationL
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::AddAuthenticationL( TInt aCommand )
+ {
+ if ( iPrevCommands[aCommand] && iNonce &&
+ iOpaque && iUserName && iPassword )
+ {
+ iPrevCommands[aCommand]->SetAuthenticationTypeL( iAuthType->Des() );
+ iPrevCommands[aCommand]->SetNonceL( iNonce->Des() );
+ iPrevCommands[aCommand]->SetRealmL( iRealm->Des() );
+ iPrevCommands[aCommand]->SetOpaqueL( iOpaque->Des() );
+ iPrevCommands[aCommand]->SetUserNameL( iUserName->Des() );
+ iPrevCommands[aCommand]->SetPassWdL( iPassword->Des() );
+ iPrevCommands[aCommand]->SetRtspUriL( iRtspUri->Des() );
+ iPrevCommands[aCommand]->SetAuthentication ( iAuthenticationNeeded );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::PunchPacketsSent
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::PunchPacketsSent( CCRPunchPacketSender* aPuncher )
+ {
+ if ( iPunchPacketSenderVideo && aPuncher == iPunchPacketSenderVideo )
+ {
+ iPunchPacketSentForVideo = ETrue;
+ }
+ if ( iPunchPacketSenderAudio && aPuncher == iPunchPacketSenderAudio )
+ {
+ iPunchPacketSentForAudio = ETrue;
+ }
+ if ( ( iPunchPacketSenderVideo && !iPunchPacketSenderAudio &&
+ iPunchPacketSentForVideo ) ||
+ ( !iPunchPacketSenderVideo && iPunchPacketSenderAudio &&
+ iPunchPacketSentForAudio ) ||
+ ( iPunchPacketSenderVideo && iPunchPacketSenderAudio &&
+ iPunchPacketSentForVideo && iPunchPacketSentForAudio ) )
+ {
+ LOG1( "PunchPacketsSent, play readiness: %d", iReadyToPlay );
+ SetupSessionsAndPlay();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::SetupSessionsAndPlay
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::SetupSessionsAndPlay()
+ {
+ // all needed punch packets are sent:
+ if ( SetupRTPSessions() != KErrNone )
+ {
+ iOwningSession.SourceStop();
+ }
+ else
+ {
+ // if we're ready to play, play
+ if ( iReadyToPlay )
+ {
+ TRAPD( err, SendPlayCommandL() );
+ if ( err != KErrNone )
+ {
+ iOwningSession.SourceStop();
+ }
+ }
+ else
+ {
+ iStage = ERTSPReadyToPlay;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::SendPunchPackets
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::SendPunchPacketsL( void )
+ {
+ LOG( "CCRRtspPacketSource::SendPunchPacketsL in" );
+ delete iPunchPacketSenderAudio;
+ iPunchPacketSenderAudio = NULL;
+ delete iPunchPacketSenderVideo;
+ iPunchPacketSenderVideo = NULL;
+
+ if ( iSdpParser &&iRtspSock && iResponses[ERTSPSetupVideoSent] )
+ {
+ TInetAddr localAddr = iRtspSock->LocalAddr();
+ TInetAddr remoteAddr = iRtspSock->ConnectedAddr();
+ localAddr.SetPort(iResponses[ERTSPSetupVideoSent]->ClientPort());
+ remoteAddr.SetPort(iResponses[ERTSPSetupVideoSent]->ServerPort());
+ iPunchPacketSenderVideo = CCRPunchPacketSender::NewL(
+ iConnection.Connection(), iSockServer,
+ localAddr, remoteAddr, 0, *this );
+ }
+ if ( iSdpParser && iRtspSock && iResponses[ERTSPSetupAudioSent] )
+ {
+ TInetAddr localAddr = iRtspSock->LocalAddr();
+ TInetAddr remoteAddr = iRtspSock->ConnectedAddr();
+ localAddr.SetPort(iResponses[ERTSPSetupAudioSent]->ClientPort());
+ remoteAddr.SetPort(iResponses[ERTSPSetupAudioSent]->ServerPort());
+ iPunchPacketSenderAudio = CCRPunchPacketSender::NewL(
+ iConnection.Connection(), iSockServer,
+ localAddr, remoteAddr, 0, *this );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::ConnectionStatusChange
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::ConnectionStatusChange(
+ TInt /*aSessionId*/,
+ TCRConnectionStatus aStatus,
+ TInt /* aErr */ )
+ {
+ switch( aStatus )
+ {
+ // Connection has gone up or bearer has changed -> check bandwidth
+ case ECRBearerChanged:
+ {
+ LOG( "CCRRtspPacketSource::ConnectionStatusChange: IapUp or IapUp2G" );
+ if ( iSdpParser && iObserver )
+ {
+ // Unknown bitrate or bandwidth are returned as zero. Bitrates in kbit/s
+ TInt bitrate( iSdpParser->VideoBitrate() +
+ iSdpParser->AudioBitrate() );
+ TInt bandwidth( iConnection.MaximumBandwidth() / 1000 );
+ if ( bitrate > 0 && bandwidth > 0 && bandwidth < bitrate )
+ {
+ LOG2( "CCRRtspPacketSource::ConnectionStatusChange: clip_bitrate: %d, connection_bandwidth: %d -> NotEnoughBandwidth",
+ bitrate, bandwidth );
+ iObserver->ConnectionStatusChange(
+ iOwningSession.SourceChecksum(), ECRNotEnoughBandwidth, KErrNone );
+ }
+ }
+ break;
+ }
+
+ // Connection has gone down or error occured -> switch back to RTP/UDP transport
+ case ECRConnectionError:
+ case ECRIapDown:
+ {
+ LOG( "CCRRtspPacketSource::ConnectionStatusChange: IapDown or ConnectionError -> switch to RTP/UDP streaming" );
+ iConnection.SetHeuristic( CCRConnection::EUdpStreamingBlocked, EFalse );
+ break;
+ }
+
+ // Nothing to do for:
+ // ECRConnecting
+ // ECRAuthenticationNeeded
+ // ECRNotEnoughBandwidth
+ // ECRNormalEndOfStream
+ default:
+ {
+ LOG1( "CCRRtspPacketSource::ConnectionStatusChange: unhandled status: %d", aStatus );
+ break;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::RegisterConnectionObs
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::RegisterConnectionObs( MCRConnectionObserver* aObserver )
+ {
+ iObserver = aObserver;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::UnregisterConnectionObs
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::UnregisterConnectionObs( )
+ {
+ iObserver = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::SetRtpSession
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::SetRtpSession(
+ RRtpSession& aSession,
+ TReal aGranularity )
+ {
+ // Unit is 1/second
+ __ASSERT_DEBUG( iSdpParser != NULL, User::Panic( _L( "RTSP source" ), KErrBadHandle ) );
+ TUint32 howManyNanoSecondsIsOneTick(
+ ( TUint32 )( TReal( 1000000000.0L ) / aGranularity ) );
+ LOG1( "CCRRtspPacketSource::SetRtpSession clock tick: %u", howManyNanoSecondsIsOneTick );
+ aSession.SetRTPTimeConversion( 0, howManyNanoSecondsIsOneTick );
+ aSession.SetRtpStreamParameters( KDVRMinSequential, // 1
+ KDVRMaxMisorder, // 50
+ KDVRMaxDropOut ); // 3000
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::SendRtspPing
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtspPacketSource::SendRtspPing( TAny* aSelfPtr )
+ {
+ CCRRtspPacketSource* ptr = static_cast<CCRRtspPacketSource*> ( aSelfPtr );
+ TRAPD( err, ptr->SendOptionsCommandL() );
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::ConstructSeqAndTsForSink
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::ConstructSeqAndTsForSink (
+ MCRPacketSource::TCRPacketStreamId aStreamId,
+ TUint32 aMSWTimestamp,
+ TUint32 aLSWTimestamp,
+ TUint32 aRTPTimestamp,
+ TUint aSeq )
+ {
+ switch ( aStreamId )
+ {
+ case EAudioStream:
+ if ( iRTPTimeStampAudio )
+ {
+ iSeqFromRtpInfoForAudio = aSeq;
+ if ( iSeqFromRtpInfoForAudio == 0 )
+ {
+ iSeqFromRtpInfoForAudio++;
+ }
+ LOG1( "CCRRtspPacketSource::ConstructSeqAndTsForSink(), Audio seq: %d ", ( int )aSeq );
+ // We may declare that we have seq+ts if we're here and have only audio or
+ // if we're here and have both audio and video and have also seq for video
+ if ( ( iSdpParser->SupportedContent() == CDvrSdpParser::EDvrAudioOnly ) ||
+ ( iSdpParser->SupportedContent() == CDvrSdpParser::EDvrBothAudioAndVideo &&
+ iSeqFromRtpInfoForVideo && iRTPTimeStampVideo ) )
+ {
+ iSessionObs.StatusChanged(
+ MCRPacketSource::ERtpStateSeqAndTSAvailable );
+ iNoRtpInfoHeader = EFalse;
+ if ( iStage == ERTSPPlaying )
+ {
+ iSessionObs.StatusChanged(
+ MCRPacketSource::ERtpStatePlaying );
+ }
+ }
+ }
+ break;
+
+ case EAudioControlStream:
+ if ( !iMSWTimestamp )
+ { // no wall clock time yet set
+ iMSWTimestamp = aMSWTimestamp;
+ iLSWTimestamp = aLSWTimestamp;
+ iRTPTimeStampAudio = aRTPTimestamp;
+ if ( iRTPTimeStampAudio == 0 )
+ {
+ iRTPTimeStampAudio++;
+ }
+ }
+ else
+ {
+ // Sync audio with video
+ TInt64 wallClockOfVideo = MAKE_TINT64 ( iMSWTimestamp , iLSWTimestamp );
+ TInt64 wallClockOfAudio = MAKE_TINT64 ( aMSWTimestamp , aLSWTimestamp );
+ // Then figure out the difference. unit is now difficult ; upper
+ // 32 bits contain whole seconds, lower contains fraction
+ TInt64 wallClockDifference( wallClockOfVideo - wallClockOfAudio );
+ // Now, the aRTPTimestamp has different scale, declared in SDP.
+ // first make one second that has same scale as wallClockDifference
+ TInt64 granularity( MAKE_TINT64( 1, 0 ) );
+ // Then divide that one second with the given granularity. variable
+ // granularity will now contain in its low 32 bits the fraction of the
+ // second that re-presents one clock tick (e.g. 1/90000 sec for video)
+ granularity = granularity / static_cast<TInt64>(
+ iSdpParser->AudioTimerGranularity() );
+ // Then divide our difference with this fraction of second
+ TInt64 wallClockDifferenceGranular = wallClockDifference / granularity;
+ // unit of wallClockDifferenceGranular is now 2^32 / granularity
+ TInt32 wallClockDifferenceGranular32 = wallClockDifferenceGranular;
+ LOG2( "CCRRtspPacketSource::ConstructSeqAndTsForSink(), Audio ts: %u adjust by: %d",
+ aRTPTimestamp , wallClockDifferenceGranular32 );
+ iRTPTimeStampAudio = aRTPTimestamp + wallClockDifferenceGranular32;
+ if ( iRTPTimeStampAudio == 0 )
+ {
+ iRTPTimeStampAudio++;
+ }
+ }
+ break;
+
+ case EVideoStream:
+ if ( iRTPTimeStampVideo )
+ {
+ iSeqFromRtpInfoForVideo = aSeq;
+ if ( iSeqFromRtpInfoForVideo == 0 )
+ {
+ iSeqFromRtpInfoForVideo++;
+ }
+ LOG1( "CCRRtspPacketSource::ConstructSeqAndTsForSink(), Video seq: %d ",
+ ( int )aSeq );
+
+ // We may declare that we have seq+ts if we're here and have only video or
+ // if we're here and have both and have also seq for video
+ if ( ( iSdpParser->SupportedContent() == CDvrSdpParser::EDvrVideoOnly ) ||
+ ( iSdpParser->SupportedContent() == CDvrSdpParser::EDvrBothAudioAndVideo &&
+ iSeqFromRtpInfoForAudio && iRTPTimeStampAudio ) )
+ {
+ iSessionObs.StatusChanged(
+ MCRPacketSource::ERtpStateSeqAndTSAvailable );
+ iNoRtpInfoHeader = EFalse;
+ if ( iStage == ERTSPPlaying )
+ {
+ iSessionObs.StatusChanged(
+ MCRPacketSource::ERtpStatePlaying );
+ }
+ }
+ }
+ break;
+
+ case EVideoControlStream:
+ if ( !iMSWTimestamp )
+ { // No wall clock time yet set
+ iMSWTimestamp = aMSWTimestamp;
+ iLSWTimestamp = aLSWTimestamp;
+ iRTPTimeStampVideo = aRTPTimestamp;
+ if ( iRTPTimeStampVideo == 0 )
+ {
+ iRTPTimeStampVideo++;
+ }
+ }
+ else
+ {
+ // Sync audio with video
+ TInt64 wallClockOfAudio = MAKE_TINT64 ( iMSWTimestamp , iLSWTimestamp );
+ TInt64 wallClockOfVideo = MAKE_TINT64 ( aMSWTimestamp , aLSWTimestamp );
+ // Then figure out the difference. unit is now difficult ; upper
+ // 32 bits contain whole seconds, lower contains fraction
+ TInt64 wallClockDifference( wallClockOfAudio - wallClockOfVideo );
+ // Now, the aRTPTimestamp has different scale, declared in SDP.
+ // first make one second that has same scale as wallClockDifference
+ TInt64 granularity( MAKE_TINT64( 1, 0 ) );
+ // Then divide that one second with the given granularity. variable
+ // granularity will now contain in its low 32 bits the fraction of the
+ // second that re-presents one clock tick (e.g. 1/90000 sec for video)
+ granularity = granularity / static_cast<TInt64>(
+ iSdpParser->VideoTimerGranularity());
+ // Then divide our difference with this fraction of second
+ TInt64 wallClockDifferenceGranular = wallClockDifference / granularity;
+ // Unit of wallClockDifferenceGranular is now 2^32 / granularity
+ TInt32 wallClockDifferenceGranular32 = wallClockDifferenceGranular;
+ LOG2( "CCRRtspPacketSource::ConstructSeqAndTsForSink(), Video ts: %u adjust by: %d",
+ aRTPTimestamp , wallClockDifferenceGranular32 );
+ iRTPTimeStampVideo = aRTPTimestamp + wallClockDifferenceGranular32;
+ if ( iRTPTimeStampVideo == 0 )
+ {
+ iRTPTimeStampVideo++;
+ }
+ }
+ break;
+
+ default:
+ // no thing
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::ConditionallySetupMultiCastOrTcpStreamingL
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::ConditionallySetupMultiCastOrTcpStreamingL ( void )
+ {
+ // UDP: Punch packets or play sent in ProcessRTSPResponseL, so do nothing.
+ if ( iTransport == ERTPOverUDP )
+ {
+ }
+ // Multicast: no punch packets needed but session setup yes
+ else if ( iTransport == ERTPOverMulticast )
+ {
+ SetupSessionsAndPlay();
+ }
+
+ // TCP: no punch packets or session, just send PLAY .. but wait for UI
+ else if ( iTransport == ERTPOverTCP )
+ {
+ if ( iReadyToPlay )
+ {
+ SendPlayCommandL();
+ }
+ else
+ {
+ iStage = ERTSPReadyToPlay;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::CheckReceiveOfStreams
+// -----------------------------------------------------------------------------
+//
+TBool CCRRtspPacketSource::CheckReceiveOfStreams()
+ {
+ TBool retVal( ETrue );
+
+ // Go through all streams and check that all streams have receive flag on,
+ // if not return false.
+ for ( TInt i = 0 ; i < iReceiveStreams.Count() ; i++ )
+ {
+ if ( iReceiveStreams[i].iDataReceived == EFalse )
+ {
+ LOG1( "CCRRtspPacketSource::CheckReceiveOfStreams - Missing atleast stream %d", iReceiveStreams[i].iStreamType );
+ retVal = EFalse;
+ break;
+ }
+ }
+
+ if ( retVal )
+ {
+ LOG( "CCRRtspPacketSource::CheckReceiveOfStreams - Receiving from all streams!" );
+ }
+
+ return retVal;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::StreamFound
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::StreamFound( TCRPacketStreamId aStreamType )
+ {
+ // Go through streams and find correct stream to set the receive flag.
+ for ( TInt i = 0 ; i < iReceiveStreams.Count(); i++ )
+ {
+ if ( iReceiveStreams[i].iStreamType == aStreamType )
+ {
+ iReceiveStreams[i].iDataReceived = ETrue;
+ LOG1( "CCRRtspPacketSource::StreamFound - Stream %d found", iReceiveStreams[i].iStreamType );
+ break;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::ResetStreamFlags
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::ResetStreamFlags( )
+ {
+ // Go through streams and clear receiving flag.
+ for ( TInt i = 0 ; i < iReceiveStreams.Count() ; i++ )
+ {
+ iReceiveStreams[i].iDataReceived = EFalse;
+ }
+
+ // We have to check receive again
+ iTrafficFound = EFalse;
+ }
+
+#if defined ( LIVE_TV_FILE_TRACE ) || defined ( LIVE_TV_RDEBUG_TRACE )
+// -----------------------------------------------------------------------------
+// CCRRtspPacketSource::ShowHeader
+// -----------------------------------------------------------------------------
+//
+void CCRRtspPacketSource::ShowHeader(
+ const TDesC8& aRtcpHeader,
+ const TCRRtpSRReportHeader& aSrReport )
+ {
+ TBuf<100> b( KNullDesC );
+ LOG1( "CCRRtspPacketSource::TCP control packet len: %d", aRtcpHeader.Length() );
+ for ( TInt j( 0 ); j < 32 && j < aRtcpHeader.Length(); j++ )
+ {
+ b.AppendFormat( _L( "%2X " ), ( unsigned )( aRtcpHeader[j] ) );
+ if ( j > 0 && ( ( j % 16 ) == 0 ) )
+ {
+ LOG2( "%d -> %S", j, &b );
+ b.Zero();
+ }
+ }
+
+ LOG1( "iVersion %u", ( unsigned )aSrReport.iVersion );
+ LOG1( "iPadding %u", ( unsigned )aSrReport.iPadding );
+ LOG1( "iReportCount %u",( unsigned )aSrReport.iReportCount );
+ LOG1( "iPacketType %u", ( unsigned )aSrReport.iPacketType );
+ LOG1( "iLength %u",
+ ( unsigned)BigEndian::Get16( ( const TUint8* )&aSrReport.iLength ) );
+ LOG1( "iSenderSSRC %u",
+ ( unsigned )BigEndian::Get32( ( const TUint8* )&aSrReport.iSenderSSRC ) );
+ LOG1( "iMSWTimestamp %u",
+ ( unsigned )BigEndian::Get32( ( const TUint8* )&aSrReport.iMSWTimestamp) );
+ LOG1( "iLSWTimestamp %u",
+ ( unsigned)BigEndian::Get32( ( const TUint8* )&aSrReport.iLSWTimestamp ) );
+ LOG1( "iRTPTimestamp %u",
+ ( unsigned )BigEndian::Get32( ( const TUint8* )&aSrReport.iRTPTimestamp ) );
+ LOG1( "iSenderPacketCount %u",
+ ( unsigned )BigEndian::Get32( ( const TUint8* )&aSrReport.iSenderPacketCount) );
+ LOG1( "iSenderOctetCount %u",
+ ( unsigned )BigEndian::Get32( ( const TUint8* )&aSrReport.iSenderOctetCount ) );
+
+ }
+#endif // LIVE_TV_FILE_TRACE || LIVE_TV_RDEBUG_TRACE
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRRTSPResponse.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,510 @@
+/*
+* 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: RTSP response parser and producer*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCRRtspResponse.h"
+#include "CRRTSPCommon.h"
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+const TInt KDVRMinRTSPResponseLen( 14 );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRRtspResponse::CCRRtspResponse
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCRRtspResponse::CCRRtspResponse()
+ : iStatusCode( ERTSPRespContinue ),
+ iServerPort( KErrNotFound ),
+ iSSRC( NULL, 0 )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspResponse::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCRRtspResponse* CCRRtspResponse::NewL()
+ {
+ CCRRtspResponse* self = new( ELeave ) CCRRtspResponse();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspResponse::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCRRtspResponse::ConstructL()
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspResponse::~CCRRtspResponse
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRRtspResponse::~CCRRtspResponse()
+ {
+ LOG( "CCRRtspResponse::~CCRRtspResponse" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspResponse::TryParseL
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspResponse::TryParseL( const TDesC8 &aString )
+ {
+ if ( aString.Length() < KDVRMinRTSPResponseLen )
+ {
+ LOG( "CCRRtspResponse::TryParseL(), Length less than minimum, Leaved: KErrUnderflow" );
+ User::Leave( KErrUnderflow );
+ }
+
+ // Copy the stuff into local variable:
+ delete iRtspText; iRtspText = NULL;
+ iRtspText = aString.AllocL();
+
+ const TInt KReplyHeaderOffset( KCRRTSPReplyHeader().Length() );
+ const TInt KStatusNumberLen( 5 );
+
+ // Try to find out if end of the command has been received
+ // "RTSP/1.0 XXX\r\n\r\n" at least..
+ TInt replyEndOffSet = aString.FindC( KCR2NewLines() );
+ if ( replyEndOffSet == KErrNotFound )
+ {
+ // Need to have more, do nothing yet.. except that some servers
+ // do not append 2 newlines to 404 or other error responses:
+ if ( !aString.Left( KReplyHeaderOffset ).CompareC( KCRRTSPReplyHeader() ) )
+ {
+ TPtrC8 statusNumberString(
+ aString.Mid( KReplyHeaderOffset, KStatusNumberLen ) );
+ TLex8 statusNumberLex( statusNumberString );
+ TInt statusCodeInteger( KErrNotFound );
+ User::LeaveIfError ( statusNumberLex.Val( statusCodeInteger ) ) ;
+ iStatusCode = static_cast<TResponseCode>( statusCodeInteger );
+ if ( iStatusCode != ERTSPRespOK &&
+ iStatusCode != ERTSPRespCreated &&
+ iStatusCode != ERTSPRespProxyAuthenticationRequired &&
+ iStatusCode != ERTSPRespUnauthorized )
+ {
+ // Was something else than ok or unauthorized-401
+ FindCSeqL();
+ LOG1( "CCRRtspResponse::TryParseL() out, with rtsp error code: %d", iStatusCode );
+ return;
+ }
+ }
+
+ LOG( "CCRRtspResponse::TryParseL() out, because response not complete" );
+ User::Leave( KErrUnderflow );
+ }
+
+ LOG1( "CCRRtspResponse::TryParseL(), replyEndOffSet: %d", replyEndOffSet );
+
+ // Find status code:
+ if ( iRtspText->Left( KReplyHeaderOffset ).CompareC( KCRRTSPReplyHeader() ) == 0 )
+ {
+ TPtrC8 statusNumberString( iRtspText->Mid(
+ KReplyHeaderOffset, KStatusNumberLen ) );
+ TLex8 statusNumberLex( statusNumberString );
+ TInt statusCodeInteger( KErrNotFound );
+ User::LeaveIfError ( statusNumberLex.Val( statusCodeInteger ) );
+ iStatusCode = ( TResponseCode )( statusCodeInteger );
+ }
+ else
+ {
+ LOG( "CCRRtspResponse::TryParseL(), Statuscode integer not found !" );
+ User::Leave( KErrNotSupported );
+ }
+
+ LOG1( "CCRRtspResponse::TryParseL(), iStatusCode: %d", iStatusCode );
+
+ FindContentL();
+ // Then find CSeq
+ FindCSeqL();
+ // Then find session id
+ FindSessionIdL();
+ // Then find server ports
+ FindServerPorts();
+ // Then find SSRC
+ FindSSRC();
+ // Then try finding rtp-info header if it was play reply
+ FindRTPInfoHeader();
+ // Find possible transport method
+ // IMPORTANT: should be done before parsing client port
+ FindTransport();
+ // Find possible client port
+ FindClientPorts();
+ if ( iServerPort == KErrNotFound && iClientPort != KErrNotFound )
+ {
+ LOG( "CCRRtspResponse::TryParseL(), using client port as server port -> UGLY!!" );
+ iServerPort = iClientPort ;
+ }
+ // Find destination address is existing
+ FindDestination();
+ // Try finding authentication
+ FindRTPAuthenticationL();
+ // Try to find range header
+ ParseRange();
+ // Try to find session-base header
+ FindContentBase();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspResponse::StatusCode
+//
+// -----------------------------------------------------------------------------
+//
+CCRRtspResponse::TResponseCode CCRRtspResponse::StatusCode( void )
+ {
+ return iStatusCode;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspResponse::FindServerPorts
+//
+// method that finds server port numeric value
+// -----------------------------------------------------------------------------
+//
+void CCRRtspResponse::FindServerPorts( void )
+ {
+ iServerPort = KErrNotFound;
+ TInt portNumberOffset( iRtspText->FindC( KCRServerPort ) );
+ if ( portNumberOffset != KErrNotFound )
+ {
+ const TInt KDVRPortNumberMaxLen ( 5 ) ;
+ TPtrC8 portNumberStr( iRtspText->Mid(
+ portNumberOffset + KCRServerPort().Length() + 1, KDVRPortNumberMaxLen ) );
+ TLex8 portNumberLex( portNumberStr );
+ if ( portNumberLex.Val( iServerPort ) != KErrNone )
+ { // something wrong?
+ LOG( "CCRRtspResponse::FindServerPorts(), portNumberLex.Val() != KErrNone" );
+ iServerPort = KErrNotFound;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspResponse::ServerPort
+//
+// method that returns server port numeric value
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtspResponse::ServerPort( void )
+ {
+ return iServerPort;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspResponse::FindSSRC
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspResponse::FindSSRC( void )
+ {
+ LOG( "CCRRtspResponse::FindSSRC() in" );
+ TInt SSRCOffset( KErrNotFound );
+ iSSRC.Set( NULL, 0 );
+
+ if ( ( SSRCOffset = iRtspText->FindC( KCRSSRC ) ) != KErrNotFound )
+ {
+ TPtrC8 SSRCStr( iRtspText->Right(
+ ( iRtspText->Length() - SSRCOffset ) - 6 ) );
+ TInt SSRCLen( 0 );
+ for ( TInt i( 0 ); i < SSRCStr.Length(); i++ )
+ {
+ if ( TChar( SSRCStr[i] ).IsAlphaDigit() )
+ {
+ SSRCLen++;
+ }
+ else
+ {
+ iSSRC.Set( SSRCStr.Mid( 0, SSRCLen ) );
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspResponse::SSRC
+//
+// method that returns SSRC string
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtspResponse::SSRC( TPtrC8& aSSRC )
+ {
+ if ( iSSRC.Ptr() != NULL )
+ {
+ aSSRC.Set( iSSRC );
+ return KErrNone;
+ }
+ else
+ {
+ return KErrNotFound;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspResponse::FindRTPInfoHeader
+//
+// method that partially parses rtp info header
+// -----------------------------------------------------------------------------
+//
+void CCRRtspResponse::FindRTPInfoHeader( void )
+ {
+ TInt offset = iRtspText->FindC( KCRRtpInfo ); // "Rtp-Info: "
+ TInt url2OffSet( KErrNotFound );
+
+ iRTPInfoHeader.iFirstURL.Set( NULL , 0 );
+ iRTPInfoHeader.iFirstSeq = 0;
+ iRTPInfoHeader.iFirstTS = 0;
+ iRTPInfoHeader.iSecondURL.Set( NULL, 0 );
+ iRTPInfoHeader.iSecondSeq = 0;
+ iRTPInfoHeader.iSecondTS = 0;
+
+ if ( offset > 0 )
+ {
+ // Yes, there is header. That seems to be sucky to parse. We have delimiting
+ // characters ,; and nl and we may or may not find words url, seq and rtptime
+ // and maybe something else. We may be confident that there will be at max
+ // 2 url srings
+ offset += KCRRtpInfo().Length(); // add the len of "RTP-Info: "
+ TPtrC8 rtpInfoContent = iRtspText->Right( iRtspText->Length() - offset );
+ TInt urlOffSet = rtpInfoContent.FindC( KCRUrlStr );
+
+ for ( TInt i( 0 ); urlOffSet != KErrNotFound && i < 2; i ++ )
+ {
+ // At least one url string found
+ TPtrC8 urlContent( iRtspText->Right( iRtspText->Length() -
+ ( offset + urlOffSet + 4 ) ) );
+ // Above string now contains rest of the PLAY commands RTSP OK response
+ // so in practice there is 2 url-strings. If so, find the next one
+ // and cut our string
+ if ( ( url2OffSet = urlContent.FindC( KCRUrlStr ) ) > 0 )
+ {
+ urlContent.Set( urlContent.Left( url2OffSet ) );
+ }
+
+ // Ok, now there is only one url string in urlContent.
+ // then just find seq and ts
+ TInt seqOffSet = urlContent.FindC( KCRSeqStr );
+ if ( seqOffSet != KErrNotFound )
+ {
+ TPtrC8 seqContent( urlContent.Right( urlContent.Length() -
+ ( seqOffSet + KCRSeqStr().Length() ) ) );
+ TLex8 seqLex( seqContent );
+ if ( seqLex.Val( ( iRTPInfoHeader.iFirstURL.Length() == 0 )?
+ iRTPInfoHeader.iFirstSeq : iRTPInfoHeader.iSecondSeq,
+ EDecimal ) == KErrNone )
+ {
+ TInt tsOffSet( urlContent.FindC( KCRRtptimeStr ) );
+ if ( tsOffSet != KErrNotFound )
+ {
+ TPtrC8 tsContent( urlContent.Right( urlContent.Length() -
+ ( tsOffSet + KCRRtptimeStr().Length() ) ) );
+ TLex8 tsLex( tsContent );
+ tsLex.Val( ( iRTPInfoHeader.iFirstURL.Length() == 0 )?
+ iRTPInfoHeader.iFirstTS:
+ iRTPInfoHeader.iSecondTS, EDecimal );
+ }
+ }
+ else
+ {
+ urlContent.Set ( NULL , 0 ) ;
+ }
+ }
+ else
+ {
+ urlContent.Set ( NULL , 0 ) ;
+ }
+
+ if ( urlContent.Length() > 0 )
+ {
+ TInt semicolonOffSet( urlContent.Locate(';') );
+ const TInt KDVRMinSemicolonOffset ( 5 ) ;
+ if ( iRTPInfoHeader.iFirstURL.Length() == 0 && semicolonOffSet > KDVRMinSemicolonOffset )
+ {
+ iRTPInfoHeader.iFirstURL.Set(
+ urlContent.Mid( 0, semicolonOffSet ) );
+ }
+ else
+ {
+ const TInt KDVRURLBeginOffset ( 4 ) ;
+ iRTPInfoHeader.iSecondURL.Set(
+ urlContent.Mid( KDVRURLBeginOffset,
+ semicolonOffSet - KDVRURLBeginOffset ) );
+ }
+ }
+
+ // Then continue with next url
+ urlOffSet = url2OffSet;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspResponse::RTPInfoHeader
+//
+// method that returns rtp-info header content
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtspResponse::RTPInfoHeader(
+ CCRRtspResponse::SRTPInfoHeader &aRTPInfoHeader )
+ {
+ if ( iRTPInfoHeader.iFirstURL.Length() == 0 )
+ {
+ return KErrNotFound;
+ }
+ else
+ {
+ aRTPInfoHeader.iFirstURL.Set( iRTPInfoHeader.iFirstURL );
+ aRTPInfoHeader.iFirstSeq = iRTPInfoHeader.iFirstSeq;
+ aRTPInfoHeader.iFirstTS = iRTPInfoHeader.iFirstTS;
+ aRTPInfoHeader.iSecondURL.Set( iRTPInfoHeader.iSecondURL );
+ aRTPInfoHeader.iSecondSeq = iRTPInfoHeader.iSecondSeq;
+ aRTPInfoHeader.iSecondTS = iRTPInfoHeader.iSecondTS;
+
+ return KErrNone;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspResponse::FindRTPAuthenticationL
+//
+// method that partially parses rtp authentication header
+// -----------------------------------------------------------------------------
+//
+void CCRRtspResponse::FindRTPAuthenticationL( void )
+ {
+ TInt endPos( KErrNotFound );
+
+ // First look for authorization method(basic / digest)
+ TInt pos = iRtspText->FindC( KCRAuthDigest );
+
+ // digest
+ if ( pos != KErrNotFound )
+ {
+ // Digest found, we can continue
+ LOG( "CCRRtspResponse::FindRTPAuthenticationL() Digest found" );
+
+ delete iAuthType;
+ iAuthType = NULL;
+ iAuthType = HBufC8::NewL( KCRAuthDigest().Length() );
+ iAuthType->Des().Copy( KCRAuthDigest );
+
+ // find "realm"
+ pos = iRtspText->FindC( KCRAuthRealm );
+ if ( pos != KErrNotFound )
+ {
+ LOG( "CCRRtspResponse::FindRTPAuthenticationL() realm found" );
+ pos = pos + KCRAuthRealm().Length(); // realm
+ endPos = iRtspText->Mid( pos ).LocateF( '"' );
+
+ if ( endPos != KErrNotFound )
+ {
+ TPtrC8 data = iRtspText->Mid( pos ).Left( endPos );
+ delete iRealm;
+ iRealm = NULL;
+ iRealm = HBufC8::NewL( data.Length() );
+ iRealm->Des().Copy( data );
+ }
+ }
+
+ // Find "nonce"
+ pos = iRtspText->FindC( KCRAuthNonce() );
+ if ( pos != KErrNotFound )
+ {
+ LOG( "CCRRtspResponse::FindRTPAuthenticationL() nonce found" );
+ pos = pos + KCRAuthNonce().Length(); // nonce
+ endPos = iRtspText->Mid( pos ).LocateF( '"' );
+ if ( endPos != KErrNotFound )
+ {
+ TPtrC8 nonceData = iRtspText->Mid( pos ).Left( endPos );
+ delete iNonce;
+ iNonce = NULL;
+ iNonce = HBufC8::NewL( nonceData.Length() );
+ iNonce->Des().Copy( nonceData );
+ }
+ }
+
+ // Find "opaque"(it seems that Darwin streaming server does not send this one)
+ pos = iRtspText->FindC( KCRAuthOpaque() );
+ if ( pos != KErrNotFound )
+ {
+ LOG( "CCRRtspResponse::FindRTPAuthenticationL() opaque found" );
+ pos = pos + KCRAuthOpaque().Length(); // opaque
+ endPos = iRtspText->Mid( pos ).LocateF( '"' );
+ if ( endPos != KErrNotFound )
+ {
+ TPtrC8 opaqData = iRtspText->Mid( pos ).Left( endPos );
+ delete iOpaque;
+ iOpaque = NULL;
+ iOpaque = HBufC8::NewL( opaqData.Length() );
+ iOpaque->Des().Copy( opaqData );
+ }
+ }
+ }
+
+ // basic
+ else
+ {
+ pos = iRtspText->FindC( KCRAuthBasic );
+
+ if ( pos != KErrNotFound )
+ {
+ LOG( "CCRRtspResponse::FindRTPAuthenticationL() Basic found" );
+
+ delete iAuthType;
+ iAuthType = NULL;
+ iAuthType = HBufC8::NewL( KCRAuthBasic().Length() );
+ iAuthType->Des().Copy( KCRAuthBasic );
+
+ // find "realm"
+ pos = iRtspText->FindC( KCRAuthRealm );
+
+ if ( pos != KErrNotFound )
+ {
+ LOG( "CCRRtspResponse::FindRTPAuthenticationL() realm found" );
+ pos = pos + KCRAuthRealm().Length(); // realm
+ endPos = iRtspText->Mid( pos ).LocateF( '"' );
+
+ if ( endPos != KErrNotFound )
+ {
+ TPtrC8 data = iRtspText->Mid( pos ).Left( endPos );
+ delete iRealm;
+ iRealm = NULL;
+ iRealm = HBufC8::NewL( data.Length() );
+ iRealm->Des().Copy( data );
+ }
+ }
+ }
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRRtpFileSource.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,521 @@
+/*
+* 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: Class that reads RTP packets from propriatary file format.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCRRtpFileSource.h"
+#include <ipvideo/CRtpClipHandler.h>
+#include "CCRPacketBuffer.h"
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+const TInt KGroupsCountPoint( 0 );
+const TInt KBufferThesholdCount( 20 );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRRtpFileSource::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCRRtpFileSource* CCRRtpFileSource::NewL(
+ const SCRRtpPlayParams& aParams,
+ CRtpClipHandler*& aClipHandler,
+ MCRStreamObserver& aSessionObs,
+ CCRStreamingSession& aOwningSession )
+ {
+ CCRRtpFileSource* self = new( ELeave )
+ CCRRtpFileSource( aClipHandler, aSessionObs, aOwningSession );
+ CleanupStack::PushL( self );
+ self->ConstructL( aParams );
+ CleanupStack::Pop();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpFileSource::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCRRtpFileSource* CCRRtpFileSource::NewL(
+ const RFile& aRtpHandle,
+ CRtpClipHandler*& aClipHandler,
+ MCRStreamObserver& aSessionObs,
+ CCRStreamingSession& aOwningSession )
+ {
+ CCRRtpFileSource* self = new( ELeave )
+ CCRRtpFileSource( aClipHandler, aSessionObs, aOwningSession );
+ CleanupStack::PushL( self );
+ self->ConstructL( aRtpHandle );
+ CleanupStack::Pop();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpFileSource::CCRRtpFileSource
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCRRtpFileSource::CCRRtpFileSource(
+ CRtpClipHandler*& aClipHandler,
+ MCRStreamObserver& aSessionObs,
+ CCRStreamingSession& aOwningSession )
+ : CCRPacketSourceBase( aOwningSession, CCRStreamingSession::ECRRtpSourceId ),
+ iClipHandler( aClipHandler ),
+ iSessionObs( aSessionObs ),
+ iInitialTime( KMaxTUint ),
+ iClipPauseSent( 0 )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpFileSource::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCRRtpFileSource::ConstructL( const SCRRtpPlayParams& aParams )
+ {
+ const TBool timeShift(
+ aParams.iFileName.Find( KDvrTimeShiftFile ) > KErrNotFound );
+ LOG1( "CCRRtpFileSource::ConstructL() in, timeShift: %d", timeShift );
+
+ // RTP clip handler
+ User::LeaveIfNull( iClipHandler );
+ iClipHandler->RegisterReadObserver( this );
+ iClipHandler->StartPlayBackL( aParams, timeShift );
+
+ LOG( "CCRRtpFileSource::ConstructL() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpFileSource::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCRRtpFileSource::ConstructL( const RFile& aRtpHandle )
+ {
+ LOG( "CCRRtpFileSource::ConstructL() in" );
+
+ User::LeaveIfNull( iClipHandler );
+ iClipHandler->RegisterReadObserver( this );
+ iClipHandler->StartPlayBackL( aRtpHandle );
+
+ LOG( "CCRRtpFileSource::ConstructL() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpFileSource::~CCRRtpFileSource
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRRtpFileSource::~CCRRtpFileSource()
+ {
+ LOG( "CCRRtpFileSource::~CCRRtpFileSource()" );
+
+ if ( iClipHandler )
+ {
+ iClipHandler->StopPlayBack( KErrNone, 0 );
+ }
+
+ delete iSdp;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpFileSource::GetSdp
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtpFileSource::GetSdp( TPtrC8& aSdp )
+ {
+ if ( iSdp )
+ {
+ aSdp.Set( iSdp->Des() );
+ return KErrNone;
+ }
+
+ return KErrNotReady;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpFileSource::SetBuffer
+// -----------------------------------------------------------------------------
+//
+void CCRRtpFileSource::SetBuffer( CCRPacketBuffer* aBuffer )
+ {
+ iBuffer = aBuffer;
+ iBuffer->ContinousStream( EFalse );
+ iBuffer->MoreComing( EFalse );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpFileSource::PostActionL
+// -----------------------------------------------------------------------------
+//
+void CCRRtpFileSource::PostActionL()
+ {
+ LOG( "CCRRtpFileSource::PostActionL(), SDP will be handled !" );
+
+ // SDP
+ if ( iClipHandler )
+ {
+ iSdp = iClipHandler->GetClipSdpL();
+ }
+
+ // Notify that SDP available
+ iSessionObs.StatusChanged( MCRPacketSource::ERtpStateSdpAvailable );
+ delete iSdp; iSdp = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpFileSource::Restore
+// -----------------------------------------------------------------------------
+//
+void CCRRtpFileSource::Restore()
+ {
+ const TInt err( NextClipGroup( ETrue ) );
+ if ( err && err != KErrEof )
+ {
+ LOG1( "CCRRtpFileSource::Restore(), NextClipGroup() err: %d", err );
+ iSessionObs.StatusChanged( MCRPacketSource::ERtpStateClosing );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpFileSource::Play
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtpFileSource::Play( const TReal& aStartPos, const TReal& aEndPos )
+ {
+ LOG3( "CCRRtpFileSource::Play(), aStartPos: %f, aEndPos: %f, iClipPauseSent: %d",
+ aStartPos, aEndPos, iClipPauseSent );
+ // Play for player?
+ if ( aStartPos == KRealZero && aEndPos == KRealZero )
+ {
+ iInitialTime = KMaxTUint;
+ return NextClipGroup( EFalse );
+ }
+
+ // Loading started in player?
+ if ( aStartPos == KRealMinusOne && aEndPos == KRealMinusOne )
+ {
+ const TBool pauseSent( iClipPauseSent > 0 );
+ if ( pauseSent )
+ {
+ iClipPauseSent--;
+ iBuffer->ResetBuffer();
+ }
+
+ // Read more from clip
+ TInt err( NextClipGroup( EFalse ) );
+ if ( !err && pauseSent )
+ {
+ iInitialTime = KMaxTUint;
+ err = ECRStreamPauseHanling;
+ LOG( "CCRRtpFileSource::Play(), ECRStreamPauseHanling" );
+ }
+ else
+ {
+ if ( err == KErrEof )
+ {
+ err = KErrNone;
+ if ( iClipHandler )
+ {
+ TRAP( err, iClipHandler->SetSeekPointL( 0 ) );
+ }
+ if ( !err )
+ {
+ err = ECRStreamEndHandling;
+ LOG( "CCRRtpFileSource::Play(), ECRStreamEndHandling" );
+ }
+ }
+ }
+
+ return err;
+ }
+
+ return KErrCompletion;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpFileSource::Stop
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtpFileSource::Stop()
+ {
+ LOG( "CCRRtpFileSource::Stop()" );
+
+ return RtpPosition( 0 );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpFileSource::SetPosition
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtpFileSource::SetPosition( const TInt64 aPosition )
+ {
+ TInt err( RtpPosition( TUint( aPosition / KSiKilo ) ) );
+ if ( !err )
+ {
+ err = NextClipGroup( EFalse );
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpFileSource::GetPosition
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtpFileSource::GetPosition( TInt64& aPosition, TInt64& aDuration )
+ {
+ if ( iBuffer && iClipHandler )
+ {
+ if ( iInitialTime != KMaxTUint )
+ {
+ aPosition += TInt64( iInitialTime ) * KSiKilo;
+ }
+ else
+ {
+ LOG( "CCRRtpFileSource::GetPosition(), iInitialTime not valid !" );
+ }
+
+ aDuration = TInt64( iClipHandler->GetCurrentLength() ) * KSiKilo;
+#ifdef CR_ALL_LOGS
+ LOG2( "CCRRtpFileSource::GetPosition(), aPosition: %u, aDuration: %u",
+ ( TUint )( aPosition / KSiKilo ), ( TUint )( aDuration / KSiKilo ) );
+#endif // CR_ALL_LOGS
+ return KErrNone;
+ }
+
+ return KErrCompletion;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpFileSource::GroupReadedL
+// Adds packets to the buffer when finished asyncronous group reading.
+// -----------------------------------------------------------------------------
+//
+void CCRRtpFileSource::GroupReadedL(
+ const TDesC8& aGroup,
+ const TUint aGroupTime,
+ const TBool aLastGroup )
+ {
+ // Group time
+ if ( iInitialTime == KMaxTUint )
+ {
+ iInitialTime = aGroupTime;
+ }
+
+ // Data valid?
+ TInt point( KGroupsCountPoint + KPacketsCountBytes );
+ const TInt total( aGroup.Length() );
+ if ( point > total )
+ {
+ LOG( "CCRRtpFileSource::GroupReadedL(), No Packets Total Count !" );
+ User::Leave( KErrCorrupt );
+ }
+
+ // Packets total count (PTC)
+ const TInt totalCount( CRtpUtil::GetValueL(
+ aGroup.Mid( KGroupsCountPoint, KPacketsCountBytes ) ) );
+ if ( totalCount > 0 )
+ {
+ iBuffer->MoreComing( ETrue );
+ }
+
+ // Loop all packets
+ for ( TInt i( 0 ); i < totalCount; i++ )
+ {
+ // Corrupted?
+ if ( ( point + KPacketSizeBytesLen ) > total )
+ {
+ LOG( "CCRRtpFileSource::GroupReadedL(), No Packets Size !" );
+ User::Leave( KErrCorrupt );
+ }
+
+ // Packet total Size (PTS)
+ TInt packetSize( CRtpUtil::GetValueL(
+ aGroup.Mid( point, KPacketSizeBytesLen ) ) );
+ // Corrupted?
+ if ( packetSize <= 0 || ( point + packetSize ) > total )
+ {
+ LOG( "CCRRtpFileSource::GroupReadedL(), No Packets Payload !" );
+ User::Leave( KErrCorrupt );
+ }
+
+ // Packet type
+ point += KPacketSizeBytesLen;
+ const MRtpFileWriteObserver::TRtpType type(
+ ( MRtpFileWriteObserver::TRtpType )( aGroup[point] ) );
+ point += KPacketTypeBytesLen;
+ packetSize -= ( KPacketSizeBytesLen + KPacketTypeBytesLen );
+
+ // Insert packet to the buffer
+ const TPtrC8 packet( aGroup.Mid( point, packetSize ) );
+
+#ifdef CR_ALL_LOGS
+ const TUint8* pointer( &packet[2] );
+ TInt seq( BigEndian::Get16( pointer ) );
+ LOG3( "CCRRtpFileSource::GroupReadedL(), type: %d, packet: %d, seq: %d",
+ type, packet.Length(), seq );
+ //RFileLogger::WriteFormat( _L( "livetv" ), _L( "play.log" ), EFileLoggingModeAppend,
+ // _L( "GroupReadedL(), type: %d, packet: %d, seq: %d" ), type, packet.Length(), seq );
+#endif // CR_ALL_LOGS
+
+ MCRPacketSource::TCRPacketStreamId stream( MCRPacketSource::EStreamIdCount );
+ if ( TypeToStream( type, stream ) )
+ {
+ // Last packet in group?
+ if ( i >= ( totalCount - 1 ) )
+ {
+ iBuffer->MoreComing( EFalse );
+ if ( aLastGroup && stream != MCRPacketSource::EStreamEndTag )
+ {
+ LOG( "CCRRtpFileSource::GroupReadedL(), Misses last group from clip !" );
+ stream = MCRPacketSource::EStreamEndTag;
+ }
+ }
+
+ // Packet to buffer
+ iBuffer->AddPacket( stream, packet );
+ }
+
+ point+= packetSize;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpFileSource::ReadStatus
+// -----------------------------------------------------------------------------
+//
+void CCRRtpFileSource::ReadStatus( TInt aStatus )
+ {
+ LOG1( "CCRRtpFileSource::ReadStatus(), aStatus: %d", aStatus );
+
+ switch ( aStatus )
+ {
+ case MRtpFileReadObserver::ERtpTimeShifTEnd:
+ break;
+
+ default:
+ iSessionObs.StatusChanged( MCRPacketSource::ERtpStateClosing );
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpFileSource::NextClipGroup
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtpFileSource::NextClipGroup( const TBool aForce )
+ {
+ if ( iBuffer && iClipHandler )
+ {
+ if ( aForce || iBuffer->PacketsMinCount() < KBufferThesholdCount )
+ {
+ TRAPD( err, iClipHandler->NextClipGroupL() );
+ return err;
+ }
+
+ return KErrNone;
+ }
+
+ return KErrNotReady;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpFileSource::RtpPosition
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtpFileSource::RtpPosition( const TUint aPosition )
+ {
+ LOG1( "CCRRtpFileSource::RtpPosition(), aPosition: %d", aPosition );
+
+ TInt err( KErrCompletion );
+ if ( iBuffer && iClipHandler )
+ {
+ TRAP( err, iClipHandler->SetSeekPointL( aPosition ) );
+ if ( !err )
+ {
+ iInitialTime = KMaxTUint;
+ iBuffer->ResetBuffer();
+ }
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpFileSource::TypeToStream
+// -----------------------------------------------------------------------------
+//
+TBool CCRRtpFileSource::TypeToStream(
+ const MRtpFileWriteObserver::TRtpType& aType,
+ MCRPacketSource::TCRPacketStreamId& aStream )
+ {
+ switch ( aType )
+ {
+ case MRtpFileWriteObserver::ERtpAudio:
+ aStream = MCRPacketSource::EAudioStream;
+ break;
+
+ case MRtpFileWriteObserver::ERtcpAudio:
+ aStream = MCRPacketSource::EAudioControlStream;
+ break;
+
+ case MRtpFileWriteObserver::ERtpVideo:
+ aStream = MCRPacketSource::EVideoStream;
+ break;
+
+ case MRtpFileWriteObserver::ERtcpVideo:
+ aStream = MCRPacketSource::EVideoControlStream;
+ break;
+
+ case MRtpFileWriteObserver::ERtpSubTitle:
+ aStream = MCRPacketSource::ESubTitleStream;
+ break;
+
+ case MRtpFileWriteObserver::ERtcpSubTitle:
+ aStream = MCRPacketSource::ESubTitleControlStream;
+ break;
+
+ case MRtpFileWriteObserver::ERtpClipPause:
+ LOG( "CCRRtpFileSource::TypeToStream(), ERtpClipPause" );
+ iClipPauseSent = ETrue;
+ aStream = MCRPacketSource::EDisContinousStream;
+ break;
+
+ case MRtpFileWriteObserver::ERtpClipEnd:
+ LOG( "CCRRtpFileSource::TypeToStream(), ERtpClipEnd" );
+ aStream = MCRPacketSource::EStreamEndTag;
+ break;
+
+ default:
+ LOG1( "CCRRtpFileSource::TypeToStream(), Default case, aType: %d",
+ aType );
+ return EFalse;
+ }
+
+ return ETrue;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRRtpRecordSink.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,623 @@
+/*
+* 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: Class that takes packet from buffer and does not put them*
+*/
+
+
+
+
+// INCLUDES
+#include "CCRRtpRecordSink.h"
+#include "CCRPacketBuffer.h"
+#include "CCRStreamingSession.h"
+#include "MCRConnectionObserver.h"
+#include <ipvideo/CRtpClipHandler.h>
+#include <ipvideo/CRtpClipManager.h>
+#include <ipvideo/CDvrSdpParser.h>
+#include "CRtpTsConverter.h"
+#include "CRtpPacket.h"
+#include <bsp.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+const TInt KDefaultBitRate( 256 + 64 ); // 320 kbps
+const TInt KDefGroupSize( 70 * 1024 ); // 70k
+const TInt KMaxGroupSize( 140 * 1024 ); // 140k
+const TInt KMaxGrouplength( 3000 ); // 3 s
+const TInt KGroupHeaderSize( KGroupHeaderBytes + KPacketsCountBytes );
+const TInt KGroupLenghtAccuracy( 20 ); // 20ms
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+
+CCRRtpRecordSink* CCRRtpRecordSink::NewL(
+ const SCRRecordParams& aRecordParams,
+ CCRStreamingSession::TCRSinkId aSinkId,
+ CCRStreamingSession& aOwningSession,
+ MCRConnectionObserver* aObserver,
+ CRtpClipHandler*& aClipHandler )
+ {
+ CCRRtpRecordSink* self = new( ELeave )
+ CCRRtpRecordSink( aSinkId, aOwningSession, aObserver, aClipHandler );
+ CleanupStack::PushL( self );
+ self->ConstructL( aRecordParams );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::CCRRtpRecordSink
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCRRtpRecordSink::CCRRtpRecordSink(
+ CCRStreamingSession::TCRSinkId aSinkId,
+ CCRStreamingSession& aOwningSession,
+ MCRConnectionObserver* aObserver,
+ CRtpClipHandler*& aClipHandler )
+ : CCRPacketSinkBase( aOwningSession, aSinkId ),
+ iObserver( aObserver ),
+ iClipHandler( aClipHandler ),
+ iGroupPointer( NULL, 0 ),
+ iGroupSize( KGroupHeaderSize ),
+ iPacketsCount( 0 ),
+ iWantedGroup( KMaxTInt ),
+ iOldestTs( KMaxTUint ),
+ iLatestAudio( NULL, 0 ),
+ iSaveMode( MRtpFileWriteObserver::ESaveNormal ),
+ iGroupMode( MRtpFileWriteObserver::ESaveIdle )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::ConstructL
+// 2nd phase.
+// -----------------------------------------------------------------------------
+//
+void CCRRtpRecordSink::ConstructL( const SCRRecordParams& aRecordParams )
+ {
+ LOG( "CCRRtpRecordSink::ConstructL()" );
+
+ // Params
+ iRecParams.iClipPath = aRecordParams.iFileName;
+ iRecParams.iSdpData.Set( aRecordParams.iSdpData );
+ iRecParams.iService.Set( aRecordParams.iServiceName );
+ iRecParams.iProgram.Set( aRecordParams.iProgramName );
+ iRecParams.iPostRule = aRecordParams.iPostRule;
+ iRecParams.iParental = aRecordParams.iParental;
+ iRecParams.iEndTime = aRecordParams.iEndTime;
+
+ if ( aRecordParams.iFormat == ECRRecordTimeShift )
+ {
+ iRecParams.iStartTime = 0;
+ iRecParams.iEndTime = KDvrMaximumTimeShift * 1e6;
+ iSaveMode = MRtpFileWriteObserver::ESaveTimeShift;
+ }
+
+#if defined( LIVE_TV_RDEBUG_TRACE ) || defined( LIVE_TV_FILE_TRACE )
+ LOG1( "CCRRtpRecordSink::ConstructL(), iClipPath: %S", &iRecParams.iClipPath );
+ TName buf( KNullDesC ); iRecParams.iStartTime.FormatL( buf, KTimeDateFormat );
+ LOG1( "CCRRtpRecordSink::ConstructL(), iStartTime: %S", &buf );
+ iRecParams.iEndTime.FormatL( buf, KTimeDateFormat );
+ LOG1( "CCRRtpRecordSink::ConstructL(), iEndTime: %S", &buf );
+#endif // LIVE_TV_RDEBUG_TRACE || LIVE_TV_FILE_TRACE
+
+ // Clip handler and group buffer
+ User::LeaveIfNull( iClipHandler );
+ iGroupBuffer = HBufC8::NewL( 0 );
+ iGroupPointer.Set( iGroupBuffer->Des() );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::~CCRRtpRecordSink
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRRtpRecordSink::~CCRRtpRecordSink()
+ {
+ LOG( "CCRRtpRecordSink::~CCRRtpRecordSink()" );
+
+ if ( iClipHandler )
+ {
+ iClipHandler->StopRecording( KErrCancel );
+ }
+
+ delete iGroupBuffer;
+ delete iAudioConv;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::SetSdpL
+// Sets SDP, parses it and initiates XPS.
+// -----------------------------------------------------------------------------
+//
+void CCRRtpRecordSink::SetSdpL( const TDesC8& aSdp )
+ {
+ TInt initiated( iRecParams.iSdpData.Length() );
+ LOG2( "CCRRtpRecordSink::SetSdpL(), aSdp len: %d, initiated: %d",
+ aSdp.Length(), initiated );
+ if ( !initiated && iClipHandler )
+ {
+ iRecParams.iSdpData.Set( aSdp );
+ iClipHandler->RegisterWriteObserver( this );
+ iClipHandler->StartRecordingL( iRecParams, iSaveMode );
+
+ // SDP parser
+ CDvrSdpParser* sdpParser = CDvrSdpParser::NewLC();
+ sdpParser->TryParseL( aSdp );
+
+ // Bit rates
+ TUint total( sdpParser->VideoBitrate() + sdpParser->AudioBitrate() );
+ TReal angle( TReal( total ) / KDefaultBitRate );
+ iWantedGroup = TInt( angle * KDefGroupSize );
+ LOG1( "SetSdpL::SetSdpL(), iWantedGroup: %d", iWantedGroup );
+ iGroupBuffer = iGroupBuffer->ReAllocL( iWantedGroup + KGroupHeaderSize );
+ iGroupPointer.Set( iGroupBuffer->Des() );
+
+ // TS converter
+ delete iAudioConv; iAudioConv = NULL;
+ iAudioConv = CRtpTsConverter::NewL( sdpParser->AudioTimerGranularity() );
+ LOG1( "CCRRtpRecordSink::SetSdpL(), AudioTimerGranularity: %d",
+ sdpParser->AudioTimerGranularity() );
+ CleanupStack::PopAndDestroy( sdpParser );
+
+ // Recording can start
+ iGroupMode = MRtpFileWriteObserver::ESaveNormal;
+ iObserver->ConnectionStatusChange( iOwningSession.SourceChecksum(),
+ MCRConnectionObserver::ECRRecordingStarted, KErrNone );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::NewPacketAvailable
+// From CCRPacketSinkBase. New packet(s) to a group.
+// -----------------------------------------------------------------------------
+//
+void CCRRtpRecordSink::NewPacketAvailable()
+ {
+ // Keep group buffer untouch during clip writing
+ if ( iBuffer && iClipHandler && !iClipHandler->WritingActive() )
+ {
+ if ( iGroupMode == MRtpFileWriteObserver::ESaveNormal )
+ {
+ // New packets to a group
+ AddToGroup();
+
+ // Group size big enougth to write to clip?
+ if ( iGroupSize >= iWantedGroup )
+ {
+ SaveGroup( iGroupMode );
+ }
+
+ // Keep buffer size reasonable
+ iBuffer->HandleBufferSize();
+ }
+ else
+ {
+ if ( iGroupMode != MRtpFileWriteObserver::ESaveIdle )
+ {
+ AddToGroup();
+
+ // Handle user pause
+ if ( iGroupMode == MRtpFileWriteObserver::ESavePause )
+ {
+ AddPausePacket();
+ }
+
+ SaveGroup( iGroupMode );
+ iGroupMode = MRtpFileWriteObserver::ESaveIdle;
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::BufferResetting
+// From CCRPacketSinkBase.
+// -----------------------------------------------------------------------------
+//
+void CCRRtpRecordSink::BufferResetDone()
+ {
+ AddPausePacket();
+ if ( iClipHandler && !iClipHandler->WritingActive() )
+ {
+ SaveGroup( MRtpFileWriteObserver::ESavePause );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::Pause
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtpRecordSink::Pause()
+ {
+ LOG1( "CCRRtpRecordSink::Pause(), iGroupMode: %d", iGroupMode );
+
+ TInt err( KErrCompletion );
+ if ( iClipHandler )
+ {
+ if ( iSaveMode == MRtpFileWriteObserver::ESaveNormal )
+ {
+ // Normal pause
+ err = KErrNone;
+ iGroupMode = MRtpFileWriteObserver::ESavePause;
+ }
+ else
+ {
+ // Time shift pause
+ TRAP( err, iClipHandler->TimeShiftPauseL() );
+ }
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::Restore
+// -----------------------------------------------------------------------------
+//
+TInt CCRRtpRecordSink::Restore()
+ {
+ LOG1( "CCRRtpRecordSink::Restore(), iGroupMode: %d", iGroupMode );
+
+ iGroupMode = MRtpFileWriteObserver::ESaveNormal;
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::Stop
+// -----------------------------------------------------------------------------
+//
+void CCRRtpRecordSink::Stop()
+ {
+ LOG1( "CCRRtpRecordSink::Stop(), iGroupMode: %d", iGroupMode );
+
+ iGroupMode = MRtpFileWriteObserver::ESaveEnd;
+ if ( iClipHandler && !iClipHandler->WritingActive() )
+ {
+ iWantedGroup = KMaxTInt;
+ SaveGroup( iGroupMode );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::GroupSaved
+// From MRtpFileWriteObserver.
+// -----------------------------------------------------------------------------
+//
+void CCRRtpRecordSink::GroupSaved()
+ {
+ ResetGroupVariables();
+ if ( iGroupMode != MRtpFileWriteObserver::ESaveNormal )
+ {
+ SaveGroup( iGroupMode );
+ iGroupMode = MRtpFileWriteObserver::ESaveIdle;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::WriteStatus
+// From MRtpFileWriteObserver.
+// -----------------------------------------------------------------------------
+//
+void CCRRtpRecordSink::WriteStatus( const TInt aStatus )
+ {
+ LOG1( "CCRRtpRecordSink::WriteStatus(), aStatus: %d", aStatus );
+
+ ForceStopRecording( aStatus );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::AddToGroup
+// Initialises time stamp converter for audio stream and adds packets to a group.
+// -----------------------------------------------------------------------------
+//
+void CCRRtpRecordSink::AddToGroup()
+ {
+ const TInt packets( iBuffer->PacketsCount( iSinkId ) );
+ for ( TInt i( packets ); i > KErrNotFound; i-- )
+ {
+ // Packet
+ TPtr8 packet( NULL, 0 );
+ MCRPacketSource::TCRPacketStreamId streamId(
+ MCRPacketSource::EStreamIdCount );
+ const TInt book( iBuffer->GetStream( iSinkId, streamId ) );
+ iBuffer->GetPacket( book, packet );
+
+ // TS converter
+ if ( streamId == MCRPacketSource::EAudioControlStream &&
+ iAudioConv && !iAudioConv->Initiated() )
+ {
+ iAudioConv->Init( packet );
+ }
+
+ // Type valid
+ MRtpFileWriteObserver::TRtpType type( MRtpFileWriteObserver::ERtpNone );
+ if ( packet.Length() && StreamToType( streamId, type ) )
+ {
+ TRAPD( err, AddPacketToGroupL( packet, type ) );
+ if ( err )
+ {
+ LOG1( "CCRRtpRecordSink::AddToGroup(), AddPacketToGroupL leaved: %d", err );
+ ForceStopRecording( err );
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::AddPacketToGroupL
+// -----------------------------------------------------------------------------
+//
+void CCRRtpRecordSink::AddPacketToGroupL(
+ const TDesC8& aPacket,
+ const MRtpFileWriteObserver::TRtpType& aType )
+ {
+ const TUint total( KPacketSizeBytesLen +
+ KPacketTypeBytesLen + aPacket.Length() );
+ iGroupSize += total;
+ if ( iGroupSize > iGroupPointer.MaxLength() )
+ {
+ iGroupBuffer = iGroupBuffer->ReAllocL( iGroupSize );
+ iGroupPointer.Set( iGroupBuffer->Des() );
+ LOG1( "CCRRtpRecordSink::AddPacketToGroupL(), New iGroupSize: %d", iGroupSize );
+ }
+
+ // Packet length (PTL), type and data
+ TBuf8<KPacketSizeBytesLen + KPacketTypeBytesLen> header;
+ CRtpUtil::MakeBytesL( total, header );
+ header.Append( KCharSpace );
+ header[KPacketTypeBytePoint] = ( TUint8 )( aType );
+ iGroupPointer.Append( header );
+ iGroupPointer.Append( aPacket );
+ iPacketsCount++;
+
+#ifdef CR_ALL_LOGS
+ const TUint8* pointer( &aPacket[2] );
+ TInt seq( BigEndian::Get16( pointer ) );
+ LOG3( "CCRRtpRecordSink::AddPacketToGroupL(), type: %d, packet: %d, seq: %d",
+ aType, aPacket.Length(), seq );
+ //RFileLogger::WriteFormat( _L( "livetv" ), _L( "record.log" ), EFileLoggingModeAppend,
+ // _L( "AddPacketToGroupL(), type: %d, packet: %d, seq: %d" ), aType, aPacket.Length(), seq );
+
+#endif // CR_ALL_LOGS
+
+ // Variables for TS delta
+ if ( aType == MRtpFileWriteObserver::ERtpAudio &&
+ iAudioConv && iAudioConv->Initiated() )
+ {
+ if ( iOldestTs == KMaxTUint )
+ {
+ iOldestTs = TsFromPacketL( aPacket );
+ }
+ else
+ {
+ iLatestAudio.Set( iGroupPointer.Right( aPacket.Length() ) );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::SaveGroup
+// Saves RTP packets group to a clip.
+// -----------------------------------------------------------------------------
+//
+void CCRRtpRecordSink::SaveGroup( MRtpFileWriteObserver::TRtpSaveAction aAction )
+ {
+ TRAPD( err, SaveGroupL( aAction ) );
+ if ( err )
+ {
+ ForceStopRecording( err );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::SaveGroup
+// Saves RTP packets group to a clip.
+// -----------------------------------------------------------------------------
+//
+void CCRRtpRecordSink::SaveGroupL( MRtpFileWriteObserver::TRtpSaveAction aAction )
+ {
+ // TS delta
+ TBool forceSave( aAction != MRtpFileWriteObserver::ESaveNormal );
+ TInt length( TReal( iGroupSize ) / iWantedGroup * KNormalRecGroupLength );
+ if ( iOldestTs != KMaxTUint )
+ {
+ length = TsFromPacketL( iLatestAudio ) - iOldestTs;
+ }
+ if ( length >= ( KNormalRecGroupLength - KGroupLenghtAccuracy ) )
+ {
+ forceSave = ETrue;
+ if ( length <= ( KNormalRecGroupLength + KGroupLenghtAccuracy ) )
+ {
+ iWantedGroup = ( iWantedGroup + iGroupSize ) / 2;
+ }
+ else
+ {
+ TReal angle( TReal( iGroupSize ) / length );
+ TInt wanted( TReal( KNormalRecGroupLength ) * angle );
+ if ( wanted > ( KDefGroupSize / 2 ) && wanted < KMaxGroupSize )
+ {
+ iWantedGroup = ( iWantedGroup + wanted ) / 2;
+ }
+ }
+ }
+
+ // Group ok to save?
+ if ( forceSave || iGroupSize > KMaxGroupSize )
+ {
+ // Group packets count (PTC)
+ HBufC8* bytes = CRtpUtil::MakeBytesLC( iPacketsCount );
+ iGroupPointer.Insert( 0, bytes->Des() );
+ CleanupStack::PopAndDestroy( bytes );
+
+ // Make sure that nasty length not end to the clip in case TS overflow
+ length = ( length <= KMaxGrouplength )? length: KMaxGrouplength;
+
+ // Save to clip
+ TInt err( KErrNotReady );
+ if ( iClipHandler )
+ {
+ TRAP( err, iClipHandler->SaveNextGroupL( iGroupPointer,
+ length, aAction ) );
+ }
+ if ( err )
+ {
+ LOG1( "CCRRtpRecordSink::SaveGroup(), SaveNextGroupL Leaved: %d", err );
+ ForceStopRecording( err );
+ }
+
+ LOG3( "CCRRtpRecordSink::SaveGroup(), iPacketsCount: %d, length: %u, iWantedGroup: %d",
+ iPacketsCount, length, iWantedGroup );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::StreamToType
+// -----------------------------------------------------------------------------
+//
+TBool CCRRtpRecordSink::StreamToType(
+ const MCRPacketSource::TCRPacketStreamId& aStream,
+ MRtpFileWriteObserver::TRtpType& aType )
+ {
+ switch ( aStream )
+ {
+ case MCRPacketSource::EAudioStream:
+ aType = MRtpFileWriteObserver::ERtpAudio;
+ break;
+
+ case MCRPacketSource::EAudioControlStream:
+ aType = MRtpFileWriteObserver::ERtcpAudio;
+ break;
+
+ case MCRPacketSource::EVideoStream:
+ aType = MRtpFileWriteObserver::ERtpVideo;
+ break;
+
+ case MCRPacketSource::EVideoControlStream:
+ aType = MRtpFileWriteObserver::ERtcpVideo;
+ break;
+
+ case MCRPacketSource::ESubTitleStream:
+ aType = MRtpFileWriteObserver::ERtpSubTitle;
+ break;
+
+ case MCRPacketSource::ESubTitleControlStream:
+ aType = MRtpFileWriteObserver::ERtcpSubTitle;
+ break;
+
+ case MCRPacketSource::EDisContinousStream:
+ LOG( "CCRRtpRecordSink::StreamToType(), ERtpClipPause" );
+ aType = MRtpFileWriteObserver::ERtpClipPause;
+ break;
+
+ case MCRPacketSource::EStreamEndTag:
+ LOG( "CCRRtpRecordSink::StreamToType(), ERtpClipEnd" );
+ aType = MRtpFileWriteObserver::ERtpClipEnd;
+ break;
+
+ default:
+ return EFalse;
+ }
+
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::TsFromPacketL
+// -----------------------------------------------------------------------------
+//
+TUint CCRRtpRecordSink::TsFromPacketL( const TDesC8& aPacket )
+ {
+ CRtpPacket* rtpPacket = CRtpPacket::NewLC();
+ TUint ts( KMaxTUint );
+ if ( !rtpPacket->ParseRtp( aPacket ) )
+ {
+ ts = iAudioConv->ConvertTs( rtpPacket->iRtpRecvHeader.iTimestamp, ETrue );
+ }
+
+ CleanupStack::PopAndDestroy( rtpPacket );
+ return ts;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::AddPausePacket
+// Wrapper for AddPausePacketL().
+// -----------------------------------------------------------------------------
+//
+void CCRRtpRecordSink::AddPausePacket()
+ {
+ LOG( "CCRRtpRecordSink::AddPausePacket()");
+
+ TRAPD( err, AddPausePacketL() );
+ if ( err )
+ {
+ ForceStopRecording( err );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::AddPausePacketL
+// Adds pause packet to the group.
+// -----------------------------------------------------------------------------
+//
+void CCRRtpRecordSink::AddPausePacketL()
+ {
+ HBufC8* data = CRtpUtil::MakeBytesLC( KMaxTUint );
+ AddPacketToGroupL( data->Des(), MRtpFileWriteObserver::ERtpClipPause );
+ CleanupStack::PopAndDestroy( data );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::ForceStopRecording
+// Stops recording on clip handler and destroys the sink.
+// -----------------------------------------------------------------------------
+//
+void CCRRtpRecordSink::ForceStopRecording( const TInt& aStatus )
+ {
+ LOG2( "CCRRtpRecordSink::ForceStopRecording(), iGroupMode: %d, aStatus: %d",
+ iGroupMode, aStatus );
+ iGroupMode = MRtpFileWriteObserver::ESaveIdle;
+
+ if ( iClipHandler )
+ {
+ iClipHandler->StopRecording( aStatus );
+ }
+
+ iObserver->ConnectionStatusChange( iOwningSession.SourceChecksum(),
+ MCRConnectionObserver::ECRRecordingEnded, aStatus );
+ iOwningSession.SinkStops( Id() );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpRecordSink::ResetGroupVariables
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtpRecordSink::ResetGroupVariables()
+ {
+ iGroupSize = KGroupHeaderSize; // Room for group header and packets count
+ iPacketsCount = 0;
+ iGroupPointer.Zero();
+ iOldestTs = KMaxTUint;
+ iLatestAudio.Set( NULL, 0 );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRRtpTcpStream.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,107 @@
+/*
+* 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: Single media stream for RTP/TCP streamer*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCRRtpTcpStream.h"
+#include "CCRRtpTcpObserver.h"
+#include <es_sock.h>
+#include <e32math.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+const TInt KReceiverReportLength( 12 );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRRtpTcpStream::CCRRtpTcpStream
+// -----------------------------------------------------------------------------
+//
+CCRRtpTcpStream::CCRRtpTcpStream( MCRRtpTcpObserver& aObserver )
+ : iObserver(aObserver)
+ {
+ iSSRC = Math::Random();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpTcpStream::NewL
+// -----------------------------------------------------------------------------
+//
+CCRRtpTcpStream* CCRRtpTcpStream::NewL( MCRRtpTcpObserver& aObserver )
+ {
+ CCRRtpTcpStream* self = new( ELeave ) CCRRtpTcpStream( aObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpTcpStream::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CCRRtpTcpStream::ConstructL()
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpTcpStream::~CCRRtpTcpStream
+// -----------------------------------------------------------------------------
+//
+CCRRtpTcpStream::~CCRRtpTcpStream()
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpTcpStream::ForwardPacketAvailable
+// -----------------------------------------------------------------------------
+//
+void CCRRtpTcpStream::PacketAvailable( TInt aChannel )
+ {
+ // Nothing to to do for RTP, just ignore
+ if ( !( aChannel % 2 ) )
+ {
+ return;
+ }
+
+ // Very simple Receiver Report generation:
+ // - RC=0, no SSRC report blocks -> no statistics keeping
+ // - one RR for every SR received -> no timing, back-off, etc
+ TBuf8<KReceiverReportLength> chunk( KNullDesC8 );
+ chunk.SetLength( KReceiverReportLength );
+
+ // RTSP header
+ chunk[0] = ( TUint8 )( 0x24 ); // magic '$' for embedded binary in RTSP
+ chunk[1] = ( TUint8 )( aChannel ); // enbedded RTSP channel
+ // Embedded packet length, fixed
+ BigEndian::Put16( ( TUint8* )chunk.Ptr() + 2, 8 );
+
+ // RR
+ chunk[4] = 0x80; // v=2, p=0, rc=0
+ chunk[5] = 201; // PT= RR= 201
+ // Length=1 ( in 32bits, -1 )
+ BigEndian::Put16( ( TUint8* )chunk.Ptr() + 6, 1 );
+ BigEndian::Put32( ( TUint8* )chunk.Ptr() + 8, iSSRC );
+
+ iObserver.ForwardRtpTcpChunck( chunk );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRRtpTcpStreamer.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,418 @@
+/*
+* 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: RTP/TCP streamer for RTSP source.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCRRtpTcpStreamer.h"
+#include "CCRRtpTcpObserver.h"
+#include "CCRRtpTcpStream.h"
+#include "CRRTSPCommon.h"
+#include <es_sock.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+const TInt KCRRtpTcpHeaderLength( 4 );
+const TInt KCRRtpTcpStartMark( 0x24 );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRRtpTcpStreamer::NewL
+// -----------------------------------------------------------------------------
+CCRRtpTcpStreamer* CCRRtpTcpStreamer::NewL( MCRRtpTcpObserver& aObserver )
+ {
+ CCRRtpTcpStreamer* self = new( ELeave ) CCRRtpTcpStreamer( aObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpTcpStreamer::CCRRtpTcpStreamer
+// -----------------------------------------------------------------------------
+//
+CCRRtpTcpStreamer::CCRRtpTcpStreamer( MCRRtpTcpObserver& aObserver )
+ : iObserver( aObserver ),
+ iMoreExpected( KErrNotFound ),
+ iIpData( NULL )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpTcpStreamer::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CCRRtpTcpStreamer::ConstructL()
+ {
+ // Construct streams
+ for ( TInt i( 0 ); i < KCRRtpTcpStreamCount; i++ )
+ {
+ iStreams[i] = CCRRtpTcpStream::NewL( iObserver );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpTcpStreamer::~CCRRtpTcpStreamer
+// -----------------------------------------------------------------------------
+CCRRtpTcpStreamer::~CCRRtpTcpStreamer()
+ {
+ // Buffers
+ if ( iIpData )
+ {
+ delete iIpData; iIpData = NULL;
+ }
+ if ( iRtspData )
+ {
+ delete iRtspData; iRtspData = NULL;
+ }
+
+ // Delete streams
+ for ( TInt i( 0 ); i < KCRRtpTcpStreamCount; i++ )
+ {
+ if ( iStreams[i] )
+ {
+ delete iStreams[i]; iStreams[i] = NULL;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpTcpStreamer::DataAvailable
+// -----------------------------------------------------------------------------
+//
+void CCRRtpTcpStreamer::DataAvailable(
+ const TDesC8& aIpData,
+ const TBool& aInterleaved )
+ {
+ TPtrC8 data( aIpData );
+ if ( iMoreExpected > KErrNotFound && iIpData != NULL )
+ {
+ // More data expected
+ if ( HandleMoreExpected( data ) )
+ {
+ return; // Need more
+ }
+ }
+
+ // Can't be existing IP data at this point
+ delete iIpData; iIpData = NULL;
+ iMoreExpected = KErrNotFound;
+
+ // Find out next packet
+ do
+ {
+ // Search for $ (0x24) sign
+ TBool tcp( EFalse );
+ for ( TInt i( 0 ); aInterleaved && tcp == EFalse &&
+ i < data.Length() && i < KCRRtpTcpHeaderLength; i++ )
+ {
+ if ( data[i] == KCRRtpTcpStartMark )
+ {
+ tcp = ETrue;
+ data.Set( data.Mid( i ) );
+
+ // Received less than full interleved header (4 bytes)
+ if ( data.Length() < KCRRtpTcpHeaderLength )
+ {
+ iMoreExpected = KCRRtpTcpHeaderLength - data.Length();
+ iIpData = data.Alloc();
+ LOG1( "CCRRtpTcpStreamer::DataAvailable(), No interleave header, len: %d", data.Length() );
+ return; // Need more
+ }
+ }
+ }
+
+ if ( tcp )
+ {
+ // TCP packet
+ if ( HandleTcpPacket( data ) )
+ {
+ return; // Need more
+ }
+ }
+ else
+ {
+ // RTSP response
+ if ( HandleRtspResponse( data, aInterleaved ) )
+ {
+ return; // Need more
+ }
+
+ delete iRtspData; iRtspData = NULL;
+ }
+ }
+ while ( data.Length() > 0 );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpTcpStreamer::HandleMoreExpected
+// -----------------------------------------------------------------------------
+//
+TBool CCRRtpTcpStreamer::HandleMoreExpected( TPtrC8& aData )
+ {
+ TInt len( aData.Length() );
+ int used( len );
+ if ( len >= iMoreExpected || iMoreExpected == KMaxTInt )
+ {
+ if ( iMoreExpected >= KCRRtpTcpHeaderLength ||
+ iIpData->Des()[0] != KCRRtpTcpStartMark ||
+ iIpData->Length() >= KCRRtpTcpHeaderLength )
+ {
+ // KMaxTInt is indication of unknow length in RTSP response
+ if ( iMoreExpected < KMaxTInt )
+ {
+ used = iMoreExpected;
+ iMoreExpected = KErrNotFound;
+ }
+ else
+ {
+ // Combine datas and try find out RTSP response
+ delete iRtspData; iRtspData = NULL;
+ iRtspData = HBufC8::New( iIpData->Length() + len );
+ TPtr8 ptr( iRtspData->Des() );
+ ptr.Copy( iIpData->Des() );
+ ptr.Append( aData );
+ aData.Set( iRtspData->Des() );
+ return EFalse; // Continue
+ }
+ }
+ else
+ {
+ // Fill interleave header
+ iIpData = iIpData->ReAlloc( iIpData->Length() + iMoreExpected );
+ TPtr8 ptr( iIpData->Des() );
+ ptr.Append( aData.Mid( 0, iMoreExpected ) );
+ aData.Set( aData.Mid( iMoreExpected ) );
+ len = aData.Length();
+ used = len;
+ // Find real wanted packet length
+ iMoreExpected = ( TInt )BigEndian::Get16( ptr.Ptr() + 2 );
+ if ( len == 0 )
+ {
+ return ETrue; // Need more
+ }
+ if ( len >= iMoreExpected )
+ {
+ used = iMoreExpected;
+ iMoreExpected = KErrNotFound;
+ }
+ }
+ }
+
+ // Add new data to iIpData
+ iIpData = iIpData->ReAlloc( iIpData->Length() + used );
+ TPtr8 ptr( iIpData->Des() );
+ ptr.Append( aData.Mid( 0, used ) );
+ aData.Set( aData.Mid( used ) );
+ if ( iMoreExpected == KErrNotFound )
+ {
+ ForwardPacket( ptr );
+ if ( used == len )
+ {
+ delete iIpData; iIpData = NULL;
+ return ETrue; // All handled
+ }
+ }
+ else
+ {
+ iMoreExpected -= used;
+ return ETrue; // Need more
+ }
+
+ return EFalse; // Continue
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpTcpStreamer::HandleTcpPacket
+// -----------------------------------------------------------------------------
+//
+TBool CCRRtpTcpStreamer::HandleTcpPacket( TPtrC8& aData )
+ {
+ const TInt length( KCRRtpTcpHeaderLength +
+ ( TInt )BigEndian::Get16( aData.Ptr() + 2 ) );
+ if ( aData.Length() >= length )
+ {
+ MakePacket( aData, length );
+ }
+ else
+ {
+ // Need more data
+ iMoreExpected = length - aData.Length();
+ iIpData = aData.Alloc();
+ return ETrue; // Need more
+ }
+
+ return EFalse; // Continue
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpTcpStreamer::HandleRtspResponse
+// -----------------------------------------------------------------------------
+//
+TBool CCRRtpTcpStreamer::HandleRtspResponse(
+ TPtrC8& aData,
+ const TBool& aInterleaved )
+ {
+ TInt point( aData.FindC( KCRRTSPReplyHeader ) );
+ if ( point > KErrNotFound )
+ {
+ aData.Set( aData.Mid( point ) );
+
+ // Search for double CRLF combination
+ TInt crlf2( aData.FindC( KCR2NewLines ) );
+ if ( crlf2 > KErrNotFound )
+ {
+ crlf2 += KCR2NewLines().Length();
+ }
+
+ // Content length
+ point = aData.FindC( KCRRTSPContentLength() );
+ if ( point > KErrNotFound && crlf2 > KErrNotFound )
+ {
+ point += KCRRTSPContentLength().Length();
+ TInt contentLen( KErrNotFound );
+ TLex8 contentLenLex( aData.Mid( point, 5 ) );
+ if ( contentLenLex.Val( contentLen ) < KErrNone )
+ {
+ LOG1( "CCRRtpTcpStreamer::HandleRtspResponse(), Content length parse failed, Dumped %d bytes !", aData.Length() );
+ return ETrue;
+ }
+
+ LOG1( "CCRRtspCommon::HandleRtspResponse(), contentLen %d", contentLen );
+ // Verify that enought data in IP packet
+ if ( aData.Length() >= ( crlf2 + contentLen ) )
+ {
+ MakePacket( aData, crlf2 + contentLen );
+ }
+ else
+ {
+ // Need more
+ iIpData = aData.Alloc();
+ iMoreExpected = crlf2 + contentLen - aData.Length();
+ return ETrue;
+ }
+ }
+ else
+ {
+ // Content length not defined, RTSP command should end to double CRLF
+ if ( crlf2 > KErrNotFound )
+ {
+ MakePacket( aData, crlf2 );
+ }
+ else
+ {
+ LOG( "CCRRtpTcpStreamer::HandleRtspResponse(), No double CRLF.." );
+
+ // Look for single CRLF
+ point = aData.FindC( KCRNewLine );
+ if ( point > KErrNotFound )
+ {
+ // If not interleaved, all data belongs to RTSP response
+ if ( !aInterleaved )
+ {
+ if ( aData.Mid( aData.Length() - KCR2NewLines().Length() ).
+ FindF( KCRNewLine ) > KErrNotFound )
+ {
+ ForwardPacket( aData );
+ return ETrue;
+ }
+
+ // Not complete but total length unknown
+ LOG( "CCRRtpTcpStreamer::HandleRtspResponse(), Need more without known length.." );
+ iIpData = aData.Alloc();
+ iMoreExpected = KMaxTInt;
+ return ETrue;
+ }
+
+ // Only one CRLF after RTSP response, find last
+ point += KCRNewLine().Length();
+ for ( TInt i( point ); i < aData.Length(); )
+ {
+ TInt next( aData.Mid( point ).FindC( KCRNewLine ) );
+ if ( next > KErrNotFound )
+ {
+ point += ( next + KCRNewLine().Length() );
+ i = point;
+ }
+ else
+ {
+ i = aData.Length();
+ }
+ }
+
+ LOG1( "CCRRtpTcpStreamer::HandleRtspResponse(), Last CRLF at index: %d", point );
+ MakePacket( aData, point );
+ }
+ else
+ {
+ // Not any CRLF, can not be RTSP response
+ LOG1( "CCRRtpTcpStreamer::HandleRtspResponse(), No CRLF, Dumped %d bytes !", aData.Length() );
+ return ETrue;
+ }
+ }
+ }
+ }
+ else
+ {
+ LOG1( "CCRRtpTcpStreamer::HandleRtspResponse(), Not RTSP message, Dumped %d bytes !", aData.Length() );
+ return ETrue;
+ }
+
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpTcpStreamer::MakePacket
+// -----------------------------------------------------------------------------
+//
+void CCRRtpTcpStreamer::MakePacket( TPtrC8& aData, const TInt aLength )
+ {
+ ForwardPacket( aData.Mid( 0, aLength ) );
+ aData.Set( aData.Mid( aLength ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtpTcpStreamer::ForwardPacket
+// -----------------------------------------------------------------------------
+//
+void CCRRtpTcpStreamer::ForwardPacket( const TDesC8& aPacket )
+ {
+ if ( aPacket[0] == KCRRtpTcpStartMark )
+ {
+ // 1. Forward (actually return or signal reception of) packet to user
+ const TInt channel( ( TInt )aPacket[1] );
+ iObserver.RtpTcpPacketAvailable(
+ channel, aPacket.Mid( KCRRtpTcpHeaderLength ) );
+
+ // 2. Map channel to internal stream, ignore non audio or video
+ const TInt streamId( channel / 2 );
+ if ( streamId >= 0 && streamId < KCRRtpTcpStreamCount )
+ {
+ iStreams[streamId]->PacketAvailable( channel );
+ }
+ }
+ else
+ {
+ // RTSP
+ iObserver.RtspMsgAvailable( aPacket );
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRRtspSink.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,922 @@
+/*
+* 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: Class that instructs rtsp client about getting rtp*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCRRtspSink.h"
+#include "CCRPacketBuffer.h"
+#include "CRRTSPCommon.h"
+#include "CCRConnection.h"
+#include "CCRStreamingSession.h"
+#include <ipvideo/CDvrSdpParser.h>
+#include <e32msgqueue.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+const TInt KCCRRtspSinkDefaultServerPort( 20042 );
+
+_LIT( KCCRRtspSink, "Rtsp sink" );
+_LIT ( KCRLocalIPAddr, "127.0.0.1" );
+_LIT8( KBaseUrl, "rtsp://127.0.0.1/" );
+_LIT8( KVis0, "v=0\r\n" );
+_LIT8( KSdpOLine, "o=- 1 2 IN IP4 127.0.0.1\r\n" );
+_LIT8( KSdpSLine, "s=cre\r\n");
+_LIT8( KSdpCLine, "c=IN IP4 0.0.0.0\r\n");
+_LIT8( KSdpTLine, "t=0 0\r\n");
+_LIT8( KSdpBLine, "b=AS:");
+_LIT8( KSdpAudioMLine, "m=audio 0 RTP/AVP %d\r\n" );
+_LIT8( KSdpAudioAControlLine,
+ "a=control:rtsp://127.0.0.1/default.3gp/AudioControlAddress\r\n" );
+_LIT8( KSdpvideoMLine, "m=video 0 RTP/AVP %d\r\n" );
+_LIT8( KSdpvideoAControlLine,
+ "a=control:rtsp://127.0.0.1/default.3gp/VideoControlAddress\r\n" );
+_LIT8( KDescribeReply,
+ "RTSP/1.0 200 OK\r\nCseq: %d\r\nContent-length: %d\r\n"
+ "Content-Type: application/sdp\r\n\r\n%S" );
+_LIT8( KSetupReply,
+ "RTSP/1.0 200 OKr\nCseq: %dr\nSession: 42\r\n"
+ "Transport: RTP/AVP;unicast;mode=play;client_port=%d-%d;"
+ "server_port=%d-%d\r\n\r\n" );
+_LIT8( KControlAddr,"VideoControlAddress" );
+_LIT8( KPlayReply,
+ "RTSP/1.0 200 OK\r\n" "Cseq: %d\r\n"
+ "RTP-Info: url=rtsp://127.0.0.1/default.3gp/VideoControlAddress"
+ ";seq=%u;rtptime=%u,url=rtsp://127.0.0.1/default.3gp/AudioControlAddress;"
+ "seq=%u;rtptime=%u\r\n"
+ "Session: 42\r\n" );
+_LIT8( KPlayReplyAudioOnly,
+ "RTSP/1.0 200 OK\r\n" "Cseq: %d\r\n"
+ "RTP-Info: url=rtsp://127.0.0.1/default.3gp/AudioControlAddress;"
+ "seq=%u;rtptime=%u\r\n"
+ "Session: 42\r\n" );
+_LIT8( KPlayReplyVideoOnly,
+ "RTSP/1.0 200 OK\r\n" "Cseq: %d\r\n"
+ "RTP-Info: url=rtsp://127.0.0.1/default.3gp/VideoControlAddress"
+ ";seq=%u;rtptime=%u\r\n"
+ "Session: 42\r\n" );
+
+_LIT8( KPauseReply, "RTSP/1.0 %d OK\r\nCseq: %d\r\nSession: 42\r\n\r\n" );
+_LIT8( KTearDownReply, "RTSP/1.0 200 OK\r\nCseq: %d\r\nSession: 42\r\n\r\n" );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCRRtspSink* CCRRtspSink::NewL(
+ CCRConnection& aConnection,
+ RSocketServ& aSockServer,
+ CCRStreamingSession::TCRSinkId aSinkId,
+ const TInt& aLoopbackPort,
+ CCRStreamingSession& aOwningSession )
+ {
+ CCRRtspSink* self = new( ELeave )
+ CCRRtspSink( aConnection, aSockServer, aSinkId, aOwningSession );
+ CleanupStack::PushL( self );
+ self->ConstructL( aLoopbackPort );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::CCRRtspSink
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCRRtspSink::CCRRtspSink(
+ CCRConnection& aConnection,
+ RSocketServ& aSockServer,
+ CCRStreamingSession::TCRSinkId aSinkId,
+ CCRStreamingSession& aOwningSession )
+ : CCRPacketSinkBase( aOwningSession, aSinkId ),
+ iConnection( aConnection ),
+ iSockServer( aSockServer ),
+ iStage( ERTSPInit ),
+ iSetupReceived( 0 ),
+ iAudioSeq( KMaxTUint32 ),
+ iAudioTS( KMaxTUint32 ),
+ iVideoSeq( KMaxTUint32 ),
+ iVideoTS( KMaxTUint32 ),
+ iLowerRange( KRealZero ),
+ iUpperRange( KRealMinusOne )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::ConstructL
+// 2nd phase.
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::ConstructL( const TInt& aLoopbackPort )
+ {
+ iReceivedData = HBufC8::NewL( 0 );
+ iRopResponse = HBufC8::NewL( 0 );
+ iSockArr[EROPControl] = CCRSock::NewL(
+ *this, EROPControl, iConnection.Connection(), iSockServer, ETrue, ETrue );
+ TInt err( iSockArr[EROPControl]->ListenPort( aLoopbackPort ) );
+ LOG2( "CCRRtspSink::ConstructL(), aLoopbackPort: %d, err: %d", aLoopbackPort, err );
+ User::LeaveIfError( err );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::~CCRRtspSink
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRRtspSink::~CCRRtspSink()
+ {
+ LOG( "CCRRtspSink::~CCRRtspSink()" );
+
+ for ( TInt i( 0 ); i < EROPMaxSockets; i++ )
+ {
+ delete iSockArr[i]; iSockArr[i] = NULL;
+ }
+ for ( TInt i( 0 ); i < CCRRtspCommand::ERTSPCommandNOCOMMAND; i++ )
+ {
+ delete iCommands[i]; iCommands[i] = NULL;
+ }
+
+ delete iSdpForRop;
+ delete iSdpParser;
+ delete iRopResponse;
+ delete iReceivedData;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::ProduceSDPForRopL
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::ProduceSDPForRopL()
+ {
+ if ( !iSdpParser )
+ {
+ User::Leave( KErrNotReady );
+ }
+
+ delete iSdpForRop; iSdpForRop = NULL;
+ iSdpForRop = HBufC8::NewL( KMaxName );
+
+ iSdpForRop->Des().Zero();
+ AppendL( iSdpForRop, KVis0 );
+ AppendL( iSdpForRop, KSdpOLine );
+ AppendL( iSdpForRop, KSdpSLine );
+ AppendL( iSdpForRop, KSdpCLine );
+ AppendL( iSdpForRop, KSdpTLine );
+ if ( ( iSdpParser->AudioBitrate() + iSdpParser->VideoBitrate() ) > 0 )
+ {
+ AppendL( iSdpForRop, KSdpBLine );
+ AppendNumL( iSdpForRop, iSdpParser->AudioBitrate() +
+ iSdpParser->VideoBitrate() );
+ AppendL( iSdpForRop, KCRNewLine );
+ }
+
+ RArray<TPtrC8> &sessionAttributes = iSdpParser->SessionAttributes();
+ for ( TInt i( 0 ); i < sessionAttributes.Count(); i++ )
+ {
+ AppendL( iSdpForRop, sessionAttributes[i] );
+ AppendL( iSdpForRop, KCRNewLine );
+ }
+
+ // Check whether audio exist.
+ if ( iSdpParser->AudioControlAddr().Length() )
+ {
+ AppendFormatL( iSdpForRop, KSdpAudioMLine, iSdpParser->MediaIdentifierAudio() );
+ if ( iSdpParser->AudioBitrate() > 0 )
+ {
+ AppendL( iSdpForRop, KSdpBLine );
+ AppendNumL( iSdpForRop, iSdpParser->AudioBitrate() );
+ AppendL( iSdpForRop, KCRNewLine );
+ }
+
+ AppendL( iSdpForRop, KSdpAudioAControlLine );
+
+ RArray<TPtrC8> &audioAttributes = iSdpParser->AudioAttributes();
+ for ( TInt i( 0 ); i < audioAttributes.Count(); i++ )
+ {
+ AppendL( iSdpForRop, audioAttributes[i] );
+ AppendL( iSdpForRop, KCRNewLine );
+ }
+ }
+
+ // Check whether Video exist.
+ if ( iSdpParser->VideoControlAddr().Length() )
+ {
+ AppendFormatL( iSdpForRop, KSdpvideoMLine, iSdpParser->MediaIdentifierVideo() );
+ if ( iSdpParser->VideoBitrate() > 0 )
+ {
+ AppendL( iSdpForRop, KSdpBLine );
+ AppendNumL( iSdpForRop, iSdpParser->VideoBitrate() );
+ AppendL( iSdpForRop, KCRNewLine );
+ }
+
+ AppendL( iSdpForRop, KSdpvideoAControlLine );
+
+ RArray<TPtrC8> &videoAttributes = iSdpParser->VideoAttributes();
+ for ( TInt i( 0 ); i < videoAttributes.Count(); i++ )
+ {
+ AppendL( iSdpForRop, videoAttributes[i] );
+ AppendL( iSdpForRop, KCRNewLine );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::SetSdpL
+// as a side-effect causes parsing of the sdp
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::SetSdpL( const TDesC8& aSdp )
+ {
+ LOG1( "CCRRtspSink::SetSdpL(), aSdp len: %d", aSdp.Length() );
+
+ // Create SDP parser
+ delete iSdpParser; iSdpParser = NULL;
+ iSdpParser = CDvrSdpParser::NewL();
+ iSdpParser->TryParseL( aSdp, KBaseUrl );
+ ProduceSDPForRopL();
+
+ if ( iStage == ERTSPDescSent )
+ {
+ ReplyToDescribeL();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::NewPacketAvailable
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::NewPacketAvailable()
+ {
+ if ( iBuffer )
+ {
+ // Stream of next packet
+ MCRPacketSource::TCRPacketStreamId stream(
+ MCRPacketSource::EStreamIdCount );
+ const TInt bookKeeping( iBuffer->GetStream( iSinkId, stream ) );
+
+ // Packets in buffer.
+ if ( stream != MCRPacketSource::EStreamIdCount )
+ {
+ TCRROPSockId socket( SocketFromStream( stream ) );
+
+ // Is previous packet send ready.
+
+ if ( iSockArr[socket] && !iSockArr[socket]->IsActive() )
+ {
+ // Get packet
+ TPtr8 packet( NULL, 0 );
+ iBuffer->GetPacket( bookKeeping, packet );
+
+ // Now we have the packet, send it to rop:
+ iSockArr[socket]->SendData( packet );
+
+ if ( iStage == ERTSPPlaySent )
+ {
+ iStage = ERTSPPlaying;
+ }
+
+ }
+ else
+ {
+ iPacketPendingInBuffer = ETrue;
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::SetSeqAndTS
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::SetSeqAndTS(
+ TUint& aAudioSeq,
+ TUint& aAudioTS,
+ TUint& aVideoSeq,
+ TUint& aVideoTS )
+ {
+ LOG1( "CRE ropsink SetSeqAndTS aseq=%u ", aAudioSeq );
+
+ iAudioSeq = aAudioSeq;
+ iAudioTS = aAudioTS;
+ iVideoSeq = aVideoSeq;
+ iVideoTS = aVideoTS;
+ iSeqAndTSSet = ETrue;
+
+ if ( iStage == ERTSPReadyToPlay )
+ {
+ TRAPD( err,ReplyToPlayL() );
+ if ( err != KErrNone )
+ {
+ LOG1( "CRE ropsink ReplyToPlayL L=%d", err );
+ iOwningSession.SinkStops( Id() );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::SetRange
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::SetRange( TReal aLower, TReal aUpper )
+ {
+ LOG2( "CRE CCRRtspSink SetRange (%f - %f)", aLower, aUpper );
+ iLowerRange = aLower;
+ iUpperRange = aUpper;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::StatusChanged
+// This is used currently for getting to know if we're in playing state or not
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::StatusChanged( MCRPacketSource::TCRPacketSourceState aNewState )
+ {
+ LOG2( "CCRRtspSink::StatusChanged(), iStage: %d, aNewState: %d", iStage, aNewState );
+
+ if ( aNewState == MCRPacketSource::ERtpStateSetupRepply )
+ {
+ if ( iStage == ERTSPDelayedSetup && iRopResponse->Length() > 0 )
+ {
+ SendControlData();
+ }
+
+ iSetupReceived++; // SETUP repply received
+ }
+ else if ( aNewState == MCRPacketSource::ERtpStatePlaying )
+ {
+ if ( iStage == ERTSPPlaySent || iStage == ERTSPReadyToPlay )
+ {
+ iStage = ERTSPPlaying;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::DataReceived
+//
+// This is called when data is received from socket.
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::DataReceived( TInt aSockId, const TDesC8 &aData )
+ {
+#if defined ( LIVE_TV_FILE_TRACE ) || defined ( LIVE_TV_RDEBUG_TRACE )
+ // Debug output follows
+ if ( aSockId == EROPControl )
+ {
+ LOG2( "CCRRtspSink::DataReceived(), aSockId: %d, len: %d",
+ aSockId, aData.Length() );
+ TName d( KNullDesC );
+ for ( TInt i( 0 ); i < aData.Length(); i++ )
+ {
+ TChar c( aData[i] );
+ d.Append( c );
+ if ( ( i > 0 ) && ( i % 80 ) == 0 )
+ {
+ LOG1( ">%S<", &d );
+ d.Zero();
+ }
+ }
+
+ LOG1( ">%S<", &d );
+ }
+#endif // LIVE_TV_FILE_TRACE || LIVE_TV_RDEBUG_TRACE
+
+ switch ( aSockId )
+ {
+ case EROPControl: // RTSP is spoken in this sock
+ {
+ TRAPD( err, HandleReceivedEROPControlL( aData ) );
+ if ( KErrNone != err )
+ {
+ LOG1( "ROPSink ProcessRtspCommandL leave %d", err );
+ iOwningSession.SinkStops( Id() );
+ }
+ }
+ break;
+
+ case EROPVideoSend1:
+ case EROPVideoSend2:
+ case EROPAudioSend1:
+ case EROPAudioSend2:
+ {
+ // Those packets that rop sends to us we do not need actions
+ }
+ break;
+
+ default:
+ {
+ LOG1( "default: Unknown aSockId: %d", aSockId );
+ }
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::HandleReceivedEROPControlL
+//
+// This is called after received data from EROPControl socket.
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::HandleReceivedEROPControlL( const TDesC8& aData )
+ {
+ AppendL( iReceivedData, aData );
+ ProcessRtspCommandL();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::SockStatusChange
+//
+// When socket status changes to something
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::SockStatusChange(
+ TInt aSockId,
+ CCRSock::TCRSockStatus aStatus,
+ TInt aError )
+ {
+ if ( aStatus == CCRSock::EFailed )
+ {
+ LOG3( "CCRRtspSink::SockStatusChange, id: %d, failure: %d, aError: %d",
+ aSockId, ( TInt )aStatus, aError );
+ // here do DoCleanup()
+ iOwningSession.SinkStops( Id() );
+ }
+
+ if ( aSockId != EROPControl )
+ {
+ // Delete used packet from buffer if the socket was udp packet socket
+ iBuffer->HandleBufferSize();
+
+ // Is there more packets to send.
+ if ( iPacketPendingInBuffer )
+ {
+ NewPacketAvailable();
+ iPacketPendingInBuffer =
+ ( iBuffer->PacketsCount( iSinkId ) > KErrNotFound );
+ }
+ }
+ else
+ {
+ LOG3( "CCRRtspSink::SockStatusChange(), aSockId: %d, aStatus: %d, aError: %d",
+ aSockId, ( TInt )aStatus, aError );
+ }
+
+#if !defined LIVE_TV_FILE_TRACE && !defined LIVE_TV_RDEBUG_TRACE
+ ( void )aError;
+#endif
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::ProcessRtspCommandL
+//
+// Causes parsing of command
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::ProcessRtspCommandL()
+ {
+ LOG1( "CCRRtspSink::ProcessRtspCommandL(), iStage: %d", iStage );
+
+ CCRRtspCommand *command = CCRRtspCommand::NewL();
+ CleanupStack::PushL( command );
+ command->TryParseL( *iReceivedData );
+ delete iCommands[command->Command()];
+ iCommands[command->Command()] = command;
+ CleanupStack::Pop( command ); // it is now safely in instance variable
+ ProduceRtspReplyL( command->Command() );
+ iReceivedData->Des().Zero();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::ProduceRtspReplyL
+//
+// Causes sending of reply to rop
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::ProduceRtspReplyL( CCRRtspCommand::TCommand aLastCommand )
+ {
+ LOG2( "CCRRtspSink::ProduceRtspReplyL(), iStage: %d, aLastCommand: %d",
+ iStage, aLastCommand );
+
+ switch ( aLastCommand )
+ {
+ case CCRRtspCommand::ERTSPCommandOPTIONS:
+ ReplyToOptionsL();
+ break;
+
+ case CCRRtspCommand::ERTSPCommandDESCRIBE:
+ if ( iSdpForRop )
+ {
+ ReplyToDescribeL();
+ }
+
+ iStage = ERTSPDescSent;
+ break;
+
+ case CCRRtspCommand::ERTSPCommandSETUP:
+ ReplyToSetupL();
+ break;
+
+ case CCRRtspCommand::ERTSPCommandPLAY:
+ if ( iSeqAndTSSet )
+ {
+ // we've either audio or video seq set, we can proceed with play:
+ ReplyToPlayL();
+ iStage = ERTSPPlaySent;
+ }
+ else
+ {
+ TReal startPos( KRealZero );
+ TReal endPos( KRealZero );
+ iCommands[CCRRtspCommand::ERTSPCommandPLAY]->GetRange( startPos, endPos );
+ iOwningSession.PlayCommand( startPos, endPos );
+ iStage = ERTSPReadyToPlay;
+ }
+ iSetupReceived = 0;
+ break;
+
+ case CCRRtspCommand::ERTSPCommandPAUSE:
+ ReplyToPauseL( iStage != ERTSPPlaying ? KErrNotReady : iOwningSession.PauseCommand() );
+ iSeqAndTSSet = EFalse;
+ break;
+
+ case CCRRtspCommand::ERTSPCommandTEARDOWN:
+ iOwningSession.StopCommand();
+ ReplyToTearDownL();
+ break;
+
+ default:
+ // None
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::ReplyToOptionsL
+//
+// Causes sending of reply to rop for options
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::ReplyToOptionsL()
+ {
+ LOG( "CCRRtspSink::ReplyToOptionsL()" );
+
+ iRopResponse->Des().Zero();
+ AppendFormatL( iRopResponse, KCROptionsReply,
+ iCommands[CCRRtspCommand::ERTSPCommandOPTIONS]->CSeq() );
+ SendControlData();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::ReplyToDescribeL
+//
+// Causes sending of reply to rop for describe
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::ReplyToDescribeL()
+ {
+ LOG( "CCRRtspSink::ReplyToDescribeL()" );
+
+ User::LeaveIfNull( iSdpForRop );
+ iRopResponse->Des().Zero();
+ AppendFormatL( iRopResponse, KDescribeReply,
+ iCommands[CCRRtspCommand::ERTSPCommandDESCRIBE]->CSeq(),
+ iSdpForRop->Des().Length(), &*iSdpForRop );
+ SendControlData();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::ReplyToSetupL
+//
+// Causes sending of reply to rop for setup, either audio or video
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::ReplyToSetupL()
+ {
+ LOG( "CCRRtspSink::ReplyToSetupL()" );
+ if ( !iSdpParser )
+ {
+ User::Leave( KErrNotReady );
+ }
+
+ TPtrC8 url( NULL, 0 );
+ iCommands[CCRRtspCommand::ERTSPCommandSETUP]->URL( url );
+ if ( url.Find( KControlAddr) != KErrNotFound )
+ {
+ // ROP is setting up video
+ TInt videoPort(
+ iCommands[CCRRtspCommand::ERTSPCommandSETUP]->ClientPort() );
+ LOG1( "CCRRtspSink::ReplyToSetupL video port %d", videoPort );
+ iStage = ERTSPSetupVideoSent;
+
+ // Setup sockets:
+ iSockArr[EROPVideoSend1] = CCRSock::NewL( *this, EROPVideoSend1,
+ iConnection.Connection(), iSockServer, EFalse, ETrue );
+ User::LeaveIfError( iSockArr[EROPVideoSend1]->ConnectSock(
+ KCRLocalIPAddr, videoPort,
+ KCCRRtspSinkDefaultServerPort ) );
+
+ iSockArr[EROPVideoSend2] = CCRSock::NewL( *this, EROPVideoSend2,
+ iConnection.Connection(), iSockServer, EFalse, ETrue );
+ User::LeaveIfError( iSockArr[EROPVideoSend2]->ConnectSock(
+ KCRLocalIPAddr, videoPort + 1,
+ KCCRRtspSinkDefaultServerPort + 1 ) );
+ }
+ else
+ {
+ // ROP is setting up audio
+ TInt audioPort(
+ iCommands[CCRRtspCommand::ERTSPCommandSETUP]->ClientPort() );
+ LOG1( "CCRRtspSink::ReplyToSetupL audio port: %d", audioPort );
+ iStage = ERTSPSetupAudioSent;
+
+ // Setup sockets:
+ iSockArr[EROPAudioSend1] = CCRSock::NewL( *this, EROPAudioSend1,
+ iConnection.Connection(), iSockServer, EFalse, ETrue );
+ User::LeaveIfError( iSockArr[EROPAudioSend1]->ConnectSock(
+ KCRLocalIPAddr, audioPort,
+ KCCRRtspSinkDefaultServerPort + 2 ) );
+
+ iSockArr[EROPAudioSend2] = CCRSock::NewL( *this, EROPAudioSend2,
+ iConnection.Connection(), iSockServer, EFalse, ETrue );
+ User::LeaveIfError( iSockArr[EROPAudioSend2]->ConnectSock(
+ KCRLocalIPAddr, audioPort + 1,
+ KCCRRtspSinkDefaultServerPort + 3 ) );
+ }
+
+ iRopResponse->Des().Zero();
+ AppendFormatL( iRopResponse, KSetupReply,
+ iCommands[CCRRtspCommand::ERTSPCommandSETUP]->CSeq(),
+ iCommands[CCRRtspCommand::ERTSPCommandSETUP]->ClientPort(),
+ iCommands[CCRRtspCommand::ERTSPCommandSETUP]->ClientPort() + 1,
+ ( iStage == ERTSPSetupVideoSent )? KCCRRtspSinkDefaultServerPort:
+ KCCRRtspSinkDefaultServerPort + 2,
+ ( iStage == ERTSPSetupVideoSent )? KCCRRtspSinkDefaultServerPort + 1:
+ KCCRRtspSinkDefaultServerPort + 3 );
+
+ // If last setup, delay player response. Otherwise Helix will get prepare completed
+ // and sends automatically PLAY command which ruins the state machine
+ if ( iSetupReceived < 2 )
+ {
+ CDvrSdpParser::TDvrPacketProvidings content( iSdpParser->SupportedContent() );
+ if ( iStage == ERTSPSetupVideoSent )
+ {
+ if ( ( iSetupReceived == 0 && content == CDvrSdpParser::EDvrVideoOnly ) ||
+ ( iSetupReceived <= 1 && content == CDvrSdpParser::EDvrBothAudioAndVideo ) )
+ {
+ iStage = ERTSPDelayedSetup;
+ LOG( "CCRRtspSink::ReplyToSetupL(), Video SETUP repply delayed.." );
+ }
+ }
+ else
+ {
+ if ( ( iSetupReceived == 0 && content == CDvrSdpParser::EDvrAudioOnly ) ||
+ ( iSetupReceived <= 1 && content == CDvrSdpParser::EDvrBothAudioAndVideo ) )
+ {
+ iStage = ERTSPDelayedSetup;
+ LOG( "CCRRtspSink::ReplyToSetupL(), Audio SETUP repply delayed.." );
+ }
+ }
+ }
+
+ // Repply now or later
+ if ( iStage != ERTSPDelayedSetup )
+ {
+ SendControlData();
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::ReplyToPlayL
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::ReplyToPlayL()
+ {
+ LOG( "CCRRtspSink::ReplyToPlayL()" );
+
+ iRopResponse->Des().Zero();
+ if ( iSdpParser->AudioControlAddr().Length() &&
+ iSdpParser->VideoControlAddr().Length() )
+ {
+ AppendFormatL( iRopResponse, KPlayReply,
+ iCommands[CCRRtspCommand::ERTSPCommandPLAY]->CSeq(),
+ iVideoSeq, iVideoTS, iAudioSeq, iAudioTS );
+ }
+ else if ( iSdpParser->AudioControlAddr().Length() &&
+ !iSdpParser->VideoControlAddr().Length() )
+ {
+ AppendFormatL( iRopResponse, KPlayReplyAudioOnly,
+ iCommands[CCRRtspCommand::ERTSPCommandPLAY]->CSeq(),
+ iAudioSeq, iAudioTS );
+ }
+ else if ( !iSdpParser->AudioControlAddr().Length() &&
+ iSdpParser->VideoControlAddr().Length() )
+ {
+ AppendFormatL( iRopResponse, KPlayReplyVideoOnly,
+ iCommands[CCRRtspCommand::ERTSPCommandPLAY]->CSeq(),
+ iVideoSeq, iVideoTS );
+ }
+ else
+ { // no audio, no video.
+ iOwningSession.SinkStops( Id() );
+ return;
+ }
+
+ if ( !( iLowerRange == KRealZero && iUpperRange == KRealMinusOne ) )
+ {
+ TBuf8<KMaxName> buf( KCRRangeHeader );
+ TRealFormat format( 10, 3 );
+ format.iTriLen = 0;
+ buf.AppendNum( iLowerRange, format );
+ buf.Append( '-' );
+ buf.AppendNum( iUpperRange, format );
+ buf.Append( KCRNewLine );
+ AppendFormatL( iRopResponse, buf );
+ }
+
+ AppendL( iRopResponse, KCRNewLine );
+ SendControlData();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::ReplyToPlayL
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::ReplyToPauseL( TInt aErrorCode )
+ {
+ LOG1( "CCRRtspSink::ReplyToPauseL(), aErrorCode: %d", aErrorCode );
+
+ iRopResponse->Des().Zero();
+
+ switch ( aErrorCode )
+ {
+ case KErrNone:
+ AppendFormatL( iRopResponse, KPauseReply,
+ CCRRtspResponse::ERTSPRespOK,
+ iCommands[CCRRtspCommand::ERTSPCommandPAUSE]->CSeq() );
+ iStage = ERTSPPauseSent;
+ break;
+
+ case KErrNotReady:
+ AppendFormatL( iRopResponse, KPauseReply,
+ CCRRtspResponse::ERTSPRespMethodNotValidInThisState,
+ iCommands[CCRRtspCommand::ERTSPCommandPAUSE]->CSeq() );
+ break;
+
+ default:
+ AppendFormatL( iRopResponse, KPauseReply,
+ CCRRtspResponse::ERTSPRespMethodNotAllowed,
+ iCommands[CCRRtspCommand::ERTSPCommandPAUSE]->CSeq() );
+ break;
+ }
+
+ SendControlData();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::ReplyToTearDownL
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::ReplyToTearDownL()
+ {
+ LOG( "CCRRtspSink::ReplyToTearDownL()" );
+
+ iRopResponse->Des().Zero();
+ AppendFormatL( iRopResponse, KTearDownReply,
+ iCommands[CCRRtspCommand::ERTSPCommandTEARDOWN]->CSeq() );
+ SendControlData();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::SocketFromStream
+//
+// -----------------------------------------------------------------------------
+//
+CCRRtspSink::TCRROPSockId CCRRtspSink::SocketFromStream(
+ MCRPacketSource::TCRPacketStreamId aStreamId )
+ {
+ switch ( aStreamId )
+ {
+ case MCRPacketSource::EAudioStream:
+ return EROPAudioSend1;
+
+ case MCRPacketSource::EAudioControlStream:
+ return EROPAudioSend2;
+
+ case MCRPacketSource::EVideoStream:
+ return EROPVideoSend1;
+
+ case MCRPacketSource::EVideoControlStream:
+ return EROPVideoSend2;
+
+ default:
+ __ASSERT_ALWAYS( 1!=2, User::Panic( KCCRRtspSink, KErrArgument ) );
+ break;
+ }
+
+ return EROPMaxSockets; // this is never reached
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::AppendL
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::AppendL( HBufC8*& aBuffer, const TDesC8& aStr )
+ {
+ TPtr8 ptr( aBuffer->Des() );
+ if ( ( ptr.Length() + aStr.Length() ) >= ptr.MaxLength() )
+ {
+ const TInt newLength( ptr.Length() + aStr.Length() + KMaxName );
+ aBuffer = aBuffer->ReAllocL( newLength );
+ ptr.Set( aBuffer->Des() );
+ }
+
+ ptr.Append( aStr );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::AppendNumL
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::AppendNumL( HBufC8*& aBuffer, const TInt aNum )
+ {
+ TPtr8 ptr( aBuffer->Des() );
+ if ( ( ptr.Length() + KMaxInfoName ) >= ptr.MaxLength() )
+ {
+ const TInt newLength( ptr.Length() + KMaxInfoName + KMaxName );
+ aBuffer = aBuffer->ReAllocL( newLength );
+ ptr.Set( aBuffer->Des() );
+ }
+
+ ptr.AppendNum( aNum );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::AppendFormatL
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::AppendFormatL(
+ HBufC8*& aBuffer,
+ TRefByValue<const TDesC8> aFmt, ... )
+ {
+ VA_LIST list;
+ VA_START( list, aFmt );
+ HBufC8* buf = HBufC8::NewLC( KMaxDataSize );
+ buf->Des().FormatList( aFmt, list );
+ VA_END( list );
+
+ TPtr8 ptr( aBuffer->Des() );
+ if ( ( ptr.Length() + buf->Length() ) >= ptr.MaxLength() )
+ {
+ const TInt newLength( ptr.Length() + buf->Length() + KMaxName );
+ aBuffer = aBuffer->ReAllocL( newLength );
+ ptr.Set( aBuffer->Des() );
+ }
+
+ ptr.Append( *buf );
+ CleanupStack::PopAndDestroy( buf );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRRtspSink::SendControlData
+//
+// -----------------------------------------------------------------------------
+//
+void CCRRtspSink::SendControlData()
+ {
+ iSockArr[EROPControl]->SendData( *iRopResponse );
+ iRopResponse->Des().Zero();
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRServer.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,392 @@
+/*
+* 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: Implementation of CR servers server class*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCRServer.h"
+#include "CCRSession.h"
+#include "CCREngine.h"
+#include <ipvideo/CRTypeDefs.h> // Constants exported from client library
+#include <e32svr.h>
+#include <e32math.h>
+#include <e32uid.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+// Platform security. Custom check is applied to all IPCs.
+static const int KRangeCount( 1 );
+
+static const TInt SecurityRanges[KRangeCount] =
+ {
+ 0, // Range is from 0 to KMaxTInt
+ };
+
+static const TUint8 SecurityRangesPolicy[KRangeCount] =
+ {
+ CPolicyServer::ECustomCheck
+ };
+
+static const CPolicyServer::TPolicy Policy =
+ {
+ CPolicyServer::EAlwaysPass,
+ KRangeCount,
+ SecurityRanges,
+ SecurityRangesPolicy,
+ NULL,
+ };
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRServer::NewLC()
+//
+// -----------------------------------------------------------------------------
+//
+CCRServer* CCRServer::NewLC( )
+ {
+ CCRServer* self = new( ELeave ) CCRServer;
+ CleanupStack::PushL( self );
+ self->ConstructL( );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRServer::CCRServer()
+// C++ constructor
+// -----------------------------------------------------------------------------
+//
+CCRServer::CCRServer()
+ : CPolicyServer( EPriorityRealTimeServer, Policy, ESharableSessions ),
+ iSessionCount( 0 )
+ {
+ __DECLARE_NAME( _S( "CCRServer" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRServer::ConstructL()
+// second-phase constructor; create the object container index.
+// -----------------------------------------------------------------------------
+//
+void CCRServer::ConstructL( )
+ {
+ LOG( "CCRServer::ConstructL()" );
+
+ iContainerIx = CObjectConIx::NewL();
+ iObjectCon = iContainerIx->CreateL();
+
+ StartL( KCRServerNameExe );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRServer::~CCRServer()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRServer::~CCRServer()
+ {
+ LOG( "CCRServer::~CCRServer()" );
+
+ DeleteRtpEngine();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRServer::ThreadFunction()
+// The active scheduler is installed and started here.
+// -----------------------------------------------------------------------------
+//
+TInt CCRServer::ThreadFunction( )
+ {
+ CTrapCleanup* cleanupStack = CTrapCleanup::New();
+ if ( !cleanupStack )
+ {
+ PanicServer( KErrNoMemory );
+ }
+
+ TRAPD( err, ThreadFunctionL( ) );
+ if ( err )
+ {
+ PanicServer( KErrServerTerminated );
+ }
+
+ delete cleanupStack;
+ cleanupStack = NULL;
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRServer::ThreadFunctionL()
+//
+// -----------------------------------------------------------------------------
+//
+void CCRServer::ThreadFunctionL( )
+ {
+ LOG( "CCRServer::ThreadFunctionL() - In" );
+
+ // Construct active scheduler
+ CActiveScheduler* activeScheduler = new ( ELeave ) CActiveScheduler;
+ CleanupStack::PushL( activeScheduler ); // |-> 1
+
+ // Install active scheduler.
+ // We don't need to check whether an active scheduler is already installed
+ // as this is a new thread, so there won't be one
+ CActiveScheduler::Install( activeScheduler );
+
+ // Construct our server, pushed cleanup stack and leaved there
+ CCRServer* server = CCRServer::NewLC( ); // |-> 2
+
+ // Signal server is up
+ RProcess::Rendezvous( KErrNone );
+
+ // Start handling requests
+ CActiveScheduler::Start();
+
+ CleanupStack::PopAndDestroy( server ); // 2<-|
+ CleanupStack::PopAndDestroy( activeScheduler ); // 1<-|
+
+ LOG( "CCRServer::ThreadFunctionL() - Out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRServer::SignalClientL
+// Signal the client that server is running.
+// -----------------------------------------------------------------------------
+void CCRServer::SignalClientL()
+ {
+ RSemaphore semaphore;
+ User::LeaveIfError( semaphore.OpenGlobal( KCRServerSemaphoreName ) );
+ semaphore.Signal();
+ semaphore.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRServer::PanicServer
+// Utility - panic the server
+// -----------------------------------------------------------------------------
+void CCRServer::PanicServer( TInt aPanic )
+ {
+ LOG1( "CCRServer::PanicServer(), aPanic: %d", aPanic );
+
+ User::Panic( KCRServerNameExe, aPanic );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRServer::GetEngineObjectL()
+//
+// -----------------------------------------------------------------------------
+//
+CCREngine* CCRServer::GetEngineObjectL()
+ {
+ if ( iObjectCon->Count() == 0 )
+ {
+ // Create CR engine
+ iEngine = CCREngine::NewL( );
+
+ // Add our engine to container
+ iObjectCon->AddL( iEngine );
+ }
+ else
+ {
+ // default implementation return KErrNone.
+ if ( KErrNone != iEngine->Open() )
+ {
+ User::Leave( KErrGeneral );
+ }
+ }
+
+ // We have only one object in our container
+ return iEngine;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRServer::Inc()
+//
+// -----------------------------------------------------------------------------
+//
+void CCRServer::Inc()
+ {
+ iSessionCount++;
+ LOG1( "CCRServer::Inc(), New iSessionCount: %d", iSessionCount );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRServer::Dec()
+//
+// -----------------------------------------------------------------------------
+//
+void CCRServer::Dec()
+ {
+ iSessionCount--;
+ LOG1( "CCRServer::Dec(), New iSessionCount: %d", iSessionCount );
+
+ if ( iSessionCount <= 0 )
+ {
+ StopServer();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRServer::NewSessionL()
+//
+// -----------------------------------------------------------------------------
+//
+CSession2* CCRServer::NewSessionL(
+ const TVersion& aVersion,
+ const RMessage2& /*aMessage*/ ) const
+ {
+ // Check version is ok
+ TVersion v( KCRServMajorVersionNumber,
+ KCRServMinorVersionNumber,
+ KCRServBuildVersionNumber );
+
+ if ( !User::QueryVersionSupported( v, aVersion ) )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+ // Make new session
+ return CCRSession::NewL( ( CCRServer* ) this );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRServer::StopServer
+// Stops the server thread if no sessions active.
+// -----------------------------------------------------------------------------
+//
+void CCRServer::StopServer()
+ {
+ LOG( "CCRServer::StopServer()" );
+
+ CActiveScheduler::Stop();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRServer::DeleteRtpEngine
+// Stops active scheduler and deletes object container and other objects.
+// -----------------------------------------------------------------------------
+//
+void CCRServer::DeleteRtpEngine()
+ {
+ LOG1( "CCRServer::DeleteRtpEngine(), iContainerIx: %d", iContainerIx );
+
+ if ( iContainerIx )
+ {
+ iContainerIx->Remove( iObjectCon );
+ delete iContainerIx; iContainerIx = NULL;
+ }
+ }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+// -----------------------------------------------------------------------------
+// StartThread()
+// Start the server thread. This is called from the client.
+// -----------------------------------------------------------------------------
+//
+TInt CCRServer::StartThread()
+ {
+#ifdef _DEBUG
+ __UHEAP_MARK;
+#endif
+
+ LOG( "CCRServer::StartThread() - In" );
+ // Check server not already started
+ TFindServer findCountServer( KCRServerNameExe );
+ TFullName name;
+ if ( findCountServer.Next( name ) == KErrNone )
+ {
+ // Found server already
+ TRAP_IGNORE( CCRServer::SignalClientL() );
+ return KErrAlreadyExists;
+ }
+
+ ThreadFunction( );
+
+ LOG( "CCRServer::StartThread() - Out" );
+
+#ifdef _DEBUG
+ __UHEAP_MARKEND;
+#endif
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// E32Main()
+// Server startup
+// Returns: KErrNone
+// -----------------------------------------------------------------------------
+//
+GLDEF_C TInt E32Main()
+ {
+ return CCRServer::StartThread();
+ }
+
+// --------------------------------------------------------------------------
+// CCRServer::CustomSecurityCheckL()
+// --------------------------------------------------------------------------
+//
+CPolicyServer::TCustomResult CCRServer::CustomSecurityCheckL(
+ const RMessage2& aMsg,
+ TInt& /*aAction*/,
+ TSecurityInfo& /*aMissing*/ )
+ {
+
+ TCustomResult retVal ( EFail );
+
+ // Check the messagge function range
+ if ( ( aMsg.Function() > ECRServBase &&
+ aMsg.Function() < ECRServLastEnum ) ||
+ ( aMsg.Function() > ECRLiveTvBase &&
+ aMsg.Function() < ECRLiveTvLastEnum ) )
+ {
+ // Check if the client has required capabilities
+ // From .mmp-file following are CAP_APPLICATION capabilities
+ if( ! aMsg.HasCapability(ECapabilityNetworkServices ) ||
+ ! aMsg.HasCapability(ECapabilityLocalServices ) ||
+ ! aMsg.HasCapability(ECapabilityLocation ) ||
+ ! aMsg.HasCapability(ECapabilityReadUserData ) ||
+ ! aMsg.HasCapability(ECapabilityWriteUserData ) ||
+ ! aMsg.HasCapability(ECapabilityReadDeviceData ) ||
+ ! aMsg.HasCapability(ECapabilityWriteDeviceData ) ||
+ ! aMsg.HasCapability(ECapabilitySwEvent ) )
+ {
+ LOG1(
+ "CCRServer::CustomSecurityCheckL() No capability for message %d!!!",
+ aMsg.Function() );
+ }
+ else
+ {
+ LOG1(
+ "CCRServer::CustomSecurityCheckL() Message %d inside range and capabilities ok",
+ aMsg.Function() );
+ retVal = EPass;
+ }
+ }
+ else
+ {
+ LOG1(
+ "CCRServer::CustomSecurityCheckL() Message %d outside known range!!!",
+ aMsg.Function() );
+ }
+
+ return retVal;
+
+ }
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRSession.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,218 @@
+/*
+* 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: Implementation of RBF server's CCRSession class*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCRSession.h"
+#include "CCRServer.h"
+#include "CCREngine.h"
+#include <ipvideo/CRTypeDefs.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+// None
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRSession::CCRSession()
+// C++ constructor
+// -----------------------------------------------------------------------------
+//
+CCRSession::CCRSession() : CSession2(), iResourceCount( 0 )
+ {
+ __DECLARE_NAME( _S( "CCRSession" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSession::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCRSession* CCRSession::NewL( CCRServer* aServer )
+ {
+ CCRSession* self = new( ELeave ) CCRSession();
+ CleanupStack::PushL( self );
+ self->ConstructL( aServer );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSession::ConstructL()
+// second-phase C++ constructor
+// -----------------------------------------------------------------------------
+//
+void CCRSession::ConstructL( CCRServer* aServer )
+ {
+ LOG( "CCRSession::ConstructL" );
+
+ aServer->Inc();
+ // Create new object index
+ iObjects = CObjectIx::NewL();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSession::~CCRSession()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRSession::~CCRSession()
+ {
+ LOG( "CCRSession::~CCRSession" );
+
+ // Deletes objects
+ delete iObjects;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSession::ServiceL()
+// -----------------------------------------------------------------------------
+//
+void CCRSession::ServiceL( const RMessage2& aMessage )
+ {
+ switch ( aMessage.Function() )
+ {
+ case ECRServCreateSubSession:
+ case ECRServCloseSubSession:
+ case ECRServCloseSession:
+ {
+ LOG1( "CCRSession::ServiceL(), aMessage: %d", aMessage.Function() );
+ TRAPD( err, DispatchMessageL( aMessage ) );
+ aMessage.Complete( err );
+ }
+ break;
+
+ default:
+ {
+ // Ok, but must be subsession relative
+ CCREngine* engine = ( CCREngine* )iObjects->At( aMessage.Int3() );
+ if ( engine == NULL )
+ {
+ LOG( "CCRSession::ServiceL(), Null engine !" );
+ aMessage.Complete( KErrBadHandle );
+ PanicClient( KErrBadHandle );
+ }
+ else
+ {
+ // this is the normal route,
+ // all engine commands go this way
+ engine->GeneralServiceL( aMessage );
+ }
+ }
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSession::DispatchMessageL()
+// -----------------------------------------------------------------------------
+//
+void CCRSession::DispatchMessageL( const RMessage2& aMessage )
+ {
+ // Check for session-relative requests
+ switch ( aMessage.Function() )
+ {
+ case ECRServCreateSubSession:
+ NewObjectL( aMessage );
+ break;
+
+ case ECRServCloseSubSession:
+ DeleteObject( aMessage.Int3() );
+ break;
+
+ case ECRServCloseSession:
+ Server()->Dec();
+ break;
+
+ default:
+ // None
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSession::NewObjectL()
+//
+// -----------------------------------------------------------------------------
+//
+void CCRSession::NewObjectL( const RMessage2& aMessage )
+ {
+ LOG( "CCRSession::NewObjectL() in" );
+
+ CObject* obj = Server()->GetEngineObjectL();
+ TInt handle( iObjects->AddL( obj ) );
+ LOG1( "CCRSession::NewObjectL(), handle: %d", handle );
+
+ // Write the handle to client
+ TPckg<TInt> handlePckg( handle );
+ TRAPD( err, aMessage.WriteL( 3, handlePckg ) );
+ if ( err )
+ {
+ PanicClient( KErrBadDescriptor );
+ return;
+ }
+
+ // Notch up another resource
+ iResourceCount++;
+ LOG1( "CCRSession::NewObjectL() out, iResourceCount: %d", iResourceCount );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSession::DeleteObject()
+// -----------------------------------------------------------------------------
+//
+void CCRSession::DeleteObject( TUint aHandle )
+ {
+ LOG1( "CCRSession::DeleteObject() in, aHandle: %u", aHandle );
+
+ // Panic if bad handle
+ CCREngine* engine = ( CCREngine* )iObjects->At( aHandle );
+ if ( engine == NULL )
+ {
+ PanicClient( KErrNotFound );
+ }
+
+ // Deletes engine
+ iResourceCount--;
+ iObjects->Remove( aHandle );
+
+ LOG1( "CCRSession::DeleteObject() out, iResourceCount: %d", iResourceCount );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSession::CountResources()
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCRSession::CountResources()
+ {
+ return iResourceCount;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSession::PanicClient()
+// -----------------------------------------------------------------------------
+//
+void CCRSession::PanicClient( TInt aPanic ) const
+ {
+ _LIT( KTxtSessionPanic, "RbfSession" );
+ User::Panic( KTxtSessionPanic, aPanic );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRSock.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,913 @@
+/*
+* 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: Handles tcp/udp socket*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCRSock.h"
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+_LIT( KCRSockLocalhost, "127.0.0.1" );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRSock::CCRSock
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCRSock::CCRSock(
+ MCRSockObserver& aObserver,
+ TInt aSockId,
+ RConnection& aConnection,
+ RSocketServ& aSockServer,
+ TBool aProtoTCP,
+ TBool aIssueRead )
+ : CActive( CActive::EPriorityStandard ),
+ iSockServer( aSockServer ),
+ iSockStatus( CCRSock::EInitNeeded ),
+ iObserver( aObserver ),
+ iSockId( aSockId ),
+ iProtoTCP( aProtoTCP ),
+ iIssueRead( aIssueRead ),
+ iReceivedData( NULL, 0 ),
+ iSentData( NULL, 0 ),
+ iConnection( aConnection )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSock::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCRSock* CCRSock::NewL(
+ MCRSockObserver& aObserver,
+ TInt aSockId,
+ RConnection& aConnection,
+ RSocketServ& aSockServer,
+ TBool aProtoTCP,
+ TBool aIssueRead )
+ {
+ CCRSock* self = new( ELeave ) CCRSock( aObserver, aSockId, aConnection,
+ aSockServer, aProtoTCP, aIssueRead );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSock::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCRSock::ConstructL()
+ {
+ LOG( "CCRSock::ConstructL() in" );
+
+ iReceivedDataBuf = HBufC8::NewL( KMaxDataSize );
+ iReceivedData.Set( iReceivedDataBuf->Des() );
+ iSentDataBuf = HBufC8::NewL( KMaxDataSize );
+ iSentData.Set( iSentDataBuf->Des() );
+
+ // Add self to active scheduler
+ CActiveScheduler::Add( this );
+ if ( iIssueRead )
+ {
+ iReader = CCRSockReader::NewL( *this, iConnection, iSockServer );
+ }
+
+ iToAddr.SetPort( 0 );
+
+ LOG( "CCRSock::ConstructL() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSock::~CCRSock
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRSock::~CCRSock()
+ {
+ LOG( "CCRSock::~CCRSock()" );
+
+ CleanUp();
+ delete iReader;
+ delete iSentDataBuf;
+ delete iReceivedDataBuf;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCRSock::RunL
+// "Brain"
+// -----------------------------------------------------------------------------
+//
+void CCRSock::RunL()
+ {
+ TInt err( KErrNone );
+
+ if ( iStatus == KErrEof && iWasListening )
+ {
+ iSocket.Close();
+ err = iSocket.Open( iSockServer );
+ if ( err == KErrNone )
+ {
+ LOG1( "CCRSock::RunL(), reopening sock: %d for listen", iSockId );
+ iIsiSocketOpen = ETrue;
+ iListenSocket.Accept( iSocket, iStatus );
+ iSockStatus = CCRSock::EListening;
+ SetActive();
+ }
+ else
+ {
+ LOG2( "CCRSock::RunL(), iSocket.Open FAILED id: %d err: %d",
+ iSockId, err );
+ }
+ }
+ else
+ {
+ switch ( iSockStatus )
+ {
+ case EResolving: // in connection, this is usually 1st time to come to RunL
+ if ( iStatus == KErrNone )
+ { // host name found
+ iHostAddress().iAddr.SetPort( iPort );
+ iSocket.Close();
+ err = iSocket.Open( iSockServer,
+ KAfInet,
+ iProtoTCP ? KSockStream : KSockDatagram,
+ iProtoTCP ? KProtocolInetTcp : KProtocolInetUdp,
+ iConnection ) ;
+ if ( err )
+ {
+ iSockStatus = CCRSock::EFailed;
+ iObserver.SockStatusChange( iSockId, iSockStatus, err );
+ iResolver.Close();
+ LOG2( "CCRSock::RunL(), iSockId: %d, err: %d", iSockId, err );
+ }
+ else
+ {
+ iIsiSocketOpen = ETrue;
+ if ( iLocalPort > 0 )
+ {
+ TInetAddr bindAddr( KInetAddrAny, iLocalPort );
+ err = iSocket.Bind( bindAddr );
+ if ( err != KErrNone )
+ {
+ LOG2( "CCRSock::ConnectSock(), Bind FAILED, Id: %d, err %d", iSockId, err );
+ }
+ }
+
+ LOG2( "CCRSock::RunL(), iSockId: %d, port: %d",
+ iSockId, iHostAddress().iAddr.Port() );
+ iSocket.Connect( iHostAddress().iAddr, iStatus );
+ iToAddr = iHostAddress().iAddr;
+ err = iSocket.SetOpt( KSOBlockingIO, KSOLSocket);
+ if ( err != KErrNone )
+ {
+ LOG1( "CCRSock::RunL(), iSocket.SetOpt FAILED: %d", err );
+ }
+ iSockStatus = CCRSock::EConnecting;
+ iObserver.SockStatusChange( iSockId, iSockStatus, err );
+ SetActive();
+ iResolver.Close();
+ }
+ }
+ else
+ { // resolving not ok
+ iSockStatus = CCRSock::EFailed;
+ iObserver.SockStatusChange( iSockId, iSockStatus, iStatus.Int() );
+ iResolver.Close();
+ }
+ break;
+
+ case EConnecting:
+ if ( iStatus == KErrNone ) // success
+ {
+ iSockStatus = CCRSock::EIdle;
+ // next action is up to user, don't do SetActive here.
+ LOG1( "CCRSock::RunL(), iSockId: %d", iSockId );
+
+ if ( iIssueRead && iReader && ( !iReader->IsActive() ) )
+ {
+ iReader->IssueRead();
+ }
+ }
+ else
+ {
+ iSockStatus = CCRSock::EFailed;
+ iObserver.SockStatusChange( iSockId, iSockStatus, iStatus.Int() );
+ CleanUp(); /* close everything */
+ }
+ iObserver.SockStatusChange( iSockId, iSockStatus, iStatus.Int() );
+ break;
+
+ case ESending:
+ // send has been finished,somehow:
+ if ( iStatus == KErrNone ) // success
+ {
+#if defined ( LIVE_TV_FILE_TRACE ) || defined ( LIVE_TV_RDEBUG_TRACE )
+ sendBytes += iSentDataLen();
+ sendCount ++;
+ if ( ( sendCount % 50 ) == 0 )
+ {
+ LOG3( "CCRSock::RunL(), sendCount: %d, sendBytes: %d, iSockId: %d",
+ sendCount, sendBytes, iSockId );
+ }
+#endif
+ iSockStatus = CCRSock::EIdle;
+ // next action is up to user, don't do SetActive here.
+ }
+ else
+ {
+ iSockStatus = CCRSock::EFailed;
+ CleanUp(); /* close everything */
+ }
+ iObserver.SockStatusChange( iSockId, iSockStatus, iStatus.Int() );
+ break;
+
+ case EListening:
+ if ( iStatus == KErrNone ) // success, da zocket is open
+ {
+ iSockStatus = CCRSock::EIdle;
+ if ( iIssueRead && iReader && ( !iReader->IsActive() ) )
+ {
+ iReader->IssueRead();
+ }
+ }
+ else
+ {
+ iSockStatus = CCRSock::EFailed;
+ CleanUp(); /* close everything */
+ }
+ iObserver.SockStatusChange( iSockId, iSockStatus, iStatus.Int() );
+ break;
+
+ default:
+ __ASSERT_DEBUG( 1==2, User::Panic( _L("CRRTP"), KErrArgument) );
+ break; /* this should not happend? */
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSock::DoCancel
+// Cancels pending actions
+// -----------------------------------------------------------------------------
+//
+void CCRSock::DoCancel()
+ {
+ LOG( "CCRSock::DoCancel() in" );
+ if ( iIsiSocketOpen )
+ {
+ iSocket.CancelAll();
+ }
+ if ( iIsiListenSocketOpen )
+ {
+ iListenSocket.CancelAll();
+ }
+
+ LOG( "CCRSock::DoCancel() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSock::CopySendData
+// Handles send buffer size.
+// -----------------------------------------------------------------------------
+//
+void CCRSock::CopySendData( const TDesC8& aData )
+ {
+ if ( aData.Length() > iSentData.MaxLength() )
+ {
+ // Alloc more than 8k
+ delete iSentDataBuf; iSentDataBuf = NULL;
+ iSentDataBuf = HBufC8::New( aData.Length() );
+ iSentData.Set( iSentDataBuf->Des() );
+ }
+ else
+ {
+ if ( iSentData.MaxLength() > KMaxDataSize &&
+ aData.Length() <= KMaxDataSize )
+ {
+ // Back to 8k if not more needed
+ delete iSentDataBuf; iSentDataBuf = NULL;
+ iSentDataBuf = HBufC8::New( KMaxDataSize );
+ iSentData.Set( iSentDataBuf->Des() );
+ }
+ }
+
+ iSentData.Copy( aData );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSock::CleanUp
+// Performs cleanup
+// -----------------------------------------------------------------------------
+//
+void CCRSock::CleanUp()
+ {
+ LOG( "CCRSock::CleanUp() in" );
+ Cancel();
+
+ iResolver.Close();
+ iSocket.Close();
+ iListenSocket.Close();
+ iSockStatus = CCRSock::EInitNeeded;
+
+ iIsiSocketOpen = EFalse;
+ iIsiListenSocketOpen = EFalse;
+ LOG( "CCRSock::CleanUp() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSock::RunError
+// Q: Is anything wrong
+// A: Thanks for asking. About everything.
+// -----------------------------------------------------------------------------
+//
+TInt CCRSock::RunError( TInt aError )
+ {
+ LOG1( "CCRSock::RunError(), aError: %d", aError );
+ ( void )aError; // Prevent compiler warning
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSock::ConnectSock
+// Initiates connection to remote addr.
+// -----------------------------------------------------------------------------
+//
+TInt CCRSock::ConnectSock(
+ const TDesC& aAddr,
+ TUint aPort,
+ TInt aLocalPort )
+ {
+ LOG( "CCRSock::ConnectSock()" );
+
+ TInt retval( KErrNone );
+ if ( IsActive() )
+ {
+ retval = KErrInUse;
+ }
+ else
+ {
+ iWasListening = EFalse;
+ iPort = aPort;
+ iLocalPort = aLocalPort;
+ if ( aAddr.Compare( KCRSockLocalhost() ) != 0 )
+ {
+ iResolver.Close();
+ if ( (retval = iResolver.Open( iSockServer, KAfInet,
+ KProtocolInetTcp, iConnection) ) == KErrNone )
+ {
+ iResolver.GetByName( aAddr, iHostAddress, iStatus );
+ iSockStatus = CCRSock::EResolving;
+ SetActive();
+ }
+ else
+ {
+ LOG2( "CCRSock::ConnectSock(), Resolver.Open id: %d, err: %d",
+ iSockId, retval );
+ iSockStatus = CCRSock::EFailed;
+ }
+ }
+ else
+ { // localhost, no need to resolve
+ iHostAddress().iAddr.SetPort( iPort );
+ iSocket.Close();
+ retval = iSocket.Open( iSockServer,
+ KAfInet,
+ iProtoTCP ? KSockStream : KSockDatagram,
+ iProtoTCP ? KProtocolInetTcp : KProtocolInetUdp,
+ iConnection ) ;
+ if ( retval )
+ {
+ LOG2( "CCRSock::ConnectSock(), Socket.Open id: %d, err: %d",
+ iSockId, retval );
+ iSockStatus = CCRSock::EFailed;
+ }
+ else
+ {
+ iIsiSocketOpen = ETrue;
+ iSockStatus = CCRSock::EConnecting;
+ if ( aLocalPort > 0 )
+ {
+ TInetAddr bindAddr( KInetAddrAny, aLocalPort );
+ TInt err( iSocket.Bind( bindAddr ) );
+ if ( err != KErrNone )
+ {
+ LOG2( "CCRSock::ConnectSock(), Bind FAILED iSockId: %d, err: %d",
+ iSockId, err );
+ }
+ }
+ iToAddr = TInetAddr( KInetAddrLoop, aPort );
+ LOG2( "CCRSock::ConnectSock(), iSockId %d port %d",
+ iSockId, aPort );
+ iSocket.Connect( iToAddr, iStatus );
+ SetActive();
+ if ( iProtoTCP )
+ {
+ retval = iSocket.SetOpt( KSOBlockingIO, KSOLSocket );
+ }
+ iObserver.SockStatusChange( iSockId, iSockStatus, retval );
+ }
+ }
+ }
+
+ LOG1( "CCRSock::ConnectSock(), retVal: %d", retval );
+ return retval;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSock::ConnectSock
+// Initiates connection to remote addr without resolving.
+// -----------------------------------------------------------------------------
+//
+TInt CCRSock::ConnectSock(
+ const TSockAddr& aAddr,
+ TInt aLocalPort )
+ {
+ LOG( "CCRSock::ConnectSock(), no dns" );
+
+ TInt retval( KErrNone );
+ if ( IsActive() )
+ {
+ retval = KErrInUse;
+ }
+ else
+ {
+ iWasListening = EFalse;
+ iPort = aAddr.Port();
+ iLocalPort = aLocalPort;
+ iHostAddress().iAddr = aAddr;
+ iSocket.Close();
+ retval = iSocket.Open( iSockServer,
+ KAfInet,
+ iProtoTCP ? KSockStream : KSockDatagram,
+ iProtoTCP ? KProtocolInetTcp : KProtocolInetUdp,
+ iConnection ) ;
+ if ( retval )
+ {
+ LOG2( "CCRSock::ConnectSock(), Socket.Open id: %d, err: %d",
+ iSockId, retval );
+ iSockStatus = CCRSock::EFailed;
+ }
+ else
+ {
+ iIsiSocketOpen = ETrue;
+ iSockStatus = CCRSock::EConnecting;
+ if ( aLocalPort > 0 )
+ {
+ TInetAddr bindAddr( KInetAddrAny, aLocalPort );
+ TInt err( iSocket.Bind( bindAddr ) );
+ if ( err != KErrNone )
+ {
+ LOG2( "CCRSock::ConnectSock(), Bind FAILED id: %d err: %d",
+ iSockId, err );
+ }
+ }
+ iToAddr = aAddr;
+ LOG2( "CCRSock::ConnectSock(), id: %d, port: %d", iSockId, iPort );
+ iSocket.Connect( iToAddr, iStatus );
+ SetActive();
+ if ( iProtoTCP )
+ {
+ retval = iSocket.SetOpt( KSOBlockingIO, KSOLSocket );
+ }
+ iObserver.SockStatusChange( iSockId, iSockStatus, retval );
+ }
+ }
+
+ LOG1( "CCRSock::ConnectSock(), retVal: %d", retval );
+ return retval;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSock::ListenPort
+// Starts listening to port. Synchronous.
+// -----------------------------------------------------------------------------
+//
+TInt CCRSock::ListenPort( TUint aPort )
+ {
+ LOG1( "CCRSock::ListenPort(), aPort: %d", aPort );
+
+ TInt retval( KErrNone );
+ if ( IsActive() )
+ {
+ return KErrInUse;
+ }
+ if ( iSockStatus != CCRSock::EInitNeeded )
+ {
+ return KErrNotReady;
+ }
+
+ iHostAddress().iAddr.SetPort( iPort );
+ iWasListening = ETrue;
+ if ( iProtoTCP )
+ {
+ iListenSocket.Close();
+ if ( ( retval = iListenSocket.Open( iSockServer, KAfInet,
+ KSockStream, KProtocolInetTcp, iConnection ) ) == KErrNone )
+ {
+ iIsiListenSocketOpen = ETrue;
+ TInetAddr listenAddr( KInetAddrAny, aPort );
+ LOG2( "CCRSock::ListenPort(), id: %d, port: %d", iSockId,(TInt)aPort);
+ retval = iListenSocket.Bind( listenAddr );
+ if ( retval == KErrNone )
+ {
+ retval = iListenSocket.Listen( 5 );
+ if ( retval == KErrNone )
+ {
+ iSocket.Close();
+ retval = iSocket.Open( iSockServer );
+ if ( retval == KErrNone )
+ {
+ iIsiSocketOpen = ETrue;
+ iListenSocket.Accept( iSocket, iStatus );
+ iSockStatus = CCRSock::EListening;
+ SetActive();
+ }
+ else
+ {
+ LOG1( "CCRSock::ListenPort(), iSocket.Open FAILED retval: %d", retval );
+ }
+ }
+ else
+ {
+ LOG1( "CCRSock::ListenPort(), iListenSock.Listen FAILED retval: %d", retval );
+ }
+ }
+ else
+ {
+ LOG2( "CCRSock::ListenPort() iListenSocket.Bind FAILED Id: %d, retval: %d", iSockId, retval);
+ }
+ }
+ else
+ {
+ LOG2( "ListenSocket.Open id: %d, err: %d", iSockId, retval );
+ }
+ }
+ else
+ {
+ // for UDP things are different: just open, bind
+ iSocket.Close();
+ if ( ( retval = iSocket.Open( iSockServer,
+ KAfInet,
+ KSockDatagram,
+ KProtocolInetUdp,
+ iConnection ) ) != KErrNone )
+ {
+ iSockStatus = CCRSock::EFailed;
+ LOG2( "CCRSock::ListenPort(), UDPSocket.Open id: %d, err: %d", iSockId, retval );
+ }
+ else
+ {
+ TInetAddr listenAddr( KInetAddrAny, aPort );
+ retval = iSocket.Bind( listenAddr );
+ if ( retval == KErrNone )
+ {
+ LOG2( "CCRSock::ListenPort(), udp: %d ok, id: %d", aPort,iSockId );
+ iSockStatus = CCRSock::EIdle;
+ iIsiSocketOpen = ETrue;
+ }
+ else
+ {
+ LOG2( "CCRSock::ListenPort(), UDPSocket.Bind FAILED id: %d, retval: %d", iSockId, retval );
+ iSockStatus = CCRSock::EFailed;
+ }
+ if ( iIssueRead && iReader && ( !iReader->IsActive() ) )
+ {
+ iReader->IssueRead();
+ }
+ }
+ }
+
+ LOG1( "CCRSock::ListenPort(), retval: %d", retval );
+ return retval;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSock::JoinGroup
+// Joins a multicast group. Synchronous.
+// -----------------------------------------------------------------------------
+//
+TInt CCRSock::JoinGroup( const TInetAddr& aGroupAddr )
+ {
+ LOG( "CCRSock::JoinGroup()" );
+
+ TPckgBuf<TIp6Mreq> request;
+ request().iAddr = aGroupAddr.Ip6Address();
+ request().iInterface = 0;
+ return iSocket.SetOpt( KSoIp6JoinGroup, KSolInetIp, request );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSock::SendData
+// Initiates async data sending
+// -----------------------------------------------------------------------------
+//
+void CCRSock::SendData( const TDesC8& aDataThatIsSentOverSocket )
+ {
+#if defined ( LIVE_TV_FILE_TRACE ) || defined ( LIVE_TV_RDEBUG_TRACE )
+ if ( iProtoTCP && aDataThatIsSentOverSocket.Length() &&
+ aDataThatIsSentOverSocket[0] != ( TUint8 )( '$' ) )
+ {
+ LOG2("CCRSock::SendData(), id: %d, len: %d",
+ iSockId, aDataThatIsSentOverSocket.Length() );
+ TChar c;
+ TName d;
+ for ( TInt i( 0 ); i < aDataThatIsSentOverSocket.Length(); i++ )
+ {
+ c = aDataThatIsSentOverSocket[i];
+ d.Append( c );
+ if ( ( i > 0 ) && ( i % 80 ) == 0 )
+ {
+ LOG1( ">%S<", &d );
+ d.Zero();
+ }
+ }
+
+ LOG1( ">%S<", &d );
+ }
+#endif
+
+ // Data to socket
+ if ( !IsActive() )
+ {
+ CopySendData( aDataThatIsSentOverSocket );
+ if ( iProtoTCP )
+ {
+ iSocket.Write( iSentData, iStatus );
+ iSockStatus = CCRSock::ESending;
+ SetActive();
+ }
+ else
+ {
+ if ( iToAddr.Port() != 0 )
+ {
+ iSocket.SendTo( iSentData, iToAddr, 0, iStatus, iSentDataLen );
+ iSockStatus = CCRSock::ESending;
+ SetActive();
+ }
+ else
+ {
+ LOG1( "CCRSock::SendData(), Discarding send, id: %d" ,iSockId );
+ }
+ }
+ }
+ else
+ {
+ LOG2( "CCRSock::SendData(), id: %d, Already active, Dumped packet, len: %d" ,
+ iSockId, aDataThatIsSentOverSocket.Length() );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSock::SockStatus
+// returns status
+// -----------------------------------------------------------------------------
+//
+CCRSock::TCRSockStatus CCRSock::SockStatus() const
+ {
+ return iSockStatus;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSock::ConnectedAddr
+// returns endpoint addr of this sock
+// -----------------------------------------------------------------------------
+//
+TInetAddr CCRSock::ConnectedAddr( void )
+ {
+ TInetAddr addr;
+ iSocket.RemoteName( addr );
+ return addr;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSock::LocalAddr
+// returns local addr of this sock
+// -----------------------------------------------------------------------------
+//
+TInetAddr CCRSock::LocalAddr( void )
+ {
+ TInetAddr addr;
+ iSocket.LocalName( addr );
+ return addr;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSock::SetToAddr
+// sets "to" addr of this sock
+// -----------------------------------------------------------------------------
+//
+void CCRSock::SetToAddr( const TInetAddr &aAddr )
+ {
+ LOG( "CCRSock::SetToAddr() in" );
+ iToAddr = aAddr;
+
+#if defined ( LIVE_TV_FILE_TRACE ) || defined ( LIVE_TV_RDEBUG_TRACE )
+ TName an_addr;
+ iToAddr.Output( an_addr );
+ LOG3( "CCRSock::SetToAddr(), id: %d, addr: %S, port: %d", iSockId, &an_addr, aAddr.Port() );
+#endif
+
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSock::Socket
+// -----------------------------------------------------------------------------
+RSocket& CCRSock::Socket()
+ {
+ return iSocket;
+ }
+
+// -----------------------------------------------------------------------------
+// ----------- here begins implementation of "SockReader" helper class----------
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+
+// -----------------------------------------------------------------------------
+// CCRSockReader::NewL
+// Construction startpoint
+// -----------------------------------------------------------------------------
+//
+CCRSockReader* CCRSockReader::NewL(
+ CCRSock& aSock,
+ RConnection& aConnection, RSocketServ& aSockServer )
+ {
+ CCRSockReader* self = new ( ELeave ) CCRSockReader(
+ aSock, aConnection, aSockServer );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+// -----------------------------------------------------------------------------
+// CCRSockReader::CCRSockReader
+// Default constructor
+// -----------------------------------------------------------------------------
+//
+CCRSockReader::CCRSockReader(
+ CCRSock& aSock, RConnection& aConnection,
+ RSocketServ& aSockServer )
+ : CActive( EPriorityStandard ),
+ iSock( aSock ),
+ iConnection( aConnection ),
+ iSockServer( aSockServer )
+ {
+ }
+// -----------------------------------------------------------------------------
+// CCRSockReader::ConstructL
+// Actual constructor
+// -----------------------------------------------------------------------------
+//
+void CCRSockReader::ConstructL()
+ {
+ LOG( "CCRSockReader::ConstructL()" );
+
+ // Add self to active scheduler
+ CActiveScheduler::Add( this );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSock::~CCRSockReader
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CCRSockReader::~CCRSockReader()
+ {
+ LOG( "CCRSockReader::~CCRSockReader()" );
+ Cancel();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSockReader::RunL
+// Work-horse
+// -----------------------------------------------------------------------------
+//
+void CCRSockReader::RunL()
+ {
+#if defined ( LIVE_TV_FILE_TRACE ) || defined ( LIVE_TV_RDEBUG_TRACE )
+ if ( iSock.iProtoTCP && iStatus.Int() != KErrNone )
+ {
+ LOG2( "CCRSockReader::RunL(), id: %d, status: %d", iSock.iSockId, iStatus.Int() );
+ }
+#endif
+
+ switch ( iStatus.Int() )
+ {
+ case KErrNone:
+ {
+#if defined( LIVE_TV_FILE_TRACE ) || defined( LIVE_TV_RDEBUG_TRACE )
+ if ( !iSock.iProtoTCP )
+ {
+ recvBytes += iSock.iReceivedData.Length();
+ recvCount ++;
+ if ( ( recvCount % 50 ) == 0 )
+ {
+ LOG3( "CCRSockReader::RunL(), recvCount: %d, recvBytes: %d, id: %d",
+ recvCount, recvBytes, iSock.iSockId );
+ TName an_addr;
+ iSock.iFromAddr.Output( an_addr );
+ TInt a_byte2 = iSock.iReceivedData[2];
+ TInt a_byte3 = iSock.iReceivedData[3];
+ LOG3( "CCRSockReader::RunL(), Addr %S, port: %d, last seq: %d",
+ &an_addr, iSock.iFromAddr.Port(), ( a_byte2 * 255 ) + a_byte3 );
+ }
+ }
+#endif // LIVE_TV_FILE_TRACE || LIVE_TV_RDEBUG_TRACE
+
+ iSock.iObserver.DataReceived( iSock.iSockId, iSock.iReceivedData );
+ IssueRead();
+ }
+ break;
+
+ default: // error cases
+ {
+ LOG2( "CCRSockReader::RunL(), id: %d, status: %d", iSock.iSockId, iStatus.Int() );
+ iSock.iSockStatus = CCRSock::EFailed;
+ iSock.iObserver.SockStatusChange(
+ iSock.iSockId, iSock.iSockStatus, iStatus.Int() );
+ }
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSockReader::IssueRead
+// Asks for more data
+// -----------------------------------------------------------------------------
+//
+void CCRSockReader::IssueRead()
+ {
+ if ( IsActive() )
+ {
+ LOG( "CCRSockReader::IssueRead(), IsActive! return" );
+ return;
+ }
+
+ iSock.iReceivedData.Zero();
+ if ( iSock.iProtoTCP )
+ {
+ iSock.iSocket.RecvOneOrMore( iSock.iReceivedData, 0, iStatus,
+ iSock.iReceivedDataLen );
+ }
+ else
+ {
+ iSock.iSocket.RecvFrom( iSock.iReceivedData, iSock.iFromAddr, 0, iStatus );
+ }
+
+ SetActive();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRSockReader::DoCancel
+// Cancels outstanding operations
+// -----------------------------------------------------------------------------
+//
+void CCRSockReader::DoCancel()
+ {
+ LOG( "CCRSockReader::DoCancel()" );
+ // CCRSock::DoCancel() has already called CancelAll to socket so no need to do it here
+ }
+// -----------------------------------------------------------------------------
+// CCRSockReader::RunError
+// If anything goes wrong
+// -----------------------------------------------------------------------------
+//
+TInt CCRSockReader::RunError( TInt aError )
+ {
+ LOG1( "CCRSockReader::RunError(), aError: %d, return KErrNone", aError );
+ ( void )aError; // Prevent compiler warning
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// ----------- here ends implementation of "SockReader" helper class----------
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRStreamingSession.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,865 @@
+/*
+* 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: Class for streaming session. Owns a source, number of buffers*
+*/
+
+
+
+
+// INCLUDES
+#include "VideoServiceUtilsConf.hrh"
+#include "CCRStreamingSession.h"
+#include "CCRRtspSink.h"
+#include "CCRNullSink.h"
+#include "CCRPacketBuffer.h"
+#include <ipvideo/CRTypeDefs.h>
+#include "CCRRtspPacketSource.h"
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+#include "CCRXpsSink.h"
+#include "CCRRtpRecordSink.h"
+#include "CCRRtpFileSource.h"
+#include "CCRNullSource.h"
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+#include "MCRStreamObserver.h"
+#include "CCRPacketSinkBase.h"
+#include "CCRConnection.h"
+#include "CCRengine.h"
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+const TInt KMaxRtspPackets( 400 );
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+const TInt KMaxRtpPackets( 500 );
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRStreamingSession::NewL
+//
+// -----------------------------------------------------------------------------
+//
+CCRStreamingSession* CCRStreamingSession::NewL(
+ RSocketServ& aSockServer,
+ CCRConnection* aConnection,
+ CCREngine& aEngine )
+ {
+ CCRStreamingSession* self = new( ELeave ) CCRStreamingSession(
+ aSockServer, aConnection, aEngine );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRStreamingSession::CCRStreamingSession
+//
+// -----------------------------------------------------------------------------
+//
+CCRStreamingSession::CCRStreamingSession(
+ RSocketServ& aSockServer,
+ CCRConnection* aConnection,
+ CCREngine& aEngine )
+ : iSockServer( aSockServer ),
+ iConnection( aConnection ),
+ iEngine( aEngine )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRStreamingSession::ConstructL
+//
+// -----------------------------------------------------------------------------
+//
+void CCRStreamingSession::ConstructL()
+ {
+ LOG( "CCRStreamingSession::ConstructL()" );
+
+ // Note, quite high priority
+ iCleanUp = new ( ELeave ) CAsyncCallBack( CActive::EPriorityStandard );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRStreamingSession::~CCREStreamingSession
+//
+// -----------------------------------------------------------------------------
+//
+CCRStreamingSession::~CCRStreamingSession()
+ {
+ LOG( "CCRStreamingSession::~CCRStreamingSession()" );
+
+ delete iCleanUp;
+ iSinks.ResetAndDestroy();
+ iSinksToDelete.Reset();
+ delete iSource;
+ delete iBuffer;
+ iConnection = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRStreamingSession::OpenSourceL
+// Opens RTSP streaming source.
+// -----------------------------------------------------------------------------
+//
+void CCRStreamingSession::OpenSourceL(
+ const SCRRtspParams& aParams,
+ const TDesC& aSessionDefinition )
+ {
+ LOG( "CCRStreamingSession::OpenSourceL(), RTSP Url" )
+
+ if ( !iSource && iConnection )
+ {
+ iSourceChecksum = SourceDefinition( aSessionDefinition );
+ iSource = CCRRtspPacketSource::NewL(
+ aParams, *iConnection, iSockServer, *this, *this );
+ iSource->RegisterConnectionObs( &iEngine );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRStreamingSession::OpenSourceL
+// Opens RTP clip streaming source.
+// -----------------------------------------------------------------------------
+//
+void CCRStreamingSession::OpenSourceL(
+ const SCRRtpPlayParams& aParams,
+ CRtpClipHandler*& aClipHandler,
+ const TDesC& aSessionDefinition )
+ {
+ LOG( "CCRStreamingSession::OpenSourceL(), RTP clip" )
+
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+
+ if ( !iSource )
+ {
+ iSourceChecksum = SourceDefinition( aSessionDefinition );
+ iBuffer = CCRPacketBuffer::NewL( KMaxRtpPackets );
+ iSource = CCRRtpFileSource::NewL( aParams, aClipHandler, *this, *this );
+ iSource->SetBuffer( iBuffer );
+ }
+
+#else // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ ( void )aParams;
+ ( void )aClipHandler;
+ ( void )aSessionDefinition;
+ User::Leave( KErrNotSupported );
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ }
+
+// -----------------------------------------------------------------------------
+// CCRStreamingSession::OpenSourceL
+// Opens RTP clip streaming source.
+// -----------------------------------------------------------------------------
+//
+void CCRStreamingSession::OpenSourceL(
+ const RFile& aRtpHandle,
+ CRtpClipHandler*& aClipHandler,
+ const TDesC& aSessionDefinition )
+ {
+ LOG( "CCRStreamingSession::OpenSourceL(), RTP handle" )
+
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+
+ if ( !iSource )
+ {
+ iSourceChecksum = SourceDefinition( aSessionDefinition );
+ iBuffer = CCRPacketBuffer::NewL( KMaxRtpPackets );
+ iSource = CCRRtpFileSource::NewL( aRtpHandle, aClipHandler, *this, *this );
+ iSource->SetBuffer( iBuffer );
+ }
+
+#else // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ ( void )aRtpHandle;
+ ( void )aClipHandler;
+ ( void )aSessionDefinition;
+ User::Leave( KErrNotSupported );
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ }
+
+// -----------------------------------------------------------------------------
+// CCRStreamingSession::OpenSourceL
+// Opens DVB-H live streaming source.
+// -----------------------------------------------------------------------------
+//
+void CCRStreamingSession::OpenSourceL(
+ const SCRLiveParams& /*aLiveParams*/,
+ const TDesC& /*aSessionDefinition*/ )
+ {
+ LOG( "CCRStreamingSession::OpenSourceL(), DVB-H live" )
+
+ User::Leave( KErrNotSupported );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRStreamingSession::OpenSourceL
+// Opens RTP clip as a live streaming source.
+// -----------------------------------------------------------------------------
+//
+void CCRStreamingSession::OpenSourceL( const TDesC& aSessionDefinition )
+ {
+ LOG( "CCRStreamingSession::OpenSourceL(), Null" )
+
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+
+ if ( !iSource )
+ {
+ iSourceChecksum = SourceDefinition( aSessionDefinition );
+ iBuffer = CCRPacketBuffer::NewL( KMaxRtpPackets );
+ iSource = CCRNullSource::NewL( aSessionDefinition, *this, *this );
+ iSource->SetBuffer( iBuffer );
+ }
+
+#else // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ ( void )aSessionDefinition;
+ User::Leave( KErrNotSupported );
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ }
+
+// -----------------------------------------------------------------------------
+// CCRStreamingSession::SourceDefinition
+//
+// -----------------------------------------------------------------------------
+//
+TUint CCRStreamingSession::SourceDefinition( const TDesC& aName )
+ {
+ TUint checkSum( 0 );
+ for ( TInt i( aName.Length() - 1 ); i >= 0; i-- )
+ {
+ checkSum += aName[i];
+ }
+
+ // And for rtsp packet source do use different id
+ // if udp is blocked and we're using tcp then.
+ if ( iSource && iSource->Id() == ECRRtspSourceId &&
+ iConnection &&
+ iConnection->GetHeuristic ( CCRConnection::EUdpStreamingBlocked ) )
+ {
+ checkSum++;
+ }
+
+ return checkSum;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRStreamingSession::SourceChecksum
+//
+// -----------------------------------------------------------------------------
+//
+TUint CCRStreamingSession::SourceChecksum()
+ {
+ return iSourceChecksum;
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::CreateAndSetBufferL
+//
+//-----------------------------------------------------------------------------
+//
+void CCRStreamingSession::CreateAndSetBufferL()
+ {
+ if ( iSource && iBuffer == NULL )
+ {
+ iBuffer = CCRPacketBuffer::NewL( KMaxRtspPackets );
+ iSource->SetBuffer( iBuffer );
+ }
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::CreateRtspSinkL
+//
+//-----------------------------------------------------------------------------
+//
+void CCRStreamingSession::CreateRtspSinkL( const TInt& aLoopbackPort )
+ {
+ LOG( "CCRStreamingSession::CreateRtspSinkL()" )
+
+ if ( iConnection )
+ {
+ // Only one RTSP sink at the time
+ DeleteSink( ECRRtspSinkId );
+
+ // New sink
+ CCRRtspSink* sink = CCRRtspSink::NewL(
+ *iConnection, iSockServer, ECRRtspSinkId, aLoopbackPort, *this );
+ CleanupStack::PushL( sink );
+ User::LeaveIfError( iSinks.Append( sink ) );
+ CleanupStack::Pop( sink );
+ }
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::CreateXpsSinkL
+//
+//-----------------------------------------------------------------------------
+//
+void CCRStreamingSession::CreateXpsSinkL()
+ {
+ LOG( "CCRStreamingSession::CreateXpsSinkL()" )
+
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+
+ CCRXpsSink* sink = CCRXpsSink::NewL( ECRXpsSinkId, *this );
+ CleanupStack::PushL( sink );
+ User::LeaveIfError( iSinks.Append( sink ) );
+ CleanupStack::Pop( sink );
+#else // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ User::Leave( KErrNotSupported );
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::Create3gpRecordSinkL
+//
+//-----------------------------------------------------------------------------
+//
+void CCRStreamingSession::Create3gpRecordSinkL(
+ const SCRRecordParams& /*aRecordParams*/ )
+ {
+ LOG( "CCRStreamingSession::Create3gpRecordSinkL()" )
+
+ User::Leave( KErrNotSupported );
+ /*
+ CCR3gpRecordSink* sink = CCR3gpRecordSink::NewL( ECR3gpRecSinkId, *this );
+ CleanupStack::PushL( sink );
+ User::LeaveIfError( iSinks.Append( sink ) );
+ CleanupStack::Pop( sink );
+ */
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::CreateRtpRecordSinkL
+//
+//-----------------------------------------------------------------------------
+//
+void CCRStreamingSession::CreateRtpRecordSinkL(
+ const SCRRecordParams& aRecordParams,
+ CRtpClipHandler*& aClipHandler )
+ {
+ LOG( "CCRStreamingSession::CreateRtpRecordSinkL()" )
+
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ // Create record sink
+ CCRRtpRecordSink* sink = CCRRtpRecordSink::NewL(
+ aRecordParams, ECRRtpRecSinkId, *this, &iEngine, aClipHandler );
+ CleanupStack::PushL( sink );
+ User::LeaveIfError( iSinks.Append( sink ) );
+ CleanupStack::Pop( sink );
+
+#else // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ ( void )aRecordParams;
+ ( void )aClipHandler;
+ User::Leave( KErrNotSupported );
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::PostActionL
+//
+//-----------------------------------------------------------------------------
+//
+void CCRStreamingSession::PostActionL()
+ {
+ User::LeaveIfNull( iSource );
+ iSource->PostActionL();
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::PlayCommand
+//
+//-----------------------------------------------------------------------------
+//
+TInt CCRStreamingSession::PlayCommand(
+ const TReal& aStartPos,
+ const TReal& aEndPos )
+ {
+ if ( iSource )
+ {
+ return iSource->Play( aStartPos, aEndPos );
+ }
+
+ return KErrCompletion;
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::PauseCommand
+//
+//-----------------------------------------------------------------------------
+//
+TInt CCRStreamingSession::PauseCommand()
+ {
+ if ( iSource )
+ {
+ return iSource->Pause();
+ }
+
+ return KErrCompletion;
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::StopCommand
+//
+//-----------------------------------------------------------------------------
+//
+TInt CCRStreamingSession::StopCommand()
+ {
+ if ( iSource && iSinks.Count() >= 1 )
+ {
+ return iSource->Stop();
+ }
+
+ return KErrCompletion;
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::SetPosition
+//
+//-----------------------------------------------------------------------------
+//
+TInt CCRStreamingSession::SetPosition( const TInt64 aPosition )
+ {
+ if ( iSource )
+ {
+ return iSource->SetPosition( aPosition );
+ }
+
+ return KErrCompletion;
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::GetPosition
+//
+//-----------------------------------------------------------------------------
+//
+TInt CCRStreamingSession::GetPosition( TInt64& aPosition, TInt64& aDuration )
+ {
+ if ( iSource )
+ {
+ return iSource->GetPosition( aPosition, aDuration );
+ }
+
+ return KErrCompletion;
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::PauseCommand
+//
+//-----------------------------------------------------------------------------
+//
+TInt CCRStreamingSession::PauseCommand( const TCRSinkId& aSinkId )
+ {
+ // Pauses current sink action
+ for ( TInt i( iSinks.Count() - 1 ); i >= 0; i-- )
+ {
+ if ( aSinkId == iSinks[i]->Id() )
+ {
+ return iSinks[i]->Pause();
+ }
+ }
+
+ return KErrCompletion;
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::RestoreCommand
+//
+//-----------------------------------------------------------------------------
+//
+TInt CCRStreamingSession::RestoreCommand( const TCRSinkId& aSinkId )
+ {
+ // Pauses current sink action
+ for ( TInt i( iSinks.Count() - 1 ); i >= 0; i-- )
+ {
+ if ( aSinkId == iSinks[i]->Id() )
+ {
+ return iSinks[i]->Restore();
+ }
+ }
+
+ return KErrCompletion;
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::StopCommand
+//
+//-----------------------------------------------------------------------------
+//
+TInt CCRStreamingSession::StopCommand( const TCRSinkId& aSinkId )
+ {
+ // Stop current sink action
+ for ( TInt i( iSinks.Count() - 1 ); i >= 0; i-- )
+ {
+ if ( aSinkId == iSinks[i]->Id() )
+ {
+ iSinks[i]->Stop();
+ return KErrNone;
+ }
+ }
+
+ return KErrCompletion;
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::TransferSink
+//
+//-----------------------------------------------------------------------------
+//
+TInt CCRStreamingSession::TransferSink(
+ const TCRSinkId& aSinkId,
+ CCRStreamingSession& aTargetSession )
+ {
+ LOG1( "CCRStreamingSession::TransferSink(), aSinkId: %d", aSinkId );
+
+ for ( TInt i( iSinks.Count() - 1 ); i >= 0; i-- )
+ {
+ if ( iSinks[i]->Id() == aSinkId )
+ {
+ TInt err( aTargetSession.AddNewSink( iSinks[i] ) );
+ if ( !err )
+ {
+ iBuffer->RemoveSink( iSinks[i] );
+ iSinks.Remove( i );
+ }
+
+ return err;
+ }
+ }
+
+ return KErrCompletion;
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::AddNewSink
+//
+//-----------------------------------------------------------------------------
+//
+TInt CCRStreamingSession::AddNewSink( CCRPacketSinkBase* aSink )
+ {
+ LOG1( "CCRStreamingSession::AddNewSink(), aSink->Id: %d", aSink->Id() );
+
+ for ( TInt i( iSinks.Count() - 1 ); i >= 0; i-- )
+ {
+ if ( aSink->Id() == iSinks[i]->Id() )
+ {
+ LOG( "CCRStreamingSession::AddNewSink(), Sink already exist !" );
+ return KErrInUse;
+ }
+ }
+
+ // Add new sink
+ TInt err( iSinks.Append( aSink ) );
+ if ( !err )
+ {
+ err = iBuffer->AddSink( iSinks[iSinks.Count() - 1] );
+ }
+
+ return err;
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::ClipHandlerUsed
+//
+//-----------------------------------------------------------------------------
+//
+TBool CCRStreamingSession::ClipHandlerUsed()
+ {
+ // Used in source
+ if ( iSource && iSource->Id() == ECRRtpSourceId )
+ {
+ return ETrue;
+ }
+
+ // Used in any Sink
+ for ( TInt i( iSinks.Count() - 1 ); i >= 0; i-- )
+ {
+ if ( iSinks[i]->Id() == ECRRtpRecSinkId )
+ {
+ return ETrue;
+ }
+ }
+
+ return EFalse;
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::CreateNullSinkL
+//
+//-----------------------------------------------------------------------------
+//
+void CCRStreamingSession::CreateNullSinkL()
+ {
+ CCRNullSink* sink = CCRNullSink::NewL( ECRNullSinkId, *this );
+ sink->RegisterConnectionObs( &iEngine );
+ CleanupStack::PushL( sink );
+ User::LeaveIfError( iSinks.Append( sink ) );
+ CleanupStack::Pop( sink );
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::InitializeSinks
+//
+//-----------------------------------------------------------------------------
+//
+void CCRStreamingSession::InitializeSinks()
+ {
+ if ( iSource && iBuffer )
+ {
+ TPtrC8 sdp( NULL, 0 );
+ TInt err( iSource->GetSdp( sdp ) );
+ if ( err )
+ {
+ LOG1( "CCRStreamingSession::InitializeSinks(), GetSdp() Failed: %d", err );
+ SourceStop();
+ }
+ else
+ {
+ for ( TInt i( 0 ); i < iSinks.Count(); i++ )
+ {
+ TRAP( err, iSinks[i]->SetSdpL( sdp ) );
+ if ( err )
+ {
+ LOG1( "CCRStreamingSession::InitializeSinks(), SetSdpL() Failed: %d", err );
+ SinkStops( iSinks[i]->Id() );
+ return;
+ }
+
+ iSinks[i]->SetBuffer( iBuffer );
+ err = iBuffer->AddSink( iSinks[i] );
+ if ( err )
+ {
+ LOG1( "CCRStreamingSession::InitializeSinks(), AddSink() Failed: %d", err );
+ SourceStop();
+ return;
+ }
+ }
+
+ iEngine.ConnectionStatusChange(
+ SourceChecksum(), MCRConnectionObserver::ECRSdpAvailable, KErrNone );
+ }
+ }
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::SetSeqAndTs()
+//-----------------------------------------------------------------------------
+//
+void CCRStreamingSession::SetSeqAndTs()
+ {
+ if ( iSource )
+ {
+ TUint audioSeq( 0 );
+ TUint audioTS( 0 );
+ TUint videoSeq( 0 );
+ TUint videoTS( 0 );
+ TReal lowerRange( KRealZero );
+ TReal upperRange( KRealMinusOne );
+
+ iSource->GetRange( lowerRange,upperRange );
+ iSource->SeqAndTS( audioSeq, audioTS, videoSeq, videoTS );
+
+ for ( TInt j( 0 ); j < iSinks.Count(); j++ )
+ {
+ if ( !( lowerRange == KRealZero && upperRange == KRealMinusOne ) )
+ {
+ iSinks[j]->SetRange( lowerRange,upperRange );
+ }
+
+ iSinks[j]->SetSeqAndTS( audioSeq, audioTS, videoSeq, videoTS );
+ }
+ }
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::SinkStops()
+// So, a sink wants to quit. we can't just delete it here as return. Statement
+// would then take us to deleted instance: put up a cleanup CAsyncCallBack and
+// return.
+//-----------------------------------------------------------------------------
+//
+void CCRStreamingSession::SinkStops( const TCRSinkId& aSinkId )
+ {
+ LOG1( "CCRStreamingSession::SinkStops(), aSinkId: %d", aSinkId );
+
+ // InsertInSignedKeyOrderL checks for duplicate, if there is already
+ // entry for that sink, the array will remain unchanged
+ TRAPD( err, iSinksToDelete.InsertInSignedKeyOrderL( aSinkId ) );
+ if ( err )
+ {
+ LOG1( "CCRStreamingSession::SinkStops(), InsertInSignedKeyOrderL leaved %d", err );
+ }
+
+ // If not already active and sinks to delete?
+ if ( !iCleanUp->IsActive() && iSinksToDelete.Count() )
+ {
+ TCallBack cb( SinkStopCallBack, this );
+ iCleanUp->Set( cb );
+ iCleanUp->CallBack();
+ }
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::SourceRestore()
+//-----------------------------------------------------------------------------
+//
+void CCRStreamingSession::SourceRestore()
+ {
+ if ( iSource )
+ {
+ iSource->Restore();
+ }
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::SourceStop()
+//-----------------------------------------------------------------------------
+//
+void CCRStreamingSession::SourceStop()
+ {
+ // Session is useless without a source so ask engine to clean it all up
+ iEngine.SessionStop( this );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRStreamingSession::StatusChanged
+//
+// -----------------------------------------------------------------------------
+//
+void CCRStreamingSession::StatusChanged(
+ MCRPacketSource::TCRPacketSourceState aStatus )
+ {
+ LOG1( "CCRStreamingSession::StatusChanged(), aStatus: %d", aStatus );
+
+ switch ( aStatus )
+ {
+ case MCRPacketSource::ERtpStateIdle:
+ break;
+
+ case MCRPacketSource::ERtpStateSdpAvailable:
+ TRAPD( err, CreateAndSetBufferL() );
+ if ( err )
+ {
+ LOG1( "CCRStreamingSession::StatusChanged(), CreateAndSetBuffers leaved: %d", err );
+ }
+
+ InitializeSinks();
+ break;
+
+ case MCRPacketSource::ERtpStateSeqAndTSAvailable:
+ SetSeqAndTs();
+ break;
+
+ case MCRPacketSource::ERtpStateSetupRepply:
+ case MCRPacketSource::ERtpStatePlaying:
+ {
+ for ( TInt j( iSinks.Count() - 1 ); j >= 0; j-- )
+ {
+ iSinks[j]->StatusChanged( aStatus ) ;
+ }
+ }
+ break;
+
+ case MCRPacketSource::ERtpStateClosing:
+ SourceStop();
+ break;
+
+ default:
+ // None.
+ break;
+ }
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::SinkStopCallBack()
+//
+//-----------------------------------------------------------------------------
+//
+TInt CCRStreamingSession::SinkStopCallBack( TAny* aThis )
+ {
+ CCRStreamingSession* self = static_cast<CCRStreamingSession*>( aThis );
+ LOG1( "CCRStreamingSession::SinkStopCallBack(), iSinksToDelete count: %d",
+ self->iSinksToDelete.Count() );
+ self->DoSinkStop();
+ return self->iSinksToDelete.Count();
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::DoSinkStop()
+//
+//-----------------------------------------------------------------------------
+//
+void CCRStreamingSession::DoSinkStop( void )
+ {
+ LOG( "CCRStreamingSession::DoSinkStop() in" );
+
+ for ( TInt i( iSinksToDelete.Count() - 1 ); i >= 0; i-- )
+ {
+ for ( TInt j( iSinks.Count() - 1 ); j >= 0; j-- )
+ {
+ if ( iSinks[j]->Id() == iSinksToDelete[i] )
+ {
+ TInt remainingSinks( 0 );
+ if ( iBuffer )
+ {
+ // If we never got sdp, we never had a buffer
+ remainingSinks = iBuffer->RemoveSink( iSinks[j] );
+ }
+
+ if ( remainingSinks < 1 )
+ {
+ // No sinks remaing for our buffers, I'm feeling useless
+ if ( iSource )
+ {
+ iSource->Stop();
+ }
+ }
+
+ delete iSinks[j];
+ iSinks[j] = NULL;
+ iSinks.Remove( j );
+ }
+ }
+ }
+
+ iSinksToDelete.Reset();
+ LOG( "CCRStreamingSession::DoSinkStop() out" );
+ }
+
+//-----------------------------------------------------------------------------
+// CCRStreamingSession::DeleteSink
+//
+//-----------------------------------------------------------------------------
+//
+void CCRStreamingSession::DeleteSink( const TCRSinkId& aSinkId )
+ {
+ for ( TInt i( iSinks.Count() - 1 ); i >= 0 ; i-- )
+ {
+ if ( iSinks[i]->Id() == aSinkId )
+ {
+ // Remove sink from buffer
+ if ( iBuffer )
+ {
+ iBuffer->RemoveSink( iSinks[i] );
+ }
+
+ // Delete sink
+ delete iSinks[i];
+ iSinks[i] = NULL;
+ iSinks.Remove( i );
+ LOG2( "CCRStreamingSession::DeleteSink(), deleted index: %d, aSinkId: %d", i, aSinkId );
+ }
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRTimer.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,94 @@
+/*
+* 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: Wrapper for CTimer*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCRTimer.h"
+#include "MCRTimerObserver.h"
+
+// CONSTANTS
+// None
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRTimer::NewL()
+// -----------------------------------------------------------------------------
+//
+CCRTimer* CCRTimer::NewL( const TInt aPriority, MCRTimerObserver& aTimerObserver )
+ {
+ CCRTimer* self = CCRTimer::NewLC( aPriority, aTimerObserver );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRTimer::NewLC()
+// -----------------------------------------------------------------------------
+//
+CCRTimer* CCRTimer::NewLC( const TInt aPriority, MCRTimerObserver& aTimerObserver )
+ {
+ CCRTimer* self = new (ELeave) CCRTimer( aPriority, aTimerObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRTimer::CCRTimer()
+// -----------------------------------------------------------------------------
+//
+CCRTimer::CCRTimer( const TInt aPriority, MCRTimerObserver& aTimerObserver )
+ : CTimer( aPriority ), iObserver( aTimerObserver )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRTimer::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CCRTimer::ConstructL()
+ {
+ CTimer::ConstructL();
+ CActiveScheduler::Add( this );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRTimer::~CCRTimer()
+// -----------------------------------------------------------------------------
+//
+CCRTimer::~CCRTimer()
+ {
+ Cancel();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRTimer::RunL()
+// Timer request has completed, so notify the timer's owner.
+// -----------------------------------------------------------------------------
+//
+void CCRTimer::RunL()
+ {
+ if ( iStatus == KErrNone )
+ {
+ iObserver.TimerExpired( this );
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRXpsSink.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,858 @@
+/*
+* 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: Class that takes packet from the buffer and forward them thrue*
+*/
+
+
+
+
+// INCLUDES
+#include "CCRXpsSink.h"
+#include "CCRPacketBuffer.h"
+#include "CCRStreamingSession.h"
+#include <ipvideo/CDvrSdpParser.h>
+#include "CCRTimer.h"
+#include "CRtpPacket.h"
+#include "CRtpTsConverter.h"
+#include <CXPSPacketSink.h>
+
+// CONSTANTS
+_LIT( KCRXpsServerName, "IpVideoXps" );
+_LIT8( KAttributeDefRange, "a=range:npt=0-86400.0" );
+#ifdef VIA_FEA_IPTV_USE_IPDC
+_LIT8( KMtvAvc, "X-MTV-AVC" );
+_LIT8( KHxAvc1, "X-HX-AVC1" );
+#endif // VIA_FEA_IPTV_USE_IPDC
+const TInt KRangeIdentifierLen( 8 );
+const TInt KXpsBufferedPackets( 300 ); // about 3s
+const TInt KXpsOverflowDelay( 300 * 1000 ); // 300ms
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRXpsSink::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCRXpsSink* CCRXpsSink::NewL(
+ CCRStreamingSession::TCRSinkId aSinkId,
+ CCRStreamingSession& aOwningSession )
+ {
+ CCRXpsSink* self = new( ELeave )
+ CCRXpsSink( aSinkId, aOwningSession );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRXpsSink::CCRXpsSink
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCRXpsSink::CCRXpsSink(
+ CCRStreamingSession::TCRSinkId aSinkId,
+ CCRStreamingSession& aOwningSession )
+ : CCRPacketSinkBase( aOwningSession, aSinkId ),
+ iWaitPlayer( KErrNotFound ),
+ iRequested( KErrNotFound ),
+ iXpsResetOk( EFalse ),
+ iAudioStreamId( KErrNotFound ),
+ iVideoStreamId( KErrNotFound ),
+ iTitleStreamId( KErrNotFound )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRXpsSink::ConstructL
+// 2nd phase.
+// -----------------------------------------------------------------------------
+//
+void CCRXpsSink::ConstructL()
+ {
+ LOG( "CCRXpsSink::ConstructL() in" );
+
+ iRtpPacket = CRtpPacket::NewL();
+ iPacketSink = CXPSPacketSink::New();
+ LOG1( "CCRXpsSink::ConstructL(), iPacketSink: %d", iPacketSink );
+ User::LeaveIfNull( iPacketSink );
+ TInt err( iPacketSink->Init( KCRXpsServerName, this ) );
+ if ( err )
+ {
+ LOG1( "CCRXpsSink::ConstructL(), iPacketSink->Init() err: %d", err );
+ User::Leave( err );
+ }
+
+ LOG( "CCRXpsSink::ConstructL() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRXpsSink::~CCRXpsSink
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRXpsSink::~CCRXpsSink()
+ {
+ LOG( "CCRXpsSink::~CCRXpsSink()" );
+
+ // Delete variables
+ StopTimer();
+ delete iPacketSink;
+ delete iAudioConv;
+ delete iVideoConv;
+ delete iTitleConv;
+ delete iRtpPacket;
+
+#ifdef VIA_FEA_IPTV_USE_IPDC
+ delete iVideoDepacketizer;
+#endif // VIA_FEA_IPTV_USE_IPDC
+ }
+
+// -----------------------------------------------------------------------------
+// CCRXpsSink::SetSdpL
+// Sets SDP, parses it and initiates XPS.
+// -----------------------------------------------------------------------------
+//
+void CCRXpsSink::SetSdpL( const TDesC8& aSdp )
+ {
+ LOG1( "CCRXpsSink::SetSdpL(), SDP len: %d", aSdp.Length() );
+
+#if defined( LIVE_TV_RDEBUG_TRACE ) || defined( LIVE_TV_FILE_TRACE )
+ LOG( "CCRXpsSink::SetSdpL(), SDP content:" );
+ TName d( KNullDesC );
+ for ( TInt i( 0 ); i < aSdp.Length(); i++ )
+ {
+ TChar c = aSdp[i];
+ d.Append( c );
+ if ( ( i > 0 ) && ( i % 80 ) == 0 )
+ {
+ LOG1( ">%S<", &d );
+ d.Zero();
+ }
+ }
+
+ LOG1( ">%S<", &d );
+#endif // LIVE_TV_RDEBUG_TRACE || LIVE_TV_FILE_TRACE
+
+ if ( iWaitPlayer != KErrNotFound )
+ {
+ LOG( "CCRXpsSink::SetSdpL(), SDP already set !" );
+ return;
+ }
+
+ // SDP parser
+ CDvrSdpParser* sdpParser = CDvrSdpParser::NewLC();
+ sdpParser->TryParseL( aSdp );
+
+ // TS converter
+ delete iAudioConv; iAudioConv = NULL;
+ iAudioConv = CRtpTsConverter::NewL( sdpParser->AudioTimerGranularity() );
+ LOG1( "CCRXpsSink::SetSdpL(), AudioTimerGranularity: %d",
+ sdpParser->AudioTimerGranularity() );
+
+ delete iVideoConv; iVideoConv = NULL;
+ iVideoConv = CRtpTsConverter::NewL( sdpParser->VideoTimerGranularity() );
+ LOG1( "CCRXpsSink::SetSdpL(), VideoTimerGranularity: %d",
+ sdpParser->VideoTimerGranularity() );
+
+ delete iTitleConv; iTitleConv = NULL;
+
+ // Streams count
+ TInt streams( 0 );
+ const CDvrSdpParser::TDvrPacketProvidings providings(
+ sdpParser->SupportedContent() );
+ if ( providings == CDvrSdpParser::EDvrAudioOnly ||
+ providings == CDvrSdpParser::EDvrVideoOnly )
+ {
+ streams = 1;
+ }
+ if ( providings == CDvrSdpParser::EDvrBothAudioAndVideo )
+ {
+ streams = 2;
+ }
+
+ // Stream ids
+ iAudioStreamId = sdpParser->AudioStreamId();
+ iVideoStreamId = sdpParser->VideoStreamId();
+ LOG2( "CCRXpsSink::SetSdpL(), iAudioStreamId: %d, iVideoStreamId: %d",
+ iAudioStreamId, iVideoStreamId );
+ // Verify/update range
+ if ( aSdp.FindC(
+ KAttributeDefRange().Left( KRangeIdentifierLen ) ) == KErrNotFound )
+ {
+ LOG( "CCRXpsSink::SetSdpL(), setting default range" );
+ iRangeKnown = EFalse;
+ sdpParser->NewLineL( KErrNotFound, KAttributeDefRange );
+ }
+ else
+ {
+ LOG( "CCRXpsSink::SetSdpL() sdp already did contain range, not changed" );
+ iRangeKnown = ETrue;
+ }
+
+ // Get SDP data
+ TPtrC8 sdp( NULL, 0 );
+ User::LeaveIfError( sdpParser->GetSdp( sdp ) );
+ HBufC8* tmpSdpData = NULL;
+
+ // See if recorded from ISMA crypted content
+#ifdef VIA_FEA_IPTV_USE_IPDC
+ TInt mimePos( sdp.Find( KMtvAvc ) );
+ if ( mimePos != KErrNotFound || sdp.Find( KHxAvc1 ) != KErrNotFound )
+ {
+ LOG( "CCRXpsSink::SetSdpL(), Playback of ISMA clip.." );
+ delete iVideoDepacketizer; iVideoDepacketizer = NULL;
+ iVideoDepacketizer = CH264Mpeg4GenrToFileformat::New();
+ User::LeaveIfNull( iVideoDepacketizer );
+ HBufC8* fmtp = FindFmtpLC( sdp );
+ TInt err( iVideoDepacketizer->Init( *fmtp ) );
+ CleanupStack::PopAndDestroy( fmtp );
+ if ( err )
+ {
+ delete iVideoDepacketizer; iVideoDepacketizer = NULL;
+ LOG1( "CCRXpsSink::SetSdpL(), Depacketizer Init() failed: %d", err );
+ }
+ else
+ {
+ // Change MIME type from X-MTV-AVC to X-HX-AVC1 for playback
+ // KMtvAvc mime prevents Helix crash in non DVB-H phones
+ if ( mimePos != KErrNotFound )
+ {
+ tmpSdpData = HBufC8::NewLC( sdp.Length() -
+ KMtvAvc().Length() + KHxAvc1().Length() );
+ TPtr8 ptr( tmpSdpData->Des() );
+ ptr.Copy( sdp.Left( mimePos ) );
+ ptr.Append( KHxAvc1 );
+ ptr.Append( sdp.Mid( mimePos + KMtvAvc().Length() ) );
+ sdp.Set( ptr );
+ }
+ }
+ }
+#endif // VIA_FEA_IPTV_USE_IPDC
+
+ // Pass SDP to XPS
+ LOG( "CCRXpsSink::SetSdpL(), iPacketSink->SetSessionDescription.." );
+ User::LeaveIfError( iPacketSink->SetSessionDescription( sdp, streams ) );
+ if ( tmpSdpData != NULL )
+ {
+ CleanupStack::PopAndDestroy( tmpSdpData );
+ }
+
+ // Config streams
+ for ( TInt i( 0 ); i < streams; i++ )
+ {
+ LOG2( "CCRXpsSink::SetSdpL(), iPacketSink->ConfigStream: %d, KXpsBufferedPackets: %d",
+ i, KXpsBufferedPackets );
+ User::LeaveIfError( iPacketSink->ConfigStream( i, KXpsBufferedPackets ) );
+ }
+
+ CleanupStack::PopAndDestroy( sdpParser );
+ iWaitPlayer = KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRXpsSink::NewPacketAvailable
+// From CCRPacketSinkBase.
+// -----------------------------------------------------------------------------
+//
+void CCRXpsSink::NewPacketAvailable()
+ {
+ // Kill flow timer
+ StopTimer();
+
+ // Ok to enqueue?
+ if ( iBuffer )
+ {
+ if ( iWaitPlayer == KErrNone )
+ {
+ // Enqueue packet
+ if ( SendPacket() )
+ {
+ // Keep buffer size reasonable
+ iBuffer->HandleBufferSize();
+ }
+
+ if ( iBuffer->ContinousStream() )
+ {
+ // Make sure all will be sent from the buffer in continous stream case
+ if ( iBuffer->PacketsCount( iSinkId ) > KErrNotFound )
+ {
+ StartTimer( 0 );
+ }
+ }
+ else
+ {
+ // Group done, need request more
+ if ( !iBuffer->MoreComing() )
+ {
+ StartTimer( 0 );
+ }
+ }
+ }
+ else
+ {
+ iBuffer->HandleBufferSize();
+ // Make sure that process never end
+ if ( !iBuffer->ContinousStream() )
+ {
+ StartTimer( KXpsOverflowDelay );
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRXpsSink::BufferResetting
+// From CCRPacketSinkBase.
+// -----------------------------------------------------------------------------
+//
+void CCRXpsSink::BufferResetDone()
+ {
+ StopTimer();
+ iWaitPlayer = KErrNone;
+ iRequested = KErrNotFound;
+
+ // XPS reset possible?
+ if ( iXpsResetOk )
+ {
+ LOG( "CCRXpsSink::BufferResetDone(), Resets XPS.." );
+ iPacketSink->Reset();
+ iXpsResetOk = EFalse;
+ }
+
+ // Uninit TS converters
+ LOG( "CCRXpsSink::BufferResetDone(), Uninitiates TS converters.." );
+ if ( iAudioConv )
+ {
+ iAudioConv->UnInitiate();
+ }
+ if ( iVideoConv )
+ {
+ iVideoConv->UnInitiate();
+ }
+ if ( iTitleConv )
+ {
+ iTitleConv->UnInitiate();
+ }
+
+#if defined( LIVE_TV_RDEBUG_TRACE ) || defined( LIVE_TV_FILE_TRACE )
+ iLogXps = 0;
+#endif // LIVE_TV_RDEBUG_TRACE || LIVE_TV_FILE_TRACE
+ }
+
+// -----------------------------------------------------------------------------
+// CCRXpsSink::TimerExpired
+// From MCRTimerObserver.
+// -----------------------------------------------------------------------------
+//
+void CCRXpsSink::TimerExpired( CCRTimer* /*aTimer*/ )
+ {
+ RestoreSink();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRXpsSink::RestorePacketSupply
+// From CCRPacketSinkBase.
+// -----------------------------------------------------------------------------
+//
+void CCRXpsSink::RestorePacketSupply( TUint aStreamId )
+ {
+#if defined( LIVE_TV_RDEBUG_TRACE ) || defined( LIVE_TV_FILE_TRACE )
+ if ( iLogXps < 5 )
+ {
+ iLogXps++;
+ LOG2( "CCRXpsSink::RestorePacketSupply(), aStreamId: %d, iWaitPlayer: %d",
+ aStreamId, iWaitPlayer );
+ }
+#endif // LIVE_TV_RDEBUG_TRACE || LIVE_TV_FILE_TRACE
+
+ if ( iWaitPlayer != TInt( ETrue ) )
+ {
+ if ( iBuffer->ContinousStream() )
+ {
+ iRequested = aStreamId;
+ iWaitPlayer = KErrNone;
+ RestoreSink();
+ }
+ else
+ {
+ iWaitPlayer = KErrNone;
+ StartTimer( KXpsOverflowDelay );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRXpsSink::RestoreSink
+// -----------------------------------------------------------------------------
+//
+void CCRXpsSink::RestoreSink()
+ {
+ if ( iBuffer )
+ {
+ // See if more waits in packet buffer
+ if ( iBuffer->PacketsCount( iSinkId ) > KErrNotFound )
+ {
+ NewPacketAvailable();
+ }
+ else
+ {
+ StopTimer();
+ // This is only for non continous stream, like .rtp clip
+ iOwningSession.SourceRestore();
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRXpsSink::SendPacket
+// Initialises time stamp converter for audio and video stream and passes RTP
+// packets with adjusted time stamp to XPS interface. All packets before
+// converter has beeen initialized are dumbed.
+// -----------------------------------------------------------------------------
+//
+TBool CCRXpsSink::SendPacket()
+ {
+ TBool packetSent( ETrue );
+ MCRPacketSource::TCRPacketStreamId bufferId( MCRPacketSource::EStreamIdCount );
+ const TInt book( iBuffer->GetStream( iSinkId, bufferId ) );
+ TPtr8 packet( NULL, 0 );
+
+ // Packet type related action
+ TInt err( KErrNone );
+ switch ( bufferId )
+ {
+ case MCRPacketSource::EAudioStream:
+ if ( iAudioConv->Initiated() )
+ {
+ iBuffer->GetPacket( book, packet );
+ if ( iRequested == KErrNotFound || iRequested == iAudioStreamId )
+ {
+ iRequested = KErrNotFound;
+ err = SendAudioPacket( packet );
+ }
+ else
+ {
+ LOG( "CCRXpsSink::SendPacket(), Audio packet DROPPED after XPS overflow !" )
+ }
+ }
+ else
+ {
+ packetSent = EFalse;
+ SearchForControlStreamPackets();
+ }
+ break;
+
+ case MCRPacketSource::EAudioControlStream:
+ {
+ iBuffer->GetPacket( book, packet );
+ if ( !iAudioConv->Initiated() )
+ {
+ iAudioConv->Init( packet );
+ LOG1( "CCRXpsSink::SendPacket(), Audio TS initiated, status: %d",
+ iAudioConv->Initiated() )
+ }
+ }
+ break;
+
+ case MCRPacketSource::EVideoStream:
+ if ( iVideoConv->Initiated() )
+ {
+ iBuffer->GetPacket( book, packet );
+ if ( iRequested == KErrNotFound || iRequested == iVideoStreamId )
+ {
+ iRequested = KErrNotFound;
+ err = SendVideoPacket( packet );
+ }
+ else
+ {
+ LOG( "CCRXpsSink::SendPacket(), Video packet DROPPED after XPS overflow !" )
+ }
+ }
+ else
+ {
+ packetSent = EFalse;
+ SearchForControlStreamPackets();
+ }
+ break;
+
+ case MCRPacketSource::EVideoControlStream:
+ {
+ iBuffer->GetPacket( book, packet );
+ if ( !iVideoConv->Initiated() )
+ {
+ iVideoConv->Init( packet );
+ LOG1( "CCRXpsSink::SendPacket(), Video TS initiated, status: %d",
+ iVideoConv->Initiated() )
+ }
+ }
+ break;
+
+ case MCRPacketSource::ESubTitleStream:
+ if ( iTitleConv->Initiated() )
+ {
+ iBuffer->GetPacket( book, packet );
+ err = SendTitlePacket( packet );
+ }
+ else
+ {
+ packetSent = EFalse;
+ SearchForControlStreamPackets();
+ }
+ break;
+
+ case MCRPacketSource::ESubTitleControlStream:
+ {
+ iBuffer->GetPacket( book, packet );
+ if ( !iTitleConv->Initiated() )
+ {
+ iTitleConv->Init( packet );
+ LOG1( "CCRXpsSink::SendPacket(), Title TS initiated, status: %d",
+ iTitleConv->Initiated() )
+ }
+ }
+ break;
+
+ case MCRPacketSource::EDisContinousStream:
+ {
+ LOG( "CCRXpsSink::SendPacket(), EDiscontinousStream" );
+ // Just wait player's "MvloLoadingStartedL" event,
+ // PlayCommand( -1.0, -1.0 ) will then handle pause packet
+ iWaitPlayer = ETrue;
+ // Used packet out from the buffer
+ iBuffer->GetPacket( book, packet );
+ }
+ break;
+
+ case MCRPacketSource::EStreamEndTag:
+ LOG1( "CCRXpsSink::SendPacket(), EStreamEndTag, iRangeKnown: %d", iRangeKnown );
+ if ( iRangeKnown )
+ {
+ if ( iAudioStreamId > KErrNotFound )
+ {
+ iPacketSink->StreamEnd( iAudioStreamId );
+ }
+ if ( iVideoStreamId > KErrNotFound )
+ {
+ iPacketSink->StreamEnd( iVideoStreamId );
+ }
+ }
+ //else
+ // {
+ // Just wait player's "MvloLoadingStartedL" event,
+ // Play ends with PlayCommand( -1.0, -1.0 ) in .rtp clip case and/or
+ // VIA will stop the play if play position goes beond the clip's lenght
+ // }
+
+ // Used packet out from the buffer
+ iBuffer->GetPacket( book, packet );
+ break;
+
+ default:
+ LOG1( "CCRXpsSink::SendPacket(), Bad bufferId: %d", bufferId );
+ // Used packet out from the buffer
+ iBuffer->GetPacket( book, packet );
+ break;
+ }
+
+ // Stop sink if error?
+ if ( err )
+ {
+ LOG2( "CCRXpsSink::SendPacket(), error: %d, bufferId: %d", err, bufferId );
+ LOG2( "CCRXpsSink::SendPacket(), iAudioStreamId: %d, iVideoStreamId: %d",
+ iAudioStreamId, iVideoStreamId );
+ iOwningSession.SinkStops( Id() );
+ }
+
+ return packetSent;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRXpsSink::SendAudioPacket
+// Adjust RTP timestamp and enqueue the packet.
+// -----------------------------------------------------------------------------
+//
+TInt CCRXpsSink::SendAudioPacket( const TDesC8& aPacket )
+ {
+ // Parse packet
+ TInt err( iRtpPacket->ParseRtp( aPacket ) );
+ if ( err )
+ {
+ LOG1( "CCRXpsSink::SendAudioPacket(), Parsing error: %d", err );
+ return err;
+ }
+
+ // Adjust time stamp
+ iRtpPacket->SetTimeStamp(
+ iAudioConv->ConvertTs( iRtpPacket->iRtpRecvHeader.iTimestamp ) );
+
+ // Send to player
+ return EnqueuePacket( iAudioStreamId );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRXpsSink::SendVideoPacket
+// Adjust RTP timestamp and enqueue the packet.
+// -----------------------------------------------------------------------------
+//
+TInt CCRXpsSink::SendVideoPacket( const TDesC8& aPacket )
+ {
+ TPtrC8 packet( aPacket );
+
+#ifdef VIA_FEA_IPTV_USE_IPDC
+ // Do ISMA Depacketizer
+ if ( iVideoDepacketizer != NULL )
+ {
+ TInt result( iVideoDepacketizer->PushPacket( packet ) );
+ if ( result != KErrCompletion ) // KErrCompletion means Ok
+ {
+ return KErrNone;
+ }
+
+ // Next packet should be available
+ TInt err( iVideoDepacketizer->NextFrame( packet ) );
+ if ( err )
+ {
+ LOG1( "CCRXpsSink::SendVideoPacket(), NextFrame error: %d", err );
+ return err;
+ }
+ }
+#endif // VIA_FEA_IPTV_USE_IPDC
+
+ // Parse packet
+ TInt err( iRtpPacket->ParseRtp( packet ) );
+ if ( err )
+ {
+ LOG1( "CCRXpsSink::SendVideoPacket(), Parsing error: %d", err );
+ return err;
+ }
+
+ // Adjust time stamp
+ iRtpPacket->SetTimeStamp(
+ iVideoConv->ConvertTs( iRtpPacket->iRtpRecvHeader.iTimestamp ) );
+
+ // Send to player
+ return EnqueuePacket( iVideoStreamId );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRXpsSink::SendTitlePacket
+// Adjust RTP timestamp and enqueue the packet.
+// -----------------------------------------------------------------------------
+//
+TInt CCRXpsSink::SendTitlePacket( const TDesC8& /*aPacket*/ )
+ {
+ // Title implementation unknown
+ return KErrNotSupported;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRXpsSink::EnqueuePacket
+// Sends packet to the player.
+// -----------------------------------------------------------------------------
+//
+TInt CCRXpsSink::EnqueuePacket( const TUint aStreamId )
+ {
+ TInt err( iPacketSink->Enqueue(
+ aStreamId, iRtpPacket->iRtpRecvHeader, iRtpPacket->iPayload ) );
+
+#if defined( LIVE_TV_RDEBUG_TRACE ) || defined( LIVE_TV_FILE_TRACE )
+ if ( err && ( iLogXps < 5 || err != KErrOverflow ) )
+ {
+ LOG3( "CCRXpsSink::EnqueuePacket(), aStreamId: %d, err: %d, payload len: %d",
+ aStreamId, err, iRtpPacket->iPayload.Length() );
+ }
+#endif // LIVE_TV_RDEBUG_TRACE || LIVE_TV_FILE_TRACE
+
+ if ( err == KErrOverflow )
+ {
+ iWaitPlayer = err;
+ return KErrNone;
+ }
+
+ // XPS reset can not be done before first packet is enqued
+ iXpsResetOk = ETrue;
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRXpsSink::SearchForControlStreamPackets
+// Checks buffer for control stream packets.
+// -----------------------------------------------------------------------------
+//
+void CCRXpsSink::SearchForControlStreamPackets()
+ {
+ // Check if RTCP packet already in buffer
+ if ( CheckBufferForControlStreamPackets() )
+ {
+ iBuffer->AdjustBuffer();
+ }
+ else
+ {
+ // Get more packets if group not contains any RTCP packet(s)
+ if ( !iBuffer->ContinousStream() && !iBuffer->MoreComing() )
+ {
+ iBuffer->AdjustBuffer();
+ iOwningSession.SourceRestore();
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRXpsSink::CheckBufferForControlStreamPackets
+// Checks buffer for control stream packets.
+// -----------------------------------------------------------------------------
+//
+TBool CCRXpsSink::CheckBufferForControlStreamPackets()
+ {
+ TBool audioOk( iAudioConv->Initiated() || iAudioStreamId == KErrNotFound );
+ TBool videoOk( iVideoConv->Initiated() || iVideoStreamId == KErrNotFound );
+
+ // Loop packets, oldest first
+ for ( TInt offset( iBuffer->PacketsCount( iSinkId ) - 1 );
+ ( !audioOk || !videoOk ) && offset >= 0; offset-- )
+ {
+ MCRPacketSource::TCRPacketStreamId streamId( MCRPacketSource::EStreamIdCount );
+ const TInt book( iBuffer->GetStream( iSinkId, offset, streamId ) );
+ TPtr8 packet( NULL, 0 );
+
+ switch ( streamId )
+ {
+ case MCRPacketSource::EAudioControlStream:
+ if ( !iAudioConv->Initiated() )
+ {
+ audioOk = ETrue;
+ iBuffer->PeekPacket( book, packet, offset );
+ iAudioConv->Init( packet );
+ LOG1( "CCRXpsSink::CheckBufferForControlStreamPackets(), Audio TS initiated, status: %d",
+ iAudioConv->Initiated() )
+ }
+ break;
+
+ case MCRPacketSource::EVideoControlStream:
+ if ( !iVideoConv->Initiated() )
+ {
+ videoOk = ETrue;
+ iBuffer->PeekPacket( book, packet, offset );
+ iVideoConv->Init( packet );
+ LOG1( "CCRXpsSink::CheckBufferForControlStreamPackets(), Video TS initiated, status: %d",
+ iVideoConv->Initiated() )
+ }
+ break;
+
+ case MCRPacketSource::ESubTitleControlStream:
+ if ( !iTitleConv->Initiated() )
+ {
+ iBuffer->PeekPacket( book, packet, offset );
+ iTitleConv->Init( packet );
+ LOG1( "CCRXpsSink::CheckBufferForControlStreamPackets(), Title TS initiated, status: %d",
+ iTitleConv->Initiated() )
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ return ( audioOk && videoOk );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRXpsSink::StartTimer
+// Starts packet flow timer.
+// -----------------------------------------------------------------------------
+//
+void CCRXpsSink::StartTimer( const TInt& aInterval )
+ {
+ StopTimer();
+ TRAPD( err, iFlowTimer = CCRTimer::NewL(
+ CActive::EPriorityLow, *this ) );
+ if ( !err )
+ {
+ iFlowTimer->After( aInterval );
+ }
+ else
+ {
+ LOG1( "CCRXpsSink::StartTimer(), Flowtimer err: %d", err );
+ iOwningSession.SinkStops( Id() );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCRXpsSink::StopTimer
+// Starts packet flow timer.
+// -----------------------------------------------------------------------------
+//
+void CCRXpsSink::StopTimer()
+ {
+ delete iFlowTimer; iFlowTimer = NULL;
+ }
+
+#ifdef VIA_FEA_IPTV_USE_IPDC
+// -----------------------------------------------------------------------------
+// CCRXpsSink::FindFmtpL
+// Finds the fmtp string.
+// -----------------------------------------------------------------------------
+//
+HBufC8* CCRXpsSink::FindFmtpLC( const TDesC8& aSdpData )
+ {
+ LOG( "CCRXpsSink::FindFmtpLC() in" );
+ _LIT8( KCRStr, "\r" );
+ _LIT8( KLFStr, "\n" );
+ _LIT8( KHxAVCfmtp, "a=hxavcfmtp:" );
+
+ // Get the video fmtp string
+ HBufC8* fmtp = NULL;
+ TInt pos = aSdpData.Find( KHxAVCfmtp );
+ if ( pos > KErrNotFound )
+ {
+ // Extract the right most from the fist char after KHxAVCfmtp
+ TPtrC8 rightPtr( aSdpData.Mid( pos + KHxAVCfmtp().Length() ) );
+
+ // We need the first line of rightPtr
+ TInt posLFStr( rightPtr.Find( KLFStr ) );
+ TInt posCRStr( rightPtr.Find( KCRStr ) );
+ if ( posLFStr > 0 && posCRStr > 0 )
+ {
+ fmtp = rightPtr.Left( Min( posLFStr, posCRStr ) ).AllocLC();
+ }
+ else if ( posLFStr > 0 )
+ {
+ fmtp = rightPtr.Left( posLFStr ).AllocLC();
+ }
+ else if ( posCRStr > 0 )
+ {
+ fmtp = rightPtr.Left( posCRStr ).AllocLC();
+ }
+ else
+ {
+ fmtp = rightPtr.AllocLC();
+ }
+ }
+
+ User::LeaveIfNull( fmtp );
+#if defined( LIVE_TV_RDEBUG_TRACE ) || defined( LIVE_TV_FILE_TRACE )
+ HBufC* buf = HBufC::NewL( fmtp->Length() );
+ TPtr ptr( buf->Des() ); ptr.Copy( *fmtp );
+ LOG1( "CCRXpsSink::FindFmtpLC() out, Fmtp: %S", &ptr );
+#endif // LIVE_TV_RDEBUG_TRACE || LIVE_TV_FILE_TRACE
+ return fmtp;
+ }
+
+#endif // VIA_FEA_IPTV_USE_IPDC
+
+ // End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngineClient/EABI/CommonRecordingEngineClientU.DEF Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,31 @@
+EXPORTS
+ _ZN9CCRDvrApi11GetPositionEjRxS0_ @ 1 NONAME
+ _ZN9CCRDvrApi11PlayCommandEjdd @ 2 NONAME
+ _ZN9CCRDvrApi11PlayRtpFileERjRK16SCRRtpPlayParams @ 3 NONAME
+ _ZN9CCRDvrApi11PlayRtpFileERjRK5RFile @ 4 NONAME
+ _ZN9CCRDvrApi11PlayRtspUrlERjRK13SCRRtspParams @ 5 NONAME
+ _ZN9CCRDvrApi11SetPositionEjx @ 6 NONAME
+ _ZN9CCRDvrApi11StopCommandEj @ 7 NONAME
+ _ZN9CCRDvrApi12CancelSetIapEv @ 8 NONAME
+ _ZN9CCRDvrApi12CloseSessionEj @ 9 NONAME
+ _ZN9CCRDvrApi12PauseCommandEj @ 10 NONAME
+ _ZN9CCRDvrApi13StopTimeShiftEjj @ 11 NONAME
+ _ZN9CCRDvrApi14PlayDvbhStreamERjRK13SCRLiveParams @ 12 NONAME
+ _ZN9CCRDvrApi14PlayNullSourceERj @ 13 NONAME
+ _ZN9CCRDvrApi14StartTimeShiftERjj @ 14 NONAME
+ _ZN9CCRDvrApi16RecordDvbhStreamERjRK13SCRLiveParamsRK15SCRRecordParams @ 15 NONAME
+ _ZN9CCRDvrApi16RecordRtspStreamERjRK13SCRRtspParamsRK15SCRRecordParams @ 16 NONAME
+ _ZN9CCRDvrApi16StopRecordStreamEj @ 17 NONAME
+ _ZN9CCRDvrApi17ChangeDvbhServiceERjRK13SCRLiveParams @ 18 NONAME
+ _ZN9CCRDvrApi17PauseRecordStreamEjRKi @ 19 NONAME
+ _ZN9CCRDvrApi19RecordCurrentStreamEjRK15SCRRecordParams @ 20 NONAME
+ _ZN9CCRDvrApi21PlayRtspUrlToNullSinkERjRK13SCRRtspParams @ 21 NONAME
+ _ZN9CCRDvrApi4NewLEP17MCREngineObserver @ 22 NONAME
+ _ZN9CCRDvrApi4NewLEv @ 23 NONAME
+ _ZN9CCRDvrApi6SetIapERKj @ 24 NONAME
+ _ZN9CCRDvrApiD0Ev @ 25 NONAME
+ _ZN9CCRDvrApiD1Ev @ 26 NONAME
+ _ZN9CCRDvrApiD2Ev @ 27 NONAME
+ _ZTI9CCRDvrApi @ 28 NONAME ; #<TI>#
+ _ZTV9CCRDvrApi @ 29 NONAME ; #<VT>#
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngineClient/bwins/CommonRecordingEngineClientU.DEF Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,27 @@
+EXPORTS
+ ??1CCRDvrApi@@UAE@XZ @ 1 NONAME ; CCRDvrApi::~CCRDvrApi(void)
+ ?CancelSetIap@CCRDvrApi@@QAEHXZ @ 2 NONAME ; int CCRDvrApi::CancelSetIap(void)
+ ?ChangeDvbhService@CCRDvrApi@@QAEHAAIABUSCRLiveParams@@@Z @ 3 NONAME ; int CCRDvrApi::ChangeDvbhService(unsigned int &, struct SCRLiveParams const &)
+ ?CloseSession@CCRDvrApi@@QAEHI@Z @ 4 NONAME ; int CCRDvrApi::CloseSession(unsigned int)
+ ?GetPosition@CCRDvrApi@@QAEHIAA_J0@Z @ 5 NONAME ; int CCRDvrApi::GetPosition(unsigned int, long long &, long long &)
+ ?NewL@CCRDvrApi@@SAPAV1@PAVMCREngineObserver@@@Z @ 6 NONAME ; class CCRDvrApi * CCRDvrApi::NewL(class MCREngineObserver *)
+ ?NewL@CCRDvrApi@@SAPAV1@XZ @ 7 NONAME ; class CCRDvrApi * CCRDvrApi::NewL(void)
+ ?PauseCommand@CCRDvrApi@@QAEHI@Z @ 8 NONAME ; int CCRDvrApi::PauseCommand(unsigned int)
+ ?PauseRecordStream@CCRDvrApi@@QAEHIABH@Z @ 9 NONAME ; int CCRDvrApi::PauseRecordStream(unsigned int, int const &)
+ ?PlayCommand@CCRDvrApi@@QAEHINN@Z @ 10 NONAME ; int CCRDvrApi::PlayCommand(unsigned int, double, double)
+ ?PlayDvbhStream@CCRDvrApi@@QAEHAAIABUSCRLiveParams@@@Z @ 11 NONAME ; int CCRDvrApi::PlayDvbhStream(unsigned int &, struct SCRLiveParams const &)
+ ?PlayNullSource@CCRDvrApi@@QAEHAAI@Z @ 12 NONAME ; int CCRDvrApi::PlayNullSource(unsigned int &)
+ ?PlayRtpFile@CCRDvrApi@@QAEHAAIABUSCRRtpPlayParams@@@Z @ 13 NONAME ; int CCRDvrApi::PlayRtpFile(unsigned int &, struct SCRRtpPlayParams const &)
+ ?PlayRtpFile@CCRDvrApi@@QAEHAAIABVRFile@@@Z @ 14 NONAME ; int CCRDvrApi::PlayRtpFile(unsigned int &, class RFile const &)
+ ?PlayRtspUrl@CCRDvrApi@@QAEHAAIABUSCRRtspParams@@@Z @ 15 NONAME ; int CCRDvrApi::PlayRtspUrl(unsigned int &, struct SCRRtspParams const &)
+ ?PlayRtspUrlToNullSink@CCRDvrApi@@QAEHAAIABUSCRRtspParams@@@Z @ 16 NONAME ; int CCRDvrApi::PlayRtspUrlToNullSink(unsigned int &, struct SCRRtspParams const &)
+ ?RecordCurrentStream@CCRDvrApi@@QAEHIABUSCRRecordParams@@@Z @ 17 NONAME ; int CCRDvrApi::RecordCurrentStream(unsigned int, struct SCRRecordParams const &)
+ ?RecordDvbhStream@CCRDvrApi@@QAEHAAIABUSCRLiveParams@@ABUSCRRecordParams@@@Z @ 18 NONAME ; int CCRDvrApi::RecordDvbhStream(unsigned int &, struct SCRLiveParams const &, struct SCRRecordParams const &)
+ ?RecordRtspStream@CCRDvrApi@@QAEHAAIABUSCRRtspParams@@ABUSCRRecordParams@@@Z @ 19 NONAME ; int CCRDvrApi::RecordRtspStream(unsigned int &, struct SCRRtspParams const &, struct SCRRecordParams const &)
+ ?SetIap@CCRDvrApi@@QAEHABI@Z @ 20 NONAME ; int CCRDvrApi::SetIap(unsigned int const &)
+ ?SetPosition@CCRDvrApi@@QAEHI_J@Z @ 21 NONAME ; int CCRDvrApi::SetPosition(unsigned int, long long)
+ ?StartTimeShift@CCRDvrApi@@QAEHAAII@Z @ 22 NONAME ; int CCRDvrApi::StartTimeShift(unsigned int &, unsigned int)
+ ?StopCommand@CCRDvrApi@@QAEHI@Z @ 23 NONAME ; int CCRDvrApi::StopCommand(unsigned int)
+ ?StopRecordStream@CCRDvrApi@@QAEHI@Z @ 24 NONAME ; int CCRDvrApi::StopRecordStream(unsigned int)
+ ?StopTimeShift@CCRDvrApi@@QAEHII@Z @ 25 NONAME ; int CCRDvrApi::StopTimeShift(unsigned int, unsigned int)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngineClient/group/CommonRecordingEngineClient.mmp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,50 @@
+/*
+* 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: Symbian style build specification for*
+*/
+
+
+
+#include "../inc/CRClientConsts.hrh"
+#include <platform_paths.hrh>
+
+//OPTION ARMCC --asm --interleave
+ALWAYS_BUILD_AS_ARM
+
+TARGET CommonRecordingEngineClient.dll
+TARGETTYPE dll
+UID 0x1000008d KCRClientUid
+
+CAPABILITY CAP_GENERAL_DLL
+
+SOURCEPATH ../src
+SOURCE CCRDvrApi.cpp
+SOURCE RCRClient.cpp
+SOURCE RCRService.cpp
+SOURCE RCRServiceBase.cpp
+SOURCE CCRApiBase.cpp
+SOURCE CCRMsgQueueObserver.cpp
+SOURCE CCRServerHandleSingleton.cpp
+
+USERINCLUDE .
+USERINCLUDE ../inc
+USERINCLUDE ../../CommonRecordingEngine/inc
+
+MW_LAYER_SYSTEMINCLUDE
+
+LIBRARY euser.lib // Common
+LIBRARY efsrv.lib // File server
+LIBRARY FLogger.lib // Debug logger
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngineClient/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,30 @@
+/*
+* 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: Common recording engine client library build info file*
+*/
+
+
+
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+PRJ_EXPORTS
+../rom/commonrecordingengineclient.iby CORE_MW_LAYER_IBY_EXPORT_PATH(commonrecordingengineclient.iby)
+
+PRJ_MMPFILES
+CommonRecordingEngineClient.mmp
+
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngineClient/inc/CCRMsgQueueObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,151 @@
+/*
+* 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: Common recording engine message queue observer*
+*/
+
+
+
+
+#ifndef CCRMSGQUEUEOBSERVER_H
+#define CCRMSGQUEUEOBSERVER_H
+
+// INCLUDES
+#include <e32base.h>
+#include <e32msgqueue.h>
+#include <ipvideo/MCREngineObserver.h>
+#include <ipvideo/CRTypeDefs.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class MCREngineObserver;
+
+// CLASS DECLARATION
+
+/**
+* Common recording engine message queue observer.
+* Uses Symbian OS class RMsgQueue.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+NONSHARABLE_CLASS( CCRMsgQueueObserver ) : public CActive
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ static CCRMsgQueueObserver* NewL( );
+
+ /**
+ * Virtual destructor.
+ */
+ virtual ~CCRMsgQueueObserver();
+
+public: // New methods
+
+ /**
+ * Method that adds a view to message queue's observer list.
+ * @since Series 60 3.0
+ * @param aObserver is the object that will be notified
+ * @return none.
+ */
+ void AddMsgQueueObserverL( MCREngineObserver* aObserver );
+
+ /**
+ * Sets session id to listen to.
+ * @since Series 60 3.0
+ * @param aSessionId session id
+ * @return none.
+ */
+ void SetSessionId( TInt aSessionId );
+
+private: // Constructors
+
+ /**
+ * C++ default constructor.
+ */
+ CCRMsgQueueObserver( );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+private: // Methods from base classes
+
+ /**
+ * From CActive.
+ * Handles an active object’s request completion event.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void RunL();
+
+ /**
+ * From CActive.
+ * Called when outstanding request is cancelled.
+ * This function is called as part of the active object’s Cancel().
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void DoCancel();
+
+ /**
+ * From CActive.
+ * Handles a leave occurring in the request completion event handler RunL().
+ * @since Series 60 3.0
+ * @param aError Error code.
+ * @return none.
+ */
+ TInt RunError( TInt aError );
+
+private: // Data
+
+ /**
+ * Actual message queue. Or handle to kernel-side object.
+ */
+ RMsgQueue<SCRQueueEntry> iQueue;
+
+ /**
+ * This is data-area for the message received from kernel side.
+ */
+ SCRQueueEntry iReceivedMessage;
+
+ /**
+ * Observers are views.
+ */
+ RPointerArray<MCREngineObserver> iObservers;
+
+ /**
+ * Session id to listen to
+ */
+ TInt iSessionId;
+
+ };
+
+#endif // CCRMSGQUEUEOBSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngineClient/inc/CCRServerHandleSingleton.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,125 @@
+/*
+* 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: Singleton to hold server session*
+*/
+
+
+
+
+#ifndef CCRSERVERHADLESINGLETON_H
+#define CCRSERVERHADLESINGLETON_H
+
+// INCLUDES
+#include "RCRService.h"
+#include "RCRClient.h"
+#include <e32base.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CCRAPIBase;
+
+// CLASS DECLARATION
+
+/**
+* Singleton class to store client handles. Instance of this class is kept
+* in TLS and a reference count is maintained. This is to ensure that if a
+* process creates multiple CCRDvrApi instances, they will all share the
+* same session to CommonRecordingEngine.
+*
+* @lib CommonRecordingEngineClient.lib
+* @since Series 60 3.0
+*/
+NONSHARABLE_CLASS( CCRServerHandleSingleton ) : public CBase
+ {
+
+ /**
+ * CCRApiBase and CCRDvrApi are the only classes
+ * that should have access to this class.
+ */
+ friend class CCRApiBase;
+ friend class CCRDvrApi;
+
+private: // Constructors and destructors
+
+ /**
+ * Private constructor to prevent direct instantiation. InstanceL must be used.
+ */
+ CCRServerHandleSingleton();
+
+ /**
+ * Second phase of 2-phased construction
+ */
+ void ConstructL();
+
+ /**
+ * Private destructor to prevent direct deletion. Release must be used.
+ */
+ ~CCRServerHandleSingleton();
+
+private: // New methods
+
+ /**
+ * Returns the singleton instance. If it does not yet exist, it is created.
+ * If it does, a reference count is incremented
+ * @since Series 60 3.0
+ * @param none.
+ * @return Instance to singleton class.
+ */
+ static CCRServerHandleSingleton* InstanceL();
+
+ /**
+ * Releases the singleton instance. If reference count reaches zero, the
+ * instance is destroyed and client connection closed.
+ */
+ static void Release();
+
+ /**
+ * Returns a reference to the service handle
+ * @since Series 60 3.0
+ * @param none.
+ * @return Reference to RCRService
+ */
+ inline RCRService& Service() { return iService; }
+
+private: // Data
+
+ /**
+ * Amount of references to this instance.
+ * Instance will be deleted when this reaches zero.
+ */
+ TInt iReferenceCount;
+
+ /**
+ * Handle to Recording Engine client.
+ */
+ RCRClient iClient;
+
+ /**
+ * Handle to Recording Engine services.
+ */
+ RCRService iService;
+
+ };
+
+#endif // CCRSERVERHADLESINGLETON_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngineClient/inc/CRClientConsts.hrh Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,29 @@
+/*
+* Copyright (c) 2006 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: Common constant definitions*
+*/
+
+
+
+
+
+#ifndef __CRCLIENTCONSTS_H
+#define __CRCLIENTCONSTS_H
+
+#define KCRClientUid 0x1028242E
+
+#endif // __CRCLIENTCONSTS_H
+
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngineClient/inc/RCRClient.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,90 @@
+/*
+* 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: Interface for RC Client class*
+*/
+
+
+
+
+#ifndef RCRCLIENT_H
+#define RCRCLIENT_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+
+/**
+* This is the client-side interface through which communication
+* with the server is channelled.
+*
+* @lib CommonRecordingEngineClient.lib
+* @since Series 60 3.0
+*/
+NONSHARABLE_CLASS( RCRClient ) : public RSessionBase
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ * @param none.
+ * @return none.
+ */
+ RCRClient();
+
+public: // New methods
+
+ /**
+ * Connects to the server.
+ * @since Series 60 3.0
+ * @param none.
+ * @return KErrNone if successful,
+ * otherwise another of the system-wide error code.
+ */
+ TInt Connect();
+
+ /**
+ * Closes the session.
+ * @since Series 60 3.0
+ * @param none.
+ * @return None
+ */
+ void Close();
+
+ /**
+ * Version.
+ * @since Series 60 3.0
+ * @param none.
+ * @return version number.
+ */
+ TVersion Version() const;
+
+ };
+
+#endif // RCRCLIENT_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngineClient/inc/RCRService.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,301 @@
+/*
+* 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: Interface for RC Client's Service class*
+*/
+
+
+
+
+#ifndef RCRSERVICE_H
+#define RCRSERVICE_H
+
+// INCLUDES
+#include "RCRServiceBase.h"
+#include <es_sock.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class RCRClient;
+
+// CLASS DECLARATION
+
+/**
+* This is the actual client API that passes commands
+* to server side. CCRDvrApi and other classes visible
+* to client application are merely wrappers to this
+* class. If CCRDvrApi has method foo, it will just
+* call method foo if this class here and this will in
+* turn say something like return SendReceive( ECRDoFooInServer, args );
+* This needs to have implementations of all the engine
+* methods of all client classes.
+*
+* @lib CommonRecordingEngineClient.lib
+* @since Series 60 3.0
+*/
+NONSHARABLE_CLASS( RCRService ) : public RCRServiceBase
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * Constructor.
+ */
+ RCRService();
+
+public: // New methods
+
+ /**
+ * Tells receiving engine which IAP to use.
+ * @since Series 60 3.0
+ * @param aIapId is the internet access point id.
+ * @return none.
+ */
+ TInt SetIap( const TSubConnectionUniqueId& aIapId );
+
+ /**
+ * Tells receiving engine to cancel IAP selection.
+ * @since Series 60 3.0
+ */
+ TInt CancelSetIap();
+
+ /**
+ * Prepares live IPTV PTSP stream.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aRtspParams parameter set for rtsp.
+ * @return KErrNone if successful,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt PlayRtspUrl( TUint& aSessionChk,
+ const SCRRtspParams& aRtspParams );
+
+ /**
+ * Prepares DVB-H live stream.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aLiveParams parameter set for DVB-H.
+ * @return KErrNone if successful,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt PlayDvbhStream( TUint& aSessionChk,
+ const SCRLiveParams& aLiveParams );
+
+ /**
+ * Changes DVB-H live stream service.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aLiveParams parameter set for DVB-H.
+ * @return KErrNone if successful,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt ChangeDvbhService( TUint& aSessionChk,
+ const SCRLiveParams& aLiveParams );
+
+ /**
+ * Prepares clip RTP stream from a name.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aRtpFile parameter set for rtsp.
+ * @return KErrNone if successful,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt PlayRtpFile( TUint& aSessionChk,
+ const SCRRtpPlayParams& aRtpFile );
+
+ /**
+ * Prepares clip RTP stream from a file handle.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aRtpHandle a open file handle for RTP file.
+ * @return KErrNone if successful,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt PlayRtpFile( TUint& aSessionChk,
+ const RFile& aRtpHandle );
+
+ /**
+ * Starts currently active stream recording.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aRecordParams a parameters for recording.
+ * @return KErrNone if successful,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt RecordCurrentStream( const TUint aSessionChk,
+ const SCRRecordParams& aRecordParams );
+
+ /**
+ * Starts recording for RTSP live stream.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aRtspUrl is set of parameters required for rtsp.
+ * @param aRecordParams a parameters for recording.
+ * @return KErrNone if successful,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt RecordRtspStream( TUint& aSessionChk,
+ const SCRRtspParams& aRtspUrl,
+ const SCRRecordParams& aRecordParams );
+
+ /**
+ * Starts DVB-H recording.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aLiveParams is set of parameters required for DVB-H.
+ * @param aRecordParams a parameters for recording.
+ * @return KErrNone if successful,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt RecordDvbhStream( TUint& aSessionChk,
+ const SCRLiveParams& aLiveParams,
+ const SCRRecordParams& aRecordParams );
+
+ /**
+ * Pauses/Resumes recording.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aStart a start or end pausing.
+ * @return KErrNone if successful,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt PauseRecordStream( const TUint aSessionChk,
+ const TBool& aStart );
+
+ /**
+ * Stops recording.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @return KErrNone if successful,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt StopRecordStream( const TUint aSessionChk );
+
+ /**
+ * Starts time shift mode.
+ * @since Series 60 3.0
+ * @param aTimeShiftChk a session definition checksum.
+ * @param aSessionChk a session definition of existing session.
+ * @return KErrNone if successful,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt StartTimeShift( TUint& aTimeShiftChk,
+ const TUint aSessionChk );
+
+ /**
+ * Stops time shift mode.
+ * @since Series 60 3.0
+ * @param aTimeShiftChk a session definition checksum.
+ * @param aCurrentChk a session definition of existing session.
+ * @return KErrNone if successful,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt StopTimeShift( const TUint aTimeShiftChk,
+ const TUint aCurrentChk );
+
+ /**
+ * Method for ordering "play" for packet 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 successful,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt PlayCommand( const TUint aSessionChk,
+ const TReal& aStartPos,
+ const TReal& aEndPos );
+
+ /**
+ * Method for ordering "pause" for packet source.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @return KErrNone if successful,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt PauseCommand( const TUint aSessionChk );
+
+ /**
+ * Method for ordering "stop" for packet source.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @return KErrNone if successful,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt StopCommand( const TUint aSessionChk );
+
+ /**
+ * Setter for play position of packet source.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aPosition a postion of RTP playback.
+ * @param aDuration a duration of RTP clip.
+ * @return KErrNone if successful,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt SetPosition( const TUint aSessionChk,
+ const TInt64 aPosition );
+
+ /**
+ * Getter for play position of packet source.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aPosition a postion of RTP playback.
+ * @param aDuration a duration of RTP clip.
+ * @return KErrNone if successful,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt GetPosition( const TUint aSessionChk,
+ TInt64& aPosition,
+ TInt64& aDuration );
+
+ /**
+ * Method for ordering closing a source and all sinks.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ TInt CloseSession( const TUint aSessionChk );
+
+ /**
+ * Prepares rtp file playing as a live source.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @return KErrNone if successful,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt PlayNullSource( TUint& aSessionChk );
+
+ /**
+ * Prepares live IPTV PTSP stream to null sink.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aRtspParams a active live parameters.
+ * @return KErrNone if successful,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt PlayRtspUrlToNullSink( TUint& aSessionChk,
+ const SCRRtspParams& aRtspParams );
+ };
+
+#endif // RCRSERVICE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngineClient/inc/RCRServiceBase.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,101 @@
+/*
+* 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: Interface for CR Client's ServiceBase class.*
+*/
+
+
+
+
+#ifndef RCRSERVICEBASE_H
+#define RCRSERVICEBASE_H
+
+// INCLUDES
+#include <e32base.h>
+#include <ipvideo/CRTypeDefs.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class RCRClient;
+
+// CLASS DECLARATION
+
+/**
+* Base class for services. This represents a client-side sub-session
+* and has a corresponding sub-session object on the server-side.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+NONSHARABLE_CLASS( RCRServiceBase ) : public RSubSessionBase
+ {
+
+public: // Constructors and destructors
+
+ /**
+ * C++ default constructor.
+ */
+ RCRServiceBase::RCRServiceBase( );
+
+ /**
+ * Open server.
+ * @since Series 60 3.0
+ * @param aClient a reference to the client.
+ * @return KErrNone if successful, otherwise one of the system-wide error codes.
+ */
+ TInt Open( RCRClient& aClient );
+
+ /**
+ * Close server.
+ * @since Series 60 3.0
+ * @param none.
+ * @return None
+ */
+ void Close();
+
+ /**
+ * Uses user panic to panic client.
+ * @since Series 60 3.0
+ * @param aFault Panic reason.
+ * @return None.
+ */
+ void PanicClient( TInt aFault );
+
+ /**
+ * Getter for sessionhandle.
+ * @since Series 60 3.0
+ * @param none.
+ * @return None.
+ */
+ inline RCRClient& SessionHandle() { return *iClient; }
+
+private: // Data
+
+ /**
+ * Pointer to client. Not owned.
+ */
+ RCRClient* iClient;
+
+ };
+
+#endif // RCRSERVICEBASE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngineClient/rom/commonrecordingengineclient.iby Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+
+#ifndef __COMMONRECORDINGENGINECLIENT_IBY__
+#define __COMMONRECORDINGENGINECLIENT_IBY__
+
+#include <data_caging_paths_for_iby.hrh>
+
+file=ABI_DIR\BUILD_DIR\CommonRecordingEngineClient.dll SHARED_LIB_DIR\CommonRecordingEngineClient.dll
+
+#endif // __COMMONRECORDINGENGINECLIENT_IBY__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngineClient/src/CCRAPIBase.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,59 @@
+/*
+* Copyright (c) 2005 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: Implementation of IptvRTP client's API*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <ipvideo/CCRApiBase.h>
+#include "CCRServerHandleSingleton.h"
+
+// CONSTANTS
+// None.
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRApiBase::CCRApiBase
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCRApiBase::CCRApiBase()
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRApiBase::BaseConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCRApiBase::BaseConstructL()
+ {
+ iSingleton = CCRServerHandleSingleton::InstanceL();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRApiBase::~CCRApiBase
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRApiBase::~CCRApiBase()
+ {
+ CCRServerHandleSingleton::Release();
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngineClient/src/CCRDvrApi.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,398 @@
+/*
+* 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: Implementation of IptvRTP client's API*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <ipvideo/CCRDvrApi.h>
+#include "RCRService.h"
+#include "RCRClient.h"
+#include <ipvideo/MCREngineObserver.h>
+#include "CCRMsgQueueObserver.h"
+#include "CCRServerHandleSingleton.h"
+
+// CONSTANTS
+// None
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::NewL
+// Static two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCRDvrApi* CCRDvrApi::NewL( MCREngineObserver *aObserver )
+ {
+ CCRDvrApi* self = new( ELeave ) CCRDvrApi();
+ CleanupStack::PushL( self );
+ self->ConstructL( aObserver );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::NewL
+// Static two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCRDvrApi* CCRDvrApi::NewL()
+ {
+ CCRDvrApi* self = new( ELeave ) CCRDvrApi();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::CCRDvrApi
+// -----------------------------------------------------------------------------
+//
+CCRDvrApi::CCRDvrApi()
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCRDvrApi::ConstructL( MCREngineObserver *aObserver )
+ {
+ CCRApiBase::BaseConstructL();
+ iQueueObserver = CCRMsgQueueObserver::NewL();
+ iQueueObserver->SetSessionId( 0 );
+ iQueueObserver->AddMsgQueueObserverL( aObserver );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCRDvrApi::ConstructL()
+ {
+ CCRApiBase::BaseConstructL();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::~CCRDvrApi
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCRDvrApi::~CCRDvrApi()
+ {
+ // note what happens in CCRAPIBase, the iClient et al.
+ // might get deleted there.
+ delete iQueueObserver;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::SetIap
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::SetIap( const TSubConnectionUniqueId& aIapId )
+ {
+ return iSingleton->Service().SetIap( aIapId );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::CancelSetIap
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::CancelSetIap()
+ {
+ return iSingleton->Service().CancelSetIap();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::PlayRtspUrl
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::PlayRtspUrl(
+ TUint& aSessionChk,
+ const SCRRtspParams& aRtspUrl )
+ {
+ iQueueObserver->SetSessionId( 0 );
+ TInt err( iSingleton->Service().PlayRtspUrl( aSessionChk, aRtspUrl ) );
+ if ( !err )
+ {
+ iQueueObserver->SetSessionId( aSessionChk );
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::PlayDvbhStream
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::PlayDvbhStream(
+ TUint& aSessionChk,
+ const SCRLiveParams& aDvbhLive )
+ {
+ iQueueObserver->SetSessionId( 0 );
+ TInt err( iSingleton->Service().PlayDvbhStream( aSessionChk, aDvbhLive ) );
+ if ( !err )
+ {
+ iQueueObserver->SetSessionId( aSessionChk );
+ }
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::ChangeDvbhService
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::ChangeDvbhService(
+ TUint& aSessionChk,
+ const SCRLiveParams& aDvbhLive )
+ {
+ TInt err( iSingleton->Service().ChangeDvbhService( aSessionChk, aDvbhLive ) );
+ if ( !err )
+ {
+ iQueueObserver->SetSessionId( aSessionChk );
+ }
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::PlayRtpFile
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::PlayRtpFile(
+ TUint& aSessionChk,
+ const SCRRtpPlayParams& aRtpFile )
+ {
+ iQueueObserver->SetSessionId( 0 );
+ TInt err( iSingleton->Service().PlayRtpFile( aSessionChk, aRtpFile ) );
+ if ( !err )
+ {
+ iQueueObserver->SetSessionId( aSessionChk );
+ }
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::PlayRtpFile
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::PlayRtpFile(
+ TUint& aSessionChk,
+ const RFile& aRtpHandle )
+ {
+ iQueueObserver->SetSessionId( 0 );
+ TInt err( iSingleton->Service().PlayRtpFile( aSessionChk, aRtpHandle ) );
+ if ( !err )
+ {
+ iQueueObserver->SetSessionId( aSessionChk );
+ }
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::RecordCurrentStream
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::RecordCurrentStream(
+ const TUint aSessionChk,
+ const SCRRecordParams& aRecordParams )
+ {
+ return iSingleton->Service().RecordCurrentStream( aSessionChk, aRecordParams );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::RecordRtspStream
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::RecordRtspStream(
+ TUint& aSessionChk,
+ const SCRRtspParams& aRtspUrl,
+ const SCRRecordParams& aRecordParams )
+ {
+ return iSingleton->Service().RecordRtspStream(
+ aSessionChk, aRtspUrl, aRecordParams );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::RecordDvbhStream
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::RecordDvbhStream(
+ TUint& aSessionChk,
+ const SCRLiveParams& aLiveParams,
+ const SCRRecordParams& aRecordParams )
+ {
+ return iSingleton->Service().RecordDvbhStream(
+ aSessionChk, aLiveParams, aRecordParams );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::PauseRecordStream
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::PauseRecordStream(
+ const TUint aSessionChk,
+ const TBool& aStart )
+ {
+ return iSingleton->Service().PauseRecordStream( aSessionChk, aStart );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::StopRecordStream
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::StopRecordStream( const TUint aSessionChk )
+ {
+ return iSingleton->Service().StopRecordStream( aSessionChk );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::StartTimeShift
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::StartTimeShift(
+ TUint& aTimeShiftChk,
+ const TUint aSessionChk )
+ {
+ return iSingleton->Service().StartTimeShift( aTimeShiftChk, aSessionChk );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::StopTimeShift
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::StopTimeShift(
+ const TUint aTimeShiftChk,
+ const TUint aCurrentChk )
+ {
+ return iSingleton->Service().StopTimeShift( aTimeShiftChk, aCurrentChk );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::PlayCommand
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::PlayCommand(
+ const TUint aSessionChk,
+ const TReal aStartPos,
+ const TReal aEndPos )
+ {
+ return iSingleton->Service().PlayCommand( aSessionChk, aStartPos, aEndPos );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::PauseCommand
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::PauseCommand( const TUint aSessionChk )
+ {
+ return iSingleton->Service().PauseCommand( aSessionChk );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::StopCommand
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::StopCommand( const TUint aSessionChk )
+ {
+ return iSingleton->Service().StopCommand( aSessionChk );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::SetPosition
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::SetPosition(
+ const TUint aSessionChk,
+ const TInt64 aPosition )
+ {
+ return iSingleton->Service().SetPosition( aSessionChk, aPosition );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::GetPosition
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::GetPosition(
+ const TUint aSessionChk,
+ TInt64& aPosition,
+ TInt64& aDuration )
+ {
+ return iSingleton->Service().GetPosition( aSessionChk, aPosition, aDuration );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::CloseSession
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::CloseSession( const TUint aSessionChk )
+ {
+ return iSingleton->Service().CloseSession( aSessionChk );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::PlayNullSource
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::PlayNullSource( TUint& aSessionChk )
+ {
+ return iSingleton->Service().PlayNullSource( aSessionChk );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRDvrApi::PlayRtspUrlToNullSink
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCRDvrApi::PlayRtspUrlToNullSink(
+ TUint& aSessionChk,
+ const SCRRtspParams& aRtspUrl )
+ {
+ iQueueObserver->SetSessionId( 0 );
+ TInt err( iSingleton->Service().PlayRtspUrlToNullSink( aSessionChk, aRtspUrl ) );
+ if ( !err )
+ {
+ iQueueObserver->SetSessionId( aSessionChk );
+ }
+ return err;
+ }
+
+// End of File
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngineClient/src/CCRMsgQueueObserver.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,365 @@
+/*
+* 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: Offers interface to RMsgQueue in civilized manner.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCRMsgQueueObserver.h"
+#include <ipvideo/MCREngineObserver.h>
+#include <ipvideo/CRTypeDefs.h>
+#include "videoserviceutilsLogger.h"
+
+// CONSTANTS
+// None
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCRMsgQueueObserver::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCRMsgQueueObserver* CCRMsgQueueObserver::NewL()
+ {
+ CCRMsgQueueObserver* self = new( ELeave ) CCRMsgQueueObserver();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRMsgQueueObserver::CCRMsgQueueObserver()
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCRMsgQueueObserver::CCRMsgQueueObserver() : CActive( EPriorityAbsoluteHigh )
+ {
+ // Note! CActive's priority must be absolute high for ensure that
+ // the messages are arrived in right order to VIA.
+ CActiveScheduler::Add( this );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRMsgQueueObserver::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCRMsgQueueObserver::ConstructL()
+ {
+ LOG( "CCRMsgQueueObserver::ConstructL() in" );
+
+ RProcess process;
+ TInt handleId( process.Handle() );
+ TBuf<KCRQueueNameLength> queueName;
+ queueName.Format(KCRMsgQueueName, handleId);
+ queueName.Trim();
+ TInt err( iQueue.CreateGlobal( queueName,
+ sizeof( SCRQueueEntry ) ) );
+ LOG2( "CCRMsgQueueObserver createglobal %S = %d", &queueName, err );
+ err = iQueue.OpenGlobal( queueName ) ;
+ LOG1( "CCRMsgQueueObserver openglobal = %d", err );
+ User::LeaveIfError( err );
+ iQueue.NotifyDataAvailable( iStatus );
+ LOG1( "CCRMsgQueueObserver queue message size is %d", iQueue.MessageSize() );
+ SetActive();
+
+ LOG( "CCRMsgQueueObserver::ConstructL() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRMsgQueueObserver::~CCRMsgQueueObserver()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCRMsgQueueObserver::~CCRMsgQueueObserver()
+ {
+ LOG( "CCRMsgQueueObserver::~CCRMsgQueueObserver() in" );
+
+ Cancel();
+ iQueue.Close();
+ iObservers.Reset();
+ iObservers.Close();
+
+ LOG( "CCRMsgQueueObserver::~CCRMsgQueueObserver() out" );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCRMsgQueueObserver::RunL()
+// From CActive
+// -----------------------------------------------------------------------------
+//
+void CCRMsgQueueObserver::RunL()
+ {
+ LOG1( "CCRMsgQueueObserver::RunL() in, iStatus: %d", iStatus.Int() );
+
+ if ( iStatus.Int() == KErrNone )
+ {
+ TInt i( 0 );
+ if ( iQueue.Receive( iReceivedMessage ) == KErrNone )
+ {
+ if ( !iReceivedMessage.iSessionId || // or our id has not been set yet
+ iReceivedMessage.iSessionId == iSessionId ) // if the id matches
+ {
+ switch ( iReceivedMessage.iMsg )
+ {
+ case ECRMsgQueueAuthenticationNeeded:
+ LOG( "CCRMsgQueueObserver EAuthenticationFailed" );
+ SCRObserverMsg authNotify;
+ authNotify.iMsg = ECRAuthenticationNeeded;
+ authNotify.iErr = iReceivedMessage.iErr;
+ for ( i = 0; i < iObservers.Count(); i ++ )
+ {
+ TRAP_IGNORE( iObservers[i]->NotifyL( authNotify ) );
+ }
+
+ break;
+
+ case ECRMsgQueueAttachCompleted:
+ {
+ LOG( "CCRMsgQueueObserver ECRMsgQueueAttachCompleted" );
+ SCRObserverMsg iapNotify;
+ iapNotify.iMsg = ECRAttachCompleted;
+ iapNotify.iErr = iReceivedMessage.iErr;
+ for ( i = 0; i < iObservers.Count(); i ++ )
+ {
+ TRAP_IGNORE( iObservers[i]->NotifyL( iapNotify ) );
+ }
+ }
+ break;
+
+ case ECRMsgQueueConnectionError:
+ {
+ LOG1( "CCRMsgQueueObserver ECRMsgQueueConnectionError, iReceivedMessage.iErr: %d",
+ iReceivedMessage.iErr );
+ SCRObserverMsg iapNotify;
+ iapNotify.iMsg = ECRConnectionError;
+ iapNotify.iErr = iReceivedMessage.iErr;
+ for ( i = 0; i < iObservers.Count(); i ++ )
+ {
+ TRAP_IGNORE( iObservers[i]->NotifyL( iapNotify ) );
+ }
+ }
+ break;
+
+ case ECRMsgQueueNotEnoughBandwidth:
+ {
+ LOG( "CCRMsgQueueObserver ECRMsgQueueNotEnoughBandwidth" );
+ SCRObserverMsg iapNotify;
+ iapNotify.iMsg = ECRNotEnoughBandwidth;
+ iapNotify.iErr = iReceivedMessage.iErr;
+ for ( i = 0; i < iObservers.Count(); i ++ )
+ {
+ TRAP_IGNORE( iObservers[i]->NotifyL( iapNotify ) );
+ }
+ }
+ break;
+
+ case ECRMsgQueueSwitchingToTcp:
+ {
+ LOG( "CCRMsgQueueObserver ECRMsgQueueSwitchingToTcp" );
+ SCRObserverMsg iapNotify;
+ iapNotify.iMsg = ECRSwitchingToTcp;
+ iapNotify.iErr = iReceivedMessage.iErr;
+ for ( i = 0; i < iObservers.Count(); i ++ )
+ {
+ TRAP_IGNORE( iObservers[i]->NotifyL( iapNotify ) );
+ }
+ }
+ break;
+
+ case ECRMsgQueueNormalEndOfStream:
+ {
+ LOG( "CCRMsgQueueObserver ECRMsgQueueNormalEndOfStream" );
+ SCRObserverMsg iapNotify;
+ iapNotify.iMsg = ECRNormalEndOfStream;
+ iapNotify.iErr = iReceivedMessage.iErr;
+ for ( i = 0; i < iObservers.Count(); i ++ )
+ {
+ TRAP_IGNORE( iObservers[i]->NotifyL( iapNotify ) );
+ }
+ }
+ break;
+
+ case ECRMsgQueueStreamIsLiveStream:
+ {
+ LOG( "CCRMsgQueueObserver ECRMsgStreamIsLiveStream" );
+ SCRObserverMsg liveStreamNotify;
+ liveStreamNotify.iMsg = ECRStreamIsLiveStream;
+ liveStreamNotify.iErr = iReceivedMessage.iErr;
+ for ( i = 0; i < iObservers.Count(); i ++ )
+ {
+ TRAP_IGNORE( iObservers[i]->NotifyL( liveStreamNotify ) );
+ }
+ }
+ break;
+
+ case ECRMsgQueueStreamIsRealMedia:
+ {
+ LOG( "CCRMsgQueueObserver ECRMsgQueueStreamIsRealMedia" );
+ SCRObserverMsg realStreamNotify;
+ realStreamNotify.iMsg = ECRRealNetworksStream;
+ realStreamNotify.iErr = iReceivedMessage.iErr;
+ for ( i = 0; i < iObservers.Count(); i ++ )
+ {
+ TRAP_IGNORE( iObservers[i]->NotifyL( realStreamNotify ) );
+ }
+ }
+ break;
+
+ case ECRMsgQueueTestSinkData:
+ {
+ LOG( "CCRMsgQueueObserver ECRMsgQueueTestSinkData" );
+ SCRObserverMsg testSinkDataNotify;
+ testSinkDataNotify.iMsg = ECRTestSinkData;
+ testSinkDataNotify.iErr = iReceivedMessage.iErr;
+ for ( i = 0; i < iObservers.Count(); i ++ )
+ {
+ TRAP_IGNORE( iObservers[i]->NotifyL( testSinkDataNotify ) );
+ }
+ }
+ break;
+
+ case ECRMsgQueueSdpAvailable:
+ {
+ LOG( "CCRMsgQueueObserver ECRMsgQueueSdpAvailable" );
+ SCRObserverMsg sdpAvailableNotify;
+ sdpAvailableNotify.iMsg = ECRSdpAvailable;
+ sdpAvailableNotify.iErr = iReceivedMessage.iErr;
+ for ( i = 0; i < iObservers.Count(); i ++ )
+ {
+ TRAP_IGNORE( iObservers[i]->NotifyL( sdpAvailableNotify ) );
+ }
+ }
+ break;
+
+ case ECRMsgQueueReadyToSeek:
+ {
+ LOG( "CCRMsgQueueObserver ECRMsgQueueReadyToSeek" );
+ SCRObserverMsg readyToSeekNotify;
+ readyToSeekNotify.iMsg = ECRReadyToSeek;
+ readyToSeekNotify.iErr = iReceivedMessage.iErr;
+ for ( i = 0; i < iObservers.Count(); i ++ )
+ {
+ TRAP_IGNORE( iObservers[i]->NotifyL( readyToSeekNotify ) );
+ }
+ }
+ break;
+
+ case ECRMsgQueueRecordingStarted:
+ {
+ LOG( "CCRMsgQueueObserver ECRMsgQueueRecordingStarted" );
+ SCRObserverMsg realStreamNotify;
+ realStreamNotify.iMsg = ECRRecordingStarted;
+ realStreamNotify.iErr = iReceivedMessage.iErr;
+ for ( i = 0; i < iObservers.Count(); i ++ )
+ {
+ TRAP_IGNORE( iObservers[i]->NotifyL( realStreamNotify ) );
+ }
+ }
+ break;
+
+ case ECRMsgQueueRecordingPaused:
+ {
+ LOG( "CCRMsgQueueObserver ECRMsgQueueRecordingState" );
+ SCRObserverMsg realStreamNotify;
+ realStreamNotify.iMsg = ECRRecordingPaused;
+ realStreamNotify.iErr = iReceivedMessage.iErr;
+ for ( i = 0; i < iObservers.Count(); i ++ )
+ {
+ TRAP_IGNORE( iObservers[i]->NotifyL( realStreamNotify ) );
+ }
+ }
+ break;
+
+ case ECRMsgQueueRecordingEnded:
+ {
+ LOG( "CCRMsgQueueObserver ECRMsgQueueRecordingState" );
+ SCRObserverMsg realStreamNotify;
+ realStreamNotify.iMsg = ECRRecordingEnded;
+ realStreamNotify.iErr = iReceivedMessage.iErr;
+ for ( i = 0; i < iObservers.Count(); i ++ )
+ {
+ TRAP_IGNORE( iObservers[i]->NotifyL( realStreamNotify ) );
+ }
+ }
+ break;
+
+ default:
+ {
+ LOG1( "Unknown message: %d", iReceivedMessage.iMsg );
+ }
+ break;
+ }
+ }
+ else // message belongs to different session
+ {
+ LOG2( "Ignoring message: msg.sessionId=%d, iSessionId=%d",
+ iReceivedMessage.iSessionId, iSessionId );
+ }
+ }
+ }
+
+ iQueue.NotifyDataAvailable( iStatus );
+ SetActive();
+ LOG( "CCRMsgQueueObserver::RunL() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRMsgQueueObserver::RunError()
+// From CActive
+// -----------------------------------------------------------------------------
+//
+TInt CCRMsgQueueObserver::RunError( TInt aError )
+ {
+ LOG1( "CCRMsgQueueObserver::RunError(), aError: %d", aError );
+ return aError;
+ }
+
+// -----------------------------------------------------------------------------
+// CCRMsgQueueObserver::DoCancel()
+// From CActive
+// -----------------------------------------------------------------------------
+//
+void CCRMsgQueueObserver::DoCancel()
+ {
+ LOG( "CCRMsgQueueObserver::DoCancel()" );
+ iQueue.CancelDataAvailable();
+ }
+
+// -----------------------------------------------------------------------------
+// CCRMsgQueueObserver::AddMsgQueueObserverL()
+// Addes object to observer array
+// -----------------------------------------------------------------------------
+//
+void CCRMsgQueueObserver::AddMsgQueueObserverL( MCREngineObserver* aObserver )
+ {
+ User::LeaveIfError( iObservers.Append( aObserver ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CCRMsgQueueObserver::SetSessionId()
+// Sets session id to listen to
+// -----------------------------------------------------------------------------
+//
+void CCRMsgQueueObserver::SetSessionId( TInt aSessionId )
+ {
+ iSessionId = aSessionId;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngineClient/src/CCRServerHandleSingleton.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,103 @@
+/*
+* 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: Singleton to hold server session*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCRServerHandleSingleton.h"
+
+// CONSTANTS
+// None
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CCRServerHandleSingleton::CCRServerHandleSingleton() : iReferenceCount( 1 )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CCRServerHandleSingleton::~CCRServerHandleSingleton()
+ {
+ iService.Close();
+ iClient.Close();
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CCRServerHandleSingleton::ConstructL()
+ {
+ User::LeaveIfError( iClient.Connect() );
+ User::LeaveIfError( iService.Open( iClient ) );
+ }
+
+// -----------------------------------------------------------------------------
+// Returns the singleton instance.
+// -----------------------------------------------------------------------------
+//
+CCRServerHandleSingleton* CCRServerHandleSingleton::InstanceL()
+ {
+ CCRServerHandleSingleton* self = NULL;
+
+ TAny* tlsPtr = Dll::Tls();
+ if ( tlsPtr == NULL )
+ {
+ self = new( ELeave ) CCRServerHandleSingleton;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ User::LeaveIfError( Dll::SetTls( self ) );
+ CleanupStack::Pop( self );
+ }
+ else
+ {
+ self = static_cast<CCRServerHandleSingleton*>( tlsPtr );
+ ++self->iReferenceCount;
+ }
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// Releases the singleton instance.
+// -----------------------------------------------------------------------------
+//
+void CCRServerHandleSingleton::Release()
+ {
+ TAny* tlsPtr = Dll::Tls();
+ __ASSERT_DEBUG( tlsPtr != NULL, User::Panic( _L( "CCRApiBase" ), KErrNotFound ) );
+
+ if ( tlsPtr != NULL )
+ {
+ CCRServerHandleSingleton* self = static_cast<CCRServerHandleSingleton*>( tlsPtr );
+ if ( --self->iReferenceCount == 0 )
+ {
+ delete self;
+ Dll::FreeTls();
+ }
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngineClient/src/RCRClient.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,157 @@
+/*
+* 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: Implementation of CR client's Server*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "RCRClient.h"
+#include <ipvideo/CRTypeDefs.h>
+#include <e32math.h>
+#include <f32file.h>
+
+// CONSTANTS
+const TUint KDefaultMessageSlots( 4 );
+const TUint KNumberOfServerStartupAttempts( 2 );
+
+// LOCAL FUNCTION PROTOTYPES
+static TInt StartServer();
+static TInt CreateServerProcess();
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// StartServer
+// Returns: Error code
+// -----------------------------------------------------------------------------
+//
+static TInt StartServer()
+ {
+ TFindServer findServer( KCRServerNameExe );
+ TFullName name( KNullDesC );
+
+ // Server already running?
+ TInt result( findServer.Next( name ) );
+ if ( !result )
+ {
+ return KErrNone;
+ }
+
+ // Process
+ result = CreateServerProcess();
+
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CreateServerProcess
+//
+// -----------------------------------------------------------------------------
+//
+static TInt CreateServerProcess()
+ {
+ RProcess server;
+ TInt err( server.Create( KCRServerNameExe , _L( "" ) ) );
+ if ( err )
+ {
+ return err;
+ }
+
+ // Makes the server eligible for execution.
+ TRequestStatus reqStatus;
+ server.Rendezvous(reqStatus);
+
+ server.Resume();
+
+ User::WaitForRequest(reqStatus);
+
+ if( reqStatus.Int() != KErrNone )
+ {
+ server.Close();
+ }
+
+ return reqStatus.Int();
+ }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// RCRClient::RCRClient
+//
+// -----------------------------------------------------------------------------
+//
+RCRClient::RCRClient() : RSessionBase()
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// RCRClient::Connect
+//
+// -----------------------------------------------------------------------------
+//
+TInt RCRClient::Connect()
+ {
+ TInt ret( KErrNotFound );
+ TInt retry( KNumberOfServerStartupAttempts );
+ do
+ {
+ // Start
+ ret = StartServer();
+ if ( ret != KErrNone && ret != KErrAlreadyExists )
+ {
+ return ret;
+ }
+
+ // Subsession
+ ret = CreateSession( KCRServerNameExe, Version(), KDefaultMessageSlots );
+ if ( ret != KErrNotFound && ret != KErrServerTerminated )
+ {
+ return ret;
+ }
+
+ retry--;
+ }
+ while( retry >= 0 );
+
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRClient::Close
+//
+// -----------------------------------------------------------------------------
+//
+void RCRClient::Close()
+ {
+ TIpcArgs args( TIpcArgs::ENothing );
+ SendReceive( ECRServCloseSession, args );
+ RHandleBase::Close();
+ }
+
+// -----------------------------------------------------------------------------
+// RCRClient::Version
+//
+// -----------------------------------------------------------------------------
+//
+TVersion RCRClient::Version( void ) const
+ {
+ return( TVersion( KCRServMajorVersionNumber,
+ KCRServMinorVersionNumber,
+ KCRServBuildVersionNumber ) );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngineClient/src/RCRService.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,518 @@
+/*
+* 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: Implementation of RC client's Service*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "RCRService.h"
+#include <ipvideo/CRTypeDefs.h>
+#include <e32math.h>
+
+// CONSTANTS
+// None
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// RCRService::RCRService
+//
+// -----------------------------------------------------------------------------
+//
+RCRService::RCRService() : RCRServiceBase()
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::SetIap
+// LiveTV specific.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::SetIap( const TSubConnectionUniqueId& aIapId )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ SCRRtspIapParams msg;
+ RProcess process;
+ TInt handleId( process.Handle() );
+ msg.iQueueName.Format( KCRMsgQueueName, handleId );
+ msg.iQueueName.Trim();
+ msg.iConnectionId = aIapId;
+
+ TPckgBuf<SCRRtspIapParams> pckg( msg );
+ TIpcArgs args( &pckg );
+ return SendReceive( ECRSetIap, args );
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::CancelSetIap
+// LiveTV specific.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::CancelSetIap()
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TIpcArgs args;
+ return SendReceive( ECRCancelSetIap, args );
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::PlayRtspUrl
+// LiveTV specific.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::PlayRtspUrl(
+ TUint& aSessionChk,
+ const SCRRtspParams& aRtspParams )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ TPckgBuf<SCRRtspParams> pckg1( aRtspParams );
+ TIpcArgs args( &pckg0, &pckg1 );
+ TInt err( SendReceive( ECRPlayRtspUrl, args ) );
+ aSessionChk = pckg0();
+ return err;
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::PlayDvbhStream
+// DVB-H specific.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::PlayDvbhStream(
+ TUint& aSessionChk,
+ const SCRLiveParams& aLiveParams )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ TPckgBuf<SCRLiveParams> pckg1( aLiveParams );
+ TIpcArgs args( &pckg0, &pckg1 );
+ TInt err( SendReceive( ECRPlayDvbhLive, args ) );
+ aSessionChk = pckg0();
+ return err;
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::ChangeDvbhService
+// DVB-H specific.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::ChangeDvbhService(
+ TUint& aSessionChk,
+ const SCRLiveParams& aLiveParams )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg0( aSessionChk );
+ TPckgBuf<SCRLiveParams> pckg1( aLiveParams );
+ TIpcArgs args( &pckg0, &pckg1 );
+ TInt err( SendReceive( ECRChangeService, args ) );
+ aSessionChk = pckg0();
+ return err;
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::PlayRtpFile
+// DVB-H specific.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::PlayRtpFile(
+ TUint& aSessionChk,
+ const SCRRtpPlayParams& aRtpFile )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ TPckgBuf<SCRRtpPlayParams> pckg1( aRtpFile );
+ TIpcArgs args( &pckg0, &pckg1 );
+ TInt err( SendReceive( ECRPlayRtpFile, args ) );
+ aSessionChk = pckg0();
+ return err;
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::PlayRtpFile
+// DVB-H specific.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::PlayRtpFile(
+ TUint& aSessionChk,
+ const RFile& aRtpHandle )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg( 0 );
+ TIpcArgs args( &pckg );
+ aRtpHandle.TransferToServer( args, 1, 2 );
+ TInt err( SendReceive( ECRPlayRtpHandle, args ) );
+ aSessionChk = pckg();
+ return err;
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::RecordCurrentStream
+// UI command.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::RecordCurrentStream(
+ const TUint aSessionChk,
+ const SCRRecordParams& aRecordParams )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg0( aSessionChk );
+ TPckgBuf<SCRRecordParams> pckg1( aRecordParams );
+ TIpcArgs args( &pckg0, &pckg1 );
+ return SendReceive( ECRRecordCurrentStream, args );
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::RecordRtspStream
+// UI command.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::RecordRtspStream(
+ TUint& aSessionChk,
+ const SCRRtspParams& aRtspUrl,
+ const SCRRecordParams& aRecordParams )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ TPckgBuf<SCRRtspParams> pckg1( aRtspUrl );
+ TPckgBuf<SCRRecordParams> pckg2( aRecordParams );
+ TIpcArgs args( &pckg0, &pckg1, &pckg2 );
+ TInt err( SendReceive( ECRRecordRtspStream, args ) );
+ aSessionChk = pckg0();
+ return err;
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::RecordDvbhStream
+// UI command.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::RecordDvbhStream(
+ TUint& aSessionChk,
+ const SCRLiveParams& aLiveParams,
+ const SCRRecordParams& aRecordParams )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ TPckgBuf<SCRLiveParams> pckg1( aLiveParams );
+ TPckgBuf<SCRRecordParams> pckg2( aRecordParams );
+ TIpcArgs args( &pckg0, &pckg1, &pckg2 );
+ TInt err( SendReceive( ECRRecordDvbhStream, args ) );
+ aSessionChk = pckg0();
+ return err;
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::PauseRecordStream
+// UI command.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::PauseRecordStream( const TUint aSessionChk, const TBool& aStart )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg0( aSessionChk );
+ TPckgBuf<TBool> pckg1( aStart );
+ TIpcArgs args( &pckg0, &pckg1 );
+ return SendReceive( ECRPauseRecordStream, args );
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::StopRecordStream
+// UI command.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::StopRecordStream( const TUint aSessionChk )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg0( aSessionChk );
+ TIpcArgs args( &pckg0 );
+ return SendReceive( ECRStopRecordStream, args );
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::StartTimeShift
+// UI command.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::StartTimeShift(
+ TUint& aTimeShiftChk,
+ const TUint aCurrentChk )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ TPckgBuf<TUint> pckg1( aCurrentChk );
+ TIpcArgs args( &pckg0, &pckg1 );
+ TInt err( SendReceive( ECRStartTimeShift, args ) );
+ aTimeShiftChk = pckg0();
+ return err;
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::StopTimeShift
+// UI command.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::StopTimeShift(
+ const TUint aTimeShiftChk,
+ const TUint aCurrentChk )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg0( aTimeShiftChk );
+ TPckgBuf<TUint> pckg1( aCurrentChk );
+ TIpcArgs args( &pckg0, &pckg1 );
+ return SendReceive( ECRStopTimeShift, args );
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::PlayCommand
+// Player command.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::PlayCommand(
+ const TUint aSessionChk,
+ const TReal& aStartPos,
+ const TReal& aEndPos )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg0( aSessionChk );
+ TPckgBuf<TInt64> pckg1( aStartPos );
+ TPckgBuf<TInt64> pckg2( aEndPos );
+ TIpcArgs args( &pckg0, &pckg1, &pckg2 );
+ return SendReceive( ECRPlayCommand, args );
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::PauseCommand
+// Player command.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::PauseCommand( const TUint aSessionChk )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg0( aSessionChk );
+ TIpcArgs args( &pckg0 );
+ return SendReceive( ECRPauseCommand, args );
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::StopCommand
+// Player command.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::StopCommand( const TUint aSessionChk )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg0( aSessionChk );
+ TIpcArgs args( &pckg0 );
+ return SendReceive( ECRStopCommand, args );
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::SetPosition
+// Sets position of packet source.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::SetPosition(
+ const TUint aSessionChk,
+ const TInt64 aPosition )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg0( aSessionChk );
+ TPckgBuf<TInt64> pckg1( aPosition );
+
+ TIpcArgs args( &pckg0, &pckg1 );
+ return SendReceive( ECRSetPosition, args );
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::GetPosition
+// Gets position of packet source.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::GetPosition(
+ const TUint aSessionChk,
+ TInt64& aPosition,
+ TInt64& aDuration )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg0( aSessionChk );
+ TPckgBuf<TInt64> pckg1( aPosition );
+ TPckgBuf<TInt64> pckg2( 0 );
+
+ TIpcArgs args( &pckg0, &pckg1, &pckg2 );
+ TInt err( SendReceive( ECRGetPosition, args ) );
+ aPosition = pckg1();
+ aDuration = pckg2();
+ return err;
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::CloseSession
+// Player command.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::CloseSession( const TUint aSessionChk )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg0( aSessionChk );
+ TIpcArgs args( &pckg0 );
+ return SendReceive( ECRCloseSession, args );
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::PlayNullSource
+// Debug purposes.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::PlayNullSource( TUint& aSessionChk )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ TIpcArgs args( &pckg0 );
+ TInt err( SendReceive( ECRPlayNullSource, args ) );
+ aSessionChk = pckg0();
+ return err;
+ }
+
+ return KErrServerTerminated;
+ }
+
+// -----------------------------------------------------------------------------
+// RCRService::PlayRtspUrlToNullSink
+// Debug purposes.
+// -----------------------------------------------------------------------------
+//
+TInt RCRService::PlayRtspUrlToNullSink(
+ TUint& aSessionChk,
+ const SCRRtspParams& aRtspParams )
+ {
+ __ASSERT_ALWAYS( &( SessionHandle() ), PanicClient( KErrBadHandle ) );
+ if ( SubSessionHandle() )
+ {
+ TPckgBuf<TUint> pckg0( 0 );
+ TPckgBuf<SCRRtspParams> pckg1( aRtspParams );
+ TIpcArgs args( &pckg0, &pckg1 );
+ TInt err( SendReceive( ECRPlayRtspUrlToNullSink, args ) );
+ aSessionChk = pckg0();
+ return err;
+ }
+
+ return KErrServerTerminated;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngineClient/src/RCRServiceBase.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,76 @@
+/*
+* 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: Implementation of RC client's ServiceBase*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "RCRServiceBase.h"
+#include "RCRClient.h"
+#include <e32math.h>
+
+// CONSTANTS
+// None
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// RCRServiceBase::RCRServiceBase
+//
+// -----------------------------------------------------------------------------
+//
+RCRServiceBase::RCRServiceBase()
+ : RSubSessionBase(),
+ iClient( NULL )
+ {
+ // None
+ }
+
+// -----------------------------------------------------------------------------
+// RCRServiceBase::Open
+//
+// -----------------------------------------------------------------------------
+//
+TInt RCRServiceBase::Open( RCRClient& aClient )
+ {
+ __ASSERT_ALWAYS( aClient.Handle(), PanicClient( KErrBadHandle ) );
+ iClient = &aClient;
+ TIpcArgs args( TIpcArgs::ENothing );
+ return CreateSubSession( aClient, ECRServCreateSubSession, args );
+ }
+
+// -----------------------------------------------------------------------------
+// RCRServiceBase::Close
+//
+// -----------------------------------------------------------------------------
+//
+void RCRServiceBase::Close()
+ {
+ RSubSessionBase::CloseSubSession( ECRServCloseSubSession );
+ }
+
+// -----------------------------------------------------------------------------
+// RCRServiceBase::PanicClient
+//
+// -----------------------------------------------------------------------------
+//
+void RCRServiceBase::PanicClient( TInt aFault )
+ {
+ _LIT( KCRClientFault, "CRApi Client Fault" );
+ User::Panic( KCRClientFault, aFault );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,39 @@
+/*
+* 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: Build information file for RTP engine.*
+*/
+
+
+
+
+#include <platform_paths.hrh>
+#include "../CommonRecordingEngine/inc/VideoServiceUtilsConf.hrh"
+
+#ifdef RD_IPTV_FEA_RTP_CLIP_SUPPORT
+#include "../CommonRecordingEngine/DvrRtpUtils/group/bld.inf"
+#include "../CommonRecordingEngine/DvrRtpClipHandler/group/bld.inf"
+#include "../CommonRecordingEngine/DvrRtpClipRecognizer/group/bld.inf"
+#endif // RD_IPTV_FEA_RTP_CLIP_SUPPORT
+
+#include "../CommonRecordingEngine/group/bld.inf"
+#include "../CommonRecordingEngineClient/Group/bld.inf"
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+
+PRJ_MMPFILES
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2004-2005 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:
+*
+*/
+
+
+
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+#include "../videoutils_plat/group/bld.inf"
+#include "../videoscheduler/group/bld.inf"
+#include "../videoconnutility/group/bld.inf"
+
+
+PRJ_EXPORTS
+
+PRJ_MMPFILES
+
+
+PRJ_TESTMMPFILES
+#include "../tsrc/group/bld.inf"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/group/cleaner.bat Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,19 @@
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description: Cleaner script that tries to really clean everything
+rem from the environment.
+rem
+
+@echo off
+perl -S cleaner.pl %1 %2 %3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/group/cleaner.mk Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,39 @@
+#
+# Copyright (c) 2009 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:
+#
+
+do_nothing :
+ @rem do_nothing
+
+MAKMAKE : do_nothing
+
+BLD : do_nothing
+
+CLEAN :
+ @perl -S cleaner.pl clean
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+RESOURCE : do_nothing
+
+FREEZE : do_nothing
+
+SAVESPACE : do_nothing
+
+RELEASABLES : do_nothing
+
+FINAL : do_nothing
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/group/cleaner.pl Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,266 @@
+#
+# Copyright (c) 2009 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: Cleaner script to perform more thorough cleanup than abld reallyclean#
+
+use strict;
+use constant DEBUG => 0;
+
+my $iCleanup_file = "cleanup.txt";
+my @iErrors = ();
+my $iTag_platform = "__PLATFORM__";
+my $iTag_target = "__TARGET__";
+my @iPlatforms = ( "winscw", "armv5" );
+my @iTargets = ( "udeb", "urel" );
+my $iSlowClean = 0;
+my $iTest = 0;
+
+# ----------------------------------------------------------------------------
+# Main
+# ----------------------------------------------------------------------------
+
+my $iCommand = shift @ARGV || "";
+
+if ( $iCommand eq "clean" ) {
+
+ print "Running cleanup...\n";
+ clean();
+
+} elsif ( $iCommand eq "slowclean" ) {
+
+ $iSlowClean = 1;
+ clean();
+
+} elsif ( $iCommand eq "test" ) {
+
+ print "Running test...\n";
+ $iTest = 1;
+ clean();
+
+} elsif ( $iCommand eq "init" ) {
+
+ init_environment();
+
+} elsif ( $iCommand eq "generate" ) {
+
+ generate();
+
+} else {
+ print "Usage: $0 <command>\n";
+ print "Commands:\n";
+ print " init Initializes the build environment by calling 'bldmake bldfiles' and 'abld makefile'.\n";
+ print " This needs to be run only if the environment has not been built yet and 'abld build -what' fails.\n";
+ print " generate Generates a configuration file of releasables to be cleaned.\n";
+ print " clean Cleans the build quickly by deleting all matching files from the configuration file.\n";
+ print " slowclean Slower and more thorough clean that deletes all similar files in addition to the ones normal clean deletes.\n";
+ print " Example: Cleanup list contains file 'binary.dll'. Slowclean will also delete files named\n";
+ print " 'binary.dll.foo' and 'binary.dll.bar'\n";
+ print " test Runs a test to see what files would be deleted on a real cleanup run.\n";
+ print " Shows only files that would not be deleted by 'abld reallyclean'.\n";
+ exit 0;
+}
+
+# Print possible errors
+print join "\n", @iErrors;
+
+exit 0;
+
+# ----------------------------------------------------------------------------
+# Subroutines
+# ----------------------------------------------------------------------------
+
+
+# ----------------------------------------------------------------------------
+# Initializes the environment to be able to call 'abld build -what'
+# ----------------------------------------------------------------------------
+#
+sub init_environment {
+ # Initialize the environment in order to get "abld build -what" to run properly
+ print "Initializing build environment...\n";
+
+ print "Calling 'bldmake bldfiles'\n";
+ system "bldmake bldfiles";
+
+ print "Calling 'abld export'\n";
+ system "abld export";
+
+ print "Calling 'abld makefile winscw'\n";
+ system "abld makefile winscw";
+
+ print "Calling 'abld makefile armv5'\n";
+ system "abld makefile armv5";
+
+ print "Done.\n";
+}
+
+
+# ----------------------------------------------------------------------------
+# Generates the cleanup list by calling 'abld build -what' and parsing it
+# ----------------------------------------------------------------------------
+#
+sub generate {
+ print "Attempting to generate the cleanup list...\n";
+
+ # Get the list of releasables from the build tools
+ open my $in, "abld build -what 2>&1 |" or die "Cannot open pipe! $!";
+
+ my %parsed;
+ while ( <$in> ) {
+ if ( /No such file or directory/ ) {
+ push @iErrors, "Unable to generate cleanup list. The environment is not ready. Run 'init' before running 'generate'";
+ last;
+ }
+
+ $_ = lc $_;
+ next unless /^\\epoc32/;
+
+ s/release\\(?:winscw|armv5)\\(?:udeb|urel)/release\\$iTag_platform\\$iTag_target/i;
+
+ # Cenrep file. Add the corresponding .cre file to the cleanup list
+ if ( /(.+?winscw\\c\\private\\10202be9\\)(.{8})\.txt/ ) {
+ $parsed{ $1 . "persists\\" . $2 . ".cre\n" }++;
+ }
+
+ $parsed{ $_ }++;
+ }
+
+ close $in;
+
+ if ( @iErrors > 0 ) {
+ return;
+ }
+
+ open my $out, ">$iCleanup_file" or die "Cannot open file $iCleanup_file! $!";
+ print $out join "", sort keys %parsed;
+ close $out;
+}
+
+
+# ----------------------------------------------------------------------------
+# Cleans up the environment by deleting all files found from the cleanup list
+# Cleaning is done by finding all files that match the string in the list in
+# so all similarly named files are also deleted. (CodeWarrior temporary files etc )
+# ----------------------------------------------------------------------------
+#
+sub clean {
+
+ if ( !-e $iCleanup_file ) {
+ push @iErrors, "Cleanup file $iCleanup_file not found! Run 'generate' to generate it.";
+ return;
+ }
+
+ open my $in, "$iCleanup_file" or die "Cannot open cleanup file $iCleanup_file! $!";
+ my @releasables = <$in>;
+ close $in;
+
+ my $total = scalar @releasables;
+ print "$total rules found from cleanup list...\n";
+
+ my @deleted = ();
+ my $progress = 0;
+ foreach ( @releasables ) {
+ $progress++;
+
+ next if $_ eq "";
+
+ # Found __PLATFORM__ tag. Substitute it with all known platforms and add them back to the array
+ if ( /$iTag_platform/ ) {
+ foreach my $platform ( @iPlatforms ) {
+ my $new_releasable = $_;
+ $new_releasable =~ s/$iTag_platform/$platform/;
+ debug( "Adding releasable: $new_releasable" );
+ push @releasables, $new_releasable;
+ $total++; # Adjust the total amount of files to be deleted
+ }
+
+ # Move on to the next round
+ next;
+ }
+
+ # Found __TARGET__ tag. Substitute it with all known targets and add them back to the array
+ if ( /$iTag_target/ ) {
+ foreach my $target ( @iTargets ) {
+ my $new_releasable = $_;
+ $new_releasable =~ s/$iTag_target/$target/;
+ debug( "Adding releasable: $new_releasable" );
+ push @releasables, $new_releasable;
+ $total++; # Adjust the total amount of files to be deleted
+ }
+
+ # Move on to the next round
+ next;
+ }
+
+ # At this point there is nothing to substitute. Find all files matching the releasable name and delete them
+ chomp; # Get rid of newline at the end
+
+ my $releasable = lc $_;
+ my @files_found;
+ if ( $iSlowClean == 1 ) {
+ @files_found = glob "$_*";
+ } else {
+ push @files_found, $releasable;
+ }
+ foreach my $file ( @files_found ) {
+ next unless $file =~ /^\\epoc32/; # Some kind of safeguard, just in case
+
+ if ( $iTest == 1 ) {
+
+ # If the file is not one of the releasables, it would not be deleted by reallyclean
+ # So add it to the list of files that would only be deleted by this script
+
+ $file = lc $file;
+ if ( $file ne $releasable || $file =~ /\.cre$/ ) {
+ push @deleted, $file;
+ }
+
+ } else {
+
+ my $err = 0;
+ unlink $file or ( $err = -1 );
+ if ( $err ne -1 ) {
+ push @deleted, $file;
+ }
+ }
+ }
+
+ # Report progress
+ my $percent = ( $progress / $total ) * 100;
+ printf "\r ( %d / %d ) % .1f %%", $progress, $total, $percent;
+ }
+
+ if ( @deleted > 0 ) {
+ print "\n\nSummary:\n";
+ foreach my $deleted ( sort @deleted ) {
+ if ( $iTest ) {
+ print "Would be deleted: $deleted\n";
+ } else {
+ print "Deleted: $deleted\n";
+ }
+ }
+ } else {
+ print "\n\nNothing to be done.\n";
+ }
+}
+
+
+# ----------------------------------------------------------------------------
+# Debug output. Prints a string if the debug flag is defined
+# ----------------------------------------------------------------------------
+#
+sub debug {
+ my $msg = shift;
+ if ( DEBUG ) {
+ print $msg;
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/group/cleanup.txt Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,71 @@
+\epoc32\data\102750d5.rsc
+\epoc32\include\domain\middleware\ipvideo\ccrapibase.h
+\epoc32\include\domain\middleware\ipvideo\ccrdvrapi.h
+\epoc32\include\domain\middleware\ipvideo\ccsescheduledprogram.h
+\epoc32\include\domain\middleware\ipvideo\ccseschedulerapi.h
+\epoc32\include\domain\middleware\ipvideo\ccseschedulerpluginif.h
+\epoc32\include\domain\middleware\ipvideo\ccseschedulerpluginif.inl
+\epoc32\include\domain\middleware\ipvideo\cdvrsdpparser.h
+\epoc32\include\domain\middleware\ipvideo\crtpcliphandler.h
+\epoc32\include\domain\middleware\ipvideo\crtpcliphandler.inl
+\epoc32\include\domain\middleware\ipvideo\crtpclipmanager.h
+\epoc32\include\domain\middleware\ipvideo\crtpfilebase.h
+\epoc32\include\domain\middleware\ipvideo\crtpfilebase.inl
+\epoc32\include\domain\middleware\ipvideo\crtpmetaheader.h
+\epoc32\include\domain\middleware\ipvideo\crtputil.h
+\epoc32\include\domain\middleware\ipvideo\crtypedefs.h
+\epoc32\include\domain\middleware\ipvideo\cseengineuids.h
+\epoc32\include\domain\middleware\ipvideo\cseschedulerclientservercommon.h
+\epoc32\include\domain\middleware\ipvideo\mcrengineobserver.h
+\epoc32\include\domain\middleware\ipvideo\mcsepluginobserver.h
+\epoc32\include\domain\middleware\ipvideo\mcsescheduleobserver.h
+\epoc32\include\domain\middleware\ipvideo\mrtpcliprepairobserver.h
+\epoc32\include\domain\middleware\ipvideo\mrtpfileobserver.h
+\epoc32\include\domain\middleware\ipvideo\mrtpfilereadobserver.h
+\epoc32\include\domain\middleware\ipvideo\mrtpfilewriteobserver.h
+\epoc32\include\domain\middleware\ipvideo\rcseschedulerclient.h
+\epoc32\include\domain\middleware\ipvideo\rcseschedulerservice.h
+\epoc32\include\domain\middleware\ipvideo\rcseschedulerservicebase.h
+\epoc32\include\domain\middleware\ipvideo\tvcxconnutilnotifierparams.h
+\epoc32\include\domain\middleware\ipvideo\vcxconnectionutility.h
+\epoc32\include\domain\middleware\ipvideo\vcxconnutilengineobserver.h
+\epoc32\include\domain\middleware\vcxmyvideosdefs.h
+\epoc32\include\domain\middleware\vcxmyvideosuids.h
+\epoc32\include\domain\middleware\videoplayeruid.hrh
+\epoc32\localisation\102750d5\rsc\102750d5.rpp
+\epoc32\localisation\group\102750d5.info
+\epoc32\release\__PLATFORM__\__TARGET__\102750d5.rsc
+\epoc32\release\__PLATFORM__\__TARGET__\commonrecordingengine.exe
+\epoc32\release\__PLATFORM__\__TARGET__\commonrecordingengine.exe.map
+\epoc32\release\__PLATFORM__\__TARGET__\commonrecordingengineclient.dll
+\epoc32\release\__PLATFORM__\__TARGET__\commonrecordingengineclient.dll.map
+\epoc32\release\__PLATFORM__\__TARGET__\commonrecordingengineclient.lib
+\epoc32\release\__PLATFORM__\__TARGET__\cseschedulerclient.dll
+\epoc32\release\__PLATFORM__\__TARGET__\cseschedulerclient.dll.map
+\epoc32\release\__PLATFORM__\__TARGET__\cseschedulerclient.lib
+\epoc32\release\__PLATFORM__\__TARGET__\cseschedulerserver.exe
+\epoc32\release\__PLATFORM__\__TARGET__\cseschedulerserver.exe.map
+\epoc32\release\__PLATFORM__\__TARGET__\dvrsdpparser.dll
+\epoc32\release\__PLATFORM__\__TARGET__\dvrsdpparser.dll.map
+\epoc32\release\__PLATFORM__\__TARGET__\dvrsdpparser.lib
+\epoc32\release\__PLATFORM__\__TARGET__\vcxconnectionutility.dll
+\epoc32\release\__PLATFORM__\__TARGET__\vcxconnectionutility.dll.map
+\epoc32\release\__PLATFORM__\__TARGET__\vcxconnectionutility.lib
+\epoc32\release\__PLATFORM__\__TARGET__\vcxconnutilpsworker.exe
+\epoc32\release\__PLATFORM__\__TARGET__\vcxconnutilpsworker.exe.map
+\epoc32\release\armv5\lib\commonrecordingengineclient.dso
+\epoc32\release\armv5\lib\commonrecordingengineclient.lib
+\epoc32\release\armv5\lib\commonrecordingengineclient{000a0000}.dso
+\epoc32\release\armv5\lib\commonrecordingengineclient{000a0000}.lib
+\epoc32\release\armv5\lib\cseschedulerclient.dso
+\epoc32\release\armv5\lib\cseschedulerclient.lib
+\epoc32\release\armv5\lib\cseschedulerclient{000a0000}.dso
+\epoc32\release\armv5\lib\cseschedulerclient{000a0000}.lib
+\epoc32\release\armv5\lib\dvrsdpparser.dso
+\epoc32\release\armv5\lib\dvrsdpparser.lib
+\epoc32\release\armv5\lib\dvrsdpparser{000a0000}.dso
+\epoc32\release\armv5\lib\dvrsdpparser{000a0000}.lib
+\epoc32\release\armv5\lib\vcxconnectionutility.dso
+\epoc32\release\armv5\lib\vcxconnectionutility.lib
+\epoc32\release\armv5\lib\vcxconnectionutility{000a0000}.dso
+\epoc32\release\armv5\lib\vcxconnectionutility{000a0000}.lib
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/layers.sysdef.xml Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!DOCTYPE SystemDefinition SYSTEM "sysdef_1_4_0.dtd" [
+ <!ENTITY layer_real_source_path "sf/mw/videoutils" >
+]>
+
+<SystemDefinition name="videoutils" schema="1.4.0">
+ <systemModel>
+ <layer name="mw_layer">
+ <module name="videoutils">
+ <unit unitID="vado.videoutils" mrp="" bldFile="&layer_real_source_path;/group" name="videoutils" />
+ </module>
+ </layer>
+
+ <layer name="api_test_layer">
+ <module name="videoscheduler_api_tsrc">
+ <unit unitID="vado.videoscheduler_api_test" name="videoscheduler_api_tsrc" bldFile="&layer_real_source_path;/videoutils_plat/videoscheduler_api/tsrc/group" mrp=""/>
+ </module>
+ <module name="videoconnutility_apitsrc">
+ <unit unitID="vado.videoconnutility_api_test" name="videoconnutility_api_tsrc" bldFile="&layer_real_source_path;/videoutils_plat/videoconnutility_api/tsrc/group" mrp=""/>
+ </module>
+ </layer>
+
+ </systemModel>
+</SystemDefinition>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/package_definition.xml Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<SystemDefinition schema="3.0.0">
+ <package id="videoutils" name="Video Utils" levels="eng util if">
+ <collection id="dvrengine" name="DVR Engine" level="eng">
+ <component id="commonrecordingengine" filter="s60" name="Common Recording Engine">
+ <!-- can only have one unit, #include the others from the main nit -->
+ <unit bldFile="dvrengine/commonrecordingengine/group"/>
+ <unit bldFile="dvrengine/commonrecordingengine/dvrrtpcliphandler/group"/>
+ <unit bldFile="dvrengine/commonrecordingengine/dvrrtpcliprecognizer/group"/>
+ <unit bldFile="dvrengine/commonrecordingengine/dvrrtputils/group"/>
+ </component>
+ <component id="commonrecordingengineclient" filter="s60" name="Common Recording Engine Client">
+ <unit bldFile="dvrengine/commonrecordingengineclient/group"/>
+ </component>
+ <component id="dvrengine_build" filter="s60" name="DVR Engine Build">
+ <!-- should split this into the bld.infs above -->
+ <unit bldFile="dvrengine/group"/>
+ </component>
+ </collection>
+ <collection id="videoconnutility" name="Video Connection Utility" level="util">
+ <component id="connutilpsworker" filter="s60" name="Connection Utility Publish and Subscribe Worker">
+ <unit bldFile="videoconnutility/connutilpsworker/group"/>
+ </component>
+ <component id="videoconnutility_build" filter="s60" name="Video Connection Utility Build">
+ <unit bldFile="videoconnutility/group"/>
+ </component>
+ </collection>
+ <collection id="videoscheduler" name="Video Scheduler" level="util">
+ <component id="schedulerclient" filter="s60" name="Video Scheduler Client">
+ <unit bldFile="videoscheduler/schedulerclient/group"/>
+ </component>
+ <component id="schedulerserver" filter="s60" name="Video Scheduler Server">
+ <unit bldFile="videoscheduler/schedulerserver/group"/>
+ </component>
+ <component id="videoscheduler_build" filter="s60" name="Video Scheduler Build">
+ <!-- is this needed at all? Can the system include just be put in the above bld.infs? -->
+ <unit bldFile="videoscheduler/group"/>
+ </component>
+ </collection>
+ <collection id="videoutils_info" name="Video Utils Info" level="if">
+ <component id="videoutils_plat" filter="s60" name="Video Utils Platform Interfaces" class="api">
+ <unit bldFile="videoutils_plat/group"/>
+ <!-- do these test units need to be #included in the above bld.inf? -->
+ <!-- <unit bldFile="videoutils_plat/videoconnutility_api/tsrc/group"/> -->
+ <!-- <unit bldFile="videoutils_plat/videoconnutility_api/tsrc/vcxconnutiltestexe/group"/> -->
+ <!-- <unit bldFile="videoutils_plat/videoconnutility_api/tsrc/vcxtestcommon/group"/> -->
+ <!-- <unit bldFile="videoutils_plat/videoconnutility_api/tsrc/vcxtestutilmodule/group"/> -->
+ <!-- <unit bldFile="videoutils_plat/videoscheduler_api/tsrc/group"/> -->
+ </component>
+ <component id="videoutils_build" filter="s60" name="Video Utils Build">
+ <!-- can this be split up into the above components?? -->
+ <unit bldFile="group"/>
+ </component>
+ </collection>
+ </package>
+</SystemDefinition>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysdef_1_4_0.dtd Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,86 @@
+ <!ELEMENT SystemDefinition (systemModel?, build?)>
+ <!ATTLIST SystemDefinition
+ name CDATA #REQUIRED
+ schema CDATA #REQUIRED>
+ <!ELEMENT systemModel (layer+)>
+ <!ELEMENT layer (logicalset* | module*)*>
+ <!ATTLIST layer
+ name CDATA #REQUIRED
+ levels CDATA #IMPLIED
+ span CDATA #IMPLIED>
+ <!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalset name CDATA #REQUIRED>
+ <!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
+ <!ATTLIST logicalsubset name CDATA #REQUIRED>
+ <!ELEMENT module (component* | unit* | package* | prebuilt*)*>
+ <!ATTLIST module
+ name CDATA #REQUIRED
+ level CDATA #IMPLIED>
+ <!ELEMENT component (unit* | package* | prebuilt*)*>
+ <!ATTLIST component name CDATA #REQUIRED>
+ <!ELEMENT unit EMPTY>
+ <!ATTLIST unit
+ unitID ID #REQUIRED
+ name CDATA #REQUIRED
+ mrp CDATA #REQUIRED
+ filter CDATA #IMPLIED
+ bldFile CDATA #REQUIRED
+ priority CDATA #IMPLIED
+ contract CDATA #IMPLIED>
+ <!ELEMENT package EMPTY>
+ <!ATTLIST package
+ name CDATA #REQUIRED
+ mrp CDATA #REQUIRED
+ filter CDATA #IMPLIED
+ contract CDATA #IMPLIED>
+ <!ELEMENT prebuilt EMPTY>
+ <!ATTLIST prebuilt
+ name CDATA #REQUIRED
+ version CDATA #REQUIRED
+ late (Y|N) #IMPLIED
+ filter CDATA #IMPLIED
+ contract CDATA #IMPLIED>
+ <!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
+ <!ELEMENT unitList (unitRef+)>
+ <!ATTLIST unitList
+ name ID #REQUIRED
+ description CDATA #REQUIRED>
+ <!ELEMENT unitRef EMPTY>
+ <!ATTLIST unitRef unit IDREF #REQUIRED>
+ <!ELEMENT targetList EMPTY>
+ <!ATTLIST targetList
+ name ID #REQUIRED
+ description CDATA #REQUIRED
+ target IDREFS #REQUIRED>
+ <!ELEMENT target EMPTY>
+ <!ATTLIST target
+ name ID #REQUIRED
+ abldTarget CDATA #REQUIRED
+ description CDATA #REQUIRED>
+ <!ELEMENT option EMPTY>
+ <!ATTLIST option
+ name ID #REQUIRED
+ abldOption CDATA #REQUIRED
+ description CDATA #REQUIRED
+ enable (Y | N | y | n) #REQUIRED>
+ <!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
+ <!ATTLIST configuration
+ name ID #REQUIRED
+ description CDATA #REQUIRED
+ filter CDATA #REQUIRED>
+ <!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
+ <!ELEMENT unitListRef EMPTY>
+ <!ATTLIST unitListRef unitList IDREF #REQUIRED>
+ <!ELEMENT layerRef EMPTY>
+ <!ATTLIST layerRef layerName CDATA #REQUIRED>
+ <!ELEMENT buildLayer EMPTY>
+ <!ATTLIST buildLayer
+ command CDATA #REQUIRED
+ targetList IDREFS #IMPLIED
+ unitParallel (Y | N | y | n) #REQUIRED
+ targetParallel (Y | N | y | n) #IMPLIED>
+ <!ELEMENT specialInstructions EMPTY>
+ <!ATTLIST specialInstructions
+ name CDATA #REQUIRED
+ cwd CDATA #REQUIRED
+ command CDATA #REQUIRED>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tsrc/conf/ats_apitests.txt Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,10 @@
+;Run \vado\videoplayer\tsrc\testing\tools\genATSdrop.pl from
+;the tsrc folder to create ATS3 drop.
+DEVICE INSERT_DEVICE
+EMAIL INSERT_EMAIL
+FLASH INSERT_FLASH_IMAGE
+FLASH INSERT_FLASH_IMAGE
+FLASH INSERT_FLASH_IMAGE
+SIS \VideoApp_Domain\videoplayer\videoplayerapp\mpxvideoplayer\sis\VideoPlayer.sisx
+INC ..\..\videoutils_plat\videoconnutility_api\tsrc\conf\atsconf.txt
+INC ..\..\videoutils_plat\videoscheduler_api\tsrc\conf\atsconf.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tsrc/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,29 @@
+/*
+* Copyright (c) 2006 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: Build information file for Generic test modules under videoutils*
+*/
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+
+PRJ_MMPFILES
+
+PRJ_TESTMMPFILES
+#include "../../videoutils_plat/videoconnutility_api/tsrc/group/bld.inf"
+#include "../../videoutils_plat/videoscheduler_api/tsrc/group/bld.inf"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/bwins/vcxconnectionutilityu.def Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,9 @@
+EXPORTS
+ ?DecreaseReferenceCount@CVcxConnectionUtility@@QAEXXZ @ 1 NONAME ; void CVcxConnectionUtility::DecreaseReferenceCount(void)
+ ?DisconnectL@CVcxConnectionUtility@@QAEXXZ @ 2 NONAME ; void CVcxConnectionUtility::DisconnectL(void)
+ ?GetIap@CVcxConnectionUtility@@QAEHAAKH@Z @ 3 NONAME ; int CVcxConnectionUtility::GetIap(unsigned long &, int)
+ ?InstanceL@CVcxConnectionUtility@@SAPAV1@XZ @ 4 NONAME ; class CVcxConnectionUtility * CVcxConnectionUtility::InstanceL(void)
+ ?RegisterObserverL@CVcxConnectionUtility@@QAEXPAVMConnUtilEngineObserver@@@Z @ 5 NONAME ; void CVcxConnectionUtility::RegisterObserverL(class MConnUtilEngineObserver *)
+ ?RemoveObserver@CVcxConnectionUtility@@QAEXPAVMConnUtilEngineObserver@@@Z @ 6 NONAME ; void CVcxConnectionUtility::RemoveObserver(class MConnUtilEngineObserver *)
+ ?WapIdFromIapIdL@CVcxConnectionUtility@@QAEKK@Z @ 7 NONAME ; unsigned long CVcxConnectionUtility::WapIdFromIapIdL(unsigned long)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/eabi/vcxconnectionutility_tb92u.def Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,8 @@
+EXPORTS
+ _ZN21CVcxConnectionUtility11DisconnectLEv @ 1 NONAME
+ _ZN21CVcxConnectionUtility14RemoveObserverEP23MConnUtilEngineObserver @ 2 NONAME
+ _ZN21CVcxConnectionUtility17RegisterObserverLEP23MConnUtilEngineObserver @ 3 NONAME
+ _ZN21CVcxConnectionUtility22DecreaseReferenceCountEv @ 4 NONAME
+ _ZN21CVcxConnectionUtility6GetIapERmi @ 5 NONAME
+ _ZN21CVcxConnectionUtility9InstanceLEv @ 6 NONAME
+ _ZN21CVcxConnectionUtility15WapIdFromIapIdLEm @ 7 NONAME
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/eabi/vcxconnectionutilityu.def Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,17 @@
+EXPORTS
+ _ZN21CVcxConnectionUtility11DisconnectLEv @ 1 NONAME
+ _ZN21CVcxConnectionUtility14RemoveObserverEP23MConnUtilEngineObserver @ 2 NONAME
+ _ZN21CVcxConnectionUtility17RegisterObserverLEP23MConnUtilEngineObserver @ 3 NONAME
+ _ZN21CVcxConnectionUtility22DecreaseReferenceCountEv @ 4 NONAME
+ _ZN21CVcxConnectionUtility6GetIapERmi @ 5 NONAME
+ _ZN21CVcxConnectionUtility9InstanceLEv @ 6 NONAME
+ _ZTIN4Meta11TMetaVarLenI5RBuf8EE @ 7 NONAME ; #<TI>#
+ _ZTIN4Meta11TMetaVarLenI6RBuf16EE @ 8 NONAME ; #<TI>#
+ _ZTIN4Meta12TMetaVarLen8I5RBuf8EE @ 9 NONAME ; #<TI>#
+ _ZTIN4Meta13TMetaVarLen16I6RBuf16EE @ 10 NONAME ; #<TI>#
+ _ZTVN4Meta11TMetaVarLenI5RBuf8EE @ 11 NONAME ; #<VT>#
+ _ZTVN4Meta11TMetaVarLenI6RBuf16EE @ 12 NONAME ; #<VT>#
+ _ZTVN4Meta12TMetaVarLen8I5RBuf8EE @ 13 NONAME ; #<VT>#
+ _ZTVN4Meta13TMetaVarLen16I6RBuf16EE @ 14 NONAME ; #<VT>#
+ _ZN21CVcxConnectionUtility15WapIdFromIapIdLEm @ 15 NONAME
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2004-2006 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:
+*
+*/
+
+
+
+#include <platform_paths.hrh>
+
+
+PRJ_PLATFORMS
+
+WINSCW ARMV5
+
+
+PRJ_EXPORTS
+../rom/videoconnutility.iby CORE_MW_LAYER_IBY_EXPORT_PATH(videoconnutility.iby)
+
+PRJ_MMPFILES
+
+vcxconnectionutility.mmp
+
+PRJ_TESTMMPFILES
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/group/vcxconnectionutility.mmp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,60 @@
+/*
+* Copyright (c) 2004-2006 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: This is a project specification file for Video Center Conn Utility*
+*/
+
+
+
+
+#include <platform_paths.hrh>
+#include <data_caging_paths.hrh>
+
+
+TARGET vcxconnectionutility.dll
+TARGETTYPE dll
+UID 0x1000008d 0x20016BA1
+
+#if defined (SYMBIAN_NON_SEAMLESS_NETWORK_BEARER_MOBILITY) && defined (ARMCC)
+ DEFFILE vcxconnectionutility_tb92.def
+#else
+ DEFFILE vcxconnectionutility.def
+#endif
+
+
+CAPABILITY CAP_GENERAL_DLL
+
+SOURCEPATH ../src
+
+SOURCE vcxconnutilengine.cpp
+SOURCE vcxconnutilpubsub.cpp
+SOURCE vcxconnutilimpl.cpp
+SOURCE vcxconnectionutility.cpp
+SOURCE vcxconnutilsubscriber.cpp
+SOURCE vcxconnutilwaitsch.cpp
+
+USERINCLUDE .
+USERINCLUDE ../inc
+USERINCLUDE ../../inc
+
+MW_LAYER_SYSTEMINCLUDE
+
+LIBRARY commdb.lib
+LIBRARY commsdat.lib
+LIBRARY euser.lib
+LIBRARY cmmanager.lib
+LIBRARY esock.lib
+LIBRARY connmon.lib
+LIBRARY netmeta.lib
+LIBRARY flogger.lib
+LIBRARY extendedconnpref.lib
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/inc/vcxconnutilengine.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,358 @@
+/*
+* Copyright (c) 2006 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: class to handle networking functions in vcxconnectionutility*
+*/
+
+
+
+
+#ifndef __CVCX_CONUTILENGINE_H__
+#define __CVCX_CONUTILENGINE_H__
+
+#include <e32base.h>
+
+#include <e32std.h>
+#include <cmmanager.h>
+#include <es_sock.h>
+#include <connpref.h>
+#include <commdbconnpref.h>
+#include <comms-infras/cs_mobility_apiext.h>
+
+#include <cmdestinationext.h>
+#include <cmmanagerext.h>
+#include <rconnmon.h>
+#include "vcxconnectionutility.hrh"
+
+class CActiveCommsMobilityApiExt;
+class MConnUtilExtEngineObserver;
+
+
+// CLASS DECLARATION
+/**
+* Class defines functionality for handling networking functions in
+* vcxconnectionutility.
+* These are:
+* 1. connection creation and disconnecting
+* 2. handling and notifying of events from apllication level roaming (ALR)
+* 3. handling and notifying of other interesting events from the network:
+* - link layer closing and connection deletion
+* - iap list changing
+*
+* Class uses MConnUtilEngineObserver interface to inform CVcxConnUtilImpl
+* -class about the events.
+*/
+
+NONSHARABLE_CLASS ( CVcxConnUtilEngine ) : public CActive,
+ public MMobilityProtocolResp,
+ public MConnectionMonitorObserver
+ {
+ public: // construction / destruction
+
+ /**
+ * Construction.
+ *
+ * @param MConnUtilExtEngineObserver
+ * @return The newly constructed CVcxConnUtilEngine
+ */
+ static CVcxConnUtilEngine* NewL( MConnUtilExtEngineObserver* aObserver );
+
+ /**
+ * Construction. Object left to cleanupstack
+ *
+ * @param MConnUtilExtEngineObserver
+ * @return The newly constructed CVcxConnUtilEngine
+ */
+ static CVcxConnUtilEngine* NewLC( MConnUtilExtEngineObserver* aObserver );
+
+ /**
+ * destructor
+ */
+ virtual ~CVcxConnUtilEngine();
+
+ private:
+
+ /**
+ * C++ constructor
+ */
+ CVcxConnUtilEngine();
+
+ /**
+ * Private 2nd phase construction.
+ */
+ void ConstructL();
+
+ private: // From CActive
+
+ /**
+ * From CActive. Connection startup is done asynchronously after
+ * connection cretaion ends, the status value of the connection is
+ * updated whether connection succeed or not
+ */
+ void RunL();
+
+ /**
+ * From CActive. Cancels coonnection creation.
+ */
+ void DoCancel();
+
+ private: // From MMobilityProtocolResp
+
+ /**
+ * From MMobilityProtocolResp. We have better carrier available for
+ * the active connection.
+ *
+ * @param aOldAPInfo current IAP information
+ * @param aNewAPInfo suggested new IAP information
+ * @param aIsUpgrade ETrue indicates IAP is to be upgraded
+ * @param aIsSeamless ETrue indicates that new connection is seamless
+ * (new IAP requires dialog for connection)
+ */
+ void PreferredCarrierAvailable( TAccessPointInfo aOldAPInfo,
+ TAccessPointInfo aNewAPInfo,
+ TBool aIsUpgrade,
+ TBool aIsSeamless );
+
+ /**
+ * From MMobilityProtocolResp. We have a new carrier available for
+ * the active connection.
+ *
+ * @param aNewAPInfo IAP information from the new available connection
+ * @param aIsSeamless ETrue indicates that new connection is seamless
+ * (new IAP requires dialog for connection)
+ */
+ void NewCarrierActive( TAccessPointInfo aNewAPInfo, TBool aIsSeamless );
+
+ /**
+ * From MMobilityProtocolResp.
+ *
+ * @param aError
+ */
+ void Error( TInt aError );
+
+ private: // from MConnectionMonitorObserver
+
+ /**
+ * @see MConnectionMonitorObserver
+ */
+ void EventL( const CConnMonEventBase &aConnMonEvent );
+
+ public: // new methods
+
+ typedef RArray<TUint32> RDestinationArray;
+
+ /**
+ * Starts a connection via SNAP
+ *
+ * @param aPref connection information to be used connection startup
+ * @return KErrNone always is async connection and if sync connection
+ * startup succeed or one of the system wide error codes
+ */
+ TInt StartToConnect( TConnPref& aPref, TBool aConnAsync = ETrue );
+
+ /**
+ * Disconnects active connection and closes RConnection
+ */
+ void Disconnect();
+
+ /**
+ * Method is used to get the name of the destination that matches
+ * given id and to make sure, that destination really have connection
+ * methods to use.
+ *
+ * @param aDestinationID destination (SNAP) if from where to fetch infromation
+ *
+ * @return TBool true, if connection is ok to start
+ */
+ TBool PrepareConnectionDetailsL( TInt aDestinationID );
+
+ /**
+ * Method reads platform's connection settings, and returns a destination id.
+ * If aPurpose is setted as ESnapPurposeUnknown, default id is returned,
+ * otherwise purpose is used to get correct id
+ *
+ * @param aPurpose if ESnapPurposeUnknown, get default, in all other cases
+ * try to fetch id based on the purpose
+ *
+ * @return TUint32 destination id
+ */
+ TUint32 GetCmmDestinationIdL( CMManager::TSnapPurpose aPurpose =
+ CMManager::ESnapPurposeUnknown );
+
+ /**
+ * Method checks if there is an active connection for
+ * the given iap
+ *
+ * @param aIapId iap id to check
+ *
+ * @return TBool ETrue if connection exists
+ *
+ */
+ TBool IsIapConnected( TUint32 aIapId );
+
+ /**
+ * Method fills started connection's information: IAP id (iIapId) and IAP name
+ * This is needed in case of "always ask" to get the information client requires.
+ *
+ */
+ void FillActiveConnectionDetailsL();
+
+ /**
+ * clears iapid, snapid and their names
+ *
+ */
+ void ResetConnectionInfo();
+
+ /**
+ * Returns currently fetched iap id
+ *
+ * @return TUint32
+ */
+ TUint32 IapId() const;
+
+ /**
+ * Returns currently fetched iap id
+ *
+ * @return TInt
+ */
+ TInt DestinationId() const;
+
+ /**
+ * Returns currently fetched snap name
+ *
+ * @return TUint32
+ */
+ TPtrC DestinationName() const;
+
+ /**
+ * Returns current connection status
+ *
+ * @return TPSVCConnectionStatus
+ */
+ TVCxConnectionStatus ConnectionStatus() const;
+
+ /**
+ * Explicitly sets internal connection status.
+ *
+ * @param TPSVCConnectionStatus
+ */
+ void SetConnectionStatus( TVCxConnectionStatus aStatus );
+
+ /**
+ * Method can be called to create mobility object
+ * for getting roaming events from the network.
+ *
+ * @return TInt KErrnone if object created or already exists. Otherwise a
+ * system level error.
+ */
+ TInt CreateMobility();
+
+ /**
+ * Returns "query connection" status.
+ */
+ TBool QueryConn();
+
+ /**
+ * Set "query connection" status.
+ *
+ * @param aQueryConn Value for connection query flag.
+ */
+ void SetQueryConn( TBool aQueryConn );
+
+
+ private:
+
+ /**
+ * Internal helper method trying to fetch destination
+ * information for the current IAP.
+ *
+ */
+ void FillDestinationInfoL();
+
+ private:
+
+ /**
+ * Socket Server
+ */
+ RSocketServ iSocketServer;
+
+ /**
+ * Connection
+ */
+ RConnection iConnection;
+
+ /**
+ * Connection monitor
+ */
+ RConnectionMonitor iConnectionMonitor;
+
+ /**
+ * Current connection state
+ */
+ TVCxConnectionStatus iConnectionState;
+
+ /**
+ * Connection Manager Extensions
+ */
+ RCmManagerExt iCmManagerExt;
+
+ /**
+ * Destination id.
+ */
+ TInt iDestinationId;
+
+ /**
+ * IAP ID.
+ */
+ TUint32 iIapId;
+
+ /**
+ * Destination (snap) Name.
+ */
+ HBufC* iDestinationName;
+
+ /**
+ * current connection id
+ */
+ TUint iCurrentConnectionId;
+
+ /**
+ * Mobility object to fetch carrier change events
+ */
+ CActiveCommsMobilityApiExt* iMobility;
+
+ /**
+ * array of all available destination ids
+ */
+ RDestinationArray iDestinationArray;
+
+ /**
+ * observer to notify about changes in the network
+ */
+ MConnUtilExtEngineObserver* iObserver;
+
+ /**
+ * Value to pass connection result error code from the
+ * async connection creation
+ */
+ TInt iConnectingResult;
+
+ /**
+ * If is set to ETrue, connection selection dialog will be displayed.
+ * Used when tried SNAP contained invalid IAP.
+ */
+ TBool iQueryConn;
+
+ };
+
+#endif // __CVCX_CONUTILENGINE_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/inc/vcxconnutilextengineobserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,62 @@
+/*
+* Copyright (c) 2006 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: extended engine observer interface for video connection utility internal use*
+*/
+
+
+
+
+#ifndef __VCXCONNUTILEXTENGINEOBSERVER_H_
+#define __VCXCONNUTILEXTENGINEOBSERVER_H_
+
+#include <ipvideo/vcxconnutilengineobserver.h>
+/**
+* Interface is being used inside vcxconnectionutility to notify
+* IAP changes and request for waits
+*/
+
+class MConnUtilExtEngineObserver : public MConnUtilEngineObserver
+
+ {
+ public:
+
+ /**
+ * Method is called, when observable request observer to
+ * put it's current active object to wait until EndWait
+ * for same wait id is called
+ *
+ * @param aWaitId wait id
+ */
+ virtual void WaitL( TUint32 aWaitId ) = 0;
+
+ /**
+ * Method is called, when observable request observer to
+ * end wait for given id
+ *
+ * @param aWaitId wait id
+ */
+ virtual void EndWait( TUint32 aWaitId ) = 0;
+
+ /**
+ * Method is called, when observable needs to know wether
+ * this instance is the master instance
+ *
+ * @return TBool ETrue is master, EFalse not a master
+ */
+ virtual TBool IsMaster() = 0;
+
+ };
+
+
+#endif /*VCXCONNUTILEXTENGINEOBSERVER_H_*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/inc/vcxconnutilimpl.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,373 @@
+/*
+* Copyright (c) 2006 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: Implementation Class to handle connection creation.*
+*/
+
+
+
+
+#ifndef __VCX_CONNUTILIMPL_H_
+#define __VCX_CONNUTILIMPL_H_
+
+// INCLUDES
+#include <e32base.h>
+#include <e32property.h>
+
+#include <agentdialog.h>
+
+#include "vcxconnutilpubsubobserver.h"
+#include "vcxconnutilextengineobserver.h"
+
+// FORWARD DECLARATIONS
+class CRepository;
+class CVcxConnUtilEngine;
+class CVcxConnUtilPubSub;
+class CVcxConnectionUtility;
+class CVcxConnUtilWaitSch;
+
+
+// CLASS DECLARATION
+
+/**
+* This class defines operations for handling the networking notifications
+* from the engine class, notifications from the PS and provides a functionality
+* for those.
+*
+*/
+NONSHARABLE_CLASS( CVcxConnUtilImpl) : public CBase,
+ public MConnUtilPubsubObserver,
+ public MConnUtilExtEngineObserver
+ {
+
+ public: // Constructors and destructor
+
+ /**
+ * Construction.
+ *
+ * @param CVcxConnectionUtility* pointer to main interface class for
+ * for showing dialogs
+ * @return The newly constructed CVcxConnUtilEngine
+ */
+ static CVcxConnUtilImpl* NewL( CVcxConnectionUtility* aUiInterface );
+
+ /**
+ * Construction. Object left to cleanupstack
+ *
+ * @param CVcxConnectionUtility* pointer to main interface class for
+ * for showing dialogs
+ * @return The newly constructed CVcxConnUtilEngine
+ */
+ static CVcxConnUtilImpl* NewLC( CVcxConnectionUtility* aUiInterface );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CVcxConnUtilImpl();
+
+ private:
+
+ /**
+ * constructor.
+ *
+ * @param CVcxConnectionUtility* pointer to main interface class for
+ * for showing dialogs
+ */
+ CVcxConnUtilImpl( CVcxConnectionUtility* aUiInterface );
+
+ /**
+ * default constructor definition.
+ *
+ */
+ CVcxConnUtilImpl( );
+
+ /**
+ * Private 2nd phase construction.
+ */
+ void ConstructL();
+
+ public: // New functions
+
+
+ /**
+ * Returns open IAP, If connection is not opened it will be created
+ *
+ * @param aIapId On return, IAP ID.
+ * @param aSilent If ETrue, tries to open connection silently (without dialogs)
+ *
+ * @return KErrNone or one of the system wide error codes.
+ */
+ TInt GetIap( TUint32& aIapId, TBool aSilent );
+
+ /**
+ * Closes open connection.
+ */
+ void DisconnectL();
+
+ /**
+ * Registers observer
+ *
+ * @param MConnUtilEngineObserver
+ */
+ void RegisterObserverL( MConnUtilEngineObserver* aObserver );
+
+ /**
+ * Removes observer from the array of observers
+ *
+ * @param MConnUtilEngineObserver
+ */
+ void RemoveObserver( MConnUtilEngineObserver* aObserver );
+
+ /**
+ * Returns current connection status
+ *
+ * @return TVCxConnectionStatus
+ */
+ TVCxConnectionStatus EngineConnectionStatus();
+
+ /**
+ * Gets WAP id from IAP id. Leaves with KErrNotFound if no record with given
+ * IAP id is found.
+ *
+ * @return WAP id matching the given IAP id.
+ */
+ TUint32 WapIdFromIapIdL( TUint32 aIapId );
+
+ private: // from MConUtilPubsubObserver
+
+ /**
+ * Notification about pubsub key (integer) value change
+ *
+ * @param aKey PS key informing the change
+ * @param aValue a new value
+ */
+ void ValueChangedL(const TUint32& aKey, const TInt& aValue);
+
+ private: // from MConnUtilExtEngineObserver
+
+ /**
+ * Engine has gotten mobility event about preferred IAP. Utility must requets permission
+ * from it's clients before connection changing can be done.
+ *
+ * @return TBool ETrue if roaming can be allowed from the applicatin.
+ */
+ TBool RequestIsRoamingAllowedL();
+
+ /**
+ * Notification about IAP change due roaming. If this instance
+ * is master, it should change the IAP to Pubsub
+ *
+ */
+ void IapChangedL();
+
+ /**
+ * Method calls video connection utility's wait scheduler to
+ * put current active object to wait with given id.
+ *
+ * @param aWaitId id for the wait
+ */
+ void WaitL( TUint32 aWaitId );
+
+ /**
+ * Method calls video connection utility's wait scheduler to
+ * end wait for given id
+ *
+ * @param aWaitId id for the wait
+ */
+ void EndWait( TUint32 aWaitId );
+
+ /**
+ * Method return ETrue, if this instance is master
+ *
+ * @return TBool ETrue if is master, EFalse if not master
+ */
+ TBool IsMaster();
+
+ private: // New functions
+
+ /**
+ * Method reads Video center's connection related settings
+ * from the cenrep. Method also tries to reinit details inside
+ * conn util engine, if it fails, "always ask" is saved to VC settings
+ *
+ * @return KErrNone or one of the system wide error codes. Method can also leave.
+ */
+ TInt PrepareConnSettings();
+
+ /**
+ * Setups the connection creation prefs for "always ask" situation, and calls engine
+ * to start connection or calls DoCreateConnectionL for other cases.
+ *
+ * @param aSilent If ETrue, tries to open connection silently (without dialogs)
+ *
+ * @return KErrNone or one of the system wide error codes. Method can also leave.
+ */
+ TInt CreateConnection( TBool aSilent );
+
+ /**
+ * Setups and tries to open connection via SNAP.
+ *
+ * @param aSilent If ETrue, tries to open connection silently (without dialogs)
+ * @param aSnapId snap (destination) id to use in connection
+ * @param aMasterConnect If true, mobility object needs to be created for receiving events
+ * from network.
+ *
+ * @return KErrNone or one of the system wide error codes. Method can also leave.
+ */
+ TInt DoCreateConnection( TBool aSilent, TInt32 aSnapId, TBool aMasterConnect );
+
+ /**
+ * After connection staring is finished by the engine, this method is to be called.
+ * Method first checks is connection is ne for this inctance and if it is,
+ * utility's internal connection information is setted up. Method also
+ * calls CheckAndChangeSlaveToMaster to setup this inctance to be master if
+ * one does not yet exist. If this inctance is to be master, connection info
+ * is updated to PS as well.
+ *
+ *
+ * @return KErrNone if connection data filled ok and we are connected.
+ */
+ TInt HandleFinalizeConnection();
+
+ /**
+ * Displays a wait note
+ *
+ * @param aConnectionName name of connection to show on the dialog
+ */
+ void DisplayWaitNote( const TDesC& aConnectionName = KNullDesC );
+
+ /**
+ * closes a wait note
+ *
+ */
+ void CloseWaitNote();
+
+ /**
+ * Method queries all observers and requests roaming status from them.
+ * If all observers accept or there is not observers, PS key EVCxPSNbRoamAccepted
+ * is increased by one. After method ends, PS key EVCxPSNbrRoamResp is increased by
+ * one to notify that one response is ready.
+ *
+ * @return TBool ETrue if roaming is allowed
+ */
+ TBool DoRequestClientRoamingL();
+
+ /**
+ * Method saves iap id and name, snap id and name and connection state
+ * to pubsub.
+ *
+ */
+ void SaveConnectionToPubSubL();
+
+ /**
+ * Method handles changing of slave to master when existing
+ * master is diconnecting. If change has occured, reinits
+ * the connection to be used via snap instead of IAP
+ *
+ */
+ void HandleMasterChangeL();
+
+ /**
+ * Method handles the actual change of this instance to be
+ * master if there is not yet any.
+ *
+ * Changing is protected by semaphore, so only one existing
+ * slave instance can check and possible change it's status
+ * at the time.
+ *
+ * Note that KErrNone does not indicate succesfull status
+ * chenge. Caller should also check if iMaster -value has changed.
+ *
+ * @return TInt KErrNone or one of the system wide error codes,
+ */
+ TInt CheckAndChangeSlaveToMaster();
+
+ /**
+ * Method changes slave instance connection status
+ * based on given value.
+ *
+ * @param aNewStatus new status from master
+ *
+ */
+ void HandleSlaveConnectionStatusL( const TInt& aNewStatus );
+
+ /**
+ * Method checks whether there are enough responses for the roaming
+ * request. If there is sets roaming acceptance status to PS.
+ *
+ * @param aNbrOfResps number of responces received so far
+ *
+ */
+ void HandleRoamingReponsesL( const TInt& aNbrOfResps );
+
+ /**
+ * Method notifies observers about IAP changed event
+ *
+ */
+ void NotifyObserversIAPChanged();
+
+ private: // Data
+
+
+ /**
+ * Interface for UI related functions for connecting utility:
+ * Showing and hiding connection -dialog
+ */
+ CVcxConnectionUtility* iUIInterface;
+
+ /**
+ * Connection utility engine. Handles connection creation, disconnecting and
+ * connection meta data
+ */
+ CVcxConnUtilEngine* iEngine;
+
+ /**
+ * pubsub engine, listens pubsub keys
+ * and notify chenges
+ */
+ CVcxConnUtilPubSub* iPubsub;
+
+ /**
+ * Wait handler for managing all CactiveSchedulerWaits
+ * used by video connection utility
+ */
+ CVcxConnUtilWaitSch* iWaitHandler;
+
+ /**
+ * Array of external network observers.
+ */
+ RArray<MConnUtilEngineObserver*> iObservers;
+
+ /**
+ * Is this instance the master
+ */
+ TBool iMaster;
+
+ /**
+ * Semaphore to prevent concurrency in master / slave switch
+ */
+ RSemaphore iSemaSwitchRole;
+
+ /**
+ * Semaphore to prevent concurrency connection creation
+ */
+ RSemaphore iSemaCreateConn;
+
+ /**
+ * Used curing connection creation to tell active objects
+ * that current connection is new.
+ */
+ TBool iNewConnection;
+ };
+#endif // __VCX_CONNUTILIMPL_H_
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/inc/vcxconnutilpubsub.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,254 @@
+/*
+* Copyright (c) 2006 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: Pubsub handler class for vcxconnectionutility*
+*/
+
+
+
+
+#ifndef __CVCX_CONUTILPUBSUB_H__
+#define __CVCX_CONUTILPUBSUB_H__
+
+#include <e32base.h>
+#include <e32std.h>
+#include <e32property.h>
+
+
+class CVcxConnUtilSubscriber;
+class MConnUtilPubsubObserver;
+
+/**
+* This class defines operations for handling the pub sub keys and their values.
+*
+*/
+NONSHARABLE_CLASS( CVcxConnUtilPubSub ) : public CBase
+ {
+ public: // construction / destruction
+
+ /**
+ * Construction.
+ *
+ * @return The newly constructed CVcxConnUtilPubSub
+ */
+ static CVcxConnUtilPubSub* NewL( MConnUtilPubsubObserver *aObserver );
+
+ /**
+ * Construction. Object left to cleanupstack
+ *
+ * @return The newly constructed CVcxConnUtilPubSub
+ */
+ static CVcxConnUtilPubSub* NewLC( MConnUtilPubsubObserver *aObserver );
+
+ /**
+ * destructor
+ */
+ virtual ~CVcxConnUtilPubSub();
+
+ private:
+
+ /**
+ * C++ constructor
+ */
+ CVcxConnUtilPubSub();
+
+ /**
+ * Private 2nd phase construction.
+ *
+ * During instantiation, the availibility of the PS keys is being checked. In case
+ * keys does not exists, they are being created by starting an external executable,
+ * vcxconnutilpsworker, whose UID is being used as the unique category of the PS keys.
+ * This kind of solution is needed to make sure, that category is always unique and
+ * the UID of the category is always known beforehand in vcxconnectionutility library
+ *
+ * @param aObserver observer to be passed subscribers
+ */
+ void ConstructL( MConnUtilPubsubObserver *aObserver );
+
+
+ public: // new functions
+
+ /**
+ * Increases a "counter" pub sub value by one.
+ * If given key is not concidered as a counter,
+ * nothing is done
+ *
+ * @param aKey PS key whose value to increase
+ */
+ void IncCounterPubSubL( TUint32 aKey );
+
+ /**
+ * Decreases a "counter" pub sub value by one
+ * If given key is not concidered as a counter,
+ * nothing is done
+ *
+ * @param aKey PS key whose value to decrease
+ */
+ void DecCounterPubSubL( TUint32 aKey );
+
+ /**
+ * Saves given value to the defined PS key.
+ *
+ * @param aKey PS to where to save the value
+ * @param aValue Value to save
+ *
+ * @return TInt KErrNone is succees, KerrNotFound if provided key is
+ * not in the scope of connection util or another
+ * system level error code
+ *
+ */
+ TInt SetValue( TUint32 aKey, TInt aValue );
+
+ /**
+ * Get value from defined PS key.
+ *
+ * @param aKey PS from where to fetch value
+ * @param aValue
+ *
+ * @return TInt KErrNone is succees, KerrNotFound if provided key is
+ * not in the scope of connection util or another
+ * system level error code
+ *
+ */
+ TInt GetValue( TUint32 aKey, TInt& aValue );
+
+ /**
+ * Start subscribers. If using deafult value, starts all.
+ * Otherwise just starts the one defined as aKey
+ *
+ * @param aKey key value of subscriber to start
+ */
+ void StartSubscibers( TUint32 aKey = 0 );
+
+ /**
+ * Cancels subscribers. If using deafult value, cancels all.
+ * Otherwise just cancels the one defined as aKey
+ *
+ * @param aKey key value of subscriber to cancel
+ *
+ */
+ void CancelValueSubscribers( TUint32 aKey = 0 );
+
+ private:
+
+ /**
+ * Method starts a vcxconnutilpsworker -process
+ * to create PS keys for connectionutility and
+ * waits for the process to finish before returning.
+ *
+ * If another process has already started worker, method
+ * waits for it to finish.
+ *
+ * Method leaves if existing semaphore cannot be opened or
+ * creating of process fails.
+ *
+ */
+ void DefinePropertiesL();
+
+ /**
+ * Internal helper method to get a pointer to RProperty
+ * defined by the aKey -value.
+ * In case aKey refers to a property that does not exists,
+ * a null pointer is returned
+ *
+ * @param aKey a key value for property wanted
+ *
+ * @return RProperty* pointer to property or NULL in case
+ * property is not found
+ */
+ RProperty* GetProperty( TUint32 aKey );
+
+ /**
+ * Internal helper method to get a pointer to Subscriber
+ * defined by the aKey -value.
+ * In case aKey refers to a Subscriber that does not exists,
+ * a null pointer is returned
+ *
+ * @param aKey a key value for subscriber wanted
+ *
+ * @return CVcxConnUtilSubscriber* pointer to Subscriber or NULL in case
+ * property is not found
+ */
+ CVcxConnUtilSubscriber* GetSubscriber( TUint32 aKey );
+
+ /**
+ * Internal helper method to handle actual incrementation or
+ * decrementation (based on the calfactor) of the PS key concidered
+ * to be a counter value in connectionutility's context.
+ *
+ * @leave if PS Get or Set fails
+ *
+ * @param aKey a key value for subscriber wanted
+ *
+ * @param aCalcFactor a value to be added to the PS key value
+ */
+ void DoPSCounterIncrementL( TUint32 aKey, TInt aCalcFactor );
+
+ private:
+
+ /**
+ * P&S Current IAP's Id
+ */
+ RProperty iPropertyCurrentIAPId;
+
+ /**
+ * P&S Current Destination's Id
+ */
+ RProperty iPropertyCurrentSNAPId;
+
+ /**
+ * P&S telling how many instances are using connection
+ */
+ RProperty iPropertyNbrOfInst;
+
+ /**
+ * P&S telling how many instances
+ * have accepted roaming
+ */
+ RProperty iPropertyAccepted;
+
+ /**
+ * P&S telling Connection state property.
+ * Object contains PS property for connection state -key and
+ * subcribe -listener for that value changes
+ */
+ CVcxConnUtilSubscriber* iConnectionStatePS;
+
+ /**
+ * P&S telling if we currently have master instance or not
+ * Object contains PS property for masterexist -key and
+ * subcribe -listener for that value changes
+ */
+ CVcxConnUtilSubscriber* iMasterExistPS;
+
+ /**
+ * P&S telling the roaming request status from
+ * the instances
+ */
+ CVcxConnUtilSubscriber* iRoamingReqStatusPS;
+
+ /**
+ * P&S telling the amount of connection users responded
+ * roaming request
+ */
+ CVcxConnUtilSubscriber* iNbrInstanceResp;
+
+ /**
+ * Semaphore to protect critical counter -PS
+ * increment and decrement operations.
+ */
+ RSemaphore iSemaCounter;
+
+ };
+
+#endif // __CVCX_CONUTILPUBSUB_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/inc/vcxconnutilpubsubobserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) 2006 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: interface to notify about PS key changes in vcxconnectionutility*
+*/
+
+
+
+
+#ifndef _M_CVCX_CONUTILOBS_H__
+#define _M_CVCX_CONUTILOBS_H__
+
+#include <e32def.h>
+#include <e32cmn.h>
+
+/**
+* Interface is being used inside vcxconnectionutility to notify
+* the implementation class about changes of values in the PS keys.
+*/
+
+class MConnUtilPubsubObserver
+
+ {
+ public:
+
+ /**
+ * Method to be called when PS key value changes
+ *
+ * @param aKey key id
+ * @param aValue new value
+ */
+ virtual void ValueChangedL(const TUint32& aKey, const TInt& aValue) = 0;
+
+ };
+
+#endif // _M_CVCX_CONUTILOBS_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/inc/vcxconnutilsubscriber.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,138 @@
+/*
+* Copyright (c) 2006 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: Class to handle subscribtions from PS*
+*/
+
+
+
+
+#ifndef __VCX_CONNUTILSUBSCRI_H
+#define __VCX_CONNUTILSUBSCRI_H
+
+#include <e32base.h>
+#include <e32property.h>
+
+class MConnUtilPubsubObserver;
+
+/**
+* This class defines operations listening modifications for the
+* property defined.
+* Notifies changes throught MConnUtilPubsubObserver interface.
+*
+*/
+NONSHARABLE_CLASS ( CVcxConnUtilSubscriber ) : public CActive
+ {
+
+ public: // constuct / destruct
+
+ /**
+ * Construction.
+ *
+ * @param aUid category for the property
+ * @param aKey key id for the property
+ * @param aType type of the key (at the moment only int is supported)
+ * @param aObserver pointer to observer to who to notify about changes
+ *
+ * @return The newly constructed CVcxConnUtilPubSub
+ */
+ static CVcxConnUtilSubscriber* NewL( const TUid aUid,
+ const TUint32 aKey,
+ RProperty::TType aType,
+ MConnUtilPubsubObserver* aObserver );
+
+ /**
+ * Destructor.
+ *
+ */
+ virtual ~CVcxConnUtilSubscriber();
+
+ /**
+ * Returns a reference to property this
+ * subscriber listens to.
+ *
+ * @return RProperty
+ */
+ RProperty& Property();
+
+ /**
+ * Start subscribing if not already started
+ */
+ void Start();
+
+
+ private: // constuct
+
+ /**
+ * Constructor
+ *
+ */
+ CVcxConnUtilSubscriber( const TUid aUid,
+ const TUint32 aKey,
+ RProperty::TType aType,
+ MConnUtilPubsubObserver* aObserver );
+
+ /**
+ * Symbian 2nd phase construction
+ *
+ */
+ void ConstructL();
+
+ private: // from CActive
+
+ /**
+ * From CActive. Calles when value subscribed to changes
+ *
+ */
+ void RunL();
+
+ /**
+ * From CActive. Cancels subscribtion
+ *
+ */
+ void DoCancel();
+
+ private:
+
+ /**
+ * ETrue if object is initialized and subscribtion starts
+ */
+ TBool iInitialized;
+
+ /**
+ * Property to subscribe
+ */
+ RProperty iProperty;
+
+ /**
+ * Category uid for the property
+ */
+ const TUid iUid;
+
+ /**
+ * Key id for the property
+ */
+ const TUint32 iKey;
+
+ /**
+ * type of the property
+ */
+ RProperty::TType iKeyType;
+
+ /**
+ * Observer
+ */
+ MConnUtilPubsubObserver* iObserver;
+ };
+
+#endif // __VCX_CONNUTILSUBSCRI_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/inc/vcxconnutilwaitsch.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,166 @@
+/*
+* Copyright (c) 2006 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: CCVcxConnUtilWaitSch class declaration file*
+*/
+
+
+
+
+#ifndef __CVCXCONNUTILWAITSCH_H
+#define __CVCXCONNUTILWAITSCH_H
+
+// INCLUDES
+#include <e32std.h>
+#include <e32base.h>
+#include <e32hashtab.h>
+
+
+class CVcxConnUtilWait;
+class CActiveSchedulerWait;
+
+// CLASS DECLARATION
+
+/**
+ * CVcxConnUtilWaitSch is used to manage CActiveSchedulerWait objects
+ * within videoconnutility.
+ * Basically, when client calls wait, a new CActiveSchedulerWait is created
+ * and being put to list. Different types for waits are managed by different
+ * wait -wrapper object, which type is defined as a private class for this class.
+ *
+ * Currently videoconnutility puts active objects to wait in following situations:
+ *
+ * (1) When there is connection creation ongoing and other active objects try to
+ * create connection: only the one active object that is creating connection is runnig,
+ * other a-objects waits as long as connection is ready
+ *
+ * (2) Master waiting for roaming status from slave instances: Master's roaming active object is
+ * waiting for roaming response status change.
+ *
+ * (3) Connection creation during roaming: All active objects requesting connection during roaming
+ * are put to wait for the roaming to finish, so that correct iap id can be returned.
+ *
+ * (4) Disconnecting during roaming. Master's disconnecting a-object(s) is put to wait for
+ * roaming to finish
+ *
+ * Waiting is released by the client by calling EndWait. CVcxConnUtilWaitSch basicallly
+ * stops wait for every wait object, put those whose type is not the one provided
+ * by the parameter of EndWait are being put back to wait. This solution is needed, to
+ * prevent deadlocks: we might have different kind of waits at the same time, but not all
+ * are to be released at the same time, but because of the nature of the ActiveScheduler,
+ * all wait objects are needed to release once, before anyone can proceed.
+ *
+ *
+ */
+NONSHARABLE_CLASS( CVcxConnUtilWaitSch ) : public CBase
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Destructor.
+ */
+ ~CVcxConnUtilWaitSch();
+
+ /**
+ * Two-phased constructor.
+ */
+ static CVcxConnUtilWaitSch* NewL();
+
+ /**
+ * Two-phased constructor.
+ */
+ static CVcxConnUtilWaitSch* NewLC();
+
+ private:
+
+ /**
+ * Constructor for performing 1st stage construction
+ */
+ CVcxConnUtilWaitSch();
+
+ /**
+ * EPOC default constructor for performing 2nd stage construction
+ */
+ void ConstructL();
+
+ public:
+
+ /**
+ * Method creates a new CVcxConnUtilWait object in case
+ * one with provided type does not already exist, then
+ * creates a CActiveSchedulerWait object for the current
+ * active object and puts it to wait by calling
+ * CActiveSchedulerWait::Start. After call returns (wait has
+ * released) checks if CVcxConnUtilWait's iCanStop is ETrue.
+ * In case it is not, the object is being put back to wait.
+ *
+ * After wait object is really released, it is being deallocated.
+ *
+ * Method leaves with systemwide error code, in case object
+ * creation or saving to array fails.
+ *
+ * @param aWaitId wait type id for this wait
+ */
+ void WaitL( TUint32 aWaitId );
+
+
+ /**
+ * Method loops all CVcxConnUtilWait objects and sets their
+ * iCanStop to ETrue, in case aWaitId is same as CVcxConnUtilWait's
+ * iType.
+ * All CActiveSchedulerWait's for each CVcxConnUtilWait is being
+ * released by calling CActiveSchedulerWait::AsyncStop.
+ *
+ * @param aWaitId wait type id for this wait
+ */
+ void EndWait( TUint32 aWaitId );
+
+
+ private:
+
+ /**
+ * Internal helper method for getting corresponding
+ * CVcxConnUtilWait object based in the aID.
+ *
+ * In case aID -type object is not found from the
+ * iWaits -array, it is being created and appended to array.
+ *
+ * @param aID wait type id for this wait
+ */
+ CVcxConnUtilWait* GetWaitL( TUint32 aID );
+
+ /**
+ * Internal helper method for PrepareWaitObjectL for
+ * getting next not started Active scheduler wait
+ * object for given CVcxConnUtilWait.
+ *
+ * If there is no existing not started object or given
+ * CVcxConnUtilWait is NULL a new CActiveSchedulerWait
+ * object is created and appended to the aWait object's
+ * waitarray.
+ *
+ *
+ * @param aWait wait wait object from where to search
+ */
+ CActiveSchedulerWait* GetActiveSWaitL( CVcxConnUtilWait* aWait );
+
+ private:
+ /**
+ * Array containing all CVcxConnUtilWait objects maintained
+ * by this object
+ */
+ RPointerArray< CVcxConnUtilWait > iWaits;
+
+ };
+
+#endif // __CVCXCONNUTILWAITSCH_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/rom/videoconnutility.iby Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+
+#ifndef __VIDEOCONNUTILITY_IBY__
+#define __VIDEOCONNUTILITY_IBY__
+
+#include <data_caging_paths_for_iby.hrh>
+
+file=ABI_DIR\BUILD_DIR\vcxconnectionutility.dll SHARED_LIB_DIR\vcxconnectionutility.dll
+
+#endif // __VIDEOCONNUTILITY_IBY__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/src/vcxconnectionutility.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,272 @@
+/*
+* Copyright (c) 2006 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: Class to handle connection creation.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <e32cmn.h>
+#include <e32std.h>
+#include <mpxlog.h>
+
+#include <ipvideo/vcxconnectionutility.h>
+#include <ipvideo/tvcxconnutilnotifierparams.h>
+#include "vcxconnectionutility.hrh"
+#include "vcxconnutilimpl.h"
+
+// CONSTANTS
+const TInt KVCxConnUtilAppUid = 0x20016BA1;
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CVcxConnectionUtility::InstanceL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CVcxConnectionUtility* CVcxConnectionUtility::InstanceL()
+ {
+ MPX_DEBUG1("vcxconnutil ## CVcxConnectionUtility::InstanceL() in");
+
+ CVcxConnectionUtility* self = NULL;
+ TAny* instance = UserSvr::DllTls( KVCxConnUtilAppUid );
+
+ if ( !instance )
+ {
+ self = new( ELeave ) CVcxConnectionUtility;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ User::LeaveIfError( UserSvr::DllSetTls( KVCxConnUtilAppUid, self ) );
+ CleanupStack::Pop( self );
+ }
+ else
+ {
+ self = reinterpret_cast<CVcxConnectionUtility*>( instance );
+ }
+ self->iReferenceCount++;
+
+ MPX_DEBUG1("vcxconnutil ## CVcxConnectionUtility::InstanceL() out");
+
+ return self;
+
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnectionUtility::DecreaseReferenceCount()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVcxConnectionUtility::DecreaseReferenceCount()
+ {
+ TAny* singleton = UserSvr::DllTls( KVCxConnUtilAppUid );
+
+ if ( singleton == this )
+ {
+ iReferenceCount--;
+ if( iReferenceCount == 0 )
+ {
+ UserSvr::DllFreeTls( KVCxConnUtilAppUid );
+ delete this;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnectionUtility::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnectionUtility::ConstructL()
+ {
+ MPX_DEBUG1("vcxconnutil ## CVcxNsConnectionUtility::ConstructL() in");
+
+ iUtilImpl = CVcxConnUtilImpl::NewL( this );
+
+ MPX_DEBUG1("vcxconnutil ## CVcxNsConnectionUtility::ConstructL() out");
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnectionUtility::CVcxNsConnectionUtility()
+// -----------------------------------------------------------------------------
+//
+CVcxConnectionUtility::CVcxConnectionUtility( ) :
+CActive( EPriorityStandard )
+ {
+ CActiveScheduler::Add(this);
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnectionUtility::~CVcxConnectionUtility()
+// -----------------------------------------------------------------------------
+//
+CVcxConnectionUtility::~CVcxConnectionUtility()
+ {
+ MPX_DEBUG1("vcxconnutil ## CVcxConnectionUtility::~CConnectionManager in");
+ CloseWaitNote();
+
+ delete iUtilImpl;
+ iNotifier.Close();
+
+ MPX_DEBUG1("vcxconnutil ## CVcxConnectionUtility::~CConnectionManager out");
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnectionUtility::RegisterObserverL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVcxConnectionUtility::RegisterObserverL( MConnUtilEngineObserver* aObserver )
+ {
+ iUtilImpl->RegisterObserverL( aObserver );
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnectionUtility::RemoveObserver
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVcxConnectionUtility::RemoveObserver( MConnUtilEngineObserver* aObserver )
+ {
+ iUtilImpl->RemoveObserver( aObserver );
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnectionUtility::GetIap
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVcxConnectionUtility::GetIap( TUint32& aIapId, TBool aSilent )
+ {
+ MPX_DEBUG1("vcxconnutil ## CVcxConnectionUtility::GetIap in ");
+ TInt err( KErrNone );
+
+ err = iUtilImpl->GetIap( aIapId, aSilent );
+
+ MPX_DEBUG2("vcxconnutil ## CVcxConnectionUtility::GetIap out error: %d ", err );
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnectionUtility::WapIdFromIapIdL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TUint32 CVcxConnectionUtility::WapIdFromIapIdL( TUint32 aIapId )
+ {
+ MPX_DEBUG1("vcxconnutil ## CVcxConnectionUtility::WapIdFromIapIdL in ");
+ TUint32 wapId = iUtilImpl->WapIdFromIapIdL( aIapId );
+ MPX_DEBUG1("vcxconnutil ## CVcxConnectionUtility::WapIdFromIapIdL out ");
+ return wapId;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnectionUtility::Disconnect()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVcxConnectionUtility::DisconnectL()
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnectionUtility::Disconnect in");
+ if( iReferenceCount <= 1 )
+ {
+ iUtilImpl->DisconnectL();
+ }
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnectionUtility::Disconnect out");
+ }
+
+
+void CVcxConnectionUtility::RunL()
+ {
+ TInt err = iStatus.Int();
+ if ( iStatus.Int() == KErrCancel &&
+ iUtilImpl->EngineConnectionStatus() == EVCxConnecting )
+ {
+ // This implifies that user has cancelled connecting dialog,
+ // if currently connecting, disconnect
+ TRAP_IGNORE( iUtilImpl->DisconnectL() );
+ }
+ }
+
+
+void CVcxConnectionUtility::DoCancel()
+ {
+ // complete request if we're active.
+ // othervise app blocks
+ if( IsActive() )
+ {
+ TRequestStatus* s = &iStatus;
+ User::RequestComplete( s, KErrNone );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnectionUtility::DisplayWaitNote()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnectionUtility::DisplayWaitNote(const TDesC& aConnectionName)
+ {
+ if( !IsActive() )
+ {
+ TVcxNotifierParams value;
+ value.iEvent = TVcxNotifierParams::EConnecting;
+
+ value.iMsg = aConnectionName;
+
+ TPckg<TVcxNotifierParams> param( value );
+
+ TPckgBuf<TBool> resultPckg; // Output parameters
+
+ // get connection to the notify server
+ iNotifier.Close();
+
+ if( iNotifier.Connect() == KErrNone )
+ {
+ iStatus = KRequestPending;
+ iNotifier.StartNotifierAndGetResponse( iStatus, KVcxNotifierImplUid,
+ param, resultPckg );
+ SetActive();
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnectionUtility::CloseWaitNote()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnectionUtility::CloseWaitNote()
+ {
+
+ if( IsActive() )
+ {
+ Cancel();
+ }
+
+ TVcxNotifierParams value;
+ value.iEvent = TVcxNotifierParams::EConnected;
+ value.iMsg.Zero();
+
+ TPckg<TVcxNotifierParams> param( value );
+
+ TPckgBuf<TBool> resultPckg;
+
+ iNotifier.Close();
+
+ if( iNotifier.Connect() == KErrNone )
+ {
+
+ TRequestStatus stat;
+ iNotifier.StartNotifierAndGetResponse( stat, KVcxNotifierImplUid, param, resultPckg );
+
+ User::WaitForRequest( stat );
+
+ iNotifier.Close();
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/src/vcxconnutilengine.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,759 @@
+/*
+* Copyright (c) 2006 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:
+*
+*/
+
+
+
+
+#include <mpxlog.h>
+#include <commdb.h>
+#include <basched.h>
+#include <cmmanagerext.h>
+#include <extendedconnpref.h>
+
+#include "vcxconnutilextengineobserver.h"
+#include "vcxconnutilengine.h"
+
+// CONSTANTS
+_LIT( KCommDBIapId, "IAP\\Id" );
+
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::NewL()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilEngine* CVcxConnUtilEngine::NewL( MConnUtilExtEngineObserver* aObserver )
+ {
+ CVcxConnUtilEngine* self = CVcxConnUtilEngine::NewLC( aObserver );
+ CleanupStack::Pop( self ); // self;
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::NewLC()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilEngine* CVcxConnUtilEngine::NewLC( MConnUtilExtEngineObserver* aObserver )
+ {
+ CVcxConnUtilEngine* self = new (ELeave) CVcxConnUtilEngine();
+ CleanupStack::PushL( self );
+ self->iObserver = aObserver;
+ self->ConstructL();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::CVcxNsConnUtilEngine()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilEngine::CVcxConnUtilEngine( ) :
+ CActive( EPriorityStandard ),
+ iConnectionState( EVCxNotConnected )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilEngine::ConstructL()
+ {
+ MPX_DEBUG1("vcxconnutil ## CVcxConnUtilEngine::ConstructL() in");
+
+ iCmManagerExt.OpenL();
+
+ User::LeaveIfError( iSocketServer.Connect() );
+
+ User::LeaveIfError( iConnectionMonitor.ConnectL() );
+
+ User::LeaveIfError( iConnectionMonitor.NotifyEventL( *this ) );
+
+ // get all destination ids
+ iCmManagerExt.AllDestinationsL( iDestinationArray );
+
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::ConstructL() out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::~CVcxNsConnUtilEngine()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilEngine::~CVcxConnUtilEngine()
+ {
+
+ if( iMobility )
+ {
+ // make sure observers are not being called
+ // after receiving Error() from Cancel()
+ iConnectionState = EVCxDisconnecting;
+ iMobility->Cancel();
+ delete iMobility;
+ }
+
+ if( IsActive() )
+ {
+ Cancel();
+ }
+
+ iConnection.Close();
+
+ iSocketServer.Close();
+
+ iCmManagerExt.Close();
+
+ iConnectionMonitor.Close();
+
+ delete iDestinationName;
+
+ iDestinationArray.Close();
+
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::StartToConnect()
+// -----------------------------------------------------------------------------
+//
+TInt CVcxConnUtilEngine::StartToConnect( TConnPref& aPref, TBool aConnAsync )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::StartToConnect with TConnSnapPref in" );
+
+ TInt err( KErrNone );
+ if( EVCxConnected == iConnectionState ||
+ EVCxConnecting == iConnectionState )
+ {
+ return err;
+ }
+ iConnectionState = EVCxConnecting;
+ err = iConnection.Open( iSocketServer );
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::StartToConnect connection opened" );
+ if( err != KErrNone )
+ {
+ return err;
+ }
+
+ if( !IsActive() )
+ {
+ if( aConnAsync )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::StartToConnect connecting async" );
+
+ iConnection.Start( aPref, iStatus );
+ SetActive();
+ TRAP( err, iObserver->WaitL( EVCxPSConnectionStatus ) );
+ if( err == KErrNone )
+ {
+ // save possible error code from async
+ // connection creation
+ err = iConnectingResult;
+ }
+ else if( err == KLeaveExit )
+ {
+ // app is closing, active scheduler is about to be closed.
+ // cancel connection waiting.
+ if( IsActive() )
+ {
+ Cancel();
+ }
+ }
+ }
+ else
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::StartToConnect connecting sync" );
+ err = iConnection.Start();
+ if( err == KErrNone )
+ {
+ iConnectionState = EVCxConnected;
+ }
+ }
+ }
+
+ if( iConnectionState != EVCxConnected )
+ {
+ iIapId = 0;
+ }
+
+ MPX_DEBUG2( "vcxconnutil ## CVcxConnUtilEngine::StartToConnect with TConnSnapPref err: %d out", err );
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::CreateMobility()
+// -----------------------------------------------------------------------------
+//
+TInt CVcxConnUtilEngine::CreateMobility()
+ {
+ TInt err( KErrNone );
+ if( iMobility )
+ {
+ iMobility->Cancel();
+ delete iMobility;
+ iMobility = 0;
+ }
+ if( !iMobility )
+ {
+ TRAP( err, iMobility = CActiveCommsMobilityApiExt::NewL( iConnection, *this ) );
+ }
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::Disconnect()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilEngine::Disconnect()
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::Disconnect in");
+ if( iConnectionState != EVCxNotConnected )
+ {
+ MPX_DEBUG1( "CVcxConnUtilEngine::Disconnect closing connection");
+ iConnectionState = EVCxDisconnecting;
+ if( iMobility )
+ {
+ iMobility->Cancel();
+ delete iMobility;
+ iMobility = NULL;
+ }
+
+ iConnection.Close();
+ iConnectionState = EVCxNotConnected;
+
+ }
+ if( IsActive() )
+ {
+ Cancel();
+ }
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::Disconnect out");
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::PreferredCarrierAvailable()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilEngine::PreferredCarrierAvailable( TAccessPointInfo aOldAPInfo ,
+ TAccessPointInfo aNewAPInfo,
+ TBool /*aIsUpgrade*/,
+ TBool aIsSeamless )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::PreferredCarrierAvailable in");
+ MPX_DEBUG2( "PreferredCarrierAvailable oldiap: %d", aOldAPInfo.AccessPoint() );
+ MPX_DEBUG2( "PreferredCarrierAvailable newiap: %d", aNewAPInfo.AccessPoint() );
+ MPX_DEBUG2( "PreferredCarrierAvailable seamless: %d", aIsSeamless );
+
+
+ if ( !aIsSeamless &&
+ aOldAPInfo.AccessPoint() > 0 &&
+ aOldAPInfo.AccessPoint() != aNewAPInfo.AccessPoint() )
+ {
+ if( iConnectionState == EVCxRoamingAccepted )
+ {
+ // in this case we have a roaming ongoing at the
+ // but we have not yet received NewCarrierActive
+ // so networking has found yet better usable iap.
+ // since everyone have allready accepted roaming we
+ // can migrate it right away
+ MPX_DEBUG1( "CVcxConnUtilEngine::PreferredCarrierAvailable migrated due EVCxRoamingAccepted state" );
+ iMobility->MigrateToPreferredCarrier();
+ }
+ else if( iConnectionState != EVCxRoamingRequest )
+ {
+ TBool allowRoam( EFalse );
+ iConnectionState = EVCxRoamingRequest;
+
+ TRAPD( err, allowRoam = iObserver->RequestIsRoamingAllowedL() );
+
+ // there is a possibility, that client has disconnected during request
+ // in that case, do nothing
+ if( iConnectionState == EVCxNotConnected )
+ {
+ return;
+ }
+
+ if( err == KErrNone && allowRoam )
+ {
+
+ MPX_DEBUG1( "CVcxConnUtilEngine::PreferredCarrierAvailable migrated" );
+
+ iMobility->MigrateToPreferredCarrier();
+ iConnectionState = EVCxRoamingAccepted;
+ }
+ else
+ {
+ MPX_DEBUG1( "CVcxConnUtilEngine::PreferredCarrierAvailable ignored" );
+ iMobility->IgnorePreferredCarrier();
+ iConnectionState = EVCxConnected;
+ // reset IAP / SNAP info to the pubsub
+ TRAPD( err, iObserver->IapChangedL() );
+ if( err != KErrNone )
+ {
+ // internal error, let's try to resolve connection
+ iConnectionState = EVCxError;
+ TRAP( err, iObserver->IapChangedL() );
+ }
+ }
+ }
+ else
+ {
+ MPX_DEBUG1( "CVcxConnUtilEngine::PreferredCarrierAvailable Allready roaming" );
+ }
+ }
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::PreferredCarrierAvailable out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::NewCarrierActive()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilEngine::NewCarrierActive( TAccessPointInfo /*aNewAPInfo*/, TBool aIsSeamless )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::NewCarrierActive in");
+
+ if ( aIsSeamless )
+ {
+ // It is Seamless. E.g. Mobile IP enabled.
+ MPX_DEBUG1( "CVcxConnUtilEngine::NewCarrierActive seamless");
+ iConnectionState = EVCxConnected;
+ }
+ else
+ {
+ MPX_DEBUG1( "CVcxConnUtilEngine::NewCarrierActive accepting new carrier");
+
+ // We accept the new IAP / SNAP.
+ iMobility->NewCarrierAccepted();
+ iConnectionState = EVCxConnected;
+ // change new IAP / SNAP info to the pubsub
+ TRAPD( err, iObserver->IapChangedL() );
+ if( err != KErrNone )
+ {
+ // internal error, let's try to resolve connection
+ iMobility->NewCarrierRejected();
+ iConnectionState = EVCxError;
+ TRAP( err, iObserver->IapChangedL() );
+ }
+ }
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::NewCarrierActive out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::EventL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilEngine::EventL( const CConnMonEventBase &aConnMonEvent )
+ {
+ TInt eventType = aConnMonEvent.EventType();
+
+ TInt connectionId = aConnMonEvent.ConnectionId();
+
+ // for other events:
+ // if not master instance or event does not concern
+ // current connection or we are not connected, do not
+ // need to handle events
+ if( !iObserver->IsMaster() ||
+ connectionId != iCurrentConnectionId ||
+ iConnectionState != EVCxConnected )
+ {
+ return;
+ }
+
+ switch(eventType)
+ {
+ case EConnMonConnectionStatusChange:
+ {
+ const CConnMonConnectionStatusChange* event =
+ static_cast<const CConnMonConnectionStatusChange*>( &aConnMonEvent );
+
+ if( event->ConnectionStatus() == KLinkLayerClosed )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::EventL: KLinkLayerClosed ");
+ iObserver->IapChangedL();
+ }
+ }
+ break;
+ case EConnMonDeleteConnection:
+ {
+ iObserver->IapChangedL();
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::Error()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilEngine::Error( TInt aError )
+ {
+ MPX_DEBUG2( "vcxconnutil ## CVcxConnUtilEngine::Error %d in", aError );
+ if( aError != KErrNone )
+ {
+ // Error method is also called, when we call Cancel -method for iMobility
+ // during disconnecting or during deallocation. Those are not concidered
+ // as "errors" in the connection utility, so they do not require any
+ // further handling
+ if( iConnectionState != EVCxDisconnecting )
+ {
+ iConnectionState = EVCxError;
+ TRAP_IGNORE( iObserver->IapChangedL() );
+ }
+
+ }
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::Error out" );
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::GetCmmDestinationIdL()
+// -----------------------------------------------------------------------------
+//
+TUint32 CVcxConnUtilEngine::GetCmmDestinationIdL( CMManager::TSnapPurpose aPurpose )
+ {
+ TUint32 destinationId( 0 );
+ // get default destination id
+ TCmDefConnValue defConnection;
+ iCmManagerExt.ReadDefConnL( defConnection );
+
+ // if default is setted to be destination, get it's ID
+ if( defConnection.iType == ECmDefConnDestination &&
+ aPurpose == CMManager::ESnapPurposeUnknown )
+ {
+ destinationId = defConnection.iId;
+ }
+ else if( defConnection.iType == ECmDefConnConnectionMethod ||
+ aPurpose != CMManager::ESnapPurposeUnknown )
+ {
+ // default connection is connection method,
+ // search for the destination of it
+ RArray<TUint32> destinations;
+ CleanupClosePushL( destinations );
+ iCmManagerExt.AllDestinationsL(destinations);
+
+ RCmDestinationExt destination;
+ RCmConnectionMethodExt connectionMethod;
+ TInt exists( KErrNotFound );
+ TInt count = destinations.Count();
+ for( TInt i = 0; i < count && exists != KErrNone; i++ )
+ {
+ destination = iCmManagerExt.DestinationL( destinations[ i ] );
+ CleanupClosePushL( destination );
+
+ // look for default destination id
+ if( aPurpose == CMManager::ESnapPurposeUnknown )
+ {
+ // check if connection method belongs to destination
+ TRAP( exists,
+ connectionMethod = destination.ConnectionMethodByIDL(
+ defConnection.iId ) );
+ if( exists == KErrNone )
+ {
+ connectionMethod.Close();
+ // correct destination found
+ destinationId = destination.Id();
+ }
+ }
+ // look for destination id based on purpose
+ else
+ {
+ if( destination.MetadataL( CMManager::ESnapMetadataPurpose ) ==
+ aPurpose )
+ {
+ // found, save destination id and end search
+ destinationId = destination.Id();
+ exists = KErrNone;
+ }
+ }
+ CleanupStack::PopAndDestroy( &destination );
+ }
+ CleanupStack::PopAndDestroy( &destinations );
+ }
+ return destinationId;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::PrepareConnectionDetailsL()
+// -----------------------------------------------------------------------------
+//
+TBool CVcxConnUtilEngine::PrepareConnectionDetailsL( TInt aDestinationID )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::PrepareConnectionDetailsL in");
+ TBool connectionOk( EFalse );
+
+ ResetConnectionInfo();
+
+ if( aDestinationID )
+ {
+
+ MPX_DEBUG2( "CVcxConnUtilEngine::PrepareConnectionDetailsL destinationID: %d", aDestinationID);
+ iDestinationId = aDestinationID;
+ RCmDestinationExt destination = iCmManagerExt.DestinationL( aDestinationID );
+ CleanupClosePushL(destination);
+
+ iDestinationName = destination.NameLC();
+ CleanupStack::Pop( iDestinationName );
+
+ MPX_DEBUG2( "CVcxConnUtilEngine::PrepareConnectionDetailsL destination name: %S", iDestinationName);
+
+ TInt cmCount = destination.ConnectionMethodCount();
+ MPX_DEBUG2( "CVcxConnUtilEngine::PrepareConnectionDetailsL method count: %d", cmCount);
+ if( cmCount )
+ {
+ connectionOk = ETrue;
+ }
+ CleanupStack::PopAndDestroy( &destination );
+ }
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::PrepareConnectionDetailsL out");
+ return connectionOk;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::IsIapConnected()
+// -----------------------------------------------------------------------------
+//
+TBool CVcxConnUtilEngine::IsIapConnected( TUint32 aIapId )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::IsIapConnected in");
+ TBool connected( EFalse );
+ TRAPD( err, connected =
+ iCmManagerExt.GetConnectionMethodInfoBoolL( aIapId, CMManager::ECmConnected ) )
+
+ if( err != KErrNone )
+ {
+ connected = EFalse;
+ }
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::IsIapConnected out");
+ return connected;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::FillActiveConnectionDetailsL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilEngine::FillActiveConnectionDetailsL()
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::FillActiveConnectionDetailsL in");
+ // fill in connection information from the latest connection
+ TRequestStatus status;
+ TUint connectionCount(0);
+ iConnectionMonitor.GetConnectionCount(connectionCount, status);
+ User::WaitForRequest( status );
+ User::LeaveIfError(status.Int());
+
+ if (connectionCount)
+ {
+ // fill in IAP Id
+ iConnection.GetIntSetting( KCommDBIapId, iIapId );
+ MPX_DEBUG2( "CVcxConnUtilEngine::FillActiveConnectionDetailsL iap id: %d", iIapId );
+
+ // get current connection id
+ TBool found( EFalse );
+ TUint subConnCount( 0 );
+ for ( TInt i ( 1 ); i <= connectionCount && !found; i ++ )
+ {
+ TUint connectionId;
+ User::LeaveIfError( iConnectionMonitor.GetConnectionInfo( i,
+ connectionId,
+ subConnCount ) );
+ TUint iapIdToCheck;
+ iConnectionMonitor.GetUintAttribute(
+ connectionId, 0, KIAPId, iapIdToCheck, status );
+ // Note: Codescanner generates here pointless warning. We need to get data synchronously.
+ User::WaitForRequest ( status );
+ User::LeaveIfError( status.Int() );
+
+ if ( iapIdToCheck == iIapId )
+ {
+ // found
+ iCurrentConnectionId = connectionId;
+ found = ETrue;
+ }
+ }
+
+ if( !iDestinationId )
+ {
+ // try to fill destination info if not yet gotten
+ FillDestinationInfoL();
+ }
+ }
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::FillActiveConnectionDetailsL out");
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::IapId()
+// -----------------------------------------------------------------------------
+//
+TUint32 CVcxConnUtilEngine::IapId() const
+ {
+ MPX_DEBUG2( "vcxconnutil ## CVcxConnUtilEngine::IapId %d", iIapId );
+
+ return iIapId;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::DestinationId()
+// -----------------------------------------------------------------------------
+//
+TInt CVcxConnUtilEngine::DestinationId() const
+ {
+ return iDestinationId;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::ConnectionStatus()
+// -----------------------------------------------------------------------------
+//
+TVCxConnectionStatus CVcxConnUtilEngine::ConnectionStatus() const
+ {
+ MPX_DEBUG2( "vcxconnutil ## CVcxConnUtilEngine::ConnectionStatus %d", iConnectionState );
+ return iConnectionState;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::SetConnectionStatus()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilEngine::SetConnectionStatus( TVCxConnectionStatus aStatus )
+ {
+ iConnectionState = aStatus;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::DestinationName()
+// -----------------------------------------------------------------------------
+//
+TPtrC CVcxConnUtilEngine::DestinationName() const
+ {
+ if ( iDestinationName )
+ {
+ return iDestinationName->Des();
+ }
+ return TPtrC();
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::ResetConnectionInfo()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilEngine::ResetConnectionInfo()
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::ResetConnectionInfo in");
+ iIapId = 0;
+ delete iDestinationName;
+ iDestinationName = 0;
+ iDestinationId = 0;
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::ResetConnectionInfo out");
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::FillDestinationInfoL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilEngine::FillDestinationInfoL( )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::FillDestinationInfoL in");
+ TInt count = iDestinationArray.Count();
+ delete iDestinationName;
+ iDestinationName = 0;
+ iDestinationId = 0;
+
+ TBool found( EFalse );
+ for( TUint destIndex = 0; destIndex < count && !found; ++destIndex )
+ {
+ RCmDestinationExt destination =
+ iCmManagerExt.DestinationL( iDestinationArray[ destIndex ] );
+
+ CleanupClosePushL( destination );
+ TInt cmCount = destination.ConnectionMethodCount();
+
+ for ( TUint methIndex = 0; methIndex < cmCount && !found; ++methIndex )
+ {
+ RCmConnectionMethodExt connectionMethod = destination.ConnectionMethodL( methIndex );
+ CleanupClosePushL( connectionMethod );
+ if( iIapId == connectionMethod.GetIntAttributeL( CMManager::ECmIapId ) )
+ {
+ // found, save data
+ iDestinationId = iDestinationArray[ destIndex ];
+ MPX_DEBUG2( "CVcxConnUtilEngine::FillDestinationInfoL destination found: %d", iDestinationId );
+ iDestinationName = destination.NameLC();
+ CleanupStack::Pop( iDestinationName );
+ found = ETrue;
+ MPX_DEBUG2( "CVcxConnUtilEngine::FillDestinationInfoL snap name: %S", iDestinationName );
+ }
+ CleanupStack::PopAndDestroy( &connectionMethod );
+ }
+ CleanupStack::PopAndDestroy( &destination );
+ }
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilEngine::FillDestinationInfoL out");
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::DoCancel()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilEngine::DoCancel()
+ {
+
+ if( iConnectionState == EVCxConnecting )
+ {
+ MPX_FUNC( "CVcxConnUtilEngine::DoCancel disconnect");
+ Disconnect();
+ }
+ iConnectingResult = KErrCancel;
+ iObserver->EndWait( EVCxPSConnectionStatus );
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::RunL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilEngine::RunL()
+ {
+ if ( iStatus.Int() != KErrNone )
+ {
+ iConnectingResult = iStatus.Int();
+ iConnectionState = EVCxNotConnected;
+ }
+ else
+ {
+ iConnectingResult = KErrNone;
+ if( iConnectionState == EVCxConnecting )
+ {
+ iConnectionState = EVCxConnected;
+ }
+ }
+ iObserver->EndWait( EVCxPSConnectionStatus );
+
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::QueryConn()
+// -----------------------------------------------------------------------------
+//
+TBool CVcxConnUtilEngine::QueryConn()
+ {
+ return iQueryConn;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilEngine::SetQueryConn()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilEngine::SetQueryConn( TBool aQueryConn )
+ {
+ iQueryConn = aQueryConn;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/src/vcxconnutilimpl.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,1155 @@
+/*
+* Copyright (c) 2006 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: Class to handle connection creation.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <e32cmn.h>
+#include <bldvariant.hrh>
+#include <commdb.h> // CMDBSession
+#include <commsdattypesv1_1.h> // CCDWAPIPBearerRecord
+#include <ConnectionUiUtilities.h>
+#include <cmdestination.h>
+#include <cdbcols.h>
+#include <commdbconnpref.h>
+#include <eikbtgrp.h>
+#include <WlanCdbCols.h>
+#include <connpref.h>
+#include <extendedconnpref.h>
+#include <mpxlog.h>
+
+#include <ipvideo/vcxconnectionutility.h>
+#include <ipvideo/vcxconnutilengineobserver.h>
+#include "vcxconnectionutility.hrh"
+#include "vcxconnutilimpl.h"
+#include "vcxconnutilengine.h"
+#include "vcxconnutilpubsub.h"
+#include "vcxconnutilwaitsch.h"
+
+// CONSTANTS
+_LIT( KConnUtilRoleSema, "__ConnUtillMasterSlaveRoleSwitchSema__ ");
+_LIT( KConnUtilConnectionSema, "__ConnUtillConnectionCreateSema__ ");
+
+const TInt KIptvCenRepAPModeAlwaysAsk = 0;
+const TInt KConUtilSemaStartupValue = 1;
+const TInt KNbrOfNotFoundConnTries = 30;
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::NewL()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilImpl* CVcxConnUtilImpl::NewL( CVcxConnectionUtility* aUiInterface )
+ {
+ CVcxConnUtilImpl* self = CVcxConnUtilImpl::NewLC( aUiInterface );
+ CleanupStack::Pop( self ); // self;
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::NewLC()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilImpl* CVcxConnUtilImpl::NewLC( CVcxConnectionUtility* aUiInterface )
+ {
+ CVcxConnUtilImpl* self = new (ELeave) CVcxConnUtilImpl( aUiInterface );
+ CleanupStack::PushL( self );
+ self->ConstructL( );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilImpl::ConstructL( )
+ {
+ MPX_DEBUG1("vcxconnutil ## CVcxConnUtilImpl::ConstructL() in");
+
+ iWaitHandler = CVcxConnUtilWaitSch::NewL();
+
+ iObservers.Reset();
+
+ TInt err( KErrNone );
+ err = iSemaSwitchRole.CreateGlobal( KConnUtilRoleSema, KConUtilSemaStartupValue );
+ if( err == KErrAlreadyExists )
+ {
+ // semafore exists already, open it
+ err = iSemaSwitchRole.OpenGlobal( KConnUtilRoleSema );
+ }
+ User::LeaveIfError( err );
+
+ err = iSemaCreateConn.CreateGlobal( KConnUtilConnectionSema, KConUtilSemaStartupValue );
+ if( err == KErrAlreadyExists )
+ {
+ // semafore exists already, open it
+ err = iSemaCreateConn.OpenGlobal( KConnUtilConnectionSema );
+ }
+ User::LeaveIfError( err );
+
+ iEngine = CVcxConnUtilEngine::NewL( this );
+
+ iPubsub = CVcxConnUtilPubSub::NewL( this );
+
+ // check and set pubsub -values
+ TInt activeIap( 0 );
+ User::LeaveIfError( iPubsub->GetValue( EVCxPSIapId, activeIap ) );
+ if( activeIap != 0 )
+ {
+ // check if there really is connection, if not reinit values
+ if( !iEngine->IsIapConnected( activeIap ) )
+ {
+ // no connection, data integrity has been corrupted at some point
+ activeIap = 0;
+ }
+ }
+ if( activeIap == 0 )
+ {
+ MPX_DEBUG1("CVcxConnUtilImpl::ConstructL() no connection yet, initing values");
+ User::LeaveIfError( iPubsub->SetValue( EVCxPSMasterExists, 0 ) );
+
+ User::LeaveIfError( iPubsub->SetValue( EVCxPSIapId, 0 ) );
+
+ User::LeaveIfError( iPubsub->SetValue( EVCxPSSnapId, 0 ) );
+
+ User::LeaveIfError( iPubsub->SetValue(
+ EVCxPSConnectionStatus, EVCxNotConnected ) );
+
+ User::LeaveIfError( iPubsub->SetValue( EVCxPSNbrConnInstances, 0 ) );
+ }
+
+ MPX_DEBUG1("vcxconnutil ## CVcxConnUtilImpl::ConstructL() out");
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::CVcxNsConnectionUtility()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilImpl::CVcxConnUtilImpl( CVcxConnectionUtility* aUiInterface ) :
+iUIInterface( aUiInterface )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::~CVcxConnectionUtility()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilImpl::~CVcxConnUtilImpl()
+ {
+ MPX_DEBUG1("vcxconnutil ## CVcxConnUtilImpl::~CVcxConnUtilImpl in");
+
+ iObservers.Close();
+
+ if( iEngine && iPubsub )
+ {
+ TRAP_IGNORE( DisconnectL() );
+ }
+
+ delete iWaitHandler;
+
+ iSemaSwitchRole.Close();
+ iSemaCreateConn.Close();
+
+ delete iPubsub;
+ delete iEngine;
+
+ MPX_DEBUG1("vcxconnutil ## CVcxConnUtilImpl::~CVcxConnUtilImpl out");
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::RegisterObserverL
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilImpl::RegisterObserverL( MConnUtilEngineObserver* aObserver )
+ {
+ MPX_DEBUG1("vcxconnutil ## CVcxConnUtilImpl::RegisterObserverL in");
+ iObservers.AppendL( aObserver );
+ MPX_DEBUG1("vcxconnutil ## CVcxConnUtilImpl::RegisterObserverL out");
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::RemoveObserver
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilImpl::RemoveObserver( MConnUtilEngineObserver* aObserver )
+ {
+ MPX_DEBUG1("Cvcxconnutil ## VcxConnUtilImpl::RemoveObserver in");
+ TInt i;
+ for ( i = 0; i < iObservers.Count(); i++ )
+ {
+ if ( aObserver == iObservers[i] )
+ {
+ iObservers.Remove( i );
+ iObservers.Compress();
+ break;
+ }
+ }
+ MPX_DEBUG1("Cvcxconnutil ## VcxConnUtilImpl::RemoveObserver out");
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::EngineConnectionStatus
+// -----------------------------------------------------------------------------
+//
+TVCxConnectionStatus CVcxConnUtilImpl::EngineConnectionStatus()
+ {
+ return iEngine->ConnectionStatus();
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::GetIap
+// -----------------------------------------------------------------------------
+//
+TInt CVcxConnUtilImpl::GetIap( TUint32& aIapId, TBool aSilent )
+ {
+ MPX_DEBUG1("vcxconnutil ## CVcxConnUtilImpl::GetIap in ");
+ aIapId = 0;
+ TInt err( KErrNone );
+ // assume always new connection
+ iNewConnection = ETrue;
+
+ switch ( iEngine->ConnectionStatus() )
+ {
+ case EVCxNotConnected:
+ case EVCxDisconnecting:
+ iSemaCreateConn.Wait();
+ err = KErrNotFound;
+ // KErrNotFound from connection creation indicates that we have
+ // some destination with unusable iap(s) in it for we cannot connect to
+ // in that case, destination id to db is setted as "always ask" and connection
+ // creation will be tried again for 30 times
+ for(TInt i = 0; i < KNbrOfNotFoundConnTries && err == KErrNotFound; ++i)
+ {
+ err = CreateConnection( aSilent );
+ MPX_DEBUG2("vcxconnutil ## CVcxConnUtilImpl::GetIap - CreateConnection returned %d ", err );
+ }
+ iSemaCreateConn.Signal();
+ break;
+ case EVCxConnecting:
+ {
+ // this instance is connecting, meaning engine is waiting for
+ // networking to create connection, we need to wait for the engine
+ // to finish it's waiting
+ TRAP( err, WaitL( EVCxPSConnectionStatus ) );
+ if( iEngine->ConnectionStatus() != EVCxConnected )
+ {
+ // if main active object didn't managed to create connection,
+ // return error. This active object does not know the actual
+ // error so return KErrGeneral
+ err = KErrGeneral;
+ }
+ else
+ {
+ err = HandleFinalizeConnection();
+ }
+ }
+ break;
+ case EVCxRoamingAccepted: // pass throught
+ case EVCxRoamingRequest: // pass throught
+ TRAP( err, WaitL( EVCxPSConnectionStatus ) );
+ default:
+ iNewConnection = EFalse;
+ break;
+ }
+
+ if( err == KErrNone )
+ {
+ // get iap id if any. If this is the first connection for this
+ // instance, iap id will be fetched later on
+ aIapId = iEngine->IapId();
+ }
+
+ MPX_DEBUG2("vcxconnutil ## CVcxConnUtilImpl::GetIap out error: %d ", err );
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::WapIdFromIapIdL
+// -----------------------------------------------------------------------------
+//
+TUint32 CVcxConnUtilImpl::WapIdFromIapIdL( TUint32 aIapId )
+ {
+ MPX_DEBUG1("vcxconnutil ## CVcxConnUtilImpl::WapIdFromIapIdL() in ");
+ MPX_DEBUG2("vcxconnutil ## CVcxConnUtilImpl::WapIdFromIapIdL() IAP id = %d", aIapId);
+ CMDBSession* db = CMDBSession::NewL( CMDBSession::LatestVersion() );
+ CleanupStack::PushL( db );
+
+ // WapIpBearer table contains the mapping between wap and iap id's.
+ CCDWAPIPBearerRecord* wapBearerRecord =
+ static_cast<CCDWAPIPBearerRecord*>( CCDRecordBase::RecordFactoryL( KCDTIdWAPIPBearerRecord ) );
+
+ CleanupStack::PushL( wapBearerRecord );
+
+ wapBearerRecord->iWAPIAP = aIapId;
+
+ TBool found = wapBearerRecord->FindL( *db );
+
+ if ( !found )
+ {
+ MPX_DEBUG1("vcxconnutil ## CVcxConnUtilImpl::WapIdFromIapIdL() Record was not found. Leaving with KErrNotFound.");
+ User::Leave(KErrNotFound);
+ }
+
+ TUint32 wap = static_cast<TUint32>( wapBearerRecord->iWAPAccessPointId );
+
+ CleanupStack::PopAndDestroy( wapBearerRecord );
+ CleanupStack::PopAndDestroy( db );
+
+ MPX_DEBUG2("vcxconnutil ## CVcxConnUtilImpl::WapIdFromIapIdL() Matching WAP id = %d", wap);
+ MPX_DEBUG1("vcxconnutil ## CVcxConnUtilImpl::WapIdFromIapIdL() out ");
+ return wap;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::PrepareConnSettings()
+// -----------------------------------------------------------------------------
+//
+TInt CVcxConnUtilImpl::PrepareConnSettings()
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::PrepareConnSettings in");
+ TInt err( KErrNone );
+ TInt vcDestinationID( 0 );
+
+ if ( !iEngine->QueryConn() )
+ {
+ TRAP( err, vcDestinationID =
+ iEngine->GetCmmDestinationIdL( CMManager::ESnapPurposeUnknown ) );
+ MPX_DEBUG2( "vcxconnutil ## CVcxConnUtilImpl::PrepareConnSettings - destination id %d", vcDestinationID);
+ }
+
+ TBool detailsGotten( EFalse );
+ TRAP( err, detailsGotten = iEngine->PrepareConnectionDetailsL( vcDestinationID ) );
+ if( err == KErrNone && !detailsGotten )
+ {
+ // not able to resolve connection details, proceed with always ask
+ iEngine->ResetConnectionInfo();
+ }
+
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::PrepareConnSettings out");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::CreateConnection()
+// -----------------------------------------------------------------------------
+//
+TInt CVcxConnUtilImpl::CreateConnection( TBool aSilent )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::CreateConnectionL in");
+
+ TInt err( KErrNone );
+
+ TInt connStatusPS( EVCxNotConnected );
+
+ err = PrepareConnSettings();
+ if( err != KErrNone )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::CreateConnectionL error getting connsettings out");
+ return err;
+ }
+
+ err = iPubsub->GetValue( EVCxPSConnectionStatus, connStatusPS );
+ if( err != KErrNone )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::CreateConnectionL error getting PS conn status out");
+ return err;
+ }
+
+ // if there is already an active connection created by some other
+ // instance, use that one
+ TInt snapId( 0 );
+ TBool masterConnect( EFalse );
+
+ if( connStatusPS == EVCxConnected || connStatusPS == EVCxRoamingRequest )
+ {
+ err = iPubsub->GetValue( EVCxPSSnapId, snapId );
+ if( err != KErrNone )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::CreateConnectionL error getting PS snap id, out");
+ return err;
+ }
+ if( snapId == 0 )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::CreateConnectionL not usable snap is in PS");
+ // current snap is undefined, set snap id KErrNotFound for
+ // DoCreateConnection to use active iap instead of snap id
+ snapId = KErrNotFound;
+ }
+ }
+ else
+ {
+ masterConnect = ETrue;
+ snapId = iEngine->DestinationId();
+ }
+
+ err = DoCreateConnection( aSilent, snapId, masterConnect );
+ if( err == KErrNotFound && masterConnect )
+ {
+ // KErrNotFound from connection creation indicates that we have
+ // some destination with unusable iap(s) in it. Enable connection query.
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::CreateConnectionL - set connection query");
+ iEngine->SetQueryConn( ETrue );
+ }
+ if( err == KErrNone )
+ {
+ err = HandleFinalizeConnection();
+ }
+
+ MPX_DEBUG2( "vcxconnutil ## CVcxConnUtilImpl::CreateConnectionL out (%d)", err);
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::DoCreateConnection()
+// -----------------------------------------------------------------------------
+//
+TInt CVcxConnUtilImpl::DoCreateConnection( TBool /*aSilent*/, TInt32 aSnapId, TBool aMasterConnect )
+ {
+ MPX_DEBUG2( "vcxconnutil ## CVcxConnUtilImpl::DoCreateConnectionL in (snapId=%d)", aSnapId);
+
+ TInt err( KErrNone );
+
+ if ( aSnapId == KIptvCenRepAPModeAlwaysAsk )
+ {
+ //In always ask mode we show always ask dialog
+ TCommDbConnPref connPref;
+ connPref.SetDialogPreference( ECommDbDialogPrefPrompt );
+ err = iEngine->StartToConnect( connPref );
+ MPX_DEBUG2( "CVcxConnUtilImpl::DoCreateConnectionL connection start always ask err %d", err);
+ }
+ else if ( aSnapId > KIptvCenRepAPModeAlwaysAsk )
+ {
+ TConnSnapPref prefs;
+ prefs.SetSnap( aSnapId );
+ err = iEngine->StartToConnect( prefs, aMasterConnect );
+ MPX_DEBUG2( "CVcxConnUtilImpl::DoCreateConnectionL connection start err %d", err);
+ }
+ else
+ {
+ TInt iapPS( 0 );
+ err = iPubsub->GetValue( EVCxPSIapId, iapPS );
+ if( err == KErrNone )
+ {
+ if( iapPS )
+ {
+ TCommDbConnPref connPref;
+ connPref.SetIapId( iapPS );
+ connPref.SetDialogPreference( ECommDbDialogPrefDoNotPrompt );
+ err = iEngine->StartToConnect( connPref, EFalse );
+ MPX_DEBUG2( "CVcxConnUtilImpl::DoCreateConnectionL connection via iap start err %d", err);
+ }
+ else
+ {
+ err = KErrNotFound;
+ }
+ }
+ }
+ if( err == KErrNone && aMasterConnect )
+ {
+ err = iEngine->CreateMobility();
+ }
+ MPX_DEBUG2( "vcxconnutil ## CVcxConnUtilImpl::DoCreateConnectionL out (%d)", err);
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::HandleFinalizeConnection()
+// -----------------------------------------------------------------------------
+//
+TInt CVcxConnUtilImpl::HandleFinalizeConnection()
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::HandleFinalizeConnection in");
+ if( !iNewConnection )
+ {
+ // if connection is not new for this instance
+ // no finalizing required
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::HandleFinalizeConnection no new connection, out");
+ return KErrNone;
+ }
+ if( iEngine->ConnectionStatus() != EVCxConnected )
+ {
+ // connection not ok, no point to proceed, return error
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::HandleFinalizeConnection not connected, out");
+ return KErrGeneral;
+ }
+
+ iNewConnection = EFalse;
+ TRAPD( err, iEngine->FillActiveConnectionDetailsL() );
+
+ if( err == KErrNone )
+ {
+ TRAP( err, iPubsub->IncCounterPubSubL( EVCxPSNbrConnInstances ) );
+ if( err == KErrNone )
+ {
+ // master role check and switch if necessary
+ if( !iMaster )
+ {
+ err = CheckAndChangeSlaveToMaster();
+ }
+ }
+ if( err == KErrNone && iMaster )
+ {
+ TRAP( err, SaveConnectionToPubSubL() );
+ }
+ if( err == KErrNone )
+ {
+ // start getting events from pubsub
+ iPubsub->StartSubscibers();
+ }
+ }
+ if( err != KErrNone )
+ {
+ // some operation above failed, internal error
+ // try to disconnect and return error
+ TRAPD( errDisc, DisconnectL() );
+ // return latest error if disconnecting fails
+ if( errDisc != KErrNone )
+ {
+ err = errDisc;
+ }
+ }
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::HandleFinalizeConnection out");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::DisconnectConnection()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilImpl::DisconnectL()
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::Disconnect in");
+ TVCxConnectionStatus connStatus = iEngine->ConnectionStatus();
+
+ // if this is a master, and it is roaming we need to wait
+ // for roaming to finish
+ if( iMaster )
+ {
+ // because EVCxRoamingAccepted is never saved as
+ // connection status to PS,
+ // it is safe to wait PS value key change here
+ if( connStatus == EVCxRoamingRequest ||
+ connStatus == EVCxRoamingAccepted )
+ {
+ MPX_DEBUG1( "CVcxConnUtilImpl::Disconnect master waiting roaming to finish");
+ WaitL( EVCxPSConnectionStatus );
+ MPX_DEBUG1( "CVcxConnUtilImpl::Disconnect master waiting finished");
+ connStatus = iEngine->ConnectionStatus();
+ }
+ }
+ else
+ {
+ // if slave is about to disconnect
+ // and it's internal state is roaming
+ // we know that it has been responded to
+ // roaming request. Decrease value here
+ if( connStatus == EVCxRoamingRequest ||
+ connStatus == EVCxRoamingAccepted ||
+ connStatus == EVCxPendingClientRequest )
+ {
+ if( connStatus == EVCxRoamingAccepted )
+ {
+ MPX_DEBUG1( "CVcxConnUtilImpl::Disconnect slave removes it's acceptance");
+ iPubsub->DecCounterPubSubL( EVCxPSNbRoamAccepted );
+ }
+ MPX_DEBUG1( "CVcxConnUtilImpl::Disconnect slave removes it's response");
+ iPubsub->DecCounterPubSubL( EVCxPSNbrRoamResp );
+ }
+ }
+
+ // disconnecting, no longer interested in pubsub events
+ iPubsub->CancelValueSubscribers();
+
+ if( connStatus == EVCxNotConnected )
+ {
+ return;
+ }
+
+ TInt nbrOfConnUsers( 0 );
+ User::LeaveIfError( iPubsub->GetValue( EVCxPSNbrConnInstances, nbrOfConnUsers ) );
+
+ if( nbrOfConnUsers > 0 )
+ {
+ iPubsub->DecCounterPubSubL( EVCxPSNbrConnInstances );
+ }
+ iPubsub->GetValue( EVCxPSNbrConnInstances, nbrOfConnUsers );
+ // we're leaving and there are no other instances using connection
+ if( nbrOfConnUsers == 0 )
+ {
+ // no more connection users, reset PS -values
+ User::LeaveIfError( iPubsub->SetValue( EVCxPSIapId, 0 ) );
+
+ User::LeaveIfError( iPubsub->SetValue( EVCxPSSnapId, 0 ) );
+
+ User::LeaveIfError( iPubsub->SetValue(
+ EVCxPSConnectionStatus, EVCxNotConnected ) );
+
+ User::LeaveIfError( iPubsub->SetValue(
+ EVCxPSRoamingRequestStatus, EVCxRoamingNotInit ) );
+ }
+ iEngine->Disconnect();
+
+ // cannot be master anymore if not using connection
+ if( iMaster )
+ {
+ iMaster = EFalse;
+ User::LeaveIfError( iPubsub->SetValue( EVCxPSMasterExists, 0 ) );
+ }
+
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::Disconnect out");
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::SaveConnectionToPubSubL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilImpl::SaveConnectionToPubSubL()
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::SaveConnectionToPubSubL in");
+ // publish connection properties
+ // IAP id:
+ User::LeaveIfError( iPubsub->SetValue( EVCxPSIapId, iEngine->IapId() ) );
+
+ // Snap ID:
+ User::LeaveIfError( iPubsub->SetValue( EVCxPSSnapId, iEngine->DestinationId() ) );
+
+ // connection State
+ User::LeaveIfError( iPubsub->SetValue(
+ EVCxPSConnectionStatus, iEngine->ConnectionStatus() ) );
+
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::SaveConnectionToPubSubL out");
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::RequestIsRoamingAllowedL()
+// -----------------------------------------------------------------------------
+//
+TBool CVcxConnUtilImpl::RequestIsRoamingAllowedL()
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::RequestIsRoamingAllowedL in");
+ TBool okToRoam( ETrue );
+
+ // if this instance is master, need to wait for slaves to request their status before proceeding
+ if( iMaster )
+ {
+ // init pubsubs for roaming request status checking
+ User::LeaveIfError( iPubsub->SetValue( EVCxPSNbrRoamResp, 0 ) );
+ User::LeaveIfError( iPubsub->SetValue( EVCxPSNbRoamAccepted, 0 ) );
+
+ // query own state
+ okToRoam = DoRequestClientRoamingL();
+ // client might have disconnected
+ if( iEngine->ConnectionStatus() == EVCxNotConnected )
+ {
+ MPX_DEBUG1( "CVcxConnUtilImpl::RequestIsRoamingAllowedL master disconnected, out");
+ return EFalse;
+ }
+
+ User::LeaveIfError( iPubsub->SetValue( EVCxPSConnectionStatus, EVCxRoamingRequest ) );
+ TInt nbrOfConnUsers(0);
+ User::LeaveIfError( iPubsub->GetValue( EVCxPSNbrConnInstances, nbrOfConnUsers ) );
+ if( okToRoam && nbrOfConnUsers > 1 )
+ {
+
+ // if we have slaves also using connection,
+ // we need to wait for them to request roaming statuses
+ // from their clients also. In this case, the status is being
+ // checked via pubsub EVCxPSRoamingRequestStatus to which master
+ // updates after enought resposes are received
+ MPX_DEBUG1( "CVcxConnUtilImpl::RequestIsRoamingAllowedL master waiting");
+ TRAPD( err, WaitL( EVCxPSRoamingRequestStatus ) );
+ if( err != KErrNone )
+ {
+ MPX_DEBUG2( "CVcxConnUtilImpl::RequestIsRoamingAllowedL master wait leaved %d", err );
+ }
+ MPX_DEBUG1( "CVcxConnUtilImpl::RequestIsRoamingAllowedL master released");
+
+ TInt roamingStatus( EVCxRoamingNotInit );
+ User::LeaveIfError( iPubsub->GetValue( EVCxPSRoamingRequestStatus, roamingStatus ) );
+ if( EVCxRoamingAllowed != roamingStatus )
+ {
+ okToRoam = EFalse;
+ }
+ }
+ }
+ // reset roaming PS value
+ User::LeaveIfError( iPubsub->SetValue( EVCxPSRoamingRequestStatus, EVCxRoamingNotInit ) );
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::RequestIsRoamingAllowedL out");
+ return okToRoam;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::DoRequestClientRoamingL()
+// -----------------------------------------------------------------------------
+//
+TBool CVcxConnUtilImpl::DoRequestClientRoamingL()
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::DoRequestClientRoamingL in" );
+
+ TBool okToRoam( ETrue );
+ TInt err( KErrNone );
+
+ TVCxConnectionStatus oldState = iEngine->ConnectionStatus();
+ iEngine->SetConnectionStatus( EVCxPendingClientRequest );
+ for ( TInt i = 0; i < iObservers.Count() && okToRoam; i++ )
+ {
+ TRAP( err, okToRoam = iObservers[i]->RequestIsRoamingAllowedL() );
+ if( err != KErrNone || !okToRoam )
+ {
+ okToRoam = EFalse;
+ break;
+ }
+ }
+ if( iEngine->ConnectionStatus() != EVCxNotConnected )
+ {
+ // operation path back to connection utility, reset state, in case
+ // client has not diconnected during callback
+ iEngine->SetConnectionStatus( oldState );
+
+ if( okToRoam && err == KErrNone )
+ {
+ // roaming ok for this instance, increase nbr of accepted
+ iPubsub->IncCounterPubSubL( EVCxPSNbRoamAccepted );
+ MPX_DEBUG1( "CVcxConnUtilImpl::DoRequestClientRoamingL accepted increased" );
+ }
+ }
+
+ // increase nbr of responses
+ iPubsub->IncCounterPubSubL( EVCxPSNbrRoamResp );
+
+ MPX_DEBUG2( "CVcxConnUtilImpl::DoRequestClientRoamingL allowed %d out", okToRoam );
+
+ return okToRoam;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::IapChanged()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilImpl::IapChangedL()
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::IapChanged in");
+ if( !iMaster )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::IapChanged not master out");
+ return;
+ }
+ TInt err( KErrNone );
+
+ // current information
+ TUint32 oldIap = iEngine->IapId();
+ TVCxConnectionStatus engineStatus = iEngine->ConnectionStatus();
+
+ // resolve connection information from the network middleware
+ iEngine->ResetConnectionInfo();
+ if( engineStatus != EVCxNotConnected &&
+ engineStatus != EVCxError )
+ {
+ iEngine->FillActiveConnectionDetailsL();
+ }
+
+ // if there is no active connection or gotten iap id is invalid
+ TUint32 iapID = iEngine->IapId();
+ if( iapID == 0 || !( iEngine->IsIapConnected( iapID ) ) )
+ {
+ if( engineStatus != EVCxError )
+ {
+ engineStatus = EVCxNotConnected;
+ }
+ // signal status before disconnect -call to make sure
+ // slaves react in case master's disconnecting fails
+ MPX_DEBUG2( "IapChanged not connected notify %d ", engineStatus );
+ iPubsub->SetValue( EVCxPSConnectionStatus, engineStatus );
+
+ MPX_DEBUG1( "CVcxConnUtilImpl::IapChanged no active iap, diconnect");
+ TRAP( err, DisconnectL() );
+ if( err != KErrNone )
+ {
+ MPX_DEBUG2( "CVcxConnUtilImpl::IapChanged no active iap, diconnect leaves %d", err );
+ }
+ }
+ else
+ {
+ MPX_DEBUG1( "CVcxConnUtilImpl::IapChanged iap connected");
+ engineStatus = EVCxConnected;
+ iEngine->SetConnectionStatus( EVCxConnected );
+ // refresh PS connection state
+ SaveConnectionToPubSubL();
+ }
+
+ // notify clients about iap change
+ if( engineStatus != EVCxError && ( oldIap != iapID || !iapID ) )
+ {
+ MPX_DEBUG1( "CVcxConnUtilImpl::IapChanged notify observers");
+ NotifyObserversIAPChanged();
+ }
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::IapChanged out");
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::WaitL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilImpl::WaitL( TUint32 aWaitId )
+ {
+ iWaitHandler->WaitL( aWaitId );
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::EndWait()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilImpl::EndWait( TUint32 aWaitId )
+ {
+ iWaitHandler->EndWait( aWaitId );
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::IsMaster()
+// -----------------------------------------------------------------------------
+//
+TBool CVcxConnUtilImpl::IsMaster()
+ {
+ return iMaster;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::ValueChangedL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilImpl::ValueChangedL( const TUint32& aKey, const TInt& aValue )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::ValueChangedL (TInt) in");
+ EndWait( aKey );
+ // pubsub key value changed, check and update
+ // functionality as required.
+ switch( aKey )
+ {
+ case EVCxPSMasterExists:
+ {
+ HandleMasterChangeL();
+ break;
+ }
+ case EVCxPSConnectionStatus:
+ {
+ HandleSlaveConnectionStatusL( aValue );
+ break;
+ }
+ case EVCxPSNbrRoamResp:
+ {
+ HandleRoamingReponsesL( aValue );
+ }
+ break;
+ case EVCxPSRoamingRequestStatus:
+ // NOP
+ break;
+ default:
+ User::Leave( KErrNotFound );
+ break;
+ }
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::ValueChangedL (TInt) out");
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::HandleMasterChangeL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilImpl::HandleMasterChangeL()
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::HandleMasterChangeL in");
+ // if this instance is not connected, don't bother
+ // to change. Not connected instance cannot be master
+ if( iMaster )
+ {
+ MPX_DEBUG1( "CVcxConnUtilImpl::HandleMasterChangeL master, out");
+ return;
+ }
+
+ if( iEngine->ConnectionStatus() != EVCxConnected )
+ {
+ MPX_DEBUG1( "CVcxConnUtilImpl::HandleMasterChangeL not connected, out");
+ return;
+ }
+
+ User::LeaveIfError( CheckAndChangeSlaveToMaster() );
+
+ if( iMaster )
+ {
+ // at this point we need to reinit ex-slave's connection to use
+ // destination (snap) instead of IAP for the ex-slave to be able
+ // to get mobility events.
+ // if original connection was via IAP due "always ask", do nothing
+ if( iEngine->DestinationId() )
+ {
+ // this instance has become master, so it needs to init the mobility object
+ if( iEngine->CreateMobility() != KErrNone )
+ {
+ MPX_DEBUG1( "CVcxConnUtilImpl::HandleMasterChangeL master reinit connection not ok");
+ DisconnectL();
+ }
+ else
+ {
+ MPX_DEBUG1( "CVcxConnUtilImpl::HandleMasterChangeL master reinit connection ok");
+ iEngine->FillActiveConnectionDetailsL();
+ SaveConnectionToPubSubL();
+ }
+ }
+ }
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::HandleMasterChangeL out");
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::CheckAndChangeSlaveToMaster()
+// -----------------------------------------------------------------------------
+//
+TInt CVcxConnUtilImpl::CheckAndChangeSlaveToMaster()
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::CheckAndChangeSlaveToMaster in");
+ TInt err( KErrNone );
+ TInt status( 0 );
+
+ ///////
+ // entering critical section
+ iSemaSwitchRole.Wait();
+ err = iPubsub->GetValue( EVCxPSMasterExists, status );
+ // if master already exists, do nothing
+ if( !status && err == KErrNone)
+ {
+ MPX_DEBUG1( "CVcxConnUtilImpl::CheckAndChangeSlaveToMaster changing master");
+ iMaster = ETrue;
+ err = iPubsub->SetValue( EVCxPSMasterExists, iMaster );
+ }
+ iSemaSwitchRole.Signal();
+ // Leaving critical section
+ ///////
+
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::CheckAndChangeSlaveToMaster out");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::HandleSlaveConnectionStatusL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilImpl::HandleSlaveConnectionStatusL( const TInt& aNewStatus )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::HandleSlaveConnectionStatus in");
+ // if master, do nothing
+ if( iMaster )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::HandleSlaveConnectionStatus master out");
+ return;
+ }
+ // resolve given connection, this structure is needed
+ // to prevent errors in type check
+ TVCxConnectionStatus gottenStatus( EVCxNotConnected );
+ switch( aNewStatus )
+ {
+ case EVCxNotConnected:
+ gottenStatus = EVCxNotConnected;
+ break;
+ case EVCxConnecting:
+ gottenStatus = EVCxConnecting;
+ break;
+ case EVCxConnected:
+ gottenStatus = EVCxConnected;
+ break;
+ case EVCxDisconnecting:
+ gottenStatus = EVCxDisconnecting;
+ break;
+ case EVCxRoamingRequest:
+ gottenStatus = EVCxRoamingRequest;
+ break;
+ case EVCxRoamingAccepted:
+ gottenStatus = EVCxRoamingAccepted;
+ break;
+ case EVCxError:
+ gottenStatus = EVCxError;
+ break;
+ default:
+ User::Leave( KErrGeneral );
+ break;
+ }
+ TVCxConnectionStatus currentStatus = iEngine->ConnectionStatus();
+
+ MPX_DEBUG2( "HandleSlaveConnectionStatus gotten %d", gottenStatus );
+ MPX_DEBUG2( "HandleSlaveConnectionStatus current %d", currentStatus );
+
+ if( gottenStatus == EVCxRoamingRequest && currentStatus == EVCxConnected )
+ {
+ // if master is requesting roaming, query all external clients
+ // whether we can roam or not
+ MPX_DEBUG1( "CVcxConnUtilImpl::HandleSlaveConnectionStatus slave check Roaming");
+ if ( DoRequestClientRoamingL() )
+ {
+ gottenStatus = EVCxRoamingAccepted;
+ }
+ // client might have disconnected during roaming. In that case do not change status
+ if( iEngine->ConnectionStatus() != EVCxNotConnected )
+ {
+ // set connection status explicitly to tell slave we're roaming
+ iEngine->SetConnectionStatus( gottenStatus );
+ }
+ }
+
+ else if( ( currentStatus == EVCxRoamingRequest ||
+ currentStatus == EVCxRoamingAccepted ||
+ currentStatus == EVCxConnected ) &&
+ gottenStatus == EVCxConnected )
+ {
+ // if current status was roaming or
+ // master has notified new connection and state
+ // has changed to connected, meaning
+ // master has succesfully reinitialized preferred connection
+ // slave needs to try to reinit connection via new iap if
+ // new iap differs from current
+
+ TInt valueFromPS( 0 );
+ User::LeaveIfError( iPubsub->GetValue( EVCxPSIapId, valueFromPS ) );
+ MPX_DEBUG2( "HandleSlaveConnectionStatus slave iap %d", iEngine->IapId() );
+ MPX_DEBUG2( "HandleSlaveConnectionStatus slave PS iap %d", valueFromPS );
+ if( valueFromPS != iEngine->IapId() )
+ {
+ User::LeaveIfError( iPubsub->GetValue( EVCxPSSnapId, valueFromPS ) );
+ iEngine->Disconnect();
+ if( DoCreateConnection( ETrue, valueFromPS, EFalse ) == KErrNone )
+ {
+ // refresh connection details
+ iEngine->FillActiveConnectionDetailsL();
+ MPX_DEBUG1( "CVcxConnUtilImpl::HandleSlaveConnectionStatus slave restarted ok" );
+ }
+ else
+ {
+ MPX_DEBUG1( "CVcxConnUtilImpl::HandleSlaveConnectionStatus slave restarting not ok" );
+ DisconnectL();
+ gottenStatus = EVCxNotConnected;
+ }
+ NotifyObserversIAPChanged();
+ }
+ iEngine->SetConnectionStatus( gottenStatus );
+ }
+ else
+ {
+ if( gottenStatus == EVCxNotConnected ||
+ gottenStatus == EVCxError )
+ {
+ // master has notified disconnecting or error for some reason
+ DisconnectL();
+ // notify normal disconnect to observers
+ if( gottenStatus == EVCxNotConnected )
+ {
+ NotifyObserversIAPChanged();
+ }
+ }
+ }
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::HandleSlaveConnectionStatus out");
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::ValueChangedL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilImpl::HandleRoamingReponsesL( const TInt& aNbrOfResps )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::HandleRoamingReponsesL in");
+ if( !iMaster )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::HandleRoamingReponsesL slave out");
+ return;
+ }
+ if( iEngine->ConnectionStatus() != EVCxRoamingRequest )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::HandleRoamingReponsesL not roaming");
+ return;
+ }
+ // check if all have been responded and if all agreed on roaming
+ TInt nbrOfConUsers( 0 );
+ TInt nbrOfAgeed( 0 );
+ TInt nbrofResponses( aNbrOfResps );
+
+ User::LeaveIfError( iPubsub->GetValue( EVCxPSNbrConnInstances, nbrOfConUsers ) );
+ User::LeaveIfError( iPubsub->GetValue( EVCxPSNbRoamAccepted, nbrOfAgeed ) );
+
+ if( nbrOfConUsers == nbrofResponses )
+ {
+ if( nbrofResponses == nbrOfAgeed )
+ {
+ // every instance has responded and all agrees roaming,
+ // change state for master's main thread to proceed
+ MPX_DEBUG1( "CVcxConnUtilImpl::HandleRoamingReponsesL EVCxRoamingAllowed");
+
+ User::LeaveIfError( iPubsub->SetValue(
+ EVCxPSRoamingRequestStatus, EVCxRoamingAllowed ) );
+ }
+ else
+ {
+ MPX_DEBUG1( "CVcxConnUtilImpl::HandleRoamingReponsesL EVCxRoamingNotInit");
+ User::LeaveIfError( iPubsub->SetValue(
+ EVCxPSRoamingRequestStatus, EVCxRoamingNotInit ) );
+ }
+ }
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::HandleRoamingReponsesL out");
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::NotifyObserversIAPChanged()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilImpl::NotifyObserversIAPChanged()
+ {
+ for ( TInt i = 0; i < iObservers.Count(); i++ )
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::NotifyObserversIAPChanged notifying observer");
+ TRAPD( err, iObservers[i]->IapChangedL() );
+ if( err != KErrNone )
+ {
+ MPX_DEBUG2( "vcxconnutil ## NotifyObserversIAPChanged::IapChanged observer leaved %d", err);
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::DisplayWaitNote()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilImpl::DisplayWaitNote(const TDesC& aConnectionName)
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::DisplayWaitNote in");
+ if( iUIInterface )
+ {
+ iUIInterface->DisplayWaitNote( aConnectionName );
+ }
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::DisplayWaitNote out");
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilImpl::CloseWaitNote()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilImpl::CloseWaitNote()
+ {
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::CloseWaitNote in");
+ if( iUIInterface )
+ {
+ iUIInterface->CloseWaitNote();
+ }
+ MPX_DEBUG1( "vcxconnutil ## CVcxConnUtilImpl::CloseWaitNote out");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/src/vcxconnutilpubsub.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,391 @@
+/*
+* Copyright (c) 2006 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:
+*
+*/
+
+
+
+
+#include <mpxlog.h>
+
+#include "vcxconnutilcommon.h"
+#include "vcxconnectionutility.hrh"
+#include "vcxconnutilpubsub.h"
+#include "vcxconnutilsubscriber.h"
+#include "vcxconnutilpubsubobserver.h"
+
+// CONSTANTS
+_LIT( KConnUtilCounterSema, "__VcxConnUtillCounterSema__ ");
+const TInt KSemaStartupValue = 1;
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilPubSub::NewL()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilPubSub* CVcxConnUtilPubSub::NewL( MConnUtilPubsubObserver *aObserver )
+ {
+ CVcxConnUtilPubSub* self = CVcxConnUtilPubSub::NewLC( aObserver );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilPubSub::NewLC()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilPubSub* CVcxConnUtilPubSub::NewLC( MConnUtilPubsubObserver *aObserver )
+ {
+ CVcxConnUtilPubSub* self = new (ELeave) CVcxConnUtilPubSub( );
+ CleanupStack::PushL( self );
+ self->ConstructL( aObserver );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilPubSub::CVcxNsConnUtilEngine()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilPubSub::CVcxConnUtilPubSub( )
+ {
+ // NOP
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilPubSub::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilPubSub::ConstructL( MConnUtilPubsubObserver *aObserver )
+ {
+ MPX_DEBUG1("vcxconnutil ## CVcxConnUtilPubSub::ConstructL() in");
+
+ TInt status( KErrNone );
+ // semafore for protecting P&S -counter value writing
+ status = iSemaCounter.CreateGlobal( KConnUtilCounterSema, KSemaStartupValue );
+ if( status == KErrAlreadyExists )
+ {
+ // if semafore exists already, just open handle to existing
+ status = iSemaCounter.OpenGlobal( KConnUtilCounterSema );
+ }
+ User::LeaveIfError( status );
+
+ User::LeaveIfError(
+ iPropertyCurrentIAPId.Attach( KVcxConnUtilPScategory,
+ EVCxPSIapId ) );
+
+ User::LeaveIfError(
+ iPropertyCurrentSNAPId.Attach( KVcxConnUtilPScategory,
+ EVCxPSSnapId ) );
+
+ User::LeaveIfError(
+ iPropertyNbrOfInst.Attach( KVcxConnUtilPScategory,
+ EVCxPSNbrConnInstances ) );
+
+ User::LeaveIfError(
+ iPropertyAccepted.Attach( KVcxConnUtilPScategory,
+ EVCxPSNbRoamAccepted ) );
+
+ iConnectionStatePS =
+ CVcxConnUtilSubscriber::NewL( KVcxConnUtilPScategory,
+ EVCxPSConnectionStatus,
+ RProperty::EInt, aObserver );
+
+ iMasterExistPS =
+ CVcxConnUtilSubscriber::NewL( KVcxConnUtilPScategory,
+ EVCxPSMasterExists,
+ RProperty::EInt, aObserver );
+
+ iRoamingReqStatusPS =
+ CVcxConnUtilSubscriber::NewL( KVcxConnUtilPScategory,
+ EVCxPSRoamingRequestStatus,
+ RProperty::EInt, aObserver );
+
+ iNbrInstanceResp =
+ CVcxConnUtilSubscriber::NewL( KVcxConnUtilPScategory,
+ EVCxPSNbrRoamResp,
+ RProperty::EInt, aObserver );
+
+ if( GetValue( EVCxPSIapId, status ) == KErrNotFound )
+ {
+ MPX_DEBUG1("vcxconnutil ## CVcxConnUtilPubSub::ConstructL() no properties");
+
+ // define properties
+ DefinePropertiesL();
+ }
+
+ MPX_DEBUG1("vcxconnutil ## CVcxConnUtilPubSub::ConstructL() out");
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilPubSub::~CVcxConnUtilPubSub()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilPubSub::~CVcxConnUtilPubSub()
+ {
+ iSemaCounter.Close();
+
+ iPropertyCurrentIAPId.Close();
+ iPropertyCurrentSNAPId.Close();
+ iPropertyNbrOfInst.Close();
+ iPropertyAccepted.Close();
+
+ delete iConnectionStatePS;
+ delete iMasterExistPS;
+ delete iRoamingReqStatusPS;
+ delete iNbrInstanceResp;
+
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilPubSub::DefinePropertiesL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilPubSub::DefinePropertiesL()
+ {
+ MPX_DEBUG1("vcxconnutil ## CVcxConnUtilPubSub::DefinePropertiesL() in");
+ TInt result( KErrNone );
+ RSemaphore semaphore;
+ result = semaphore.CreateGlobal( KVcxConnUtilPSSema, 0 );
+ if( result != KErrNone && result != KErrAlreadyExists )
+ {
+ // kernel cannot create semaphore, or there is no existing
+ User::LeaveIfError( result );
+ }
+ if( result == KErrAlreadyExists )
+ {
+ // semaphore exist. Some other process is already defining PS
+ // open semaphore and wait for it to finish
+ User::LeaveIfError( semaphore.OpenGlobal( KVcxConnUtilPSSema ) );
+ semaphore.Wait();
+ // check if PS keys do exists
+ TInt value( 0 );
+ if( GetValue( EVCxPSIapId, value ) == KErrNotFound )
+ {
+ // other proces has failed to define PS,
+ // this process will try it
+ result = KErrNone;
+ }
+ }
+ if( result == KErrNone )
+ {
+ const TUidType createPSUid( KNullUid, KNullUid, KVcxConnUtilPScategory );
+
+ RProcess createPS;
+ result = createPS.Create( KVcxConnUtilPSWorkerName(), KNullDesC(), createPSUid );
+ if( result == KErrNone )
+ {
+ createPS.Resume();
+ createPS.Close();
+ semaphore.Wait();
+ // init default values for keys, whose default differs from 0
+ SetValue( EVCxPSRoamingRequestStatus, EVCxRoamingNotInit );
+ SetValue( EVCxPSConnectionStatus, EVCxNotConnected );
+ }
+ }
+ // need to signal here for other possible
+ // processes to proceed
+ semaphore.Signal();
+ semaphore.Close();
+ if( result != KErrNone && result != KErrAlreadyExists )
+ {
+ // all other erros cause leave: worker process creation fails, or
+ // kernel refuses to open existing semphore (== platform problem)
+ User::LeaveIfError( result );
+ }
+ MPX_DEBUG1("vcxconnutil ## CVcxConnUtilPubSub::DefinePropertiesL() out");
+ }
+
+
+RProperty* CVcxConnUtilPubSub::GetProperty( TUint32 aKey )
+ {
+ switch( aKey )
+ {
+ case EVCxPSConnectionStatus:
+ return &( iConnectionStatePS->Property() );
+
+ case EVCxPSIapId:
+ return &iPropertyCurrentIAPId;
+
+ case EVCxPSSnapId:
+ return &iPropertyCurrentSNAPId;
+
+ case EVCxPSMasterExists:
+ return &( iMasterExistPS->Property() );
+
+ case EVCxPSNbrConnInstances:
+ return &iPropertyNbrOfInst;
+
+ case EVCxPSRoamingRequestStatus:
+ return &( iRoamingReqStatusPS->Property() );
+
+ case EVCxPSNbrRoamResp:
+ return &( iNbrInstanceResp->Property() );
+
+ case EVCxPSNbRoamAccepted:
+ return &iPropertyAccepted;
+
+ default:
+ break;
+ }
+ return 0;
+ }
+
+CVcxConnUtilSubscriber* CVcxConnUtilPubSub::GetSubscriber( TUint32 aKey )
+ {
+ switch( aKey )
+ {
+ case EVCxPSConnectionStatus:
+ return iConnectionStatePS;
+
+ case EVCxPSMasterExists:
+ return iMasterExistPS;
+
+ case EVCxPSRoamingRequestStatus:
+ return iRoamingReqStatusPS;
+
+ case EVCxPSNbrRoamResp:
+ return iNbrInstanceResp;
+
+ default:
+ break;
+ }
+ return 0;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilPubSub::IncCounterPubSubL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilPubSub::IncCounterPubSubL( TUint32 aKey )
+ {
+ const TInt KIncValue( 1 );
+ DoPSCounterIncrementL( aKey, KIncValue );
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilPubSub::DecNbrOfConnUsersPubSub()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilPubSub::DecCounterPubSubL( TUint32 aKey )
+ {
+ const TInt KDecValue( -1 );
+ DoPSCounterIncrementL( aKey, KDecValue );
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilPubSub::DoPSCounterIncrementL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilPubSub::DoPSCounterIncrementL( TUint32 aKey, TInt aCalcFactor )
+ {
+ if( aKey == EVCxPSNbrConnInstances ||
+ aKey == EVCxPSNbrRoamResp ||
+ aKey == EVCxPSNbRoamAccepted )
+ {
+ RProperty* property = GetProperty( aKey );
+ if( property )
+ {
+ TInt value( 0 );
+ TInt err( KErrNone );
+ // entering critical section
+ iSemaCounter.Wait();
+ err = property->Get( value );
+ if( err == KErrNone )
+ {
+ value += aCalcFactor;
+ err = property->Set( value );
+ }
+ // leaving critical section
+ iSemaCounter.Signal();
+ User::LeaveIfError( err );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilPubSub::SetValue()
+// -----------------------------------------------------------------------------
+//
+TInt CVcxConnUtilPubSub::SetValue( TUint32 aKey, TInt aValue )
+ {
+ TInt err( KErrNone );
+ RProperty* property = GetProperty( aKey );
+ if( property )
+ {
+ err = property->Set( aValue );
+ }
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilPubSub::GetValue()
+// -----------------------------------------------------------------------------
+//
+TInt CVcxConnUtilPubSub::GetValue( TUint32 aKey, TInt& aValue )
+ {
+ TInt err( KErrNone );
+ RProperty* property = GetProperty( aKey );
+ if( property )
+ {
+ err = property->Get( aValue );
+ }
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilPubSub::CancelValueSubscribers()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilPubSub::StartSubscibers( TUint32 aKey )
+ {
+ if( !aKey )
+ {
+ iConnectionStatePS->Start();
+ iMasterExistPS->Start();
+ iRoamingReqStatusPS->Start();
+ iNbrInstanceResp->Start();
+ }
+ else
+ {
+ CVcxConnUtilSubscriber* subscriber = GetSubscriber( aKey );
+ if( subscriber )
+ {
+ subscriber->Start();
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilPubSub::CancelValueSubscribers()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilPubSub::CancelValueSubscribers( TUint32 aKey )
+ {
+ if( !aKey )
+ {
+ iConnectionStatePS->Cancel();
+ iMasterExistPS->Cancel();
+ iRoamingReqStatusPS->Cancel();
+ iNbrInstanceResp->Cancel();
+ }
+ else
+ {
+ CVcxConnUtilSubscriber* subscriber = GetSubscriber( aKey );
+ if( subscriber )
+ {
+ subscriber->Cancel();
+ }
+ }
+ }
+// end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/src/vcxconnutilsubscriber.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,143 @@
+/*
+* Copyright (c) 2006 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: Class to handle subscribtions from PS*
+*/
+
+
+
+#include "vcxconnutilsubscriber.h"
+#include "vcxconnutilpubsubobserver.h"
+
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilSubscriber::CVcxConnUtilSubscriber()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilSubscriber::CVcxConnUtilSubscriber( const TUid aUid,
+ const TUint32 aKey,
+ RProperty::TType aType,
+ MConnUtilPubsubObserver* aObserver ) :
+ CActive( EPriorityStandard ),
+ iUid( aUid ),
+ iKey( aKey ),
+ iKeyType(aType),
+ iObserver( aObserver )
+ {
+ // NOP
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilSubscriber::NewL()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilSubscriber* CVcxConnUtilSubscriber::NewL( const TUid aUid,
+ const TUint32 aKey,
+ RProperty::TType aType,
+ MConnUtilPubsubObserver* aObserver )
+ {
+ CVcxConnUtilSubscriber* self =
+ new( ELeave ) CVcxConnUtilSubscriber( aUid, aKey, aType, aObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilSubscriber::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilSubscriber::ConstructL()
+ {
+ iInitialized = EFalse;
+ User::LeaveIfError( iProperty.Attach( iUid, iKey ) );
+ CActiveScheduler::Add( this );
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilSubscriber::~CVcxConnUtilSubscriber()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilSubscriber::~CVcxConnUtilSubscriber()
+ {
+ if( IsActive() )
+ {
+ Cancel();
+ }
+ iProperty.Close();
+
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilSubscriber::Property()
+// -----------------------------------------------------------------------------
+//
+RProperty& CVcxConnUtilSubscriber::Property()
+ {
+ return iProperty;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilSubscriber::Start()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilSubscriber::Start()
+ {
+ if( !IsActive() )
+ {
+ iProperty.Subscribe( iStatus );
+ SetActive();
+ iInitialized = ETrue;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilSubscriber::DoCancel()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilSubscriber::DoCancel()
+ {
+ if( IsActive() )
+ {
+ iProperty.Cancel();
+ }
+ iInitialized = EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilSubscriber::RunL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilSubscriber::RunL()
+ {
+ // resubscribe before processing new
+ // value to prevent missing updates
+ iProperty.Subscribe( iStatus );
+ SetActive();
+
+ if( iInitialized )
+ {
+ if(iKeyType == RProperty::EInt )
+ {
+ TInt intValue;
+ // int type changed
+ if( iProperty.Get( intValue ) == KErrNone && iObserver )
+ {
+ TRAP_IGNORE( iObserver->ValueChangedL( iKey, intValue ) );
+ }
+ }
+ }
+ iInitialized = ETrue;
+ }
+// end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutility/src/vcxconnutilwaitsch.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,225 @@
+/*
+* Copyright (c) 2006 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: CCVcxConnUtilWaitSch class definition file*
+*/
+
+
+
+
+
+#include "vcxconnutilwaitsch.h"
+
+
+ /**
+ * CVcxConnUtilWait is used to wrap CActiveScheduler objects to be used
+ * as "wait-type" context within videoconnutility.
+ * Each CVcxConnUtilWait object has a wait type -id for whose
+ * object maintans an array of CActiveScheduler objects' wait state.
+ */
+NONSHARABLE_CLASS( CVcxConnUtilWait ) : public CBase
+ {
+ public:
+
+ /**
+ * Destructor.
+ */
+ ~CVcxConnUtilWait()
+ {
+ iWaitArray.ResetAndDestroy();
+ };
+
+ /**
+ * Default constructor
+ */
+ CVcxConnUtilWait( ) {};
+
+ /**
+ * Wait type id
+ */
+ TUint32 iType;
+
+ /**
+ * Flag to indicate wether CActiveScheduler maintained
+ * by this object can really be released. In case flag is
+ * false, CActiveScheduler -objects need to be put to wait
+ * again right after their release.
+ */
+ TBool iCanStop;
+
+ /**
+ * Array containing CActiveScheduler maintained
+ * by this object
+ */
+ RPointerArray < CActiveSchedulerWait > iWaitArray;
+ };
+
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilWaitSch::CVcxConnUtilWaitSch()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilWaitSch::CVcxConnUtilWaitSch()
+ {
+ // No implementation required
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilWaitSch::~CVcxConnUtilWaitSch()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilWaitSch::~CVcxConnUtilWaitSch()
+ {
+ iWaits.ResetAndDestroy();
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilWaitSch::NewLC()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilWaitSch* CVcxConnUtilWaitSch::NewLC()
+ {
+ CVcxConnUtilWaitSch* self = new (ELeave)CVcxConnUtilWaitSch();
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilWaitSch::NewL()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilWaitSch* CVcxConnUtilWaitSch::NewL()
+ {
+ CVcxConnUtilWaitSch* self = CVcxConnUtilWaitSch::NewLC();
+ CleanupStack::Pop( self ); // self;
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilWaitSch::WaitL()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilWaitSch::WaitL( TUint32 aWaitId )
+ {
+ CVcxConnUtilWait* wait = GetWaitL( aWaitId );
+ CActiveSchedulerWait* activeWait = GetActiveSWaitL( wait );
+
+ while( !wait->iCanStop )
+ {
+ activeWait->Start();
+ }
+
+ TInt index = wait->iWaitArray.FindL( activeWait );
+ if( index != KErrNotFound )
+ {
+ wait->iWaitArray.Remove( index );
+ }
+ delete activeWait;
+
+ if( !wait->iWaitArray.Count() )
+ {
+ index = iWaits.FindL( wait );
+ if( index != KErrNotFound )
+ {
+ iWaits.Remove( index );
+ }
+ delete wait;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilWaitSch::EndWait()
+// -----------------------------------------------------------------------------
+//
+void CVcxConnUtilWaitSch::EndWait( TUint32 aWaitId )
+ {
+ TInt waitCount( 0 );
+ TInt asWaitCount( 0 );
+
+ waitCount = iWaits.Count();
+
+ for( TInt i( 0 ); i < waitCount; ++i )
+ {
+ iWaits[ i ]->iCanStop = ( aWaitId == iWaits[ i ]->iType );
+
+ asWaitCount = iWaits[ i ]->iWaitArray.Count();
+
+ for( TInt j( 0 ); j < asWaitCount; ++j )
+ {
+ if( iWaits[ i ]->iWaitArray[ j ]->IsStarted() )
+ {
+ iWaits[ i ]->iWaitArray[ j ]->AsyncStop();
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilWaitSch::GetWaitL()
+// -----------------------------------------------------------------------------
+//
+CVcxConnUtilWait* CVcxConnUtilWaitSch::GetWaitL( TUint32 aID )
+ {
+ CVcxConnUtilWait* wait( 0 );
+ TInt count( 0 );
+ count = iWaits.Count();
+
+ for( TInt i( 0 ); i < count; ++i )
+ {
+ if( iWaits[ i ]->iType == aID )
+ {
+ wait = iWaits[ i ];
+ break;
+ }
+ }
+ if( !wait )
+ {
+ wait = new (ELeave) CVcxConnUtilWait();
+ CleanupStack::PushL( wait );
+ wait->iType = aID;
+ iWaits.AppendL( wait );
+ CleanupStack::Pop( wait );
+ }
+ return wait;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxConnUtilWaitSch::GetActiveSWaitL()
+// -----------------------------------------------------------------------------
+//
+CActiveSchedulerWait* CVcxConnUtilWaitSch::GetActiveSWaitL( CVcxConnUtilWait* aWait )
+ {
+ CActiveSchedulerWait* item( 0 );
+ if( aWait )
+ {
+ TInt count( aWait->iWaitArray.Count() );
+ for( TInt i( 0 ); i < count; i++ )
+ {
+ if( !( aWait->iWaitArray[i]->IsStarted() ) )
+ {
+ item = aWait->iWaitArray[i];
+ break;
+ }
+ }
+ }
+ if( !item )
+ {
+ item = new ( ELeave) CActiveSchedulerWait;
+ CleanupStack::PushL( item );
+ aWait->iWaitArray.AppendL( item );
+ CleanupStack::Pop( item );
+ }
+ return item;
+ }
+// End of file
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutilpsworker/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,28 @@
+/*
+* Copyright (c) 2004-2006 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+../rom/videoconnutilpsworker.iby CORE_MW_LAYER_IBY_EXPORT_PATH(videoconnutilpsworker.iby)
+
+PRJ_MMPFILES
+vcxconnutilpsworker.mmp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutilpsworker/group/vcxconnutilpsworker.mmp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2004-2006 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: This is a project specification file for PS worker fo connectionutility*
+*/
+
+
+
+#include <platform_paths.hrh>
+#include <data_caging_paths.hrh>
+
+TARGET vcxconnutilpsworker.exe
+TARGETTYPE exe
+UID 0 0x2001B2AB
+
+USERINCLUDE ../../inc
+
+MW_LAYER_SYSTEMINCLUDE
+
+SOURCEPATH ../src
+
+SOURCE vcxconnutilpsworker.cpp
+
+LIBRARY euser.lib
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutilpsworker/rom/videoconnutilpsworker.iby Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+
+#ifndef __VIDEOCONNUTILPSWORKER_IBY__
+#define __VIDEOCONNUTILPSWORKER_IBY__
+
+#include <data_caging_paths_for_iby.hrh>
+
+file=ABI_DIR\BUILD_DIR\vcxconnutilpsworker.exe PROGRAMS_DIR\vcxconnutilpsworker.exe
+
+#endif // __VIDEOCONNUTILPSWORKER_IBY__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/connutilpsworker/src/vcxconnutilpsworker.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2006 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: executable for defining PS keys used by the connectionutility*
+*/
+
+
+
+
+#include <e32base.h>
+#include <e32std.h>
+#include <e32property.h>
+
+#include "vcxconnutilcommon.h"
+#include "vcxconnectionutility.hrh"
+
+
+// ---------------------------------------------------------------------------
+// E32Main()
+// Provides the globale entry point function for the platform to start process
+// ---------------------------------------------------------------------------
+//
+GLDEF_C TInt E32Main()
+ {
+ // Create cleanup stack
+ __UHEAP_MARK;
+
+ // define properties
+ RProperty::Define( KVcxConnUtilPScategory, EVCxPSConnectionStatus, RProperty::EInt );
+
+ RProperty::Define( KVcxConnUtilPScategory, EVCxPSIapId, RProperty::EInt );
+
+ RProperty::Define( KVcxConnUtilPScategory, EVCxPSSnapId, RProperty::EInt );
+
+ RProperty::Define( KVcxConnUtilPScategory, EVCxPSMasterExists, RProperty::EInt );
+
+ RProperty::Define( KVcxConnUtilPScategory, EVCxPSNbrConnInstances, RProperty::EInt );
+
+ RProperty::Define( KVcxConnUtilPScategory, EVCxPSRoamingRequestStatus, RProperty::EInt );
+
+ RProperty::Define( KVcxConnUtilPScategory, EVCxPSNbRoamAccepted, RProperty::EInt );
+
+ RProperty::Define( KVcxConnUtilPScategory, EVCxPSNbrRoamResp, RProperty::EInt );
+
+ RSemaphore semaphore;
+ if( semaphore.OpenGlobal( KVcxConnUtilPSSema ) == KErrNone )
+ {
+ // Semaphore opened ok, so someone really needing PS keys exists.
+ // signal it to notify PS keys are defined
+ semaphore.Signal();
+ semaphore.Close();
+ }
+ __UHEAP_MARKEND;
+ return KErrNone;
+ }
+// end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,34 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+#include "../connutilpsworker/group/bld.inf"
+#include "../connutility/group/bld.inf"
+
+PRJ_PLATFORMS
+
+WINSCW ARMV5
+
+PRJ_EXPORTS
+
+PRJ_MMPFILES
+
+PRJ_TESTMMPFILES
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/inc/vcxconnectionutility.hrh Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,119 @@
+/*
+* Copyright (c) 2006 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: vcxconnectionutility definitions and enums*
+*/
+
+
+
+#ifndef __VCX_CONNECTIOUTILITY_HRH__
+#define __VCX_CONNECTIOUTILITY_HRH__
+
+/**
+ * P&S key id enums:
+ *
+ * EVCxPSConnectionStatus - Master saves current connection status here. Possible values are:
+ * - EVCxNotConnected: there is no active connection in the connectionutility scope
+ * - EVCxConnected: connection exists and is active
+ * - EVCxRoamingRequest: connectiontuility is in roaming mode
+ *
+ * EVCxPSIapId - Current active iap id
+ *
+ * EVCxPSSnapId - Current active Destination id
+ *
+ * EVCxPSMasterExists - This value is used to notify slaves wether master exists or not.
+ * When active master disconnects it changes this value to 0. Slaves notify
+ * this and first slave which gets the notifications changes itself to be new master
+ *
+ * EVCxPSNbrConnInstances- Number of processes that use connectionutility and have active connection.
+ *
+ * EVCxPSRoamingRequestStatus - Value is used internally by the master when it waits slaves to request
+ * roaming state.
+ * Possible values are:
+ * - EVCxRoamingNotInit: when master has requested roaming from it's own clients it sets this value.
+ * Same value is resetted if roaming is not allowed
+ * - EVCxRoamingAllowed: When master's and all slaves' clients have been accepted roaming this value is
+ * setted to notify that roaming is allowed
+ *
+ * EVCxPSNbrRoamResp - Number of responses received from different connectionutility processes.
+ *
+ * EVCxPSNbRoamAccepted - Number of accepted responses from the roaming request from different
+ * connectionutility processes.
+ */
+enum TVCxPSConUtilKeyId
+ {
+ EVCxPSConnectionStatus = 0x00000001, // TVCxConnectionStatus
+ EVCxPSIapId, // TInt
+ EVCxPSSnapId, // TInt
+ EVCxPSMasterExists, // TInt
+ EVCxPSNbrConnInstances, // TInt
+ EVCxPSRoamingRequestStatus, // TVCxPSConUtilRoamingRequest
+ EVCxPSNbrRoamResp, // TInt
+ EVCxPSNbRoamAccepted // TInt
+ };
+
+/**
+ * enums for roaming state to be used in
+ * EVCxPSRoamingRequestStatus when EVCxPSConnectionStatus
+ * is EVCxRoamingRequest
+ */
+enum TVCxPSConUtilRoamingRequest
+ {
+ EVCxRoamingNotInit = 50,
+ EVCxRoamingAllowed
+ };
+
+/**
+ * connection utility's connection state enums
+ * EVCxNotConnected
+ * current instance is not connected to network and does not maintain any active connection.
+ *
+ * EVCxConnecting
+ * current instance is waiting for networkingmiddleware to initialize connection
+ *
+ * EVCxConnected
+ * current instance is connected and it maintains active connection
+ *
+ * EVCxDisconnecting
+ * current instance is disconnecting
+ *
+ * EVCxRoamingRequest
+ * current master instance is requesting it's client's about roaming.
+ * If instance is slave, this state notifies that slave does not accept roaming.
+ *
+ * EVCxPendingClientRequest
+ * Operation path is in the client side during roaming.
+ *
+ * EVCxRoamingAccepted
+ * Slave: current instance's client's are all accepted roaming.
+ * Master: every local client and all slaves have been accepted roaming.
+ *
+ * EVCxError
+ * unresolved error received from the networking middleware. In this case clients are notified by the IapChanged in which
+ * case client can try to resolve connection by recalling GetIap, or disconnecting connection
+ *
+ */
+enum TVCxConnectionStatus
+ {
+ EVCxNotConnected = 10,
+ EVCxConnecting,
+ EVCxConnected,
+ EVCxDisconnecting,
+ EVCxRoamingRequest,
+ EVCxPendingClientRequest,
+ EVCxRoamingAccepted,
+ EVCxError
+ };
+
+#endif // __VCX_CONNECTIOUTILITY_HRH__
+// end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoconnutility/inc/vcxconnutilcommon.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2006 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: containd common constants used in the scope of vcxconnectionutility*
+*/
+
+
+
+
+#ifndef __VCX_CONNUTILCOMMON_H
+#define __VCX_CONNUTILCOMMON_H
+
+/**
+ * use UID of the PS worker as a category of the
+ * PS keys used by connectionutility
+ */
+const TUid KVcxConnUtilPScategory = { 0x2001B2AB };
+
+/**
+ * name of the "PS -worker" executable
+ */
+_LIT( KVcxConnUtilPSWorkerName, "vcxconnutilpsworker" );
+
+/**
+ * name of the semaphore used by the PS worker to signal
+ * PS keys are ready
+ */
+_LIT( KVcxConnUtilPSSema, "__vcxxonnutilsemaphore__" );
+
+#endif // __VCX_CONNUTILCOMMON_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerClient/BWINS/CseSchedulerClientU.DEF Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,38 @@
+EXPORTS
+ ??0CCseScheduledProgram@@IAE@XZ @ 1 NONAME ; CCseScheduledProgram::CCseScheduledProgram(void)
+ ??1CCseScheduledProgram@@UAE@XZ @ 2 NONAME ; CCseScheduledProgram::~CCseScheduledProgram(void)
+ ??1CCseSchedulerApi@@UAE@XZ @ 3 NONAME ; CCseSchedulerApi::~CCseSchedulerApi(void)
+ ?AddSchedule@CCseSchedulerApi@@QBEHAAVCCseScheduledProgram@@@Z @ 4 NONAME ; int CCseSchedulerApi::AddSchedule(class CCseScheduledProgram &) const
+ ?AppUid@CCseScheduledProgram@@QBEJXZ @ 5 NONAME ; long CCseScheduledProgram::AppUid(void) const
+ ?ApplicationData@CCseScheduledProgram@@QAE?AVTPtrC8@@XZ @ 6 NONAME ; class TPtrC8 CCseScheduledProgram::ApplicationData(void)
+ ?DbIdentifier@CCseScheduledProgram@@QBEKXZ @ 7 NONAME ; unsigned long CCseScheduledProgram::DbIdentifier(void) const
+ ?DebugDump@CCseScheduledProgram@@QBEXXZ @ 8 NONAME ; void CCseScheduledProgram::DebugDump(void) const
+ ?EndTime@CCseScheduledProgram@@QAEAAVTTime@@XZ @ 9 NONAME ; class TTime & CCseScheduledProgram::EndTime(void)
+ ?ExternalizeL@CCseScheduledProgram@@QAEXAAVRWriteStream@@@Z @ 10 NONAME ; void CCseScheduledProgram::ExternalizeL(class RWriteStream &)
+ ?ExternalizeLength@CCseScheduledProgram@@QAEHXZ @ 11 NONAME ; int CCseScheduledProgram::ExternalizeLength(void)
+ ?GetOverlappingSchedules@CCseSchedulerApi@@QAEHAAVCCseScheduledProgram@@AAV?$RPointerArray@VCCseScheduledProgram@@@@@Z @ 12 NONAME ; int CCseSchedulerApi::GetOverlappingSchedules(class CCseScheduledProgram &, class RPointerArray<class CCseScheduledProgram> &)
+ ?GetSchedule@CCseSchedulerApi@@QBEHKPAVCCseScheduledProgram@@@Z @ 13 NONAME ; int CCseSchedulerApi::GetSchedule(unsigned long, class CCseScheduledProgram *) const
+ ?GetSchedulesByAppUid@CCseSchedulerApi@@QBEHJAAV?$RPointerArray@VCCseScheduledProgram@@@@@Z @ 14 NONAME ; int CCseSchedulerApi::GetSchedulesByAppUid(long, class RPointerArray<class CCseScheduledProgram> &) const
+ ?GetSchedulesByPluginUid@CCseSchedulerApi@@QBEHJAAV?$RPointerArray@VCCseScheduledProgram@@@@@Z @ 15 NONAME ; int CCseSchedulerApi::GetSchedulesByPluginUid(long, class RPointerArray<class CCseScheduledProgram> &) const
+ ?GetSchedulesByTime@CCseSchedulerApi@@QBEHABVTTime@@0AAV?$RPointerArray@VCCseScheduledProgram@@@@@Z @ 16 NONAME ; int CCseSchedulerApi::GetSchedulesByTime(class TTime const &, class TTime const &, class RPointerArray<class CCseScheduledProgram> &) const
+ ?GetSchedulesByType@CCseSchedulerApi@@QBEHJAAV?$RPointerArray@VCCseScheduledProgram@@@@@Z @ 17 NONAME ; int CCseSchedulerApi::GetSchedulesByType(long, class RPointerArray<class CCseScheduledProgram> &) const
+ ?InternalizeL@CCseScheduledProgram@@QAEXAAVRReadStream@@@Z @ 18 NONAME ; void CCseScheduledProgram::InternalizeL(class RReadStream &)
+ ?Name@CCseScheduledProgram@@QBE?AVTPtrC8@@XZ @ 19 NONAME ; class TPtrC8 CCseScheduledProgram::Name(void) const
+ ?NewL@CCseScheduledProgram@@SAPAV1@AAV1@@Z @ 20 NONAME ; class CCseScheduledProgram * CCseScheduledProgram::NewL(class CCseScheduledProgram &)
+ ?NewL@CCseScheduledProgram@@SAPAV1@XZ @ 21 NONAME ; class CCseScheduledProgram * CCseScheduledProgram::NewL(void)
+ ?NewL@CCseSchedulerApi@@SAPAV1@XZ @ 22 NONAME ; class CCseSchedulerApi * CCseSchedulerApi::NewL(void)
+ ?PluginType@CCseScheduledProgram@@QBEJXZ @ 23 NONAME ; long CCseScheduledProgram::PluginType(void) const
+ ?PluginUid@CCseScheduledProgram@@QBEJXZ @ 24 NONAME ; long CCseScheduledProgram::PluginUid(void) const
+ ?RemoveSchedule@CCseSchedulerApi@@QBEHK@Z @ 25 NONAME ; int CCseSchedulerApi::RemoveSchedule(unsigned long) const
+ ?ScheduleType@CCseScheduledProgram@@QBEJXZ @ 26 NONAME ; long CCseScheduledProgram::ScheduleType(void) const
+ ?SetAppUid@CCseScheduledProgram@@QAEXJ@Z @ 27 NONAME ; void CCseScheduledProgram::SetAppUid(long)
+ ?SetApplicationDataL@CCseScheduledProgram@@QAEXABVTDesC8@@@Z @ 28 NONAME ; void CCseScheduledProgram::SetApplicationDataL(class TDesC8 const &)
+ ?SetDbIdentifier@CCseScheduledProgram@@QAEXK@Z @ 29 NONAME ; void CCseScheduledProgram::SetDbIdentifier(unsigned long)
+ ?SetEndTime@CCseScheduledProgram@@QAEXABVTTime@@@Z @ 30 NONAME ; void CCseScheduledProgram::SetEndTime(class TTime const &)
+ ?SetName@CCseScheduledProgram@@QAEXABVTDesC8@@@Z @ 31 NONAME ; void CCseScheduledProgram::SetName(class TDesC8 const &)
+ ?SetPluginType@CCseScheduledProgram@@QAEXJ@Z @ 32 NONAME ; void CCseScheduledProgram::SetPluginType(long)
+ ?SetPluginUid@CCseScheduledProgram@@QAEXJ@Z @ 33 NONAME ; void CCseScheduledProgram::SetPluginUid(long)
+ ?SetScheduleType@CCseScheduledProgram@@QAEXJ@Z @ 34 NONAME ; void CCseScheduledProgram::SetScheduleType(long)
+ ?SetStartTime@CCseScheduledProgram@@QAEXABVTTime@@@Z @ 35 NONAME ; void CCseScheduledProgram::SetStartTime(class TTime const &)
+ ?StartTime@CCseScheduledProgram@@QAEAAVTTime@@XZ @ 36 NONAME ; class TTime & CCseScheduledProgram::StartTime(void)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerClient/EABI/CseSchedulerClientU.DEF Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,53 @@
+EXPORTS
+ _ZN16CCseSchedulerApi23GetOverlappingSchedulesER20CCseScheduledProgramR13RPointerArrayIS0_E @ 1 NONAME
+ _ZN16CCseSchedulerApi4NewLEv @ 2 NONAME
+ _ZN16CCseSchedulerApiD0Ev @ 3 NONAME
+ _ZN16CCseSchedulerApiD1Ev @ 4 NONAME
+ _ZN16CCseSchedulerApiD2Ev @ 5 NONAME
+ _ZN20CCseScheduledProgram10SetEndTimeERK5TTime @ 6 NONAME
+ _ZN20CCseScheduledProgram12ExternalizeLER12RWriteStream @ 7 NONAME
+ _ZN20CCseScheduledProgram12InternalizeLER11RReadStream @ 8 NONAME
+ _ZN20CCseScheduledProgram12SetPluginUidEl @ 9 NONAME
+ _ZN20CCseScheduledProgram12SetStartTimeERK5TTime @ 10 NONAME
+ _ZN20CCseScheduledProgram13SetPluginTypeEl @ 11 NONAME
+ _ZN20CCseScheduledProgram15ApplicationDataEv @ 12 NONAME
+ _ZN20CCseScheduledProgram15SetDbIdentifierEm @ 13 NONAME
+ _ZN20CCseScheduledProgram15SetScheduleTypeEl @ 14 NONAME
+ _ZN20CCseScheduledProgram17ExternalizeLengthEv @ 15 NONAME
+ _ZN20CCseScheduledProgram19SetApplicationDataLERK6TDesC8 @ 16 NONAME
+ _ZN20CCseScheduledProgram4NewLERS_ @ 17 NONAME
+ _ZN20CCseScheduledProgram4NewLEv @ 18 NONAME
+ _ZN20CCseScheduledProgram7EndTimeEv @ 19 NONAME
+ _ZN20CCseScheduledProgram7SetNameERK6TDesC8 @ 20 NONAME
+ _ZN20CCseScheduledProgram9SetAppUidEl @ 21 NONAME
+ _ZN20CCseScheduledProgram9StartTimeEv @ 22 NONAME
+ _ZN20CCseScheduledProgramC1Ev @ 23 NONAME
+ _ZN20CCseScheduledProgramC2Ev @ 24 NONAME
+ _ZN20CCseScheduledProgramD0Ev @ 25 NONAME
+ _ZN20CCseScheduledProgramD1Ev @ 26 NONAME
+ _ZN20CCseScheduledProgramD2Ev @ 27 NONAME
+ _ZNK16CCseSchedulerApi11AddScheduleER20CCseScheduledProgram @ 28 NONAME
+ _ZNK16CCseSchedulerApi11GetScheduleEmP20CCseScheduledProgram @ 29 NONAME
+ _ZNK16CCseSchedulerApi14RemoveScheduleEm @ 30 NONAME
+ _ZNK16CCseSchedulerApi18GetSchedulesByTimeERK5TTimeS2_R13RPointerArrayI20CCseScheduledProgramE @ 31 NONAME
+ _ZNK16CCseSchedulerApi18GetSchedulesByTypeElR13RPointerArrayI20CCseScheduledProgramE @ 32 NONAME
+ _ZNK16CCseSchedulerApi20GetSchedulesByAppUidElR13RPointerArrayI20CCseScheduledProgramE @ 33 NONAME
+ _ZNK16CCseSchedulerApi23GetSchedulesByPluginUidElR13RPointerArrayI20CCseScheduledProgramE @ 34 NONAME
+ _ZNK20CCseScheduledProgram10PluginTypeEv @ 35 NONAME
+ _ZNK20CCseScheduledProgram12DbIdentifierEv @ 36 NONAME
+ _ZNK20CCseScheduledProgram12ScheduleTypeEv @ 37 NONAME
+ _ZNK20CCseScheduledProgram4NameEv @ 38 NONAME
+ _ZNK20CCseScheduledProgram6AppUidEv @ 39 NONAME
+ _ZNK20CCseScheduledProgram9DebugDumpEv @ 40 NONAME
+ _ZNK20CCseScheduledProgram9PluginUidEv @ 41 NONAME
+ _ZTI16CCseSchedulerApi @ 42 NONAME ; #<TI>#
+ _ZTI19RCseSchedulerClient @ 43 NONAME ; #<TI>#
+ _ZTI20CCseScheduledProgram @ 44 NONAME ; #<TI>#
+ _ZTI20RCseSchedulerService @ 45 NONAME ; #<TI>#
+ _ZTI24RCseSchedulerServiceBase @ 46 NONAME ; #<TI>#
+ _ZTV16CCseSchedulerApi @ 47 NONAME ; #<VT>#
+ _ZTV19RCseSchedulerClient @ 48 NONAME ; #<VT>#
+ _ZTV20CCseScheduledProgram @ 49 NONAME ; #<VT>#
+ _ZTV20RCseSchedulerService @ 50 NONAME ; #<VT>#
+ _ZTV24RCseSchedulerServiceBase @ 51 NONAME ; #<VT>#
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerClient/group/CseSchedulerClient.mmp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,55 @@
+/*
+* Copyright (c) 2006 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: This is a project specification file for Common Scheduling Engine / client*
+*/
+
+
+
+
+#include <platform_paths.hrh>
+#include <bldvariant.hrh>
+
+//OPTION ARMCC --asm --interleave
+ALWAYS_BUILD_AS_ARM
+
+TARGET CseSchedulerClient.dll
+TARGETTYPE dll
+UID 0x1000008d 0x10281F1F
+
+CAPABILITY CAP_ECOM_PLUGIN DRM
+
+// ECom Dll recognition UID followed by the unique UID for this dll
+
+SOURCEPATH ../src
+SOURCE CCseSchedulerAPI.cpp
+SOURCE RCseSchedulerClient.cpp
+SOURCE RCseSchedulerService.cpp
+SOURCE RCseSchedulerServiceBase.cpp
+SOURCE CCseScheduledProgram.cpp
+
+
+USERINCLUDE ../inc
+USERINCLUDE ../../inc
+
+MW_LAYER_SYSTEMINCLUDE
+
+SOURCEPATH ../data
+
+LIBRARY euser.lib
+LIBRARY efsrv.lib
+LIBRARY bafl.lib
+LIBRARY flogger.lib
+LIBRARY estor.lib
+
+LANGUAGE_IDS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerClient/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2004-2005 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+PRJ_EXPORTS
+../rom/videoschedulerclient.iby CORE_MW_LAYER_IBY_EXPORT_PATH(videoschedulerclient.iby)
+PRJ_MMPFILES
+CseSchedulerClient.mmp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerClient/rom/videoschedulerclient.iby Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+
+#ifndef __VIDEOSCHEDULERCLIENT_IBY__
+#define __VIDEOSCHEDULERCLIENT_IBY__
+
+#include <data_caging_paths_for_iby.hrh>
+
+file=ABI_DIR\BUILD_DIR\CseSchedulerClient.dll SHARED_LIB_DIR\CseSchedulerClient.dll
+
+#endif // __VIDEOSCHEDULERCLIENT_IBY__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerClient/src/CCseScheduledProgram.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,552 @@
+/*
+* Copyright (c) 2006 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: This class contains data for scheduled programs.*
+*/
+
+
+
+
+// INCLUDES
+#include <ipvideo/CCseScheduledProgram.h> // Header file for this class
+#include "CseDebug.h" // Debug macros
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// LOCAL CONSTANTS AND MACROS
+// None
+
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// ---------------------------------------------------------------------------
+// CCseScheduledProgram::CCseScheduledProgram()
+//
+// ---------------------------------------------------------------------------
+EXPORT_C CCseScheduledProgram::CCseScheduledProgram() :
+ iStartTime( 0 ),
+ iEndTime( 0 ),
+ iAppUid( 0 ),
+ iPluginUid( 0 ),
+ iDbIdentifier( 0 ),
+ iScheduleType ( ECseOther ),
+ iPluginType( ECseUniPlugin )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::CCseScheduledProgram");
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduledProgram::CCseScheduledProgram");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduledProgram::NewL()
+//
+// ---------------------------------------------------------------------------
+EXPORT_C CCseScheduledProgram* CCseScheduledProgram::NewL( CCseScheduledProgram& aProg)
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::NewL");
+
+ CCseScheduledProgram* self = new ( ELeave ) CCseScheduledProgram();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ self->SetName( aProg.Name() );
+ self->SetStartTime( aProg.StartTime() );
+ self->SetEndTime( aProg.EndTime() );
+ self->SetAppUid( aProg.AppUid() );
+ self->SetPluginUid( aProg.PluginUid() );
+ self->SetDbIdentifier( aProg.DbIdentifier() );
+ self->SetApplicationDataL( aProg.ApplicationData() );
+ self->SetScheduleType( aProg.ScheduleType() );
+ self->SetPluginType( aProg.PluginType() );
+ CleanupStack::Pop( self );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduledProgram::NewL");
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CCseScheduledProgram::NewL()
+//
+// ---------------------------------------------------------------------------
+EXPORT_C CCseScheduledProgram* CCseScheduledProgram::NewL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::NewL");
+
+ CCseScheduledProgram* self = new ( ELeave ) CCseScheduledProgram();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduledProgram::NewL");
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduledProgram::ConstructL()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduledProgram::ConstructL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::ConstructL");
+ iAppData = HBufC8::NewL( 0 );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduledProgram::ConstructL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduledProgram::~CCseScheduledProgram()
+//
+// ---------------------------------------------------------------------------
+EXPORT_C CCseScheduledProgram::~CCseScheduledProgram()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::~CCseScheduledProgram");
+ delete iAppData;
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduledProgram::~CCseScheduledProgram");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduledProgram::SetScheduleType()
+//
+// ---------------------------------------------------------------------------
+EXPORT_C void CCseScheduledProgram::SetScheduleType( const TInt32 aScheduleType )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::SetScheduleType");
+ iScheduleType = aScheduleType;
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduledProgram::SetScheduleType");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduledProgram::SetApplicationDataL()
+//
+// ---------------------------------------------------------------------------
+EXPORT_C void CCseScheduledProgram::SetApplicationDataL( const TDesC8& aAppData )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::SetApplicationData");
+ delete iAppData;
+ iAppData = NULL;
+ iAppData = aAppData.AllocL();
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduledProgram::SetApplicationData");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduledProgram::ApplicationData()
+//
+// ---------------------------------------------------------------------------
+EXPORT_C TPtrC8 CCseScheduledProgram::ApplicationData()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::ApplicationData");
+ return *iAppData;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseScheduledProgram::InternalizeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CCseScheduledProgram::InternalizeL( RReadStream& aStream )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::InternalizeL");
+ TUint32 lower( 0 );
+ TUint32 upper( 0 );
+ TInt32 buffLen( 0 );
+
+ // Name
+ buffLen = aStream.ReadInt32L();
+ aStream.ReadL( iName, buffLen );
+
+ // Start time
+ lower = aStream.ReadUint32L();
+ upper = aStream.ReadUint32L();
+ TInt64 time( 0 );
+ time = (TInt64) lower;
+ TInt64 longUpper = (TInt64) upper;
+ longUpper = longUpper << 32;
+ longUpper &= (0xFFFFFFFF00000000ULL);
+ time |= longUpper;
+ iStartTime = time;
+
+ // End time
+ lower = aStream.ReadUint32L();
+ upper = aStream.ReadUint32L();
+ time = (TInt64) lower;
+ longUpper = (TInt64) upper;
+ longUpper = longUpper << 32;
+ longUpper &= (0xFFFFFFFF00000000ULL);
+ time |= longUpper;
+ iEndTime = time;
+
+ // Application UID
+ iAppUid = aStream.ReadInt32L();
+
+ // Notifier plug-in UID
+ iPluginUid = aStream.ReadInt32L();
+
+ // Db identifier
+ iDbIdentifier = aStream.ReadUint32L();
+
+ // Schedule type
+ iScheduleType = aStream.ReadInt32L();
+
+ // Plugin type
+ iPluginType = aStream.ReadInt32L();
+
+ // Application data length
+ buffLen = aStream.ReadInt32L();
+
+ // Application data
+ delete iAppData;
+ iAppData = NULL;
+ iAppData = HBufC8::NewL( buffLen );
+ TPtr8 ptr( iAppData->Des() );
+ aStream.ReadL( ptr, buffLen );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduledProgram::InternalizeL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseScheduledProgram::ExternalizeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CCseScheduledProgram::ExternalizeL(RWriteStream& aStream)
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::ExternalizeL");
+ TInt64 temp( 0 );
+ TUint32 lower( 0 );
+ TUint32 upper( 0 );
+ TInt32 buffLen( 0 );
+
+ // Name
+ buffLen = iName.Length();
+ aStream.WriteInt32L( buffLen );
+ aStream.WriteL( iName );
+ // Start time
+ temp = iStartTime.Int64();
+ lower = (0x00000000FFFFFFFFULL) & temp;
+ upper = (0x00000000FFFFFFFFULL) & (temp >> 32);
+ aStream.WriteUint32L( lower );
+ aStream.WriteUint32L( upper );
+
+ // End time
+ temp = iEndTime.Int64();
+ lower = (0x00000000FFFFFFFFULL) & temp;
+ upper = (0x00000000FFFFFFFFULL) & (temp >> 32);
+ aStream.WriteUint32L( lower );
+ aStream.WriteUint32L( upper );
+
+ // Application UID
+ aStream.WriteInt32L( iAppUid );
+
+ // Notifier plug-in UID
+ aStream.WriteInt32L( iPluginUid );
+
+ // DbIdentifier
+ aStream.WriteUint32L( iDbIdentifier );
+
+ // Schedule type
+ aStream.WriteInt32L( iScheduleType );
+
+ // Schedule type
+ aStream.WriteInt32L( iPluginType );
+
+ // Application data length
+ buffLen = iAppData->Length();
+ aStream.WriteInt32L( buffLen );
+
+ // Application data
+ aStream.WriteL( *iAppData );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduledProgram::ExternalizeL");
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCseScheduledProgram::ExternalizeLength
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCseScheduledProgram::ExternalizeLength( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::ExternalizeLength");
+ TInt retValue( 0 );
+ retValue = sizeof( iStartTime )
+ +sizeof( iEndTime )
+ +sizeof( iAppUid )
+ +sizeof( iPluginUid )
+ +sizeof( iDbIdentifier )
+ +sizeof( iScheduleType )
+ +sizeof( iPluginType )
+ +sizeof( TInt32 ) // Application data length
+ +sizeof( TInt32 ) // Name length
+ +iName.Size( ) // Name
+ +iAppData->Size( ); // Application data size
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduledProgram::ExternalizeLength");
+ return retValue;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseScheduledProgram::SetPluginType
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CCseScheduledProgram::SetPluginType( TInt32 aPluginType )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::SetPluginType");
+ iPluginType = aPluginType;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseScheduledProgram::SetName
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CCseScheduledProgram::SetName( const TDesC8& aName )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::SetName");
+ iName = aName;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseScheduledProgram::SetDbIdentifier
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CCseScheduledProgram::SetDbIdentifier( const TUint32 aDbIdentifier )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::SetDbIdentifier");
+ iDbIdentifier = aDbIdentifier;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseScheduledProgram::SetStartTime
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CCseScheduledProgram::SetStartTime( const TTime& aStartTime )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::SetStartTime");
+ iStartTime = aStartTime;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseScheduledProgram::SetEndTime
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CCseScheduledProgram::SetEndTime( const TTime& aEndTime )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::SetEndTime");
+ iEndTime = aEndTime;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseScheduledProgram::SetAppUid
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CCseScheduledProgram::SetAppUid( const TInt32 aAppUid )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::SetAppUid");
+ iAppUid = aAppUid;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseScheduledProgram::SetPluginUid
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CCseScheduledProgram::SetPluginUid( const TInt32 aPluginUid )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::SetPluginUid");
+ iPluginUid = aPluginUid;
+ }
+
+
+// Getters for the instance data
+// -----------------------------------------------------------------------------
+// CCseScheduledProgram::GetPluginType
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt32 CCseScheduledProgram::PluginType() const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::PluginType");
+ return iPluginType;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseScheduledProgram::Name
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TPtrC8 CCseScheduledProgram::Name() const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::Name");
+ return iName;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseScheduledProgram::DbIdentifier
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TUint32 CCseScheduledProgram::DbIdentifier() const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::DbIdentifier");
+ return iDbIdentifier;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseScheduledProgram::StartTime
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TTime& CCseScheduledProgram::StartTime()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::SetDbIdentifier");
+ return iStartTime;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseScheduledProgram::EndTime
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TTime& CCseScheduledProgram::EndTime()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::EndTime");
+ return iEndTime;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCseScheduledProgram::ScheduleType
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt32 CCseScheduledProgram::ScheduleType() const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::ScheduleType");
+ return iScheduleType;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseScheduledProgram::AppUid
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt32 CCseScheduledProgram::AppUid() const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::Appuid");
+ return iAppUid;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseScheduledProgram::PluginUid
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt32 CCseScheduledProgram::PluginUid() const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::PluginUid");
+ return iPluginUid;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCseScheduledProgram::DebugDump
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CCseScheduledProgram::DebugDump() const
+ {
+#ifdef _DEBUG
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduledProgram::DebugDump");
+
+ // Write schedule name
+ // Change 8-bit buffer to 16-bit.
+ HBufC* writeBuff = NULL;
+ TRAPD( err, writeBuff = HBufC::NewL( iName.Length() ) );
+ if(err == KErrNone)
+ {
+ TPtr writePtr = writeBuff->Des();
+ writePtr.Copy( iName );
+ CSELOGSTRING2_HIGH_LEVEL("Schedule name: %S", writeBuff);
+ }
+ else
+ {
+ CSELOGSTRING2_HIGH_LEVEL("Schedule name: %S", &iName);
+ }
+
+ // Start time
+ TBuf<100> startTimeBuf;
+ _LIT( KDateTimeFormat,"%1%*D/%2%*M/%3%*Y %H:%T:%S" );
+ TRAP( err, iStartTime.FormatL( startTimeBuf, KDateTimeFormat ) );
+ if ( KErrNone == err )
+ {
+ CSELOGSTRING2_HIGH_LEVEL("Schedule start time: %S", &startTimeBuf);
+ }
+
+ // End time
+ TBuf<100> endTimeBuf;
+ TRAP( err, iEndTime.FormatL( endTimeBuf, KDateTimeFormat ) );
+ if ( KErrNone == err )
+ {
+ CSELOGSTRING2_HIGH_LEVEL("Schedule end time: %S", &endTimeBuf);
+ }
+
+ // Application UID
+ CSELOGSTRING2_HIGH_LEVEL("Schedule application uid: 0x%x", (unsigned)iAppUid);
+
+ // Plugin UID
+ CSELOGSTRING2_HIGH_LEVEL("Schedule plugin uid: 0x%x", (unsigned)iPluginUid);
+
+ // Application data
+ // Write only length of data
+ CSELOGSTRING2_HIGH_LEVEL("Schedule application data length: %d", iAppData->Length() );
+
+ // DB identifier
+ CSELOGSTRING2_HIGH_LEVEL("Schedule DB identifier: %x", iDbIdentifier);
+
+ // Schedule type
+ switch(iScheduleType)
+ {
+ case ECseReminder:
+ CSELOGSTRING_HIGH_LEVEL("Schedule type: ECseReminder");
+ break;
+
+ case ECseRecording:
+ CSELOGSTRING_HIGH_LEVEL("Schedule type: ECseRecording");
+ break;
+
+ case ECseProgramGuideUpdate:
+ CSELOGSTRING_HIGH_LEVEL("Schedule type: ECseProgramGuideUpdate");
+ break;
+
+ case ECseScheduleDownload:
+ CSELOGSTRING_HIGH_LEVEL("Schedule type: ECseScheduleDownload");
+ break;
+
+ case ECseOther:
+ CSELOGSTRING_HIGH_LEVEL("Schedule type: ECseOther");
+ break;
+
+ default:
+ break;
+ }
+ delete writeBuff;
+ writeBuff = NULL;
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduledProgram::DebugDump");
+#endif
+ }
+
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerClient/src/CCseSchedulerAPI.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,224 @@
+/*
+* Copyright (c) 2006 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: Implementation of Scheduler server's client api*
+*/
+
+
+
+// INCLUDE FILES
+#include <ipvideo/CCseSchedulerAPI.h> // Header file for this class
+#include <ipvideo/CCseScheduledProgram.h> // Represent one schedule in database
+#include <ipvideo/CseSchedulerClientServerCommon.h> // Common defines for client and server
+#include <ipvideo/RCseSchedulerClient.h> // Client common methods (server start up etc)
+#include "CseDebug.h" // Debug macros
+#include <s32mem.h>
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// LOCAL CONSTANTS AND MACROS
+// None
+
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// ============================ MEMBER FUNCTIONS ===============================
+// FUNCTION PROTOTYPES
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerApi::CCseSchedulerApi
+//
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerApi::CCseSchedulerApi()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerApi::CCseSchedulerApi");
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerApi::CCseSchedulerApi");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerApi::NewL
+// Static two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCseSchedulerApi* CCseSchedulerApi::NewL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerApi::NewL");
+ CCseSchedulerApi* self = new ( ELeave ) CCseSchedulerApi();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerApi::NewL");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerApi::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerApi::ConstructL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerApi::ConstructL");
+ User::LeaveIfError( iClient.Connect() );
+ User::LeaveIfError( iService.Open( iClient ) );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerApi::ConstructL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerApi::~CCseSchedulerApi
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCseSchedulerApi::~CCseSchedulerApi()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerApi::~CCseSchedulerApi");
+ iService.Close();
+ iClient.Close();
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerApi::~CCseSchedulerApi");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerApi::AddSchedule
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCseSchedulerApi::AddSchedule( CCseScheduledProgram& aData ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerApi::AddSchedule");
+ TRAPD( err, iService.AddScheduleL( aData ) );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerApi::AddSchedule");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerApi::RemoveSchedule
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCseSchedulerApi::RemoveSchedule( const TUint32 aDbIdentifier ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerApi::RemoveSchedule");
+ TRAPD( err, iService.RemoveScheduleL( aDbIdentifier ) );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerApi::RemoveSchedule");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerApi::GetSchedule
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCseSchedulerApi::GetSchedule( const TUint32 aDbIdentifier,
+ CCseScheduledProgram* aProg ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerApi::GetSchedule");
+ TRAPD( err, iService.GetScheduleL( aDbIdentifier, aProg ) );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerApi::GetSchedule");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerApi::GetSchedulesByAppUid
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCseSchedulerApi::GetSchedulesByAppUid( const TInt32 aAppUid,
+ RPointerArray<CCseScheduledProgram>& aArray ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerApi::GetSchedulesByAppUid");
+ TRAPD( err, iService.GetSchedulesL( aAppUid, aArray ) );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerApi::GetSchedulesByAppUid");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerApi::GetSchedulesByPluginUid
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCseSchedulerApi::GetSchedulesByPluginUid( const TInt32 aPluginUid,
+ RPointerArray<CCseScheduledProgram>& aArray ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerApi::GetSchedulesByPluginUid");
+ TRAPD( err, iService.GetSchedulesByPluginUidL( aPluginUid, aArray ) );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerApi::GetSchedulesByPluginUid");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerApi::GetSchedulesByScheduleType
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCseSchedulerApi::GetSchedulesByType( const TInt32 aType,
+ RPointerArray<CCseScheduledProgram>& aArray ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerApi::GetSchedulesByType");
+ TRAPD( err, iService.GetSchedulesByTypeL( aType, aArray ) );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerApi::GetSchedulesByType");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerApi::GetSchedulesByTime
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCseSchedulerApi::GetSchedulesByTime( const TTime& aBeginning,
+ const TTime& aEnd,
+ RPointerArray<CCseScheduledProgram>& aArray ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerApi::GetSchedulesByTime");
+ TRAPD( err, iService.GetSchedulesByTimeL( aBeginning, aEnd, aArray ) );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerApi::GetSchedulesByTime");
+ return err;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerApi::GetOverlappingSchedule
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCseSchedulerApi::GetOverlappingSchedules( CCseScheduledProgram& aProgram,
+ RPointerArray<CCseScheduledProgram>& aResultArray )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerApi::GetOverlappingSchedules");
+ TRAPD( err, iService.GetOverlappingSchedulesL( aProgram, aResultArray ) );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerApi::GetOverlappingSchedules");
+ return err;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerClient/src/RCseSchedulerClient.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,200 @@
+/*
+* Copyright (c) 2006 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: Implementation of CseScheduler client's Server*
+*/
+
+
+
+// INCLUDE FILES
+#include <ipvideo/RCseSchedulerClient.h> // Header for this class
+#include "CseDebug.h" // Debug macros
+#include <ipvideo/CseSchedulerClientServerCommon.h> // Common defines for client and server
+#include <e32math.h>
+#include <f32file.h>
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None
+
+// CONSTANTS
+const TUint KSchedulingDefaultMessageSlots( 4 );
+const TUint KSchedulingNumberOfServerStartupAttempts( 2 );
+
+// MACROS
+// None
+
+// LOCAL CONSTANTS AND MACROS
+// None
+
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+// LOCAL FUNCTION PROTOTYPES
+static TInt StartServer();
+static TInt CreateServerProcess();
+
+// FORWARD DECLARATIONS
+// None
+
+// ============================= LOCAL FUNCTIONS ===============================
+// -----------------------------------------------------------------------------
+// StartServer
+// Returns: Error code
+// -----------------------------------------------------------------------------
+//
+static TInt StartServer()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerClient::StartServer");
+ TFindServer findServer( KCseSchedulerServerName );
+ TFullName name;
+
+ // Server already running?
+ if ( !findServer.Next( name ) )
+ {
+ return KErrNone;
+ }
+
+ TInt result( CreateServerProcess() );
+
+ CSELOGSTRING2_HIGH_LEVEL("<<<RCseSchedulerClient::StartServer: %d", result);
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CreateServerProcess
+//
+// -----------------------------------------------------------------------------
+//
+static TInt CreateServerProcess()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerClient::CreateServerProcess");
+ RProcess server;
+ TInt result( server.Create( KCseSchedulerServerFileName , _L( "" ) ) );
+
+ if ( result )
+ {
+ return result;
+ }
+
+ // Makes the server eligible for execution.
+ TRequestStatus reqStatus;
+ server.Rendezvous(reqStatus);
+
+ server.Resume();
+
+ User::WaitForRequest(reqStatus);
+
+ if( reqStatus.Int() != KErrNone )
+ {
+ server.Close();
+ }
+
+ CSELOGSTRING2_HIGH_LEVEL("<<<RCseSchedulerClient::CreateServerProcess: %d", reqStatus.Int());
+ return reqStatus.Int();
+ }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerClient::RCseSchedulerClient
+//
+// -----------------------------------------------------------------------------
+//
+RCseSchedulerClient::RCseSchedulerClient() : RSessionBase()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerClient::RCseSchedulerClient");
+ // None
+ CSELOGSTRING_HIGH_LEVEL("<<<RCseSchedulerClient::RCseSchedulerClient");
+ }
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerClient::~RCseSchedulerClient
+//
+// -----------------------------------------------------------------------------
+//
+RCseSchedulerClient::~RCseSchedulerClient()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerClient::~RCseSchedulerClient");
+ CSELOGSTRING_HIGH_LEVEL("<<<RCseSchedulerClient::~RCseSchedulerClient");
+ }
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerClient::Connect
+//
+// -----------------------------------------------------------------------------
+//
+TInt RCseSchedulerClient::Connect()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerClient::Connect");
+ TInt ret( KErrNotFound );
+ TInt retry( KSchedulingNumberOfServerStartupAttempts );
+ do
+ {
+ // Start
+ ret = StartServer();
+ if ( ret!=KErrNone && ret!=KErrAlreadyExists )
+ {
+ return ret;
+ }
+
+ // Subsession
+ ret = CreateSession( KCseSchedulerServerName, Version(), KSchedulingDefaultMessageSlots );
+ if ( ret != KErrNotFound && ret != KErrServerTerminated )
+ {
+ return ret;
+ }
+
+ retry--;
+ }
+ while( retry >= 0 );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<RCseSchedulerClient::Connect");
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerClient::Close
+//
+// -----------------------------------------------------------------------------
+//
+void RCseSchedulerClient::Close()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerClient::Close");
+
+ TIpcArgs args( TIpcArgs::ENothing );
+ SendReceive( ECseServCloseSession, args );
+
+ RHandleBase::Close();
+
+ CSELOGSTRING_HIGH_LEVEL("<<<RCseSchedulerClient::Connect");
+ }
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerClient::Version
+//
+// -----------------------------------------------------------------------------
+//
+TVersion RCseSchedulerClient::Version( void ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerClient::Version");
+
+ return( TVersion( KCseServMajorVersionNumber,
+ KCseServMinorVersionNumber,
+ KCseServBuildVersionNumber ) );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerClient/src/RCseSchedulerService.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,659 @@
+/*
+* Copyright (c) 2006 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: Implementation of Scheduler engine client's Service*
+*/
+
+
+
+
+
+// INCLUDE FILES
+#include <ipvideo/RCseSchedulerService.h> // Header fo this class
+#include <ipvideo/CCseScheduledProgram.h> // Represent one schedule in database
+#include "CseDebug.h" // Debug macros
+#include <ipvideo/CseSchedulerClientServerCommon.h> // Client common methods (server start up etc)
+#include <s32mem.h>
+
+// EXTERNAL DATA STRUCTURES
+// None.
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None.
+
+// CONSTANTS
+// None.
+
+// MACROS
+// None.
+
+// LOCAL CONSTANTS AND MACROS
+// None.
+
+// MODULE DATA STRUCTURES
+// None.
+
+// LOCAL FUNCTION PROTOTYPES
+// None.
+
+// FORWARD DECLARATIONS
+// None.
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerService::RCseSchedulerService
+//
+// -----------------------------------------------------------------------------
+//
+RCseSchedulerService::RCseSchedulerService() : RCseSchedulerServiceBase()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerService::RCseSchedulerService");
+ // None
+ CSELOGSTRING_HIGH_LEVEL("<<<RCseSchedulerService::RCseSchedulerService");
+ }
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerService::~RCseSchedulerService
+//
+// -----------------------------------------------------------------------------
+//
+RCseSchedulerService::~RCseSchedulerService()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerService::~RCseSchedulerService");
+ CSELOGSTRING_HIGH_LEVEL("<<<RCseSchedulerService::~RCseSchedulerService");
+ }
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerService::AddScheduleL
+//
+// -----------------------------------------------------------------------------
+//
+void RCseSchedulerService::AddScheduleL( CCseScheduledProgram& aData ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerService::AddScheduleL");
+ if ( !SubSessionHandle() )
+ {
+ User::Leave( ECseNoSubsessionHandle );
+ }
+ // First we to "externalize" (put CCseScheduledProgram-class content to array)
+ // information from given scheduled program.
+ HBufC8* msg = HBufC8::NewLC( aData.ExternalizeLength() );
+ HBufC8* id = HBufC8::NewLC( 4 );
+ TPtr8 ptr( msg->Des() );
+ TPtr8 idPtr( id->Des() );
+
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( ptr );
+ aData.ExternalizeL( writeStream );
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ TIpcArgs args( &ptr, &idPtr );
+
+ // Send array to server side.
+ User::LeaveIfError( SendReceive( ECseAddSchedule, args ) );
+
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( idPtr );
+ aData.SetDbIdentifier( readStream.ReadUint32L() );
+ CleanupStack::PopAndDestroy( &readStream );
+
+ CleanupStack::PopAndDestroy( id );
+ CleanupStack::PopAndDestroy( msg );
+ CSELOGSTRING_HIGH_LEVEL("<<<RCseSchedulerService::AddScheduleL");
+ }
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerService::RemoveScheduleL
+//
+// -----------------------------------------------------------------------------
+//
+void RCseSchedulerService::RemoveScheduleL( const TUint32 aDbIdentifier ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerService::RemoveScheduleL");
+ if ( !SubSessionHandle() )
+ {
+ User::Leave( ECseNoSubsessionHandle );
+ }
+
+ // Put integer value to stream
+ HBufC8* msg = HBufC8::NewL( 4 );
+ CleanupStack::PushL( msg );
+ TPtr8 ptr( msg->Des() );
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( ptr );
+ writeStream.WriteUint32L( aDbIdentifier );
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ TIpcArgs args( &ptr );
+
+ // Send stream to server side
+ User::LeaveIfError( SendReceive( ECseRemoveSchedule, args ) );
+ CleanupStack::PopAndDestroy( msg );
+ CSELOGSTRING_HIGH_LEVEL("<<<RCseSchedulerService::RemoveScheduleL");
+ }
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerService::GetScheduleL
+//
+// -----------------------------------------------------------------------------
+//
+void RCseSchedulerService::GetScheduleL( const TUint32 aDbIdentifier,
+ CCseScheduledProgram* aProg ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerService::GetScheduleL");
+ if ( !SubSessionHandle() )
+ {
+ User::Leave( ECseNoSubsessionHandle );
+ }
+ if ( !aProg )
+ {
+ User::Leave( KErrArgument );
+ }
+ // Buffer for DbIdentifier
+ HBufC8* msgDbId = HBufC8::NewLC( 4 );
+ TPtr8 dbIdPtr( msgDbId->Des() );
+
+ // Buffer for incoming message length
+ HBufC8* lengthBuff = HBufC8::NewLC( 4 );
+ TPtr8 lengthPtr( lengthBuff->Des() );
+ TInt length( 0 );
+
+ // Initialize DbIdentifier
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( dbIdPtr );
+ writeStream.WriteUint32L( aDbIdentifier );
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ // Set args for IPC
+ TIpcArgs args( &dbIdPtr, &lengthPtr );
+
+ // Ask for message length
+ User::LeaveIfError( SendReceive( ECseGetScheduleLength, args ) );
+
+ // Read length from the message
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( lengthPtr );
+ length = readStream.ReadInt32L();
+ CleanupStack::PopAndDestroy( &readStream );
+
+ // Now ask for the scheduled program information
+ HBufC8* programBuffer = HBufC8::NewLC( length );
+ TPtr8 programPtr( programBuffer->Des() );
+
+ TIpcArgs progArgs( &dbIdPtr, &programPtr );
+ User::LeaveIfError( SendReceive( ECseGetSchedule, progArgs ) );
+
+ // Internalize (change stream to CCseScheduledProgram-class) stream that we got.
+ RDesReadStream readStr;
+ CleanupClosePushL( readStr );
+ readStr.Open( programPtr );
+ aProg->InternalizeL( readStr );
+ CleanupStack::PopAndDestroy( &readStr );
+
+ CleanupStack::PopAndDestroy( programBuffer );
+ CleanupStack::PopAndDestroy( lengthBuff );
+ CleanupStack::PopAndDestroy( msgDbId );
+ CSELOGSTRING_HIGH_LEVEL("<<<RCseSchedulerService::GetSchduleL");
+ }
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerService::GetSchedulesL
+//
+// -----------------------------------------------------------------------------
+//
+void RCseSchedulerService::GetSchedulesL( const TInt32 aAppUid,
+ RPointerArray<CCseScheduledProgram>& aArray ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerService::GetSchdulesL");
+ if ( !SubSessionHandle() )
+ {
+ User::Leave( ECseNoSubsessionHandle );
+ }
+
+ // Buffer for app UID
+ HBufC8* msgAppUid = HBufC8::NewLC( 4 );
+ TPtr8 appUidPtr( msgAppUid->Des() );
+
+ // Buffer for incoming message length
+ HBufC8* lengthBuff = HBufC8::NewLC( 4 );
+ TPtr8 lengthPtr( lengthBuff->Des() );
+ TInt length( 0 );
+
+ // Write App Uid
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( appUidPtr );
+ writeStream.WriteInt32L( aAppUid );
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ // Set args for IPC
+ TIpcArgs args( &appUidPtr, &lengthPtr );
+
+ // Ask for message length
+ User::LeaveIfError( SendReceive( ECseGetScheduleArrayLengthByAppUid, args ) );
+
+ // Read length from the message
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( lengthPtr );
+ length = readStream.ReadInt32L();
+ CleanupStack::PopAndDestroy( &readStream );
+
+ // Now ask for the scheduled program information
+ HBufC8* programBuffer = HBufC8::NewLC( length );
+ TPtr8 programPtr( programBuffer->Des() );
+
+ TIpcArgs progArgs( &appUidPtr, &programPtr );
+ User::LeaveIfError( SendReceive( ECseGetSchedulesByAppUid, progArgs ) );
+
+ RDesReadStream readStr;
+ CleanupClosePushL( readStr );
+ readStr.Open( programPtr );
+
+ // read number of items in stream
+ TInt itemCount ( 0 );
+ itemCount = readStr.ReadInt32L();
+
+ // read all items from stream to array
+ for ( TInt i = 0; i < itemCount; i++ )
+ {
+ // Internalize (change stream to CCseScheduledProgram-class) stream that we got.
+ CCseScheduledProgram* prog = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( prog );
+ prog->InternalizeL( readStr );
+ aArray.AppendL( prog );
+ CleanupStack::Pop( prog );
+ }
+
+ readStr.Close();
+
+ CleanupStack::PopAndDestroy( &readStr );
+ CleanupStack::PopAndDestroy( programBuffer );
+ CleanupStack::PopAndDestroy( lengthBuff );
+ CleanupStack::PopAndDestroy( msgAppUid );
+ CSELOGSTRING_HIGH_LEVEL("<<<RCseSchedulerService::GetSchdulesL");
+ }
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerService::GetOverlappingScheduleL
+//
+// -----------------------------------------------------------------------------
+//
+void RCseSchedulerService::GetOverlappingSchedulesL(
+ CCseScheduledProgram& aProgram,
+ RPointerArray<CCseScheduledProgram>& aResultArray )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerService::GetOverlappingSchedulesL");
+ if ( !SubSessionHandle() )
+ {
+ User::Leave( ECseNoSubsessionHandle );
+ }
+
+ // Buffer for schedule data
+ HBufC8* schedData = HBufC8::NewLC( sizeof( TInt32 ) + // type
+ sizeof( TInt64 ) + // start time
+ sizeof( TInt64 ) ); // end time
+ TPtr8 schedDataPtr( schedData->Des() );
+
+ // Buffer for incoming message length
+ HBufC8* lengthBuf = HBufC8::NewLC( sizeof( TInt32 ) );
+ TPtr8 lengthBufPtr( lengthBuf->Des() );
+ TUint32 length( 0 );
+
+ // Schedule type
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( schedDataPtr );
+ writeStream.WriteInt32L( aProgram.ScheduleType() );
+
+ // Start time
+ TInt64 temp( 0 );
+ TUint32 lower( 0 );
+ TUint32 upper( 0 );
+
+ // Change TTime to stream format.
+ temp = aProgram.StartTime().Int64();
+ lower = (0x00000000FFFFFFFFULL) & temp;
+ upper = (0x00000000FFFFFFFFULL) & (temp >> 32);
+ writeStream.WriteUint32L( lower );
+ writeStream.WriteUint32L( upper );
+
+ // End time
+ temp = aProgram.EndTime().Int64();
+ lower = (0x00000000FFFFFFFFULL) & temp;
+ upper = (0x00000000FFFFFFFFULL) & (temp >> 32);
+ writeStream.WriteUint32L( lower );
+ writeStream.WriteUint32L( upper );
+
+ writeStream.CommitL();
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ // Set args for IPC
+ TIpcArgs args( &schedDataPtr, &lengthBufPtr );
+
+ // Ask for db id
+ User::LeaveIfError( SendReceive( ECseGetOverlappingSchedulesLength, args ) );
+
+ // Read length
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( lengthBufPtr );
+ length = readStream.ReadUint32L();
+ CleanupStack::PopAndDestroy( &readStream );
+
+ if ( length > 0 )
+ {
+ HBufC8* schedulesBuf = HBufC8::NewLC( length +
+ sizeof( TInt32 ) ); // item count as TInt32
+ TPtr8 schedulesPtr( schedulesBuf->Des() );
+
+ TIpcArgs schedArgs( &schedDataPtr, &schedulesPtr );
+
+ User::LeaveIfError( SendReceive( ECseGetOverlappingSchedules, schedArgs ) );
+
+ RDesReadStream readStr;
+ CleanupClosePushL( readStr );
+ readStr.Open( schedulesPtr );
+ // read item count
+ TInt32 count( readStr.ReadInt32L() );
+
+ // read all items from stream to array
+ for ( TInt i = 0; i < count; i++ )
+ {
+ // Internalize (change stream to CCseScheduledProgram-class) stream that we got.
+ CCseScheduledProgram* prog = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( prog );
+ prog->InternalizeL( readStr );
+ aResultArray.AppendL( prog );
+ CleanupStack::Pop( prog );
+ }
+
+ readStr.Close();
+ CleanupStack::PopAndDestroy( &readStr );
+ CleanupStack::PopAndDestroy( schedulesBuf );
+ }
+
+ CleanupStack::PopAndDestroy( lengthBuf );
+ CleanupStack::PopAndDestroy( schedData );
+ CSELOGSTRING_HIGH_LEVEL("<<<RCseSchedulerService::GetOverlappingSchedulesL");
+ }
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerService::GetSchedulesByPluginUidL
+//
+// -----------------------------------------------------------------------------
+//
+void RCseSchedulerService::GetSchedulesByPluginUidL( const TInt32 aPluginUid,
+ RPointerArray<CCseScheduledProgram>& aArray ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerService::GetSchedulesByPluginUidL");
+ if ( !SubSessionHandle() )
+ {
+ User::Leave( ECseNoSubsessionHandle );
+ }
+
+ // Buffer for app UID
+ HBufC8* msgPluginUid = HBufC8::NewLC( 4 );
+ TPtr8 pluginUidPtr( msgPluginUid->Des() );
+
+ // Buffer for incoming message length
+ HBufC8* lengthBuff = HBufC8::NewLC( 4 );
+ TPtr8 lengthPtr( lengthBuff->Des() );
+ TInt length( 0 );
+
+ // Write App Uid
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( pluginUidPtr );
+ writeStream.WriteInt32L( aPluginUid );
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ // Set args for IPC
+ TIpcArgs args( &pluginUidPtr, &lengthPtr );
+
+ // Ask for message length
+ User::LeaveIfError( SendReceive( ECseGetScheduleArrayLengthByPluginUid, args ) );
+
+ // Read length from the message
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( lengthPtr );
+ length = readStream.ReadInt32L();
+ CleanupStack::PopAndDestroy( &readStream );
+
+ // Now ask for the scheduled program information
+ HBufC8* programBuffer = HBufC8::NewLC( length );
+ TPtr8 programPtr( programBuffer->Des() );
+
+ TIpcArgs progArgs( &pluginUidPtr, &programPtr );
+ User::LeaveIfError( SendReceive( ECseGetSchedulesByPluginUid, progArgs ) );
+
+ RDesReadStream readStr;
+ CleanupClosePushL( readStr );
+ readStr.Open( programPtr );
+
+ // read number of items in stream
+ TInt itemCount ( 0 );
+ itemCount = readStr.ReadInt32L();
+
+ // read all items from stream to array
+ for ( TInt i = 0; i < itemCount; i++ )
+ {
+ // Internalize (change stream to CCseScheduledProgram-class) stream that we got.
+ CCseScheduledProgram* prog = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( prog );
+ prog->InternalizeL( readStr );
+ aArray.AppendL( prog );
+ CleanupStack::Pop( prog );
+ }
+
+ readStr.Close();
+
+ CleanupStack::PopAndDestroy( &readStr );
+ CleanupStack::PopAndDestroy( programBuffer );
+ CleanupStack::PopAndDestroy( lengthBuff );
+ CleanupStack::PopAndDestroy( msgPluginUid );
+ CSELOGSTRING_HIGH_LEVEL("<<<RCseSchedulerService::GetSchedulesByPluginUidL");
+ }
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerService::GetSchedulesByTypeL
+//
+// -----------------------------------------------------------------------------
+//
+void RCseSchedulerService::GetSchedulesByTypeL( const TInt32 aType,
+ RPointerArray<CCseScheduledProgram>& aArray ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerService::GetSchedulesByTypeL");
+ if ( !SubSessionHandle() )
+ {
+ User::Leave( ECseNoSubsessionHandle );
+ }
+
+ // Buffer for app UID
+ HBufC8* msgScheduleType = HBufC8::NewLC( 4 );
+ TPtr8 typePtr( msgScheduleType->Des() );
+
+ // Buffer for incoming message length
+ HBufC8* lengthBuff = HBufC8::NewLC( 4 );
+ TPtr8 lengthPtr( lengthBuff->Des() );
+ TInt length( 0 );
+
+ // Write App Uid
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( typePtr );
+ writeStream.WriteInt32L( aType );
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ // Set args for IPC
+ TIpcArgs args( &typePtr, &lengthPtr );
+
+ // Ask for message length
+ User::LeaveIfError( SendReceive( ECseGetScheduleArrayLengthByType, args ) );
+
+ // Read length from the message
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( lengthPtr );
+ length = readStream.ReadInt32L();
+ CleanupStack::PopAndDestroy( &readStream );
+
+ // Now ask for the scheduled program information
+ HBufC8* programBuffer = HBufC8::NewLC( length );
+ TPtr8 programPtr( programBuffer->Des() );
+
+ TIpcArgs progArgs( &typePtr, &programPtr );
+ User::LeaveIfError( SendReceive( ECseGetSchedulesByType, progArgs ) );
+
+ RDesReadStream readStr;
+ CleanupClosePushL( readStr );
+ readStr.Open( programPtr );
+
+ // read number of items in stream
+ TInt itemCount ( 0 );
+ itemCount = readStr.ReadInt32L();
+
+ // read all items from stream to array
+ for ( TInt i = 0; i < itemCount; i++ )
+ {
+ // Internalize (change stream to CCseScheduledProgram-class) stream that we got.
+ CCseScheduledProgram* prog = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( prog );
+ prog->InternalizeL( readStr );
+ aArray.AppendL( prog );
+ CleanupStack::Pop( prog );
+ }
+
+ readStr.Close();
+
+ CleanupStack::PopAndDestroy( &readStr );
+ CleanupStack::PopAndDestroy( programBuffer );
+ CleanupStack::PopAndDestroy( lengthBuff );
+ CleanupStack::PopAndDestroy( msgScheduleType );
+ CSELOGSTRING_HIGH_LEVEL("<<<RCseSchedulerService::GetSchedulesByTypeL");
+ }
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerService::GetSchedulesByTimeL
+//
+// -----------------------------------------------------------------------------
+//
+void RCseSchedulerService::GetSchedulesByTimeL( const TTime& aBeginning,
+ const TTime& aEnd,
+ RPointerArray<CCseScheduledProgram>& aArray ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerService::GetSchedulesByTimeL");
+ if ( !SubSessionHandle() )
+ {
+ User::Leave( ECseNoSubsessionHandle );
+ }
+
+ // Buffer for schedule data
+ HBufC8* timeframe = HBufC8::NewLC( sizeof( TInt64 ) + // start time
+ sizeof( TInt64 ) ); // end time
+
+ TPtr8 timeframePtr( timeframe->Des() );
+
+ // Buffer for incoming message length
+ HBufC8* lengthBuf = HBufC8::NewLC( sizeof( TInt32 ) );
+ TPtr8 lengthBufPtr( lengthBuf->Des() );
+ TUint32 length( 0 );
+
+ // Schedule type
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( timeframePtr );
+
+ // Start time
+ TInt64 temp( 0 );
+ TUint32 lower( 0 );
+ TUint32 upper( 0 );
+
+ // Change TTime to stream format.
+ temp = aBeginning.Int64();
+ lower = (0x00000000FFFFFFFFULL) & temp;
+ upper = (0x00000000FFFFFFFFULL) & (temp >> 32);
+ writeStream.WriteUint32L( lower );
+ writeStream.WriteUint32L( upper );
+
+ // End time
+ temp = aEnd.Int64();
+ lower = (0x00000000FFFFFFFFULL) & temp;
+ upper = (0x00000000FFFFFFFFULL) & (temp >> 32);
+ writeStream.WriteUint32L( lower );
+ writeStream.WriteUint32L( upper );
+
+ writeStream.CommitL();
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ // Set args for IPC
+ TIpcArgs args( &timeframePtr, &lengthBufPtr );
+
+ // Ask for db id
+ User::LeaveIfError( SendReceive( ECseGetScheduleArrayLengthByTimeframe, args ) );
+
+ // Read length
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( lengthBufPtr );
+ length = readStream.ReadUint32L();
+ CleanupStack::PopAndDestroy( &readStream );
+
+ if ( length > 0 )
+ {
+ HBufC8* schedulesBuf = HBufC8::NewLC( length +
+ sizeof( TInt32 ) ); // item count as TInt32
+ TPtr8 schedulesPtr( schedulesBuf->Des() );
+
+ TIpcArgs schedArgs( &timeframePtr, &schedulesPtr );
+
+ User::LeaveIfError( SendReceive( ECseGetSchedulesByTimeframe, schedArgs ) );
+
+ RDesReadStream readStr;
+ CleanupClosePushL( readStr );
+ readStr.Open( schedulesPtr );
+ // read item count
+ TInt32 count( readStr.ReadInt32L() );
+
+ // read all items from stream to array
+ for ( TInt i = 0; i < count; i++ )
+ {
+ // Internalize (change stream to CCseScheduledProgram-class) stream that we got.
+ CCseScheduledProgram* prog = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( prog );
+ prog->InternalizeL( readStr );
+ aArray.AppendL( prog );
+ CleanupStack::Pop( prog );
+ }
+
+ readStr.Close();
+ CleanupStack::PopAndDestroy( &readStr );
+ CleanupStack::PopAndDestroy( schedulesBuf );
+ }
+
+ CleanupStack::PopAndDestroy( lengthBuf );
+ CleanupStack::PopAndDestroy( timeframe );
+ CSELOGSTRING_HIGH_LEVEL("<<<RCseSchedulerService::GetSchedulesByTimeL");
+ }
+
+
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerClient/src/RCseSchedulerServiceBase.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,115 @@
+/*
+* Copyright (c) 2006 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: Implementation of CseScheduler client's ServiceBase*
+*/
+
+
+
+
+
+// INCLUDE FILES
+#include <ipvideo/RCseSchedulerServiceBase.h> // Client common methods (open, close etc)
+#include <ipvideo/RCseSchedulerClient.h> // Client common methods (server start up etc)
+#include "CseDebug.h" // Debug macros
+#include <ipvideo/CseSchedulerClientServerCommon.h> // Common defines for client and server
+
+// EXTERNAL DATA STRUCTURES
+// None.
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None.
+
+// CONSTANTS
+// None.
+
+// MACROS
+// None.
+
+// LOCAL CONSTANTS AND MACROS
+// None.
+
+// MODULE DATA STRUCTURES
+// None.
+
+// LOCAL FUNCTION PROTOTYPES
+// None.
+
+// FORWARD DECLARATIONS
+// None.
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerServiceBase::RCseSchedulerServiceBase
+//
+// -----------------------------------------------------------------------------
+//
+RCseSchedulerServiceBase::RCseSchedulerServiceBase()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerServiceBase::RCseSchedulerServiceBase");
+ CSELOGSTRING_HIGH_LEVEL("<<<RCseSchedulerServiceBase::RCseSchedulerServiceBase");
+ }
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerServiceBase::~RCseSchedulerServiceBase
+//
+// -----------------------------------------------------------------------------
+//
+RCseSchedulerServiceBase::~RCseSchedulerServiceBase()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>~RCseSchedulerServiceBase::~RCseSchedulerServiceBase");
+ CSELOGSTRING_HIGH_LEVEL("<<<~RCseSchedulerServiceBase::~RCseSchedulerServiceBase");
+ }
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerServiceBase::Open
+//
+// -----------------------------------------------------------------------------
+//
+TInt RCseSchedulerServiceBase::Open( RCseSchedulerClient& aClient )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerServiceBase::Open");
+ __ASSERT_ALWAYS( aClient.Handle(), PanicClient( KErrBadHandle ) );
+ iClient = &aClient;
+
+ TIpcArgs args( TIpcArgs::ENothing );
+ CSELOGSTRING_HIGH_LEVEL("<<<RCseSchedulerServiceBase::Open");
+ return CreateSubSession( aClient, ECseServCreateSubSession, args );
+ }
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerServiceBase::Close
+//
+// -----------------------------------------------------------------------------
+//
+void RCseSchedulerServiceBase::Close()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerServiceBase::Close");
+ RSubSessionBase::CloseSubSession( ECseServCloseSubSession );
+ CSELOGSTRING_HIGH_LEVEL("<<<RCseSchedulerServiceBase::Close");
+ }
+
+// -----------------------------------------------------------------------------
+// RCseSchedulerServiceBase::PanicClient
+//
+// -----------------------------------------------------------------------------
+//
+void RCseSchedulerServiceBase::PanicClient( TInt aFault ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RCseSchedulerServiceBase::PanicClient");
+ _LIT( KCseRTPClientFault, "CseRTPApi Client Fault" );
+ User::Panic( KCseRTPClientFault, aFault );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/data/102750D5.rss Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,27 @@
+/*
+* 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:
+*
+*/
+
+
+
+
+#include <StartupItem.rh>
+
+RESOURCE STARTUP_ITEM_INFO CseSchedulerServer
+{
+ executable_name = "!:\\sys\\bin\\CseSchedulerServer.exe";
+ recovery = EStartupItemExPolicyNone;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/group/ScheduleServer.mmp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,72 @@
+/*
+* Copyright (c) 2006 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: Project definition file*
+*/
+
+
+
+
+#include <platform_paths.hrh>
+#include <bldvariant.hrh>
+
+//OPTION ARMCC --asm --interleave
+ALWAYS_BUILD_AS_ARM
+
+TARGET CseSchedulerServer.exe
+#if !defined(__SERIES60_30__) && !defined(__SERIES60_31__) && !defined(__SERIES60_32__)
+EPOCSTACKSIZE 0x10000
+#else
+EPOCSTACKSIZE 0x5000
+#endif // !defined(__SERIES60_30__) && !defined(__SERIES60_31__) && !defined(__SERIES60_32__)
+
+targettype exe
+UID 0x1000008c 0x102750D6
+VENDORID VID_DEFAULT
+SECUREID 0x102750D6
+CAPABILITY CAP_SERVER -DRM -AllFiles
+
+SOURCEPATH ../src
+SOURCE CCseSchedulerServer.cpp
+SOURCE CCseScheduleDB.cpp
+SOURCE CCseSchedulerTimer.cpp
+SOURCE CCseSchedulerServerSession.cpp
+SOURCE CCseSchedulerServerEngine.cpp
+SOURCE CCseSchedulerPluginControllerBase.cpp
+SOURCE CCseSchedulerUniPluginController.cpp
+SOURCE CCseSchedulerMultiPluginController.cpp
+SOURCE CCseSchedulerPluginStarter.cpp
+SOURCE CCseSchedulerLandLord.cpp
+SOURCE CCseSchedulerThreadPacket.cpp
+SOURCE CCseSemaphoreController.cpp
+SOURCEPATH ../data
+
+START RESOURCE 102750D5.rss
+END // RESOURCE
+
+USERINCLUDE ../inc
+USERINCLUDE ../../inc
+
+MW_LAYER_SYSTEMINCLUDE
+
+LIBRARY euser.lib
+LIBRARY efsrv.lib
+LIBRARY bafl.lib
+LIBRARY flogger.lib
+LIBRARY edbms.lib
+LIBRARY ws32.lib
+LIBRARY apgrfx.lib
+LIBRARY apparc.lib
+LIBRARY estor.lib
+LIBRARY CseSchedulerClient.lib
+LIBRARY ecom.lib
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,27 @@
+/*
+* Copyright (c) 2004-2005 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+PRJ_EXPORTS
+../rom/videoschedulerserver.iby CORE_MW_LAYER_IBY_EXPORT_PATH(videoschedulerserver.iby)
+PRJ_MMPFILES
+ScheduleServer.mmp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/inc/CCseScheduleDB.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,447 @@
+/*
+* Copyright (c) 2006 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: header file for CCseScheduleDB class*
+*/
+
+
+
+#ifndef _CCSESCHEDULEDB_H
+#define _CCSESCHEDULEDB_H
+
+#include <e32base.h>
+#include <d32dbms.h> // RDbStoreDatabase
+#include <f32file.h> // RFs
+#include <s32file.h>
+#include <babackup.h>
+
+// CONSTANTS
+const int KCseCustomSqlLength = 256;
+const int KCseDbCompactTimeout = 30000000;
+
+// Constant for filename definition
+_LIT( KCseScheduleDBName, "CseSchedules.db" );
+// Database table
+_LIT( KCseDatabaseTable, "CseDatabase" );
+_LIT( KCseDatabaseVersionCol, "DbVersion" );
+_LIT( KCseDatabaseReserved1Col, "DbReserved1" );
+_LIT( KCseDatabaseReserved2Col, "DbReserved2" );
+
+// Program table
+_LIT( KCseScheduleTable, "ScheduleEvent" );
+_LIT( KCseScheduleDbKeyCol, "Key" );
+_LIT( KCseScheduleNameCol, "Name" );
+_LIT( KCseScheduleStartTimeCol, "StartTime" );
+_LIT( KCseScheduleEndTimeCol, "EndTime" );
+_LIT( KCseScheduleApplicationUIDCol, "ApplicationUID" );
+_LIT( KCseSchedulePlugInUIDCol, "PlugInUID" );
+_LIT( KCseScheduleTypeCol, "Type" );
+_LIT( KCseScheduleApplicationSpecificCol, "ApplicationSpecificData" );
+_LIT( KCseScheduleRunCountCol, "ScheduleRunCount" );
+_LIT( KCseScheduleStateCol, "ScheduleState" );
+_LIT( KCseSchedulePluginTypeCol, "PluginType" );
+_LIT( KCseScheduleReserved1Col, "ScheduleReserved1" );
+_LIT( KCseScheduleReserved2Col, "ScheduleReserved2" );
+
+class CCseScheduledProgram;
+
+/**
+* Version of CleanupXxxxPushL() that can be used to 'ResetAndDestroy'
+* the supplied object if the clean-up stack unwinds.
+*/
+template <class T>
+class CleanupResetAndDestroy
+ {
+ public:
+ inline static void PushL( T& aRef );
+ private:
+ static void ResetAndDestroy( TAny *aPtr );
+ };
+
+template <class T>
+ inline void CleanupResetAndDestroyPushL( T& aRef );
+
+template <class T>
+inline void CleanupResetAndDestroy<T>::PushL( T& aRef )
+ {
+ CleanupStack::PushL( TCleanupItem( &ResetAndDestroy, &aRef ) );
+ }
+
+template <class T>
+void CleanupResetAndDestroy<T>::ResetAndDestroy( TAny *aPtr )
+ {
+ ( static_cast<T*>( aPtr ) )->ResetAndDestroy();
+ }
+
+template <class T>
+inline void CleanupResetAndDestroyPushL( T& aRef )
+ {
+ CleanupResetAndDestroy<T>::PushL( aRef );
+ }
+
+
+/**
+* Schedule database.
+*/
+class CCseScheduleDB : public CBase,
+ public MBackupObserver
+{
+ public: // Constructors and destructors
+ virtual ~CCseScheduleDB();
+
+ /**
+ * Two-phased constructor.
+ */
+ IMPORT_C static CCseScheduleDB* NewL();
+
+ /**
+ * Enum for schedule state
+ */
+ enum TCseScheduleState
+ {
+ ECseWaiting = 0,
+ ECseRunning
+ };
+
+ /**
+ * Enum for database access
+ */
+ enum TCseDatabaseAccess
+ {
+ ECseDbOpen = 0,
+ ECseDbLocked
+ };
+
+ public: // Methods from MBackupObserver
+ void ChangeFileLockL(const TDesC &aFileName, TFileLockFlags aFlags);
+
+ public: // New methods
+ /**
+ * Adds given schedule to database. Method will leave with
+ * KErrLocked -error code if Backup/Restore is going on.
+ * @param aData schedule to be added to database.
+ * @return None
+ */
+ void AddScheduleL( CCseScheduledProgram& aData );
+
+ /**
+ * Removes schedule from database. Method will leave with
+ * KErrLocked -error code if Backup/Restore is going on.
+ * @param aData schedule to be removed from database.
+ * @return None
+ */
+ void RemoveScheduleL( const TUint32 aDbIdentifier );
+
+ /**
+ * Finds start time of the schedule that is happening next from the database.
+ * Method will leave with KErrLocked -error code if Backup/Restore is going on.
+ * @return Start time of the next schedule.
+ */
+ TTime GetNextScheduleTimeL();
+
+ /**
+ * Fills parameter array with schedules that have same starting time as
+ * paramter time. Method will leave with KErrLocked -error code if
+ * Backup/Restore is going on.
+ * @param aSchdeduleTime Start time of the schedules fetched.
+ * @param aNextScheduleArray Array containing schedules after call
+ * is completed.
+ * @return None
+ */
+ void FillScheduleArrayByTimeL( const TTime& aScheduleTime,
+ RPointerArray<CCseScheduledProgram>& aNextScheduleArray );
+
+ /**
+ * Gets the given schedule from database. Method will leave with
+ * KErrLocked -error code if Backup/Restore is going on.
+ * @param aDbIdentifier Database identifier of the schedule fetched.
+ * @param aSchedule Pointer where schedule is stored when call
+ * is completed.
+ * @return None
+ */
+ void GetScheduleByDbIdentifierL( const TUint32 aDbIdentifier,
+ CCseScheduledProgram* aSchedule );
+
+ /**
+ * Get application specific schedules from db. Method will leave with
+ * KErrLocked -error code if Backup/Restore is going on.
+ * @param aAppUid Application UID.
+ * @param aScheduleArray Array where to put scheduled events.
+ * @return None
+ */
+ void GetApplicationSchedulesL( const TInt32 aAppUid,
+ RPointerArray<CCseScheduledProgram>& aArray );
+
+ /**
+ * Get overlapping schedules. Method will leave with
+ * KErrLocked -error code if Backup/Restore is going on.
+ * @param aType Schedule type (one from
+ * CCseScheduledProgram::TCseScheduleType)
+ * @param aStartTime Start time
+ * @param aEndTime End Time
+ * @param aResultArray On return, contains pointers to overlapping schedules
+ * empty if none found.
+ * @return None.
+ */
+ void GetOverlappingSchedulesL( const TInt32 aType,
+ const TTime& aStartTime,
+ const TTime& aEndTime,
+ RPointerArray<CCseScheduledProgram>& aResultArray );
+
+ /**
+ * Increases runcount of given schedule in DB. Method will leave with
+ * KErrLocked -error code if Backup/Restore is going on.
+ * @param aDbIdentifier Database identifier of the schedule thats
+ * runcount is to be incremented
+ */
+ void IncreaseRunCountL( const TUint32 aDbIdentifier );
+
+ /**
+ * Gets the runcount of give schedule. Method will leave with
+ * KErrLocked -error code if Backup/Restore is going on.
+ * @param aDbIdentifier DbIdentifier of the schedule whos runcount is fetched.
+ * @return Run count of the schedule.
+ */
+ TInt32 GetRunCountL( const TUint32 aDbIdentifier );
+
+ /**
+ * Gets the state of give schedule. Method will leave with
+ * KErrLocked -error code if Backup/Restore is going on.
+ * @param aDbIdentifier DbIdentifier of the schedule whos state is fetched.
+ * @return Schedule state (one of the CCseScheduledDB::TCseScheduleState)
+ */
+ TInt32 GetScheduleStateL( const TUint32 aDbIdentifier );
+
+ /**
+ * Sets the state of give schedule. Method will leave with
+ * KErrLocked -error code if Backup/Restore is going on.
+ * @param aDbIdentifier DbIdentifier of the schedule whos state is fetched.
+ * @param aState State to be set.
+ * @return None
+ */
+ void SetScheduleStateL( const TUint32 aDbIdentifier,
+ const TInt32 aState );
+
+ /**
+ * Gets the startup schedules from the DB. When phone is set on, we try to run all
+ * schdeulus that were on run when the phone was set off (run count is bigger than 0).
+ * Method will leave with KErrLocked -error code if Backup/Restore is going on.
+ * @param aResultArray Array where schedules that were on run are stored.
+ * @return None
+ */
+ void StartupSchedulesL( RPointerArray<CCseScheduledProgram>& aResultArray );
+
+ /**
+ * Get plugin specific schedules from db. Method will leave with
+ * KErrLocked -error code if Backup/Restore is going on.
+ * @param aPluginUid Application UID.
+ * @param aScheduleArray Array where to put scheduled events.
+ * @return None
+ */
+ void GetSchedulesByPluginL( const TInt32 aPluginUid,
+ RPointerArray<CCseScheduledProgram>& aArray );
+
+ /**
+ * Get plugin specific schedules of specific type from db. Method will leave with
+ * KErrLocked -error code if Backup/Restore is going on.
+ * @param aType Schedule type
+ * @param aScheduleArray Array where to put scheduled events.
+ * @return None
+ */
+ void GetSchedulesByTypeL( const TInt32 aType,
+ RPointerArray<CCseScheduledProgram>& aArray );
+
+ /**
+ * Get schedules in given timeframe. Method will leave with
+ * KErrLocked -error code if Backup/Restore is going on.
+ * @param aBeginning Start time of timeframe
+ * @param aEnd End Time of timeframe
+ * @param aResultArray On return, contains pointers to overlapping schedules
+ * empty if none found.
+ * @return None.
+ */
+ void GetSchedulesByTimeframeL( const TTime& aStartTime,
+ const TTime& aEndTime,
+ RPointerArray<CCseScheduledProgram>& aResultArray );
+
+ /**
+ * Gets all the uid's of different plugins that are in DB.
+ * KErrLocked -error code if Backup/Restore is going on.
+ * @param aPlugins On return, contains all the different plugin uid's in
+ * db. Empty if none found.
+ */
+ void GetPluginsL( RArray<TInt32>& aPlugins );
+
+ /**
+ * Get the next happening time of schedule from database based on plugin uid.
+ * KErrLocked -error code if Backup/Restore is going on.
+ * @param aPluginUid Plugin uid in which to base the search
+ * @return Next start time of the schedule of given plugin Uid.
+ */
+ TTime GetNextScheduleTimeByPluginL( TInt32 aPluginUid );
+
+ /**
+ * Gets all the schedules that are going to happen at the given time based on plugin uid.
+ * KErrLocked -error code if Backup/Restore is going on.
+ * @param aScheduleTime Start time in which to base the search
+ * @param aPluginUid Plugin uid in which to base the search
+ * @param aNextScheduleArray On return, contains pointers to schedules.
+ */
+ void GetSchedulesByTimeAndPluginL(
+ const TTime& aScheduleTime,
+ TInt32 aPluginUid,
+ RPointerArray<CCseScheduledProgram>& aNextScheduleArray );
+
+
+ private:
+ /**
+ * C++ default constructor.
+ */
+ CCseScheduleDB();
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ private: // Methods
+ /**
+ * Checks the db version from db. If it is older than current one, destroy it
+ * and create new one.
+ * @return None
+ */
+ void CheckDbVersionL();
+
+ /**
+ * Open DB or create new database if DB file is not found.
+ * @return None
+ */
+ void OpenOrCreateDbL();
+
+ /**
+ * Create schedule table.
+ * @param aDatabase where to create schedule table.
+ * @return None
+ */
+ void CreateScheduleTableL( RDbStoreDatabase& aDatabase ) const;
+
+ /**
+ * Create database table.
+ * @param aDatabase where to create database table.
+ * @return None
+ */
+ void CreateDatabaseTableL( RDbStoreDatabase& aDatabase );
+
+ /**
+ * Gets the database version number
+ * @param None
+ * @return None
+ */
+ TInt GetDbVersionL( );
+
+ /**
+ * Set hardcoded database version to database. Used after creating new database.
+ * @param None
+ * @return None
+ */
+ void SetDatabaseVersionL();
+
+ /**
+ * Removes existing database.
+ * @return None
+ */
+ void RemoveDbL();
+
+ /**
+ * Static call back for CPeriodic.
+ * @param aThis Pointer to CCseScheduleDB so that we can
+ * direct call back to class.
+ * @return Always TFalse
+ */
+ static TInt CompactCallback( TAny* aThis );
+
+ /**
+ * We want to compact database 30 seconds after last database operation.
+ * this resets 30 sec counter.
+ * @return None
+ */
+ void ResetCompactTimer( );
+
+ /**
+ * Compacts database.
+ * @return None
+ */
+ void CompactDb();
+
+ /**
+ * Closed Db file and sets iDbAccess to ECseDbLocked.
+ * @return None
+ */
+ void CloseDbFile();
+
+ /**
+ * Closed Db file and sets iDbAccess to ECseDbOpen.
+ * @return None
+ */
+ void OpenDbFileL();
+
+ /**
+ * Leaves with KErrLocked if iDbAccess is ECseDbLocked.
+ * @return None
+ */
+ void LeaveIfDbLockedL() const;
+
+ private: // Data
+ /**
+ * File server session is connected in construction and closed in
+ * destruction
+ */
+ RFs iFsSession;
+
+ /**
+ * File name of the database which to handle
+ */
+ TFileName iDbFile;
+
+ /**
+ * For database operations
+ */
+ RDbStoreDatabase iScheduleDb;
+
+ /**
+ * For creating and opening services database file. Own.
+ */
+ CFileStore* iScheduleFileStore;
+
+ /**
+ * Timer used in compacting database. Own.
+ */
+ CPeriodic* iCompactTimer;
+
+ /**
+ * SQL string for SQL calls
+ */
+ TBuf<KCseCustomSqlLength> iSqlSchedule;
+
+ /**
+ * Status is database accessible
+ */
+ TCseDatabaseAccess iDbAccess;
+
+ /**
+ * Wrapper to get notification if backup/restore is
+ * about to happen. Own.
+ */
+ CBaBackupSessionWrapper* iBackupWrapper;
+};
+#endif _CCSESCHEDULEDB_H
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/inc/CCseSchedulerLandLord.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,205 @@
+/*
+* Copyright (c) 2006 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: Header file for CCseSchedulerThreadCrossroads-class.*
+*/
+
+
+
+
+#ifndef _CCSESCHEDULERLANDLORD_H
+#define _CCSESCHEDULERLANDLORD_H
+
+// INCLUDES
+#include <e32base.h>
+#include "MCseSemaphoreSignalObserver.h"
+
+// CONSTANTS
+#define KThreadNameSize 19
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+class MCseScheduleObserver;
+class RThread;
+class CCseScheduledProgram;
+class CCseSchedulerThreadPacket;
+class CCseSemaphoreController;
+class CActiveSchedulerWait;
+
+/**
+* LandLord controlling shared data that is given to thread. After plugin thread is started,
+* nothing should be accessed before thread has died.
+*
+* Also observes thread when it dies.
+*/
+class CCseSchedulerLandLord : public CActive,
+ public MCseSemaphoreSignalObserver
+
+{
+ public: // Constructors and destructors
+ /**
+ * Destructor.
+ */
+ virtual ~CCseSchedulerLandLord();
+
+ /**
+ * Two-phased constructor.
+ * @param aObserver A pointer back to plugin controller.
+ */
+ static CCseSchedulerLandLord* NewL( MCseScheduleObserver* aObserver );
+
+ private: // Constructors and destructors
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ /**
+ * C++ default constructor.
+ * @param aObserver A pointer back to plugin controller.
+ */
+ CCseSchedulerLandLord( MCseScheduleObserver* aObserver );
+
+ public:
+ /**
+ * Set schedule to LandLord.
+ * @param aData CCseScheduledProgram to be set.
+ */
+ void SetScheduleL( CCseScheduledProgram& aData );
+
+ /**
+ * Returns ThreadPacket of the LandLord
+ * @return pointer to ThreadPacket
+ */
+ CCseSchedulerThreadPacket* ThreadPacket( );
+
+ /**
+ * Run plugin. Creates thread where the CCseSchedulerPluginStarter is run
+ * and sets itself observing when thread dies.
+ */
+ void RunPluginL( );
+
+ /**
+ * Clears landlord. Uses semaphore to signal plugin thread that thread needs
+ * to be taken down.
+ * Synchronous.
+ */
+ void ClearL();
+
+ /**
+ * Returns ETrue if LandLord is working (plugin is running).
+ */
+ TBool IsWorking();
+
+ private: // CActive
+ /**
+ * RunL
+ * @return None
+ */
+ void RunL();
+
+ /**
+ * RunError
+ * @return
+ */
+ TInt RunError( TInt aError );
+
+ /**
+ * DoCancel
+ * @return None
+ */
+ void DoCancel();
+
+ private: // from MCseSemaphoreSignalObserver
+ void SemaphoreSignalled( );
+
+ private: // New methods
+ /**
+ * Generates unique thread name to internal iThreadName-buffer.
+ */
+ void GenerateThreadNameL();
+
+ /**
+ * Generates semaphores to signal thread shutdown and when shutdown
+ * is completed.
+ */
+ void GenerateSemaphoresL( );
+
+ /**
+ * Starts or stops active wait. Used when thread needs to be taken down.
+ */
+ void ActiveWait( TBool aStart );
+
+ private: // Data
+ /**
+ * Pointer back to plugin controller. Own.
+ */
+ MCseScheduleObserver* iObserver;
+
+ /**
+ * ThreadPacket. Contains data to be given plugin thread when run. Own.
+ */
+ CCseSchedulerThreadPacket* iThreadPacket;
+
+ /**
+ * Thread where plugin is run.
+ */
+ RThread iThread;
+
+ /**
+ * Unique thread name. Own.
+ */
+ HBufC* iThreadName;
+
+ /**
+ * ETrue if thread is running, EFalse if not.
+ */
+ TBool iThreadRunning;
+
+ /**
+ * Semaphore signalled when plugin is wanted to take down.
+ */
+ RSemaphore iPluginShutdownSemaphore;
+
+ /**
+ * Semaphore signalled when plugin has been taken down.
+ */
+ RSemaphore iPluginShutdownCompleteSemaphore;
+
+ /**
+ * ActiveSchedulerWait. Own.
+ */
+ CActiveSchedulerWait* iActiveSchedulerWait;
+
+ /**
+ * Checks once a while if plugin shutdown has been completed.
+ * Own.
+ */
+ CCseSemaphoreController* iShutdownCompleteMonitor;
+
+ /**
+ * ETrue if shutdown has been signalled to CCSeSchedulerPluginStarter.
+ * EFalse if not.
+ */
+ TBool iTakedownRequested;
+};
+
+#endif //_CCSESCHEDULERLANDLORD_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/inc/CCseSchedulerMultiPluginController.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,109 @@
+/*
+* Copyright (c) 2006 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: Header for MultiPluginController-class*
+*/
+
+
+
+
+#ifndef __CCSESCHEDULERMULTIPLUGINCONTROLLER_H
+#define __CCSESCHEDULERMULTIPLUGINCONTROLLER_H
+
+// INCLUDES
+#include "CCseSchedulerPluginControllerBase.h"
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+class CCseSchedulerPluginStarter;
+class CCseSchedulerLandLord;
+
+/**
+* Controller for plugins that can be several in run at same time
+*/
+class CCseSchedulerMultiPluginController : public CCseSchedulerPluginControllerBase
+ {
+ public: // Constructors and destructor
+ /**
+ * Two-phased constructor.
+ * @params aEngine reference to engine
+ * @params aPluginUid plugin uid of the plugin this plugin controller is made for
+ * @return CCseSchedulerPluginControllerBase pointer to CCseSchedulerPluginControllerBase class
+ */
+ static CCseSchedulerMultiPluginController* NewL( CCseSchedulerServerEngine& aEngine, TInt32 aPluginUid );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CCseSchedulerMultiPluginController();
+
+ public: // from CCseSchedulerPluginControllerBase
+ void ClearControllerL();
+
+ TBool IsControllerActive();
+
+ void RunPluginsL() ;
+
+ void DoCleanUp() ;
+
+ void ScheduleCompletedL( const TUint32 aDbIdentifier, TInt aCompletitionCode );
+
+ private: // Constructors and destructor
+ /**
+ * C++ default constructor.
+ */
+ CCseSchedulerMultiPluginController( CCseSchedulerServerEngine& aEngine, TInt32 aPluginUid );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ private: // New methods
+ /**
+ * Handles succesfully completed schedules.
+ * @param aDbIdentifier DbIdentifier of schedule just completed
+ */
+ void ScheduleCompletedSuccesfullyL( const TUint32 aDbIdentifier );
+
+ /**
+ * Handles failed schedules.
+ * @param aDbIdentifier DbIdentifier of schedule just completed
+ * @param aCompletitionCode Error code of the completed schedule.
+ */
+ void HandleScheduleErrorL( const TUint32 aDbIdentifier,
+ TUint32 aCompletitionCode );
+ private: // Data
+
+ /**
+ * LandLords. Owns data that is given to new thread and acts as observer to thread.
+ * Own.
+ */
+ RPointerArray<CCseSchedulerLandLord> iLandLords;
+ };
+
+#endif // __CCSESCHEDULERMULTIPLUGINCONTROLLER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/inc/CCseSchedulerPluginControllerBase.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,185 @@
+/*
+* Copyright (c) 2006 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: Header for PluginControllerBase-class*
+*/
+
+
+
+
+#ifndef __CCSESCHEDULERPLUGINCONTROLLERBASE_H
+#define __CCSESCHEDULERPLUGINCONTROLLERBASE_H
+
+// INCLUDES
+#include <e32base.h>
+#include <ipvideo/MCsePluginObserver.h>
+#include <ipvideo/MCseScheduleObserver.h>
+#include "MCseSchedulerTimerObserver.h"
+#include "MCsePluginControllerObserver.h"
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+class CCseScheduledProgram;
+class CCseSchedulerTimer;
+class CCseSchedulerServerEngine;
+
+/**
+* Base class for plugin controllers. Handles all plugin related stuff except scheduling logic.
+*/
+class CCseSchedulerPluginControllerBase : public CBase,
+ public MCseScheduleObserver,
+ public MCseSchedulerTimerObserver
+ {
+ public: // Constructors and destructor
+ /**
+ * Two-phased constructor.
+ * @params aEngine reference to engine
+ * @params aPluginUid plugin uid of the plugin this plugin controller is made for
+ * @return CCseSchedulerPluginControllerBase pointer to CCseSchedulerPluginControllerBase class
+ */
+ static CCseSchedulerPluginControllerBase* NewL( MCsePluginControllerObserver& aEngine, TInt32 aPluginUid );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CCseSchedulerPluginControllerBase();
+
+ protected:
+ /**
+ * C++ default constructor.
+ */
+ CCseSchedulerPluginControllerBase( MCsePluginControllerObserver& aEngine, TInt32 aPluginUid );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ public: // from MCseScheduleObserver-class
+ /**
+ * Plugins uses this method to inform common scheduler engine that
+ * schedule is handled.
+ * @param aDbIdentifier DbIdentifier of scheduled program that just
+ * has been processed.
+ */
+ virtual void ScheduleCompletedL( const TUint32 aDbIdentifier, TInt aCompletitionCode );
+
+ public: // from MCseSchedulerTimerObserver-class
+ /**
+ * Plugins uses this method to inform common scheduler engine that
+ * schedule is handled.
+ * @param aDbIdentifier DbIdentifier of scheduled program that just
+ * has been processed.
+ */
+ virtual void TimerErrorL( const TInt32 aError );
+
+ /**
+ * Timer is up, run the Plugins!!!
+ */
+ virtual void RunPluginsL( );
+
+ public: // New methods
+
+ /**
+ * Sets plugin to be cleared after callstack break.
+ * @param aToBeCleared ETrue if controller needs to be cleared.
+ */
+ void SetToBeCleared( TBool aToBeCleared );
+
+ /**
+ * Clears controller: clears (takes down all threads running for the plugin)
+ * all landlords.
+ */
+ virtual void ClearControllerL();
+
+ /**
+ * Cleans the controller from LandLord(s) that aren't needed anymore.
+ */
+ virtual void DoCleanUp( );
+
+ /**
+ * Sets schedules to controller. More precise information is found from Uni and Multi
+ * controller classes.
+ * @params aScheduleArrat Array of schedules to be set into controller. All given
+ * schedules should have same start time.
+ */
+ virtual void SetSchedulesL( RPointerArray<CCseScheduledProgram>& aScheduleArray );
+
+ /**
+ * Gets plugin id. This Uid of the plugin going to be run when time is right. Can be
+ * used, for example, to find right kind of controller to a schedule.
+ * @return plugin Uid of the plugin used to run the schedule.
+ */
+ TInt32 PluginUid( );
+
+ /**
+ * Checks if the plugin is obsolete (There are no more schedules to be run).
+ * @return ETrue if obsolete, EFalse if not.
+ */
+ TBool IsObsolete() const;
+
+ /**
+ * Checks if the plugin is set to be cleared.
+ * @return ETrue if set, EFalse if not.
+ */
+ TBool IsToBeCleared();
+
+ /**
+ * Checks if there are active plugins in controller.
+ * @return ETrue if active plugins found, EFalse otherwise
+ */
+ virtual TBool IsControllerActive();
+
+ protected: //data
+ /**
+ * Array containing schedules to be run. Own.
+ */
+ RPointerArray<CCseScheduledProgram> iScheduleArray;
+
+ /**
+ * Timer class. Own.
+ */
+ CCseSchedulerTimer* iTimer;
+
+ /**
+ * Reference to engine
+ */
+ MCsePluginControllerObserver& iEngine;
+
+ /**
+ * Uid of the plugin contrelled by this controller.
+ */
+ TInt32 iPluginUid;
+
+ /**
+ * Boolean indicating if this plugin controller is to cleared
+ * (plugin running is deleted).
+ */
+ TBool iToBeCleared;
+ };
+
+#endif // __CCSESCHEDULERPLUGINCONTROLLERBASE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/inc/CCseSchedulerPluginStarter.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,148 @@
+/*
+* Copyright (c) 2006 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: Header for PluginStarter-class*
+*/
+
+
+
+#ifndef __CCSESCHEDULERPLUGINSTARTER_H
+#define __CCSESCHEDULERPLUGINSTARTER_H
+
+// INCLUDES
+#include <e32base.h>
+#include <ipvideo/MCsePluginObserver.h>
+#include "MCseSemaphoreSignalObserver.h"
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+class CCseSchedulerThreadPacket;
+class CCseSchedulerPluginIF;
+class CCseSchedulerLandLord;
+class CCseSemaphoreController;
+
+/**
+* Handles running and shutting down one plugin. Runs in seperate thread than rest of the SchedulerEngine
+*/
+class CCseSchedulerPluginStarter : public CBase,
+ public MCseSemaphoreSignalObserver,
+ public MCsePluginObserver
+ {
+ public: // Constructors and destructor
+ /**
+ * Two-phased constructor.
+ * @param aThreadPacket Thread packet containing all the needed information to plugin
+ * to be run.
+ * @return CCseSchedulerPluginStarter pointer to CCseSchedulerPluginStarter class
+ */
+ static CCseSchedulerPluginStarter* NewL( CCseSchedulerThreadPacket* aThreadPacket );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CCseSchedulerPluginStarter();
+
+ public: // from MCsePluginObserver-class
+ void PluginCompleted( TInt aCompletitionValue );
+
+ public: // from MCseSemaphoreSignalObserver-class
+ void SemaphoreSignalled( );
+
+ public: // New methods
+ /**
+ * Creates plugin and runs schedule in it.
+ * @param aParam Any pointer that actually holds CCseThreadPacket
+ * @return KErrNone if succesful, otherwise common Symbian error codes.
+ */
+ static TInt StartThread( TAny* aParam );
+
+ private: // Constructors and destructor
+ /**
+ * C++ default constructor.
+ */
+ CCseSchedulerPluginStarter( CCseSchedulerThreadPacket* aThreadPacket );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ private: // New methods
+ /**
+ * Called from actual StartThread. Creates CCseSchedulerPluginStarter.
+ * @param aParam Any pointer that actually holds CCseThreadPacket
+ */
+ static void DoStartThreadL( TAny* aParam );
+
+ /**
+ * Creates plugin based on schedule and runs schedule in it.
+ */
+ void RunPluginL( );
+
+ /**
+ * Plugin complete callback used with CIdle. Used to break call stack.
+ * @param aPtr Pointer back to CCseSchedulerPluginStarter-class
+ * @return Always EFalse.
+ */
+ static TInt PluginCompleteCallback( TAny* aPtr );
+
+ /**
+ * Plugin complete callback handler. Stops active scheduler, sets completition value
+ * and runs down the plugin.
+ * @return Always EFalse
+ */
+ TInt HandlePluginCompleteCallback();
+
+ private: // Data
+ /**
+ * Thread packet. Includes all needed information for plugin and the completiotion value.
+ * Own.
+ */
+ CCseSchedulerThreadPacket* iThreadPacket;
+
+ /**
+ * Plugin in run. Own.
+ */
+ CCseSchedulerPluginIF* iPlugin;
+
+ /**
+ * CIdle, used to break call stack when plugin completes. Own.
+ */
+ CIdle* iCompletitionBreaker;
+
+ /**
+ * Bool flagging if plugin is wanted to be shot down
+ */
+ TBool iPluginRdyToTakedown;
+
+ /**
+ * Semaphore monitor. Check once a while if shutdown semaphore is signalled.
+ */
+ CCseSemaphoreController* iSemaphoreMonitor;
+ };
+
+#endif // __CCSESCHEDULERPLUGINSTARTER_H
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/inc/CCseSchedulerServer.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,201 @@
+/*
+* Copyright (c) 2006 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: Header for Scheduler Server class*
+*/
+
+
+
+
+#ifndef __CCSESCHEDULERSERVER_H
+#define __CCSESCHEDULERSERVER_H
+
+// INCLUDES
+#include <e32base.h>
+#include "CseSchedulerServer.pan" // Panic codes
+
+// CONSTANTS
+#define KCseSchedulerMinHeapSize 2*KMinHeapSize
+#define KCseSchedulerMaxHeapSize 0x1F0000
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+class CCseSchedulerServerEngine;
+
+// CLASS DECLARATION
+/**
+* Server class
+*
+* @lib CseSchedulerServer.exe
+*/
+class CCseSchedulerServer : public CPolicyServer
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ static CCseSchedulerServer* NewLC( );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CCseSchedulerServer();
+
+ public: // New functions
+
+ /**
+ * Thread function, creates cleanup stack for the thread.
+ * @return KErrNone
+ */
+ static TInt ThreadFunction( );
+
+ /**
+ * Thread function, the active scheduler is installed and started.
+ * @return None.
+ */
+ static void ThreadFunctionL( );
+
+ /**
+ * Panics server.
+ * @param aPanic panic code.
+ * @return None.
+ */
+ static void PanicServer( TCseSchedulerServPanic aPanic );
+
+ /**
+ * Starts the server thread.
+ * @return None.
+ */
+ static TInt StartThread();
+
+ /**
+ * Dec
+ * @return None.
+ */
+ void Dec();
+
+ /**
+ * Inc
+ * @return None.
+ */
+ void Inc();
+
+ /**
+ * Create new Session.
+ * @param aVersion server version number.
+ * @return CSharableSession pointer to new created session.
+ */
+ CSession2* NewSessionL( const TVersion &aVersion,
+ const RMessage2& aMessage ) const;
+
+ /**
+ * Gets engine object.
+ * @return CCseSchedulerServerEngine pointer.
+ */
+ CCseSchedulerServerEngine* GetEngineObjectL();
+
+ /**
+ * Makes check if server is still needed (has schedules on run or active
+ * client), if not calls ActiveScheduler::Stop resulting server shutdown.
+ */
+ void StopServer();
+
+ protected: // Functions from base classes
+
+ /**
+ * From CPolicyServer, called by framework to perform
+ * custom security check for any client messages.
+ *
+ * @param aMsg Message.
+ * @param aAction Action.
+ * @param aMissing Security info.
+ * @return Result of security check.
+ */
+ TCustomResult CustomSecurityCheckL( const RMessage2 &aMsg, TInt &aAction, TSecurityInfo &aMissing );
+
+ /**
+ * Starter callback used with CIdle. Used to break call stack.
+ * @param aPtr Pointer back to CCseSchedulerUserInformer-class
+ * @return Always EFalse.
+ */
+ static TInt StarterCallback( TAny* aPtr );
+
+ /**
+ * Starter callback handler. Checks if server is actually needed (there
+ * is client or schedules to be run). If engine is not needed, signals
+ * server to be deleted.
+ * @return Always EFalse
+ */
+ TInt HandleStarterCallback();
+
+
+ private: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ */
+ CCseSchedulerServer();
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL( );
+
+ private: // New functions
+
+ /**
+ * Deletes scheduler engine.
+ * @return None.
+ */
+ void DeleteSchedulerEngine();
+
+
+ private: // Data
+ /**
+ * Object container index. Own.
+ */
+ CObjectConIx* iContainerIx;
+
+ /**
+ * Object container. Own.
+ */
+ CObjectCon* iObjectCon;
+
+ /**
+ * Number of sessions
+ */
+ TInt iSessionCount;
+
+ /**
+ * Engine object. Own.
+ */
+ CCseSchedulerServerEngine* iSchedulerEngine;
+
+ /**
+ * CIdle, used to break call stack when scheduler is started. Own.
+ */
+ CPeriodic* iStarterBreaker;
+ };
+
+#endif // __CCSESCHEDULERSERVER_H
+
+// End of File
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/inc/CCseSchedulerServerEngine.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,328 @@
+/*
+* Copyright (c) 2006 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: Interface for Scheduler Server's Engine class*
+*/
+
+
+
+
+#ifndef __CCSESCHEDULERSERVERENGINE_H
+#define __CCSESCHEDULERSERVERENGINE_H
+
+// INCLUDES
+#include <ipvideo/MCseScheduleObserver.h> // Observer so that CCseSchedulerTimer can inform engine.
+#include "MCsePluginControllerObserver.h" // Observer so that CCseSchedulerTimer can inform engine.
+#include "CseSchedulerServer.pan" // Panic codes
+
+
+// CONSTANTS
+// Usually we have only one scheduled event at a time so we set granularity to 1, but
+// in some rare cases we migth have more so we have to use array.
+const int KCseScheduleGranularity = 1;
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+class CCseScheduleDB;
+class CCseSchedulerTimer;
+class CCseScheduledProgram;
+class CCseSchedulerServerSession;
+class CCseSchedulerServer;
+class CCseSchedulerPluginControllerBase;
+
+
+// CLASS DECLARATION
+// None
+
+/**
+* Server's "brain". Controls all subsession messages to current object for
+* futher prosessing. Manages message list thru the reguest handler. Reads from
+* the client address space and writes back to client address space. Controls
+* sub objet request(s).
+*/
+class CCseSchedulerServerEngine : public CObject,
+ public MCsePluginControllerObserver
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @param Reference to scheduler server
+ * @return CCseSchedulerEngine pointer to CCseSchedulerEngine class
+ */
+ static CCseSchedulerServerEngine* NewL( CCseSchedulerServer& aServer );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CCseSchedulerServerEngine();
+
+ public: // From MCsePluginControllerObserver
+
+ void ScheduleCompletedSuccesfullyL( const TUint32 aDbIdentifier );
+
+ void ScheduleCompletedWithErrorL( const TUint32 aDbIdentifier, TUint32 aCompletionCode );
+
+ void IncreaseScheduleRunCountL( const TUint32 aDbIdentifier );
+
+ TBool IsAllowedToRun( TUint32 aDbIdentifier );
+
+ void ScheduleNotValid( const TUint32 aDbIdentifier );
+
+ void RequestReschedule( );
+
+ void ClearingDone();
+
+ public: // New methods
+ /**
+ * Plugin complete callback used with CIdle. Used to break call stack.
+ * @param aPtr Pointer back to CCseSchedulerUserInformer-class
+ * @return Always EFalse.
+ */
+ static TInt CompletitionCallback( TAny* aPtr );
+
+ /**
+ * Schedule complete callback handler. Removes schedule from "on run list",
+ * informs engine that schedule has comlete and checks if the plugin where
+ * schedule was run still needed.
+ * @return Always EFalse
+ */
+ TInt HandleCompletitionCallback();
+
+ /**
+ * Cleaner callback used with CIdle. Used to break call stack.
+ * @param aPtr Pointer back to CCseSchedulerUserInformer-class
+ * @return Always EFalse.
+ */
+ static TInt CleanerCallback( TAny* aPtr );
+
+ /**
+ * Cleaner callback handler. Goes through all plugin contollers and clears them
+ * (shutdowns all threads running plugins).
+ * @return Always EFalse
+ */
+ TInt HandleCleanerCallback();
+
+ public: // From CObject
+ /**
+ * Overwrites CObjects Close. Sets the AccesCount to zero.
+ * @return None
+ */
+ void Close();
+
+ public: // New functions
+
+ /**
+ * Does the general message handling.
+ * @param aMessage contains data from the client.
+ * @return None.
+ */
+ void GeneralServiceL( const RMessage2& aMessage );
+
+ /**
+ * Service cancellation.
+ * @param aMessage contains data from the client.
+ * @return None.
+ */
+ void CancelService( const RMessage2& aMessage );
+
+ /**
+ * Checks if scheduler is active atm (schedules in run or waitint)
+ * @return ETrue if active and EFalse if not.
+ */
+ TBool IsSchedulerActive() const;
+
+ /**
+ * Reschedules engine (get new "next schedule" from database and
+ * resets timer).
+ * @return None.
+ */
+ void RescheduleL();
+
+ /**
+ * Reschedules engine (get new "next schedule" from database and
+ * resets timer).
+ * @return None.
+ */
+ void RescheduleByPluginL( TInt32 aPluginUid );
+
+ private: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ * @param Reference to scheduler server.
+ */
+ CCseSchedulerServerEngine( CCseSchedulerServer& aServer );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+
+ private: // New functions
+ /**
+ * Panic the client on server side.
+ * @param aPanic Our panic code.
+ * @param aMessage A message from client
+ * @return None.
+ */
+ void PanicClient( TCseSchedulerServPanic aPanic,
+ const RMessage2& aMessage ) const;
+
+ /**
+ * Adds schedule to database
+ * @param aMessage A message from client
+ * @return None.
+ */
+ void AddScheduleL( const RMessage2& aMessage );
+
+ /**
+ * Removes schedule from database
+ * @param aMessage A message from client
+ * @return None.
+ */
+ void RemoveScheduleL( const RMessage2& aMessage );
+
+ /**
+ * Gets all schedules from database
+ * @param aMessage A message from client
+ * @return None.
+ */
+ void GetSchedulesL( const RMessage2& aMessage );
+
+ /**
+ * Adds schedule to database
+ * @param aMessage A message from client
+ * @return None.
+ */
+ void GetScheduleL( const RMessage2& aMessage );
+
+ /**
+ * Gets externalize length of one specific schedule
+ * @param aMessage A message from client
+ * @return None.
+ */
+ void GetScheduleLengthL( const RMessage2& aMessage );
+
+ /**
+ * Gets schedules based on application UID.
+ * @param aMessage A message from client
+ * @return None.
+ */
+ void GetSchedulesByAppUidL( const RMessage2& aMessage );
+
+ /**
+ * Gets externalize length of the schedules of one application UID
+ * @param aMessage A message from client
+ * @return None.
+ */
+ void GetScheduleArrayLengthByAppUidL( const RMessage2& aMessage );
+
+ /**
+ * Gets externalize length of the overlapping schedules
+ * @param aMessage A message from client
+ * @return None.
+ */
+ void GetOverlappingSchedulesLengthL( const RMessage2& aMessage );
+
+ /**
+ * Gets overlapping schedules of given timeframe
+ * @param aMessage A message from client
+ * @return None.
+ */
+ void GetOverlappingSchedulesL( const RMessage2& aMessage );
+
+ /**
+ * Gets startup schedules from database (schedules that were on run when
+ * phone was shut down)
+ * @return None.
+ */
+ void EngineSchedulesStartup();
+
+ /**
+ * Gets externalize length of the schedules of one plugin UID
+ * @param aMessage A message from client
+ * @return None.
+ */
+ void GetScheduleArrayLengthByPluginUidL( const RMessage2& aMessage );
+
+ /**
+ * Gets schedules based on plugin UID.
+ * @param aMessage A message from client
+ * @return None.
+ */
+ void GetSchedulesByPluginUidL( const RMessage2& aMessage );
+
+ /**
+ * Gets externalize length of the schedules of one type.
+ * @param aMessage A message from client
+ * @return None.
+ */
+ void GetScheduleArrayLengthByTypeL( const RMessage2& aMessage );
+
+ /**
+ * Gets schedules based on schedule type.
+ * @param aMessage A message from client
+ * @return None.
+ */
+ void GetSchedulesByTypeL( const RMessage2& aMessage );
+
+ /**
+ * Gets externalize length of the schedules of specific timeframe.
+ * @param aMessage A message from client
+ * @return None.
+ */
+ void GetScheduleArrayLengthByTimeframeL( const RMessage2& aMessage );
+
+ /**
+ * Gets schedules between given timeframe.
+ * @param aMessage A message from client
+ * @return None.
+ */
+ void GetSchedulesByTimeframeL( const RMessage2& aMessage );
+
+ private: // Data
+ /**
+ * DB class. Own.
+ */
+ CCseScheduleDB* iDb;
+
+ /**
+ * Array holding all plugin controllers.
+ */
+ RPointerArray<CCseSchedulerPluginControllerBase> iPluginControllerArray;
+
+ /**
+ * CIdle, used to break call stack when schedule completes. Own.
+ */
+ CIdle* iCompletitionBreaker;
+
+ /**
+ * Reference to scheduler server
+ */
+ CCseSchedulerServer& iServer;
+ };
+
+#endif // __CCSESCHEDULERSERVERENGINE_H
+
+// End of file
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/inc/CCseSchedulerServerSession.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,148 @@
+/*
+* Copyright (c) 2006 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: Interface for Scheduler Server's Session class*
+*/
+
+
+
+
+#ifndef __CCSESCHEDULERSERVERSESSION_H
+#define __CCSESCHEDULERSERVERSESSION_H
+
+// INCLUDES
+#include <e32base.h>
+#include "CseSchedulerServer.pan" // Panic codes
+
+// CONSTANTS
+// None.
+
+// MACROS
+// None.
+
+// DATA TYPES
+// None
+
+// FUNCTION PROTOTYPES
+// None.
+
+// FORWARD DECLARATIONS
+class CCseSchedulerEngine;
+class CCseSchedulerServer;
+
+// CLASS DECLARATION
+
+/**
+* CCseSchedulerSession
+*
+* @lib
+*/
+class CCseSchedulerServerSession : public CSession2
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @Param aClient reference client thread
+ * @Param aServer pointer to Server
+ * @return CCseSchedulerSession pointer to CCseSchedulerSession class
+ */
+ static CCseSchedulerServerSession* NewL( CCseSchedulerServer* aServer );
+
+
+ /**
+ * Destructor.
+ */
+ virtual ~CCseSchedulerServerSession();
+
+ public: // New functions
+
+ /**
+ * Server
+ * @return a pointer to server
+ */
+ CCseSchedulerServer* Server();
+
+ /**
+ * Service
+ * @param aMessage contains data from the client.
+ * @return None
+ */
+ void ServiceL( const RMessage2& aMessage );
+
+ private: // New functions
+
+ /**
+ * Dispatch message
+ * @param aMessage contains data from the client.
+ * @return None
+ */
+ void DispatchMessageL( const RMessage2& aMessage );
+
+ /**
+ * New Object
+ * @param aMessage contains data from the client.
+ * @return None
+ */
+ void NewObjectL( const RMessage2& aMessage );
+
+ /**
+ * Deletes object, can't fail - can panic client
+ * @param aHandle handle
+ * @return None
+ */
+ void DeleteObject( TUint aHandle );
+
+ /**
+ * Counts resources
+ * @return Number of resources
+ */
+ TInt CountResources();
+
+ /**
+ * Panics client
+ * @param aPanic panic code
+ * @return None
+ */
+ void PanicClient( TCseSchedulerServPanic aPanic ) const;
+
+ private: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ * @Param aClient reference client thread
+ */
+ CCseSchedulerServerSession();
+
+ /**
+ * Symbian 2nd phase constructor.
+ * @Param aServer pointer to Server
+ */
+ void ConstructL( CCseSchedulerServer* aServer );
+
+ private: // Data
+
+ /**
+ * Object index for this session. Own.
+ */
+ CObjectIx* iObjects;
+
+ /**
+ * Total number of resources allocated
+ */
+ TInt iResourceCount;
+
+ };
+
+#endif // __CCSESCHEDULERSERVERSESSION_H
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/inc/CCseSchedulerThreadPacket.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,141 @@
+/*
+* Copyright (c) 2006 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: Header file for CCseSchedulerThreadPacket-class.*
+*/
+
+
+
+#ifndef _CCSESCHEDULERTHREADPACKET_H
+#define _CCSESCHEDULERTHREADPACKET_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+// None
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+class CCseScheduledProgram;
+
+/**
+* Class holding CCseScheduledProgram and ThreadResultCode. This is given to
+* separate plugin thread and should not be accessed before thread dies.
+*/
+class CCseSchedulerThreadPacket : public CBase
+{
+ public: // Constructors and destructors
+ /**
+ * Destructor.
+ */
+ virtual ~CCseSchedulerThreadPacket();
+
+ /**
+ * Two-phased constructor.
+ * @param aObserver A pointer back to server engine through observer
+ */
+ static CCseSchedulerThreadPacket* NewL( );
+
+ private: // Constructors and destructors
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ /**
+ * C++ default constructor.
+ * @param aObserver A pointer back to server engine through observer.
+ */
+ CCseSchedulerThreadPacket( );
+
+ public: // New methods
+ /**
+ * Sets schedule to thread packet. Overwrites existing one.
+ * @param aData Scheduled program to be set
+ */
+ void SetScheduleL( CCseScheduledProgram& aData );
+
+ /**
+ * Gets schedule from thread packet.
+ * @return Pointer to scheduled program.
+ */
+ CCseScheduledProgram* Schedule( );
+
+ /**
+ * Sets threads result code. Should be set before thread completes.
+ * Defaults to KErrGeneral.
+ * @param aResultCode New result code. Overwrites existing one.
+ */
+ void SetResultCode( TInt32 aResultCode);
+
+ /**
+ * Gets threads result code.
+ * @return Threads result code. Defaulted to KErrGeneral if not set.
+ */
+ TInt32 ResultCode( );
+
+ /**
+ * Sets semaphore used to signal plugin shutdown request.
+ * @param aSemaphore Semaphore used to signal shutdown
+ */
+ void SetShutdownSemaphore( RSemaphore& aSemaphore );
+
+ /**
+ * Sets semaphore used to signal when plugin shutdown has completed.
+ * @param aSemaphore Semaphore used to signal shutdown
+ */
+ void SetShutdownCompleteSemaphore( RSemaphore& aSemaphore );
+
+ /**
+ * Gets semaphore used to signal plugin shutdown request.
+ * @return RSemaphore Semaphore used to signal plugin shutdown request.
+ */
+ RSemaphore& ShutdownSemaphore();
+
+ /**
+ * Gets semaphore used to signal when plugin shutdown has completed.
+ * @return RSemaphore Semaphore used to signal when plugin shutdown has completed.
+ */
+ RSemaphore& ShutdownCompleteSemaphore();
+
+ private: // Data
+ /**
+ * Scheduled program to be run in the plugin thread. Own.
+ */
+ CCseScheduledProgram* iSchedule;
+
+ /**
+ * Plugin completition code after the thread dies.
+ */
+ TInt32 iResultCode;
+
+ /**
+ * Semaphore signalled when plugin shutdown is wanted while plugin is running.
+ */
+ RSemaphore iShutdownSemaphore;
+
+ /**
+ * Semaphore signalled when plugin shutdown is completed.
+ */
+ RSemaphore iShutdownCompleteSemaphore;
+};
+
+#endif //_CCSESCHEDULERTHREADPACKET_H
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/inc/CCseSchedulerTimer.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,104 @@
+/*
+* Copyright (c) 2006 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: Header file for CCSeSchdulerTimer-class.*
+*/
+
+
+
+
+#ifndef _CCSESCHEDULERTIMER_H
+#define _CCSESCHEDULERTIMER_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+// None
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+class MCseSchedulerTimerObserver;
+class CCseSchedulerPluginIF;
+
+/**
+* Timer for determining when schedules should be run.
+*/
+class CCseSchedulerTimer : public CTimer
+{
+ public: // Constructors and destructors
+ /**
+ * Destructor.
+ */
+ virtual ~CCseSchedulerTimer();
+
+ /**
+ * Two-phased constructor.
+ * @param aObserver A pointer back to server engine through observer
+ */
+ static CCseSchedulerTimer* NewL( MCseSchedulerTimerObserver* aObserver );
+
+ public: // New methods
+ /**
+ * Sets timer to fire on given time
+ * @param aTime Time when timer is set to fire
+ * @return None
+ */
+ void SetTimer( const TTime& aTime );
+
+ private: // Constructors and destructors
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ /**
+ * C++ default constructor.
+ * @param aObserver A pointer back to server engine through observer.
+ */
+ CCseSchedulerTimer( MCseSchedulerTimerObserver* aObserver );
+
+ private: // Functions from base classes
+ /**
+ * RunL
+ * @return None
+ */
+ void RunL();
+
+ /**
+ * RunError
+ * @return See CTimer documentation.
+ */
+ TInt RunError( TInt aError );
+
+ /**
+ * DoCancel
+ * @return None
+ */
+ void DoCancel();
+
+ private: // Data
+ /**
+ * Pointer back to scheduler engine. Not own.
+ */
+ MCseSchedulerTimerObserver* iObserver;
+};
+
+#endif //_CCSESCHEDULERTIMER_H
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/inc/CCseSchedulerUniPluginController.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,118 @@
+/*
+* Copyright (c) 2006 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: Header for UniPluginController-class*
+*/
+
+
+
+
+#ifndef __CCSESCHEDULERUNIPLUGINCONTROLLER_H
+#define __CCSESCHEDULERUNIPLUGINCONTROLLER_H
+
+// INCLUDES
+#include "CCseSchedulerPluginControllerBase.h"
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+class CCseSchedulerPluginStarter;
+class CCseSchedulerLandLord;
+
+/**
+* Controller for plugins that can be only be in run one at the time
+*/
+class CCseSchedulerUniPluginController : public CCseSchedulerPluginControllerBase
+ {
+ public: // Constructors and destructor
+ /**
+ * Two-phased constructor.
+ * @params aEngine reference to engine
+ * @params aPluginUid plugin uid of the plugin this plugin controller is made for
+ * @return CCseSchedulerPluginControllerBase pointer to CCseSchedulerPluginControllerBase class
+ */
+ static CCseSchedulerUniPluginController* NewL( CCseSchedulerServerEngine& aEngine, TInt32 aPluginUid );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CCseSchedulerUniPluginController();
+
+
+ public: // from CCseSchedulerPluginControllerBase
+
+ void ClearControllerL();
+
+ TBool IsControllerActive();
+
+ void RunPluginsL() ;
+
+ void SetSchedulesL( RPointerArray<CCseScheduledProgram>& aScheduleArray );
+
+ void ScheduleCompletedL( const TUint32 aDbIdentifier, TInt aCompletitionCode );
+
+ void TimerErrorL( const TInt32 aError );
+
+ private: // Constructors and destructor
+ /**
+ * C++ default constructor.
+ */
+ CCseSchedulerUniPluginController( CCseSchedulerServerEngine& aEngine, TInt32 aPluginUid );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ private: // New methods
+ /**
+ * Handles succesfully completed schedules.
+ * @param aDbIdentifier DbIdentifier of schedule just completed
+ */
+ void ScheduleCompletedSuccesfullyL( const TUint32 aDbIdentifier );
+
+ /**
+ * Handles failed schedules.
+ * @param aDbIdentifier DbIdentifier of schedule just completed
+ * @param aCompletitionCode Error code of the completed schedule.
+ */
+ void HandleScheduleErrorL( const TUint32 aDbIdentifier,
+ TUint32 aCompletitionCode );
+ private: // Data
+
+ /**
+ * LandLord. Owns data that is given to new thread and acts as observer to thread.
+ * Own.
+ */
+ CCseSchedulerLandLord* iLandLord;
+
+ /**
+ * Boolean representing if the LandLord is active or not.
+ */
+ TBool iIsLandLordWorking;
+ };
+
+#endif // __CCSESCHEDULERUNIPLUGINCONTROLLER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/inc/CCseSemaphoreController.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,124 @@
+/*
+* Copyright (c) 2006 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: Semaphore controller. Checks once a while if given semaphore is*
+*/
+
+
+
+
+#ifndef __CCSESEMAPHORECONTROLLER_H
+#define __CCSESEMAPHORECONTROLLER_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+// None.
+
+// MACROS
+// None.
+
+// DATA TYPES
+// None
+
+// FUNCTION PROTOTYPES
+// None.
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+class RSemaphore;
+class MCseSemaphoreSignalObserver;
+
+/**
+* CCseSemaphoreController
+*
+* @lib
+*/
+class CCseSemaphoreController : public CTimer
+ {
+ public: // Constructors and destructors
+ /**
+ * Destructor.
+ */
+ virtual ~CCseSemaphoreController();
+
+ /**
+ * Two-phased constructor.
+ * @param aSemaphore Semaphore to be followed.
+ * @param aObserver A pointer back to server engine through observer.
+ */
+ static CCseSemaphoreController* NewL( RSemaphore& aSemaphore,
+ MCseSemaphoreSignalObserver& aObserver );
+
+ /**
+ * Starts checking if semaphore is signalled. Default interval is 5000ms.
+ */
+ void Start( );
+
+ /**
+ * Stops checking semaphore.
+ */
+ void Stop( );
+
+ private: // Constructors and destructors
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ /**
+ * C++ default constructor.
+ * @param aSemaphore Semaphore to be followed.
+ * @param aObserver A pointer back to server engine through observer.
+ */
+ CCseSemaphoreController( RSemaphore& aSemaphore,
+ MCseSemaphoreSignalObserver& aObserver );
+
+ private: // Functions from base classes
+ /**
+ * RunL
+ * @return None
+ */
+ void RunL();
+
+ /**
+ * Sets new interval how often semaphore signal is checked. Doesn't restart
+ * checking automatically.
+ * @param aInterval Interval how often semaphore signal is checked in milliseconds.
+ */
+ void SetInterval( TUint aInterval );
+
+ private: // data
+
+ /**
+ * Semaphore under observation.
+ */
+ RSemaphore& iSemaphore;
+
+ /**
+ * Reference to observer.
+ */
+ MCseSemaphoreSignalObserver& iObserver;
+
+ /**
+ * Interval how often semaphore signal is checked in milliseconds.
+ * Default is 5000 ms.
+ */
+ TUint iInterval;
+ };
+
+
+#endif // __CCSESEMAPHORECONTROLLER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/inc/CseSchedulerServer.pan Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2005 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:
+*
+*/
+
+
+
+
+
+#ifndef __CSESCHEDULERSERVER_PAN__
+#define __CSESCHEDULERSERVER_PAN__
+
+/** CseEngineServer panic codes */
+enum TCseSchedulerServPanic
+ {
+ ECsePanicBadRequest = 1,
+ ECsePanicBadDescriptor,
+ ECreateTrapCleanup,
+ ECseCreateTrapCleanup,
+ ECseSrvCreateServer,
+ ECsePanicBadSubSessionHandle,
+ ECsePanicCouldNotCreatePrivateDir
+ };
+
+#endif // __CSESCHEDULERSERVER_PAN__
+
+// End of File
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/inc/MCsePluginControllerObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,81 @@
+/*
+* Copyright (c) 2006 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: Observer to inform common scheduling engine when plugin is*
+*/
+
+
+
+
+#ifndef __MCSEPLUGINCONTROLLEROBSERVER_H__
+#define __MCSEPLUGINCONTROLLEROBSERVER_H__
+
+class CCseSchedulerPluginControllerBase;
+
+// CLASS DECLARATION
+/**
+* MCsePluginControllerObserver
+* This class offers plugin controller some of the engine's utilities.
+*/
+class MCsePluginControllerObserver
+ {
+ public: // New functions
+ /**
+ * Method to inform succesfully completed schedules.
+ * @param aDbIdentifier Identifier of the schedule that has
+ * completed.
+ */
+ virtual void ScheduleCompletedSuccesfullyL( const TUint32 aDbIdentifier ) = 0;
+
+ /**
+ * Method to inform failed schedules.
+ * @param aDbIdentifier Identifier of the schedule that has
+ * completed.
+ */
+ virtual void ScheduleCompletedWithErrorL( const TUint32 aDbIdentifier,
+ TUint32 aErrorCode ) = 0;
+
+ /**
+ * Orders engine to increase run count of given shedule.
+ * @param aDbIdentifier Identifier of the schedule who's run
+ * needs to be incremented.
+ */
+ virtual void IncreaseScheduleRunCountL( const TUint32 aDbIdentifier ) = 0;
+
+ /**
+ * Asks from engine if given schedule can be run
+ * @param aDbIdentifier Identifier of the schedule to be checked.
+ * @return boolean value representing if schedule can be run or not.
+ */
+ virtual TBool IsAllowedToRun( const TUint32 aDbIdentifier ) = 0;
+
+ /**
+ * Reports not valid schedule to engine (schedule cannot be run anymore).
+ * @param aDbIdentifier Reported schedules identifier.
+ */
+ virtual void ScheduleNotValid( const TUint32 aDbIdentifier ) = 0;
+
+ /**
+ * Requests rescheduling for plugin controllers
+ */
+ virtual void RequestReschedule( ) = 0;
+
+ /**
+ * Signals when plugin controller clearing is done.
+ */
+ virtual void ClearingDone( ) = 0;
+ };
+
+#endif // __MCSEPLUGINCONTROLLEROBSERVER_H__
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/inc/MCseSchedulerTimerObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,55 @@
+/*
+* Copyright (c) 2006 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:
+*
+*/
+
+
+
+
+#ifndef __MCSESCHEDULERTIMEROBSERVER_H__
+#define __MCSESCHEDULERTIMEROBSERVER_H__
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+/**
+* MCseSchedulerTimerObserver
+* This class specifies the function to be called when a timeout occurs.
+* Used in conjunction with CCseSchedulerTimer class.
+*/
+class MCseSchedulerTimerObserver
+ {
+ public: // New functions
+ /**
+ * Called when time is up and plugins should be run.
+ *
+ */
+ virtual void RunPluginsL( ) = 0;
+
+ /**
+ * Informs about time errors (time changes, timer is set towards time already
+ * in past),
+ * @parms aError timer error code. Most common are:
+ * KErrAbort - Phone time has changed
+ * KErrUnderflow - Time is in the past
+ * KErrOverFlow - Time is too far in the future
+ */
+ virtual void TimerErrorL( TInt32 aError ) = 0;
+ };
+
+#endif // __MCSESCHEDULERTIMEROBSERVER_H__
+
+// End of File
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/inc/MCseSemaphoreSignalObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2006 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: Observer to inform plugin starter that it is time shutdown*
+*/
+
+
+
+
+#ifndef __MCSESEMAPHORESIGNALOBSERVER_H__
+#define __MCSESEMAPHORESIGNALOBSERVER_H__
+
+// CLASS DECLARATION
+/**
+* MCseSemaphoreSignalObserver
+* Observer interface to be called once observed semaphore is signalled
+*/
+class MCseSemaphoreSignalObserver
+ {
+ public: // New functions
+ /**
+ * Called when observed semaphore is signalled.
+ */
+ virtual void SemaphoreSignalled( ) = 0;
+ };
+
+#endif // __MCSESEMAPHORESIGNALOBSERVER_H__
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/rom/videoschedulerserver.iby Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+
+#ifndef __VIDEOSCHEDULERSERVER_IBY__
+#define __VIDEOSCHEDULERSERVER_IBY__
+
+#include <data_caging_paths_for_iby.hrh>
+
+file=ABI_DIR\BUILD_DIR\CseSchedulerServer.exe PROGRAMS_DIR\CseSchedulerServer.exe
+
+#endif // __VIDEOSCHEDULERSERVER_IBY__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/src/CCseScheduleDB.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,2064 @@
+/*
+* Copyright (c) 2006 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: Database where to store scheduled events.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCseScheduleDB.h" // Header file for this class
+#include <ipvideo/CCseScheduledProgram.h> // Represent one schedule in database
+#include <bautils.h>
+#include "CseDebug.h" // Debug macros
+#include <babackup.h>
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None
+
+// CONSTANTS
+_LIT( KCseCDiskPrefix, "c:" );
+_LIT( KCseSqlGetAll, "SELECT * FROM ScheduleEvent");
+_LIT( KCseSelectFromDb, "SELECT * FROM " );
+_LIT( KCseWhere, " WHERE " );
+_LIT( KCseEqual, " = " );
+_LIT( KCseOrderBy, " ORDER BY " );
+_LIT( KCseAnd, " AND " );
+_LIT( KCseLess, " < " );
+_LIT( KCseMore, " > " );
+
+static TUint KScheduleNameMaxLength = 255;
+static TUint KCseDatbaseVersionNumber = 1;
+
+// MACROS
+// None
+
+// LOCAL CONSTANTS AND MACROS
+// None
+
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// ============================ MEMBER FUNCTIONS ===============================
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::CCseScheduleDB()
+//
+// ---------------------------------------------------------------------------
+CCseScheduleDB::CCseScheduleDB() : iDbAccess( ECseDbOpen )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::CCseScheduleDB");
+ // Default C++ Constructor
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::CCseScheduleDB");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::~CCseScheduleDB()
+//
+// ---------------------------------------------------------------------------
+CCseScheduleDB::~CCseScheduleDB()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::~CCseScheduleDB");
+
+ iScheduleDb.Close();
+ delete iScheduleFileStore;
+ iFsSession.Close();
+
+ if( iCompactTimer )
+ {
+ iCompactTimer->Cancel();
+ delete iCompactTimer;
+ }
+ delete iBackupWrapper;
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::~CCseScheduleDB");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::NewL()
+//
+// ---------------------------------------------------------------------------
+CCseScheduleDB* CCseScheduleDB::NewL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::NewL");
+ CCseScheduleDB* self = new ( ELeave ) CCseScheduleDB();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::NewL");
+
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::ConstructL()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::ConstructL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::ConstructL");
+
+ User::LeaveIfError( iFsSession.Connect() );
+
+ iCompactTimer = CPeriodic::NewL( CActive::EPriorityStandard );
+
+ iBackupWrapper = CBaBackupSessionWrapper::NewL();
+
+ TRAPD( err, OpenOrCreateDbL() );
+
+ if ( err != KErrNone )
+ {
+ CSELOGSTRING2_HIGH_LEVEL( "CCseScheduleDB::ConstructL - Opening or creating the database FAILED: %d", err );
+
+ if ( err != KErrNoMemory &&
+ err != KErrLocked &&
+ err != KErrDisMounted &&
+ err != KErrDiskFull &&
+ err != KErrNotReady )
+ {
+ // Delete and recreate database file. Cannot recover other way.
+ CSELOGSTRING_HIGH_LEVEL( "CCseScheduleDB::ConstructL - deleting database" );
+ RemoveDbL();
+ CSELOGSTRING_HIGH_LEVEL( "CCseScheduleDB::ConstructL - recreating database" );
+ TRAPD( err, OpenOrCreateDbL() );
+ if ( err != KErrNone )
+ {
+ CSELOGSTRING2_HIGH_LEVEL( "CCseScheduleDB::ConstructL couldnt recreate database (%d), leaving", err );
+ User::Leave( err );
+ }
+ }
+ else
+ {
+ CSELOGSTRING2_HIGH_LEVEL( "CCseScheduleDB::ConstructL leaving (%d)", err );
+ User::Leave( err );
+ }
+ }
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::ConstructL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::RemoveDbL()
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::RemoveDbL()
+ {
+ delete iBackupWrapper;
+ iBackupWrapper = NULL;
+ iScheduleDb.Close();
+ delete iScheduleFileStore;
+ iScheduleFileStore = NULL;
+ if ( BaflUtils::FileExists( iFsSession, iDbFile ) )
+ {
+ TInt err( iFsSession.Delete( iDbFile ) );
+ CSELOGSTRING2_HIGH_LEVEL("CCseScheduleDB:: deleting database file, err = %d", err);
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::GetApplicationSchedulesL()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::GetApplicationSchedulesL( const TInt32 aAppUid,
+ RPointerArray<CCseScheduledProgram>& aArray )
+ {
+ CSELOGSTRING2_HIGH_LEVEL(">>>CCseScheduleDB::GetApplicationSchedulesL - AppUid: %d",
+ aAppUid);
+
+ LeaveIfDbLockedL();
+ ResetCompactTimer();
+
+ // Gets program occurence(s) that are going to happen next
+ // from database
+ TBuf<KCseCustomSqlLength> sqlStatement;
+ sqlStatement.Append( KCseSelectFromDb );
+ sqlStatement.Append( KCseScheduleTable );
+ sqlStatement.Append( KCseWhere );
+ sqlStatement.Append( KCseScheduleApplicationUIDCol );
+ sqlStatement.Append( KCseEqual );
+ sqlStatement.AppendNum( aAppUid );
+ sqlStatement.Append( KCseOrderBy );
+ sqlStatement.Append( KCseScheduleStartTimeCol );
+
+ // Order table based on start time
+ RDbView view;
+ CleanupClosePushL( view );
+ User::LeaveIfError( view.Prepare( iScheduleDb,
+ TDbQuery( sqlStatement ) ) );
+ User::LeaveIfError( view.EvaluateAll() );
+
+ view.FirstL();
+
+ CDbColSet* colSetOrder = view.ColSetL();
+ CleanupStack::PushL( colSetOrder );
+
+ // Get the SQL table indexes.
+ TDbColNo keyIndex = colSetOrder->ColNo( KCseScheduleDbKeyCol );
+ TDbColNo nameIndex = colSetOrder->ColNo( KCseScheduleNameCol );
+ TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol );
+ TDbColNo endTimeIndex = colSetOrder->ColNo( KCseScheduleEndTimeCol );
+ TDbColNo applicationUidIdIndex = colSetOrder->ColNo( KCseScheduleApplicationUIDCol );
+ TDbColNo plugInUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol );
+ TDbColNo applicationSpecificIndex = colSetOrder->ColNo( KCseScheduleApplicationSpecificCol );
+ TDbColNo scheduleTypeIndex = colSetOrder->ColNo( KCseScheduleTypeCol );
+ TDbColNo pluginTypeIndex = colSetOrder->ColNo( KCseSchedulePluginTypeCol );
+
+ CleanupStack::PopAndDestroy( colSetOrder );
+
+ // Loop through the tables
+ while ( view.AtRow() )
+ {
+ // Create new CCseSceduledProgram to be added to array
+ CCseScheduledProgram* prog = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( prog );
+
+ // Fill created schedule with DB information
+ view.GetL();
+ prog->SetDbIdentifier( view.ColUint32( keyIndex ) );
+ prog->SetName( view.ColDes8( nameIndex ) );
+ prog->SetStartTime( view.ColTime( startTimeIndex ) );
+ prog->SetEndTime( view.ColTime( endTimeIndex ) );
+ prog->SetAppUid( view.ColInt32( applicationUidIdIndex ) );
+ prog->SetPluginUid( view.ColInt32( plugInUidIndex ) );
+ prog->SetScheduleType( view.ColInt32( scheduleTypeIndex ) );
+ prog->SetPluginType( view.ColInt32( pluginTypeIndex ) );
+
+ TInt streamLen( 0 );
+ streamLen = view.ColLength( applicationSpecificIndex );
+
+ HBufC8* appDataBuffer = HBufC8::NewL( streamLen );
+
+ CleanupStack::PushL( appDataBuffer );
+
+ TPtr8 buffPtr( appDataBuffer->Des() );
+ RDbColReadStream readStream;
+ readStream.OpenLC( view, applicationSpecificIndex );
+ readStream.ReadL( buffPtr, streamLen );
+ readStream.Release();
+ CleanupStack::PopAndDestroy(); // readStream
+
+ prog->SetApplicationDataL( *appDataBuffer );
+
+ CleanupStack::PopAndDestroy( appDataBuffer );
+ User::LeaveIfError( aArray.Append( prog ) );
+ CleanupStack::Pop( prog );
+ view.NextL();
+ }
+
+ CleanupStack::PopAndDestroy( &view ); // Closes view
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetApplicationSchedulesL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::OpenOrCreateDbL()
+//
+// Create a new database.
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::OpenOrCreateDbL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::OpenOrCreateDbL");
+ TBuf<KMaxFileName> path;
+
+ // Get path to CSE's private directory
+ TInt err( iFsSession.PrivatePath( path ) );
+ if ( err != KErrNone )
+ {
+ CSELOGSTRING2_HIGH_LEVEL("iFsSession.PrivatePath() failed: %d", err );
+ User::Leave( err );
+ }
+
+ iDbFile.Zero();
+ iDbFile.Append( KCseCDiskPrefix );
+ iDbFile.Append( path );
+ if ( BaflUtils::CheckFolder( iFsSession, iDbFile ) != KErrNone )
+ {
+ err = iFsSession.CreatePrivatePath( EDriveC );
+ if ( err != KErrNone )
+ {
+ CSELOGSTRING2_HIGH_LEVEL( "CreatePrivatePath failed! %d", err );
+ User::Leave( err );
+ }
+ }
+
+ iDbFile.Append( KCseScheduleDBName() );
+
+ // If file doesn't exist create it
+ if ( !BaflUtils::FileExists( iFsSession, iDbFile ) )
+ {
+ CSELOGSTRING_HIGH_LEVEL("CCseScheduleDB::OpenOrCreateDbL Create New");
+ iScheduleDb.Close();
+
+ if( iScheduleFileStore )
+ {
+ delete iScheduleFileStore;
+ iScheduleFileStore = NULL;
+ }
+
+ iScheduleFileStore = CPermanentFileStore::ReplaceL( iFsSession,
+ iDbFile,
+ EFileRead|EFileWrite );
+ // Set file store type
+ iScheduleFileStore->SetTypeL( iScheduleFileStore->Layout() );
+ // Create stream object
+ TStreamId id = iScheduleDb.CreateL( iScheduleFileStore );
+ // Keep database id as root of store
+ iScheduleFileStore->SetRootL( id );
+ // Complete creation by commiting
+ iScheduleFileStore->CommitL();
+
+ CreateDatabaseTableL( iScheduleDb );
+ CreateScheduleTableL( iScheduleDb );
+ SetDatabaseVersionL( );
+ }
+ // Or if it exists then just open it.
+ else
+ {
+ iScheduleDb.Close();
+ delete iScheduleFileStore;
+ iScheduleFileStore = NULL;
+ iScheduleFileStore = CPermanentFileStore::OpenL( iFsSession, iDbFile,
+ EFileRead|EFileWrite );
+ iScheduleFileStore->SetTypeL( iScheduleFileStore->Layout() );
+ iScheduleDb.OpenL( iScheduleFileStore, iScheduleFileStore->Root() );
+ CheckDbVersionL();
+ User::LeaveIfError( iScheduleDb.Compact() );
+ }
+
+ if ( !iBackupWrapper )
+ {
+ iBackupWrapper = CBaBackupSessionWrapper::NewL();
+ }
+
+ iBackupWrapper->RegisterFileL( iDbFile, *this );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::OpenOrCreateDbL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::CheckDbVersionL
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::CheckDbVersionL( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::CheckDbVersionL");
+
+ TInt dbVersion( 0 );
+
+ TRAPD( leave, dbVersion = GetDbVersionL() );
+
+ if ( dbVersion != KCseDatbaseVersionNumber || leave != KErrNone )
+ {
+ CSELOGSTRING3_HIGH_LEVEL(
+ "CCseScheduleDB::CheckDbVersionL Not ok, version: %d, error: %d",
+ dbVersion, leave );
+
+ // Destroy the old one
+ iScheduleDb.Close();
+ delete iScheduleFileStore;
+ iScheduleFileStore = NULL;
+
+ // Create new one
+ iScheduleFileStore = CPermanentFileStore::ReplaceL( iFsSession,
+ iDbFile,
+ EFileRead|EFileWrite );
+
+ // Set file store type
+ iScheduleFileStore->SetTypeL( iScheduleFileStore->Layout() );
+ // Create stream object
+ TStreamId id = iScheduleDb.CreateL( iScheduleFileStore );
+ // Keep database id as root of store
+ iScheduleFileStore->SetRootL( id );
+ // Complete creation by commiting
+ iScheduleFileStore->CommitL();
+
+ CreateDatabaseTableL( iScheduleDb );
+ CreateScheduleTableL( iScheduleDb );
+ SetDatabaseVersionL( );
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::CheckDbVersionL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::GetDbVersionL
+//
+// ---------------------------------------------------------------------------
+TInt CCseScheduleDB::GetDbVersionL( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetDbVersionL");
+ LeaveIfDbLockedL();
+ ResetCompactTimer();
+ TInt dbVersion(0);
+
+ TBuf<KCseCustomSqlLength> sqlStatement;
+ sqlStatement.Append( KCseSelectFromDb );
+ sqlStatement.Append( KCseDatabaseTable );
+
+ // Order table based on start time
+ RDbView view;
+ CleanupClosePushL( view );
+ User::LeaveIfError( view.Prepare( iScheduleDb,
+ TDbQuery( sqlStatement ) ) );
+ User::LeaveIfError( view.EvaluateAll() );
+
+ // Get the next reminder
+ view.FirstL();
+
+ CDbColSet* colSetOrder = view.ColSetL();
+ CleanupStack::PushL( colSetOrder );
+
+ TDbColNo versionIndex = colSetOrder->ColNo( KCseDatabaseVersionCol );
+
+ CleanupStack::PopAndDestroy( colSetOrder );
+
+ if ( view.AtRow() )
+ {
+ view.GetL();
+ dbVersion = view.ColInt32( versionIndex );
+ }
+ CleanupStack::PopAndDestroy( &view ); // Closes view
+
+ CSELOGSTRING2_HIGH_LEVEL(
+ "<<<CCseScheduleDB::GetDbVersionL, version: %d",
+ dbVersion );
+ return dbVersion;
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::CreateScheduleTableL
+//
+// Creates Schedule table.
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::CreateScheduleTableL( RDbStoreDatabase& aDatabase ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::CreateScheduleTableL");
+
+ // Create columns for the database.
+ TDbCol keyCol( KCseScheduleDbKeyCol, EDbColUint32 );
+ keyCol.iAttributes = TDbCol::EAutoIncrement;
+
+ TDbCol nameCol( KCseScheduleNameCol, EDbColText8, KScheduleNameMaxLength );
+ TDbCol startTimeCol( KCseScheduleStartTimeCol, EDbColDateTime );
+ TDbCol endTimeCol( KCseScheduleEndTimeCol, EDbColDateTime );
+ TDbCol applicationUidCol( KCseScheduleApplicationUIDCol, EDbColInt32 );
+ TDbCol plugInUidCol( KCseSchedulePlugInUIDCol, EDbColInt32 );
+ TDbCol typeCol( KCseScheduleTypeCol, EDbColInt32 );
+ TDbCol applicationSpecificCol( KCseScheduleApplicationSpecificCol, EDbColLongBinary );
+ TDbCol runCountCol( KCseScheduleRunCountCol, EDbColInt32 );
+ TDbCol stateCol( KCseScheduleStateCol, EDbColInt32 );
+ TDbCol pluginTypeCol( KCseSchedulePluginTypeCol, EDbColInt32 );
+ TDbCol reserved1Col( KCseScheduleReserved1Col, EDbColInt32 );
+ TDbCol reserved2Col( KCseScheduleReserved2Col, EDbColInt32 );
+
+ // Create column set and add defined columns in to the set
+ CDbColSet* scheduleColSet = CDbColSet::NewLC();
+ scheduleColSet->AddL( keyCol );
+ scheduleColSet->AddL( nameCol );
+ scheduleColSet->AddL( startTimeCol );
+ scheduleColSet->AddL( endTimeCol );
+ scheduleColSet->AddL( applicationUidCol );
+ scheduleColSet->AddL( plugInUidCol );
+ scheduleColSet->AddL( typeCol );
+ scheduleColSet->AddL( applicationSpecificCol );
+ scheduleColSet->AddL( runCountCol );
+ scheduleColSet->AddL( stateCol );
+ scheduleColSet->AddL( pluginTypeCol );
+ scheduleColSet->AddL( reserved1Col );
+ scheduleColSet->AddL( reserved2Col );
+
+ // Create new table to the database with created columnset
+ User::LeaveIfError( aDatabase.CreateTable( KCseScheduleTable,
+ *scheduleColSet ) );
+
+ CleanupStack::PopAndDestroy( scheduleColSet );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::CreateScheduleTableL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::CreateDatabaseTableL
+//
+// Creates Database table.
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::CreateDatabaseTableL( RDbStoreDatabase& aDatabase )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::CreateDatabaseTableL");
+
+ // Create columns for the database.
+ TDbCol versionCol( KCseDatabaseVersionCol, EDbColInt32 );
+ TDbCol reserved1Col( KCseDatabaseReserved1Col, EDbColInt32 );
+ TDbCol reserved2Col( KCseDatabaseReserved2Col, EDbColInt32 );
+
+ // Create column set and add defined columns in to the set
+ CDbColSet* databaseColSet = CDbColSet::NewLC();
+ databaseColSet->AddL( versionCol );
+ databaseColSet->AddL( reserved1Col );
+ databaseColSet->AddL( reserved2Col );
+
+ // Create new table to the database with created columnset
+ User::LeaveIfError( aDatabase.CreateTable( KCseDatabaseTable,
+ *databaseColSet ) );
+
+ CleanupStack::PopAndDestroy( databaseColSet );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::CreateDatabaseTableL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::SetDatabaseVersionL
+//
+// Creates Database table.
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::SetDatabaseVersionL( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::SetDatabaseVersionL");
+
+ iSqlSchedule.Zero();
+ iSqlSchedule.Append( KCseSelectFromDb );
+ iSqlSchedule.Append( KCseDatabaseTable );
+
+ RDbView view;
+ CleanupClosePushL( view );
+
+ // Prepare DB for update
+ User::LeaveIfError(view.Prepare( iScheduleDb,
+ TDbQuery( iSqlSchedule ),
+ TDbWindow::EUnlimited,
+ RDbView::EInsertOnly ));
+ view.InsertL();
+
+ // Create colomn set (row) to be added
+ CDbColSet* databaseColSet = view.ColSetL();
+ CleanupStack::PushL( databaseColSet );
+
+ // Fill row with Schedule information
+ view.SetColL( databaseColSet->ColNo( KCseDatabaseVersionCol ),
+ KCseDatbaseVersionNumber );
+ CleanupStack::PopAndDestroy( databaseColSet );
+ view.PutL();
+ CleanupStack::PopAndDestroy( &view ); // closes view
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::SetDatabaseVersionL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::AddScheduleL()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::AddScheduleL( CCseScheduledProgram& aData )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::AddScheduleL");
+ LeaveIfDbLockedL();
+ ResetCompactTimer();
+
+ iSqlSchedule.Zero();
+ iSqlSchedule.Append( KCseSqlGetAll );
+ RDbView view;
+ CleanupClosePushL( view );
+
+ // Prepare DB for update
+ User::LeaveIfError(view.Prepare( iScheduleDb,
+ TDbQuery( iSqlSchedule ),
+ TDbWindow::EUnlimited,
+ RDbView::EInsertOnly ));
+ view.InsertL();
+
+ // Create colomn set (row) to be added
+ CDbColSet* scheduleColSet = view.ColSetL();
+ CleanupStack::PushL( scheduleColSet );
+
+ // Fill row with Schedule information
+ view.SetColL( scheduleColSet->ColNo( KCseScheduleNameCol ),
+ aData.Name() );
+
+ view.SetColL( scheduleColSet->ColNo( KCseScheduleStartTimeCol ),
+ aData.StartTime() );
+
+ view.SetColL( scheduleColSet->ColNo( KCseScheduleEndTimeCol ),
+ aData.EndTime() );
+
+ view.SetColL( scheduleColSet->ColNo( KCseScheduleApplicationUIDCol ),
+ aData.AppUid() );
+
+ view.SetColL( scheduleColSet->ColNo( KCseSchedulePlugInUIDCol ),
+ aData.PluginUid() );
+
+ view.SetColL( scheduleColSet->ColNo( KCseScheduleTypeCol ),
+ aData.ScheduleType() );
+
+ view.SetColL( scheduleColSet->ColNo( KCseScheduleRunCountCol ),
+ 0 );
+
+ view.SetColL( scheduleColSet->ColNo( KCseScheduleStateCol ),
+ ECseWaiting );
+
+ view.SetColL( scheduleColSet->ColNo( KCseSchedulePluginTypeCol ),
+ aData.PluginType() );
+
+ // Description is long one, it needs to be handled by stream
+ RDbColWriteStream write;
+ write.OpenLC( view, scheduleColSet->ColNo( KCseScheduleApplicationSpecificCol ) );
+ write.WriteL( aData.ApplicationData() );
+ write.CommitL();
+ CleanupStack::PopAndDestroy(); // write
+
+ TDbColNo keyColumnNo = scheduleColSet->ColNo( KCseScheduleDbKeyCol );
+ CleanupStack::PopAndDestroy( scheduleColSet );
+ view.PutL();
+
+ // Get new program key
+ aData.SetDbIdentifier( view.ColUint32( keyColumnNo ) );
+
+ CleanupStack::PopAndDestroy( &view ); // closes view
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::AddScheduleL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::RemoveScheduleL()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::RemoveScheduleL( const TUint32 aDbIdentifier )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::RemoveScheduleL");
+ LeaveIfDbLockedL();
+ ResetCompactTimer();
+
+ // Create SQL string to find given schedule from DB
+ TBuf<KCseCustomSqlLength> sqlStatement;
+ sqlStatement.Append( KCseSelectFromDb );
+ sqlStatement.Append( KCseScheduleTable );
+ sqlStatement.Append( KCseWhere );
+ sqlStatement.Append( KCseScheduleDbKeyCol );
+ sqlStatement.Append( KCseEqual );
+ sqlStatement.AppendNum( aDbIdentifier );
+
+ User::LeaveIfError( iScheduleDb.Begin() );
+
+ // Prepare DB to update
+ RDbView view;
+ CleanupClosePushL( view );
+ User::LeaveIfError( view.Prepare( iScheduleDb,
+ TDbQuery( sqlStatement ) ) );
+ User::LeaveIfError( view.EvaluateAll() );
+
+ view.FirstL();
+
+ TInt count( 0 );
+
+ // If schedule found, remove it.
+ while ( view.AtRow() )
+ {
+ view.DeleteL();
+ count++;
+ view.NextL();
+ }
+
+ CleanupStack::PopAndDestroy( &view ); // closes view
+ User::LeaveIfError( iScheduleDb.Commit() );
+
+ CSELOGSTRING3_HIGH_LEVEL("---- %d Items for identifier %d removed from DB", count, aDbIdentifier);
+ if ( count == 0 )
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::RemoveScheduleL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::GetNextScheduleTimeL()
+//
+// ---------------------------------------------------------------------------
+TTime CCseScheduleDB::GetNextScheduleTimeL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetNextScheduleTimeL");
+ LeaveIfDbLockedL();
+ ResetCompactTimer();
+
+ // Create SQL satring to get schedule occurence(s) that are
+ // going to happen next from database.
+ TTime nextScheduleTime( 0 );
+ TBuf<KCseCustomSqlLength> sqlStatement;
+ sqlStatement.Append( KCseSelectFromDb );
+ sqlStatement.Append( KCseScheduleTable );
+ sqlStatement.Append( KCseWhere );
+ sqlStatement.Append( KCseScheduleStateCol );
+ sqlStatement.Append( KCseEqual );
+ sqlStatement.AppendNum( ECseWaiting );
+ sqlStatement.Append( KCseOrderBy );
+ sqlStatement.Append( KCseScheduleStartTimeCol );
+
+ // Order table based on start time
+ RDbView view;
+ CleanupClosePushL( view );
+ User::LeaveIfError( view.Prepare( iScheduleDb,
+ TDbQuery( sqlStatement ) ) );
+ User::LeaveIfError( view.EvaluateAll() );
+
+ // Get the next schedule
+ view.FirstL();
+
+ CDbColSet* colSetOrder = view.ColSetL();
+ CleanupStack::PushL( colSetOrder );
+
+ TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol );
+
+ CleanupStack::PopAndDestroy( colSetOrder );
+
+ // Schedule found get its start time.
+ if ( view.AtRow() )
+ {
+ view.GetL();
+ nextScheduleTime = view.ColTime( startTimeIndex );
+ }
+
+ CleanupStack::PopAndDestroy( &view ); // Closes view
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetNextScheduleTimeL");
+
+ return nextScheduleTime;
+ }
+
+
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::FillScheduleArrayByTimeL()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::FillScheduleArrayByTimeL( const TTime& aScheduleTime,
+ RPointerArray<CCseScheduledProgram>& aNextScheduleArray )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::FillScheduleArrayByTimeL");
+ LeaveIfDbLockedL();
+ ResetCompactTimer();
+
+ // Gets program occurence(s) that are going to happen next
+ // from database
+ TBuf<100> startTimeBuf;
+
+ _LIT( KDateTimeFormat,"# %1%*D/%2%*M/%3%*Y %H:%T:%S.%C#" );
+
+ aScheduleTime.FormatL( startTimeBuf, KDateTimeFormat );
+
+ // Create SQL string to get all schedules to be happen at given time
+ TBuf<KCseCustomSqlLength> sqlStatement;
+ sqlStatement.Append( KCseSelectFromDb );
+ sqlStatement.Append( KCseScheduleTable );
+ sqlStatement.Append( KCseWhere );
+ sqlStatement.Append( KCseScheduleStartTimeCol );
+ sqlStatement.Append( KCseEqual );
+ sqlStatement.Append( startTimeBuf );
+
+ // Order table based on start time
+ RDbView view;
+ CleanupClosePushL( view );
+ User::LeaveIfError( view.Prepare( iScheduleDb,
+ TDbQuery( sqlStatement ) ) );
+ User::LeaveIfError( view.EvaluateAll() );
+
+ // Get the next reminder
+ view.FirstL();
+
+ CDbColSet* colSetOrder = view.ColSetL();
+ CleanupStack::PushL( colSetOrder );
+
+ // Get column indexes
+ TDbColNo keyIndex = colSetOrder->ColNo( KCseScheduleDbKeyCol );
+ TDbColNo nameIndex = colSetOrder->ColNo( KCseScheduleNameCol );
+ TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol );
+ TDbColNo endTimeIndex = colSetOrder->ColNo( KCseScheduleEndTimeCol );
+ TDbColNo applicationUidIdIndex = colSetOrder->ColNo( KCseScheduleApplicationUIDCol );
+ TDbColNo plugInUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol );
+ TDbColNo typeIndex = colSetOrder->ColNo( KCseScheduleTypeCol );
+ TDbColNo applicationSpecificIndex = colSetOrder->ColNo( KCseScheduleApplicationSpecificCol );
+ TDbColNo pluginTypeIndex = colSetOrder->ColNo( KCseSchedulePluginTypeCol );
+
+ CleanupStack::PopAndDestroy( colSetOrder );
+
+ // Loop through all found schedules.
+ while ( view.AtRow() )
+ {
+ // Create new schedule to be added to array
+ CCseScheduledProgram* prog = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( prog );
+ view.GetL();
+
+ // Copy information from DB to schedule.
+ prog->SetDbIdentifier( view.ColUint32( keyIndex ) );
+ prog->SetName( view.ColDes8( nameIndex ) );
+ prog->SetStartTime( view.ColTime( startTimeIndex ) );
+ prog->SetEndTime( view.ColTime( endTimeIndex ) );
+ prog->SetAppUid( view.ColInt32( applicationUidIdIndex ) );
+ prog->SetPluginUid( view.ColInt32( plugInUidIndex ) );
+ prog->SetScheduleType( CCseScheduledProgram::TCseScheduleType(
+ view.ColInt32( typeIndex ) ) );
+ prog->SetPluginType( CCseScheduledProgram::TCsePluginType(
+ view.ColInt32( pluginTypeIndex ) ) );
+ TInt streamLen( view.ColLength( applicationSpecificIndex ) );
+
+ HBufC8* appDataBuffer = HBufC8::NewL( streamLen );
+ CleanupStack::PushL( appDataBuffer );
+
+ TPtr8 buffPtr( appDataBuffer->Des() );
+ RDbColReadStream readStream;
+ readStream.OpenLC( view, applicationSpecificIndex );
+ readStream.ReadL( buffPtr, streamLen );
+ readStream.Release();
+ CleanupStack::PopAndDestroy(); // readStream;
+
+ prog->SetApplicationDataL( *appDataBuffer );
+
+ CleanupStack::PopAndDestroy( appDataBuffer );
+ User::LeaveIfError( aNextScheduleArray.Append( prog ) );
+ CleanupStack::Pop( prog );
+
+ // And next schedule...
+ view.NextL();
+ }
+
+ CleanupStack::PopAndDestroy( &view ); // Closes view
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::FillScheduleArrayByTimeL");
+ }
+
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::GetScheduleByDbIdentifierL()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::GetScheduleByDbIdentifierL( const TUint32 aDbIdentifier,
+ CCseScheduledProgram* aSchedule )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetScheduleByDbIdentifierL");
+ LeaveIfDbLockedL();
+ ResetCompactTimer();
+
+ if ( !aSchedule )
+ {
+ return;
+ }
+
+ TBuf<KCseCustomSqlLength> sqlStatement;
+ sqlStatement.Append( KCseSelectFromDb );
+ sqlStatement.Append( KCseScheduleTable );
+ sqlStatement.Append( KCseWhere );
+ sqlStatement.Append( KCseScheduleDbKeyCol );
+ sqlStatement.Append( KCseEqual );
+ sqlStatement.AppendNum( aDbIdentifier );
+
+ // Order table based on start time
+ RDbView view;
+ CleanupClosePushL( view );
+ User::LeaveIfError( view.Prepare( iScheduleDb,
+ TDbQuery( sqlStatement ) ) );
+ User::LeaveIfError( view.EvaluateAll() );
+
+ // Get the next reminder
+ view.FirstL();
+
+ CDbColSet* colSetOrder = view.ColSetL();
+ CleanupStack::PushL( colSetOrder );
+
+ TDbColNo keyIndex = colSetOrder->ColNo( KCseScheduleDbKeyCol );
+ TDbColNo nameIndex = colSetOrder->ColNo( KCseScheduleNameCol );
+ TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol );
+ TDbColNo endTimeIndex = colSetOrder->ColNo( KCseScheduleEndTimeCol );
+ TDbColNo applicationUidIdIndex = colSetOrder->ColNo( KCseScheduleApplicationUIDCol );
+ TDbColNo plugInUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol );
+ TDbColNo typeIndex = colSetOrder->ColNo( KCseScheduleTypeCol );
+ TDbColNo applicationSpecificIndex = colSetOrder->ColNo( KCseScheduleApplicationSpecificCol );
+ TDbColNo pluginTypeIndex = colSetOrder->ColNo( KCseSchedulePluginTypeCol );
+
+ CleanupStack::PopAndDestroy( colSetOrder );
+
+ while ( view.AtRow() )
+ {
+ view.GetL();
+ aSchedule->SetDbIdentifier( view.ColUint32( keyIndex ) );
+ aSchedule->SetName( view.ColDes8( nameIndex ) );
+ aSchedule->SetStartTime( view.ColTime( startTimeIndex ) );
+ aSchedule->SetEndTime( view.ColTime( endTimeIndex ) );
+ aSchedule->SetAppUid( view.ColInt32( applicationUidIdIndex ) );
+ aSchedule->SetPluginUid( view.ColInt32( plugInUidIndex ) );
+
+ aSchedule->SetScheduleType( CCseScheduledProgram::TCseScheduleType(
+ view.ColInt32( typeIndex ) ) );
+ aSchedule->SetPluginType( CCseScheduledProgram::TCsePluginType(
+ view.ColInt32( pluginTypeIndex ) ) );
+
+ TInt streamLen( 0 );
+ streamLen = view.ColLength( applicationSpecificIndex );
+
+ HBufC8* appDataBuffer = HBufC8::NewL( streamLen );
+ CleanupStack::PushL( appDataBuffer );
+
+ TPtr8 buffPtr( appDataBuffer->Des() );
+ RDbColReadStream readStream;
+ readStream.OpenLC( view, applicationSpecificIndex ); // |->1
+ readStream.ReadL(buffPtr, streamLen);
+ readStream.Release();
+ CleanupStack::PopAndDestroy( ); // 1<-| Popping pointer to Col that we dont have here
+ TPtrC8 ptr8( appDataBuffer->Des() );
+ aSchedule->SetApplicationDataL( *appDataBuffer );
+ CleanupStack::PopAndDestroy( appDataBuffer );
+ view.NextL();
+ }
+
+ CleanupStack::PopAndDestroy( &view ); // Closes view
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetScheduleByDbIdentifierL");
+ }
+
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::GetOverlappingSchedulesL()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::GetOverlappingSchedulesL( const TInt32 aType,
+ const TTime& aStartTime,
+ const TTime& aEndTime,
+ RPointerArray<CCseScheduledProgram>& aResultArray
+ )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetOverlappingSchedulesL");
+ LeaveIfDbLockedL();
+ ResetCompactTimer();
+
+ TBuf<100> startTimeBuf;
+ _LIT( KDateTimeFormat,"# %1%*D/%2%*M/%3%*Y %H:%T:%S#" );
+ aStartTime.FormatL( startTimeBuf, KDateTimeFormat );
+ TBuf<100> endTimeBuf;
+ aEndTime.FormatL( endTimeBuf, KDateTimeFormat );
+
+ // Create SQL string to find all overlapping schedules from database between given
+ // timeframe.
+ TBuf<KCseCustomSqlLength> sqlStatement;
+ sqlStatement.Append( KCseSelectFromDb );
+ sqlStatement.Append( KCseScheduleTable );
+ sqlStatement.Append( KCseWhere );
+ sqlStatement.Append( KCseScheduleTypeCol );
+ sqlStatement.Append( KCseEqual );
+ sqlStatement.AppendNum( aType );
+ sqlStatement.Append( KCseAnd );
+ sqlStatement.Append( KCseScheduleStartTimeCol );
+ sqlStatement.Append( KCseLess );
+ sqlStatement.Append( endTimeBuf );
+ sqlStatement.Append( KCseAnd );
+ sqlStatement.Append( KCseScheduleEndTimeCol );
+ sqlStatement.Append( KCseMore );
+ sqlStatement.Append( startTimeBuf );
+ sqlStatement.Append( KCseOrderBy );
+ sqlStatement.Append( KCseScheduleStartTimeCol );
+
+ // Order table
+ RDbView view;
+ CleanupClosePushL( view );
+ User::LeaveIfError( view.Prepare( iScheduleDb,
+ TDbQuery( sqlStatement ) ) );
+ User::LeaveIfError( view.EvaluateAll() );
+
+ // Move to the first row
+ view.FirstL();
+
+ CDbColSet* colSetOrder = view.ColSetL();
+ CleanupStack::PushL( colSetOrder );
+
+ // Get colon indexes.
+ TDbColNo keyIndex = colSetOrder->ColNo( KCseScheduleDbKeyCol );
+ TDbColNo nameIndex = colSetOrder->ColNo( KCseScheduleNameCol );
+ TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol );
+ TDbColNo endTimeIndex = colSetOrder->ColNo( KCseScheduleEndTimeCol );
+ TDbColNo applicationUidIdIndex = colSetOrder->ColNo( KCseScheduleApplicationUIDCol );
+ TDbColNo plugInUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol );
+ TDbColNo typeIndex = colSetOrder->ColNo( KCseScheduleTypeCol );
+ TDbColNo applicationSpecificIndex = colSetOrder->ColNo( KCseScheduleApplicationSpecificCol );
+ TDbColNo pluginTypeIndex = colSetOrder->ColNo( KCseSchedulePluginTypeCol );
+
+ CleanupStack::PopAndDestroy( colSetOrder );
+
+ // Loop through all found schedules.
+ while ( view.AtRow() )
+ {
+ // Create new schedule to be added to array.
+ CCseScheduledProgram* schedule = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( schedule );
+ view.GetL();
+
+ // Set schedule information.
+ schedule->SetDbIdentifier( view.ColUint32( keyIndex ) );
+ schedule->SetName( view.ColDes8( nameIndex ) );
+ schedule->SetStartTime( view.ColTime( startTimeIndex ) );
+ schedule->SetEndTime( view.ColTime( endTimeIndex ) );
+ schedule->SetAppUid( view.ColInt32( applicationUidIdIndex ) );
+ schedule->SetPluginUid( view.ColInt32( plugInUidIndex ) );
+
+ schedule->SetScheduleType( CCseScheduledProgram::TCseScheduleType(
+ view.ColInt32( typeIndex ) ) );
+ schedule->SetPluginType( CCseScheduledProgram::TCsePluginType(
+ view.ColInt32( pluginTypeIndex ) ) );
+
+ TInt streamLen( 0 );
+ streamLen = view.ColLength( applicationSpecificIndex );
+
+ HBufC8* appDataBuffer = HBufC8::NewL( streamLen );
+ CleanupStack::PushL( appDataBuffer );
+
+ TPtr8 buffPtr( appDataBuffer->Des() );
+ RDbColReadStream readStream; // |->1
+ readStream.OpenLC( view, applicationSpecificIndex );
+ readStream.ReadL(buffPtr, streamLen);
+ readStream.Release();
+ CleanupStack::PopAndDestroy( ); // 1<-| Popping pointer to Col that we dont have here
+ TPtrC8 ptr8( appDataBuffer->Des() );
+ schedule->SetApplicationDataL( *appDataBuffer );
+ CleanupStack::PopAndDestroy( appDataBuffer );
+ if ( schedule->StartTime() < aEndTime && schedule->EndTime() > aStartTime )
+ {
+ aResultArray.AppendL( schedule );
+ CleanupStack::Pop( schedule );
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy( schedule );
+ schedule = NULL;
+ }
+
+ // Next shcedule...
+ view.NextL();
+ }
+ CleanupStack::PopAndDestroy( &view ); // Closes view
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetOverlappingSchedulesL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::IncreaseRunCountL()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::IncreaseRunCountL( const TUint32 aDbIdentifier )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::IncreaseRunCountL");
+ LeaveIfDbLockedL();
+ ResetCompactTimer();
+
+ // Create SQL string to find given schedule
+ TBuf<KCseCustomSqlLength> sqlStatement;
+ sqlStatement.Append( KCseSelectFromDb );
+ sqlStatement.Append( KCseScheduleTable );
+ sqlStatement.Append( KCseWhere );
+ sqlStatement.Append( KCseScheduleDbKeyCol );
+ sqlStatement.Append( KCseEqual );
+ sqlStatement.AppendNum( aDbIdentifier );
+
+ // Order table based on DB identifier
+ RDbView readView;
+ CleanupClosePushL( readView );
+
+ User::LeaveIfError( readView.Prepare( iScheduleDb,
+ TDbQuery( sqlStatement ) ) );
+ User::LeaveIfError( readView.EvaluateAll() );
+
+ // Get the next reminder
+ readView.FirstL();
+
+ // First we read existint run count
+ CDbColSet* readColSet = readView.ColSetL();
+ CleanupStack::PushL( readColSet );
+ TDbColNo runCountCol = readColSet->ColNo( KCseScheduleRunCountCol );
+ CleanupStack::PopAndDestroy( readColSet );
+ TInt32 runCount( 0 );
+ if ( readView.AtRow() )
+ {
+ readView.GetL();
+ runCount = readView.ColInt32( runCountCol );
+ runCount++;
+ }
+ // Close read view
+ CleanupStack::PopAndDestroy( &readView );
+
+ // Update run count
+ if ( runCount > 0 )
+ {
+ // Open write view
+ RDbView writeView;
+ CleanupClosePushL( writeView );
+ User::LeaveIfError( writeView.Prepare( iScheduleDb,
+ TDbQuery( sqlStatement ),
+ TDbWindow::EUnlimited,
+ RDbView::EUpdatable ));
+ User::LeaveIfError( writeView.EvaluateAll() );
+
+ writeView.FirstL();
+ CDbColSet* writeColSet = writeView.ColSetL();
+ CleanupStack::PushL( writeColSet );
+ TDbColNo runCountColNo = writeColSet->ColNo( KCseScheduleRunCountCol );
+ CleanupStack::PopAndDestroy( writeColSet );
+
+ writeView.UpdateL();
+
+ // If we found (as we should) schedule again we update its value.
+ if ( writeView.AtRow() )
+ {
+ writeView.SetColL( runCountColNo, runCount );
+ }
+
+ writeView.PutL();
+
+ CleanupStack::PopAndDestroy( &writeView );
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::IncreaseRunCountL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::GetRunCountL()
+//
+// ---------------------------------------------------------------------------
+TInt32 CCseScheduleDB::GetRunCountL( const TUint32 aDbIdentifier )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetRunCountL");
+ LeaveIfDbLockedL();
+ ResetCompactTimer();
+
+ TInt32 runCount( 0 );
+
+ // Create SQL string to find given schedule
+ TBuf<KCseCustomSqlLength> sqlStatement;
+ sqlStatement.Append( KCseSelectFromDb );
+ sqlStatement.Append( KCseScheduleTable );
+ sqlStatement.Append( KCseWhere );
+ sqlStatement.Append( KCseScheduleDbKeyCol );
+ sqlStatement.Append( KCseEqual );
+ sqlStatement.AppendNum( aDbIdentifier );
+
+ // Order table based on start time
+ RDbView view;
+ CleanupClosePushL( view );
+ User::LeaveIfError( view.Prepare( iScheduleDb,
+ TDbQuery( sqlStatement ) ) );
+ User::LeaveIfError( view.EvaluateAll() );
+
+ // Get the next reminder
+ view.FirstL();
+
+ CDbColSet* colSetOrder = view.ColSetL();
+ CleanupStack::PushL( colSetOrder );
+
+ TDbColNo runCountCol = colSetOrder->ColNo( KCseScheduleRunCountCol );
+
+ CleanupStack::PopAndDestroy( colSetOrder );
+
+ // If we found schedule get its run count.
+ if ( view.AtRow() )
+ {
+ view.GetL();
+
+ runCount = view.ColInt32( runCountCol );
+ }
+
+ CleanupStack::PopAndDestroy( &view ); // Closes view
+
+ CSELOGSTRING2_HIGH_LEVEL("<<<CCseScheduleDB::GetRunCountL: runCount=%d", runCount);
+
+ return runCount;
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::SetScheduleStateL()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::SetScheduleStateL( const TUint32 aDbIdentifier,
+ const TInt32 aState )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::SetScheduleStateL");
+ LeaveIfDbLockedL();
+ ResetCompactTimer();
+
+ // Create SQL string to find given schedule
+ TBuf<KCseCustomSqlLength> sqlStatement;
+ sqlStatement.Append( KCseSelectFromDb );
+ sqlStatement.Append( KCseScheduleTable );
+ sqlStatement.Append( KCseWhere );
+ sqlStatement.Append( KCseScheduleDbKeyCol );
+ sqlStatement.Append( KCseEqual );
+ sqlStatement.AppendNum( aDbIdentifier );
+
+ // Open write view
+ RDbView writeView;
+ CleanupClosePushL( writeView );
+ User::LeaveIfError( writeView.Prepare( iScheduleDb,
+ TDbQuery( sqlStatement ),
+ TDbWindow::EUnlimited,
+ RDbView::EUpdatable ));
+ User::LeaveIfError( writeView.EvaluateAll() );
+
+ writeView.FirstL();
+ CDbColSet* writeColSet = writeView.ColSetL();
+ CleanupStack::PushL( writeColSet );
+ TDbColNo stateColNo = writeColSet->ColNo( KCseScheduleStateCol );
+ CleanupStack::PopAndDestroy( writeColSet );
+
+ writeView.UpdateL();
+
+ // If we found schedule, we change the column value.
+ if ( writeView.AtRow() )
+ {
+ writeView.SetColL( stateColNo, aState );
+ }
+
+ writeView.PutL();
+ CleanupStack::PopAndDestroy( &writeView );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::SetScheduleStateL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::GetScheduleStateL()
+//
+// ---------------------------------------------------------------------------
+TInt32 CCseScheduleDB::GetScheduleStateL( const TUint32 aDbIdentifier )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetScheduleStateL");
+ LeaveIfDbLockedL();
+ ResetCompactTimer();
+
+ // Create SQL string to find given schedule
+ TBuf<KCseCustomSqlLength> sqlStatement;
+ sqlStatement.Append( KCseSelectFromDb );
+ sqlStatement.Append( KCseScheduleTable );
+ sqlStatement.Append( KCseWhere );
+ sqlStatement.Append( KCseScheduleDbKeyCol );
+ sqlStatement.Append( KCseEqual );
+ sqlStatement.AppendNum( aDbIdentifier );
+
+ // Order table based on DB identifier
+ RDbView readView;
+ CleanupClosePushL( readView );
+ User::LeaveIfError( readView.Prepare( iScheduleDb,
+ TDbQuery( sqlStatement ) ) );
+ User::LeaveIfError( readView.EvaluateAll() );
+
+ // Get the reminder
+ readView.FirstL();
+
+ CDbColSet* readColSet = readView.ColSetL();
+ CleanupStack::PushL( readColSet );
+ TDbColNo stateCol = readColSet->ColNo( KCseScheduleStateCol );
+ CleanupStack::PopAndDestroy( readColSet );
+ TInt32 state( KErrNotFound );
+
+ // If we found schedule, get the schedule state.
+ if ( readView.AtRow() )
+ {
+ readView.GetL();
+ state = readView.ColInt32( stateCol );
+ }
+ // Close read view
+ CleanupStack::PopAndDestroy( &readView );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetScheduleStateL");
+
+ return state;
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::StartupSchedulesL()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::StartupSchedulesL( RPointerArray<CCseScheduledProgram>& aScheduleArray )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::StartupSchedulesL");
+ LeaveIfDbLockedL();
+ ResetCompactTimer();
+
+ // Create SQL string to find wanted schedules.
+ // At startup phase we are first interested for
+ // those schedules that were on run when phone was
+ // shutdown (eg runcount is bigger than 0).
+ TBuf<KCseCustomSqlLength> sqlStatement;
+ sqlStatement.Append( KCseSelectFromDb );
+ sqlStatement.Append( KCseScheduleTable );
+ sqlStatement.Append( KCseWhere );
+ sqlStatement.Append( KCseScheduleRunCountCol );
+ sqlStatement.Append( KCseMore );
+ sqlStatement.AppendNum( 0 );
+
+ // Order table
+ RDbView view;
+ CleanupClosePushL( view );
+ User::LeaveIfError( view.Prepare( iScheduleDb,
+ TDbQuery( sqlStatement ) ) );
+ User::LeaveIfError( view.EvaluateAll() );
+
+ // Get the first reminder
+ view.FirstL();
+
+ CDbColSet* colSetOrder = view.ColSetL();
+ CleanupStack::PushL( colSetOrder );
+
+ // Column indexes
+ TDbColNo keyIndex = colSetOrder->ColNo( KCseScheduleDbKeyCol );
+ TDbColNo nameIndex = colSetOrder->ColNo( KCseScheduleNameCol );
+ TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol );
+ TDbColNo endTimeIndex = colSetOrder->ColNo( KCseScheduleEndTimeCol );
+ TDbColNo applicationUidIdIndex = colSetOrder->ColNo( KCseScheduleApplicationUIDCol );
+ TDbColNo plugInUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol );
+ TDbColNo typeIndex = colSetOrder->ColNo( KCseScheduleTypeCol );
+ TDbColNo applicationSpecificIndex = colSetOrder->ColNo( KCseScheduleApplicationSpecificCol );
+ TDbColNo pluginTypeIndex = colSetOrder->ColNo( KCseSchedulePluginTypeCol );
+
+ CleanupStack::PopAndDestroy( colSetOrder );
+
+ // Loop through the found schedules.
+ while ( view.AtRow() )
+ {
+ // Create CseScheduledProgram to be added to string.
+ CCseScheduledProgram* prog = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( prog );
+ view.GetL();
+
+ // Set schedule information.
+ prog->SetDbIdentifier( view.ColUint32( keyIndex ) );
+ prog->SetName( view.ColDes8( nameIndex ) );
+ prog->SetStartTime( view.ColTime( startTimeIndex ) );
+ prog->SetEndTime( view.ColTime( endTimeIndex ) );
+ prog->SetAppUid( view.ColInt32( applicationUidIdIndex ) );
+ prog->SetPluginUid( view.ColInt32( plugInUidIndex ) );
+
+ prog->SetScheduleType( CCseScheduledProgram::TCseScheduleType(
+ view.ColInt32( typeIndex ) ) );
+ prog->SetPluginType( CCseScheduledProgram::TCsePluginType(
+ view.ColInt32( pluginTypeIndex ) ) );
+
+ TInt streamLen( view.ColLength( applicationSpecificIndex ) );
+
+ HBufC8* appDataBuffer = HBufC8::NewL( streamLen );
+ CleanupStack::PushL( appDataBuffer );
+
+ TPtr8 buffPtr( appDataBuffer->Des() );
+ RDbColReadStream readStream;
+ readStream.OpenLC( view, applicationSpecificIndex ); // |->1
+ readStream.ReadL( buffPtr, streamLen );
+ readStream.Release();
+ CleanupStack::PopAndDestroy( ); // 1<-| Popping pointer to Col that we dont have here
+
+ prog->SetApplicationDataL( *appDataBuffer );
+
+ CleanupStack::PopAndDestroy( appDataBuffer );
+ User::LeaveIfError( aScheduleArray.Append( prog ) );
+ CleanupStack::Pop( prog );
+
+ // Next shcedule
+ view.NextL();
+ }
+
+ CleanupStack::PopAndDestroy( &view ); // Closes view
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::StartupSchedulesL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::ResetCompactTimer()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::ResetCompactTimer()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::ResetCompactTimer");
+
+ // If iCompatTimer is not running start it.
+ if( !iCompactTimer )
+ {
+ TRAPD(err, iCompactTimer = CPeriodic::NewL( CActive::EPriorityStandard ));
+
+ if(err != KErrNone )
+ {
+ CSELOGSTRING2_HIGH_LEVEL("CCseScheduleDB::ResetCompactTimer - Can't create iCompactTimer: %d", err);
+ }
+ }
+
+ // If iCompactTimer is running cancel it and start over again.
+ if( iCompactTimer )
+ {
+ iCompactTimer->Cancel();
+
+ iCompactTimer->Start( KCseDbCompactTimeout,
+ KCseDbCompactTimeout,
+ TCallBack( CompactCallback, this ) );
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::ResetCompactTimer");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::CompactCallback()
+//
+// ---------------------------------------------------------------------------
+TInt CCseScheduleDB::CompactCallback( TAny* aThis )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::CompactCallback");
+
+ // Direct call to class method.
+ static_cast<CCseScheduleDB*>( aThis )->CompactDb();
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::CompactCallback");
+ return EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::CompactDb()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::CompactDb()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::CompactDb");
+ // Compact database
+ TInt err( iScheduleDb.Compact() );
+ if ( err != KErrNone )
+ {
+ CSELOGSTRING2_HIGH_LEVEL("iScheduleDb.Compact() failed: %d", err);
+ }
+ // Cancel timer if it is running
+ if ( iCompactTimer )
+ {
+ iCompactTimer->Cancel();
+ delete iCompactTimer;
+ iCompactTimer = NULL;
+ }
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::CompactDb");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::ChangeFileLockL()
+//
+// ---------------------------------------------------------------------------
+//
+void CCseScheduleDB::ChangeFileLockL(
+ const TDesC& /*aFileName*/,
+ TFileLockFlags aFlags )
+ {
+ CSELOGSTRING_HIGH_LEVEL( ">>>CCseScheduleDB::ChangeFileLockL" );
+
+ switch ( aFlags )
+ {
+ case MBackupObserver::EReleaseLockReadOnly:
+ case MBackupObserver::EReleaseLockNoAccess:
+ {
+ // Backup and restore starting, close the db
+ CloseDbFile();
+ }
+ break;
+
+ default:
+ {
+ OpenDbFileL();
+ }
+ break;
+ }
+
+ CSELOGSTRING_HIGH_LEVEL( "<<<CCseScheduleDB::ChangeFileLockL" );
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::CloseDbFile()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::CloseDbFile()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::CloseDbFile");
+
+ iDbAccess = ECseDbLocked;
+ iScheduleDb.Close();
+ delete iScheduleFileStore;
+ iScheduleFileStore = NULL;
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::CloseDbFile");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::OpenDbFileL()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::OpenDbFileL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::OpenDbFileL");
+
+ iScheduleDb.Close();
+ if( iScheduleFileStore )
+ {
+ delete iScheduleFileStore;
+ iScheduleFileStore = NULL;
+ }
+ iScheduleFileStore = CPermanentFileStore::OpenL( iFsSession, iDbFile,
+ EFileRead|EFileWrite );
+ iScheduleFileStore->SetTypeL( iScheduleFileStore->Layout() );
+ iScheduleDb.OpenL( iScheduleFileStore, iScheduleFileStore->Root() );
+ User::LeaveIfError( iScheduleDb.Compact() );
+
+ iDbAccess = ECseDbOpen;
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::OpenDbFileL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::LeaveIfDbLocked()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::LeaveIfDbLockedL() const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::LeaveIfDbLocked");
+
+ if(iDbAccess == ECseDbLocked)
+ {
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::LeaveIfDbLocked - Leave, DB locked!!");
+ User::Leave( KErrLocked );
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::LeaveIfDbLocked");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::GetSchedulesByPluginL()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::GetSchedulesByPluginL( const TInt32 aPluginUid,
+ RPointerArray<CCseScheduledProgram>& aArray )
+ {
+
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetSchedulesByPluginL");
+ LeaveIfDbLockedL();
+ ResetCompactTimer();
+
+ // Gets program occurence(s) that are going to happen next
+ // from database
+ TBuf<KCseCustomSqlLength> sqlStatement;
+ sqlStatement.Append( KCseSelectFromDb );
+ sqlStatement.Append( KCseScheduleTable );
+ sqlStatement.Append( KCseWhere );
+ sqlStatement.Append( KCseSchedulePlugInUIDCol );
+ sqlStatement.Append( KCseEqual );
+ sqlStatement.AppendNum( aPluginUid );
+ sqlStatement.Append( KCseOrderBy );
+ sqlStatement.Append( KCseScheduleStartTimeCol );
+
+ // Order table based on start time
+ RDbView view;
+ CleanupClosePushL( view );
+ User::LeaveIfError( view.Prepare( iScheduleDb,
+ TDbQuery( sqlStatement ) ) );
+ User::LeaveIfError( view.EvaluateAll() );
+
+ view.FirstL();
+
+ CDbColSet* colSetOrder = view.ColSetL();
+ CleanupStack::PushL( colSetOrder );
+
+ // Get the SQL table indexes.
+ TDbColNo keyIndex = colSetOrder->ColNo( KCseScheduleDbKeyCol );
+ TDbColNo nameIndex = colSetOrder->ColNo( KCseScheduleNameCol );
+ TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol );
+ TDbColNo endTimeIndex = colSetOrder->ColNo( KCseScheduleEndTimeCol );
+ TDbColNo applicationUidIdIndex = colSetOrder->ColNo( KCseScheduleApplicationUIDCol );
+ TDbColNo plugInUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol );
+ TDbColNo applicationSpecificIndex = colSetOrder->ColNo( KCseScheduleApplicationSpecificCol );
+ TDbColNo scheduleTypeIndex = colSetOrder->ColNo( KCseScheduleTypeCol );
+ TDbColNo pluginTypeIndex = colSetOrder->ColNo( KCseSchedulePluginTypeCol );
+
+ CleanupStack::PopAndDestroy( colSetOrder );
+
+ // Loop through the tables
+ while ( view.AtRow() )
+ {
+ // Create new CCseSceduledProgram to be added to array
+ CCseScheduledProgram* prog = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( prog );
+
+ // Fill created schedule with DB information
+ view.GetL();
+ prog->SetDbIdentifier( view.ColUint32( keyIndex ) );
+ prog->SetName( view.ColDes8( nameIndex ) );
+ prog->SetStartTime( view.ColTime( startTimeIndex ) );
+ prog->SetEndTime( view.ColTime( endTimeIndex ) );
+ prog->SetAppUid( view.ColInt32( applicationUidIdIndex ) );
+ prog->SetPluginUid( view.ColInt32( plugInUidIndex ) );
+ prog->SetScheduleType( view.ColInt32( scheduleTypeIndex ) );
+ prog->SetPluginType( view.ColInt32( pluginTypeIndex ) );
+
+ TInt streamLen( 0 );
+ streamLen = view.ColLength( applicationSpecificIndex );
+
+ HBufC8* appDataBuffer = HBufC8::NewL( streamLen );
+
+ CleanupStack::PushL( appDataBuffer );
+
+ TPtr8 buffPtr( appDataBuffer->Des() );
+ RDbColReadStream readStream;
+ readStream.OpenLC( view, applicationSpecificIndex ); // |->1
+ readStream.ReadL( buffPtr, streamLen );
+ readStream.Release();
+ CleanupStack::PopAndDestroy( ); // 1<-| Popping pointer to Col that we dont have here
+
+ prog->SetApplicationDataL( *appDataBuffer );
+
+ CleanupStack::PopAndDestroy( appDataBuffer );
+ User::LeaveIfError( aArray.Append( prog ) );
+ CleanupStack::Pop( prog );
+ view.NextL();
+ }
+
+ CleanupStack::PopAndDestroy( &view ); // Closes view
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetSchedulesByPluginL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::GetSchedulesByTypeL()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::GetSchedulesByTypeL( const TInt32 aType,
+ RPointerArray<CCseScheduledProgram>& aArray )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetSchedulesByPluginL");
+ LeaveIfDbLockedL();
+ ResetCompactTimer();
+
+ // Gets program occurence(s) that are going to happen next
+ // from database
+ TBuf<KCseCustomSqlLength> sqlStatement;
+ sqlStatement.Append( KCseSelectFromDb );
+ sqlStatement.Append( KCseScheduleTable );
+ sqlStatement.Append( KCseWhere );
+ sqlStatement.Append( KCseScheduleTypeCol );
+ sqlStatement.Append( KCseEqual );
+ sqlStatement.AppendNum( aType );
+ sqlStatement.Append( KCseOrderBy );
+ sqlStatement.Append( KCseScheduleStartTimeCol );
+
+ // Order table based on start time
+ RDbView view;
+ CleanupClosePushL( view );
+ User::LeaveIfError( view.Prepare( iScheduleDb,
+ TDbQuery( sqlStatement ) ) );
+ User::LeaveIfError( view.EvaluateAll() );
+
+ view.FirstL();
+
+ CDbColSet* colSetOrder = view.ColSetL();
+ CleanupStack::PushL( colSetOrder );
+
+ // Get the SQL table indexes.
+ TDbColNo keyIndex = colSetOrder->ColNo( KCseScheduleDbKeyCol );
+ TDbColNo nameIndex = colSetOrder->ColNo( KCseScheduleNameCol );
+ TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol );
+ TDbColNo endTimeIndex = colSetOrder->ColNo( KCseScheduleEndTimeCol );
+ TDbColNo applicationUidIdIndex = colSetOrder->ColNo( KCseScheduleApplicationUIDCol );
+ TDbColNo plugInUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol );
+ TDbColNo applicationSpecificIndex = colSetOrder->ColNo( KCseScheduleApplicationSpecificCol );
+ TDbColNo scheduleTypeIndex = colSetOrder->ColNo( KCseScheduleTypeCol );
+ TDbColNo pluginTypeIndex = colSetOrder->ColNo( KCseSchedulePluginTypeCol );
+
+ CleanupStack::PopAndDestroy( colSetOrder );
+
+ // Loop through the tables
+ while ( view.AtRow() )
+ {
+ // Create new CCseSceduledProgram to be added to array
+ CCseScheduledProgram* prog = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( prog );
+
+ // Fill created schedule with DB information
+ view.GetL();
+ prog->SetDbIdentifier( view.ColUint32( keyIndex ) );
+ prog->SetName( view.ColDes8( nameIndex ) );
+ prog->SetStartTime( view.ColTime( startTimeIndex ) );
+ prog->SetEndTime( view.ColTime( endTimeIndex ) );
+ prog->SetAppUid( view.ColInt32( applicationUidIdIndex ) );
+ prog->SetPluginUid( view.ColInt32( plugInUidIndex ) );
+ prog->SetScheduleType( view.ColInt32( scheduleTypeIndex ) );
+ prog->SetPluginType( view.ColInt32( pluginTypeIndex ) );
+
+ TInt streamLen( 0 );
+ streamLen = view.ColLength( applicationSpecificIndex );
+
+ HBufC8* appDataBuffer = HBufC8::NewL( streamLen );
+
+ CleanupStack::PushL( appDataBuffer );
+
+ TPtr8 buffPtr( appDataBuffer->Des() );
+ RDbColReadStream readStream;
+ readStream.OpenLC( view, applicationSpecificIndex ); // |-> 1
+ readStream.ReadL( buffPtr, streamLen );
+ readStream.Release();
+ CleanupStack::PopAndDestroy( ); // 1 <-| Popping pointer to Col that we dont have here
+
+ prog->SetApplicationDataL( *appDataBuffer );
+
+ CleanupStack::PopAndDestroy( appDataBuffer );
+ User::LeaveIfError( aArray.Append( prog ) );
+ CleanupStack::Pop( prog );
+ view.NextL();
+ }
+
+ CleanupStack::PopAndDestroy( &view ); // Closes view
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetSchedulesByPluginL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::GetSchedulesByTimeframeL()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::GetSchedulesByTimeframeL( const TTime& aBeginning,
+ const TTime& aEnd,
+ RPointerArray<CCseScheduledProgram>& aResultArray
+ )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetSchedulesByTimeframeL");
+ LeaveIfDbLockedL();
+ ResetCompactTimer();
+
+ TBuf<100> startTimeBuf;
+ _LIT( KDateTimeFormat,"# %1%*D/%2%*M/%3%*Y %H:%T:%S#" );
+ aBeginning.FormatL( startTimeBuf, KDateTimeFormat );
+ TBuf<100> endTimeBuf;
+ aEnd.FormatL( endTimeBuf, KDateTimeFormat );
+
+ // Create SQL string to find all overlapping schedules from database between given
+ // timeframe.
+ TBuf<KCseCustomSqlLength> sqlStatement;
+ sqlStatement.Append( KCseSelectFromDb );
+ sqlStatement.Append( KCseScheduleTable );
+ sqlStatement.Append( KCseWhere );
+ sqlStatement.Append( KCseScheduleStartTimeCol );
+ sqlStatement.Append( KCseLess );
+ sqlStatement.Append( endTimeBuf );
+ sqlStatement.Append( KCseAnd );
+ sqlStatement.Append( KCseScheduleEndTimeCol );
+ sqlStatement.Append( KCseMore );
+ sqlStatement.Append( startTimeBuf );
+ sqlStatement.Append( KCseOrderBy );
+ sqlStatement.Append( KCseScheduleStartTimeCol );
+
+ // Order table
+ RDbView view;
+ CleanupClosePushL( view );
+ User::LeaveIfError( view.Prepare( iScheduleDb,
+ TDbQuery( sqlStatement ) ) );
+ User::LeaveIfError( view.EvaluateAll() );
+
+ // Move to the first row
+ view.FirstL();
+
+ CDbColSet* colSetOrder = view.ColSetL();
+ CleanupStack::PushL( colSetOrder );
+
+ // Get colon indexes.
+ TDbColNo keyIndex = colSetOrder->ColNo( KCseScheduleDbKeyCol );
+ TDbColNo nameIndex = colSetOrder->ColNo( KCseScheduleNameCol );
+ TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol );
+ TDbColNo endTimeIndex = colSetOrder->ColNo( KCseScheduleEndTimeCol );
+ TDbColNo applicationUidIdIndex = colSetOrder->ColNo( KCseScheduleApplicationUIDCol );
+ TDbColNo plugInUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol );
+ TDbColNo typeIndex = colSetOrder->ColNo( KCseScheduleTypeCol );
+ TDbColNo applicationSpecificIndex = colSetOrder->ColNo( KCseScheduleApplicationSpecificCol );
+ TDbColNo pluginTypeIndex = colSetOrder->ColNo( KCseSchedulePluginTypeCol );
+
+ CleanupStack::PopAndDestroy( colSetOrder );
+
+ // Loop through all found schedules.
+ while ( view.AtRow() )
+ {
+ // Create new schedule to be added to array.
+ CCseScheduledProgram* schedule = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( schedule );
+ view.GetL();
+
+ // Set schedule information.
+ schedule->SetDbIdentifier( view.ColUint32( keyIndex ) );
+ schedule->SetName( view.ColDes8( nameIndex ) );
+ schedule->SetStartTime( view.ColTime( startTimeIndex ) );
+ schedule->SetEndTime( view.ColTime( endTimeIndex ) );
+ schedule->SetAppUid( view.ColInt32( applicationUidIdIndex ) );
+ schedule->SetPluginUid( view.ColInt32( plugInUidIndex ) );
+
+ schedule->SetScheduleType( CCseScheduledProgram::TCseScheduleType(
+ view.ColInt32( typeIndex ) ) );
+ schedule->SetPluginType( CCseScheduledProgram::TCseScheduleType(
+ view.ColInt32( pluginTypeIndex ) ) );
+
+ TInt streamLen( 0 );
+ streamLen = view.ColLength( applicationSpecificIndex );
+
+ HBufC8* appDataBuffer = HBufC8::NewL( streamLen );
+ CleanupStack::PushL( appDataBuffer );
+
+ TPtr8 buffPtr( appDataBuffer->Des() );
+ RDbColReadStream readStream;
+ readStream.OpenLC( view, applicationSpecificIndex ); // |-> 1
+ readStream.ReadL(buffPtr, streamLen);
+ readStream.Release();
+ CleanupStack::PopAndDestroy( ); // 1 <-| Popping pointer to Col that we dont have here
+ TPtrC8 ptr8( appDataBuffer->Des() );
+ schedule->SetApplicationDataL( *appDataBuffer );
+ CleanupStack::PopAndDestroy( appDataBuffer );
+
+ aResultArray.AppendL( schedule );
+ CleanupStack::Pop( schedule );
+
+ // Next shcedule...
+ view.NextL();
+ }
+ CleanupStack::PopAndDestroy( &view ); // Closes view
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetSchedulesByTimeframeL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::GetPluginsL()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::GetPluginsL( RArray<TInt32>& aPlugins )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetPluginsL");
+ LeaveIfDbLockedL();
+ ResetCompactTimer();
+
+ // Gets program occurence(s) that are going to happen next
+ // from database
+ TBuf<KCseCustomSqlLength> sqlStatement;
+ sqlStatement.Append( KCseSelectFromDb );
+ sqlStatement.Append( KCseScheduleTable );
+ sqlStatement.Append( KCseOrderBy );
+ sqlStatement.Append( KCseSchedulePlugInUIDCol );
+
+ // Order table based on start time
+ RDbView view;
+ CleanupClosePushL( view );
+ User::LeaveIfError( view.Prepare( iScheduleDb,
+ TDbQuery( sqlStatement ) ) );
+ User::LeaveIfError( view.EvaluateAll() );
+
+ view.FirstL();
+
+ CDbColSet* colSetOrder = view.ColSetL();
+ CleanupStack::PushL( colSetOrder );
+
+ // Get the SQL table indexes.
+ TDbColNo pluginUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol );
+
+ CleanupStack::PopAndDestroy( colSetOrder );
+
+ TInt32 currentPluginUid( 0 );
+ TInt32 newPluginUid( 0 );
+
+ // Loop through the tables
+ while ( view.AtRow() )
+ {
+ view.GetL();
+
+ // Get plugin Uid from row
+ newPluginUid = view.ColInt32( pluginUidIndex );
+
+ // If it is different that the current plugin uid add it to
+ // array and set new "current" uid.
+ if( newPluginUid != currentPluginUid )
+ {
+ // Query results are sorted by plugin uid
+ // so if uid changes we can add it to array
+ // without fearing that we will have
+ // duplicates.
+ aPlugins.Append( newPluginUid );
+ currentPluginUid = newPluginUid;
+ }
+
+ view.NextL();
+ }
+
+ view.Close();
+ CleanupStack::PopAndDestroy( &view ); // Closes view
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetPluginsL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::GetNextScheduleTimeByPluginL()
+//
+// ---------------------------------------------------------------------------
+TTime CCseScheduleDB::GetNextScheduleTimeByPluginL( TInt32 aPluginUid )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetNextScheduleTimeByPluginL");
+ LeaveIfDbLockedL();
+ ResetCompactTimer();
+
+ // Create SQL satring to get schedule occurence(s) that are
+ // going to happen next from database.
+ TTime nextScheduleTime( 0 );
+ TBuf<KCseCustomSqlLength> sqlStatement;
+ sqlStatement.Append( KCseSelectFromDb );
+ sqlStatement.Append( KCseScheduleTable );
+ sqlStatement.Append( KCseWhere );
+ sqlStatement.Append( KCseScheduleStateCol );
+ sqlStatement.Append( KCseEqual );
+ sqlStatement.AppendNum( ECseWaiting );
+ sqlStatement.Append( KCseAnd );
+ sqlStatement.Append( KCseSchedulePlugInUIDCol );
+ sqlStatement.Append( KCseEqual );
+ sqlStatement.AppendNum( aPluginUid );
+ sqlStatement.Append( KCseOrderBy );
+ sqlStatement.Append( KCseScheduleStartTimeCol );
+
+ // Order table based on start time
+ RDbView view;
+ CleanupClosePushL( view );
+ User::LeaveIfError( view.Prepare( iScheduleDb,
+ TDbQuery( sqlStatement ) ) );
+ User::LeaveIfError( view.EvaluateAll() );
+
+ // Get the next schedule
+ view.FirstL();
+
+ CDbColSet* colSetOrder = view.ColSetL();
+ CleanupStack::PushL( colSetOrder );
+
+ TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol );
+
+ CleanupStack::PopAndDestroy( colSetOrder );
+
+ // Schedule found get its start time.
+ if ( view.AtRow() )
+ {
+ view.GetL();
+ nextScheduleTime = view.ColTime( startTimeIndex );
+ }
+
+ CleanupStack::PopAndDestroy( &view ); // Closes view
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetNextScheduleTimeByPluginL");
+
+ return nextScheduleTime;
+ }
+
+// ---------------------------------------------------------------------------
+// CCseScheduleDB::GetSchedulesByTimeAndPluginL()
+//
+// ---------------------------------------------------------------------------
+void CCseScheduleDB::GetSchedulesByTimeAndPluginL(
+ const TTime& aScheduleTime,
+ TInt32 aPluginUid,
+ RPointerArray<CCseScheduledProgram>& aNextScheduleArray )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetSchedulesByTimeAndPluginL");
+ LeaveIfDbLockedL();
+ ResetCompactTimer();
+
+ // Gets program occurence(s) that are going to happen next
+ // from database
+ TBuf<100> startTimeBuf;
+
+ _LIT( KDateTimeFormat,"# %1%*D/%2%*M/%3%*Y %H:%T:%S.%C#" );
+
+ aScheduleTime.FormatL( startTimeBuf, KDateTimeFormat );
+
+ // Create SQL string to get all schedules to be happen at given time
+ TBuf<KCseCustomSqlLength> sqlStatement;
+ sqlStatement.Append( KCseSelectFromDb );
+ sqlStatement.Append( KCseScheduleTable );
+ sqlStatement.Append( KCseWhere );
+ sqlStatement.Append( KCseScheduleStartTimeCol );
+ sqlStatement.Append( KCseEqual );
+ sqlStatement.Append( startTimeBuf );
+ sqlStatement.Append( KCseAnd );
+ sqlStatement.Append( KCseSchedulePlugInUIDCol );
+ sqlStatement.Append( KCseEqual );
+ sqlStatement.AppendNum( aPluginUid );
+
+ // Order table based on start time
+ RDbView view;
+ CleanupClosePushL( view );
+ User::LeaveIfError( view.Prepare( iScheduleDb,
+ TDbQuery( sqlStatement ) ) );
+ User::LeaveIfError( view.EvaluateAll() );
+
+ // Get the next reminder
+ view.FirstL();
+
+ CDbColSet* colSetOrder = view.ColSetL();
+ CleanupStack::PushL( colSetOrder );
+
+ // Get column indexes
+ TDbColNo keyIndex = colSetOrder->ColNo( KCseScheduleDbKeyCol );
+ TDbColNo nameIndex = colSetOrder->ColNo( KCseScheduleNameCol );
+ TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol );
+ TDbColNo endTimeIndex = colSetOrder->ColNo( KCseScheduleEndTimeCol );
+ TDbColNo applicationUidIdIndex = colSetOrder->ColNo( KCseScheduleApplicationUIDCol );
+ TDbColNo plugInUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol );
+ TDbColNo typeIndex = colSetOrder->ColNo( KCseScheduleTypeCol );
+ TDbColNo applicationSpecificIndex = colSetOrder->ColNo( KCseScheduleApplicationSpecificCol );
+ TDbColNo pluginTypeIndex = colSetOrder->ColNo( KCseSchedulePluginTypeCol );
+
+ CleanupStack::PopAndDestroy( colSetOrder );
+
+ // Loop through all found schedules.
+ while ( view.AtRow() )
+ {
+ // Create new schedule to be added to array
+ CCseScheduledProgram* prog = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( prog );
+ view.GetL();
+
+ // Copy information from DB to schedule.
+ prog->SetDbIdentifier( view.ColUint32( keyIndex ) );
+ prog->SetName( view.ColDes8( nameIndex ) );
+ prog->SetStartTime( view.ColTime( startTimeIndex ) );
+ prog->SetEndTime( view.ColTime( endTimeIndex ) );
+ prog->SetAppUid( view.ColInt32( applicationUidIdIndex ) );
+ prog->SetPluginUid( view.ColInt32( plugInUidIndex ) );
+
+ prog->SetScheduleType( CCseScheduledProgram::TCseScheduleType(
+ view.ColInt32( typeIndex ) ) );
+ prog->SetPluginType( view.ColInt32( pluginTypeIndex ) );
+ TInt streamLen( view.ColLength( applicationSpecificIndex ) );
+
+ HBufC8* appDataBuffer = HBufC8::NewL( streamLen );
+ CleanupStack::PushL( appDataBuffer );
+
+ TPtr8 buffPtr( appDataBuffer->Des() );
+ RDbColReadStream readStream;
+ readStream.OpenLC( view, applicationSpecificIndex ); // |-> 1
+ readStream.ReadL( buffPtr, streamLen );
+ readStream.Release();
+ CleanupStack::PopAndDestroy(); // 1 <-|
+
+ prog->SetApplicationDataL( *appDataBuffer );
+
+ CleanupStack::PopAndDestroy( appDataBuffer );
+ User::LeaveIfError( aNextScheduleArray.Append( prog ) );
+ CleanupStack::Pop( prog );
+
+ // And next schedule...
+ view.NextL();
+ }
+
+ CleanupStack::PopAndDestroy( &view ); // Closes view
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetSchedulesByTimeAndPluginL");
+ }
+
+
+// End of file.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/src/CCseSchedulerLandLord.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,377 @@
+/*
+* Copyright (c) 2006 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: Timer for the notifier*
+*/
+
+
+
+
+#include "CCseSchedulerLandLord.h"
+#include "CCseSchedulerPluginStarter.h"
+#include <ipvideo/CCseScheduledProgram.h>
+#include "CCseSchedulerThreadPacket.h"
+#include <ipvideo/MCseScheduleObserver.h> // Observer for informing engine
+#include <e32std.h>
+#include "CseDebug.h" // Debug macros
+#include "CCseSemaphoreController.h"
+
+_LIT( KCseUniThreadName, "CseThread" );
+_LIT( KCseLine, "-" );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerTimer::CCseSchedulerTimer()
+//
+// ---------------------------------------------------------------------------
+CCseSchedulerLandLord::CCseSchedulerLandLord( MCseScheduleObserver* aObserver ) :
+ CActive( CActive::EPriorityStandard ),
+ iThreadRunning( EFalse ),
+ iTakedownRequested( EFalse )
+
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::CCseSchedulerLandLord");
+
+ // C++ default constructor
+ iObserver = aObserver;
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerLandLord::CCseSchedulerLandLord");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerLandLord::~CCseSchedulerLandLord()
+//
+// ---------------------------------------------------------------------------
+CCseSchedulerLandLord::~CCseSchedulerLandLord()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::~CCseSchedulerLandLord");
+
+ Cancel();
+
+ delete iShutdownCompleteMonitor;
+ iShutdownCompleteMonitor = NULL;
+ delete iActiveSchedulerWait;
+ iActiveSchedulerWait = NULL;
+ iObserver = NULL;
+ delete iThreadPacket;
+ iThreadPacket = NULL;
+ delete iThreadName;
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerLandLord::~CCseSchedulerLandLord");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerLandLord::NewL()
+//
+// ---------------------------------------------------------------------------
+CCseSchedulerLandLord* CCseSchedulerLandLord::NewL(
+ MCseScheduleObserver* aObserver )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::NewL");
+
+ // Symbian C++ constructor
+ CCseSchedulerLandLord* self = new ( ELeave ) CCseSchedulerLandLord( aObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerLandLord::NewL");
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerLandLord::ConstructL()
+//
+// ---------------------------------------------------------------------------
+void CCseSchedulerLandLord::ConstructL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::ConstructL");
+
+ iActiveSchedulerWait = new (ELeave) CActiveSchedulerWait;
+ CActiveScheduler::Add( this );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerLandLord::ConstructL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerLandLord::DoCancel()
+//
+// ---------------------------------------------------------------------------
+void CCseSchedulerLandLord::DoCancel()
+ {
+ CSELOGSTRING_HIGH_LEVEL( ">>>CCseSchedulerLandLord::DoCancel" );
+
+ if ( iThreadRunning )
+ {
+ CSELOGSTRING_HIGH_LEVEL(
+ "CCseSchedulerLandLord::DoCancel Canceling thread" );
+
+ // Signal thread to die away!
+ iPluginShutdownSemaphore.Signal();
+
+ iThreadRunning = EFalse;
+
+ // Complete schedule with KErrAbort
+ TRAP_IGNORE( iObserver->ScheduleCompletedL(
+ iThreadPacket->Schedule( )->DbIdentifier(), KErrAbort ) );
+ }
+
+ CSELOGSTRING_HIGH_LEVEL( "<<<CCseSchedulerLandLord::DoCancel" );
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerTimer::RunL()
+//
+// ---------------------------------------------------------------------------
+void CCseSchedulerLandLord::RunL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::RunL");
+
+ iThreadRunning = EFalse;
+
+ // In case we have not cancelled operation, complete schedule with result code.
+ // If we have cancelled it, we're not interested about the result as the
+ // schedule has already been removed from the DB
+ if( !iTakedownRequested )
+ {
+ iObserver->ScheduleCompletedL( iThreadPacket->Schedule( )->DbIdentifier(),
+ iThreadPacket->ResultCode( ) );
+ }
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerLandLord::RunL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerTimer::SetScheduleL()
+//
+// ---------------------------------------------------------------------------
+void CCseSchedulerLandLord::SetScheduleL( CCseScheduledProgram& aData )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::SetSchedule");
+
+ delete iThreadPacket;
+ iThreadPacket = NULL;
+ iThreadPacket = CCseSchedulerThreadPacket::NewL();
+ iThreadPacket->SetScheduleL( aData );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerLandLord::SetSchedule");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerTimer::ThreadPacket()
+//
+// ---------------------------------------------------------------------------
+CCseSchedulerThreadPacket* CCseSchedulerLandLord::ThreadPacket( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::Schedule");
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerLandLord::Schedule");
+
+ return iThreadPacket;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerLandLord::RunError
+// From CActive, called when RunL leaves.
+// -----------------------------------------------------------------------------
+//
+TInt CCseSchedulerLandLord::RunError( TInt /*aError*/ )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::RunError");
+ // ATM there isn't leaving code in RunL so we just cancel timer if it is active.
+ Cancel();
+ // Return KErrNone to avoid crash.
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerLandLord::GenerateThreadName
+// Generates "unique" name for thread
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerLandLord::GenerateThreadNameL( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::GenerateThreadName");
+
+ delete iThreadName;
+ iThreadName = NULL;
+ iThreadName = KCseUniThreadName().AllocL();
+ iThreadName = iThreadName->ReAllocL(
+ iThreadName->Size() + // Length of original name.
+ sizeof( TUint32 ) * 2 + // Space for Plugin Uid and DbIdentifier
+ 2 ); // Two "-" as a separator between
+ // Uid and identifier
+
+ // Separator
+ iThreadName->Des( ).Append( KCseLine );
+
+ // Plugin uid
+ iThreadName->Des( ).AppendNum( iThreadPacket->Schedule()->PluginUid() );
+
+ // Separator
+ iThreadName->Des( ).Append( KCseLine );
+
+ // Finally schedule identifier to make thread name unique
+ iThreadName->Des( ).AppendNum( iThreadPacket->Schedule()->DbIdentifier() );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerLandLord::GenerateThreadName");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerLandLord::GenerateSemahoresL
+// Generates semaphores for shutdown signalling
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerLandLord::GenerateSemaphoresL( )
+ {
+ iPluginShutdownSemaphore.CreateLocal( 0 );
+ iThreadPacket->SetShutdownSemaphore( iPluginShutdownSemaphore );
+
+ iPluginShutdownCompleteSemaphore.CreateLocal( 0 );
+ iThreadPacket->SetShutdownCompleteSemaphore( iPluginShutdownCompleteSemaphore );
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerLandLord::RunPluginL
+// From CActive, called when RunL leaves.
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerLandLord::RunPluginL( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::RunPluginL");
+ TInt error( KErrNone );
+
+ // Create semaphores for shutdown signalling
+ GenerateSemaphoresL();
+
+ // First we create unique thread name
+ GenerateThreadNameL( );
+
+ // Create thread where to run schedule
+ error = iThread.Create( *iThreadName,
+ CCseSchedulerPluginStarter::StartThread,
+ KDefaultStackSize,
+ NULL, // uses caller thread's heap
+ iThreadPacket, // Schedule
+ EOwnerThread );
+
+ if( error == KErrNone )
+ {
+ // Creation succesfull, start running it and logon on it.
+ CSELOGSTRING_HIGH_LEVEL(
+ "CCseSchedulerLandLord::RunPluginL - Thread creation succesfull");
+ iThread.Resume();
+ iThread.Logon( iStatus );
+ SetActive();
+ iThreadRunning = ETrue;
+ }
+ else
+ {
+ CSELOGSTRING2_HIGH_LEVEL(
+ "CCseSchedulerLandLord::RunPluginL - Thread creation FAILED: %d",
+ error);
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerLandLord::RunPluginL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerLandLord::ActiveWait
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerLandLord::ActiveWait( TBool aStart )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::ActiveWait()");
+ if (aStart)
+ {
+ if(!iActiveSchedulerWait->IsStarted())
+ {
+ CSELOGSTRING_HIGH_LEVEL("CCseSchedulerLandLord::ActiveWait - Wait start");
+ iActiveSchedulerWait->Start();
+ }
+ }
+ else
+ {
+ if(iActiveSchedulerWait->IsStarted())
+ {
+ CSELOGSTRING_HIGH_LEVEL("CCseSchedulerLandLord::ActiveWait - Wait stop");
+ iActiveSchedulerWait->AsyncStop();
+ }
+ }
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerLandLord::ActiveWait()");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerLandLord::ActiveWait
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerLandLord::SemaphoreSignalled()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::ShutdownPlugin()");
+
+ ActiveWait( EFalse );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerLandLord::ShutdownPlugin()");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerLandLord::ClearL()
+//
+// ---------------------------------------------------------------------------
+void CCseSchedulerLandLord::ClearL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::ClearL");
+
+ if( iThreadRunning )
+ {
+ // Flag the takedown. We're cancelling the operation, so we have
+ // no interest about result code as the schedule has already
+ // been removed from the DB.
+ iTakedownRequested = ETrue;
+
+ // Signal thread to die away!
+ iPluginShutdownSemaphore.Signal();
+
+ if( !iShutdownCompleteMonitor )
+ {
+ CSELOGSTRING_HIGH_LEVEL("CCseSchedulerLandLord::ClearL - New semaphore monitor" );
+ iShutdownCompleteMonitor = CCseSemaphoreController::NewL( iPluginShutdownCompleteSemaphore, *this );
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("CCseSchedulerLandLord::ClearL - StartMonitor" );
+ iShutdownCompleteMonitor->Start();
+
+ ActiveWait( ETrue );
+
+ iThreadRunning = EFalse;
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerLandLord::ClearL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerLandLord::ActiveWait
+//
+// -----------------------------------------------------------------------------
+//
+TBool CCseSchedulerLandLord::IsWorking()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::IsWorking()");
+
+ CSELOGSTRING2_HIGH_LEVEL("<<<CCseSchedulerLandLord::IsWorking(): %d", iThreadRunning);
+
+ return iThreadRunning;
+ }
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/src/CCseSchedulerMultiPluginController.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,353 @@
+/*
+* Copyright (c) 2006 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: Base class for multi plugin controllers*
+*/
+
+
+
+
+
+// INCLUDE FILES
+#include "CCseSchedulerMultiPluginController.h"
+#include "CseDebug.h" // Debug macros
+#include "CCseSchedulerPluginStarter.h"
+#include "CCseSchedulerLandLord.h"
+#include <ipvideo/CCseScheduledProgram.h>
+#include "CCseSchedulerTimer.h"
+#include "CCseSchedulerServerEngine.h"
+#include "CCseSchedulerThreadPacket.h"
+
+// EXTERNAL DATA STRUCTURES
+// None.
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None.
+
+// CONSTANTS
+// None
+
+// MACROS
+// None.
+
+// LOCAL CONSTANTS AND MACROS
+// None.
+
+// MODULE DATA STRUCTURES
+// None.
+
+// LOCAL FUNCTION PROTOTYPES
+// None.
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginControllerBase::CCseSchedulerMultiPluginController
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerMultiPluginController::CCseSchedulerMultiPluginController(
+ CCseSchedulerServerEngine& aEngine,
+ TInt32 aPluginUid ) :
+ CCseSchedulerPluginControllerBase( aEngine, aPluginUid )
+
+ {
+ CSELOGSTRING_HIGH_LEVEL(
+ ">>>CCseSchedulerMultiPluginController::CCseSchedulerMultiPluginController");
+
+ CSELOGSTRING_HIGH_LEVEL(
+ "<<<CCseSchedulerMultiPluginController::CCseSchedulerMultiPluginController");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerMultiPluginController::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerMultiPluginController* CCseSchedulerMultiPluginController::NewL(
+ CCseSchedulerServerEngine& aEngine,
+ TInt32 aPluginUid )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerMultiPluginController::NewL");
+
+ CCseSchedulerMultiPluginController* self =
+ new( ELeave ) CCseSchedulerMultiPluginController( aEngine, aPluginUid );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerMultiPluginController::NewL");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerMultiPluginController::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerMultiPluginController::ConstructL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerMultiPluginController::ConstructL");
+
+ CCseSchedulerPluginControllerBase::ConstructL();
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerMultiPluginController::ConstructL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerMultiPluginController::~CCseSchedulerMultiPluginController
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerMultiPluginController::~CCseSchedulerMultiPluginController()
+ {
+ CSELOGSTRING_HIGH_LEVEL(
+ ">>>CCseSchedulerMultiPluginController::~CCseSchedulerMultiPluginController");
+
+ iLandLords.ResetAndDestroy( );
+ iLandLords.Close();
+
+ CSELOGSTRING_HIGH_LEVEL(
+ "<<<CCseSchedulerMultiPluginController::~CCseSchedulerMultiPluginController");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerMultiPluginController::RunPluginsL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerMultiPluginController::RunPluginsL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerMultiPluginController::RunPluginsL");
+ TBool scheduleAlreadyRunning( EFalse );
+
+ if(iScheduleArray.Count() >0 )
+ {
+ // Kick those schedules running that aren't already running
+ for( TInt i = 0; i < iScheduleArray.Count(); i++)
+ {
+ for ( TInt ii = 0; ii < iLandLords.Count(); ii++ )
+ {
+ if( iScheduleArray[i]->DbIdentifier() ==
+ iLandLords[ii]->ThreadPacket()->Schedule()->DbIdentifier() )
+ {
+ scheduleAlreadyRunning = ETrue;
+ }
+ }
+ if( !scheduleAlreadyRunning )
+ {
+ if( iEngine.IsAllowedToRun( iScheduleArray[i]->DbIdentifier() ) )
+ {
+ // Create new LandLord for each schedule to be run
+ CCseSchedulerLandLord* landLord = CCseSchedulerLandLord::NewL( this );
+
+ CleanupStack::PushL( landLord );
+
+ // Set schedule for LandLord
+ landLord->SetScheduleL( *iScheduleArray[i] );
+
+ // Increase run count
+ iEngine.IncreaseScheduleRunCountL( iScheduleArray[0]->DbIdentifier() );
+
+ // Order the LandLord to run plugin
+ landLord->RunPluginL();
+
+ CleanupStack::Pop( landLord );
+
+ // Add created landLord to array. Destroyed later when landLord
+ // is not needed anymore.
+ iLandLords.AppendL( landLord );
+
+ CleanupStack::Pop( landLord );
+ }
+ else
+ {
+ // Schedule cannot be run anymore due to security reasons
+ // Signal engine to remove schedule from DB
+ iEngine.ScheduleNotValid( iScheduleArray[i]->DbIdentifier() );
+
+ // Remove schedule own list
+ delete iScheduleArray[i];
+ iScheduleArray.Remove( i );
+ i--;
+ }
+ }
+ }
+ if( iLandLords.Count() == 0 )
+ {
+ // We've gone through all our schedules and still no LandLords.
+ // We need to request new schedules.
+ iEngine.RequestReschedule();
+ }
+ }
+ else
+ {
+ // No schedules...!?!? REEEEESCHEDULE!!!
+ iEngine.RequestReschedule();
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerMultiPluginController::RunPluginsL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerMultiPluginController::ScheduleCompletedL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerMultiPluginController::ScheduleCompletedL( const TUint32 aDbIdentifier,
+ TInt aCompletitionCode )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerMultiPluginController::ScheduleCompletedL");
+
+ if ( aCompletitionCode == KErrNone )
+ {
+ ScheduleCompletedSuccesfullyL( aDbIdentifier );
+ }
+ else
+ {
+ HandleScheduleErrorL( aDbIdentifier, aCompletitionCode );
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerMultiPluginController::ScheduleCompletedL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerUniPluginController::ScheduleCompletedSuccesfullyL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerMultiPluginController::ScheduleCompletedSuccesfullyL( const TUint32 aDbIdentifier )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerMultiPluginController::ScheduleCompletedSuccesfullyL");
+
+ // Remove schedule from list
+ for ( TInt i = 0; i < iScheduleArray.Count(); i ++)
+ {
+ if( iScheduleArray[i]->DbIdentifier() == aDbIdentifier )
+ {
+ delete iScheduleArray[i];
+ iScheduleArray.Remove( i );
+ }
+ }
+
+ // Notify engine about completition.
+ iEngine.ScheduleCompletedSuccesfullyL( aDbIdentifier );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerMultiPluginController::ScheduleCompletedSuccesfullyL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerMultiPluginController::HandleScheduleErrorl
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerMultiPluginController::HandleScheduleErrorL( const TUint32 aDbIdentifier,
+ TUint32 aCompletitionCode )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerMultiPluginController::HandleScheduleError");
+
+ // Here we could try to handle plugin errors. Problem is that scheduler doesn't
+ // know anything about schedule it is running and so there cannot be tailored
+ // error handling for each plugin. In the end, we just complete schedule
+ // to engine with error code (ends up removing schedule from DB).
+
+ // Remove schedule from list
+ for ( TInt i = 0; i < iScheduleArray.Count(); i ++)
+ {
+ if( iScheduleArray[i]->DbIdentifier() == aDbIdentifier )
+ {
+ delete iScheduleArray[i];
+ iScheduleArray.Remove( i );
+ break;
+ }
+ }
+
+ iEngine.ScheduleCompletedWithErrorL( aDbIdentifier, aCompletitionCode );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerMultiPluginController::HandleScheduleError");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerMultiPluginController::DoCleanUp::DoCleanUp
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerMultiPluginController::DoCleanUp( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerMultiPluginController::DoCleanUp");
+ TBool scheduleFound( EFalse );
+
+ // Check all LandLords. If we found that there is no schedules related to
+ // one we destroy it.
+ for (TInt i = iLandLords.Count(); i > 0; i--)
+ {
+ for ( TInt ii = 0; ii < iScheduleArray.Count(); ii++ )
+ {
+ // Compare LandLords DbIdentifier with the ones in schedules
+ if( iLandLords[i-1]->ThreadPacket()->Schedule()->DbIdentifier() ==
+ iScheduleArray[ii]->DbIdentifier() )
+ {
+ scheduleFound = ETrue;
+ break;
+ }
+ }
+ // Remove LandLord if there is no schedule for it.
+ if( !scheduleFound )
+ {
+ delete iLandLords[i-1];
+ iLandLords.Remove(i-1);
+ }
+ scheduleFound = EFalse;
+ }
+
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerMultiPluginController::DoCleanUp");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerMultiPluginController::ClearPlugin
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerMultiPluginController::ClearControllerL( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerMultiPluginController::ClearControllerL");
+ for( TInt i = 0 ; i < iLandLords.Count() ; i++ )
+ {
+ iLandLords[i]->ClearL();
+ }
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerMultiPluginController::ClearControllerL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerMultiPluginController::IsControllerActive
+//
+// -----------------------------------------------------------------------------
+//
+TBool CCseSchedulerMultiPluginController::IsControllerActive( )
+ {
+ TBool retVal( EFalse );
+
+ for( TInt i = 0; i < iLandLords.Count(); i++ )
+ {
+ if( iLandLords[i]->IsWorking() )
+ {
+ retVal = ETrue ;
+ break;
+ }
+ }
+ return retVal;
+ }
+
+// End of file.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/src/CCseSchedulerPluginControllerBase.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,328 @@
+/*
+* Copyright (c) 2006 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: Base class for plugin controllers*
+*/
+
+
+
+
+
+// INCLUDE FILES
+#include "CCseSchedulerPluginControllerBase.h"
+#include "CseDebug.h" // Debug macros
+#include <ipvideo/CCseScheduledProgram.h>
+#include "CCseSchedulerTimer.h"
+#include "CCseSchedulerServerEngine.h"
+
+
+// EXTERNAL DATA STRUCTURES
+// None.
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None.
+
+// CONSTANTS
+// None
+
+// MACROS
+// None.
+
+// LOCAL CONSTANTS AND MACROS
+// None.
+
+// MODULE DATA STRUCTURES
+// None.
+
+// LOCAL FUNCTION PROTOTYPES
+// None.
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginControllerBase::CCseSchedulerPluginControllerBase
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerPluginControllerBase::CCseSchedulerPluginControllerBase( MCsePluginControllerObserver& aEngine,
+ TInt32 aPluginUid ) :
+ iEngine( aEngine ),
+ iPluginUid( aPluginUid )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerPluginControllerBase::CCseSchedulerPluginControllerBase");
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerPluginControllerBase::CCseSchedulerPluginControllerBase");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginControllerBase::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerPluginControllerBase* CCseSchedulerPluginControllerBase::NewL( MCsePluginControllerObserver& aEngine,
+ TInt32 aPluginUid )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerPluginControllerBase::NewL");
+
+ CCseSchedulerPluginControllerBase* self = new( ELeave ) CCseSchedulerPluginControllerBase( aEngine, aPluginUid );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerPluginControllerBase::NewL");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginControllerBase::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerPluginControllerBase::ConstructL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerPluginControllerBase::ConstructL");
+
+ iTimer = CCseSchedulerTimer::NewL( this );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerPluginControllerBase::ConstructL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginControllerBase::~CCseSchedulerPluginControllerBase
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerPluginControllerBase::~CCseSchedulerPluginControllerBase()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerPluginControllerBase::~CCseSchedulerPluginControllerBase");
+
+ delete iTimer;
+ iScheduleArray.ResetAndDestroy();
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerPluginControllerBase::~CCseSchedulerPluginControllerBase");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginControllerBase::SetSchedulesL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerPluginControllerBase::SetSchedulesL( RPointerArray<CCseScheduledProgram>& aScheduleArray )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerPluginControllerBase::SetSchedules");
+
+ // The aScheduleArray parameter contains schedules which are either before
+ // or at the same time as the existing ones in the iScheduleArray.
+ // Just destroy the old ones and replace with new ones.
+ // Also cancel the timer because the schedule to run may be different
+
+ iScheduleArray.ResetAndDestroy();
+ iTimer->Cancel();
+
+ // Go through all given schedules and copy them our array
+ for( TInt i = 0; i < aScheduleArray.Count(); i++)
+ {
+ CCseScheduledProgram* schedule =
+ CCseScheduledProgram::NewL(*aScheduleArray[i] );
+ CleanupStack::PushL( schedule );
+
+ iScheduleArray.AppendL( schedule );
+
+ CleanupStack::Pop( schedule );
+ }
+
+ // If we have schedules, set the timer
+ if (iScheduleArray.Count() > 0)
+ {
+ // All the schedules have same time
+ iTimer->SetTimer( iScheduleArray[0]->StartTime() );
+ }
+
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerPluginControllerBase::SetSchedules");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginControllerBase::GetPluginUid
+//
+// -----------------------------------------------------------------------------
+//
+TInt32 CCseSchedulerPluginControllerBase::PluginUid( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerPluginControllerBase::PluginUid");
+ CSELOGSTRING2_HIGH_LEVEL("<<<CCseSchedulerPluginControllerBase::PluginUid: UID = %d",
+ iPluginUid);
+ return iPluginUid;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginControllerBase::RunPluginsL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerPluginControllerBase::RunPluginsL( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerPluginControllerBase::RunPluginsL");
+ CSELOGSTRING_HIGH_LEVEL(
+ "CCseSchedulerPluginControllerBase::RunPluginsL - Base class, do nothing");
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerPluginControllerBase::RunPluginsL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginControllerBase::IsObsolote
+//
+// -----------------------------------------------------------------------------
+//
+TBool CCseSchedulerPluginControllerBase::IsObsolete() const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerPluginControllerBase::IsObsolete");
+
+ TBool ret( EFalse );
+
+ // If we have no schedules in array we declare ourselves as "obsolete".
+ if( iScheduleArray.Count() == 0 )
+ {
+ ret = ETrue;
+ }
+
+ CSELOGSTRING2_HIGH_LEVEL("<<<CCseSchedulerPluginControllerBase::IsObsolete: %d", ret);
+
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginControllerBase::ScheduleCompleted
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerPluginControllerBase::ScheduleCompletedL( const TUint32 /*aDbIdentifier*/,
+ TInt /*aCompletitionCode*/ )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerUniPluginController::ScheduleCompleted");
+ CSELOGSTRING_HIGH_LEVEL(
+ "CCseSchedulerUniPluginController::ScheduledEventCompleted - WTF LEIK BSAE KLASS");
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerUniPluginController::ScheduleCompleted");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginControllerBase::TimerErrorL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerPluginControllerBase::TimerErrorL( const TInt32 aError )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerPluginControllerBase::TimerErrorL");
+
+ if ( aError == KErrAbort )
+ {
+ // System time changed. Make sanity check and start timer again.
+ CSELOGSTRING_HIGH_LEVEL(
+ ">>>CCseSchedulerPluginControllerBase::TimerErrorL, system time has changed");
+ if ( iScheduleArray.Count() > 0 )
+ {
+ TTime now;
+ now.UniversalTime();
+ // Time still in the future
+ if ( now < iScheduleArray[0]->StartTime() )
+ {
+ iTimer->SetTimer( iScheduleArray[0]->StartTime() );
+ }
+ else
+ {
+ RunPluginsL();
+ }
+ }
+ return;
+ }
+
+ if ( aError == KErrUnderflow )
+ {
+ // Scheduled time is in the past, pass it to notifier. It should decide what to do
+ CSELOGSTRING_HIGH_LEVEL(
+ ">>>CCseSchedulerPluginControllerBase::TimerErrorL, scheduled time is in the past");
+ RunPluginsL();
+ return;
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerPluginControllerBase::TimerErrorL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginControllerBase::DoCleanUp
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerPluginControllerBase::DoCleanUp( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerUniPluginController::DoCleanUp");
+ CSELOGSTRING_HIGH_LEVEL(
+ "CCseSchedulerUniPluginController::DoCleanUp - Base class");
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerUniPluginController::DoCleanUp");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginControllerBase::SetAsObsolete
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerPluginControllerBase::SetToBeCleared( TBool aToBeCleared )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerUniPluginController::SetToBeCleared");
+
+ iToBeCleared = aToBeCleared;
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerUniPluginController::SetToBeCleared");
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginControllerBase::ClearController
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerPluginControllerBase::ClearControllerL( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerUniPluginController::ClearControllerL");
+
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerUniPluginController::ClearControllerL - Baseclass, nothing here");
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerUniPluginController::ClearControllerL");
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginControllerBase::ClearPlugin
+//
+// -----------------------------------------------------------------------------
+//
+TBool CCseSchedulerPluginControllerBase::IsToBeCleared( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerUniPluginController::IsToBeCleared");
+
+ CSELOGSTRING2_HIGH_LEVEL("<<<CCseSchedulerUniPluginController::IsToBeCleared: %d", iToBeCleared );
+ return iToBeCleared;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginControllerBase::IsControllerActive
+//
+// -----------------------------------------------------------------------------
+//
+TBool CCseSchedulerPluginControllerBase::IsControllerActive( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerUniPluginController::IsControllerActive");
+
+ CSELOGSTRING2_HIGH_LEVEL("<<<CCseSchedulerUniPluginController::IsControllerActive: %d", iToBeCleared );
+ return ETrue;
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/src/CCseSchedulerPluginStarter.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,308 @@
+/*
+* Copyright (c) 2006 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: Plugin starter, this is run in separate thread from engine*
+*/
+
+
+
+
+
+// INCLUDE FILES
+#include "CCseSchedulerPluginStarter.h"
+#include "CseDebug.h" // Debug macros
+#include <ipvideo/CCseScheduledProgram.h> // Represent one schedule in database
+#include <ipvideo/CCseSchedulerPluginIF.h>
+#include "CCseSchedulerThreadPacket.h"
+#include "CCseSemaphoreController.h"
+
+// EXTERNAL DATA STRUCTURES
+// None.
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None.
+
+// CONSTANTS
+// None
+
+// MACROS
+// None.
+
+// LOCAL CONSTANTS AND MACROS
+// None
+
+// MODULE DATA STRUCTURES
+// None.
+
+// LOCAL FUNCTION PROTOTYPES
+// None.
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginStarter::CCseSchedulerPluginStarter
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerPluginStarter::CCseSchedulerPluginStarter ( CCseSchedulerThreadPacket* aThreadPacket ) :
+ iThreadPacket( aThreadPacket ),
+ iPluginRdyToTakedown( EFalse )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerPluginStarter::CCseSchedulerPluginStarter");
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerPluginStarter::CCseSchedulerPluginStarter");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginStarter::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerPluginStarter* CCseSchedulerPluginStarter::NewL( CCseSchedulerThreadPacket* aThreadPacket )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerPluginStarter::NewL");
+
+ CCseSchedulerPluginStarter* self = new( ELeave ) CCseSchedulerPluginStarter( aThreadPacket );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerPluginStarter::NewL");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginStarter::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerPluginStarter::ConstructL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerPluginStarter::ConstructL");
+
+ iCompletitionBreaker = CIdle::NewL( CActive::EPriorityLow );
+ // Start completition breaker. This time we do not inform about completition of
+ // plugin but we break call chain and start running plugin from RunL
+ iCompletitionBreaker->Start(TCallBack( PluginCompleteCallback, this ));
+
+ iSemaphoreMonitor = CCseSemaphoreController::NewL( iThreadPacket->ShutdownSemaphore(),
+ *this );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerPluginStarter::ConstructL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerEngineBackdoorClient::~CCseSchedulerPluginStarter
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerPluginStarter::~CCseSchedulerPluginStarter()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerPluginStarter::~CCseSchedulerPluginStarter");
+
+ delete iCompletitionBreaker;
+ delete iPlugin;
+ iPlugin = NULL;
+ REComSession::FinalClose();
+
+ delete iSemaphoreMonitor;
+ iSemaphoreMonitor = NULL;
+
+ // We DO NOT destroy thread packet, we just null the pointer.
+ // Information is still needed on other side after thread dies
+ iThreadPacket = NULL;
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerPluginStarter::~CCseSchedulerPluginStarter");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginStarter::StartThread
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCseSchedulerPluginStarter::StartThread( TAny* aParam )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerPluginStarter::RunPlugin");
+
+ TInt err( KErrNone );
+
+ //create cleanupstack
+ CTrapCleanup* cleanup = CTrapCleanup::New(); // get clean-up stack
+ if (!cleanup)
+ {
+ err = KErrNoMemory;
+ }
+ if (!err)
+ {
+ TRAP(err, DoStartThreadL( aParam ));
+ }
+ delete cleanup;
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerPluginStarter::RunPlugin");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginStarter::DoStartThreadL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerPluginStarter::DoStartThreadL( TAny* aParam )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerPluginStarter::DoStartThreadL");
+
+ CCseSchedulerThreadPacket* threadPacket = static_cast<CCseSchedulerThreadPacket*>(aParam);
+
+ CActiveScheduler* scheduler = new ( ELeave ) CActiveScheduler;
+
+ // If schedule doesn't exist there is really nothing we can do
+ if( scheduler )
+ {
+ CleanupStack::PushL( scheduler ); // |->1
+ CActiveScheduler::Install( scheduler );
+
+ // Create the starter
+ CCseSchedulerPluginStarter* starter = CCseSchedulerPluginStarter::NewL( threadPacket );
+ CleanupStack::PushL(starter); // |->2
+
+ // Ready to run
+ CActiveScheduler::Start();
+
+ CSELOGSTRING_HIGH_LEVEL("CCseSchedulerPluginStarter::DoStartThreadL - Out from CActiveScheduler::Start!");
+
+ // Cleanup the server and scheduler
+ CleanupStack::PopAndDestroy( starter ); // 2<-|
+ CleanupStack::PopAndDestroy( scheduler ); // 1<-|
+
+ threadPacket->ShutdownCompleteSemaphore().Signal();
+ }
+ else
+ {
+ CSELOGSTRING_HIGH_LEVEL("CCseSchedulerPluginStarter::DoStartThreadL - No schedule available, GTFO");
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerPluginStarter::DoStartThreadL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginStarter::RunPluginL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerPluginStarter::RunPluginL( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerPluginStarter::RunPluginL");
+
+ // Create plugin
+ TUid pluginUid = TUid::Uid( iThreadPacket->Schedule()->PluginUid() );
+
+ iPlugin = CCseSchedulerPluginIF::NewL( pluginUid );
+
+ iPlugin->RunTaskL( *iThreadPacket->Schedule(), this );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerPluginStarter::RunPluginL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginStarter::PluginCompleted
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerPluginStarter::PluginCompleted( TInt aCompletitionCode )
+ {
+ CSELOGSTRING2_HIGH_LEVEL(
+ ">>>CCseSchedulerPluginStarter::PluginCompleted - Code: %d", aCompletitionCode);
+
+ // Start taking down The Thread
+ // Start Completition breaker if not already active to break call chain.
+ // Set plugin completition value
+ iThreadPacket->SetResultCode( aCompletitionCode );
+
+ iPluginRdyToTakedown = ETrue;
+
+ if( !iCompletitionBreaker->IsActive() )
+ {
+ iCompletitionBreaker->Start(TCallBack( PluginCompleteCallback, this ));
+ }
+ else
+ {
+ CSELOGSTRING_HIGH_LEVEL(
+ "CCseSchedulerPluginStarter::PluginCompleted:Breaker already running!");
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerPluginStarter::PluginCompleted");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerPluginStarter::PluginCompleteCallback
+// -----------------------------------------------------------------------------
+//
+TInt CCseSchedulerPluginStarter::PluginCompleteCallback( TAny* aPtr )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>PluginCompleteCallback::ScheduleCompleteCallback");
+ CSELOGSTRING_HIGH_LEVEL("<<<PluginCompleteCallback::ScheduleCompleteCallback");
+ return static_cast<CCseSchedulerPluginStarter*>( aPtr )->HandlePluginCompleteCallback();
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerUserInformer::HandlePluginCompleteCallback
+// -----------------------------------------------------------------------------
+//
+TInt CCseSchedulerPluginStarter::HandlePluginCompleteCallback()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerPluginStarter::HandleScheduleCompleteCallback ");
+
+ if( iPluginRdyToTakedown )
+ {
+ // First clear flag
+ iPluginRdyToTakedown = EFalse;
+ // Takedown thread
+ CActiveScheduler::Stop();
+ }
+ else
+ {
+ // First start monitor
+ iSemaphoreMonitor->Start();
+ // Plugin ready to be run
+ TRAPD( err, RunPluginL() );
+ if ( err != KErrNone )
+ {
+ // Run plugin leaved for some reason. Set error code and get outta here!
+ iThreadPacket->SetResultCode( err );
+ iPluginRdyToTakedown = ETrue;
+ iCompletitionBreaker->Start(TCallBack( PluginCompleteCallback, this ));
+ }
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerPluginStarter::HandleScheduleCompleteCallback ");
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerUserInformer::SemaphoreSignalled
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerPluginStarter::SemaphoreSignalled()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerPluginStarter::SemaphoreSignalled");
+
+ delete iPlugin;
+ iPlugin = NULL;
+
+ CActiveScheduler::Stop();
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerPluginStarter::SemaphoreSignalled");
+ }
+
+// End of file.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/src/CCseSchedulerServer.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,506 @@
+/*
+* Copyright (c) 2006 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: Implementation of Scheduler server's Server class*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCseSchedulerServer.h" // Header file for this class
+#include "CCseSchedulerServerSession.h" // Server session
+#include "CCseSchedulerServerEngine.h" // Server intelligence aka engine
+#include <ipvideo/CseSchedulerClientServerCommon.h> // Common defines for client and server
+#include "CseSchedulerServer.pan" // Server panic codes
+#include "CseDebug.h" // Debug macros
+#include <e32svr.h>
+#include <e32math.h>
+#include <e32uid.h>
+#include <e32def.h>
+
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None
+
+// CONSTANTS
+// Platform security. Custom check is applied to all IPCs.
+static const int KRangeCount( 1 );
+
+static const TInt SecurityRanges[KRangeCount] =
+ {
+ 0, // Range is from 0 to KMaxTInt
+ };
+
+static const TUint8 SecurityRangesPolicy[KRangeCount] =
+ {
+ CPolicyServer::ECustomCheck
+ };
+
+static const CPolicyServer::TPolicy Policy =
+ {
+ CPolicyServer::EAlwaysPass,
+ KRangeCount,
+ SecurityRanges,
+ SecurityRangesPolicy,
+ NULL,
+ };
+
+
+// MACROS
+// None
+
+// LOCAL CONSTANTS AND MACROS
+const TInt KDbStartTimeout = 2000000;
+
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServer::CCseSchedulerServer()
+// C++ constructor
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerServer::CCseSchedulerServer()
+ : CPolicyServer( EPriorityRealTimeServer, Policy, ESharableSessions ),
+ iContainerIx( NULL ),
+ iObjectCon( NULL ),
+ iSessionCount( 0 ),
+ iSchedulerEngine( NULL )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::CCseSchedulerServer");
+ __DECLARE_NAME( _S( "CCseSchedulerServer" ) );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::CCseSchedulerServer");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServer::NewLC()
+//
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerServer* CCseSchedulerServer::NewLC( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::NewLC");
+
+ CCseSchedulerServer* self = new ( ELeave ) CCseSchedulerServer;
+ CleanupStack::PushL( self );
+
+ self->ConstructL( );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::NewLC");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServer::ConstructL()
+// second-phase constructor; create the object container index.
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServer::ConstructL( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::ConstructL");
+ iContainerIx = CObjectConIx::NewL();
+ iObjectCon = iContainerIx->CreateL();
+ StartL( KCseSchedulerServerName );
+ GetEngineObjectL();
+ iStarterBreaker = CPeriodic::NewL( CActive::EPriorityStandard );
+
+ // break call chain
+ if( !iStarterBreaker->IsActive() )
+ {
+ // Give client 2 secs to make server session before we check
+ // if server is needed or not.
+ iStarterBreaker->Start( KDbStartTimeout,
+ KDbStartTimeout,
+ TCallBack( StarterCallback, this ));
+ }
+ else
+ {
+ CSELOGSTRING_HIGH_LEVEL(
+ "CCseSchedulerServer::ConstructL - Breaker already active");
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::ConstructL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServer::~CCseSchedulerServer()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerServer::~CCseSchedulerServer()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::~CCseSchedulerServer");
+ DeleteSchedulerEngine();
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::~CCseSchedulerServer");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServer::ThreadFunction()
+// The active scheduler is installed and started here.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCseSchedulerServer::ThreadFunction( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::ThreadFunction");
+ CTrapCleanup* cleanupStack = CTrapCleanup::New();
+ if ( !cleanupStack )
+ {
+ PanicServer( ECseCreateTrapCleanup );
+ }
+
+ TRAPD( err, ThreadFunctionL( ) );
+ if ( err )
+ {
+ PanicServer( ECseSrvCreateServer );
+ }
+
+ delete cleanupStack;
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::ThreadFunction");
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServer::ThreadFunctionL()
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServer::ThreadFunctionL( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::ThreadFunctionL");
+
+ // Construct active scheduler
+ CActiveScheduler* activeScheduler = new ( ELeave ) CActiveScheduler;
+ CleanupStack::PushL( activeScheduler ); // |-> 1
+
+ // Install active scheduler.
+ // We don't need to check whether an active scheduler is already installed
+ // as this is a new thread, so there won't be one
+ CActiveScheduler::Install( activeScheduler );
+
+ // Construct our server, pushed cleanup stack and leaved there
+ CCseSchedulerServer* server = CCseSchedulerServer::NewLC( ); // |-> 2
+
+ // Signal server is up
+ RProcess::Rendezvous( KErrNone );
+
+ // Start handling requests
+ CActiveScheduler::Start();
+
+ CleanupStack::PopAndDestroy( server ); // 2<-|
+ CleanupStack::PopAndDestroy( activeScheduler ); // 1<-|
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::ThreadFunctionL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServer::PanicServer
+// Utility - panic the server
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+void CCseSchedulerServer::PanicServer( TCseSchedulerServPanic aPanic )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::PanicServer");
+ _LIT( KSchedulerServer, "SchedulerServer" );
+ User::Panic( KSchedulerServer, aPanic );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::PanicServer");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServer::GetEngineObjectL()
+//
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerServerEngine* CCseSchedulerServer::GetEngineObjectL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::GetEngineObjectL");
+
+ if ( iObjectCon->Count() == 0 )
+ {
+ // Create scheduler engine
+ iSchedulerEngine = CCseSchedulerServerEngine::NewL( *this );
+
+ // Add our engine to container
+ iObjectCon->AddL( iSchedulerEngine );
+ }
+ else
+ {
+ // default implementation return KErrNone.
+ if ( KErrNone != iSchedulerEngine->Open() )
+ {
+ User::Leave( KErrGeneral );
+ }
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::GetEngineObjectL");
+
+ // We have only one object in our container
+ return iSchedulerEngine;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServer::Inc()
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServer::Inc()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::Inc");
+ if ( iSessionCount!=KErrNotFound )
+ {
+ iSessionCount++;
+ }
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::Inc");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseRTPServer::Dec()
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServer::Dec()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::Dec");
+ iSessionCount--;
+
+ if ( iSessionCount<=0 )
+ {
+ StopServer();
+ }
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::Dec");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServer::DeleteSchedulerEngine
+// Stops active scheduler and deletes object container and other objects.
+// -----------------------------------------------------------------------------
+void CCseSchedulerServer::DeleteSchedulerEngine()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::DeleteSchedulerEngine");
+
+ if ( iContainerIx )
+ {
+ iSchedulerEngine->Close();
+ iContainerIx->Remove( iObjectCon );
+ delete iContainerIx;
+ iContainerIx = NULL;
+ iSchedulerEngine = NULL;
+ }
+
+ if( iStarterBreaker->IsActive() )
+ {
+ iStarterBreaker->Cancel();
+ }
+ delete iStarterBreaker;
+ iStarterBreaker = NULL;
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::DeleteSchedulerEngine");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServer::NewSessionL()
+//
+// -----------------------------------------------------------------------------
+//
+
+CSession2* CCseSchedulerServer::NewSessionL( const TVersion& aVersion,
+ const RMessage2& /*aMessage*/ ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::NewSessionL");
+
+ // Check version is ok
+ TVersion v( KCseServMajorVersionNumber,
+ KCseServMinorVersionNumber,
+ KCseServBuildVersionNumber );
+
+ if ( !User::QueryVersionSupported( v, aVersion ) )
+ {
+ User::Leave( KErrNotSupported );
+ }
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::NewSessionL");
+
+ // Make new session
+ return CCseSchedulerServerSession::NewL( ( CCseSchedulerServer* ) this );
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServer::StopServer
+// Stops the server thread if no sessions active.
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServer::StopServer()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::StopServer");
+ TBool schedulerActive( iSchedulerEngine->IsSchedulerActive() );
+ CSELOGSTRING2_HIGH_LEVEL("CCseSchedulerServer::StopServer - Session count: %d", iSessionCount);
+ if ( (iSessionCount<=0) && (schedulerActive == EFalse))
+ {
+ CSELOGSTRING_HIGH_LEVEL("CCseSchedulerServer::StopServer - Call ActiveScheduler::Stop()");
+ CActiveScheduler::Stop();
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::StopServer");
+ }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+// -----------------------------------------------------------------------------
+// StartThread()
+// Start the server thread. This is called from the client.
+// -----------------------------------------------------------------------------
+//
+TInt CCseSchedulerServer::StartThread()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::StartThread");
+#if _DEBUG
+ __UHEAP_MARK;
+#endif
+
+ // Check server not already started
+ TFindServer findCountServer( KCseSchedulerServerName );
+ TFullName name;
+ if ( findCountServer.Next( name ) == KErrNone )
+ {
+ // Found server already
+ RProcess::Rendezvous( KErrNone );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::StartThread - Return value: KErrAlreadyExists");
+ return KErrAlreadyExists;
+ }
+
+ ThreadFunction( );
+
+#if _DEBUG
+ __UHEAP_MARKEND;
+#endif
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::StartThread - Server down!");
+
+ // All well
+ return KErrNone;
+ }
+
+// --------------------------------------------------------------------------
+// CCseSchedulerServer::CustomSecurityCheckL()
+// --------------------------------------------------------------------------
+//
+CPolicyServer::TCustomResult CCseSchedulerServer::CustomSecurityCheckL(
+ const RMessage2& aMsg,
+ TInt& /*aAction*/,
+ TSecurityInfo& /*aMissing*/ )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::CustomSecurityCheckL");
+ TCustomResult retVal ( EFail );
+
+ // Check the messagge function range
+ if ( aMsg.Function() > ECseRequestBase &&
+ aMsg.Function() < ECseRequestLast )
+ {
+
+ // Check if the client has required capabilities
+ // From .mmp-file capablity NetworkControl
+ if( // From .mmp-file following are CAP_SERVER capabilities
+ ! aMsg.HasCapability(ECapabilityNetworkServices ) ||
+ ! aMsg.HasCapability(ECapabilityLocalServices ) ||
+ ! aMsg.HasCapability(ECapabilityLocation ) ||
+ ! aMsg.HasCapability(ECapabilityReadUserData ) ||
+ ! aMsg.HasCapability(ECapabilityWriteUserData ) ||
+ ! aMsg.HasCapability(ECapabilityReadDeviceData ) ||
+ ! aMsg.HasCapability(ECapabilityWriteDeviceData ) ||
+ ! aMsg.HasCapability(ECapabilityUserEnvironment ) ||
+ ! aMsg.HasCapability(ECapabilitySwEvent ) )
+ {
+ CSELOGSTRING2_HIGH_LEVEL(
+ "CCseSchedulerServer::CustomSecurityCheckL() No capability for message %d!!!",
+ aMsg.Function() );
+ }
+ else
+ {
+ CSELOGSTRING2_HIGH_LEVEL(
+ "CCseSchedulerServer::CustomSecurityCheckL() Message %d inside range and capabilities ok",
+ aMsg.Function() );
+ retVal = EPass;
+ }
+ }
+ else
+ {
+ CSELOGSTRING2_HIGH_LEVEL(
+ "CCseSchedulerServer::CustomSecurityCheckL() Message %d outside known range!!!",
+ aMsg.Function() );
+ }
+
+ if( retVal == EPass )
+ {
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::CustomSecurityCheckL - Passed");
+ }
+ else
+ {
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::CustomSecurityCheckL - Failed");
+ }
+ return retVal;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::StarterCallback
+// -----------------------------------------------------------------------------
+//
+TInt CCseSchedulerServer::StarterCallback( TAny* aPtr )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::StarterCallback");
+ TBool retVal( EFalse);
+ retVal = static_cast<CCseSchedulerServer*>( aPtr )->HandleStarterCallback();
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::StarterCallback");
+ return retVal;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::HandleCompletitionCallback
+// -----------------------------------------------------------------------------
+//
+TInt CCseSchedulerServer::HandleStarterCallback()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::HandleStarterCallback ");
+
+ // We dont want to use periodic anymore, so we cancel it. We just wanted to
+ // make call here 2 secs after server has been created.
+ iStarterBreaker->Cancel();
+
+ // Check if server can be stopped.
+ iSchedulerEngine->RequestReschedule();
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::HandleStarterCallback ");
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// E32Main()
+// Server startup
+// Returns: KErrNone
+// -----------------------------------------------------------------------------
+//
+GLDEF_C TInt E32Main()
+ {
+ return CCseSchedulerServer::StartThread();
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/src/CCseSchedulerServerEngine.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,1676 @@
+/*
+* Copyright (c) 2006 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: Actual intelligence of scheduler server*
+*/
+
+
+
+
+
+// INCLUDE FILES
+#include <s32mem.h>
+#include <e32def.h>
+#include <e32const.h>
+#include "CCseSchedulerServerEngine.h" // Common methods for server
+#include <ipvideo/CseSchedulerClientServerCommon.h> // Common defines for client and server
+#include <ipvideo/CCseScheduledProgram.h> // Represent one schedule in database
+#include "CseDebug.h" // Debug macros
+#include "CCseScheduleDB.h" // Schedule database
+#include "CCseSchedulerTimer.h" // Schedule timer for determining schedule times
+#include <ipvideo/CCseSchedulerPluginIF.h> // Scheduler plugin interface
+#include "CCseSchedulerUniPluginController.h"
+#include "CCseSchedulerMultiPluginController.h"
+#include "CCseSchedulerServer.h"
+
+
+// EXTERNAL DATA STRUCTURES
+// None.
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None.
+
+// CONSTANTS
+// None
+
+// MACROS
+// None.
+
+// LOCAL CONSTANTS AND MACROS
+// None.
+
+// MODULE DATA STRUCTURES
+// None.
+
+// LOCAL FUNCTION PROTOTYPES
+// None.
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::CCseSchedulerServerEngine
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerServerEngine::CCseSchedulerServerEngine( CCseSchedulerServer& aServer ) :
+ iServer( aServer )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::CCseSchedulerServerEngine");
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::CCseSchedulerServerEngine");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerServerEngine* CCseSchedulerServerEngine::NewL( CCseSchedulerServer& aServer )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::NewL");
+
+ CCseSchedulerServerEngine* self = new( ELeave ) CCseSchedulerServerEngine( aServer );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::NewL");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::ConstructL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::ConstructL");
+
+ iDb = CCseScheduleDB::NewL();
+ iCompletitionBreaker = CIdle::NewL( CActive::EPriorityLow );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::ConstructL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::~CCseSchedulerServerEngine
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerServerEngine::~CCseSchedulerServerEngine()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::~CCseSchedulerServerEngine");
+
+ delete iDb;
+
+ iPluginControllerArray.ResetAndDestroy();
+ iPluginControllerArray.Close();
+ delete iCompletitionBreaker;
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::~CCseSchedulerServerEngine");
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::GeneralServiceL
+//
+// Schedule operations
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::GeneralServiceL( const RMessage2& aMessage )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GeneralService");
+
+ switch( aMessage.Function() )
+ {
+ case ECseAddSchedule:
+ {
+ AddScheduleL( aMessage );
+ break;
+ }
+ case ECseRemoveSchedule:
+ {
+ RemoveScheduleL( aMessage );
+ break;
+ }
+ case ECseGetSchedules:
+ {
+ GetSchedulesL( aMessage );
+ break;
+ }
+ case ECseGetSchedule:
+ {
+ GetScheduleL( aMessage );
+ break;
+ }
+ case ECseGetScheduleLength:
+ {
+ GetScheduleLengthL( aMessage );
+ break;
+ }
+ case ECseGetSchedulesByAppUid:
+ {
+ GetSchedulesByAppUidL( aMessage );
+ break;
+ }
+ case ECseGetScheduleArrayLengthByAppUid:
+ {
+ GetScheduleArrayLengthByAppUidL( aMessage );
+ break;
+ }
+ case ECseGetOverlappingSchedulesLength:
+ {
+ GetOverlappingSchedulesLengthL( aMessage );
+ break;
+ }
+ case ECseGetOverlappingSchedules:
+ {
+ GetOverlappingSchedulesL( aMessage );
+ break;
+ }
+ case ECseGetScheduleArrayLengthByPluginUid:
+ {
+ GetScheduleArrayLengthByPluginUidL( aMessage );
+ break;
+ }
+ case ECseGetSchedulesByPluginUid:
+ {
+ GetSchedulesByPluginUidL( aMessage );
+ break;
+ }
+ case ECseGetScheduleArrayLengthByType:
+ {
+ GetScheduleArrayLengthByTypeL( aMessage );
+ break;
+ }
+ case ECseGetSchedulesByType:
+ {
+ GetSchedulesByTypeL( aMessage );
+ break;
+ }
+ case ECseGetScheduleArrayLengthByTimeframe:
+ {
+ GetScheduleArrayLengthByTimeframeL( aMessage );
+ break;
+ }
+ case ECseGetSchedulesByTimeframe:
+ {
+ GetSchedulesByTimeframeL( aMessage );
+ break;
+ }
+
+ default:
+ {
+ aMessage.Complete( KErrNotSupported );
+ break;
+ }
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GeneralService");
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::PanicClient
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::PanicClient( TCseSchedulerServPanic aPanic,
+ const RMessage2& aMessage ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::PanicClient");
+
+ // Panic the client on server side
+ _LIT( KTxtClientFault, "CseSchedulerServer" );
+ aMessage.Panic( KTxtClientFault, aPanic );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::PanicClient");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::AddScheduleL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::AddScheduleL( const RMessage2& aMessage )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::AddScheduleL");
+ TInt ret( KErrNone );
+ TBuf8<4> id;
+
+ // Initialize buffers...
+ CCseScheduledProgram* schedule = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( schedule );
+ HBufC8* msg = HBufC8::NewL( aMessage.GetDesLengthL( 0 ) );
+ CleanupStack::PushL( msg );
+ TPtr8 ptr( msg->Des() );
+
+ // Read schedule as a stream format to buffer
+ aMessage.ReadL( 0, ptr, 0 );
+
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( ptr );
+
+ // Change stream formatted schedule to "CseScheduledProgram"-format
+ schedule->InternalizeL( readStream );
+
+ CleanupStack::PopAndDestroy( &readStream );
+
+ // Add it to DB
+ iDb->AddScheduleL( *schedule );
+
+ // Make the completition value
+ id.FillZ();
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( id );
+ writeStream.WriteUint32L( schedule->DbIdentifier() );
+ writeStream.CommitL();
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ aMessage.WriteL( 1, id, 0 );
+
+ RescheduleByPluginL( schedule->PluginUid() );
+
+ CleanupStack::PopAndDestroy( msg );
+ CleanupStack::PopAndDestroy( schedule );
+
+ aMessage.Complete( ret );
+ CSELOGSTRING2_HIGH_LEVEL("<<<CCseSchedulerServerEngine::AddScheduleL, ret=%d", ret);
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::RemoveScheduleL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::RemoveScheduleL( const RMessage2& aMessage )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::RemoveScheduleL");
+
+ TUint32 dbIdentifier( 0 );
+ TBuf8<4> idBuff;
+ TInt32 pluginUid( 0 );
+
+ idBuff.FillZ();
+
+ // Read db identifier from aMessager
+ User::LeaveIfError( aMessage.Read( 0, idBuff ) );
+
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( idBuff );
+ dbIdentifier = readStream.ReadUint32L();
+ CleanupStack::PopAndDestroy( &readStream );
+
+ // Remove schedule
+ // First check the plugin UID of removed schedule
+ CCseScheduledProgram* prog = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( prog );
+ iDb->GetScheduleByDbIdentifierL( dbIdentifier, prog );
+ pluginUid = prog->PluginUid( );
+ // Now remove it from DB
+ iDb->RemoveScheduleL( dbIdentifier );
+ RescheduleByPluginL( pluginUid );
+
+ // Use completition callback to remove those controllers that aren't needed anymore
+ if( !iCompletitionBreaker->IsActive() )
+ {
+ iCompletitionBreaker->Start(TCallBack( CompletitionCallback, this ));
+ }
+ else
+ {
+ CSELOGSTRING_HIGH_LEVEL(
+ "CCseSchedulerServerEngine::ScheduleCompletedSuccesfully - Breaker already active");
+ }
+
+ CleanupStack::PopAndDestroy( prog );
+ aMessage.Complete( KErrNone );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::RemoveScheduleL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::GetScheduleL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::GetScheduleL( const RMessage2& aMessage )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetScheduleL");
+ TUint32 dbIdentifier( 0 );
+ TBuf8<4> idBuff;
+
+ idBuff.FillZ();
+
+ // Read db identifier from aMessage
+ TInt err( aMessage.Read( 0, idBuff ) );
+
+ if ( err == KErrNone )
+ {
+ // Create new db identifier to be passed to client
+ CCseScheduledProgram* prog = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( prog );
+
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( idBuff );
+ dbIdentifier = readStream.ReadUint32L();
+ CleanupStack::PopAndDestroy( &readStream );
+
+ // Get schedule
+ iDb->GetScheduleByDbIdentifierL( dbIdentifier, prog );
+
+ TInt length( prog->ExternalizeLength() );
+
+ // Externalize schedule to stream format
+ HBufC8* retBuff = HBufC8::NewL( length );
+ CleanupStack::PushL( retBuff );
+ TPtr8 retPtr( retBuff->Des() );
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( retPtr );
+ prog->ExternalizeL( writeStream );
+ writeStream.CommitL();
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ User::LeaveIfError( aMessage.Write( 1, retPtr ) );
+ CleanupStack::PopAndDestroy( retBuff );
+ CleanupStack::PopAndDestroy( prog );
+ }
+
+ aMessage.Complete( err );
+ CSELOGSTRING2_HIGH_LEVEL("<<<CCseSchedulerServerEngine::RemoveScheduleL, err=%d", err);
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::GetScheduleLengthL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::GetScheduleLengthL( const RMessage2& aMessage )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetScheduleLengthL");
+ TUint32 dbIdentifier( 0 );
+ TBuf8<4> idBuff;
+ TBuf8<4> lenBuff;
+ TInt length( 0 );
+ CCseScheduledProgram* schedule = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( schedule );
+ idBuff.FillZ();
+
+ // Read db identifier from aMessage
+ User::LeaveIfError( aMessage.Read( 0, idBuff ) );
+
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( idBuff );
+ dbIdentifier = readStream.ReadUint32L();
+ CleanupStack::PopAndDestroy( &readStream );
+
+ // Get schedule
+ iDb->GetScheduleByDbIdentifierL( dbIdentifier, schedule );
+
+ // Get schedule length
+ length = schedule->ExternalizeLength();
+
+ lenBuff.FillZ();
+
+ // Write length in stream so we can pass it to client
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( lenBuff );
+ writeStream.WriteInt32L( length );
+ writeStream.CommitL();
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ User::LeaveIfError( aMessage.Write( 1, lenBuff ) );
+
+ CleanupStack::PopAndDestroy( schedule );
+
+ aMessage.Complete( KErrNone );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetScheduleLengthL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::GetScheduleLengthL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::GetScheduleArrayLengthByAppUidL(
+ const RMessage2& aMessage )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetScheduleArrayLengthByAppUidL");
+ TInt32 appUid( 0 );
+ TBuf8<4> idBuff;
+ TBuf8<4> lenBuff;
+ TInt length( 0 );
+ idBuff.FillZ();
+
+ // Read application uid from aMessage
+ User::LeaveIfError( aMessage.Read( 0, idBuff ) );
+
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( idBuff );
+ appUid = readStream.ReadInt32L();
+ CleanupStack::PopAndDestroy( &readStream );
+
+ // Get schedules from database
+ RPointerArray<CCseScheduledProgram> progArray;
+ CleanupResetAndDestroyPushL( progArray );
+ iDb->GetApplicationSchedulesL( appUid, progArray );
+
+ // Calculate total length
+ // Number of items in array
+ length = length + 4; // Size of TInt32
+ // Data from array
+ for ( TInt i = 0 ; i < progArray.Count(); i++ )
+ {
+ length = length + progArray[i]->ExternalizeLength();
+ }
+ CleanupStack::PopAndDestroy( &progArray ); // closes progArray
+
+ lenBuff.FillZ();
+
+ // Change length value to stream so that we can send it back to client.
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( lenBuff );
+ writeStream.WriteInt32L( length );
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ User::LeaveIfError( aMessage.Write( 1, lenBuff ) );
+
+ aMessage.Complete( KErrNone );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetScheduleArrayLengthByAppUidL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::GetSchedulesByAppUidL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::GetSchedulesByAppUidL( const RMessage2& aMessage )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetSchedulesByAppUidL");
+ TInt32 appUid( 0 );
+ TBuf8<4> idBuff;
+ idBuff.FillZ();
+ TInt32 numberOfElems( 0 );
+ TInt length( 0 );
+
+ // Read application UID from aMessage
+ TInt err( aMessage.Read( 0, idBuff ) );
+
+ if ( err == KErrNone )
+ {
+ RPointerArray<CCseScheduledProgram> progArray;
+ CleanupResetAndDestroyPushL( progArray );
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( idBuff );
+ appUid = readStream.ReadInt32L();
+ CleanupStack::PopAndDestroy( &readStream );
+
+ // Get schedules from database
+ iDb->GetApplicationSchedulesL( appUid, progArray );
+
+ // Calculate total length
+ // Number of items in array
+ length = length + 4; // Size of TInt32
+ // Data from array
+ for ( TInt i = 0 ; i < progArray.Count(); i++ )
+ {
+ length += progArray[i]->ExternalizeLength();
+ }
+
+ // Allocate write stream
+ HBufC8* retBuff = HBufC8::NewL( length );
+ CleanupStack::PushL( retBuff );
+ TPtr8 retPtr( retBuff->Des() );
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( retPtr );
+
+ // Fill stream
+ // Write number elems
+ numberOfElems = progArray.Count();
+ writeStream.WriteInt32L( numberOfElems );
+ // Add elems one by one
+ for ( TInt i = 0; i < progArray.Count(); i++ )
+ {
+ progArray[i]->ExternalizeL( writeStream );
+ }
+ writeStream.CommitL();
+
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ User::LeaveIfError( aMessage.Write( 1, retPtr ) );
+
+ CleanupStack::PopAndDestroy( retBuff );
+ CleanupStack::PopAndDestroy( &progArray );
+ }
+
+ aMessage.Complete( err );
+ CSELOGSTRING2_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetSchedulesByAppUidL", err);
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::GetSchedulesL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::GetSchedulesL( const RMessage2& aMessage )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetSchedulesL");
+ aMessage.Complete( KErrNotSupported );
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::GetOverlappingSchedulesLengthL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::GetOverlappingSchedulesLengthL(
+ const RMessage2& aMessage )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetOverlappingSchedulesLengthL");
+ TInt32 scheduleType( 0 );
+ TBuf8<20> idBuff;
+ TBuf8<sizeof( TUint32 )> retBuf; // contains length
+
+ TUint32 length( 0 );
+
+ idBuff.FillZ();
+
+ // Read schedule type from aMessage
+ User::LeaveIfError( aMessage.Read( 0, idBuff ) );
+
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( idBuff );
+ scheduleType = readStream.ReadInt32L();
+
+ TUint32 lower( 0 );
+ TUint32 upper( 0 );
+
+ // Read start time from the aMessage
+ lower = readStream.ReadUint32L();
+ upper = readStream.ReadUint32L();
+ TInt64 time( 0 );
+ time = (TInt64) lower;
+ TInt64 longUpper = (TInt64) upper;
+ longUpper = longUpper << 32;
+ longUpper &= (0xFFFFFFFF00000000ULL);
+ time |= longUpper;
+ TInt64 startTime = time;
+
+ // Read end time from the aMessage
+ lower = readStream.ReadUint32L();
+ upper = readStream.ReadUint32L();
+ time = (TInt64) lower;
+ longUpper = (TInt64) upper;
+ longUpper = longUpper << 32;
+ longUpper &= (0xFFFFFFFF00000000ULL);
+ time |= longUpper;
+ TInt64 endTime = time;
+
+ CleanupStack::PopAndDestroy( &readStream );
+
+ RPointerArray<CCseScheduledProgram> schedules;
+ CleanupResetAndDestroyPushL( schedules );
+
+ // Get overlapping schedules
+ iDb->GetOverlappingSchedulesL( scheduleType, startTime, endTime, schedules );
+
+ // Count length one by one
+ for ( TInt i = 0; i < schedules.Count(); i++ )
+ {
+ length += schedules[i]->ExternalizeLength();
+ }
+
+ CleanupStack::PopAndDestroy( &schedules );
+
+ retBuf.FillZ();
+
+
+ // Write length to stream so we can pass it to client
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( retBuf );
+ writeStream.WriteInt32L( length );
+ writeStream.CommitL();
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ User::LeaveIfError( aMessage.Write( 1, retBuf ) );
+
+ aMessage.Complete( KErrNone );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetOverlappingSchedulesLengthL");
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::GetOverlappingSchedulesL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::GetOverlappingSchedulesL(
+ const RMessage2& aMessage )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetOverlappingSchedulesL");
+ TInt32 scheduleType( 0 );
+ TBuf8<20> idBuff;
+
+ idBuff.FillZ();
+
+ // Read schedule type from aMessage
+ User::LeaveIfError( aMessage.Read( 0, idBuff ) );
+
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( idBuff );
+ scheduleType = readStream.ReadInt32L();
+
+ TUint32 lower( 0 );
+ TUint32 upper( 0 );
+
+ // Read start time from aMessage
+ lower = readStream.ReadUint32L();
+ upper = readStream.ReadUint32L();
+ TInt64 time( 0 );
+ time = (TInt64) lower;
+ TInt64 longUpper = (TInt64) upper;
+ longUpper = longUpper << 32;
+ longUpper &= (0xFFFFFFFF00000000ULL);
+ time |= longUpper;
+ TInt64 startTime = time;
+
+ //Read end time from aMessage
+ lower = readStream.ReadUint32L();
+ upper = readStream.ReadUint32L();
+ time = (TInt64) lower;
+ longUpper = (TInt64) upper;
+ longUpper = longUpper << 32;
+ longUpper &= (0xFFFFFFFF00000000ULL);
+ time |= longUpper;
+ TInt64 endTime = time;
+
+ CleanupStack::PopAndDestroy( &readStream );
+
+ RPointerArray<CCseScheduledProgram> schedules;
+ CleanupResetAndDestroyPushL( schedules );
+
+ // Get overlapping schedules from database
+ iDb->GetOverlappingSchedulesL( scheduleType, startTime, endTime, schedules );
+
+ TUint32 length( 0 );
+
+ length += sizeof( TInt32 ); // item count added to buffer first
+
+ // Length of the schedules needed for transfer stream
+ for ( TInt i = 0; i < schedules.Count(); i++ )
+ {
+ length += schedules[i]->ExternalizeLength();
+ }
+
+ HBufC8* retBuf = HBufC8::NewLC( length );
+ TPtr8 retBufPtr( retBuf->Des() );
+
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( retBufPtr );
+ // write item count to buffer
+ writeStream.WriteInt32L( schedules.Count() );
+
+ // write all items to buffer
+ for ( TInt j = 0; j < schedules.Count(); j++ )
+ {
+ schedules[j]->ExternalizeL( writeStream );
+ }
+ writeStream.CommitL();
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ User::LeaveIfError( aMessage.Write( 1, retBufPtr ) );
+
+ CleanupStack::PopAndDestroy( retBuf );
+ CleanupStack::PopAndDestroy( &schedules );
+
+ aMessage.Complete( KErrNone );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetOverlappingSchedulesL");
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::RescheduleL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::RescheduleL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::Reschedule");
+
+ RArray<TInt32> uidArray;
+
+ iDb->GetPluginsL( uidArray );
+
+ if( uidArray.Count() > 0 )
+ {
+ for(TInt i = 0; i < uidArray.Count(); i++)
+ {
+ TTime runTime( iDb->GetNextScheduleTimeByPluginL( uidArray[i] ) );
+
+ // Search for existing plugin controller for this schedule
+ RPointerArray<CCseScheduledProgram> schedules;
+ CleanupResetAndDestroyPushL( schedules );
+ iDb->GetSchedulesByTimeAndPluginL( runTime, uidArray[i], schedules );
+
+ if( schedules.Count() > 0 )
+ {
+ TBool controllerFound( EFalse );
+
+ // Plugin controller might existCheck if the plugin controller already exists.
+ for( TInt ii = 0; ii < iPluginControllerArray.Count(); ii++ )
+ {
+ if( schedules[0]->PluginUid() == iPluginControllerArray[ii]->PluginUid() )
+ {
+ iPluginControllerArray[ii]->SetSchedulesL( schedules );
+ controllerFound = ETrue;
+ break;
+ }
+ }
+
+ // It didn't so we create new one
+ if( controllerFound == EFalse )
+ {
+ if( schedules[0]->PluginType() == CCseScheduledProgram::ECseUniPlugin )
+ {
+ CSELOGSTRING_HIGH_LEVEL(
+ "CCseSchedulerServerEngine::Reschedule: Create new uniplugin controller");
+ // Create new PluginController
+ iPluginControllerArray.AppendL( CCseSchedulerUniPluginController::NewL( *this, schedules[0]->PluginUid() ) );
+ // Add schedules to just created controller
+ iPluginControllerArray[iPluginControllerArray.Count()-1]->SetSchedulesL(schedules);
+ }
+ else if ( schedules[0]->PluginType() == CCseScheduledProgram::ECseMultiPlugin )
+ {
+ CSELOGSTRING_HIGH_LEVEL(
+ "CCseSchedulerServerEngine::Reschedule: Create new multiplugin controller");
+ // Create new PluginController
+ iPluginControllerArray.AppendL( CCseSchedulerMultiPluginController::NewL( *this, schedules[0]->PluginUid() ) );
+ // Add schedules to just created controller
+ iPluginControllerArray[iPluginControllerArray.Count()-1]->SetSchedulesL(schedules);
+ }
+ else
+ {
+ // WTF?!?!
+ CSELOGSTRING_HIGH_LEVEL(
+ "CCseSchedulerServerEngine::Reschedule: Plugin something completely different");
+ }
+ }
+ }
+ // Delete schedule array.
+ CleanupStack::PopAndDestroy( &schedules );
+ }
+ }
+
+ uidArray.Reset();
+ uidArray.Close();
+
+ // Stop server if we dont have any clients and there is no more
+ // reason for us to live (no schedules active).
+ iServer.StopServer();
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::Reschedule out");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::IsSchedulerActive()
+//
+// -----------------------------------------------------------------------------
+//
+TBool CCseSchedulerServerEngine::IsSchedulerActive() const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::IsSchedulerActive");
+
+ TBool ret(EFalse);
+
+ if( iPluginControllerArray.Count() > 0 )
+ {
+ ret = ETrue;
+ }
+
+ CSELOGSTRING2_HIGH_LEVEL("<<<CCseSchedulerServerEngine::IsSchedulerActive: %d", ret);
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::Close()
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::Close()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::IsSchedulerActive");
+
+ while( AccessCount() >= 1 )
+ {
+ Dec();
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::IsSchedulerActive");
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::GetScheduleArrayLengthByPluginUidL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::GetScheduleArrayLengthByPluginUidL( const RMessage2& aMessage )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetScheduleArrayLengthByPluginUidL");
+ TInt32 pluginUid( 0 );
+ TBuf8<4> idBuff;
+ TBuf8<4> lenBuff;
+ TInt length( 0 );
+ idBuff.FillZ();
+
+ // Read application uid from aMessage
+ User::LeaveIfError( aMessage.Read( 0, idBuff ) );
+
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( idBuff );
+ pluginUid = readStream.ReadInt32L();
+ CleanupStack::PopAndDestroy( &readStream );
+
+ // Get schedules from database
+ RPointerArray<CCseScheduledProgram> progArray;
+ CleanupResetAndDestroyPushL( progArray );
+ iDb->GetSchedulesByPluginL( pluginUid, progArray);
+
+ // Calculate total length
+ // Number of items in array
+ length = length + 4; // Size of TInt32
+ // Data from array
+ for ( TInt i = 0 ; i < progArray.Count(); i++ )
+ {
+ length = length + progArray[i]->ExternalizeLength();
+ }
+ CleanupStack::PopAndDestroy( &progArray ); // closes progArray
+
+ lenBuff.FillZ();
+
+ // Change length value to stream so that we can send it back to client.
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( lenBuff );
+ writeStream.WriteInt32L( length );
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ User::LeaveIfError( aMessage.Write( 1, lenBuff ) );
+
+ aMessage.Complete( KErrNone );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetScheduleArrayLengthByPluginUidL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::GetSchedulesByPluginUidL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::GetSchedulesByPluginUidL( const RMessage2& aMessage )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetSchedulesByPluginUidL");
+ TInt32 pluginUid( 0 );
+ TBuf8<4> idBuff;
+ idBuff.FillZ();
+ TInt32 numberOfElems( 0 );
+ TInt length( 0 );
+
+ // Read application UID from aMessage
+ TInt err( aMessage.Read( 0, idBuff ) );
+
+ if ( err == KErrNone )
+ {
+ RPointerArray<CCseScheduledProgram> progArray;
+ CleanupResetAndDestroyPushL( progArray );
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( idBuff );
+ pluginUid = readStream.ReadInt32L();
+ CleanupStack::PopAndDestroy( &readStream );
+
+ // Get schedules from database
+ iDb->GetSchedulesByPluginL( pluginUid, progArray );
+
+ // Calculate total length
+ // Number of items in array
+ length = length + 4; // Size of TInt32
+ // Data from array
+ for ( TInt i = 0 ; i < progArray.Count(); i++ )
+ {
+ length += progArray[i]->ExternalizeLength();
+ }
+
+ // Allocate write stream
+ HBufC8* retBuff = HBufC8::NewL( length );
+ CleanupStack::PushL( retBuff );
+ TPtr8 retPtr( retBuff->Des() );
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( retPtr );
+
+ // Fill stream
+ // Write number elems
+ numberOfElems = progArray.Count();
+ writeStream.WriteInt32L( numberOfElems );
+ // Add elems one by one
+ for ( TInt i = 0; i < progArray.Count(); i++ )
+ {
+ progArray[i]->ExternalizeL( writeStream );
+ }
+ writeStream.CommitL();
+
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ User::LeaveIfError( aMessage.Write( 1, retPtr ) );
+
+ CleanupStack::PopAndDestroy( retBuff );
+ CleanupStack::PopAndDestroy( &progArray );
+ }
+
+ aMessage.Complete( err );
+ CSELOGSTRING2_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetSchedulesByPluginUidL", err);
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::GetScheduleArrayLengthByTypeL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::GetScheduleArrayLengthByTypeL( const RMessage2& aMessage )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetScheduleArrayLengthByTypeL");
+ TInt32 type( 0 );
+ TBuf8<4> idBuff;
+ TBuf8<4> lenBuff;
+ TInt length( 0 );
+ idBuff.FillZ();
+
+ // Read application uid from aMessage
+ User::LeaveIfError( aMessage.Read( 0, idBuff ) );
+
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( idBuff );
+ type = readStream.ReadInt32L();
+ CleanupStack::PopAndDestroy( &readStream );
+
+ // Get schedules from database
+ RPointerArray<CCseScheduledProgram> progArray;
+ CleanupResetAndDestroyPushL( progArray );
+ iDb->GetSchedulesByTypeL( type, progArray);
+
+ // Calculate total length
+ // Number of items in array
+ length = length + 4; // Size of TInt32
+ // Data from array
+ for ( TInt i = 0 ; i < progArray.Count(); i++ )
+ {
+ length = length + progArray[i]->ExternalizeLength();
+ }
+ CleanupStack::PopAndDestroy( &progArray ); // closes progArray
+
+ lenBuff.FillZ();
+
+ // Change length value to stream so that we can send it back to client.
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( lenBuff );
+ writeStream.WriteInt32L( length );
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ User::LeaveIfError( aMessage.Write( 1, lenBuff ) );
+
+ aMessage.Complete( KErrNone );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetScheduleArrayLengthByTypeL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::GetSchedulesByTypeL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::GetSchedulesByTypeL( const RMessage2& aMessage )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetSchedulesByTypeL");
+ TInt32 type( 0 );
+ TBuf8<4> idBuff;
+ idBuff.FillZ();
+ TInt32 numberOfElems( 0 );
+ TInt length( 0 );
+
+ // Read application UID from aMessage
+ TInt err( aMessage.Read( 0, idBuff ) );
+
+ if ( err == KErrNone )
+ {
+ RPointerArray<CCseScheduledProgram> progArray;
+ CleanupResetAndDestroyPushL( progArray );
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( idBuff );
+ type = readStream.ReadInt32L();
+ CleanupStack::PopAndDestroy( &readStream );
+
+ // Get schedules from database
+ iDb->GetSchedulesByTypeL( type, progArray );
+
+ // Calculate total length
+ // Number of items in array
+ length = length + 4; // Size of TInt32
+ // Data from array
+ for ( TInt i = 0 ; i < progArray.Count(); i++ )
+ {
+ length += progArray[i]->ExternalizeLength();
+ }
+
+ // Allocate write stream
+ HBufC8* retBuff = HBufC8::NewL( length );
+ CleanupStack::PushL( retBuff );
+ TPtr8 retPtr( retBuff->Des() );
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( retPtr );
+
+ // Fill stream
+ // Write number elems
+ numberOfElems = progArray.Count();
+ writeStream.WriteInt32L( numberOfElems );
+ // Add elems one by one
+ for ( TInt i = 0; i < progArray.Count(); i++ )
+ {
+ progArray[i]->ExternalizeL( writeStream );
+ }
+ writeStream.CommitL();
+
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ User::LeaveIfError( aMessage.Write( 1, retPtr ) );
+
+ CleanupStack::PopAndDestroy( retBuff );
+ CleanupStack::PopAndDestroy( &progArray );
+ }
+
+ aMessage.Complete( err );
+ CSELOGSTRING2_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetSchedulesByTypeL", err);
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::GetScheduleArrayLengthByTimeframeL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::GetScheduleArrayLengthByTimeframeL( const RMessage2& aMessage )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetScheduleArrayLengthByTimeframeL");
+ TBuf8<20> idBuff;
+ TBuf8<sizeof( TUint32 )> retBuf; // contains length
+
+ TUint32 length( 0 );
+
+ idBuff.FillZ();
+
+ // Read schedule type from aMessage
+ User::LeaveIfError( aMessage.Read( 0, idBuff ) );
+
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( idBuff );
+
+ TUint32 lower( 0 );
+ TUint32 upper( 0 );
+
+ // Read start time from the aMessage
+ lower = readStream.ReadUint32L();
+ upper = readStream.ReadUint32L();
+ TInt64 time( 0 );
+ time = (TInt64) lower;
+ TInt64 longUpper = (TInt64) upper;
+ longUpper = longUpper << 32;
+ longUpper &= (0xFFFFFFFF00000000ULL);
+ time |= longUpper;
+ TInt64 beginning = time;
+
+ // Read end time from the aMessage
+ lower = readStream.ReadUint32L();
+ upper = readStream.ReadUint32L();
+ time = (TInt64) lower;
+ longUpper = (TInt64) upper;
+ longUpper = longUpper << 32;
+ longUpper &= (0xFFFFFFFF00000000ULL);
+ time |= longUpper;
+ TInt64 end = time;
+
+ CleanupStack::PopAndDestroy( &readStream );
+
+ RPointerArray<CCseScheduledProgram> schedules;
+ CleanupResetAndDestroyPushL( schedules );
+
+ // Get overlapping schedules
+ iDb->GetSchedulesByTimeframeL( beginning, end, schedules );
+
+ // Count length one by one
+ for ( TInt i = 0; i < schedules.Count(); i++ )
+ {
+ length += schedules[i]->ExternalizeLength();
+ }
+
+ CleanupStack::PopAndDestroy( &schedules );
+
+ retBuf.FillZ();
+
+
+ // Write length to stream so we can pass it to client
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( retBuf );
+ writeStream.WriteInt32L( length );
+ writeStream.CommitL();
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ User::LeaveIfError( aMessage.Write( 1, retBuf ) );
+
+ aMessage.Complete( KErrNone );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetScheduleArrayLengthByTimeframeL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::GetSchedulesByTimeframeL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::GetSchedulesByTimeframeL( const RMessage2& aMessage )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetSchedulesByTimeframeL");
+ TBuf8<20> idBuff;
+
+ idBuff.FillZ();
+
+ // Read schedule type from aMessage
+ User::LeaveIfError( aMessage.Read( 0, idBuff ) );
+
+ RDesReadStream readStream;
+ CleanupClosePushL( readStream );
+ readStream.Open( idBuff );
+
+ TUint32 lower( 0 );
+ TUint32 upper( 0 );
+
+ // Read start time from aMessage
+ lower = readStream.ReadUint32L();
+ upper = readStream.ReadUint32L();
+ TInt64 time( 0 );
+ time = (TInt64) lower;
+ TInt64 longUpper = (TInt64) upper;
+ longUpper = longUpper << 32;
+ longUpper &= (0xFFFFFFFF00000000ULL);
+ time |= longUpper;
+ TInt64 beginning = time;
+
+ //Read end time from aMessage
+ lower = readStream.ReadUint32L();
+ upper = readStream.ReadUint32L();
+ time = (TInt64) lower;
+ longUpper = (TInt64) upper;
+ longUpper = longUpper << 32;
+ longUpper &= (0xFFFFFFFF00000000ULL);
+ time |= longUpper;
+ TInt64 end = time;
+
+ CleanupStack::PopAndDestroy( &readStream );
+
+ RPointerArray<CCseScheduledProgram> schedules;
+ CleanupResetAndDestroyPushL( schedules );
+
+ // Get overlapping schedules from database
+ iDb->GetSchedulesByTimeframeL( beginning, end, schedules );
+
+ TUint32 length( 0 );
+
+ length += sizeof( TInt32 ); // item count added to buffer first
+
+ // Length of the schedules needed for transfer stream
+ for ( TInt i = 0; i < schedules.Count(); i++ )
+ {
+ length += schedules[i]->ExternalizeLength();
+ }
+
+ HBufC8* retBuf = HBufC8::NewLC( length );
+ TPtr8 retBufPtr( retBuf->Des() );
+
+ RDesWriteStream writeStream;
+ CleanupClosePushL( writeStream );
+ writeStream.Open( retBufPtr );
+ // write item count to buffer
+ writeStream.WriteInt32L( schedules.Count() );
+
+ // write all items to buffer
+ for ( TInt j = 0; j < schedules.Count(); j++ )
+ {
+ schedules[j]->ExternalizeL( writeStream );
+ }
+ writeStream.CommitL();
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ User::LeaveIfError( aMessage.Write( 1, retBufPtr ) );
+
+ CleanupStack::PopAndDestroy( retBuf );
+ CleanupStack::PopAndDestroy( &schedules );
+
+ aMessage.Complete( KErrNone );
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetSchedulesByTimeframeL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::ScheduleCompletedSuccesfullyL()
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::ScheduleCompletedSuccesfullyL( TUint32 aDbIdentifier )
+ {
+ CSELOGSTRING2_HIGH_LEVEL(
+ ">>>CCseSchedulerServerEngine::ScheduleCompletedSuccesfully: aDbIdentifier: %d",
+ aDbIdentifier);
+
+ TInt32 pluginUid( 0 );
+
+ // First get the plugin UID of removed schedule
+ CCseScheduledProgram* prog = CCseScheduledProgram::NewL() ;
+ CleanupStack::PushL( prog );
+ iDb->GetScheduleByDbIdentifierL( aDbIdentifier, prog );
+ pluginUid = prog->PluginUid( );
+ CleanupStack::PopAndDestroy( prog );
+
+ // Remove completed schedule from DB
+ TRAPD( err, iDb->RemoveScheduleL( aDbIdentifier ) );
+ if ( err != KErrNone )
+ {
+ CSELOGSTRING2_HIGH_LEVEL(
+ "CCseSchedulerServerEngine::ScheduleCompletedSuccesfully - iDb->RemoveScheduleL() LEAVED: %d",
+ err);
+ }
+
+ // Reschedule completed plugin
+ if( pluginUid != 0 )
+ {
+ // We have plugin Uid, reschedule that controller
+ RescheduleByPluginL( pluginUid );
+ }
+ else
+ {
+ // No plugin uid found, reschedule all.
+ RescheduleL();
+ }
+
+ if( !iCompletitionBreaker->IsActive() )
+ {
+ iCompletitionBreaker->Start(TCallBack( CompletitionCallback, this ));
+ }
+ else
+ {
+ CSELOGSTRING_HIGH_LEVEL(
+ "CCseSchedulerServerEngine::ScheduleCompletedSuccesfully - Breaker already active");
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::ScheduleCompletedSuccesfully");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::ScheduleCompletedWithError()
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::ScheduleCompletedWithErrorL(
+ TUint32 aDbIdentifier,
+ TUint32 aErrorCode )
+ {
+ CSELOGSTRING3_HIGH_LEVEL(
+ ">>>CCseSchedulerServerEngine::ScheduleCompletedWithError: aDbIdentifier: %d, aError %d",
+ aDbIdentifier,
+ aErrorCode);
+ TInt32 pluginUid( 0 );
+
+ // First get the plugin UID of removed schedule
+ CCseScheduledProgram* prog = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( prog );
+ iDb->GetScheduleByDbIdentifierL( aDbIdentifier, prog );
+ pluginUid = prog->PluginUid( );
+ CleanupStack::PopAndDestroy( prog );
+
+ // Something strange happened while executing schedule. Remove it from database.
+ TRAPD( err, iDb->RemoveScheduleL( aDbIdentifier ) );
+ if ( err != KErrNone )
+ {
+ CSELOGSTRING2_HIGH_LEVEL(
+ ">>>CCseSchedulerServerEngine::ScheduleCompletedWithError: iDb->RemoveScheduleL Leaved: %d",
+ err);
+ }
+
+ // Reschedule completed plugin
+ if( pluginUid == 0 )
+ {
+ // We have plugin Uid, reschedule that controller
+ RescheduleByPluginL( pluginUid );
+ }
+ else
+ {
+ // No plugin uid found, reschedule all.
+ RescheduleL();
+ }
+
+#if CSE_LOGGING_METHOD == 0
+ ( void )aErrorCode;
+#endif
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::ScheduleCompletedWithError");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::IncreaseScheduleRunCount( )
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::IncreaseScheduleRunCountL( TUint32 aDbIdentifier )
+ {
+ CSELOGSTRING2_HIGH_LEVEL(
+ ">>>CCseSchedulerServerEngine::IncreaseScheduleRunCountL: aDbIdentifier: %d",
+ aDbIdentifier );
+
+ TRAPD( err, iDb->IncreaseRunCountL( aDbIdentifier ) );
+
+ if (err != KErrNone )
+ {
+ CSELOGSTRING2_HIGH_LEVEL(
+ "CCseSchedulerServerEngine::IncreaseScheduleRunCount - IncreaseRunCount failed: %d. Removing from DB", err);
+
+ // IncreaseRunCount leaved. It is crucial for us that IncreaseRunCount passes.
+ // We use it to prevent scheduling engine to run certain malicious software.
+ iDb->RemoveScheduleL( aDbIdentifier );
+ }
+
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::IncreaseScheduleRunCountL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::IsAllowedToRun( )
+//
+// -----------------------------------------------------------------------------
+//
+TBool CCseSchedulerServerEngine::IsAllowedToRun( TUint32 aDbIdentifier )
+ {
+ CSELOGSTRING2_HIGH_LEVEL(
+ ">>>CCseSchedulerServerEngine::IsAllowedToRun: aDbIdentifier: %d",
+ aDbIdentifier );
+
+ TBool ret( EFalse );
+ TInt32 runCount( 0 );
+
+ TRAPD( err, runCount = iDb->GetRunCountL( aDbIdentifier ) );
+
+ if ( err == KErrNone && runCount < 3 )
+ {
+ // Set true if check went ok and there is only less than three tries to run schedule
+ ret = ETrue;
+ }
+
+ CSELOGSTRING2_HIGH_LEVEL(
+ "<<<CCseSchedulerServerEngine::IsAllowedToRun: %d", ret);
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::ScheduleNotValid( )
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::ScheduleNotValid( TUint32 aDbIdentifier )
+ {
+ CSELOGSTRING2_HIGH_LEVEL(
+ ">>>CCseSchedulerServerEngine::ScheduleNotValid: aDbIdentifier: %d",
+ aDbIdentifier );
+
+ TRAP_IGNORE( iDb->RemoveScheduleL( aDbIdentifier ) );
+
+ CSELOGSTRING_HIGH_LEVEL(
+ "<<<CCseSchedulerServerEngine::ScheduleNotValid");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::CompletitionCallback
+// -----------------------------------------------------------------------------
+//
+TInt CCseSchedulerServerEngine::CompletitionCallback( TAny* aPtr )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::CompletitionCallback");
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::CompletitionCallback");
+ return static_cast<CCseSchedulerServerEngine*>( aPtr )->HandleCompletitionCallback();
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::HandleCompletitionCallback
+// -----------------------------------------------------------------------------
+//
+TInt CCseSchedulerServerEngine::HandleCompletitionCallback()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::HandleCompletitionCallback ");
+
+ // Reschedule has been made to relevant plugin controllers.
+ // Go through controllers and remove obsolote ones
+ for( TInt i = 0; i < iPluginControllerArray.Count(); i++ )
+ {
+ // Do cleanup on controller
+ iPluginControllerArray[i]->DoCleanUp( );
+
+ if( iPluginControllerArray[i]->IsObsolete() )
+ {
+ // Delete it and remove from controller array
+ delete iPluginControllerArray[i];
+ iPluginControllerArray.Remove(i);
+ }
+ }
+
+ iServer.StopServer();
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::HandleCompletitionCallback ");
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::RequestReschedule
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::RequestReschedule( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>RequestReschedule::HandleCompletitionCallback ");
+
+ TRAP_IGNORE( RescheduleL() );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<RequestReschedule::HandleCompletitionCallback ");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::RescheduleByPluginL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::RescheduleByPluginL( TInt32 aPluginUid )
+ {
+ CSELOGSTRING2_HIGH_LEVEL(
+ ">>>CCseSchedulerServerEngine::RescheduleByPluginL - Plugin Uid: %d", aPluginUid);
+
+ TTime runTime( iDb->GetNextScheduleTimeByPluginL( aPluginUid ) );
+ TBool controllerFound( EFalse );
+
+ // Search for existing plugin controller for this schedule
+ RPointerArray<CCseScheduledProgram> schedules;
+ CleanupResetAndDestroyPushL( schedules );
+ iDb->GetSchedulesByTimeAndPluginL( runTime, aPluginUid, schedules );
+
+ // Search plugin controller that needs rescheduling
+ for( TInt i = 0; i < iPluginControllerArray.Count(); i++ )
+ {
+ if( aPluginUid == iPluginControllerArray[i]->PluginUid() )
+ {
+ if( schedules.Count() > 0 )
+ {
+ iPluginControllerArray[i]->SetSchedulesL( schedules );
+ }
+ else
+ {
+ // Remove controller if controller found but
+ // there are no schedules for it
+
+ // Check if controller can be removed right away or should it be done
+ // after callstack breaker
+ if( iPluginControllerArray[i]->IsControllerActive() )
+ {
+ CSELOGSTRING_HIGH_LEVEL(
+ "CCseSchedulerServerEngine::RescheduleByPluginL - Plugin found but no schedules, set controller to be removed");
+ iPluginControllerArray[i]->SetToBeCleared( ETrue );
+ iCompletitionBreaker->Start(TCallBack( CleanerCallback, this ));
+ }
+ else
+ {
+ CSELOGSTRING_HIGH_LEVEL(
+ "CCseSchedulerServerEngine::RescheduleByPluginL - Plugin found but no schedules, remove controller");
+ delete iPluginControllerArray[i];
+ iPluginControllerArray.Remove( i );
+ }
+ }
+
+ controllerFound = ETrue;
+ break;
+ }
+ }
+
+ if( controllerFound == EFalse )
+ {
+ // Create new controller if schedules found
+ if( schedules.Count() > 0 )
+ {
+ if( schedules[0]->PluginType() == CCseScheduledProgram::ECseUniPlugin )
+ {
+ CSELOGSTRING_HIGH_LEVEL(
+ "CCseSchedulerServerEngine::RescheduleByPluginL: Create new uniplugin controller");
+ // Create new PluginController
+ iPluginControllerArray.AppendL( CCseSchedulerUniPluginController::NewL( *this, schedules[0]->PluginUid() ) );
+ // Add schedules to just created controller
+ iPluginControllerArray[iPluginControllerArray.Count()-1]->SetSchedulesL(schedules);
+ }
+ else if ( schedules[0]->PluginType() == CCseScheduledProgram::ECseMultiPlugin )
+ {
+ CSELOGSTRING_HIGH_LEVEL(
+ "CCseSchedulerServerEngine::RescheduleByPluginL: Create new multiplugin controller");
+ // Create new PluginController
+ iPluginControllerArray.AppendL( CCseSchedulerMultiPluginController::NewL( *this, schedules[0]->PluginUid() ) );
+ // Add schedules to just created controller
+ iPluginControllerArray[iPluginControllerArray.Count()-1]->SetSchedulesL(schedules);
+ }
+ else
+ {
+ // WTF?!?!
+ CSELOGSTRING_HIGH_LEVEL(
+ "CCseSchedulerServerEngine::RescheduleByPluginL: Plugin something completely different");
+ }
+ }
+ }
+
+ // Delete schedule array.
+ CleanupStack::PopAndDestroy( &schedules );
+
+ // Stop server if we dont have any clients and there is no more
+ // reason for us to live (no schedules active).
+ iServer.StopServer();
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::RescheduleByPluginL out");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::ClearingDone()
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerEngine::ClearingDone()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::ClearingDone");
+
+ // Use completition callback to remove those controllers that aren't needed anymore
+ if( !iCompletitionBreaker->IsActive() )
+ {
+ iCompletitionBreaker->Start(TCallBack( CompletitionCallback, this ));
+ }
+ else
+ {
+ CSELOGSTRING_HIGH_LEVEL(
+ "CCseSchedulerServerEngine::ClearingDone - Breaker already active");
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::ClearingDone");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::CleanerCallback
+// -----------------------------------------------------------------------------
+//
+TInt CCseSchedulerServerEngine::CleanerCallback( TAny* aPtr )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::CleanerCallback");
+ static_cast<CCseSchedulerServerEngine*>( aPtr )->HandleCleanerCallback();
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::CleanerCallback");
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerEngine::HandleCompletitionCallback
+// -----------------------------------------------------------------------------
+//
+TInt CCseSchedulerServerEngine::HandleCleanerCallback()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::HandleCleanerCallback ");
+
+ // go through plugins and clear
+ for( TInt i = iPluginControllerArray.Count(); i > 0 ; i--)
+ {
+ if( iPluginControllerArray[i-1]->IsToBeCleared() )
+ {
+ // If ClearControllerL -call leaves it means that we couldn't signal
+ // plugin to take himself down. In such cases we leak memory, but we
+ // still need to keep going so we do not screw all the rest schedules.
+ TRAP_IGNORE( iPluginControllerArray[i-1]->ClearControllerL());
+ delete iPluginControllerArray[i-1];
+ iPluginControllerArray.Remove(i-1);
+ }
+ }
+
+ iServer.StopServer();
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::HandleCleanerCallback ");
+ return EFalse;
+ }
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/src/CCseSchedulerServerSession.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,288 @@
+/*
+* Copyright (c) 2006 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: Implementation of Scheduler server's*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCseSchedulerServerSession.h" // Header file for this class
+#include "CCseSchedulerServer.h" // Common methods for server
+#include "CCseSchedulerServerEngine.h" // Intelligence aka engine of server
+#include "CseSchedulerServer.pan" // Server panic codes
+#include <ipvideo/CseSchedulerClientServerCommon.h> // Common defines for client and server
+#include "CseDebug.h" // Debug macros
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// LOCAL CONSTANTS AND MACROS
+// None
+
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerSession::CCseSchedulerSession()
+// C++ constructor
+// -----------------------------------------------------------------------------
+//
+
+CCseSchedulerServerSession::CCseSchedulerServerSession() : CSession2(),
+ iResourceCount( 0 )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::CCseSchedulerServerSession");
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerSession::CCseSchedulerServerSession");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerSession::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerServerSession* CCseSchedulerServerSession::NewL( CCseSchedulerServer* aServer )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::NewL");
+
+ CCseSchedulerServerSession* self = new ( ELeave ) CCseSchedulerServerSession();
+ CleanupStack::PushL( self );
+ self->ConstructL( aServer );
+ CleanupStack::Pop( self );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerSession::NewL");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerSession::ConstructL()
+// second-phase C++ constructor
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerSession::ConstructL( CCseSchedulerServer* aServer )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::ConstructL");
+
+ if ( aServer )
+ {
+ aServer->Inc();
+ }
+
+ // Create new object index
+ iObjects = CObjectIx::NewL();
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerSession::ConstructL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerSession::~CCseSchedulerSession()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerServerSession::~CCseSchedulerServerSession()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::~CCseSchedulerServerSession");
+
+ delete iObjects;
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerSession::~CCseSchedulerServerSession");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerSession::ServiceL()
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerSession::ServiceL( const RMessage2& aMessage )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::ServiceL");
+
+ switch ( aMessage.Function() )
+ {
+ case ECseServCreateSubSession:
+ case ECseServCloseSubSession:
+ case ECseServCloseSession:
+ {
+ // "Common messages"
+ TRAPD( err, DispatchMessageL( aMessage ) );
+ aMessage.Complete( err );
+ }
+ break;
+
+ default:
+ {
+ // Ok, but must be subsession relative
+ CCseSchedulerServerEngine* engine =
+ (CCseSchedulerServerEngine*)iObjects->At( aMessage.Int3() );
+ if ( !engine )
+ {
+ aMessage.Complete( KErrBadHandle );
+ PanicClient( ECsePanicBadSubSessionHandle );
+ }
+ else
+ {
+ // this is the normal route,
+ // all engine commands go this way
+ TRAPD( error, engine->GeneralServiceL( aMessage ) );
+ if ( error != KErrNone )
+ {
+ CSELOGSTRING2_HIGH_LEVEL("CCseSchedulerServerSession::ServiceL - engine->GeneralServiceL() LEAVED: %d", error);
+ aMessage.Complete( error );
+ }
+ }
+ }
+ break;
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerSession::ServiceL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerSession::DispatchMessageL()
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerSession::DispatchMessageL( const RMessage2& aMessage )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::DispatchMessageL");
+
+ // Check for session-relative requests
+ switch ( aMessage.Function() )
+ {
+ case ECseServCreateSubSession:
+ NewObjectL( aMessage );
+ break;
+
+ case ECseServCloseSubSession:
+ DeleteObject( aMessage.Int3() );
+ break;
+
+ case ECseServCloseSession:
+ Server()->Dec();
+ break;
+
+ default:
+ break;
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerSession::DispatchMessageL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerSession::NewObjectL()
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerSession::NewObjectL( const RMessage2& aMessage )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::NewObjectL");
+
+ CObject* obj = Server()->GetEngineObjectL();
+ TInt handle( iObjects->AddL( obj ) );
+ // Write the handle to client
+ TPckg<TInt> handlePckg( handle );
+ TRAPD( err, aMessage.WriteL( 3, handlePckg ) );
+
+ if ( err )
+ {
+ PanicClient( ECsePanicBadRequest );
+ return;
+ }
+
+ // Notch up another resource
+ iResourceCount++;
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerSession::NewObjectL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerSession::DeleteObject()
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerSession::DeleteObject( TUint aHandle )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::DeleteObject");
+
+ // Panic if bad handle
+ CCseSchedulerServerEngine* engine = ( CCseSchedulerServerEngine* )iObjects->At( aHandle );
+ if ( !engine )
+ {
+ PanicClient( ECsePanicBadSubSessionHandle );
+ }
+
+ iResourceCount--;
+ // Deletes engine
+ iObjects->Remove( aHandle );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerSession::DeleteObject");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerServerSession::CountResources()
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCseSchedulerServerSession::CountResources()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::CountResources");
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerSession::CountResources");
+ return iResourceCount;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerSession::PanicClient()
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerServerSession::PanicClient( TCseSchedulerServPanic aPanic ) const
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::PanicClient");
+
+ _LIT( KTxtSessionPanic, "SchedulerSession" );
+ CSELOGSTRING2_HIGH_LEVEL("CCseSchedulerServerSession::PanicClient - panic code: %d", aPanic);
+ User::Panic( KTxtSessionPanic, aPanic );
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerSession::PanicClient()
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerServer* CCseSchedulerServerSession::Server()
+ {
+ return reinterpret_cast< CCseSchedulerServer* > (
+ const_cast< CServer2* > ( CSession2::Server( ) ) );
+ }
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/src/CCseSchedulerThreadPacket.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,203 @@
+/*
+* Copyright (c) 2006 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: Timer for the notifier*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCseSchedulerThreadPacket.h"
+#include <ipvideo/CCseScheduledProgram.h> // Represent one schedule in database
+#include <e32std.h>
+#include "CseDebug.h" // Debug macros
+
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// LOCAL CONSTANTS AND MACROS
+// None
+
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+// ---------------------------------------------------------------------------
+// CCseSchedulerThreadPacket::CCseSchedulerThreadPacket()
+//
+// ---------------------------------------------------------------------------
+CCseSchedulerThreadPacket::CCseSchedulerThreadPacket( ) :
+ iResultCode( KErrGeneral )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerThreadPacket::CCseSchedulerThreadPacket");
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerLandLord::CCseSchedulerLandLord");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerThreadPacket::~CCseSchedulerThreadPacket()
+//
+// ---------------------------------------------------------------------------
+CCseSchedulerThreadPacket::~CCseSchedulerThreadPacket()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerThreadPacket::~CCseSchedulerThreadPacket");
+
+ delete iSchedule;
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerThreadPacket::~CCseSchedulerThreadPacket");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerThreadPacket::NewL()
+//
+// ---------------------------------------------------------------------------
+CCseSchedulerThreadPacket* CCseSchedulerThreadPacket::NewL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerThreadPacket::NewL");
+
+ // Symbian C++ constructor
+ CCseSchedulerThreadPacket* self = new ( ELeave ) CCseSchedulerThreadPacket();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerThreadPacket::NewL");
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerThreadPacket::ConstructL()
+//
+// ---------------------------------------------------------------------------
+void CCseSchedulerThreadPacket::ConstructL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerThreadPacket::ConstructL");
+
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerThreadPacket::ConstructL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerThreadPacket::SetScheduleL()
+//
+// ---------------------------------------------------------------------------
+void CCseSchedulerThreadPacket::SetScheduleL( CCseScheduledProgram& aData )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerThreadPacket::SetSchedule");
+
+ delete iSchedule;
+ iSchedule = NULL;
+ iSchedule = CCseScheduledProgram::NewL( aData );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerThreadPacket::SetSchedule");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerThreadPacket::SetResultCode()
+//
+// ---------------------------------------------------------------------------
+void CCseSchedulerThreadPacket::SetResultCode( TInt32 aResultCode )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerThreadPacket::SetResultCode");
+
+ iResultCode = aResultCode;
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerThreadPacket::SetResultCode");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerThreadPacket::Schedule()
+//
+// ---------------------------------------------------------------------------
+CCseScheduledProgram* CCseSchedulerThreadPacket::Schedule( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerThreadPacket::Schedule");
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerThreadPacket::Schedule");
+
+ return iSchedule;
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerThreadPacket::ResultCode()
+//
+// ---------------------------------------------------------------------------
+TInt32 CCseSchedulerThreadPacket::ResultCode( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerThreadPacket::ResultCode");
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerThreadPacket::ResultCode");
+ return iResultCode;
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerThreadPacket::ShutdownSemaphore()
+//
+// ---------------------------------------------------------------------------
+RSemaphore& CCseSchedulerThreadPacket::ShutdownSemaphore( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerThreadPacket::ShutdownSemaphore");
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerThreadPacket::ShutdownSemaphore");
+ return iShutdownSemaphore;
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerThreadPacket::ShutdownCompleteSemaphore()
+//
+// ---------------------------------------------------------------------------
+RSemaphore& CCseSchedulerThreadPacket::ShutdownCompleteSemaphore( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>ShutdownCompleteSemaphore::ShutdownCompleteSemaphore");
+ CSELOGSTRING_HIGH_LEVEL("<<<ShutdownCompleteSemaphore::ShutdownCompleteSemaphore");
+ return iShutdownCompleteSemaphore;
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerThreadPacket::ShutdownSemaphore()
+//
+// ---------------------------------------------------------------------------
+void CCseSchedulerThreadPacket::SetShutdownSemaphore( RSemaphore& aSemaphore )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerThreadPacket::SetShutdownSemaphore");
+ iShutdownSemaphore = aSemaphore;
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerThreadPacket::SetShutdownSemaphore");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerThreadPacket::ShutdownCompleteSemaphore()
+//
+// ---------------------------------------------------------------------------
+void CCseSchedulerThreadPacket::SetShutdownCompleteSemaphore( RSemaphore& aSemaphore )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>ShutdownCompleteSemaphore::SetShutdownCompleteSemaphore");
+ iShutdownCompleteSemaphore = aSemaphore;
+ CSELOGSTRING_HIGH_LEVEL("<<<ShutdownCompleteSemaphore::SetShutdownCompleteSemaphore");
+ }
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/src/CCseSchedulerTimer.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,192 @@
+/*
+* Copyright (c) 2006 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: Timer for the notifier*
+*/
+
+
+
+
+// INCLUDE FILES
+#include "CCseSchedulerTimer.h" // Header file for this class
+#include "MCseSchedulerTimerObserver.h" // Observer for informing engine
+#include <e32const.h>
+#include <e32cmn.h>
+#include <e32base.h>
+#include "CseDebug.h" // Debug macros
+
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// LOCAL CONSTANTS AND MACROS
+// None
+
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+// ---------------------------------------------------------------------------
+// CCseSchedulerTimer::CCseSchedulerTimer()
+//
+// ---------------------------------------------------------------------------
+CCseSchedulerTimer::CCseSchedulerTimer( MCseSchedulerTimerObserver* aObserver ) : CTimer( CActive::EPriorityStandard )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerTimer::CCseSchedulerTimer");
+
+ // C++ default constructor
+ iObserver = aObserver;
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerTimer::CCseSchedulerTimer");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerTimer::~CCseSchedulerTimer()
+//
+// ---------------------------------------------------------------------------
+CCseSchedulerTimer::~CCseSchedulerTimer()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerTimer::~CCseSchedulerTimer");
+ Cancel();
+ iObserver = NULL;
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerTimer::~CCseSchedulerTimer");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerTimer::NewL()
+//
+// ---------------------------------------------------------------------------
+CCseSchedulerTimer* CCseSchedulerTimer::NewL(
+ MCseSchedulerTimerObserver* aObserver )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerTimer::NewL");
+
+ // Symbian C++ constructor
+ CCseSchedulerTimer* self = new ( ELeave ) CCseSchedulerTimer(aObserver);
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerTimer::NewL");
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerTimer::ConstructL()
+//
+// ---------------------------------------------------------------------------
+void CCseSchedulerTimer::ConstructL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerTimer::ConstructL");
+
+ CTimer::ConstructL();
+ CActiveScheduler::Add( this );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerTimer::ConstructL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerTimer::SetTimer()
+//
+// ---------------------------------------------------------------------------
+void CCseSchedulerTimer::SetTimer( const TTime& aTime )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerTimer::SetTimer");
+
+ // Just cancel existing and start new one
+ Cancel();
+ AtUTC( aTime );
+
+#ifdef _DEBUG
+ TBuf<100> startTimeBuf;
+ _LIT( KDateTimeFormat,"CCseSchedulerTimer::SetTimer (UTC): %1%*D/%2%*M/%3%*Y %H:%T:%S.%C#" );
+ TRAP_IGNORE( aTime.FormatL( startTimeBuf, KDateTimeFormat ) );
+ CSELOGTEXT_HIGH_LEVEL( startTimeBuf );
+#endif // _DEBUG
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerTimer::SetTimer");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerTimer::DoCancel()
+//
+// ---------------------------------------------------------------------------
+void CCseSchedulerTimer::DoCancel()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerTimer::DoCancel");
+
+ CTimer::DoCancel();
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerTimer::DoCancel");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerTimer::RunL()
+//
+// ---------------------------------------------------------------------------
+void CCseSchedulerTimer::RunL()
+ {
+ CSELOGSTRING2_HIGH_LEVEL(">>>CCseSchedulerTimer::RunL, iStatus: %d", iStatus.Int());
+
+ // Timer has fired. If everything went fine just kick the observer
+ if ( iStatus.Int() == KErrNone )
+ {
+ iObserver->RunPluginsL();
+ }
+ else
+ {
+ // Something went propably wrong, let the observer error handler decide what.
+ iObserver->TimerErrorL( iStatus.Int() );
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerTimer::RunL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerTimer::RunError
+// From CActive, called when RunL leaves.
+// -----------------------------------------------------------------------------
+//
+TInt CCseSchedulerTimer::RunError(
+ TInt aError )
+ {
+ CSELOGSTRING2_HIGH_LEVEL(">>>CCseSchedulerServerSession::RunError: aError = %d", aError );
+ // ATM there isn't leaving code in RunL so we just cancel timer if it is active.
+ Cancel();
+
+#if CSE_LOGGING_METHOD == 0
+ ( void )aError;
+#endif
+
+ // Return KErrNone to avoid crash.
+ return KErrNone;
+ }
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/src/CCseSchedulerUniPluginController.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,395 @@
+/*
+* Copyright (c) 2006 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: Base class for uni plugin controllers*
+*/
+
+
+
+
+
+// INCLUDE FILES
+#include "CCseSchedulerUniPluginController.h"
+#include "CseDebug.h" // Debug macros
+#include "CCseSchedulerPluginStarter.h"
+#include "CCseSchedulerLandLord.h"
+#include <ipvideo/CCseScheduledProgram.h>
+#include "CCseSchedulerTimer.h"
+#include "CCseSchedulerServerEngine.h"
+
+// EXTERNAL DATA STRUCTURES
+// None.
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None.
+
+// CONSTANTS
+// None
+
+// MACROS
+// None.
+
+// LOCAL CONSTANTS AND MACROS
+// None.
+
+// MODULE DATA STRUCTURES
+// None.
+
+// LOCAL FUNCTION PROTOTYPES
+// None.
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerUniPluginController::CCseSchedulerUniPluginController
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerUniPluginController::CCseSchedulerUniPluginController (
+ CCseSchedulerServerEngine& aEngine,
+ TInt32 aPluginUid ) :
+ CCseSchedulerPluginControllerBase( aEngine, aPluginUid ),
+ iLandLord( NULL ),
+ iIsLandLordWorking( EFalse )
+ {
+ CSELOGSTRING_HIGH_LEVEL(
+ ">>>CCseSchedulerUniPluginController::CCseSchedulerUniPluginController");
+
+ CSELOGSTRING_HIGH_LEVEL(
+ "<<<CCseSchedulerUniPluginController::CCseSchedulerUniPluginController");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerUniPluginController::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerUniPluginController* CCseSchedulerUniPluginController::NewL(
+ CCseSchedulerServerEngine& aEngine,
+ TInt32 aPluginUid )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerUniPluginController::NewL");
+
+ CCseSchedulerUniPluginController* self =
+ new( ELeave ) CCseSchedulerUniPluginController( aEngine, aPluginUid );
+ CleanupStack::PushL( self );
+ self->ConstructL( );
+ CleanupStack::Pop( self );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerUniPluginController::NewL");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerUniPluginController::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerUniPluginController::ConstructL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerUniPluginController::ConstructL");
+
+ CCseSchedulerPluginControllerBase::ConstructL();
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerUniPluginController::ConstructL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerUniPluginController::~CCseSchedulerUniPluginController
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCseSchedulerUniPluginController::~CCseSchedulerUniPluginController()
+ {
+ CSELOGSTRING_HIGH_LEVEL(
+ ">>>CCseSchedulerUniPluginController::~CCseSchedulerUniPluginController");
+ delete iLandLord;
+ iLandLord = NULL;
+ CSELOGSTRING_HIGH_LEVEL(
+ "<<<CCseSchedulerUniPluginController::~CCseSchedulerUniPluginController");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerUniPluginController::RunPluginsL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerUniPluginController::RunPluginsL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerUniPluginController::RunPluginsL");
+
+ // Is there something to be run?!?
+ if(iScheduleArray.Count() >0 )
+ {
+ // Check if there is security reasons for this schedule why this
+ // schedule shouldn't be run
+ if( iEngine.IsAllowedToRun( iScheduleArray[0]->DbIdentifier() ) )
+ {
+ // Check if LandLord is still working. If he is, we just fall through
+ // because schedule will be kicked when current plugin completes
+ if( iIsLandLordWorking == EFalse )
+ {
+ // When we come here in UniPluginController it means that there isn't any
+ // threads running on LandLord side. Scrap the old if it exists and create new one.
+ if ( iLandLord )
+ {
+ delete iLandLord;
+ iLandLord = NULL;
+ }
+
+ iLandLord = CCseSchedulerLandLord::NewL( this );
+
+ iLandLord->SetScheduleL( *iScheduleArray[0] );
+
+ iEngine.IncreaseScheduleRunCountL( iScheduleArray[0]->DbIdentifier() );
+
+ iIsLandLordWorking = ETrue;
+
+ iLandLord->RunPluginL();
+ }
+ }
+ else
+ {
+ // Schedule cannot be run anymore due to security reasons
+ // Signal engine to remove schedule from DB
+ iEngine.ScheduleNotValid( iScheduleArray[0]->DbIdentifier() );
+
+ // Remove schedule own list
+ delete iScheduleArray[0];
+ iScheduleArray.Remove( 0 );
+
+ // Call ourselves again.
+ RunPluginsL();
+ }
+ }
+ else
+ {
+ // No schedules...!?!? REEEEESCHEDULE!!!
+ iEngine.RequestReschedule();
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerUniPluginController::RunPluginsL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerUniPluginController::SetSchedulesL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerUniPluginController::SetSchedulesL(
+ RPointerArray<CCseScheduledProgram>& aScheduleArray )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerUniPluginController::SetSchedules");
+
+ // The aScheduleArray parameter contains schedules which are either before
+ // or at the same time as the existing ones in the iScheduleArray.
+ // Just destroy the old ones and replace with new ones.
+ // Also cancel the timer because the schedule to run may be different
+
+ iScheduleArray.ResetAndDestroy();
+ iTimer->Cancel();
+
+ // Go through all given schedules and copy them our array
+ for( TInt i = 0; i < aScheduleArray.Count(); i++)
+ {
+ CCseScheduledProgram* schedule =
+ CCseScheduledProgram::NewL(*aScheduleArray[i] );
+ CleanupStack::PushL( schedule );
+
+ iScheduleArray.AppendL( schedule );
+
+ CleanupStack::Pop( schedule );
+ }
+
+ // If we have schedules, set the timer
+ if (iScheduleArray.Count() > 0 && !iIsLandLordWorking)
+ {
+ // All the schedules have same time
+ iTimer->SetTimer( iScheduleArray[0]->StartTime() );
+ }
+
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerUniPluginController::SetSchedules");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerUniPluginController::ScheduledEventCompleted
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerUniPluginController::ScheduleCompletedL( const TUint32 aDbIdentifier,
+ TInt aCompletitionCode )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerUniPluginController::ScheduleCompletedL");
+
+ if ( aCompletitionCode == KErrNone )
+ {
+ ScheduleCompletedSuccesfullyL( aDbIdentifier );
+ }
+ else
+ {
+ HandleScheduleErrorL( aDbIdentifier, aCompletitionCode );
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerUniPluginController::ScheduleCompletedL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerUniPluginController::ScheduleCompletedSuccesfullyL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerUniPluginController::ScheduleCompletedSuccesfullyL( const TUint32 aDbIdentifier )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerUniPluginController::ScheduleCompletedSuccesfullyL");
+
+ // Remove completed schedule from list
+ for ( TInt i = iScheduleArray.Count(); i > 0; i--)
+ {
+ if( iScheduleArray[i-1]->DbIdentifier() == aDbIdentifier )
+ {
+ delete iScheduleArray[i-1];
+ iScheduleArray.Remove( i-1 );
+ }
+ }
+
+ // After all this LandLord has finished everything. He may rest now
+ iIsLandLordWorking = EFalse;
+
+ // Notify engine about completition.
+ iEngine.ScheduleCompletedSuccesfullyL( aDbIdentifier );
+
+ // If there is still schedule(s), set timer for it
+ if( iScheduleArray.Count() > 0 )
+ {
+ iTimer->SetTimer( iScheduleArray[0]->StartTime() );
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerUniPluginController::ScheduleCompletedSuccesfullyL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerUniPluginController::HandleScheduleErrorL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerUniPluginController::HandleScheduleErrorL( const TUint32 aDbIdentifier,
+ TUint32 aCompletitionCode )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerUniPluginController::HandleScheduleErrorL");
+
+ // Remove completed schedule from list
+ for ( TInt i = iScheduleArray.Count(); i > 0; i--)
+ {
+ if( iScheduleArray[i-1]->DbIdentifier() == aDbIdentifier )
+ {
+ delete iScheduleArray[i-1];
+ iScheduleArray.Remove( i-1 );
+ }
+ }
+
+ // After all this LandLord has finished everything. He may rest now
+ iIsLandLordWorking = EFalse;
+
+ // Here we could try to handle plugin errors. Problem is that scheduler doesn't
+ // know anything about schedule it is running and so there cannot be tailored
+ // error handling for each plugin. In the end, we just complete schedule
+ // to engine with error code (ends up removing schedule from DB).
+ iEngine.ScheduleCompletedWithErrorL( aDbIdentifier, aCompletitionCode );
+
+ // If there is still schedule(s), set timer for it
+ if( iScheduleArray.Count() > 0 )
+ {
+ iTimer->SetTimer( iScheduleArray[0]->StartTime() );
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerUniPluginController::HandleScheduleErrorL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerUniPluginController::TimerErrorL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerUniPluginController::TimerErrorL( const TInt32 aError )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerUniPluginController::TimerErrorL");
+
+ if ( aError == KErrAbort )
+ {
+ // System time changed. Make sanity check and start timer again.
+ CSELOGSTRING_HIGH_LEVEL(
+ ">>>CCseSchedulerUniPluginController::TimerErrorL, system time has changed");
+ if ( iScheduleArray.Count() > 0 )
+ {
+ TTime now;
+ now.UniversalTime();
+ // Time still in the future
+ if ( now < iScheduleArray[0]->StartTime() )
+ {
+ iTimer->SetTimer( iScheduleArray[0]->StartTime() );
+ }
+ else
+ {
+ // If schedule is in the past let the "normal" route decide when
+ // it is he's her time to be run
+ RunPluginsL();
+ }
+ }
+ return;
+ }
+
+ if ( aError == KErrUnderflow )
+ {
+ // Scheduled time is in the past, pass it to notifier. It should decide what to do
+ CSELOGSTRING_HIGH_LEVEL(
+ ">>>CCseSchedulerServerEngine::TimerErrorL, scheduled time is in the past");
+ RunPluginsL();
+ return;
+ }
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerUniPluginController::TimerErrorL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerUniPluginController::ClearController
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerUniPluginController::ClearControllerL( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerUniPluginController::ClearControllerL");
+
+ iLandLord->ClearL();
+
+ iScheduleArray.ResetAndDestroy();
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerUniPluginController::ClearControllerL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerUniPluginController::ClearController
+//
+// -----------------------------------------------------------------------------
+//
+TBool CCseSchedulerUniPluginController::IsControllerActive( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerUniPluginController::IsControllerActive");
+
+ CSELOGSTRING2_HIGH_LEVEL("<<<CCseSchedulerUniPluginController::IsControllerActive: %d",
+ iIsLandLordWorking);
+
+ return iIsLandLordWorking;
+ }
+
+// End of file.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/src/CCseSemaphoreController.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,173 @@
+/*
+* Copyright (c) 2006 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: Observer for plugin thread if shutdown is signalled.*
+*/
+
+
+
+// INCLUDE FILES
+#include "CCseSemaphoreController.h"
+#include "MCseSemaphoreSignalObserver.h"
+#include "CseDebug.h" // Debug macros
+
+
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// LOCAL CONSTANTS AND MACROS
+static TUint KCSeSemaphorePollingInterval = 5000;
+
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+// ---------------------------------------------------------------------------
+// CCseSchedulerTimer::CCseSemaphoreController()
+//
+// ---------------------------------------------------------------------------
+CCseSemaphoreController::CCseSemaphoreController( RSemaphore& aSemaphore,
+ MCseSemaphoreSignalObserver& aObserver )
+ : CTimer( EPriorityNormal ),
+ iSemaphore( aSemaphore ),
+ iObserver( aObserver ),
+ iInterval( KCSeSemaphorePollingInterval )
+
+
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSemaphoreController::CCseSemaphoreController");
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSemaphoreController::CCseSemaphoreController");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerTimer::~CCseSemaphoreController()
+//
+// ---------------------------------------------------------------------------
+CCseSemaphoreController::~CCseSemaphoreController()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSemaphoreController::~CCseSemaphoreController");
+
+ Cancel();
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSemaphoreController::~CCseSemaphoreController");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerTimer::NewL()
+//
+// ---------------------------------------------------------------------------
+CCseSemaphoreController* CCseSemaphoreController::NewL( RSemaphore& aSemaphore,
+ MCseSemaphoreSignalObserver& aObserver )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSemaphoreController::NewL");
+
+ // Symbian C++ constructor
+ CCseSemaphoreController* self = new ( ELeave ) CCseSemaphoreController( aSemaphore,
+ aObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSemaphoreController::NewL");
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSemaphoreController::ConstructL()
+//
+// ---------------------------------------------------------------------------
+void CCseSemaphoreController::ConstructL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSemaphoreController::ConstructL");
+
+ CTimer::ConstructL();
+ CActiveScheduler::Add( this );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSemaphoreController::ConstructL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSemaphoreController::Start
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSemaphoreController::Start( )
+ {
+ Cancel();
+
+ After( TTimeIntervalMicroSeconds32( iInterval ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSemaphoreController::Stop
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSemaphoreController::Stop( )
+ {
+ Cancel();
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSemaphoreController::SetInterval
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSemaphoreController::SetInterval( TUint aInterval )
+ {
+ iInterval = aInterval;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSemaphoreController::RunL
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSemaphoreController::RunL( )
+ {
+ // Check if shutdown is signalled
+ if( KErrNone == iSemaphore.Wait( 1 ) )
+ {
+ CSELOGSTRING_HIGH_LEVEL("CCseSemaphoreController::RunL - Semaphore signalled, inform observer");
+ // Shutdown signalled, start taking down the plugin
+ iObserver.SemaphoreSignalled();
+ Cancel();
+ }
+ else
+ {
+ // If not, start again.
+ Start();
+ }
+ }
+
+
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2004-2005 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:
+*
+*/
+
+
+
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+#include <platform_paths.hrh>
+
+#include "../SchedulerClient/group/bld.inf"
+#include "../SchedulerServer/group/bld.inf"
+
+PRJ_EXPORTS
+
+PRJ_MMPFILES
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/inc/CseDebug.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,321 @@
+/*
+* Copyright (c) 2006 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:
+*
+*/
+
+
+
+
+
+#ifndef CSEDEBUG_H
+#define CSEDEBUG_H
+
+#include <flogger.h>
+
+
+
+// Define logging level here
+
+// Minimum log output
+#define CSE_HIGH_LEVEL_TRACES
+
+#define CSE_MIDDLE_LEVEL_TRACES
+
+// Maximum log output
+#define CSE_LOW_LEVEL_TRACES
+
+
+
+
+/*
+-----------------------------------------------------------------------------
+
+ LOGGING MACROs
+
+ USE THESE MACROS IN YOUR CODE
+
+ Usage:
+
+ Example: CSELOGSTRING_HIGH_LEVEL ("Test");
+ Example: CSELOGSTRING2_HIGH_LEVEL ("Test %d", aValue);
+ Example: CSELOGSTRING3_HIGH_LEVEL ("Test %d %d", aValue1, aValue2);
+ Example: CSELOGSTRING4_HIGH_LEVEL ("Test %d %d %d", aValue1, aValue2, aValue3);
+
+ Example: CSE_LOG_STR_DESC_HIGH_LEVEL (own_desc);
+ Example: CSE_LOG_STR_DESC2_HIGH_LEVEL (own_desc, aValue));
+ Example: CSE_LOG_STR_DESC3_HIGH_LEVEL (own_desc, aValue, aValue2);
+ Example: CSE_LOG_STR_DESC4_HIGH_LEVEL (own_desc, aValue, aValue2, aValue3);
+
+-----------------------------------------------------------------------------
+*/
+
+
+
+#ifdef CSE_HIGH_LEVEL_TRACES
+
+#define CSELOGTEXT_HIGH_LEVEL(AAAA) CSE_LOGTEXT(AAAA)
+#define CSELOGSTRING_HIGH_LEVEL(AAAA) CSE_LOGSTRING(AAAA)
+#define CSELOGSTRING2_HIGH_LEVEL(AAAA,BBBB) CSE_LOGSTRING2(AAAA,BBBB)
+#define CSELOGSTRING3_HIGH_LEVEL(AAAA,BBBB,CCCC) CSE_LOGSTRING3(AAAA,BBBB,CCCC)
+#define CSELOGSTRING4_HIGH_LEVEL(AAAA,BBBB,CCCC,DDDD) CSE_LOGSTRING4(AAAA,BBBB,CCCC,DDDD)
+
+#define CSE_LOG_STR_DESC_HIGH_LEVEL(AAAA) CSE_LOG_STR_DESC(AAAA)
+#define CSE_LOG_STR_DESC2_HIGH_LEVEL(AAAA,BBBB) CSE_LOG_STR_DESC2(AAAA,BBBB)
+#define CSE_LOG_STR_DESC3_HIGH_LEVEL(AAAA,BBBB,CCCC) CSE_LOG_STR_DESC3(AAAA,BBBB,CCCC)
+#define CSE_LOG_STR_DESC4_HIGH_LEVEL(AAAA,BBBB,CCCC,DDDD) CSE_LOG_STR_DESC4(AAAA,BBBB,CCCC,DDDD)
+
+#else
+
+#define CSELOGTEXT_HIGH_LEVEL(AAAA)
+#define CSELOGSTRING_HIGH_LEVEL(AAAA)
+#define CSELOGSTRING2_HIGH_LEVEL(AAAA,BBBB)
+#define CSELOGSTRING3_HIGH_LEVEL(AAAA,BBBB,CCCC)
+#define CSELOGSTRING4_HIGH_LEVEL(AAAA,BBBB,CCCC,DDDD)
+
+#define CSE_LOG_STR_DESC_HIGH_LEVEL(AAAA)
+#define CSE_LOG_STR_DESC2_HIGH_LEVEL(AAAA,BBBB)
+#define CSE_LOG_STR_DESC3_HIGH_LEVEL(AAAA,BBBB,CCCC)
+#define CSE_LOG_STR_DESC4_HIGH_LEVEL(AAAA,BBBB,CCCC,DDDD)
+
+#endif
+
+
+#ifdef CSE_MIDDLE_LEVEL_TRACES
+#define CSELOGSTRING_MIDDLE_LEVEL(AAAA) CSE_LOGSTRING(AAAA)
+#define CSELOGSTRING2_MIDDLE_LEVEL(AAAA,BBBB) CSE_LOGSTRING2(AAAA,BBBB)
+#define CSELOGSTRING3_MIDDLE_LEVEL(AAAA,BBBB,CCCC) CSE_LOGSTRING3(AAAA,BBBB,CCCC)
+#define CSELOGSTRING4_MIDDLE_LEVEL(AAAA,BBBB,CCCC,DDDD) CSE_LOGSTRING4(AAAA,BBBB,CCCC,DDDD)
+
+#define CSE_LOG_STR_DESC_MIDDLE_LEVEL(AAAA) CSE_LOG_STR_DESC(AAAA)
+#define CSE_LOG_STR_DESC2_MIDDLE_LEVEL(AAAA,BBBB) CSE_LOG_STR_DESC2(AAAA,BBBB)
+#define CSE_LOG_STR_DESC3_MIDDLE_LEVEL(AAAA,BBBB,CCCC) CSE_LOG_STR_DESC3(AAAA,BBBB,CCCC)
+#define CSE_LOG_STR_DESC4_MIDDLE_LEVEL(AAAA,BBBB,CCCC,DDDD) CSE_LOG_STR_DESC4(AAAA,BBBB,CCCC,DDDD)
+
+#else
+
+#define CSELOGSTRING_MIDDLE_LEVEL(AAAA)
+#define CSELOGSTRING2_MIDDLE_LEVEL(AAAA,BBBB)
+#define CSELOGSTRING3_MIDDLE_LEVEL(AAAA,BBBB,CCCC)
+#define CSELOGSTRING4_MIDDLE_LEVEL(AAAA,BBBB,CCCC,DDDD)
+
+#define CSE_LOG_STR_DESC_MIDDLE_LEVEL(AAAA)
+#define CSE_LOG_STR_DESC2_MIDDLE_LEVEL(AAAA,BBBB)
+#define CSE_LOG_STR_DESC3_MIDDLE_LEVEL(AAAA,BBBB,CCCC)
+#define CSE_LOG_STR_DESC4_MIDDLE_LEVEL(AAAA,BBBB,CCCC,DDDD)
+
+#endif
+
+
+#ifdef CSE_LOW_LEVEL_TRACES
+
+#define CSELOGTEXT_LOW_LEVEL(AAAA) CSE_LOGTEXT(AAAA)
+#define CSELOGSTRING_LOW_LEVEL(AAAA) CSE_LOGSTRING(AAAA)
+#define CSELOGSTRING2_LOW_LEVEL(AAAA,BBBB) CSE_LOGSTRING2(AAAA,BBBB)
+#define CSELOGSTRING3_LOW_LEVEL(AAAA,BBBB,CCCC) CSE_LOGSTRING3(AAAA,BBBB,CCCC)
+#define CSELOGSTRING4_LOW_LEVEL(AAAA,BBBB,CCCC,DDDD) CSE_LOGSTRING4(AAAA,BBBB,CCCC,DDDD)
+
+#define CSE_LOG_STR_DESC_LOW_LEVEL(AAAA) CSE_LOG_STR_DESC(AAAA)
+#define CSE_LOG_STR_DESC2_LOW_LEVEL(AAAA,BBBB) CSE_LOG_STR_DESC2(AAAA,BBBB)
+#define CSE_LOG_STR_DESC3_LOW_LEVEL(AAAA,BBBB,CCCC) CSE_LOG_STR_DESC3(AAAA,BBBB,CCCC)
+#define CSE_LOG_STR_DESC4_LOW_LEVEL(AAAA,BBBB,CCCC,DDDD) CSE_LOG_STR_DESC4(AAAA,BBBB,CCCC,DDDD)
+
+#else
+
+#define CSELOGTEXT_LOW_LEVEL(AAAA)
+#define CSELOGSTRING_LOW_LEVEL(AAAA)
+#define CSELOGSTRING2_LOW_LEVEL(AAAA,BBBB)
+#define CSELOGSTRING3_LOW_LEVEL(AAAA,BBBB,CCCC)
+#define CSELOGSTRING4_LOW_LEVEL(AAAA,BBBB,CCCC,DDDD)
+
+#define CSE_LOG_STR_DESC_LOW_LEVEL(AAAA)
+#define CSE_LOG_STR_DESC2_LOW_LEVEL(AAAA,BBBB)
+#define CSE_LOG_STR_DESC3_LOW_LEVEL(AAAA,BBBB,CCCC)
+#define CSE_LOG_STR_DESC4_LOW_LEVEL(AAAA,BBBB,CCCC,DDDD)
+
+#endif
+
+
+
+/*
+-----------------------------------------------------------------------------
+
+ LOG SELECTION
+
+-----------------------------------------------------------------------------
+*/
+
+// 0 = No logging,
+// 1 = Flogger,
+// 2 = RDebug
+
+
+#ifndef _DEBUG
+
+// UREL BUILD:
+#define CSE_LOGGING_METHOD 0 // No logging in UREL builds
+
+#else // urel
+
+
+
+#ifdef __WINSCW__
+
+// WINSCW BUILD:
+#define CSE_LOGGING_METHOD 2 // RDebug is default with emulator
+
+#else
+
+// ARMV5 BUILD:
+#define CSE_LOGGING_METHOD 1 // Flogger is default with target device
+
+#endif
+
+
+
+#endif // _DEBUG
+
+
+
+
+/*
+-----------------------------------------------------------------------------
+
+ LOG SETTINGS
+
+-----------------------------------------------------------------------------
+*/
+
+#if CSE_LOGGING_METHOD == 1 // Flogger
+
+#include <flogger.h>
+_LIT(KCSELogFolder,"CSE");
+_LIT(KCSELogFile,"CSELOG.TXT");
+
+#elif CSE_LOGGING_METHOD == 2 // RDebug
+
+#include <e32svr.h>
+
+#endif
+
+
+
+
+
+#if CSE_LOGGING_METHOD == 1 // Flogger
+
+
+#define CSE_LOGTEXT(AAA) RFileLogger::Write(KCSELogFolder(),KCSELogFile(),EFileLoggingModeAppend, AAA)
+
+#define CSE_LOG_STR_DESC(AAA) RFileLogger::Write(KCSELogFolder(),KCSELogFile(),EFileLoggingModeAppend, AAA)
+#define CSE_LOG_STR_DESC2(AAA,BBB) do { RFileLogger::WriteFormat(KCSELogFolder(),KCSELogFile(),EFileLoggingModeAppend,TRefByValue<const TDesC>(AAA()),BBB); } while (0)
+#define CSE_LOG_STR_DESC3(AAA,BBB,CCC) do { RFileLogger::WriteFormat(KCSELogFolder(),KCSELogFile(),EFileLoggingModeAppend,TRefByValue<const TDesC>(AAA()),BBB,CCC); } while (0)
+#define CSE_LOG_STR_DESC4(AAA,BBB,CCC,DDD) do { RFileLogger::WriteFormat(KCSELogFolder(),KCSELogFile(),EFileLoggingModeAppend,TRefByValue<const TDesC>(AAA()),BBB,CCC,DDD); } while (0)
+
+#define CSE_LOGSTRING(AAA) do { _LIT(tempCSELogDes,AAA); RFileLogger::Write(KCSELogFolder(),KCSELogFile(),EFileLoggingModeAppend,tempCSELogDes()); } while (0)
+#define CSE_LOGSTRING2(AAA,BBB) do { _LIT(tempCSELogDes,AAA); RFileLogger::WriteFormat(KCSELogFolder(),KCSELogFile(),EFileLoggingModeAppend,TRefByValue<const TDesC>(tempCSELogDes()),BBB); } while (0)
+#define CSE_LOGSTRING3(AAA,BBB,CCC) do { _LIT(tempCSELogDes,AAA); RFileLogger::WriteFormat(KCSELogFolder(),KCSELogFile(),EFileLoggingModeAppend,TRefByValue<const TDesC>(tempCSELogDes()),BBB,CCC); } while (0)
+#define CSE_LOGSTRING4(AAA,BBB,CCC,DDD) do { _LIT(tempCSELogDes,AAA); RFileLogger::WriteFormat(KCSELogFolder(),KCSELogFile(),EFileLoggingModeAppend,TRefByValue<const TDesC>(tempCSELogDes()),BBB,CCC,DDD); } while (0)
+
+// Time stamp
+_LIT(KCseLogTimeFormatString, "CSE TIMESTAMP: %H:%T:%S:%*C3");
+#define CSE_LOGSTRING_TIMESTAMP { \
+ TTime logTime; \
+ logTime.HomeTime(); \
+ TBuf<256> logBuffer; \
+ logTime.FormatL(logBuffer, KCseLogTimeFormatString); \
+ RFileLogger::Write(KCSELogFolder(), KCSELogFile(), EFileLoggingModeAppend, logBuffer); \
+ }
+
+// Memory stamp
+_LIT(KCseLogMemoryStampString, "CSE MEMORYSTAMP: %d KB");
+#define CSE_LOGSTRING_MEMORYSTAMP { \
+ User::CompressAllHeaps(); \
+ TMemoryInfoV1Buf logMemory; \
+ UserHal::MemoryInfo(logMemory); \
+ TInt logMemoryInt = (TInt)(logMemory().iFreeRamInBytes); \
+ TBuf<256> logMemoryStr; \
+ logMemoryStr.Format(KCseLogMemoryStampString, (logMemoryInt / 1024) ); \
+ RFileLogger::Write(KCSELogFolder(), KCSELogFile(), EFileLoggingModeAppend, logMemoryStr); \
+ }
+
+
+#elif CSE_LOGGING_METHOD == 2 // RDebug
+
+
+#define CSE_LOGTEXT(AAA) RDebug::Print(AAA)
+
+#define CSE_LOG_STR_DESC(AAA) RDebug::Print(AAA)
+#define CSE_LOG_STR_DESC2(AAA,BBB) do { RDebug::Print(AAA, BBB); } while (0)
+#define CSE_LOG_STR_DESC3(AAA,BBB,CCC) do { RDebug::Print(AAA, BBB, CCC); } while (0)
+#define CSE_LOG_STR_DESC4(AAA,BBB,CCC,DDD) do { RDebug::Print(AAA, BBB, CCC, DDD); } while (0)
+
+#define CSE_LOGSTRING(AAA) do { _LIT(tempCSELogDes,AAA); RDebug::Print(tempCSELogDes); } while (0)
+#define CSE_LOGSTRING2(AAA,BBB) do { _LIT(tempCSELogDes,AAA); RDebug::Print(tempCSELogDes, BBB); } while (0)
+#define CSE_LOGSTRING3(AAA,BBB,CCC) do { _LIT(tempCSELogDes,AAA); RDebug::Print(tempCSELogDes, BBB, CCC); } while (0)
+#define CSE_LOGSTRING4(AAA,BBB,CCC,DDD) do { _LIT(tempCSELogDes,AAA); RDebug::Print(tempCSELogDes, BBB, CCC, DDD); } while (0)
+
+// Time stamp
+_LIT(KCseLogTimeFormatString, "CSE TIMESTAMP: %H:%T:%S:%*C3");
+#define CSE_LOGSTRING_TIMESTAMP { \
+ TTime logTime; \
+ logTime.HomeTime(); \
+ TBuf<256> logBuffer; \
+ logTime.FormatL(logBuffer, KCseLogTimeFormatString); \
+ RDebug::Print(logBuffer); \
+ }
+
+// Memory stamp
+_LIT(KCseLogMemoryStampString, "CSE MEMORYSTAMP: %d KB");
+#define CSE_LOGSTRING_MEMORYSTAMP { \
+ User::CompressAllHeaps(); \
+ TMemoryInfoV1Buf logMemory; \
+ UserHal::MemoryInfo(logMemory); \
+ TInt logMemoryInt = (TInt)(logMemory().iFreeRamInBytes); \
+ TBuf<256> logMemoryStr; \
+ logMemoryStr.Format(KCseLogMemoryStampString, (logMemoryInt / 1024) ); \
+ RDebug::Print(logMemoryStr); \
+ }
+
+
+#else // TF_LOGGING_METHOD == 0 or invalid
+
+
+#define CSE_LOGSTRING(AAA)
+#define CSE_LOGSTRING2(AAA,BBB)
+#define CSE_LOGSTRING3(AAA,BBB,CCC)
+#define CSE_LOGSTRING4(AAA,BBB,CCC,DDD)
+
+#define CSE_LOGTEXT(AAA)
+
+#define CSE_LOG_STR_DESC(AAA)
+#define CSE_LOG_STR_DESC2(AAA,BBB)
+#define CSE_LOG_STR_DESC3(AAA,BBB,CCC)
+#define CSE_LOG_STR_DESC4(AAA,BBB,CCC,DDD)
+
+#define CSE_LOGSTRING_TIMESTAMP
+#define CSE_LOGSTRING_MEMORYSTAMP
+
+
+#endif // TF_LOGGING_METHOD
+
+
+
+
+
+
+
+#endif // CSEDEBUG_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/dvrengine_api/dvrengine_api.metaxml Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,17 @@
+<?xml version="1.0" ?>
+<api id="8843e8566ead14253a7cf0b7cea28343" dataversion="1.0">
+<name>DVR Engine API</name>
+<description>DVR Engine API is used for RTSP streaming and RTP file playback.</description>
+<type>C++</type>
+<subsystem>videoserviceutils</subsystem>
+<libs><lib name="CommonRecordingEngineClient.lib"/>
+<lib name="DvrRtpClipHandler.lib"/>
+<lib name="DvrRtpUtils.lib"/>
+<lib name="DvrSdpParser.lib"/>
+</libs>
+<release category="domain" sinceversion="5.1"/>
+<attributes>
+<htmldocprovided>no</htmldocprovided>
+<adaptation>no</adaptation>
+</attributes>
+</api>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/dvrengine_api/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,51 @@
+/*
+* Copyright (c) 2007-2008 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: Common recording engine domain api*
+*/
+
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+PRJ_EXPORTS
+// CommonRecordingEngineClient
+../inc/ipvideo/CRTypeDefs.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/CRTypeDefs.h )
+../inc/ipvideo/CCRDvrApi.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/CCRDvrApi.h )
+../inc/ipvideo/CCRAPIBase.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/CCRApiBase.h )
+../inc/ipvideo/MCREngineObserver.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/MCREngineObserver.h )
+
+// DvrSdpParser
+../inc/ipvideo/CDvrSdpParser.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/CDvrSdpParser.h )
+
+// DvrRtpClipHandler
+../inc/ipvideo/CRtpFileBase.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/CRtpFileBase.h )
+../inc/ipvideo/CRtpFileBase.inl MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/CRtpFileBase.inl )
+../inc/ipvideo/CRtpClipManager.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/CRtpClipManager.h )
+../inc/ipvideo/CRtpClipHandler.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/CRtpClipHandler.h )
+../inc/ipvideo/CRtpClipHandler.inl MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/CRtpClipHandler.inl )
+../inc/ipvideo/MRtpClipRepairObserver.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/MRtpClipRepairObserver.h )
+../inc/ipvideo/MRtpFileObserver.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/MRtpFileObserver.h )
+../inc/ipvideo/MRtpFileWriteObserver.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/MRtpFileWriteObserver.h )
+../inc/ipvideo/MRtpFileReadObserver.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/MRtpFileReadObserver.h )
+../inc/ipvideo/CRtpMetaHeader.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/CRtpMetaHeader.h )
+
+// DvrRtpUtils
+../inc/ipvideo/CRtpUtil.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/CRtpUtil.h )
+
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/dvrengine_api/inc/ipvideo/CCRAPIBase.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) 2005 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: Interface for Common recording engine, common part*
+*/
+
+
+
+
+#ifndef CCRAPIBASE_H
+#define CCRAPIBASE_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CCRServerHandleSingleton;
+
+// CLASS DECLARATION
+
+/**
+* General client api base class that all API classes in
+* common recording engine API implementations need to inherit.
+*
+* @lib CommonRecordingEngineClient.lib
+* @since Series 60 3.0
+*/
+NONSHARABLE_CLASS( CCRApiBase ) : public CBase
+ {
+
+protected: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ */
+ CCRApiBase();
+
+ /**
+ * Destructor.
+ * @return None.
+ */
+ virtual ~CCRApiBase();
+
+ /**
+ * Symbian 2nd phase constructor can leave.
+ */
+ void BaseConstructL();
+
+protected: // data
+
+ CCRServerHandleSingleton* iSingleton;
+
+ };
+
+#endif // CCRAPIBASE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/dvrengine_api/inc/ipvideo/CCRDvrApi.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,315 @@
+/*
+* 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: Interface for Common recording engine, the part of API*
+*/
+
+
+
+
+#ifndef CCRDVRAPI_H
+#define CCRDVRAPI_H
+
+// INCLUDES
+#include <ipvideo/CCRApiBase.h>
+#include <ipvideo/CRTypeDefs.h>
+#include <es_sock.h>
+
+// CONSTANTS
+const TReal KRealZero( 0.0 );
+const TReal KRealMinusOne( -1.0 );
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CCRMsgQueueObserver;
+class MCREngineObserver;
+
+// CLASS DECLARATION
+
+/**
+* Ip-LiveTV-specific client api that manages service functionality.
+*
+* @lib CommonRecordingEngineClient.lib
+* @since Series 60 3.0
+*/
+class CCRDvrApi : public CCRApiBase
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ IMPORT_C static CCRDvrApi* NewL( MCREngineObserver *aObserver );
+
+ /**
+ * Two-phased constructor.
+ */
+ IMPORT_C static CCRDvrApi* NewL();
+
+ /**
+ * Destructor.
+ * @return None.
+ */
+ IMPORT_C virtual ~CCRDvrApi();
+
+public: // New methods
+
+ /**
+ * Tells receiving engine which IAP to use
+ * @since Series 60 3.0
+ * @param aIapId is handle to RConnection that is already open.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt SetIap( const TSubConnectionUniqueId& aIapId );
+
+ /**
+ * Tells receiving engine to cancel IAP selection.
+ * @since Series 60 3.0
+ * @param none.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt CancelSetIap();
+
+ /**
+ * Prepares RTSP stream for player.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aRtspUrl is set of parameters required for rtsp.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt PlayRtspUrl( TUint& aSessionChk,
+ const SCRRtspParams& aRtspUrl );
+
+ /**
+ * Prepares DVB-H live stream for player.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aLiveParams is set of parameters required for DVB-H.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt PlayDvbhStream( TUint& aSessionChk,
+ const SCRLiveParams& aLiveParams );
+
+ /**
+ * Changes DVB-H service of live streaming.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aLiveParams is set of parameters required for DVB-H.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt ChangeDvbhService( TUint& aSessionChk,
+ const SCRLiveParams& aLiveParams );
+
+ /**
+ * Prepares RTP clip stream for player.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aRtpFile is set of parameters required for rtsp.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt PlayRtpFile( TUint& aSessionChk,
+ const SCRRtpPlayParams& aRtpFile );
+
+ /**
+ * Prepares RTP clip stream for player.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aRtpHandle a open file handle for RTP file.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt PlayRtpFile( TUint& aSessionChk,
+ const RFile& aRtpHandle );
+
+ /**
+ * Starts recording for currently active stream.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aRecordParams a parameters for recording.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt RecordCurrentStream( const TUint aSessionChk,
+ const SCRRecordParams& aRecordParams );
+
+ /**
+ * Starts recording for RTSP live stream.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aRtspUrl is set of parameters required for rtsp.
+ * @param aRecordParams a parameters for recording.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt RecordRtspStream( TUint& aSessionChk,
+ const SCRRtspParams& aRtspUrl,
+ const SCRRecordParams& aRecordParams );
+
+ /**
+ * Starts recording for DVB-H live stream.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aLiveParams is set of parameters required for DVB-H.
+ * @param aRecordParams a parameters for recording.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt RecordDvbhStream( TUint& aSessionChk,
+ const SCRLiveParams& aLiveParams,
+ const SCRRecordParams& aRecordParams );
+
+ /**
+ * Pauses/Resumes recording of wanted stream.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aStart a start or end pausing.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt PauseRecordStream( const TUint aSessionChk,
+ const TBool& aStart );
+
+ /**
+ * Stops recording of wanted stream.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt StopRecordStream( const TUint aSessionChk );
+
+ /**
+ * Starts time shifting for wanted stream.
+ * @since Series 60 3.0
+ * @param aTimeShiftChk a session definition checksum.
+ * @param aCurrentChk a session definition of existing session.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt StartTimeShift( TUint& aTimeShiftChk,
+ const TUint aCurrentChk );
+
+ /**
+ * Stops time shifting mode.
+ * @since Series 60 3.0
+ * @param aTimeShiftChk a session definition checksum.
+ * @param aCurrentChk a session definition of existing session.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt StopTimeShift( const TUint aTimeShiftChk,
+ const TUint aCurrentChk );
+
+ /**
+ * Method for ordering "play" for packet 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 ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt PlayCommand( const TUint aSessionChk,
+ const TReal aStartPos = KRealMinusOne,
+ const TReal aEndPos = KRealMinusOne );
+
+ /**
+ * Method for ordering "pause" for packet source.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt PauseCommand( const TUint aSessionChk );
+
+ /**
+ * Method for ordering "stop" for packet source.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt StopCommand( const TUint aSessionChk );
+
+ /**
+ * Setter for play position of packet source.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aPosition a postion of RTP playback.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt SetPosition( const TUint aSessionChk,
+ const TInt64 aPosition );
+
+ /**
+ * Getter for play position of packet source.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aPosition a postion of RTP playback.
+ * @param aDuration a duration of RTP clip.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt GetPosition( const TUint aSessionChk,
+ TInt64& aPosition,
+ TInt64& aDuration );
+
+ /**
+ * Method for ordering closing a source and all sinks.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt CloseSession( const TUint aSessionChk );
+
+ /**
+ * Prepares rtp file playing as a live source.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt PlayNullSource( TUint& aSessionChk );
+
+ /**
+ * Prepares rtsp stream for null sink.
+ * @since Series 60 3.0
+ * @param aSessionChk a session definition checksum.
+ * @param aRtspUrl is set of parameters required for rtsp
+ * @return KErrNone if ok, otherwise system-wide error codes.
+ */
+ IMPORT_C TInt PlayRtspUrlToNullSink( TUint& aSessionChk,
+ const SCRRtspParams& aRtspUrl );
+
+private: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ */
+ CCRDvrApi();
+
+ /**
+ * Symbian 2nd phase constructor can leave.
+ */
+ void ConstructL( MCREngineObserver *aObserver );
+
+ /**
+ * Symbian 2nd phase constructor can leave.
+ */
+ void ConstructL();
+
+private: // Data
+
+ /**
+ * Queue observer.
+ */
+ CCRMsgQueueObserver* iQueueObserver;
+
+ };
+
+#endif // CCRDVRAPI_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/dvrengine_api/inc/ipvideo/CDvrSdpParser.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,671 @@
+/*
+* 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: Class for parsing a SDP.*
+*/
+
+
+
+
+#ifndef CDVRSDPPARSER_H
+#define CDVRSDPPARSER_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+
+/**
+* Class that parses SDP. Not fully but enough to set up a
+* rtp stream from rtsp based on information extracted by this class.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CDvrSdpParser : public CBase
+ {
+
+public: // Data types
+
+ /**
+ * Enum for indicating contents of the rtp stream(s).
+ */
+ enum TDvrPacketProvidings
+ {
+ EDvrAudioOnly = 0, /**< This packet source feeds only audio stream */
+ EDvrVideoOnly, /**< This packet source feeds only video stream */
+ EDvrBothAudioAndVideo, /**< This packet source feeds audio and video */
+ EDvrNoProgramAtAll, /**< Nothing useful found */
+ EDvrSourceCount /**< Final number of different sources */
+ };
+
+ /**
+ * Defines media point struct.
+ */
+ struct SMediaPoint
+ {
+ /*
+ * Start point of media in SDP.
+ */
+ TInt iStart;
+
+ /*
+ * Length in bytes of media in SDP.
+ */
+ TInt iLength;
+
+ };
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @return CDvrSdpParser pointer to CDvrSdpParser class.
+ */
+ IMPORT_C static CDvrSdpParser* NewL();
+
+ /**
+ * Two-phased constructor.
+ */
+ IMPORT_C static CDvrSdpParser* NewLC();
+
+ /**
+ * Destructor.
+ */
+ IMPORT_C virtual ~CDvrSdpParser();
+
+public: // New functions
+
+ /**
+ * Method that is used to give SDP to this class.
+ * "PLAY rtsp://vishnu.wipsl.com/oops/winter_fun.mp4/ RTSP/1.0\r\n..."
+ * @since Series 60 3.0
+ * @param aSDP is the SDP data.
+ * @param aBaseUrl is the rtsp url used to fetch this sdp.
+ * If it is not available, a (NULL,0) descriptor needs to be passed.
+ * It will be used to construct media urls in case where there is no
+ * absolute media urls in the sdp.
+ * @return none.
+ */
+ IMPORT_C void TryParseL( const TDesC8 &aSdp ,
+ const TDesC8 &aBaseUrl );
+
+ /**
+ * Parses SDP file.
+ * @since Series 60 3.0
+ * @param aSDP is the SDP data.
+ * @return none.
+ */
+ IMPORT_C void TryParseL( const TDesC8& aSdp );
+
+ /**
+ * Method for adding new SDP line.
+ * @since Series 60 3.0
+ * @param aStreamId a section where to add the string.
+ * KErrNotFound: common part
+ * 0 (usually) : video
+ * 1 (usually) : audio
+ * 2 (usually) : subtitle (not supported yet)
+ * @param aLine a string to add.
+ * @rerturn a system wide error code.
+ */
+ IMPORT_C void NewLineL( const TInt aStreamId,
+ const TDesC8& aLine );
+
+ /**
+ * Method for getting SDP data.
+ * @since Series 60 3.0
+ * @param aSdp a pointer to SDP data.
+ * @rerturn KErrNone if SDP available, otherwise KErrNotFound.
+ */
+ IMPORT_C TInt GetSdp( TPtrC8& aSdp );
+
+ /**
+ * Method for asking whether audio and/or video is included.
+ * @since Series 60 3.0
+ * @param none.
+ * @return indication about stream contents.
+ */
+ IMPORT_C CDvrSdpParser::TDvrPacketProvidings SupportedContent( void );
+
+ /**
+ * Method for getting attributes related to session.
+ * @since Series 60 3.0
+ * @param none.
+ * @rerturn array of strings, may be empty.
+ */
+ IMPORT_C RArray<TPtrC8>& SessionAttributes( void );
+
+ /**
+ * Method for getting attributes related to session.
+ * @since Series 60 3.0
+ * @param none.
+ * @rerturn array of strings, may be empty.
+ */
+ IMPORT_C RArray<TPtrC8>& VideoAttributes( void );
+
+ /**
+ * Method for getting attributes related to session.
+ * @since Series 60 3.0
+ * @param none.
+ * @rerturn array of strings, may be empty.
+ */
+ IMPORT_C RArray<TPtrC8>& AudioAttributes( void );
+
+ /**
+ * Method for getting all data streams related to session.
+ * @since Series 60 3.0
+ * @param none.
+ * @rerturn array of strings, may be empty.
+ */
+ IMPORT_C RArray<TPtrC8>& DataStreams( void );
+
+ /**
+ * Method for getting Ipv6 of the SDP having been parsed.
+ * @since Series 60 3.0
+ * @param none.
+ * @return ETrue if SDP had Ipv6 address in it.
+ */
+ IMPORT_C TBool IsIpv4Sdp( void );
+
+ /**
+ * Method for getting multicastness of the SDP having been parsed.
+ * @since Series 60 3.0
+ * @param none.
+ * @return ETrue if SDP had multicast characteristics in it.
+ */
+ IMPORT_C TBool IsMultiCastSdp( void );
+
+ /**
+ * Method for getting audio control addr e.g. the text from sdp line
+ * that begins with a=control: and is located in audio media block
+ * @since Series 60 3.0
+ * @param none.
+ * @return a audio control addr.
+ */
+ IMPORT_C TPtrC8 AudioControlAddr( void );
+
+ /**
+ * Method for getting video control addr e.g. the text from sdp line
+ * that begins with a=control: and is located in video media block
+ * @since Series 60 3.0
+ * @param none.
+ * @return a video control addr.
+ */
+ IMPORT_C TPtrC8 VideoControlAddr( void );
+
+ /**
+ * Method for getting audio ip addr e.g. the text from sdp line
+ * that begins with c=IN IP... : and is located in audio media block
+ * @since Series 60 3.0
+ * @param none.
+ * @return video control addr. ownership is NOT transferred. may be NULL.
+ */
+ IMPORT_C TPtrC8 AudioIpAddr( void );
+
+ /**
+ * Method for getting video ip addr e.g. the text from sdp line
+ * that begins with c=IN IP... : and is located in video media block
+ * @since Series 60 3.0
+ * @param none.
+ * @return video control addr. ownership is NOT transferred. may be NULL.
+ */
+ IMPORT_C TPtrC8 VideoIpAddr( void );
+
+ /**
+ * Getter for audio port.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a audio port number.
+ */
+ IMPORT_C TInt AudioPort( void );
+
+ /**
+ * Getter for video port.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a video port number.
+ */
+ IMPORT_C TInt VideoPort( void );
+
+ /**
+ * Getter for audio bitrate.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a audio bit rate.
+ */
+ IMPORT_C TInt AudioBitrate( void );
+
+ /**
+ * Getter for video bitrate.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a video bit rate.
+ */
+ IMPORT_C TInt VideoBitrate( void );
+
+ /**
+ * Getter for audio stream id.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a audio stream id.
+ */
+ IMPORT_C TInt AudioStreamId( void );
+
+ /**
+ * Getter for video stream id.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a video stream id.
+ */
+ IMPORT_C TInt VideoStreamId( void );
+
+ /**
+ * Getter for video timer granularity
+ * @since Series 60 3.0
+ * @param none.
+ * @return Video stream timestamp granularity as 1/s.
+ */
+ IMPORT_C TUint32 VideoTimerGranularity( void );
+
+ /**
+ * Getter for audio timer granularity
+ * @since Series 60 3.0
+ * @param none.
+ * @return Audio stream timestamp granularity as 1/s.
+ */
+ IMPORT_C TUint32 AudioTimerGranularity( void );
+
+ /**
+ * Checker method for SDP representing realnetworks realmedia content
+ * @since Series 60 3.0
+ * @param none.
+ * @return ETrue if sdp presents realmedia stream.
+ */
+ IMPORT_C TBool IsRealMediaContent( void );
+
+ /**
+ * Media identifier for audio. From a=rtpmap:96 H264/90000
+ * the number 96. Usually value is 96 for video and
+ * 97 for audio but might be other
+ * @since Series 60 3.0
+ * @param none.
+ * @return Media id
+ */
+ IMPORT_C TInt MediaIdentifierAudio( void );
+ /**
+ * Media identifier for video. From a=rtpmap:96 H264/90000
+ * the number 96. Usually value is 96 for video and
+ * 97 for audio but might be other
+ * @since Series 60 3.0
+ * @param none.
+ * @return Media id.
+ */
+ IMPORT_C TInt MediaIdentifierVideo( void );
+
+ /**
+ * Checker method for SDP representing livestream.
+ * @since Series 60 3.0
+ * @param none.
+ * @return ETrue if sdp presents livestream.
+ */
+ IMPORT_C TBool IsLiveStream( void );
+
+protected: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ */
+ CDvrSdpParser();
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ * @param a a reference to socket server .
+ */
+ void ConstructL();
+
+private: // New methods
+
+ /**
+ * Finds media(s) from SDP file.
+ * @since Series 60 3.0
+ * @param aSDP is the SDP data.
+ * @return none.
+ */
+ void FindMediasL( const TDesC8& aSdp );
+
+ /**
+ * Finds media(s) from SDP file.
+ * @since Series 60 3.0
+ * @param aPoints a array for media points.
+ * @return none.
+ */
+ void MakeMediaBuffersL( RArray<SMediaPoint>& aPoints );
+
+ /**
+ * Finds session attributes from SDP file.
+ * @since Series 60 3.0
+ * @param aPoints a array for media points.
+ * @return none.
+ */
+ void FindSessionAttributesL( RArray<SMediaPoint>& aPoints );
+
+ /**
+ * Finds media(s) from SDP file.
+ * @since Series 60 3.0
+ * @param aStreamId a section where to add the string.
+ * @param aLine a string to add.
+ * @return none.
+ */
+ void InserNewLineL( TInt aStreamId,
+ const TDesC8& aLine );
+
+ /**
+ * Method for finding points of medias in SDP.
+ * @since Series 60 3.0
+ * @param aPoints a array for media points.
+ * @rerturn none.
+ */
+ void FindMediaPointsL( RArray<SMediaPoint>& aPoints );
+
+ /**
+ * Method for finding next media section start in SDP.
+ * @since Series 60 3.0
+ * @param aPtr a pointer to buffer where serch from.
+ * @rerturn a next media section start point.
+ */
+ TInt MediaSectionStart( const TDesC8& aPtr );
+
+ /**
+ * Append media info from media section to array.
+ * @since Series 60 3.0
+ * @param aMediaPtr a pointer to buffer of media section.
+ * @param aAddress a IP address of media.
+ * @return none.
+ */
+ void UpdateMediaInfoL( const TDesC8& aMediaPtr,
+ HBufC8*& aAddress );
+
+ /**
+ * Finds IP addr from a buffer.
+ * @since Series 60 3.0
+ * @param aPtr a pointer to buffer where to search.
+ * @return a IP address if found.
+ */
+ HBufC8* GetIpAddrL( const TDesC8& aPtr );
+
+ /**
+ * Getter for clock rate of media.
+ * @since Series 60 3.0
+ * @param aPtr a pointer to buffer where serch from.
+ * @return a clock rate value of the media.
+ */
+ TUint GetClockRateL( const TDesC8& aPtr );
+
+ /**
+ * Append media info from media section to array.
+ * @since Series 60 3.0
+ * @param aMediaPtr a pointer to buffer of media section.
+ * @param aControlAddr a control address of media.
+ * @return none.
+ */
+ void GetControlL( const TDesC8& aMediaPtr,
+ HBufC8*& aControlAddr );
+
+ /**
+ * Method for checking if addr is multicast addr.
+ * @since Series 60 3.0
+ * @param aCLine is c= line from SDP.
+ * @return none.
+ */
+ void CheckForMulticast( const TDesC8& aLine );
+
+ /**
+ * Method that picks up all attribute lines from sdp
+ * block and stores them in given array
+ * @since Series 60 3.0
+ * @param aSdpSection is section from sdp. In practice m=video section
+ * or m=audio section or the common section from beginning.
+ * @aAttributeList is an array where each attribute-line is stored.
+ */
+ void FindAttributesL ( const TDesC8& aSdpSection,
+ RArray<TPtrC8>& aAttributeList );
+
+ /**
+ * Method that picks up all data stream lines from sdp.
+ * @since Series 60 3.0
+ * @param aSdpSection is section from sdp. In practice m=video section
+ * or m=audio section or the common section from beginning.
+ * @aStreamsList is an array where each data stream-line is stored.
+ * @return none.
+ */
+ void FindDataStreamsL( const TDesC8& aSdpSection,
+ RArray<TPtrC8>& aStreamsList );
+
+ /**
+ * Reads integer value from a buffer.
+ * @since Series 60 3.0
+ * @param aPtr a pointer to buffer where serch from.
+ * @param aKeyword a keyword for line.
+ * @return a integer value base on keyword.
+ */
+ TInt GetIntL( const TDesC8& aPtr,
+ const TDesC8& aKeyword );
+
+ /**
+ * Reads string value from a buffer.
+ * @since Series 60 3.0
+ * @param aPtr a pointer to buffer where serch from.
+ * @param aKeyword a keyword for line.
+ * @return a buffer base on keyword.
+ */
+ HBufC8* GetStringL( const TDesC8& aPtr,
+ const TDesC8& aKeyword );
+
+ /**
+ * Finds location where keyword data start.
+ * @since Series 60 3.0
+ * @param aPtr a pointer to buffer where serch from.
+ * @param aKeyword a keyword for line.
+ * @return a point in buffer where keyword data start.
+ */
+ TInt FindStart( const TDesC8& aPtr,
+ const TDesC8& aKeyword );
+
+ /**
+ * Finds location where keyword data ends.
+ * @since Series 60 3.0
+ * @param aPtr a pointer to buffer where serch from.
+ * @param aStart a point where keyword data starts.
+ * Return a point to line change.
+ * @param aIgnoreSpace if true, points to the line feed only if.
+ * @return a point in buffer where keyword data end.
+ */
+ TInt GetLen( const TDesC8& aPtr,
+ const TInt aStart,
+ const TBool aIgnoreSpace = EFalse );
+
+ /**
+ * Finds smaller non error value integer.
+ * @since Series 60 3.0
+ * @param aValue1 a value 1 for comparison.
+ * @param aValue2 a value 2 for comparison.
+ * @return smaller integer if one or both inputs are positive,
+ otherwise return KErrNotFound.
+ */
+ TInt MinNonError( const TInt aValue1,
+ const TInt aValue2 );
+
+ /**
+ * Convert a string to unsigned integer.
+ * @since Series 60 3.0
+ * @param aString a string to convert.
+ * @return a integer value base on string.
+ */
+ TUint StrToUint( const TDesC8& aString );
+
+ /**
+ * Delete variables.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void DeleteVariables( void );
+
+private: // Data
+
+ /**
+ * Pointer to actual SDP text being parsed.
+ */
+ HBufC8* iSdp;
+
+ /**
+ * String containing (possible) base url.
+ */
+ HBufC8* iBaseUrl;
+
+ /**
+ * IP in common section.
+ */
+ HBufC8* iCommonIp;
+
+ /**
+ * Media section buffer(s)
+ */
+ RArray<TPtrC8> iMediaBuf;
+
+ /**
+ * Media attributes for both audio and video.
+ */
+ RArray<TPtrC8> iSessionAttributes;
+
+ /**
+ * Media attributes for audio not containing a=control attr.
+ */
+ RArray<TPtrC8> iAudioAttributes;
+
+ /**
+ * Media attributes for video not containing a=control attr.
+ */
+ RArray<TPtrC8> iVideoAttributes;
+
+ /**
+ * Data streams found from SDP.
+ */
+ RArray<TPtrC8> iDataStreams;
+
+ /**
+ * Url that may be used to SETUP iAudioControlAddr RTSP/1.0\r.
+ */
+ HBufC8* iAudioControlAddr;
+
+ /**
+ * Url that may be used to SETUP iVideoControlAddr RTSP/1.0\r.
+ */
+ HBufC8* iVideoControlAddr;
+
+ /**
+ * Ip number from audio block from c=IP.. line.
+ */
+ HBufC8* iAudioIpAddr;
+
+ /**
+ * Ip number from video block from c=IP.. line.
+ */
+ HBufC8* iVideoIpAddr;
+
+ /**
+ * Audio port or KErrNotFound if not available.
+ */
+ TInt iAudioPort;
+
+ /**
+ * Video port or KErrNotFound if not available.
+ */
+ TInt iVideoPort;
+
+ /**
+ * Subtitle port or KErrNotFound if not available.
+ */
+ TInt iTitlePort;
+
+ /**
+ * Audio bitrate or KErrNotFound if not available.
+ */
+ TInt iAudioBitrate;
+
+ /**
+ * Video bitrate or KErrNotFound if not available.
+ */
+ TInt iVideoBitrate;
+
+ /**
+ * Audio strema id.
+ */
+ TInt iAudioStreamId;
+
+ /**
+ * Video stream id.
+ */
+ TInt iVideoStreamId;
+
+ /**
+ * How much is one video rtp timer tick in wall clock time
+ * (usually 1/90000 seconds).
+ */
+ TUint32 iVideoTimerGranularity;
+
+ /**
+ * How much is one audio rtp timer tick in wall clock time
+ * (usually 1/<samplerate> seconds).
+ */
+ TUint32 iAudioTimerGranularity;
+
+ /**
+ * If the sdp parsed was Ipv4 or not.
+ */
+ TBool iIsIpv4;
+
+ /**
+ * If the sdp parsed was multicast or not.
+ */
+ TBool iIsMulticast;
+
+ /**
+ * Media identifier for audio. From a=rtpmap:96 H264/90000 the number 96.
+ * Usually value 96 is for video and 97 for audio, but might be other.
+ */
+ TInt iMediaIdentifierAudio;
+
+ /**
+ * Media identifier for video.
+ */
+ TInt iMediaIdentifierVideo;
+
+ };
+
+#endif // CDVRSDPPARSER_H
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/dvrengine_api/inc/ipvideo/CRTypeDefs.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,216 @@
+/*
+* Copyright (c) 2006 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: Common type definitions for both client and server parts*
+*/
+
+
+#ifndef CRTYPEDEFS_H
+#define CRTYPEDEFS_H
+
+// INCLUDES
+#include <e32base.h>
+#include <f32file.h>
+
+// CONSTANTS
+_LIT( KCRServerNameExe, "CommonRecordingEngine.exe" );
+_LIT( KCRServerSemaphoreName, "CommonRecServerSemaphore" );
+_LIT( KCRMsgQueueName, "CRMsgQueue%d" );
+
+/** Max RTSP Name/password len */
+const TInt KMaxNameLen( 40 );
+/** Max RTSP URI len */
+const TUint KMaxUrlLen( 256 );
+
+// The server version. A version must be specified
+// when creating a session with the server
+const TUint KCRServMajorVersionNumber( 0 );
+const TUint KCRServMinorVersionNumber( 1 );
+const TUint KCRServBuildVersionNumber( 0 );
+const TUint KCRStackSize( 2 * KDefaultStackSize );
+const TUint KCRHeapSize( 0xF0000 );
+const TUint KCRMaxHeapSize( 0x1F0000 );
+
+// Queue name length (10 from fixed part and
+// 10 from maximum numbers in 32 value
+const TUint KCRQueueNameLength( 20 );
+
+// MACROS
+// None.
+
+// DATA TYPES
+/**
+* Different messagetypes going from DVR engine to client lib.
+* Note that client lib maps this to yet another enum before
+* reporting the event via MCRStreamObserver::NotifyL
+*/
+enum TCRQueueMsg
+ {
+ ECRMsgQueueAuthenticationNeeded, /**< Needs new username and password for authentication */
+ ECRMsgQueueAttachCompleted, /**< Connection Attach completed and connection ready to be used */
+ ECRMsgQueueConnectionError, /**< Unable to open connection in RTP engine & CR engine */
+ ECRMsgQueueNotEnoughBandwidth, /**< Stream bitrate higher than (estimated) available connection bandwidth */
+ ECRMsgQueueSwitchingToTcp, /**< Switching to tcp-streaming; client is supposed to init player */
+ ECRMsgQueueNormalEndOfStream, /**< clip ends normally */
+ ECRMsgQueueStreamIsLiveStream, /**< indicates that we are streaming clip that cannot be paused */
+ ECRMsgQueueStreamIsRealMedia, /**< Clip would have been (unsupported) realnetworks realmedia over rdt */
+ ECRMsgQueueTestSinkData, /**< Data from TestSink (former NullSink) to test client */
+ ECRMsgQueueSdpAvailable, /**< Used to communicate SDP availability to client */
+ ECRMsgQueueReadyToSeek, /**< Used to communicate seeking possibility */
+ ECRMsgQueueRecordingStarted, /**< Used to communicate recording state */
+ ECRMsgQueueRecordingPaused, /**< Used to communicate recording state */
+ ECRMsgQueueRecordingEnded /**< Used to communicate recording state */
+ };
+
+/**
+* Different message types going from TestSink (NullSink) to client lib.
+* Embedded in TCRQueueMsg::ECRMsgQueueTestSinkData
+*/
+enum TCRTestSinkData
+ {
+ ECRTestSinkStateIdle,
+ ECRTestSinkStateSdpAvailable,
+ ECRTestSinkStateSeqAndTSAvailable,
+ ECRTestSinkStatePlaying,
+ ECRTestSinkStateClosing,
+ };
+
+/**
+* Different record formats.
+*/
+enum TCRRecordFormat
+ {
+ ECRRecordFormatRtp, /**< Nokia's propriatary RTP clip format */
+ ECRRecordFormat3gp, /**< Normal 3GPP file format */
+ ECRRecordTimeShift /**< Time shifting with Nokia's propriatary format */
+ };
+
+/**
+ * This structure is sent over message queue where
+ * api sits listening
+ */
+struct SCRQueueEntry
+ {
+ TCRQueueMsg iMsg; /**< Identifies the message */
+ TInt iErr; /**< Can be used to pass error value related to message */
+ TInt iSessionId; /**< Points to session generating the message. 0 points no session, broadcast */
+ };
+
+/**
+* Structure used to communicate the Internet Access Point that
+* DVR engine may use
+*/
+struct SCRRtspIapParams
+ {
+ TInt32 iIap; /**< Internet Access Point ID from COMMS db. Currently not used */
+ TUint32 iConnectionId; /**< Handle of opened RConnection. Currently used */
+ TBuf<KCRQueueNameLength> iQueueName; /**< Name of RMSgQueue that DVR engine will use to report progress back */
+ };
+
+/**
+* Data structure specifying RTSP address
+*/
+struct SCRRtspParams
+ {
+ TBuf<KMaxUrlLen> iUrl ; /**< usually something like rtsp://server.name... */
+ TBuf<KMaxNameLen> iUserName; /**< RTSP Username. May be blank if server is not going to reply 401 */
+ TBuf<KMaxNameLen> iPassword; /**< RTSP password. May be blank if server is not going to reply 401 */
+ TBuf<KCRQueueNameLength> iQueueName; /**< Name of RMSgQueue that DVR engine will use to report progress back */
+ TName iProxyServerAddr ; /**< Possible rtsp proxy server */
+ TInt iProxyServerPort ; /**< Rtsp proxy port number */
+ };
+
+/**
+* Defines live stream params.
+*/
+struct SCRLiveParams
+ {
+ TPtrC8 iSdpData;
+ };
+
+/**
+* Defines RTP playback params.
+*/
+struct SCRRtpPlayParams
+ {
+ TFileName iFileName;
+ };
+
+/**
+* Defines recording params.
+*/
+struct SCRRecordParams
+ {
+ TPtrC iFileName;
+ TCRRecordFormat iFormat;
+ TPtrC iServiceName;
+ TPtrC iProgramName;
+ TPtrC8 iSdpData;
+ TInt iPostRule;
+ TInt iParental;
+ TTime iEndTime;
+ };
+
+/**
+* Opcodes used in message passing between client and server.
+*/
+enum TCRServRqst
+ {
+ // Server request
+ ECRServBase = 450,
+ ECRServConnect,
+ ECRServCreateSubSession,
+ ECRServCloseSubSession,
+ ECRServCloseSession,
+ ECRServReset,
+ ECRServCancelAll,
+ ECRServLastEnum,
+ // API for LiveTV specific commands
+ ECRLiveTvBase = 500,
+ ECRSetIap,
+ ECRCancelSetIap,
+ ECRPlayRtspUrl,
+ ECRPlayDvbhLive,
+ ECRChangeService,
+ ECRPlayRtpFile,
+ ECRPlayRtpHandle,
+ ECRRecordCurrentStream,
+ ECRRecordRtspStream,
+ ECRRecordDvbhStream,
+ ECRPauseRecordStream,
+ ECRStopRecordStream,
+ ECRStartTimeShift,
+ ECRStopTimeShift,
+ ECRPlayCommand,
+ ECRPauseCommand,
+ ECRStopCommand,
+ ECRSetPosition,
+ ECRGetPosition,
+ ECRCloseSession,
+ ECRPlayNullSource,
+ ECRPlayRtspUrlToNullSink,
+ ECRLiveTvLastEnum
+ };
+
+/**
+* Opcodes used in message passing from server.
+*/
+enum TCRServResponse
+ {
+ ECRStreamPauseHanling = 550,
+ ECRStreamEndHandling
+ };
+
+#endif // CRTYPEDEFS_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/dvrengine_api/inc/ipvideo/CRtpClipHandler.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,323 @@
+/*
+* 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: Interface for RTP file actions.*
+*/
+
+
+
+
+#ifndef CRTPCLIPHANDLER_H
+#define CRTPCLIPHANDLER_H
+
+// INCLUDES
+#include <ipvideo/CRtpFileBase.h>
+#include <ipvideo/MRtpFileObserver.h>
+#include <ipvideo/MRtpFileWriteObserver.h>
+#include <ipvideo/MRtpFileReadObserver.h>
+#include <ipvideo/CRTypeDefs.h>
+
+// CONSTANTS
+const TInt KDvrMaximumTimeShift( 12 * 60 * 60 ); // 12 hours
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CRtpToFile;
+class CRtpFromFile;
+
+// CLASS DECLARATION
+
+/**
+* Handles RTP storing/reading in a clip with a proprietary file format.
+*
+* @lib RtpClipHandler.lib
+* @since Series 60 3.0
+*/
+class CRtpClipHandler : public CBase,
+ public MRtpFileObserver
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @return CRtpClipHandler pointer to CRtpClipHandler class.
+ */
+ IMPORT_C static CRtpClipHandler* NewL();
+
+ /**
+ * Destructor.
+ */
+ IMPORT_C virtual ~CRtpClipHandler();
+
+public: // New functions
+
+ /**
+ * Registers RTP file write observer.
+ * @since Series 60 3.0
+ * @param aObs a pointer to class which handles callback.
+ * @return none.
+ */
+ IMPORT_C void RegisterWriteObserver( MRtpFileWriteObserver* aObs );
+
+ /**
+ * Registers RTP file read observer.
+ * @since Series 60 3.0
+ * @param aObs a pointer to class which handles callback.
+ * @return none.
+ */
+ IMPORT_C void RegisterReadObserver( MRtpFileReadObserver* aObs );
+
+ /**
+ * Starts RTP recording to a file.
+ * @since Series 60 3.0
+ * @param aRecParams a recording info structure.
+ * @param aAction a save action for clip mode.
+ * @return none.
+ */
+ IMPORT_C void StartRecordingL(
+ const MRtpFileWriteObserver::SRtpRecParams& aRecParams,
+ const MRtpFileWriteObserver::TRtpSaveAction& aAction );
+
+ /**
+ * Saves next RTP group to a clip.
+ * @since Series 60 3.0
+ * @param aGroup a RTP group data.
+ * @param aGroupLength a length of group.
+ * @param aAction a save action for current group.
+ * @return none.
+ */
+ IMPORT_C void SaveNextGroupL(
+ TPtr8& aGroup,
+ TUint aGroupLength,
+ const MRtpFileWriteObserver::TRtpSaveAction& aAction );
+
+ /**
+ * Getter for writing activity state.
+ * @since Series 60 3.0
+ * @param none.
+ * @return true if writing ongoing, otherwise false.
+ */
+ IMPORT_C TBool WritingActive( void ) const;
+
+ /**
+ * Getter for current length of the clip.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a total length of the clip.
+ */
+ IMPORT_C TUint GetCurrentLength( void ) const;
+
+ /**
+ * Clip loop mode set for time shift.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ IMPORT_C void TimeShiftPauseL();
+
+ /**
+ * Default values for rbf record params.
+ * @since Series 60 3.0
+ * @param aParams a recording parameters.
+ * @param aIndex a index for time shift clip name.
+ * @return none.
+ */
+ IMPORT_C void DefaultRecParams( MRtpFileWriteObserver::SRtpRecParams& aParams,
+ const TInt aIndex );
+
+ /**
+ * Setter recording end time of the clip.
+ * @since Series 60 3.0
+ * @param aEndTime new end time for the clip.
+ * @return none.
+ */
+ IMPORT_C void UpdateRecordEndTime( const TTime& aEndTime );
+
+ /**
+ * Resumes RTP recording.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ IMPORT_C void ResumeRecordingL( void );
+
+ /**
+ * Stops RTP recording.
+ * @since Series 60 3.0
+ * @param aError a stop error code.
+ * @return none.
+ */
+ IMPORT_C void StopRecording( const TInt aError );
+
+ /**
+ * Starts RTP playback from a clip.
+ * @since Series 60 3.0
+ * @param aParams a RTP clip play params.
+ * @param aTimeShift a time shift mode or not.
+ * @return none.
+ */
+ IMPORT_C void StartPlayBackL( const SCRRtpPlayParams& aParams,
+ const TBool aTimeShift = EFalse );
+
+ /**
+ * Starts RTP playback from a clip.
+ * @since Series 60 3.0
+ * @param aRtpHandle a open file handle for RTP file.
+ * @return none.
+ */
+ IMPORT_C void StartPlayBackL( const RFile& aFileHandle );
+
+ /**
+ * Getter for SDP of the clip.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ IMPORT_C HBufC8* GetClipSdpL( void ) const;
+
+ /**
+ * Reads next RTP group from a clip.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ IMPORT_C void NextClipGroupL( void );
+
+ /**
+ * Sets Seek point of the clip.
+ * @since Series 60 3.0
+ * @param aTime a time where to seek in clip.
+ * @return none.
+ */
+ IMPORT_C void SetSeekPointL( const TUint aTime );
+
+ /**
+ * Stops RTP playback.
+ * @since Series 60 3.0
+ * @param aError a stop error code.
+ * @param aPlayerBuf a buffer length in player.
+ * @return none.
+ */
+ IMPORT_C void StopPlayBack( const TInt aError,
+ const TUint aPlayerBuf );
+
+ /**
+ * Getter for clip version.
+ * @since Series 60 3.0
+ * @param none.
+ * @return a internal version of the clip.
+ */
+ inline TInt8 ClipVersion( void ) const;
+
+private: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ */
+ CRtpClipHandler();
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+private: // Functions from base classes
+
+ /**
+ * From MRtpFileObserver.
+ * Called when RTP group save is ready.
+ * @since Series 60 3.0
+ * @param aAction a save action for last saved group.
+ * @return None.
+ */
+ void RtpGroupSaved( const TInt aAction );
+
+ /**
+ * From MRtpFileObserver.
+ * Getter for current file reader point.
+ * @since Series 60 3.0
+ * @param aIndex a index of shift seek array.
+ * @return a read point in file reader.
+ */
+ TInt CurrentFileReadPoint( const TInt aIndex );
+
+private: // New methods
+
+ /**
+ * Swap to next available clip in time shift array if needed.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void SwapClipIfNeededL( void );
+
+private: // Data
+
+ /**
+ * RTP write observer.
+ */
+ MRtpFileWriteObserver* iWriteObs;
+
+ /**
+ * RTP read observer.
+ */
+ MRtpFileReadObserver* iReadObs;
+
+ /**
+ * RTP file save.
+ */
+ CRtpToFile* iRtpSave;
+
+ /**
+ * RTP file read.
+ */
+ CRtpFromFile* iRtpRead;
+
+ /**
+ * Clip version.
+ */
+ TInt8 iClipVersion;
+
+ /**
+ * Time shift save clip name index.
+ */
+ TInt iSaveNameIndex;
+
+ /**
+ * Time shift read clip name index.
+ */
+ TInt iReadNameIndex;
+
+ /**
+ * Time shift paused state.
+ */
+ TBool iTsPauseState;
+
+ /**
+ * Time shift seek handling array.
+ */
+ RArray<CRtpFileBase::STimeShiftSeek> iShiftSeek;
+
+ };
+
+#include <ipvideo/CRtpClipHandler.inl>
+
+#endif // CRTPCLIPHANDLER_H
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/dvrengine_api/inc/ipvideo/CRtpClipHandler.inl Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,38 @@
+/*
+* 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: Implementation of the RTP file action inline functions.*
+*/
+
+
+
+
+// INCLUDE FILES
+// None
+
+// CONSTANTS
+// None
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CRtpClipHandler::ClipVersion
+// Getter for clip version.
+// -----------------------------------------------------------------------------
+//
+inline TInt8 CRtpClipHandler::ClipVersion( void ) const
+ {
+ return iClipVersion;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/dvrengine_api/inc/ipvideo/CRtpClipManager.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,307 @@
+/*
+* 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: Finds access objects (SDP file) and ESG related names.*
+*/
+
+
+
+
+#ifndef CRTPCLIPMANAGER_H
+#define CRTPCLIPMANAGER_H
+
+// INCLUDES
+#include <ipvideo/MRtpClipRepairObserver.h>
+#include <ipvideo/MRtpFileWriteObserver.h>
+#include <ipvideo/CRtpMetaHeader.h>
+#include <ipvideo/CRTypeDefs.h>
+#include <f32file.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+class CRtpMetaHeader;
+class CRtpClipRepairer;
+
+// CLASS DECLARATION
+
+/**
+* Handles DVB-H RTP clip related functions.
+*
+* @lib DvrRtpClipHandler.lib
+* @since Series 60 3.0
+*/
+class CRtpClipManager : public CBase
+ {
+
+public: // Data types
+
+ /**
+ * Defines Clip details.
+ */
+ class SRtpClipDetails
+ {
+
+ public: // Data
+
+ /**
+ * Service name.
+ */
+ TName iService;
+
+ /**
+ * Program name.
+ */
+ TName iProgram;
+
+ /**
+ * Recording start time.
+ */
+ TTime iStartTime;
+
+ /**
+ * Recording end time.
+ */
+ TTime iEndTime;
+
+ /**
+ * Recording duration.
+ */
+ TInt iDuration;
+
+ /**
+ * Recording currently ongoing state.
+ */
+ TBool iRecOngoing;
+
+ /**
+ * Recording completed status.
+ */
+ TBool iCompleted;
+
+ /**
+ * Clip protected state.
+ */
+ TBool iProtected;
+
+ /**
+ * Recording failed status.
+ */
+ TBool iFailed;
+
+ /**
+ * Clip's quality.
+ */
+ TUint8 iQuality;
+
+ /**
+ * Clip watched counter.
+ */
+ TInt iPlayCount;
+
+ /*
+ * Point where last watch were stopped.
+ */
+ TInt iPlaySpot;
+
+ /**
+ * Post acquisition rule ok with this device.
+ */
+ TBool iPostRuleOk;
+
+ /**
+ * Parental rate of the clip.
+ */
+ TInt iParental;
+ };
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ IMPORT_C static CRtpClipManager* NewL();
+
+ /**
+ * Two-phased constructor.
+ */
+ IMPORT_C static CRtpClipManager* NewLC();
+
+ /**
+ * Destructor.
+ * @return None.
+ */
+ IMPORT_C virtual ~CRtpClipManager();
+
+public: // New methods
+
+ /**
+ * Getter for recorded clip details.
+ * @since Series 60 3.0
+ * @param aClipPath a full path of the clip.
+ * @param aDetails a struct for details.
+ * @return None.
+ */
+ IMPORT_C void GetClipDetailsL( const TDesC& aClipPath,
+ SRtpClipDetails& aDetails );
+
+ /**
+ * Getter for recorded clip details.
+ * @since Series 60 3.0
+ * @param aFile File handle to the clip.
+ * @param aDetails a struct for details.
+ * @return None.
+ */
+ IMPORT_C void GetClipDetailsL( RFile& aFile,
+ SRtpClipDetails& aDetails );
+
+ /**
+ * Setter for protected state of the clip.
+ * @since Series 60 3.0
+ * @param aClipPath a full path of the clip.
+ * @param aProtected a protected state.
+ * @return None.
+ */
+ IMPORT_C void ProtectClipL( const TDesC& aClipPath,
+ const TBool aProtected );
+
+ /**
+ * Asyncronous fix for clip's meta header if possible.
+ * @since Series 60 3.0
+ * @param aClipPath a full path of the clip.
+ * @param aObs a file repairer observer.
+ * @return None.
+ */
+ IMPORT_C void FixMetaHeaderL( MRtpClipRepairObserver* aObs,
+ const TDesC& aClipPath );
+
+ /**
+ * Syncronous fix for clip's meta header if possible.
+ * @since Series 60 3.0
+ * @param aClipPath a full path of the clip.
+ * @return None.
+ */
+ IMPORT_C void FixMetaHeaderL( const TDesC& aClipPath );
+
+ /**
+ * Deletes asyncronous clip fixer.
+ * @since Series 60 3.0
+ * @param aObs a file repairer observer.
+ * @return None.
+ */
+ IMPORT_C void DeleteRtpRepairer( MRtpClipRepairObserver* aObs );
+
+ /**
+ * Verifies post acquisition rule of clip.
+ * @since Series 60 3.0
+ * @param aPostRule a post acquisition rule of clip.
+ * @param aMetaHeader a pointer to meat header.
+ * @return KErrNone if rule ok,
+ * otherwise another of the system-wide error codes.
+ */
+ TInt VerifyPostRuleL( const TUint8 aPostRule,
+ CRtpMetaHeader* aMetaHeader );
+
+private: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ */
+ CRtpClipManager();
+
+ /**
+ * Symbian 2nd phase constructor can leave.
+ */
+ void ConstructL();
+
+private: // New methods
+
+ /**
+ * Updates details from meta header attributes.
+ * @since Series 60 3.0
+ * @param aAttributes a meta header attributes.
+ * @param aDetails a struct for details.
+ * @return None
+ */
+ void GetDetailsL( const CRtpMetaHeader::SAttributes& aAttributes,
+ SRtpClipDetails& aDetails,
+ CRtpMetaHeader* aMetaHeader );
+
+ /**
+ * Provides root path of clip base on memory setting.
+ * @since Series 60 3.0
+ * @param aClipPath a path of the clip as return value.
+ * @param aDrive a drive number where to store.
+ * @return None
+ */
+ void NewClipRootL( TDes& aClipPath,
+ const TDriveNumber aDrive );
+
+ /**
+ * Generates new clip name from service/program names.
+ * Adds index number to the end if file exist.
+ * @since Series 60 3.0
+ * @param aClipPath a path of the clip.
+ * @param aProgram a program name of recorded channel.
+ * @return none.
+ */
+ void NewIndexNameL( TDes& aClipPath,
+ const TDesC& aProgram );
+
+ /**
+ * Adds clip to the repairing queue.
+ * @since Series 60 3.0
+ * @param aClipPath a full path of the clip.
+ * @return None
+ */
+ void AddClipToRepairQueueL( const TDesC& aClipPath );
+
+private: // Data
+
+ /**
+ * File server.
+ */
+ RFs iFs;
+
+ /**
+ * File operations.
+ */
+ RFile iFile;
+
+ /**
+ * Devices IMEI.
+ */
+ HBufC* iImei;
+
+ /**
+ * RTP clip repairer.
+ */
+ CRtpClipRepairer* iClipRepairer;
+
+ /**
+ * RTP file repairer queue.
+ */
+ RPointerArray<HBufC> iRepairQueue;
+
+ };
+
+#endif // CRTPCLIPMANAGER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/dvrengine_api/inc/ipvideo/CRtpFileBase.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,320 @@
+/*
+* 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: Base methods/variables for RTP file format recording.*
+*/
+
+
+
+
+#ifndef CRTPFILEBASE_H
+#define CRTPFILEBASE_H
+
+// INCLUDES
+#include <ipvideo/CRtpUtil.h>
+#include <f32file.h>
+
+// CONSTANTS
+const TInt KCurrentClipVersion( 3 );
+const TInt KMinValidClipVersion( 2 );
+const TInt KSeekHeaderBytes( 3 * KIntegerBytes );
+const TInt KGroupHeaderBytes( 4 * KIntegerBytes );
+const TInt KPacketsCountBytes( 4 );
+const TInt KNormalRecGroupLength( 2000 ); // 2 s
+const TUint KSeekArrayInterval( 30000 ); // 30 s
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+
+/**
+* RTP format common functionalities.
+*
+* @lib RtpClipHandler.lib
+* @since Series 60 3.0
+*/
+class CRtpFileBase : public CActive
+ {
+
+public: // Data types
+
+ // Time shift seek array
+ class STimeShiftSeek
+ {
+
+ public: // Data
+
+ /**
+ * Group time.
+ */
+ TUint iGroupTime;
+
+ /**
+ * File seek point.
+ */
+ TInt iSeekpoint;
+
+ /**
+ * File name index.
+ */
+ TInt iNameIndex;
+
+ };
+
+
+public: // Constructors and destructor
+
+ /**
+ * Destructor.
+ */
+ virtual ~CRtpFileBase();
+
+protected: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ */
+ CRtpFileBase();
+
+ /**
+ * Symbian 2nd phase constructor can leave and is private by default.
+ */
+ void ConstructL();
+
+protected: // Enumeration
+
+ // Defines RTP file mode
+ enum TRtpFileMode
+ {
+ EModeNone = KErrBadHandle,
+ EModeNormal = KErrNone,
+ EModeHandle,
+ EModeTimeShift
+ };
+
+public: // New functions
+
+ /**
+ * Deletes time shift files.
+ * @since Series 60 3.0
+ * @param aShiftSeek a reference to time shift seek array.
+ * @return None.
+ */
+ void DeleteTimeShiftFiles( RArray<STimeShiftSeek>& aShiftSeek );
+
+protected: // New functions
+
+ /**
+ * Writes RTP seek header to a file.
+ * @since Series 60 3.0
+ * @return None.
+ */
+ void WriteSeekHeaderL();
+
+ /**
+ * Reads clip's seek header from a file.
+ * @since Series 60 3.0
+ * @return None.
+ */
+ void ReadSeekHeaderL();
+
+ /**
+ * Reads clip's group header from a file.
+ * @since Series 60 3.0
+ * @return None.
+ */
+ void ReadGroupHeaderL();
+
+ /**
+ * Updates group header variables from readed data.
+ * @since Series 60 3.0
+ * @param aDataPtr data from which header is updated.
+ * @return None.
+ */
+ void UpdateGroupHeaderVariablesL( const TDesC8& aDataPtr );
+
+ /**
+ * Appends one group to the seek array.
+ * @since Series 60 3.0
+ * @param aTime a TS time of first packet in group.
+ * @param aPoint a seek point in clip for group.
+ * @return None.
+ */
+ void AppendSeekArrayL( const TUint aTime,
+ const TInt aPoint );
+
+ /**
+ * Saves seek array to the clip.
+ * @since Series 60 3.0
+ * @return None.
+ */
+ void SaveSeekArrayL();
+
+ /**
+ * Reads seek array from the clip.
+ * @since Series 60 3.0
+ * @param aPoint a seek array point in clip.
+ * @return true if items in seek array, otherwise false.
+ */
+ TBool ReadSeekArrayL( const TInt aPoint );
+
+ /**
+ * Resets seek array.
+ * @since Series 60 3.0
+ * @return None.
+ */
+ inline void ResetSeekArray();
+
+ /**
+ * Writes variables to log file.
+ * @since Series 60 3.0
+ * @param aMethod a method which called this
+ */
+ void LogVariables( const TDesC& aMethod );
+
+private: // Functions from base classes
+
+ /**
+ * From CActive : Called when request completion event occurs.
+ * @since Series 60 3.0
+ * @return None.
+ */
+ virtual void RunL() = 0;
+
+ /**
+ * From CActive : Handles a leave occurring in the request
+ * completion event handler RunL().
+ * @since Series 60 3.0
+ * @param aError the leave code
+ * @return status of run error handling
+ */
+ virtual TInt RunError( TInt aError ) = 0;
+
+ /**
+ * From CActive : Called when request completion event cancelled.
+ * @since Series 60 3.0
+ * @return None.
+ */
+ virtual void DoCancel() = 0;
+
+protected: // Data types
+
+ // Defines seek struct
+ class SSeek
+ {
+
+ public: // Data
+
+ /**
+ * Enlapsed time.
+ */
+ TUint iTime;
+
+ /**
+ * Point in clip.
+ */
+ TInt iPoint;
+
+ };
+
+protected: // Data
+
+ /**
+ * Rtp file usage mode.
+ */
+ TRtpFileMode iMode;
+
+ /**
+ * Current group.
+ */
+ TInt iThisGroup;
+
+ /**
+ * Packet group counter (Seek header).
+ */
+ TInt iGroupsTotalCount;
+
+ /**
+ * First seek address (Seek header).
+ */
+ TInt iFirstSeekAddr;
+
+ /**
+ * Last seek address (Seek header).
+ */
+ TInt iLastSeekAddr;
+
+ /**
+ * Group total length (Group header).
+ */
+ TInt iGroupTotalLen;
+
+ /**
+ * Next group point (Group header).
+ */
+ TInt iNextGroupPoint;
+
+ /**
+ * Previous group point (Group header).
+ */
+ TInt iPrevGroupPoint;
+
+ /**
+ * Group time (Group header).
+ */
+ TUint iGroupTime;
+
+ /**
+ * Seek header point.
+ */
+ TInt iSeekHeaderPoint;
+
+ /**
+ * Current clip path.
+ */
+ HBufC* iCurrentPath;
+
+ /**
+ * Seek array.
+ */
+ CArrayFix<SSeek>* iSeekArray;
+
+ /**
+ * File data buffer pointer.
+ */
+ TPtr8 iDataPtr;
+
+ /**
+ * File server.
+ */
+ RFs iFs;
+
+ /*
+ * File operations.
+ */
+ RFile iFile;
+
+ };
+
+#include <ipvideo/CRtpFileBase.inl>
+
+#endif // CRTPFILEBASE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/dvrengine_api/inc/ipvideo/CRtpFileBase.inl Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,34 @@
+/*
+* 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: Implementation of the Common Recording Engine RTP file base*
+*/
+
+
+
+
+// INCLUDE FILES
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CRtpFileBase::ResetSeekArray
+// Resets whole array.
+// -----------------------------------------------------------------------------
+//
+inline void CRtpFileBase::ResetSeekArray()
+ {
+ iSeekArray->Reset();
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/dvrengine_api/inc/ipvideo/CRtpMetaHeader.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,478 @@
+/*
+* 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: RTP clip metaheader write/read functionalities.*
+*/
+
+
+
+
+#ifndef CRTPMETAHEADER_H
+#define CRTPMETAHEADER_H
+
+// INCLUDES
+#include <ipvideo/CRtpUtil.h>
+#include <f32file.h>
+
+// CONSTANTS
+const TInt KStringLengthBytes( 1 );
+const TInt KMaxMetaHeaderLength( 2048 );
+const TInt KMetaLengthPoint( 0 );
+const TInt KAttributesPoint( KMetaLengthPoint + KIntegerBytes ); // 4
+const TInt KPlayCountPoint( KAttributesPoint + KIntegerBytes ); // 8
+const TInt KPlaySpotPoint( KPlayCountPoint + KIntegerBytes ); // 12
+const TInt KReservedPoint1( KPlaySpotPoint + KIntegerBytes ); // 16
+const TInt KReservedPoint2( KReservedPoint1 + KIntegerBytes ); // 20
+const TInt KReservedPoint3( KReservedPoint2 + KIntegerBytes ); // 24
+const TInt KReservedPoint4( KReservedPoint3 + KIntegerBytes ); // 28
+const TInt KStartTimePoint( KReservedPoint4 + KIntegerBytes ); // 32
+const TInt KEndTimePoint( KStartTimePoint + 2 * KIntegerBytes ); // 40
+const TInt KDurationPoint( KEndTimePoint + 2 * KIntegerBytes ); // 48
+const TInt KSeekArrayPoint( KDurationPoint + KIntegerBytes ); // 52
+const TInt KUserIdPoint( KSeekArrayPoint + KIntegerBytes ); // 56
+const TInt KDeviceInfoPoint( KUserIdPoint + KStringLengthBytes + // 72
+ KUserIdLength );
+// Metaheader attributes
+const TInt KOngoingFlagShift( 0 );
+const TInt KCompletedFlagShift( 1 );
+const TInt KProtectedFlagShift( 2 );
+const TInt KFailedFlagShift( 3 );
+const TInt KVersionFieldShift( 4 );
+const TInt KQualityFieldShift( 8 );
+const TInt KPostRuleFieldShift( 16 );
+const TInt KParentalFieldShift( 24 );
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+
+/**
+* Meta header handling for RTP file format.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CRtpMetaHeader : public CBase
+ {
+
+public: // Enumeration
+
+ // Defines mode
+ enum TMetaMode
+ {
+ EMetaRead = 200,
+ EMetaWrite,
+ EMetaUpdate
+ };
+
+public: // Data types
+
+ // Defines clip attributes struct
+ class SAttributes
+ {
+ public: // Data
+
+ /**
+ * Recording ongoing.
+ */
+ TBool iOngoing;
+
+ /**
+ * Recording completed.
+ */
+ TBool iCompleted;
+
+ /**
+ * Clip protected.
+ */
+ TBool iProtected;
+
+ /**
+ * Recording failed.
+ */
+ TBool iFailed;
+
+ /**
+ * Clip version.
+ */
+ TUint8 iVersion;
+
+ /**
+ * Clip quality.
+ */
+ TUint8 iQuality;
+
+ /**
+ * Clip's post accuisition rule.
+ */
+ TUint8 iPostRule;
+
+ /**
+ * Parental rate.
+ */
+ TUint8 iParental;
+
+ /**
+ * Viewed counter.
+ */
+ TInt iPlayCount;
+
+ /**
+ * Point where vieving stopped.
+ */
+ TInt iPlaySpot;
+
+ };
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ * @param aFile a reference to file operations.
+ * @param aMode a meta data read or write mode.
+ */
+ static CRtpMetaHeader* NewL( RFile& aFile,
+ const TMetaMode& aMode );
+
+ /**
+ * Two-phased constructor.
+ * @param aFile a reference to file operations.
+ * @param aMode a meta data read or write mode.
+ */
+ static CRtpMetaHeader* NewLC( RFile& aFile,
+ const TMetaMode& aMode );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CRtpMetaHeader();
+
+public: // New functions
+
+ /**
+ * Getter for seek header point.
+ * @since Series 60 3.0
+ * @return seek header point.
+ */
+ TInt SeekHeaderPoint();
+
+ /**
+ * Writes whole meta header to the clip.
+ * Note, need use only with node: EMetaWrite.
+ * @since Series 60 3.0
+ * @return None.
+ */
+ void CommitL();
+
+ /**
+ * Writes clip's attributes of meta data header to a file.
+ * @since Series 60 3.0
+ * @param aAtt a struct of attributes to write.
+ * @return None.
+ */
+ void WriteAttributesL( const SAttributes& aAtt );
+
+ /**
+ * Writes start date/time to meta data header of the clip.
+ * @since Series 60 3.0
+ * @param aTime a date/time value to write
+ * @return None.
+ */
+ void WriteStartTimeL( const TTime& aTime );
+
+ /**
+ * Writes start date/time to meta data header of the clip.
+ * @since Series 60 3.0
+ * @param aTime a date/time value to write
+ * @return None.
+ */
+ void WriteEndTimeL( const TTime& aTime );
+
+ /**
+ * Writes duration to meta data header of the clip.
+ * @since Series 60 3.0
+ * @param aDuration a duration value to write
+ * @return None.
+ */
+ void WriteDurationL( const TInt aDuration );
+
+ /**
+ * Writes seek array point to meta data header of the clip.
+ * @since Series 60 3.0
+ * @param aPoint a value to write
+ * @return None.
+ */
+ void WriteSeekArrayPointL( const TInt aPoint );
+
+ /**
+ * Writes device info to meta data header of the clip.
+ * @since Series 60 3.0
+ * @param aId a id to write
+ * @return None.
+ */
+ void WriteUserIdL( const TDesC& aId );
+
+ /**
+ * Writes device info to meta data header of the clip.
+ * @since Series 60 3.0
+ * @param aInfo a device info to write
+ * @return None.
+ */
+ void WriteDeviceInfoL( const TDesC& aInfo );
+
+ /**
+ * Writes ESG to meta data header of the clip.
+ * @since Series 60 3.0
+ * @param aService a name of the service
+ * @param aProgram a name of the program
+ * @return None.
+ */
+ void WriteEsgDataL( const TDesC& aService,
+ const TDesC& aProgram );
+
+ /**
+ * Writes SRTP data to meta data header of the clip.
+ * @since Series 60 3.0
+ * @param aSrtpData a SRTP data to write.
+ * @return None.
+ */
+ void WriteSrtpDataL( const TDesC8& aSrtpData );
+
+ /**
+ * Writes SDP file data to meta data header of the clip.
+ * @since Series 60 3.0
+ * @param aSdpData a SDP file data.
+ * @return None.
+ */
+ void WriteSdpDataL( const TDesC8& aSdpData );
+
+ /**
+ * Reads clip's attributes of meta data header from a file.
+ * @since Series 60 3.0
+ * @param aAtt a struct of attributes to read.
+ * @return None.
+ */
+ void ReadAttributesL( SAttributes& aAtt );
+
+ /**
+ * Reads start date/time of meta data header from the clip.
+ * @since Series 60 3.0
+ * @param aTime a readed date/time value
+ * @return None.
+ */
+ void ReadStartTimeL( TTime& aTime );
+
+ /**
+ * Reads end date/time of meta data header from the clip.
+ * @since Series 60 3.0
+ * @param aTime a readed date/time value
+ * @return None.
+ */
+ void ReadEndTimeL( TTime& aTime );
+
+ /**
+ * Reads duration in seconds of meta data header from the clip.
+ * @since Series 60 3.0
+ * @param aDuration a readed duration value
+ * @return None.
+ */
+ void ReadDurationL( TInt& aDuration );
+
+ /**
+ * Reads seek array point of meta data header from the clip.
+ * @since Series 60 3.0
+ * @param aPoint a readed seek array point value
+ * @return None.
+ */
+ void ReadSeekArrayPointL( TInt& aPoint );
+
+ /**
+ * Reads user id of meta data header from the clip.
+ * @since Series 60 3.0
+ * @param a buffer for info to read
+ * @return None.
+ */
+ void ReadUserIdL( TDes& aId );
+
+ /**
+ * Reads device info of meta data header from the clip.
+ * @since Series 60 3.0
+ * @param a buffer for info to read
+ * @return None.
+ */
+ void ReadDeviceInfoL( TDes& aInfo );
+
+ /**
+ * Reads ESG of meta data header from the clip.
+ * @since Series 60 3.0
+ * @param a buffer for service name to read
+ * @param a buffer for program name to read
+ * @return None.
+ */
+ void ReadEsgDataL( TDes& aService, TDes& aProgram );
+
+ /**
+ * Reads SRTP data of meta data header from the clip.
+ * @since Series 60 3.0
+ * @return pointer to readed SRTP data.
+ */
+ HBufC8* ReadSrtpDataL();
+
+ /**
+ * Reads SDP file data of meta data header from the clip.
+ * @since Series 60 3.0
+ * @return pointer to readed SDP file data.
+ */
+ HBufC8* ReadSdpDataL();
+
+private: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ * @param aFile a reference to file operations
+ * @param aMode a meta data read or write mode
+ */
+ CRtpMetaHeader( RFile& aFile,
+ const TMetaMode& aMode );
+
+ /**
+ * Symbian 2nd phase constructor can leave and is private by default.
+ */
+ void ConstructL();
+
+private: // New functions
+
+ /**
+ * Writes any string with one byte len info to meta header.
+ * @since Series 60 3.0
+ * @param aPosition a position to write
+ * @param aData a data to write
+ * @return None.
+ */
+ void WriteStringDataL( const TInt aPosition,
+ const TDesC& aData );
+
+ /**
+ * Reads any string with one byte len info from meta header.
+ * @since Series 60 3.0
+ * @param aPosition a position from to read
+ * @param aData a data to read
+ * @return None.
+ */
+ void ReadStringDataL( const TInt aPosition,
+ TDes& aData );
+
+ /**
+ * Writes time info to meta data header of the clip.
+ * @since Series 60 3.0
+ * @param aPosition a position to append
+ * @param aTime a time value to write
+ * @return None.
+ */
+ void AddTimeL( const TInt aPosition,
+ const TTime& aTime );
+
+ /**
+ * Reads time info of meta data header from the clip.
+ * @since Series 60 3.0
+ * @param aPosition a position to read
+ * @param aTime a readed time value
+ * @return None.
+ */
+ void GetTimeL( const TInt aPosition,
+ TTime& aTime );
+
+ /**
+ * Adds intehger data to meta buffer.
+ * @since Series 60 3.0
+ * @param aPosition a position to add
+ * @param aValue a integer value to add
+ * @return None.
+ */
+ void AddIntegerL( const TInt aPosition,
+ const TInt aValue );
+
+ /**
+ * Adds new data to meta buffer.
+ * @since Series 60 3.0
+ * @param aPosition a position to add
+ * @param aData a data to append
+ * @return None.
+ */
+ void AddDataL( const TInt aPosition,
+ const TDesC8& aData );
+
+ /**
+ * Reads 32 bits (TInt) from a file from certain position.
+ * @since Series 60 3.0
+ * @param aPosition a position from to read
+ * @param aValue a value to update
+ * @return None.
+ */
+ void ReadTintFromFileL( const TInt& aPosition,
+ TInt& aValue );
+
+private: // Data
+
+ /**
+ * File operations.
+ */
+ RFile& iFile;
+
+ /**
+ * Mode.
+ */
+ TMetaMode iMode;
+
+ /**
+ * File data buffer.
+ */
+ HBufC8* iMetaData;
+
+ /**
+ * File data buffer pointer.
+ */
+ TPtr8 iDataPtr;
+
+ /**
+ * ESG data point.
+ */
+ TInt iEsgDataPoint;
+
+ /**
+ * SRTP data point.
+ */
+ TInt iSrtpDataPoint;
+
+ /**
+ * SDP file data point.
+ */
+ TInt iSdpDataPoint;
+
+ /**
+ * Meta total length.
+ */
+ TInt iMetaTotal;
+
+ };
+
+#endif // CRTPMETAHEADER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/dvrengine_api/inc/ipvideo/CRtpUtil.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,205 @@
+/*
+* 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: Convertion methods for RTP file format.*
+*/
+
+
+
+
+#ifndef CRTPUTIL_H
+#define CRTPUTIL_H
+
+// INCLUDES
+#include <e32base.h>
+#include <etelmm.h>
+
+// CONSTANTS
+const TInt KSiKilo( 1000 );
+const TInt KIntegerBytes( 4 );
+const TInt KPacketSizeBytePoint( 0 );
+const TInt KPacketSizeBytesLen( 4 );
+const TInt KPacketTypeBytesLen( 1 );
+const TInt KSpecialPacketLength( KPacketSizeBytesLen + KPacketTypeBytesLen + KIntegerBytes );
+const TInt KPacketTypeBytePoint( KPacketSizeBytePoint + KPacketSizeBytesLen );
+const TInt KUserIdLength( RMobilePhone::KIMSISize );
+const TInt KDeviceIdLength( RMobilePhone::KPhoneSerialNumberSize );
+
+_LIT8( KRtpClipMimetype, "application/x-nokia-teh-rtp" );
+_LIT( KDvrTimeShiftFile, "c:\\timeshift." );
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+
+/**
+* RTP format common functionalities for Common Recording Engine.
+*
+* @lib CommonRecordingEngine.lib
+* @since Series 60 3.0
+*/
+class CRtpUtil : public CBase
+ {
+
+public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ IMPORT_C static CRtpUtil* NewL();
+
+ /**
+ * Two-phased constructor.
+ */
+ IMPORT_C static CRtpUtil* NewLC();
+
+ /**
+ * Destructor.
+ */
+ IMPORT_C virtual ~CRtpUtil();
+
+public: // New functions
+
+ /**
+ * Converts integer to a buffer.
+ * @since Series 60 3.0
+ * @param aValue a value to write.
+ * @return a buffer where value stored.
+ */
+ IMPORT_C static HBufC8* MakeBytesLC( const TInt& aValue );
+
+ /**
+ * Converts integer to a buffer.
+ * @since Series 60 3.0
+ * @param aValue a value to write.
+ * @param aBuf a buffer where value stored.
+ * @return none.
+ */
+ IMPORT_C static void MakeBytesL( const TInt& aValue,
+ TDes8& aBuf );
+
+ /**
+ * Converts integer to a buffer.
+ * @since Series 60 3.0
+ * @param aValue a value to write.
+ * @param aBuf a buffer where value stored.
+ * @return a system wide error code.
+ */
+ IMPORT_C static TInt MakeBytes( const TInt& aValue,
+ TDes8& aBuf );
+
+ /**
+ * Converts bytes to integer.
+ * @since Series 60 3.0
+ * @param aBytes a buffer to convert.
+ * @return an integer converted from bytes.
+ */
+ IMPORT_C static TInt GetValueL( const TDesC8& aBytes );
+
+ /**
+ * Converts bytes to integer.
+ * @since Series 60 3.0
+ * @param aBytes a buffer to convert.
+ * @param aValue a integer converted from bytes.
+ * @return none.
+ */
+ IMPORT_C static void GetValueL( const TDesC8& aBytes,
+ TInt& aValue );
+
+ /**
+ * Converts bytes to integer.
+ * @since Series 60 3.0
+ * @param aBytes a buffer to convert.
+ * @param aValue a integer converted from bytes.
+ * @return a system wide error code.
+ */
+ IMPORT_C static TInt GetValue( const TDesC8& aBytes,
+ TInt& aValue );
+
+ /**
+ * Converts bytes to integer.
+ * @since Series 60 3.0
+ * @param aBytes a buffer to convert.
+ * @param aValue a integer converted from bytes.
+ * @return a system wide error code.
+ */
+ IMPORT_C static TInt GetValue( const TDesC8& aBytes,
+ TUint& aValue );
+
+ /**
+ * Generates special RTP packet.
+ * @since Series 60 3.0
+ * @param aType a type of RTP packet.
+ * @return a buffer containing generated RTP packet.
+ */
+ IMPORT_C static HBufC8* SpecialPacketL( const TInt aType );
+
+ /**
+ * Getter for RTP clip mime type info.
+ * @since Series 60 3.0
+ * @param aBuf on return contains the mime type.
+ * @return None.
+ */
+ IMPORT_C static void GetMimeInfo( TDes& aMime );
+
+ /**
+ * Getter for RTP clip mime type info.
+ * @since Series 60 3.0
+ * @param aBuf on return contains the mime type.
+ * @return None.
+ */
+ IMPORT_C static void GetMimeInfo( TDes8& aMime );
+
+ /**
+ * Reads IMEI of the phone HW.
+ * @since Series 60 3.0
+ * @param aBuf on return contains the IMEI.
+ * @return none.
+ */
+ IMPORT_C static void GetImeiL( TDes& aImsi );
+
+private: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ */
+ CRtpUtil();
+
+ /**
+ * Symbian 2nd phase constructor can leave and is private by default.
+ */
+ void ConstructL();
+
+private: // New methods
+
+ /**
+ * Reads mobile info of the phone.
+ * @since Series 60 3.0
+ * @param none.
+ * @return none.
+ */
+ void static GetMobilePhoneInfoL( RTelServer& aServer,
+ RMobilePhone& aPhone );
+
+ };
+
+#endif // CRTPUTIL_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/dvrengine_api/inc/ipvideo/MCREngineObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,90 @@
+/*
+* 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 observer to get event notifications.*
+*/
+
+
+#ifndef MCRENGINEOBSERVER_H
+#define MCRENGINEOBSERVER_H
+
+// INCLUDES
+#include <e32def.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None.
+
+// DATA TYPES
+/**
+* Different messages that DVR engine may send via client lib callback
+*/
+enum TCRObserverInfo
+ {
+ ECRAuthenticationNeeded, /**< CR needs new username and password for authentication */
+ ECRAttachCompleted, /**< Connection attach is completed and is ready to be used */
+ ECRConnectionError, /**< Unable to open connection in RTP engine & CR engine */
+ ECRNotEnoughBandwidth, /**< Stream bitrate higher than (estimated) available connection bandwidth */
+ ECRNormalEndOfStream, /**< Used to communicate end of streaming */
+ ECRSwitchingToTcp, /**< Switch to tcp, client needs to initiate possible player */
+ ECRStreamIsLiveStream, /**< We have a stream that cannot be paused */
+ ECRRealNetworksStream, /**< RealMedia stream format, cannot support */
+ ECRTestSinkData, /**< Placeholder for TestSink (NullSink) feedback information to test client */
+ ECRSdpAvailable, /**< Used to communicate availability of SDP */
+ ECRReadyToSeek, /**< Used to communicate seeking posibility */
+ ECRRecordingStarted, /**< Used to communicate recording state */
+ ECRRecordingPaused, /**< Used to communicate recording state */
+ ECRRecordingEnded /**< Used to communicate recording state */
+ };
+
+/**
+* This structure is sent over message queue where
+* api sits listening
+*/
+struct SCRObserverMsg
+ {
+ TCRObserverInfo iMsg; /**< Identifies the message */
+ TInt iErr; /**< Can be used to pass error value related to message */
+ };
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+
+/**
+* Engine observer to get event notifications.
+*
+* @lib CommonRecordingEngineClient.lib
+* @since Series 60 3.0
+*/
+class MCREngineObserver
+ {
+
+public: // New methods
+
+ /**
+ * Notify call back for statuses.
+ * @since Series 60 3.0
+ * @param aInfo a notify info.
+ * @return none.
+ */
+ virtual void NotifyL( const SCRObserverMsg& aInfo ) = 0;
+
+ };
+
+#endif MCRENGINEOBSERVER_H
+
+// End of file.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/dvrengine_api/inc/ipvideo/MRtpClipRepairObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,64 @@
+/*
+* 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: Call back observer for clip manager.*
+*/
+
+
+
+
+#ifndef MRTPCLIPREPAIROBSERVER_H
+#define MRTPCLIPREPAIROBSERVER_H
+
+// INCLUDES
+#include <e32def.h>
+
+// CONSTANTS
+// None.
+
+// MACROS
+// None.
+
+// DATA TYPES
+// None.
+
+// FORWARD DECLARATIONS
+// None.
+
+// CLASS DECLARATION
+
+/**
+* A RTP clip repair observer.
+*
+* @lib DvrRtpClipHandler.lib
+* @since Series 60 3.0
+*/
+class MRtpClipRepairObserver
+ {
+
+public: // New functions
+
+ /**
+ * Called when clip repairing completes.
+ * @since Series 60 3.0
+ * @param aStatus a status of repairing.
+ * @return None.
+ */
+ virtual void RtpClipRepaired( const TInt aStatus ) = 0;
+
+ };
+
+
+#endif // MRTPCLIPREPAIROBSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/dvrengine_api/inc/ipvideo/MRtpFileObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,71 @@
+/*
+* 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: RTP file observer for Common Recording Engine.*
+*/
+
+
+
+
+#ifndef MRTPFILEOBSERVER_H
+#define MRTPFILEOBSERVER_H
+
+// INCLUDES
+// None
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+
+/**
+* A RTP read observer.
+*
+* @lib RtpClipHandler.lib
+* @since Series 60 3.0
+*/
+class MRtpFileObserver
+ {
+
+public: // New functions
+
+ /**
+ * Called when RTP group save is ready.
+ * @since Series 60 3.0
+ * @param aAction a save action for last saved group.
+ * @return None.
+ */
+ virtual void RtpGroupSaved( const TInt aAction ) = 0;
+
+ /**
+ * Getter for current file reader point.
+ * @since Series 60 3.0
+ * @param aIndex a index of shift seek array.
+ * @return a read point in file reader.
+ */
+ virtual TInt CurrentFileReadPoint( const TInt aIndex ) = 0;
+
+ };
+
+#endif // MRTPFILEOBSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/dvrengine_api/inc/ipvideo/MRtpFileReadObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,86 @@
+/*
+* 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: Interface for RTP file actions.*
+*/
+
+
+
+
+#ifndef MRTPFILEREADOBSERVER_H
+#define MRTPFILEREADOBSERVER_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+
+/**
+* RTP file data read observer.
+*
+* @lib RtpClipHandler.lib
+* @since Series 60 3.0
+*/
+class MRtpFileReadObserver
+ {
+
+public: // Data types
+
+ /**
+ * Defines status indication to client.
+ */
+ enum TRtpReadStatus
+ {
+ ERtpTimeShifTEnd = 500
+ };
+
+public: // New methods
+
+ /**
+ * Called when RTP packets group readed from a file.
+ * @since Series 60 3.0
+ * @param aConversion a converter for packets bytes.
+ * @param aGroup a RTP data readed from a file.
+ * @param aGroupTime a group time in milli seconds.
+ * @param aLastGroup a indication of last group in clip.
+ * @return none.
+ */
+ virtual void GroupReadedL( const TDesC8& aGroup,
+ const TUint aGroupTime,
+ const TBool aLastGroup ) = 0;
+
+ /**
+ * Clip handler status of playback.
+ * @since Series 60 3.0
+ * @param aStatus a status of file reading.
+ * @return none.
+ */
+ virtual void ReadStatus( TInt aStatus ) = 0;
+
+ };
+
+#endif // MRTPFILEREADOBSERVER_H
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/dvrengine_api/inc/ipvideo/MRtpFileWriteObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,134 @@
+/*
+* 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: Interface for RTP file actions.*
+*/
+
+
+
+
+#ifndef MRTPFILEWRITEOBSERVER_H
+#define MRTPFILEWRITEOBSERVER_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// DATA TYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+
+/**
+* RTP file data write observer.
+*
+* @lib RtpClipHandler.lib
+* @since Series 60 3.0
+*/
+class MRtpFileWriteObserver
+ {
+
+public: // Data types
+
+ /**
+ * Defines RTP recording params
+ */
+ class SRtpRecParams
+ {
+
+ public: // Data
+
+ // Clip full path.
+ TPath iClipPath;
+
+ // SDP data.
+ TPtrC8 iSdpData;
+
+ // Service name
+ TPtrC iService;
+
+ // Program name.
+ TPtrC iProgram;
+
+ // Post accuisition rule.
+ TInt iPostRule;
+
+ // Parental rate.
+ TInt iParental;
+
+ // Recording start time in terminal time.
+ TTime iStartTime;
+
+ // Estimated recording end time in terminal time.
+ TTime iEndTime;
+
+ };
+
+ /**
+ * Defines save action.
+ */
+ enum TRtpSaveAction
+ {
+ ESaveIdle = KErrNotFound,
+ ESaveNormal = KErrNone,
+ ESaveTimeShift,
+ ESavePause,
+ ESaveEnd
+ };
+
+ /**
+ * Defines RTP packet type.
+ */
+ enum TRtpType
+ {
+ ERtpNone = KErrNotFound,
+ ERtpAudio = 10,
+ ERtcpAudio,
+ ERtpVideo,
+ ERtcpVideo,
+ ERtpClipPause,
+ ERtpClipEnd,
+ ERtpSubTitle,
+ ERtcpSubTitle
+ };
+
+public: // New methods
+
+ /**
+ * Group saved indication.
+ * @since Series 60 3.0
+ * @return none.
+ */
+ virtual void GroupSaved() = 0;
+
+ /**
+ * Clip handler status of recording.
+ * @since Series 60 3.0
+ * @param aStatus a status of file writing.
+ * @return none.
+ */
+ virtual void WriteStatus( const TInt aStatus ) = 0;
+
+ };
+
+#endif // MRTPFILEWRITEOBSERVER_H
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,29 @@
+/*
+* Copyright (c) 2004-2005 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: Videoutils build file*
+*/
+
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+
+#include "../videoscheduler_api/group/bld.inf"
+#include "../videoconnutility_api/group/bld.inf"
+#include "../videoplayer_constants_api/group/bld.inf"
+
+PRJ_EXPORTS
+
+PRJ_MMPFILES
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,34 @@
+/*
+* Copyright (c) 2004-2008 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:
+*
+*/
+
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+PRJ_EXPORTS
+../inc/ipvideo/vcxconnectionutility.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/vcxconnectionutility.h )
+../inc/ipvideo/vcxconnutilengineobserver.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/vcxconnutilengineobserver.h )
+../inc/ipvideo/tvcxconnutilnotifierparams.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/tvcxconnutilnotifierparams.h )
+
+PRJ_MMPFILES
+
+PRJ_TESTMMPFILES
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/inc/ipvideo/tvcxconnutilnotifierparams.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,78 @@
+/*
+* Copyright (c) 2006 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: data structure for passing messages between con utility and*
+*/
+
+
+
+
+
+#ifndef TVCXCONNUTILNOTIFIERPARAMS_
+#define TVCXCONNUTILNOTIFIERPARAMS_
+
+/**
+ * Max lenght of the string passed via message
+ */
+const TInt KConnUtilMaxMsgLen = 255;
+
+/**
+ * implementation UID for the notifier plugin that
+ * videoconnutility uses
+ */
+const TUid KVcxNotifierImplUid = { 0x20016BA5 };
+
+/**
+* TVcxNotifierParams class. Class is used as message between
+* vcxconnectionutility and notifier plugin. Message is to be sent to notifier,
+* when connection is being created for showing "connecting.." or similar msg and
+* when connection creation is ready.
+*
+* When connection is to be created, vcxconnectionutility sends message via through
+* notifier server where it's passed to the notifier plugin with uid of KVcxNotifierImplUid
+* vcxconnectionutility might pass additional message string to be shown in the dialogg
+* with iMsg descriptor.
+*
+* Event can be either:
+* - EConnecting (1), when notifier should show dialog asynchronously
+* - EConnected (2), when vcxconnectionutility wants plugin to close dialog synchronously
+* enums are defined in vcxconnectionutility.hrh
+*
+* If plugin wants to nofify about closing of dialog before vcxconnectionutility wants it to be closed.
+* it should complete async dialog showing with result of KErrCancel.
+*
+*/
+class TVcxNotifierParams
+ {
+ public:
+
+ enum TVcxNotifierEventId
+ {
+ EConnecting = 1,
+ EConnected
+ };
+
+ /**
+ * Event.
+ */
+ TInt iEvent;
+
+ /**
+ * String message.
+ */
+ TBuf<KConnUtilMaxMsgLen> iMsg;
+ };
+
+
+
+#endif // TVCXCONNUTILNOTIFIERPARAMS_
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/inc/ipvideo/vcxconnectionutility.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,208 @@
+/*
+* Copyright (c) 2006 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: Class to handle connection creation.*
+*/
+
+
+#ifndef __VCX_CONNUTIL_H_
+#define __VCX_CONNUTIL_H_
+
+// INCLUDES
+#include <e32base.h>
+
+// FORWARD DECLARATIONS
+class CVcxConnUtilImpl;
+class MConnUtilEngineObserver;
+
+
+// CLASS DECLARATION
+/**
+* Class is the main interface class for the vcxconnectionutility.dll.
+* By using this class, client can fetch iap ID and maintain an active connection
+* for that iap.
+* Usage:
+* @code
+* #include <vcxconnectionutility.h>
+* #include <vcxconnutilengineobserver.h> // for receiving events from ALR and iap changes
+*
+* // Instantiation of connectionutility is done by Instance()
+* // every Instance call increments internal reference count by
+* // one. When reference count is decremented to 0 deallocation
+* // occurs. Client should make sure that it calls as many
+* // DecreaseReferenceCount() as it calls InstanceL()
+*
+* CVcxConnectionUtility* conUtil = CVcxConnectionUtility::InstanceL();
+*
+* // in case client is interested in events from ALR or from iap changes,
+* // client must implement MConnUtilEngineObserver interface and register
+* // as observer. See MConnUtilEngineObserver documentation for details
+* conUtil->RegisterObserverL( this );
+*
+* // getting the best possible iap is handled by the GetIap
+* TInt err( KErrNone );
+* TUint32 iapId( 0 );
+* err = conUtil->GetIap( iapId, EFalse );
+* // in case client does not want the "connecting" dialog // shown, aSilent
+* // parameter should be ETrue
+*
+* // client can try to explicitly disconnect connection, but if there are other references
+* // connection is not closed.
+* // suggestion is to maintain connection at all time as long as vcxconnectionutility
+* // is being used and just react to notifications
+* conUtil->Disconnect();
+*
+* // when connectionutility is no longer needed, client must call DecreaseReferenceCount()
+* // if there are no more references left, memory allocated for the library is deallocated
+* // and possible active connection is closed
+* // if client has registered as observer, it should deregister first
+* conUtil->RemoveObserver();
+* conUtil->DecreaseReferenceCount();
+* conutil = NULL;
+*
+* @endcode
+*
+*
+* @lib vcxconnectionutility.dll
+*/
+NONSHARABLE_CLASS( CVcxConnectionUtility) : public CActive
+ {
+
+ public: // Constructors and destructor
+
+ /**
+ * returns instance of the singleton object. This increases
+ * local reference count by one, so utility members should
+ * not be called through this.
+ *
+ * @return Pointer to CVcxConnectionUtility object.
+ */
+ IMPORT_C static CVcxConnectionUtility* InstanceL();
+
+ /**
+ * Remove the reference to this connectionutility instance.
+ *
+ * This should be called when client does not need
+ * utility anymore.
+ *
+ * Decreases the reference count by one. When
+ * all references are removed, the ui engine is destructed.
+ */
+ IMPORT_C void DecreaseReferenceCount();
+
+ private:
+ /**
+ * Destructor.
+ */
+ virtual ~CVcxConnectionUtility();
+
+ /**
+ * constructor.
+ *
+ */
+ CVcxConnectionUtility( );
+
+ /**
+ * Private 2nd phase construction.
+ */
+ void ConstructL();
+
+ /**
+ * From CActive, handles an active object’s request completion event
+ */
+ void RunL();
+
+ /**
+ * From CActive, implements cancellation of an outstanding request.
+ * This function is called as part of the active object’s Cancel().
+ */
+ void DoCancel();
+
+ public: // New functions
+
+
+ /**
+ * Returns open IAP, if connection is not opened it is created
+ *
+ * @param aIapId On return, IAP ID.
+ * @param aSilent If ETrue, tries to open connection silently (without dialogs)
+ * In the 'Always ask' mode query dialog is always shown.
+ *
+ * @return KErrNone or one of the system wide error codes.
+ */
+ IMPORT_C TInt GetIap( TUint32& aIapId, TBool aSilent );
+
+ /**
+ * Gets WAP id from IAP id. Leaves with KErrNotFound if no record with given
+ * IAP id is found.
+ *
+ * @param aIapId IAP id to match.
+ * @return WAP id matching the given IAP id.
+ */
+ IMPORT_C TUint32 WapIdFromIapIdL( TUint32 aIapId );
+
+ /**
+ * Closes open connection.
+ */
+ IMPORT_C void DisconnectL();
+
+ /**
+ * Registers observer
+ *
+ * @param MConnUtilEngineObserver
+ */
+ IMPORT_C void RegisterObserverL( MConnUtilEngineObserver* aObserver );
+
+ /**
+ * Removes observer from the array of observers
+ *
+ * @param MConnUtilEngineObserver
+ */
+ IMPORT_C void RemoveObserver( MConnUtilEngineObserver* aObserver );
+
+ /**
+ * Displays a wait note. Method calls notifier to show
+ * dialog and sets this active object active. If user cancels
+ * dialog by pressing cancel, RunL is being called with KErrCancel.
+ *
+ * @param aConnectionName name of connection to show on the dialog
+ */
+ void DisplayWaitNote( const TDesC& aConnectionName = KNullDesC );
+
+ /**
+ * closes a wait note
+ *
+ */
+ void CloseWaitNote();
+
+
+ private: // Data
+
+ /**
+ * Count of references to this object.
+ */
+ TInt iReferenceCount;
+
+ /**
+ * Utility implementation object
+ */
+ CVcxConnUtilImpl* iUtilImpl;
+
+ /**
+ * Notifier used for showing connecting dialogs
+ */
+ RNotifier iNotifier;
+
+ };
+#endif // __VCXNS_CONNUTIL_H_
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/inc/ipvideo/vcxconnutilengineobserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,76 @@
+/*
+* Copyright (c) 2006 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: Interface for network event handling*
+*/
+
+
+#ifndef _M_CVCX_CONUTILENGINEOBS_H__
+#define _M_CVCX_CONUTILENGINEOBS_H__
+
+
+// CLASS DECLARATION
+/**
+* Interface for the clients of vcxconnectionutility to receive and react
+* for iap changes and roaming.
+* It is not required for a client to implement this interface. In that case
+* vcxconnectionutility always excepts client to allow roaming.
+*
+*/
+
+class MConnUtilEngineObserver
+
+ {
+ public:
+
+ /**
+ * This method is called by the vcxconnectionutility when
+ * it has received a notification about the availability of
+ * "better" iaps in the network. This can happen
+ * when WLAN defined in the corresponding destination becomes
+ * available or when WLAN carrier is lost and there is a defined
+ * 3G/gprs iap (or another available WLAN) in the destination
+ * being used.
+ *
+ * Client does not have to accept the changing of the iap. If the client
+ * returns EFalse notifying it does not want to roam, then the
+ * iap is not changed.
+ *
+ * This however can result in disconnecting, if the old iap is
+ * no longer available, as happens when WLAN carrier is lost
+ *
+ * @return TBool ETrue: roaming accepted, EFalse: Roaming not accepted
+ *
+ */
+ virtual TBool RequestIsRoamingAllowedL() = 0;
+
+ /**
+ * This method is called by the vcxconnectionutility when
+ * there have been some changes in the iap currently using:
+ *
+ * Connection lost: this happens when for example WLAN carrier
+ * is lost and there is no other iap to use or when the corresponding
+ * connection is closed by some other application.
+ *
+ * Iap change by the roaming: if the client has accepted roaming,
+ * vcxconnectionutility notifies about new iap is ready to use
+ *
+ * When client is being called by this method, it can request an
+ * iap id by calling CVcxConnectionUtility::GetIap-
+ *
+ *
+ */
+ virtual void IapChangedL() = 0;
+ };
+
+#endif // _M_CVCX_CONUTILENGINEOBS_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/Bwins/VCXConnUtilTestu.def Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,3 @@
+EXPORTS
+ ?LibEntryL@@YAPAVCScriptBase@@AAVCTestModuleIf@@@Z @ 1 NONAME ; class CScriptBase * LibEntryL(class CTestModuleIf &)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/EABI/VCXConnUtilTestU.def Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,5 @@
+EXPORTS
+ _Z9LibEntryLR13CTestModuleIf @ 1 NONAME
+ _ZTI26CVCXConnUtilTestSubscriber @ 2 NONAME ; #<TI>#
+ _ZTV26CVCXConnUtilTestSubscriber @ 3 NONAME ; #<VT>#
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXConnUtilTestExe/group/VCXConnUtilTestExe.mmp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,54 @@
+/*
+* Copyright (c) 2002-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: ?Description*
+*/
+
+
+
+#include <platform_paths.hrh>
+
+TARGET VCXConnUtilTestExe.exe
+TARGETTYPE exe
+//UID 0x1000008c 0x101FB3E1
+UID 0x1000008D 0x101FB3E3
+
+CAPABILITY CAP_GENERAL_DLL -DRM -AllFiles
+
+USERINCLUDE ../inc
+USERINCLUDE ../../inc
+USERINCLUDE ../../VCXTestCommon/inc
+USERINCLUDE ../../VCXTestUtilModule/inc
+USERINCLUDE ../../../inc/ipvideo
+
+/// SYSTEMINCLUDE /Epoc32/include/ecom
+APP_LAYER_SYSTEMINCLUDE
+
+SOURCEPATH ../src
+SOURCE VCXConnUtilTestExe.cpp
+SOURCE VCXConnUtilTester.cpp
+SOURCE VCXConnUtilTestExeTester.cpp
+SOURCE ../../src/VCXConnUtilTestSubscriber.cpp
+
+LIBRARY cone.lib
+LIBRARY euser.lib
+LIBRARY estor.lib
+LIBRARY VCXTestCommon.lib
+LIBRARY FLOGGER.lib
+LIBRARY efsrv.lib
+LIBRARY bafl.lib
+LIBRARY edbms.lib // rdbstoredatabase
+LIBRARY centralrepository.lib
+LIBRARY vcxconnectionutility.lib
+
+LANG SC
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXConnUtilTestExe/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2002 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: ?Description*
+*/
+
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+
+PRJ_TESTEXPORTS
+
+PRJ_MMPFILES
+
+PRJ_TESTMMPFILES
+VCXConnUtilTestExe.mmp
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXConnUtilTestExe/inc/VCXConnUtilTestExe.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,33 @@
+/*
+* Copyright (c) 2002 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: ?Description*
+*/
+
+
+#ifndef __VCXCONNUTILTESTEXE_H__
+#define __VCXCONNUTILTESTEXE_H__
+
+// Include Files
+
+#include <e32base.h>
+
+// Function Prototypes
+
+/**
+ * Test exe needed to run video connection utility in multiple processes.
+ */
+GLDEF_C TInt E32Main();
+
+#endif // __VCXCONNUTILTESTEXE_H__
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXConnUtilTestExe/inc/VCXConnUtilTestExeTester.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,100 @@
+/*
+* Copyright (c) 2006 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:
+*
+*/
+
+
+#ifndef VCXCONNUTILTESTEXETESTER_H_
+#define VCXCONNUTILTESTEXETESTER_H_
+
+
+// INCLUDES
+#include <e32base.h>
+#include <e32std.h>
+#include <e32msgqueue.h>
+#include "VCXConnUtilTestPSObserver.h"
+
+// CONSTANTS
+
+// MACROS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// CLASS DECLARATION
+class CVCXConnUtilTestSubscriber;
+class CVCXConnUtilTester;
+
+/**
+* Observer PS key and when it changes to 1 sends msg to queue to stop the tester exe.
+* @since
+*/
+class CVCXConnUtilTestExeTester : public CBase, public MVCXConnUtilTestPSObserver
+ {
+ public: // Constructors and destructor
+ /**
+ * Two-phased constructor.
+ */
+ static CVCXConnUtilTestExeTester * NewL( TUint aProcessId );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CVCXConnUtilTestExeTester();
+
+ public: // New functions
+
+ TBool Running() { return iRunning; };
+
+ protected: // From base classes
+
+ void ValueChangedL( const TUid& aUid, const TUint32& aKey, const TInt& aValue );
+
+ void ValueChangedL( const TUid& aUid, const TUint32& aKey, const TDesC& aValue );
+
+ private:
+
+ /**
+ * C++ default constructor.
+ */
+ CVCXConnUtilTestExeTester();
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL( TUint aProcessId );
+
+ private: // Data
+ TBuf<256> iName;
+
+ CVCXConnUtilTester* iTester;
+
+ CVCXConnUtilTestSubscriber* iGlobalShutdownSubcriber;
+
+ CVCXConnUtilTestSubscriber* iCmdSubcriber;
+
+ TBool iRunning;
+
+ TInt iPSKeyBase;
+
+ TInt iAckCount;
+ };
+
+#endif // VCXCONNUTILTESTEXETESTER_H_
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXConnUtilTestExe/inc/VCXConnUtilTester.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,122 @@
+/*
+* Copyright (c) 2002 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: ?Description*
+*/
+
+
+#ifndef VCXCONNUTILTESTER_H
+#define VCXCONNUTILTESTER_H
+
+#include <e32base.h>
+#include "VCXConnUtilTester.h"
+
+#include "vcxconnutilengineobserver.h"
+#include "../../../../../videoconnutility/inc/vcxconnectionutility.hrh"
+#include "MIptvTestTimerObserver.h"
+
+class CIptvTestTimer;
+class CIptvTestActiveWait;
+class CVcxConnectionUtility;
+
+/**
+* Video connection utility tester class.
+*/
+class CVCXConnUtilTester : public CBase,
+ public MConnUtilEngineObserver,
+ public MIptvTestTimerObserver
+ {
+ public:
+
+ /**
+ * Two-phased constructor.
+ */
+ static CVCXConnUtilTester* NewL();
+
+ /**
+ * C++ default constructor.
+ */
+ CVCXConnUtilTester();
+
+ /**
+ * Destructor.
+ */
+ ~CVCXConnUtilTester();
+
+ public: // Public new functions
+
+ /**
+ * ConnUtil GetIap
+ *
+ * @return an error code.
+ */
+ TInt GetIap( TUint32& aIapId, TBool aSilent, TBool aIsTimed );
+
+ /**
+ * ConnUtil WapIdFromIapIdL
+ */
+ TUint32 WapIdFromIapIdL( const TInt32& aIapId );
+
+ /**
+ * ConnUtil Disconnect
+ *
+ * @return an error code.
+ */
+ TInt Disconnect();
+
+ private: // Constructors and destructor
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ private: // Functions from base classes
+ /**
+ * From MConnUtilEngineObserver.
+ */
+ TBool RequestIsRoamingAllowedL();
+
+ /**
+ * From MConnUtilEngineObserver.
+ */
+ void IapChangedL();
+
+ /**
+ * From MIptvTestTimerObserver Handles timer completion
+ * @since
+ * @param aTimerId
+ * @param aError
+ */
+ void TimerComplete(TInt aTimerId, TInt aError);
+
+ private: // Data
+
+ CVcxConnectionUtility* iConnUtil;
+
+ public: // Data
+ TBool iIsRoamingAllowed;
+
+ TBool iLeaveAtRoamingRequest;
+
+ TInt iDelaySecondsAtRoamingRequest;
+
+ CIptvTestTimer* iTimer;
+
+ CIptvTestActiveWait* iWait;
+
+ // This will show in function traces.
+ TBuf<256> iName;
+ };
+
+#endif // VCXCONNUTILTESTER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXConnUtilTestExe/src/VCXConnUtilTestExe.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2002 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: ?Description*
+*/
+
+
+// Include Files
+
+#include "VCXConnUtilTestExe.h"
+#include <e32base.h>
+#include <e32std.h>
+#include "VCXTestLog.h"
+
+#include "VCXConnUtilTestCommon.h"
+#include "CIptvTestActiveWait.h"
+#include "CIptvTestTimer.h"
+#include "VCXConnUtilTestExeTester.h"
+#include "VCXTestTimerWait.h"
+
+// Constants
+
+// Global Variables
+
+// Local Functions
+
+// Implements just Error() to avoid panic
+class CSimpleScheduler : public CActiveScheduler
+ {
+ void Error( TInt ) const{} // From CActiveScheduler
+ };
+
+LOCAL_C void MainL()
+ {
+ VCXLOGLO1(">>>VCXConnUtilTestExe ## MainL");
+
+ RProcess process;
+
+ CVCXTestTimerWait* wait = CVCXTestTimerWait::NewL();
+ CleanupStack::PushL( wait );
+
+ // Create stopper class.
+ CVCXConnUtilTestExeTester* stopper = CVCXConnUtilTestExeTester::NewL( process.Id() );
+ CleanupStack::PushL( stopper );
+
+ // Loop until done.
+ while( stopper->Running() )
+ {
+ wait->WaitL( 1000000 );
+ }
+
+ VCXLOGLO1("VCXConnUtilTestExe ## Loop done!");
+
+ CleanupStack::PopAndDestroy( stopper );
+ CleanupStack::PopAndDestroy( wait );
+
+ VCXLOGLO1("<<<VCXConnUtilTestExe ## MainL");
+ }
+
+LOCAL_C void DoStartL()
+ {
+ // Create active scheduler (to run active objects)
+ CSimpleScheduler* scheduler = new (ELeave) CSimpleScheduler();
+ CleanupStack::PushL(scheduler);
+ CActiveScheduler::Install(scheduler);
+
+ MainL();
+
+ // Delete active scheduler
+ CleanupStack::PopAndDestroy(scheduler);
+ }
+
+// Global Functions
+
+GLDEF_C TInt E32Main()
+ {
+ // Create cleanup stack
+ //__UHEAP_MARK;
+ CTrapCleanup* cleanup = CTrapCleanup::New();
+
+ // Run application code inside TRAP harness, wait keypress when terminated
+ TRAPD(mainError, DoStartL());
+ if (mainError)
+
+ delete cleanup;
+ //__UHEAP_MARKEND;
+ return KErrNone;
+ }
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXConnUtilTestExe/src/VCXConnUtilTestExeTester.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,392 @@
+/*
+* Copyright (c) 2002 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: ?Description*
+*/
+
+
+#include <mmf/common/mmfcontrollerpluginresolver.h> // CleanupResetAndDestroyPushL
+#include <e32property.h>
+
+#include "VCXTestCommon.h"
+#include "CIptvTestTimer.h"
+#include "VCXConnUtilTestCommon.h"
+#include "VCXConnUtilTestExeTester.h"
+#include "VCXConnUtilTestSubscriber.h"
+#include "VCXConnUtilTestPSObserver.h"
+#include "VCXConnUtilTester.h"
+
+#include "VCXTestLog.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTestExeTester::
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CVCXConnUtilTestExeTester* CVCXConnUtilTestExeTester::NewL( TUint aProcessId )
+ {
+ VCXLOGLO1(">>>CVCXConnUtilTestExeTester::NewL");
+ CVCXConnUtilTestExeTester* self = new (ELeave) CVCXConnUtilTestExeTester();
+ CleanupStack::PushL(self);
+ self->ConstructL( aProcessId );
+ CleanupStack::Pop( self );
+ VCXLOGLO1("<<<CVCXConnUtilTestExeTester::NewL");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTestExeTester::~CVCXConnUtilTestExeTester
+// destructor
+// -----------------------------------------------------------------------------
+//
+CVCXConnUtilTestExeTester::~CVCXConnUtilTestExeTester()
+ {
+ VCXLOGLO1(">>>CVCXConnUtilTestExeTester::~CVCXConnUtilTestExeTester");
+
+ delete iGlobalShutdownSubcriber;
+ iGlobalShutdownSubcriber = NULL;
+
+ delete iCmdSubcriber;
+ iCmdSubcriber = NULL;
+
+ delete iTester;
+ iTester = NULL;
+
+ // Remove the P&S keys for this process.
+ RProperty::Delete( KVCXConnUtilTestPScategory, KVCXConnUtilTestExePsKeyCmd + iPSKeyBase);
+ RProperty::Delete( KVCXConnUtilTestPScategory, KVCXConnUtilTestExePsKeyCmdIntParam1 + iPSKeyBase);
+ RProperty::Delete( KVCXConnUtilTestPScategory, KVCXConnUtilTestExePsKeyCmdIntParam2 + iPSKeyBase);
+ RProperty::Delete( KVCXConnUtilTestPScategory, KVCXConnUtilTestExePsKeyCmdDescParam1 + iPSKeyBase);
+ RProperty::Delete( KVCXConnUtilTestPScategory, KVCXConnUtilTestExePsKeyResponseAck + iPSKeyBase);
+ RProperty::Delete( KVCXConnUtilTestPScategory, KVCXConnUtilTestExePsKeyResponseCmd + iPSKeyBase);
+ RProperty::Delete( KVCXConnUtilTestPScategory, KVCXConnUtilTestExePsKeyResponseParam + iPSKeyBase);
+ RProperty::Delete( KVCXConnUtilTestPScategory, KVCXConnUtilTestExePsKeyResponseError + iPSKeyBase);
+
+ VCXLOGLO1("<<<CVCXConnUtilTestExeTester::~CVCXConnUtilTestExeTester");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTestExeTester::~CVCXConnUtilTestExeTester
+// destructor
+// -----------------------------------------------------------------------------
+//
+CVCXConnUtilTestExeTester::CVCXConnUtilTestExeTester()
+ {
+ VCXLOGLO1(">>>CVCXConnUtilTestExeTester::CVCXConnUtilTestExeTester");
+
+ VCXLOGLO1("<<<CVCXConnUtilTestExeTester::CVCXConnUtilTestExeTester");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTestExeTester::ConstructL
+//
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTestExeTester::ConstructL( TUint aProcessId )
+ {
+ VCXLOGLO1(">>>CVCXConnUtilTestExeTester::ConstructL");
+
+ iTester = CVCXConnUtilTester::NewL();
+
+ // Define and listen global shutdown key.
+
+ TInt err( KErrNone );
+
+ err = RProperty::Define( KVCXConnUtilTestPScategory, KVCXConnUtilTestExeGlobalShutdownKey, RProperty::EInt );
+ VCXLOGLO3("CVCXConnUtilTestExeTester:: Define KVCXConnUtilTestExeGlobalShutdownKey: %d, err: %d",
+ KVCXConnUtilTestExeGlobalShutdownKey, err);
+
+ iGlobalShutdownSubcriber = CVCXConnUtilTestSubscriber::NewL( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExeGlobalShutdownKey, RProperty::EInt, this );
+ iGlobalShutdownSubcriber->Start();
+ VCXLOGLO2("CVCXConnUtilTestExeTester:: Listening P&S key KVCXConnUtilTestExeGlobalShutdownKey: %d",
+ KVCXConnUtilTestExeGlobalShutdownKey);
+
+ // Get PS key base.
+
+ TInt testerCount( 0 );
+
+ User::LeaveIfError( CVCXTestCommon::GetPSProperty(
+ KVCXConnUtilTestPScategory, KVCXConnUtilTestExeGlobalTesterCount, testerCount ) );
+
+ testerCount++;
+
+ iPSKeyBase = testerCount * 1000 + aProcessId;
+
+ VCXLOGLO2("CVCXConnUtilTestExeTester:: iPSKeyBase: %d", iPSKeyBase);
+
+ // Define private P&S keys.
+
+ err = RProperty::Define( KVCXConnUtilTestPScategory, KVCXConnUtilTestExePsKeyCmd + iPSKeyBase,
+ RProperty::EInt );
+ VCXLOGLO3("CVCXConnUtilTestExeTester:: Define KVCXConnUtilTestExePsKeyCmd: %d, err: %d",
+ KVCXConnUtilTestExePsKeyCmd + iPSKeyBase, err);
+
+ err = RProperty::Define( KVCXConnUtilTestPScategory, KVCXConnUtilTestExePsKeyCmdIntParam1 + iPSKeyBase,
+ RProperty::EInt );
+ VCXLOGLO3("CVCXConnUtilTestExeTester:: Define KVCXConnUtilTestExePsKeyCmdIntParam1: %d, err: %d",
+ KVCXConnUtilTestExePsKeyCmdIntParam1 + iPSKeyBase, err);
+
+ err = RProperty::Define( KVCXConnUtilTestPScategory, KVCXConnUtilTestExePsKeyCmdIntParam2 + iPSKeyBase,
+ RProperty::EInt );
+ VCXLOGLO3("CVCXConnUtilTestExeTester:: Define KVCXConnUtilTestExePsKeyCmdIntParam2: %d, err: %d",
+ KVCXConnUtilTestExePsKeyCmdIntParam2 + iPSKeyBase, err);
+
+ err = RProperty::Define( KVCXConnUtilTestPScategory, KVCXConnUtilTestExePsKeyCmdDescParam1 + iPSKeyBase,
+ RProperty::EText );
+ VCXLOGLO3("CVCXConnUtilTestExeTester:: Define KVCXConnUtilTestExePsKeyCmdDescParam1: %d, err: %d",
+ KVCXConnUtilTestExePsKeyCmdDescParam1 + iPSKeyBase, err);
+
+ err = RProperty::Define( KVCXConnUtilTestPScategory, KVCXConnUtilTestExePsKeyResponseAck + iPSKeyBase,
+ RProperty::EInt );
+ VCXLOGLO3("CVCXConnUtilTestExeTester:: Define KVCXConnUtilTestExePsKeyResponseAck: %d, err: %d",
+ KVCXConnUtilTestExePsKeyResponseAck + iPSKeyBase, err);
+
+ err = RProperty::Define( KVCXConnUtilTestPScategory, KVCXConnUtilTestExePsKeyResponseCmd + iPSKeyBase,
+ RProperty::EInt );
+ VCXLOGLO3("CVCXConnUtilTestExeTester:: Define KVCXConnUtilTestExePsKeyResponseCmd: %d, err: %d",
+ KVCXConnUtilTestExePsKeyResponseCmd + iPSKeyBase, err);
+
+ err = RProperty::Define( KVCXConnUtilTestPScategory, KVCXConnUtilTestExePsKeyResponseParam + iPSKeyBase,
+ RProperty::EInt );
+ VCXLOGLO3("CVCXConnUtilTestExeTester:: Define KVCXConnUtilTestExePsKeyResponseParam: %d, err: %d",
+ KVCXConnUtilTestExePsKeyResponseParam + iPSKeyBase, err);
+
+ err = RProperty::Define( KVCXConnUtilTestPScategory, KVCXConnUtilTestExePsKeyResponseError + iPSKeyBase,
+ RProperty::EInt );
+ VCXLOGLO3("CVCXConnUtilTestExeTester:: Define KVCXConnUtilTestExePsKeyResponseError: %d, err: %d",
+ KVCXConnUtilTestExePsKeyResponseError + iPSKeyBase, err);
+
+ // Subscribe P&S cmd key.
+
+ iCmdSubcriber = CVCXConnUtilTestSubscriber::NewL( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyCmd + iPSKeyBase, RProperty::EInt, this );
+ iCmdSubcriber->Start();
+ VCXLOGLO2("CVCXConnUtilTestExeTester:: Listening P&S key KVCXConnUtilTestExePsKeyCmd: %d",
+ KVCXConnUtilTestExePsKeyCmd + iPSKeyBase);
+
+ iRunning = ETrue;
+
+ // And update the tester count to P&S.
+ User::LeaveIfError( CVCXTestCommon::SetPSProperty(
+ KVCXConnUtilTestPScategory, KVCXConnUtilTestExeGlobalTesterCount, testerCount ) );
+
+ VCXLOGLO1("<<<CVCXConnUtilTestExeTester::ConstructL");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTestExeTester::ValueChangedL
+//
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTestExeTester::ValueChangedL( const TUid& aUid, const TUint32& aKey, const TInt& aValue )
+ {
+ // Right now this is only category we are subscribing for.
+ if( aUid != KVCXConnUtilTestPScategory )
+ {
+ return;
+ }
+
+ if( aKey == KVCXConnUtilTestExeGlobalShutdownKey )
+ {
+ if( aValue == 1 )
+ {
+ iRunning = EFalse;
+ VCXLOGLO2("CVCXConnUtilTestExeTester::ValueChangedL: cmd GLOBAL SHUTDOWN (%S) ----->", &iName);
+ }
+ return;
+ }
+
+ VCXLOGLO2(">>>CVCXConnUtilTestExeTester::ValueChangedL TInt (%S)", &iName);
+
+ // Store possible parameters.
+ TInt intParam1(0);
+ TInt intParam2(0);
+ TBuf<256> descParam1;
+
+ CVCXTestCommon::GetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyCmdIntParam1 + iPSKeyBase, intParam1 );
+ CVCXTestCommon::GetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyCmdIntParam2 + iPSKeyBase, intParam2 );
+ CVCXTestCommon::GetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyCmdDescParam1 + iPSKeyBase, descParam1 );
+
+ // Set response that cmd has been gotten.
+
+ VCXLOGLO2("CVCXConnUtilTestExeTester:: Setting KVCXConnUtilTestExePsKeyResponseAck (%S) ----->", &iName);
+ CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyResponseAck + iPSKeyBase, iAckCount++ );
+
+ // Handle commands.
+ if( aKey == KVCXConnUtilTestExePsKeyCmd + iPSKeyBase )
+ {
+ switch( aValue )
+ {
+ case EVcxConnUtilCommandShutdown:
+ {
+ VCXLOGLO2("CVCXConnUtilTestExeTester:: cmd EVcxConnUtilCommandShutdown (%S) ----->", &iName);
+ iRunning = EFalse;
+ }
+ break;
+
+ case EVcxConnUtilCommandSetName:
+ {
+ iName.Copy( descParam1 );
+ iTester->iName.Copy( descParam1 );
+ VCXLOGLO2("CVCXConnUtilTestExeTester:: cmd EVcxConnUtilCommandSetName (%S) ----->", &iName);
+ }
+ break;
+
+ case EVcxConnUtilCommandGetIap:
+ {
+ VCXLOGLO2("CVCXConnUtilTestExeTester:: cmd EVcxConnUtilCommandGetIap (%S) ----->", &iName);
+
+ TUint32 iapId(0);
+ TBool silent = static_cast<TBool>( intParam1);
+ TBool isTimed = static_cast<TBool>( intParam2 );
+
+ TInt err = iTester->GetIap( iapId, silent, isTimed );
+
+ if( err != KErrNone || iapId == 0 )
+ {
+ VCXLOGLO4("CVCXConnUtilTestExeTester:: GetIap error: %d, iap: %d (%S)", err, iapId, &iName);
+ }
+
+ VCXLOGLO2("CVCXConnUtilTestExeTester:: Setting response for EVcxConnUtilCommandGetIap (%S) ----->",
+ &iName);
+ CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyResponseParam + iPSKeyBase, iapId );
+ CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyResponseError + iPSKeyBase, err );
+ CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyResponseCmd + iPSKeyBase, EVcxConnUtilCommandGetIap );
+
+ }
+ break;
+
+
+ case EVcxConnUtilCommandGetWapIdForIap:
+ {
+ VCXLOGLO2("CVCXConnUtilTestExeTester:: cmd EVcxConnUtilCommandGetWapIdForIap (%S) ----->", &iName);
+
+ TInt err( KErrNone );
+
+ TUint32 wapId( 0 );
+ TRAP( err, iTester->WapIdFromIapIdL( intParam1 ) );
+
+ VCXLOGLO4("CVCXConnUtilTestExeTester:: GetWapIdFromIapIdL returned wapId: %d, err: %d (%S)", wapId, err, &iName);
+
+ VCXLOGLO2("CVCXConnUtilTestExeTester:: Setting response for EVcxConnUtilCommandGetWapIdForIap (%S) ----->",
+ &iName);
+ CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyResponseParam + iPSKeyBase, wapId );
+ CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyResponseError + iPSKeyBase, err );
+ CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyResponseCmd + iPSKeyBase, EVcxConnUtilCommandGetWapIdForIap );
+
+ }
+ break;
+
+ case EVcxConnUtilCommandDisconnect:
+ {
+ VCXLOGLO2("CVCXConnUtilTestExeTester:: cmd EVcxConnUtilCommandDisconnect (%S) ----->", &iName);
+
+ TInt err = iTester->Disconnect();
+
+ if( err != KErrNone )
+ {
+ VCXLOGLO3("CVCXConnUtilTestExeTester:: disconnect error: %d (%S)", err, &iName);
+ }
+
+ VCXLOGLO2("CVCXConnUtilTestExeTester:: Setting response for EVcxConnUtilCommandDisconnect (%S) ----->",
+ &iName);
+ CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyResponseError + iPSKeyBase, err );
+ CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyResponseCmd + iPSKeyBase, EVcxConnUtilCommandDisconnect );
+ }
+ break;
+
+ case EVcxConnUtilCommandSetRoamingAllowed:
+ {
+ VCXLOGLO2("CVCXConnUtilTestExeTester:: cmd EVcxConnUtilCommandSetRoamingAllowed (%S) ----->",
+ &iName);
+ iTester->iIsRoamingAllowed = intParam1;
+ }
+ break;
+
+ case EVcxConnUtilCommandSetRoamingLeaveAtRoamingRequest:
+ {
+ VCXLOGLO2("CVCXConnUtilTestExeTester:: cmd EVcxConnUtilCommandSetRoamingLeaveAtRoamingRequest (%S) ----->", &iName);
+ iTester->iLeaveAtRoamingRequest = intParam1;
+ }
+ break;
+
+ case EVcxConnUtilCommandSetDelayBeforeRoamingRequest:
+ {
+ VCXLOGLO2("CVCXConnUtilTestExeTester:: cmd EVcxConnUtilCommandSetDelayBeforeRoamingRequest (%S) ----->", &iName);
+ iTester->iDelaySecondsAtRoamingRequest = intParam1;
+ }
+ break;
+
+ default:
+ {
+ VCXLOGLO3("CVCXConnUtilTestExeTester:: UNKNOWN cmd %d! (%S) ----->", aValue, &iName);
+ }
+ break;
+ }
+ }
+
+ VCXLOGLO2("<<<CVCXConnUtilTestExeTester::ValueChangedL TInt (%S)", &iName);
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTestExeTester::ValueChangedL
+//
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTestExeTester::ValueChangedL( const TUid& aUid, const TUint32& /* aKey */, const TDesC& /* aValue */ )
+ {
+ VCXLOGLO1(">>>CVCXConnUtilTestExeTester::ValueChangedL TDesC");
+
+ if( aUid == KVCXConnUtilTestPScategory )
+ {
+
+ }
+
+ VCXLOGLO1("<<<CVCXConnUtilTestExeTester::ValueChangedL TDesC");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXConnUtilTestExe/src/VCXConnUtilTester.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,221 @@
+/*
+* Copyright (c) 2002 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: ?Description*
+*/
+
+
+#include <S32STRM.H>
+#include <S32MEM.H>
+
+#include "VCXTestLog.h"
+
+#include "VCXConnUtilTester.h"
+#include "vcxconnectionutility.h"
+#include "CIptvTestTimer.h"
+#include "CIptvTestActiveWait.h"
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTester::NewL
+// -----------------------------------------------------------------------------
+//
+CVCXConnUtilTester* CVCXConnUtilTester::NewL()
+ {
+ VCXLOGLO1(">>>CVCXConnUtilTester::NewL");
+ CVCXConnUtilTester* self = new (ELeave) CVCXConnUtilTester();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ VCXLOGLO1("<<<CVCXConnUtilTester::NewL");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTester::CVCXConnUtilTester
+// -----------------------------------------------------------------------------
+//
+CVCXConnUtilTester::CVCXConnUtilTester()
+ {
+
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTester::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTester::ConstructL()
+ {
+ VCXLOGLO1(">>>CVCXConnUtilTester::ConstructL");
+
+ iIsRoamingAllowed = ETrue;
+ iLeaveAtRoamingRequest = EFalse;
+ iDelaySecondsAtRoamingRequest = 0;
+
+ iConnUtil = CVcxConnectionUtility::InstanceL();
+ iConnUtil->RegisterObserverL( this );
+
+ iTimer = CIptvTestTimer::NewL( *this, 0 );
+
+ iWait = CIptvTestActiveWait::NewL();
+
+ VCXLOGLO1("<<<CVCXConnUtilTester::ConstructL");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTester::~CVCXConnUtilTester
+// -----------------------------------------------------------------------------
+//
+CVCXConnUtilTester::~CVCXConnUtilTester()
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTester::~CVCXConnUtilTester (%S)", &iName);
+
+ if( iConnUtil )
+ {
+ iConnUtil->RemoveObserver( this );
+ TRAP_IGNORE( iConnUtil->DisconnectL() );
+ iConnUtil->DecreaseReferenceCount();
+ }
+ iConnUtil = NULL;
+
+ if( iTimer )
+ {
+ iTimer->CancelTimer();
+ delete iTimer;
+ iTimer = NULL;
+ }
+
+ delete iWait;
+ iWait = NULL;
+
+ VCXLOGLO2("<<<CVCXConnUtilTester::~CVCXConnUtilTester (%S)", &iName);
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTester::GetIap
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTester::GetIap( TUint32& aIapId, TBool aSilent, TBool aIsTimed )
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTester::GetIap (%S)", &iName);
+ VCXLOGLO2("CVCXConnUtilTester:: isTimed: %d", aIsTimed);
+
+ if( aIsTimed )
+ {
+ // Time GetIap request when next minute starts
+ TInt seconds( 0 );
+ TTime now;
+ now.HomeTime();
+
+ TDateTime time = now.DateTime();
+
+ if( time.Second() >= 55 )
+ {
+ seconds += 10; // Wait extra 10 seconds to make sure any other test module is ready.
+ }
+
+ seconds += 60 - time.Second(); // Wait to end of minute
+
+ VCXLOGLO3("CVCXConnUtilTester:: waiting %d seconds (%S)", seconds, &iName);
+
+ TUint32 microSeconds( 0 );
+ microSeconds = seconds * 1000000;
+
+ microSeconds += 1 - time.MicroSecond(); // And any extra microseconds
+
+ iTimer->After( microSeconds );
+ iWait->Start();
+ }
+
+ VCXLOGLO2("CVCXConnUtilTester:: making GetIap call (%S) ----->", &iName);
+ TInt err = iConnUtil->GetIap( aIapId, aSilent );
+ VCXLOGLO2("CVCXConnUtilTester:: GetIap returns: %d", err);
+ VCXLOGLO2("<<<CVCXConnUtilTester::GetIap (%S)", &iName);
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTester::WapIdFromIapIdL
+// -----------------------------------------------------------------------------
+//
+TUint32 CVCXConnUtilTester::WapIdFromIapIdL( const TInt32& aIapId )
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTester::WapIdFromIapIdL (%S) ----->", &iName);
+ TUint32 aWapId = iConnUtil->WapIdFromIapIdL( aIapId );
+ VCXLOGLO2("CVCXConnUtilTester:: WapIdFromIapIdL returns %d", aWapId);
+ VCXLOGLO2("<<<CVCXConnUtilTester::WapIdFromIapIdL (%S)", &iName);
+ return aWapId;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTester::Disconnect
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTester::Disconnect()
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTester::Disconnect (%S) ----->", &iName);
+ TRAPD( err, iConnUtil->DisconnectL() );
+ VCXLOGLO2("CVCXConnUtilTester:: Disconnect returns %d", err);
+ VCXLOGLO2("<<<CVCXConnUtilTester::Disconnect (%S)", &iName);
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTester::RequestIsRoamingAllowedL
+// -----------------------------------------------------------------------------
+//
+TBool CVCXConnUtilTester::RequestIsRoamingAllowedL()
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTester::RequestIsRoamingAllowedL (%S) ----->", &iName);
+
+ if( iLeaveAtRoamingRequest )
+ {
+ VCXLOGLO1("CVCXConnUtilTester:: iLeaveAtRoamingRequest set. LEAVING!");
+ User::Leave( KErrTotalLossOfPrecision );
+ }
+
+ if( iDelaySecondsAtRoamingRequest > 0 )
+ {
+ VCXLOGLO2("CVCXConnUtilTester:: delay: %d", iDelaySecondsAtRoamingRequest );
+ iTimer->After( iDelaySecondsAtRoamingRequest * 1000000 );
+ iWait->Start();
+ }
+
+ VCXLOGLO2("CVCXConnUtilTest:: iIsRoamingAllowed = %d", iIsRoamingAllowed);
+
+ VCXLOGLO2("<<<CVCXConnUtilTester::RequestIsRoamingAllowedL (%S)", &iName);
+ return iIsRoamingAllowed;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTester::IapChangedL
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTester::IapChangedL()
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTester::IapChangedL (%S)", &iName);
+ VCXLOGLO2("<<<CVCXConnUtilTester::IapChangedL (%S)", &iName);
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTest::TimerComplete
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTester::TimerComplete( TInt /* aTimerId */, TInt aError )
+ {
+ VCXLOGLO3(">>>CVCXConnUtilTester::TimerComplete, err: %d (%S)", aError, &iName);
+ iWait->Stop();
+ VCXLOGLO2("<<<CVCXConnUtilTester::TimerComplete (%S)", &iName);
+ }
+
+
+// EOF
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/BWINS/VCXTestCommonu.def Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,148 @@
+EXPORTS
+ ??0CIptvTestActiveWait@@AAE@XZ @ 1 NONAME ; CIptvTestActiveWait::CIptvTestActiveWait(void)
+ ??0CIptvTestEvent@@QAE@ABVTDesC16@@H@Z @ 2 NONAME ; CIptvTestEvent::CIptvTestEvent(class TDesC16 const &, int)
+ ??0CIptvTestVideoCreator@@QAE@XZ @ 3 NONAME ; CIptvTestVideoCreator::CIptvTestVideoCreator(void)
+ ??0CTestUtilConnectionWaiter@@AAE@PAVMTestUtilConnectionObserver@@@Z @ 4 NONAME ; CTestUtilConnectionWaiter::CTestUtilConnectionWaiter(class MTestUtilConnectionObserver *)
+ ??0CVCXTestMessageWait@@AAE@PAVMVCXTestMessageWaitObserver@@@Z @ 5 NONAME ; CVCXTestMessageWait::CVCXTestMessageWait(class MVCXTestMessageWaitObserver *)
+ ??1CIptvTestActiveWait@@UAE@XZ @ 6 NONAME ; CIptvTestActiveWait::~CIptvTestActiveWait(void)
+ ??1CIptvTestDownloadManager@@UAE@XZ @ 7 NONAME ; CIptvTestDownloadManager::~CIptvTestDownloadManager(void)
+ ??1CIptvTestEvent@@UAE@XZ @ 8 NONAME ; CIptvTestEvent::~CIptvTestEvent(void)
+ ??1CIptvTestEventWaiter@@UAE@XZ @ 9 NONAME ; CIptvTestEventWaiter::~CIptvTestEventWaiter(void)
+ ??1CIptvTestMobilecrashWatcher@@UAE@XZ @ 10 NONAME ; CIptvTestMobilecrashWatcher::~CIptvTestMobilecrashWatcher(void)
+ ??1CIptvTestTimer@@UAE@XZ @ 11 NONAME ; CIptvTestTimer::~CIptvTestTimer(void)
+ ??1CIptvTestUtilALR@@UAE@XZ @ 12 NONAME ; CIptvTestUtilALR::~CIptvTestUtilALR(void)
+ ??1CIptvTestVerifyData@@UAE@XZ @ 13 NONAME ; CIptvTestVerifyData::~CIptvTestVerifyData(void)
+ ??1CIptvTestVideoCreator@@UAE@XZ @ 14 NONAME ; CIptvTestVideoCreator::~CIptvTestVideoCreator(void)
+ ??1CTestUtilConnection@@UAE@XZ @ 15 NONAME ; CTestUtilConnection::~CTestUtilConnection(void)
+ ??1CTestUtilConnectionWaiter@@UAE@XZ @ 16 NONAME ; CTestUtilConnectionWaiter::~CTestUtilConnectionWaiter(void)
+ ??1CVCXTestMessageWait@@UAE@XZ @ 17 NONAME ; CVCXTestMessageWait::~CVCXTestMessageWait(void)
+ ??1CVCXTestPSSubscriber@@UAE@XZ @ 18 NONAME ; CVCXTestPSSubscriber::~CVCXTestPSSubscriber(void)
+ ??1CVCXTestTimerWait@@UAE@XZ @ 19 NONAME ; CVCXTestTimerWait::~CVCXTestTimerWait(void)
+ ?ActionEndL@CVCXTestStatsKeeper@@QAEXABVTDesC16@@H@Z @ 20 NONAME ; void CVCXTestStatsKeeper::ActionEndL(class TDesC16 const &, int)
+ ?ActionEndL@CVCXTestStatsKeeper@@QAEXJH@Z @ 21 NONAME ; void CVCXTestStatsKeeper::ActionEndL(long, int)
+ ?ActionProgressL@CVCXTestStatsKeeper@@QAEXABVTDesC16@@0@Z @ 22 NONAME ; void CVCXTestStatsKeeper::ActionProgressL(class TDesC16 const &, class TDesC16 const &)
+ ?ActionProgressL@CVCXTestStatsKeeper@@QAEXJABVTDesC16@@@Z @ 23 NONAME ; void CVCXTestStatsKeeper::ActionProgressL(long, class TDesC16 const &)
+ ?ActionStartL@CVCXTestStatsKeeper@@QAEXABVTDesC16@@0H@Z @ 24 NONAME ; void CVCXTestStatsKeeper::ActionStartL(class TDesC16 const &, class TDesC16 const &, int)
+ ?ActionStartL@CVCXTestStatsKeeper@@QAEXJABVTDesC16@@@Z @ 25 NONAME ; void CVCXTestStatsKeeper::ActionStartL(long, class TDesC16 const &)
+ ?ActionTraceL@CVCXTestStatsKeeper@@QAEXABVTDesC16@@@Z @ 26 NONAME ; void CVCXTestStatsKeeper::ActionTraceL(class TDesC16 const &)
+ ?Activate@CIptvTestEvent@@QAEXXZ @ 27 NONAME ; void CIptvTestEvent::Activate(void)
+ ?ActiveWait@CIptvTestActiveWait@@QAEXW4TIptvTestActiveWaitCmd@1@@Z @ 28 NONAME ; void CIptvTestActiveWait::ActiveWait(enum CIptvTestActiveWait::TIptvTestActiveWaitCmd)
+ ?AddEvent@CIptvTestEventWaiter@@QAEHPAVCIptvTestEvent@@H@Z @ 29 NONAME ; int CIptvTestEventWaiter::AddEvent(class CIptvTestEvent *, int)
+ ?AddMessage@CVCXTestMessageWait@@QAEXJ@Z @ 30 NONAME ; void CVCXTestMessageWait::AddMessage(long)
+ ?AdvanceSystemTimeHours@CVCXTestCommon@@SAHH@Z @ 31 NONAME ; int CVCXTestCommon::AdvanceSystemTimeHours(int)
+ ?AdvanceSystemTimeMinutes@CVCXTestCommon@@SAHH@Z @ 32 NONAME ; int CVCXTestCommon::AdvanceSystemTimeMinutes(int)
+ ?AdvanceSystemTimeSeconds@CVCXTestCommon@@SAHH@Z @ 33 NONAME ; int CVCXTestCommon::AdvanceSystemTimeSeconds(int)
+ ?After@CIptvTestTimer@@QAEXVTTimeIntervalMicroSeconds32@@@Z @ 34 NONAME ; void CIptvTestTimer::After(class TTimeIntervalMicroSeconds32)
+ ?AttachL@CTestUtilConnection@@QAEXXZ @ 35 NONAME ; void CTestUtilConnection::AttachL(void)
+ ?CancelTimer@CIptvTestTimer@@QAEXXZ @ 36 NONAME ; void CIptvTestTimer::CancelTimer(void)
+ ?CheckNewCrashesL@CIptvTestMobilecrashWatcher@@QAEXXZ @ 37 NONAME ; void CIptvTestMobilecrashWatcher::CheckNewCrashesL(void)
+ ?CheckTimeouts@CIptvTestEventWaiter@@QAEHXZ @ 38 NONAME ; int CIptvTestEventWaiter::CheckTimeouts(void)
+ ?CompareMobilecrashesL@CIptvTestMobilecrashWatcher@@QAEHAAV?$RPointerArray@VHBufC16@@@@0@Z @ 39 NONAME ; int CIptvTestMobilecrashWatcher::CompareMobilecrashesL(class RPointerArray<class HBufC16> &, class RPointerArray<class HBufC16> &)
+ ?ConnectL@CTestUtilConnection@@QAEXXZ @ 40 NONAME ; void CTestUtilConnection::ConnectL(void)
+ ?ConstructL@CIptvTestActiveWait@@AAEXXZ @ 41 NONAME ; void CIptvTestActiveWait::ConstructL(void)
+ ?ConstructL@CIptvTestDownloadManager@@AAEXXZ @ 42 NONAME ; void CIptvTestDownloadManager::ConstructL(void)
+ ?ConstructL@CIptvTestVideoCreator@@AAEXXZ @ 43 NONAME ; void CIptvTestVideoCreator::ConstructL(void)
+ ?ConstructL@CVCXTestMessageWait@@AAEXXZ @ 44 NONAME ; void CVCXTestMessageWait::ConstructL(void)
+ ?ConstructL@CVCXTestTimerWait@@AAEXXZ @ 45 NONAME ; void CVCXTestTimerWait::ConstructL(void)
+ ?CoolDownL@CVCXTestMessageWait@@QAEXH@Z @ 46 NONAME ; void CVCXTestMessageWait::CoolDownL(int)
+ ?CopyMethodL@CIptvTestUtilALR@@QAEXAAVTDesC16@@00@Z @ 47 NONAME ; void CIptvTestUtilALR::CopyMethodL(class TDesC16 &, class TDesC16 &, class TDesC16 &)
+ ?CreateBadIapL@CVCXTestCommon@@QAEKAAVTDesC16@@@Z @ 48 NONAME ; unsigned long CVCXTestCommon::CreateBadIapL(class TDesC16 &)
+ ?CreateDestinationL@CIptvTestUtilALR@@QAEXAAVTDesC16@@@Z @ 49 NONAME ; void CIptvTestUtilALR::CreateDestinationL(class TDesC16 &)
+ ?CreateVerifyData@CVCXTestCommon@@QAEHAAVTDesC16@@H@Z @ 50 NONAME ; int CVCXTestCommon::CreateVerifyData(class TDesC16 &, int)
+ ?CreateVerifyDataL@CIptvTestVerifyData@@QAEHAAVTDesC16@@H@Z @ 51 NONAME ; int CIptvTestVerifyData::CreateVerifyDataL(class TDesC16 &, int)
+ ?CreateVideoFileL@CVCXTestCommon@@QAEXW4TIptvTestVideoType@CIptvTestVideoCreator@@AAVTDesC16@@H@Z @ 52 NONAME ; void CVCXTestCommon::CreateVideoFileL(enum CIptvTestVideoCreator::TIptvTestVideoType, class TDesC16 &, int)
+ ?CreateVideoFilesL@CVCXTestCommon@@QAEXW4TIptvTestVideoType@CIptvTestVideoCreator@@AAVTDesC16@@HAAV?$RPointerArray@VHBufC16@@@@@Z @ 53 NONAME ; void CVCXTestCommon::CreateVideoFilesL(enum CIptvTestVideoCreator::TIptvTestVideoType, class TDesC16 &, int, class RPointerArray<class HBufC16> &)
+ ?CreateVideoL@CIptvTestVideoCreator@@QAEXW4TIptvTestVideoType@1@AAVTDesC16@@H@Z @ 54 NONAME ; void CIptvTestVideoCreator::CreateVideoL(enum CIptvTestVideoCreator::TIptvTestVideoType, class TDesC16 &, int)
+ ?CreateVideosL@CIptvTestVideoCreator@@QAEXW4TIptvTestVideoType@1@AAVTDesC16@@HAAV?$RPointerArray@VHBufC16@@@@@Z @ 55 NONAME ; void CIptvTestVideoCreator::CreateVideosL(enum CIptvTestVideoCreator::TIptvTestVideoType, class TDesC16 &, int, class RPointerArray<class HBufC16> &)
+ ?Deactivate@CIptvTestEvent@@QAEXXZ @ 56 NONAME ; void CIptvTestEvent::Deactivate(void)
+ ?DeleteDestinationL@CIptvTestUtilALR@@QAEXAAVTDesC16@@@Z @ 57 NONAME ; void CIptvTestUtilALR::DeleteDestinationL(class TDesC16 &)
+ ?DeleteDummyFilesL@CVCXTestCommon@@QAEXH@Z @ 58 NONAME ; void CVCXTestCommon::DeleteDummyFilesL(int)
+ ?DeleteMethodL@CIptvTestUtilALR@@QAEXAAVTDesC16@@0@Z @ 59 NONAME ; void CIptvTestUtilALR::DeleteMethodL(class TDesC16 &, class TDesC16 &)
+ ?DoCancel@CVCXTestPSSubscriber@@EAEXXZ @ 60 NONAME ; void CVCXTestPSSubscriber::DoCancel(void)
+ ?DownloadL@CIptvTestDownloadManager@@QAEHAAVTDesC16@@000JH@Z @ 61 NONAME ; int CIptvTestDownloadManager::DownloadL(class TDesC16 &, class TDesC16 &, class TDesC16 &, class TDesC16 &, long, int)
+ ?EnableTimestamps@CIptvTestVerifyData@@QAEXH@Z @ 62 NONAME ; void CIptvTestVerifyData::EnableTimestamps(int)
+ ?EnableVerifyTimestamps@CVCXTestCommon@@QAEXH@Z @ 63 NONAME ; void CVCXTestCommon::EnableVerifyTimestamps(int)
+ ?EndWait@CVCXTestPSSubscriber@@QAEXXZ @ 64 NONAME ; void CVCXTestPSSubscriber::EndWait(void)
+ ?EnsureFileIsNotInUse@CVCXTestCommon@@QAEHABVTPtrC16@@@Z @ 65 NONAME ; int CVCXTestCommon::EnsureFileIsNotInUse(class TPtrC16 const &)
+ ?EventHappened@CIptvTestEventWaiter@@QAEHPAVCIptvTestEvent@@PAPAV2@@Z @ 66 NONAME ; int CIptvTestEventWaiter::EventHappened(class CIptvTestEvent *, class CIptvTestEvent * *)
+ ?Get@CVCXTestPSSubscriber@@QAEHAAH@Z @ 67 NONAME ; int CVCXTestPSSubscriber::Get(int &)
+ ?Get@CVCXTestPSSubscriber@@QAEHAAVTDes16@@@Z @ 68 NONAME ; int CVCXTestPSSubscriber::Get(class TDes16 &)
+ ?GetDestinationIdL@CIptvTestUtilALR@@QAEHAAVTDesC16@@@Z @ 69 NONAME ; int CIptvTestUtilALR::GetDestinationIdL(class TDesC16 &)
+ ?GetError@CIptvTestDownloadManager@@QAEXAAVRHttpDownload@@AAJ@Z @ 70 NONAME ; void CIptvTestDownloadManager::GetError(class RHttpDownload &, long &)
+ ?GetEventCount@CIptvTestEventWaiter@@QAEHXZ @ 71 NONAME ; int CIptvTestEventWaiter::GetEventCount(void)
+ ?GetFileSize@CVCXTestCommon@@QAEHAAVTDesC16@@AAK@Z @ 72 NONAME ; int CVCXTestCommon::GetFileSize(class TDesC16 &, unsigned long &)
+ ?GetIapIdByNameL@CVCXTestCommon@@QAEHABVTDesC16@@AAK@Z @ 73 NONAME ; int CVCXTestCommon::GetIapIdByNameL(class TDesC16 const &, unsigned long &)
+ ?GetIapIdByTypeL@CVCXTestCommon@@QAEHW4TIptvTestIapType@1@AAKH@Z @ 74 NONAME ; int CVCXTestCommon::GetIapIdByTypeL(enum CVCXTestCommon::TIptvTestIapType, unsigned long &, int)
+ ?GetIapIdL@CVCXTestCommon@@QAEHABVTDesC16@@AAK@Z @ 75 NONAME ; int CVCXTestCommon::GetIapIdL(class TDesC16 const &, unsigned long &)
+ ?GetIapNameById@CVCXTestCommon@@QAEHAAVTDes16@@K@Z @ 76 NONAME ; int CVCXTestCommon::GetIapNameById(class TDes16 &, unsigned long)
+ ?GetName@CIptvTestEvent@@QAEXAAVTDes16@@@Z @ 77 NONAME ; void CIptvTestEvent::GetName(class TDes16 &)
+ ?GetPSProperty@CVCXTestCommon@@SAHVTUid@@IAAH@Z @ 78 NONAME ; int CVCXTestCommon::GetPSProperty(class TUid, unsigned int, int &)
+ ?GetPSProperty@CVCXTestCommon@@SAHVTUid@@IAAVTDes16@@@Z @ 79 NONAME ; int CVCXTestCommon::GetPSProperty(class TUid, unsigned int, class TDes16 &)
+ ?GetState@CTestUtilConnection@@QAE?AW4TConnectionState@1@XZ @ 80 NONAME ; enum CTestUtilConnection::TConnectionState CTestUtilConnection::GetState(void)
+ ?GetVideoFile@CIptvTestVideoCreator@@AAEXAAVTDes16@@W4TIptvTestVideoType@1@ABVTDesC16@@@Z @ 81 NONAME ; void CIptvTestVideoCreator::GetVideoFile(class TDes16 &, enum CIptvTestVideoCreator::TIptvTestVideoType, class TDesC16 const &)
+ ?HasTimeouted@CIptvTestEvent@@QAEHAAVTTime@@@Z @ 82 NONAME ; int CIptvTestEvent::HasTimeouted(class TTime &)
+ ?IsConnectionActive@CTestUtilConnectionWaiter@@QAEHK@Z @ 83 NONAME ; int CTestUtilConnectionWaiter::IsConnectionActive(unsigned long)
+ ?IsWaiting@CIptvTestActiveWait@@QAEHXZ @ 84 NONAME ; int CIptvTestActiveWait::IsWaiting(void)
+ ?ListDir@CVCXTestCommon@@QAEHABVTDesC16@@H@Z @ 85 NONAME ; int CVCXTestCommon::ListDir(class TDesC16 const &, int)
+ ?NewL@CIptvTestActiveWait@@SAPAV1@XZ @ 86 NONAME ; class CIptvTestActiveWait * CIptvTestActiveWait::NewL(void)
+ ?NewL@CIptvTestDownloadManager@@SAPAV1@PAVMTestUtilDownloadObserver@@@Z @ 87 NONAME ; class CIptvTestDownloadManager * CIptvTestDownloadManager::NewL(class MTestUtilDownloadObserver *)
+ ?NewL@CIptvTestEventWaiter@@SAPAV1@AAVMIptvTestEventWaiterObserver@@@Z @ 88 NONAME ; class CIptvTestEventWaiter * CIptvTestEventWaiter::NewL(class MIptvTestEventWaiterObserver &)
+ ?NewL@CIptvTestMobilecrashWatcher@@SAPAV1@H@Z @ 89 NONAME ; class CIptvTestMobilecrashWatcher * CIptvTestMobilecrashWatcher::NewL(int)
+ ?NewL@CIptvTestMobilecrashWatcher@@SAPAV1@XZ @ 90 NONAME ; class CIptvTestMobilecrashWatcher * CIptvTestMobilecrashWatcher::NewL(void)
+ ?NewL@CIptvTestTimer@@SAPAV1@AAVMIptvTestTimerObserver@@H@Z @ 91 NONAME ; class CIptvTestTimer * CIptvTestTimer::NewL(class MIptvTestTimerObserver &, int)
+ ?NewL@CIptvTestUtilALR@@SAPAV1@XZ @ 92 NONAME ; class CIptvTestUtilALR * CIptvTestUtilALR::NewL(void)
+ ?NewL@CIptvTestVerifyData@@SAPAV1@XZ @ 93 NONAME ; class CIptvTestVerifyData * CIptvTestVerifyData::NewL(void)
+ ?NewL@CIptvTestVideoCreator@@SAPAV1@XZ @ 94 NONAME ; class CIptvTestVideoCreator * CIptvTestVideoCreator::NewL(void)
+ ?NewL@CTestUtilConnection@@SAPAV1@PAVMTestUtilConnectionObserver@@@Z @ 95 NONAME ; class CTestUtilConnection * CTestUtilConnection::NewL(class MTestUtilConnectionObserver *)
+ ?NewL@CTestUtilConnectionWaiter@@SAPAV1@PAVMTestUtilConnectionObserver@@@Z @ 96 NONAME ; class CTestUtilConnectionWaiter * CTestUtilConnectionWaiter::NewL(class MTestUtilConnectionObserver *)
+ ?NewL@CVCXTestCommon@@SAPAV1@XZ @ 97 NONAME ; class CVCXTestCommon * CVCXTestCommon::NewL(void)
+ ?NewL@CVCXTestMessageWait@@SAPAV1@PAVMVCXTestMessageWaitObserver@@@Z @ 98 NONAME ; class CVCXTestMessageWait * CVCXTestMessageWait::NewL(class MVCXTestMessageWaitObserver *)
+ ?NewL@CVCXTestPSSubscriber@@SAPAV1@VTUid@@KW4TType@RProperty@@PAVMVCXTestPSObserver@@@Z @ 99 NONAME ; class CVCXTestPSSubscriber * CVCXTestPSSubscriber::NewL(class TUid, unsigned long, enum RProperty::TType, class MVCXTestPSObserver *)
+ ?NewL@CVCXTestStatsKeeper@@SAPAV1@XZ @ 100 NONAME ; class CVCXTestStatsKeeper * CVCXTestStatsKeeper::NewL(void)
+ ?NewL@CVCXTestTimerWait@@SAPAV1@XZ @ 101 NONAME ; class CVCXTestTimerWait * CVCXTestTimerWait::NewL(void)
+ ?NewLC@CIptvTestDownloadManager@@SAPAV1@PAVMTestUtilDownloadObserver@@@Z @ 102 NONAME ; class CIptvTestDownloadManager * CIptvTestDownloadManager::NewLC(class MTestUtilDownloadObserver *)
+ ?NewLC@CIptvTestUtilALR@@SAPAV1@XZ @ 103 NONAME ; class CIptvTestUtilALR * CIptvTestUtilALR::NewLC(void)
+ ?NewLC@CTestUtilConnection@@SAPAV1@PAVMTestUtilConnectionObserver@@@Z @ 104 NONAME ; class CTestUtilConnection * CTestUtilConnection::NewLC(class MTestUtilConnectionObserver *)
+ ?NewLC@CTestUtilConnectionWaiter@@SAPAV1@PAVMTestUtilConnectionObserver@@@Z @ 105 NONAME ; class CTestUtilConnectionWaiter * CTestUtilConnectionWaiter::NewLC(class MTestUtilConnectionObserver *)
+ ?ParseIntFromString@CVCXTestCommon@@SAHAAHAAVTDesC16@@@Z @ 106 NONAME ; int CVCXTestCommon::ParseIntFromString(int &, class TDesC16 &)
+ ?PrintIaps@CVCXTestCommon@@QAEXXZ @ 107 NONAME ; void CVCXTestCommon::PrintIaps(void)
+ ?ReadMobilecrashesL@CIptvTestMobilecrashWatcher@@QAEXAAV?$RPointerArray@VHBufC16@@@@ABVTDesC16@@@Z @ 108 NONAME ; void CIptvTestMobilecrashWatcher::ReadMobilecrashesL(class RPointerArray<class HBufC16> &, class TDesC16 const &)
+ ?ReceiveMessage@CVCXTestMessageWait@@QAEXJH@Z @ 109 NONAME ; void CVCXTestMessageWait::ReceiveMessage(long, int)
+ ?RemoveUsedDestinationCenRepL@CIptvTestUtilALR@@QAEXXZ @ 110 NONAME ; void CIptvTestUtilALR::RemoveUsedDestinationCenRepL(void)
+ ?Reset@CIptvTestEventWaiter@@QAEHXZ @ 111 NONAME ; int CIptvTestEventWaiter::Reset(void)
+ ?Reset@CVCXTestMessageWait@@QAEXXZ @ 112 NONAME ; void CVCXTestMessageWait::Reset(void)
+ ?ResetReceivedMessages@CVCXTestMessageWait@@QAEXXZ @ 113 NONAME ; void CVCXTestMessageWait::ResetReceivedMessages(void)
+ ?ReturnMobileCrashCount@CIptvTestMobilecrashWatcher@@QAEHXZ @ 114 NONAME ; int CIptvTestMobilecrashWatcher::ReturnMobileCrashCount(void)
+ ?ReturnNewCrashes@CIptvTestMobilecrashWatcher@@QAEHAAV?$RPointerArray@VHBufC16@@@@@Z @ 115 NONAME ; int CIptvTestMobilecrashWatcher::ReturnNewCrashes(class RPointerArray<class HBufC16> &)
+ ?Set@CVCXTestPSSubscriber@@QAEHAAH@Z @ 116 NONAME ; int CVCXTestPSSubscriber::Set(int &)
+ ?Set@CVCXTestPSSubscriber@@QAEHABVTDesC16@@@Z @ 117 NONAME ; int CVCXTestPSSubscriber::Set(class TDesC16 const &)
+ ?SetConnectionPreferences@CTestUtilConnection@@QAEXIK@Z @ 118 NONAME ; void CTestUtilConnection::SetConnectionPreferences(unsigned int, unsigned long)
+ ?SetDriveFreeSpaceL@CVCXTestCommon@@QAEXHI@Z @ 119 NONAME ; void CVCXTestCommon::SetDriveFreeSpaceL(int, unsigned int)
+ ?SetMethodBoolAttributeL@CIptvTestUtilALR@@QAEXAAVTDesC16@@0HH@Z @ 120 NONAME ; void CIptvTestUtilALR::SetMethodBoolAttributeL(class TDesC16 &, class TDesC16 &, int, int)
+ ?SetMethodIntAttributeL@CIptvTestUtilALR@@QAEXAAVTDesC16@@0HH@Z @ 121 NONAME ; void CIptvTestUtilALR::SetMethodIntAttributeL(class TDesC16 &, class TDesC16 &, int, int)
+ ?SetMethodPriorityL@CIptvTestUtilALR@@QAEXAAVTDesC16@@0K@Z @ 122 NONAME ; void CIptvTestUtilALR::SetMethodPriorityL(class TDesC16 &, class TDesC16 &, unsigned long)
+ ?SetMethodStringAttributeL@CIptvTestUtilALR@@QAEXAAVTDesC16@@0H0@Z @ 123 NONAME ; void CIptvTestUtilALR::SetMethodStringAttributeL(class TDesC16 &, class TDesC16 &, int, class TDesC16 &)
+ ?SetPSProperty@CVCXTestCommon@@SAHVTUid@@IABVTDesC16@@@Z @ 124 NONAME ; int CVCXTestCommon::SetPSProperty(class TUid, unsigned int, class TDesC16 const &)
+ ?SetPSProperty@CVCXTestCommon@@SAHVTUid@@IH@Z @ 125 NONAME ; int CVCXTestCommon::SetPSProperty(class TUid, unsigned int, int)
+ ?SetSystemTime@CVCXTestCommon@@SAHVTTime@@@Z @ 126 NONAME ; int CVCXTestCommon::SetSystemTime(class TTime)
+ ?SetTimeZone@CVCXTestCommon@@SAHAAVTDesC16@@@Z @ 127 NONAME ; int CVCXTestCommon::SetTimeZone(class TDesC16 &)
+ ?SetUsedDestinationL@CIptvTestUtilALR@@QAEXAAVTDesC16@@@Z @ 128 NONAME ; void CIptvTestUtilALR::SetUsedDestinationL(class TDesC16 &)
+ ?Start@CIptvTestActiveWait@@QAEHXZ @ 129 NONAME ; int CIptvTestActiveWait::Start(void)
+ ?Start@CVCXTestPSSubscriber@@QAEXXZ @ 130 NONAME ; void CVCXTestPSSubscriber::Start(void)
+ ?StartStatsKeepingL@CVCXTestStatsKeeper@@QAEXABVTDesC16@@0@Z @ 131 NONAME ; void CVCXTestStatsKeeper::StartStatsKeepingL(class TDesC16 const &, class TDesC16 const &)
+ ?Stop@CIptvTestActiveWait@@QAEHXZ @ 132 NONAME ; int CIptvTestActiveWait::Stop(void)
+ ?TerminateConnectionL@CTestUtilConnection@@QAEXXZ @ 133 NONAME ; void CTestUtilConnection::TerminateConnectionL(void)
+ ?TerminateDestinationConnectionsL@CIptvTestUtilALR@@QAEXAAVTDesC16@@@Z @ 134 NONAME ; void CIptvTestUtilALR::TerminateDestinationConnectionsL(class TDesC16 &)
+ ?VerifyData@CVCXTestCommon@@QAEHAAVTDesC16@@AAW4TVerifyResult@CIptvTestVerifyData@@@Z @ 135 NONAME ; int CVCXTestCommon::VerifyData(class TDesC16 &, enum CIptvTestVerifyData::TVerifyResult &)
+ ?VerifyDataL@CIptvTestVerifyData@@QAEHAAVTDesC16@@AAW4TVerifyResult@1@@Z @ 136 NONAME ; int CIptvTestVerifyData::VerifyDataL(class TDesC16 &, enum CIptvTestVerifyData::TVerifyResult &)
+ ?WaitChangeL@CVCXTestPSSubscriber@@QAEXXZ @ 137 NONAME ; void CVCXTestPSSubscriber::WaitChangeL(void)
+ ?WaitForAllL@CVCXTestMessageWait@@QAEXHH@Z @ 138 NONAME ; void CVCXTestMessageWait::WaitForAllL(int, int)
+ ?WaitForConnection@CTestUtilConnectionWaiter@@QAEXK@Z @ 139 NONAME ; void CTestUtilConnectionWaiter::WaitForConnection(unsigned long)
+ ?WaitForMessageL@CVCXTestMessageWait@@QAEXJHH@Z @ 140 NONAME ; void CVCXTestMessageWait::WaitForMessageL(long, int, int)
+ ?WaitL@CVCXTestTimerWait@@QAEXK@Z @ 141 NONAME ; void CVCXTestTimerWait::WaitL(unsigned long)
+ ?WaitUntilConnectionIsClosed@CTestUtilConnectionWaiter@@QAEXK@Z @ 142 NONAME ; void CTestUtilConnectionWaiter::WaitUntilConnectionIsClosed(unsigned long)
+ ?WriteVerifyData@CVCXTestCommon@@QAAHAAVTDesC16@@V?$TRefByValue@$$CBVTDesC16@@@@ZZ @ 143 NONAME ; int CVCXTestCommon::WriteVerifyData(class TDesC16 &, class TRefByValue<class TDesC16 const >, ...)
+ ?WriteVerifyData@CVCXTestCommon@@QAEHAAVTDesC16@@0@Z @ 144 NONAME ; int CVCXTestCommon::WriteVerifyData(class TDesC16 &, class TDesC16 &)
+ ?WriteVerifyDataL@CIptvTestVerifyData@@QAEHAAVTDesC16@@0@Z @ 145 NONAME ; int CIptvTestVerifyData::WriteVerifyDataL(class TDesC16 &, class TDesC16 &)
+ ?ListFilesProcessesAndThreadsL@CVCXTestCommon@@SAXAAVRFs@@@Z @ 146 NONAME ; void CVCXTestCommon::ListFilesProcessesAndThreadsL(class RFs &)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/EABI/VCXTestCommonu.def Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,217 @@
+EXPORTS
+ _ZN14CIptvTestEvent10DeactivateEv @ 1 NONAME
+ _ZN14CIptvTestEvent12HasTimeoutedER5TTime @ 2 NONAME
+ _ZN14CIptvTestEvent7GetNameER6TDes16 @ 3 NONAME
+ _ZN14CIptvTestEvent8ActivateEv @ 4 NONAME
+ _ZN14CIptvTestEventC2ERK7TDesC16i @ 5 NONAME
+ _ZN14CIptvTestEventD0Ev @ 6 NONAME
+ _ZN14CIptvTestEventD1Ev @ 7 NONAME
+ _ZN14CIptvTestEventD2Ev @ 8 NONAME
+ _ZN14CIptvTestTimer11CancelTimerEv @ 9 NONAME
+ _ZN14CIptvTestTimer4NewLER22MIptvTestTimerObserveri @ 10 NONAME
+ _ZN14CIptvTestTimer5AfterE27TTimeIntervalMicroSeconds32 @ 11 NONAME
+ _ZN14CIptvTestTimerD0Ev @ 12 NONAME
+ _ZN14CIptvTestTimerD1Ev @ 13 NONAME
+ _ZN14CIptvTestTimerD2Ev @ 14 NONAME
+ _ZN14CVCXTestCommon10VerifyDataER7TDesC16RN19CIptvTestVerifyData13TVerifyResultE @ 15 NONAME
+ _ZN14CVCXTestCommon11GetFileSizeER7TDesC16Rm @ 16 NONAME
+ _ZN14CVCXTestCommon11SetTimeZoneER7TDesC16 @ 17 NONAME
+ _ZN14CVCXTestCommon13CreateBadIapLER7TDesC16 @ 18 NONAME
+ _ZN14CVCXTestCommon13GetPSPropertyE4TUidjR6TDes16 @ 19 NONAME
+ _ZN14CVCXTestCommon13GetPSPropertyE4TUidjRi @ 20 NONAME
+ _ZN14CVCXTestCommon13SetPSPropertyE4TUidjRK7TDesC16 @ 21 NONAME
+ _ZN14CVCXTestCommon13SetPSPropertyE4TUidji @ 22 NONAME
+ _ZN14CVCXTestCommon13SetSystemTimeE5TTime @ 23 NONAME
+ _ZN14CVCXTestCommon14GetIapNameByIdER6TDes16m @ 24 NONAME
+ _ZN14CVCXTestCommon15GetIapIdByNameLERK7TDesC16Rm @ 25 NONAME
+ _ZN14CVCXTestCommon15GetIapIdByTypeLENS_16TIptvTestIapTypeERmi @ 26 NONAME
+ _ZN14CVCXTestCommon15WriteVerifyDataER7TDesC1611TRefByValueIKS0_Ez @ 27 NONAME
+ _ZN14CVCXTestCommon15WriteVerifyDataER7TDesC16S1_ @ 28 NONAME
+ _ZN14CVCXTestCommon16CreateVerifyDataER7TDesC16i @ 29 NONAME
+ _ZN14CVCXTestCommon16CreateVideoFileLEN21CIptvTestVideoCreator18TIptvTestVideoTypeER7TDesC16i @ 30 NONAME
+ _ZN14CVCXTestCommon17CreateVideoFilesLEN21CIptvTestVideoCreator18TIptvTestVideoTypeER7TDesC16iR13RPointerArrayI7HBufC16E @ 31 NONAME
+ _ZN14CVCXTestCommon17DeleteDummyFilesLEi @ 32 NONAME
+ _ZN14CVCXTestCommon18ParseIntFromStringERiR7TDesC16 @ 33 NONAME
+ _ZN14CVCXTestCommon18SetDriveFreeSpaceLEij @ 34 NONAME
+ _ZN14CVCXTestCommon20EnsureFileIsNotInUseERK7TPtrC16 @ 35 NONAME
+ _ZN14CVCXTestCommon22AdvanceSystemTimeHoursEi @ 36 NONAME
+ _ZN14CVCXTestCommon22EnableVerifyTimestampsEi @ 37 NONAME
+ _ZN14CVCXTestCommon24AdvanceSystemTimeMinutesEi @ 38 NONAME
+ _ZN14CVCXTestCommon24AdvanceSystemTimeSecondsEi @ 39 NONAME
+ _ZN14CVCXTestCommon4NewLEv @ 40 NONAME
+ _ZN14CVCXTestCommon7ListDirERK7TDesC16i @ 41 NONAME
+ _ZN14CVCXTestCommon9GetIapIdLERK7TDesC16Rm @ 42 NONAME
+ _ZN14CVCXTestCommon9PrintIapsEv @ 43 NONAME
+ _ZN16CIptvTestUtilALR11CopyMethodLER7TDesC16S1_S1_ @ 44 NONAME
+ _ZN16CIptvTestUtilALR13DeleteMethodLER7TDesC16S1_ @ 45 NONAME
+ _ZN16CIptvTestUtilALR17GetDestinationIdLER7TDesC16 @ 46 NONAME
+ _ZN16CIptvTestUtilALR18CreateDestinationLER7TDesC16 @ 47 NONAME
+ _ZN16CIptvTestUtilALR18DeleteDestinationLER7TDesC16 @ 48 NONAME
+ _ZN16CIptvTestUtilALR18SetMethodPriorityLER7TDesC16S1_m @ 49 NONAME
+ _ZN16CIptvTestUtilALR19SetUsedDestinationLER7TDesC16 @ 50 NONAME
+ _ZN16CIptvTestUtilALR22SetMethodIntAttributeLER7TDesC16S1_ii @ 51 NONAME
+ _ZN16CIptvTestUtilALR23SetMethodBoolAttributeLER7TDesC16S1_ii @ 52 NONAME
+ _ZN16CIptvTestUtilALR25SetMethodStringAttributeLER7TDesC16S1_iS1_ @ 53 NONAME
+ _ZN16CIptvTestUtilALR28RemoveUsedDestinationCenRepLEv @ 54 NONAME
+ _ZN16CIptvTestUtilALR32TerminateDestinationConnectionsLER7TDesC16 @ 55 NONAME
+ _ZN16CIptvTestUtilALR4NewLEv @ 56 NONAME
+ _ZN16CIptvTestUtilALR5NewLCEv @ 57 NONAME
+ _ZN16CIptvTestUtilALRD0Ev @ 58 NONAME
+ _ZN16CIptvTestUtilALRD1Ev @ 59 NONAME
+ _ZN16CIptvTestUtilALRD2Ev @ 60 NONAME
+ _ZN17CVCXTestTimerWait10ConstructLEv @ 61 NONAME
+ _ZN17CVCXTestTimerWait4NewLEv @ 62 NONAME
+ _ZN17CVCXTestTimerWait5WaitLEm @ 63 NONAME
+ _ZN17CVCXTestTimerWaitD0Ev @ 64 NONAME
+ _ZN17CVCXTestTimerWaitD1Ev @ 65 NONAME
+ _ZN17CVCXTestTimerWaitD2Ev @ 66 NONAME
+ _ZN19CIptvTestActiveWait10ActiveWaitENS_22TIptvTestActiveWaitCmdE @ 67 NONAME
+ _ZN19CIptvTestActiveWait10ConstructLEv @ 68 NONAME
+ _ZN19CIptvTestActiveWait4NewLEv @ 69 NONAME
+ _ZN19CIptvTestActiveWait4StopEv @ 70 NONAME
+ _ZN19CIptvTestActiveWait5StartEv @ 71 NONAME
+ _ZN19CIptvTestActiveWait9IsWaitingEv @ 72 NONAME
+ _ZN19CIptvTestActiveWaitC1Ev @ 73 NONAME
+ _ZN19CIptvTestActiveWaitC2Ev @ 74 NONAME
+ _ZN19CIptvTestActiveWaitD0Ev @ 75 NONAME
+ _ZN19CIptvTestActiveWaitD1Ev @ 76 NONAME
+ _ZN19CIptvTestActiveWaitD2Ev @ 77 NONAME
+ _ZN19CIptvTestVerifyData11VerifyDataLER7TDesC16RNS_13TVerifyResultE @ 78 NONAME
+ _ZN19CIptvTestVerifyData16EnableTimestampsEi @ 79 NONAME
+ _ZN19CIptvTestVerifyData16WriteVerifyDataLER7TDesC16S1_ @ 80 NONAME
+ _ZN19CIptvTestVerifyData17CreateVerifyDataLER7TDesC16i @ 81 NONAME
+ _ZN19CIptvTestVerifyData4NewLEv @ 82 NONAME
+ _ZN19CIptvTestVerifyDataD0Ev @ 83 NONAME
+ _ZN19CIptvTestVerifyDataD1Ev @ 84 NONAME
+ _ZN19CIptvTestVerifyDataD2Ev @ 85 NONAME
+ _ZN19CTestUtilConnection20TerminateConnectionLEv @ 86 NONAME
+ _ZN19CTestUtilConnection24SetConnectionPreferencesEjm @ 87 NONAME
+ _ZN19CTestUtilConnection4NewLEP27MTestUtilConnectionObserver @ 88 NONAME
+ _ZN19CTestUtilConnection5NewLCEP27MTestUtilConnectionObserver @ 89 NONAME
+ _ZN19CTestUtilConnection7AttachLEv @ 90 NONAME
+ _ZN19CTestUtilConnection8ConnectLEv @ 91 NONAME
+ _ZN19CTestUtilConnectionD0Ev @ 92 NONAME
+ _ZN19CTestUtilConnectionD1Ev @ 93 NONAME
+ _ZN19CTestUtilConnectionD2Ev @ 94 NONAME
+ _ZN19CVCXTestMessageWait10AddMessageEl @ 95 NONAME
+ _ZN19CVCXTestMessageWait10ConstructLEv @ 96 NONAME
+ _ZN19CVCXTestMessageWait11WaitForAllLEii @ 97 NONAME
+ _ZN19CVCXTestMessageWait14ReceiveMessageEli @ 98 NONAME
+ _ZN19CVCXTestMessageWait15WaitForMessageLElii @ 99 NONAME
+ _ZN19CVCXTestMessageWait21ResetReceivedMessagesEv @ 100 NONAME
+ _ZN19CVCXTestMessageWait4NewLEP27MVCXTestMessageWaitObserver @ 101 NONAME
+ _ZN19CVCXTestMessageWait5ResetEv @ 102 NONAME
+ _ZN19CVCXTestMessageWait9CoolDownLEi @ 103 NONAME
+ _ZN19CVCXTestMessageWaitC1EP27MVCXTestMessageWaitObserver @ 104 NONAME
+ _ZN19CVCXTestMessageWaitC2EP27MVCXTestMessageWaitObserver @ 105 NONAME
+ _ZN19CVCXTestMessageWaitD0Ev @ 106 NONAME
+ _ZN19CVCXTestMessageWaitD1Ev @ 107 NONAME
+ _ZN19CVCXTestMessageWaitD2Ev @ 108 NONAME
+ _ZN19CVCXTestStatsKeeper10ActionEndLERK7TDesC16i @ 109 NONAME
+ _ZN19CVCXTestStatsKeeper10ActionEndLEli @ 110 NONAME
+ _ZN19CVCXTestStatsKeeper12ActionStartLERK7TDesC16S2_i @ 111 NONAME
+ _ZN19CVCXTestStatsKeeper12ActionStartLElRK7TDesC16 @ 112 NONAME
+ _ZN19CVCXTestStatsKeeper12ActionTraceLERK7TDesC16 @ 113 NONAME
+ _ZN19CVCXTestStatsKeeper15ActionProgressLERK7TDesC16S2_ @ 114 NONAME
+ _ZN19CVCXTestStatsKeeper15ActionProgressLElRK7TDesC16 @ 115 NONAME
+ _ZN19CVCXTestStatsKeeper18StartStatsKeepingLERK7TDesC16S2_ @ 116 NONAME
+ _ZN19CVCXTestStatsKeeper4NewLEv @ 117 NONAME
+ _ZN20CIptvTestEventWaiter13CheckTimeoutsEv @ 118 NONAME
+ _ZN20CIptvTestEventWaiter13EventHappenedEP14CIptvTestEventPS1_ @ 119 NONAME
+ _ZN20CIptvTestEventWaiter13GetEventCountEv @ 120 NONAME
+ _ZN20CIptvTestEventWaiter4NewLER28MIptvTestEventWaiterObserver @ 121 NONAME
+ _ZN20CIptvTestEventWaiter5ResetEv @ 122 NONAME
+ _ZN20CIptvTestEventWaiter8AddEventEP14CIptvTestEventi @ 123 NONAME
+ _ZN20CIptvTestEventWaiterD0Ev @ 124 NONAME
+ _ZN20CIptvTestEventWaiterD1Ev @ 125 NONAME
+ _ZN20CIptvTestEventWaiterD2Ev @ 126 NONAME
+ _ZN20CVCXTestPSSubscriber11WaitChangeLEv @ 127 NONAME
+ _ZN20CVCXTestPSSubscriber3GetER6TDes16 @ 128 NONAME
+ _ZN20CVCXTestPSSubscriber3GetERi @ 129 NONAME
+ _ZN20CVCXTestPSSubscriber3SetERK7TDesC16 @ 130 NONAME
+ _ZN20CVCXTestPSSubscriber3SetERi @ 131 NONAME
+ _ZN20CVCXTestPSSubscriber4NewLE4TUidmN9RProperty5TTypeEP18MVCXTestPSObserver @ 132 NONAME
+ _ZN20CVCXTestPSSubscriber5StartEv @ 133 NONAME
+ _ZN20CVCXTestPSSubscriber7EndWaitEv @ 134 NONAME
+ _ZN20CVCXTestPSSubscriber8DoCancelEv @ 135 NONAME
+ _ZN20CVCXTestPSSubscriberD0Ev @ 136 NONAME
+ _ZN20CVCXTestPSSubscriberD1Ev @ 137 NONAME
+ _ZN20CVCXTestPSSubscriberD2Ev @ 138 NONAME
+ _ZN21CIptvTestVideoCreator10ConstructLEv @ 139 NONAME
+ _ZN21CIptvTestVideoCreator12CreateVideoLENS_18TIptvTestVideoTypeER7TDesC16i @ 140 NONAME
+ _ZN21CIptvTestVideoCreator12GetVideoFileER6TDes16NS_18TIptvTestVideoTypeERK7TDesC16 @ 141 NONAME
+ _ZN21CIptvTestVideoCreator13CreateVideosLENS_18TIptvTestVideoTypeER7TDesC16iR13RPointerArrayI7HBufC16E @ 142 NONAME
+ _ZN21CIptvTestVideoCreator4NewLEv @ 143 NONAME
+ _ZN21CIptvTestVideoCreatorC1Ev @ 144 NONAME
+ _ZN21CIptvTestVideoCreatorC2Ev @ 145 NONAME
+ _ZN21CIptvTestVideoCreatorD0Ev @ 146 NONAME
+ _ZN21CIptvTestVideoCreatorD1Ev @ 147 NONAME
+ _ZN21CIptvTestVideoCreatorD2Ev @ 148 NONAME
+ _ZN24CIptvTestDownloadManager10ConstructLEv @ 149 NONAME
+ _ZN24CIptvTestDownloadManager4NewLEP25MTestUtilDownloadObserver @ 150 NONAME
+ _ZN24CIptvTestDownloadManager5NewLCEP25MTestUtilDownloadObserver @ 151 NONAME
+ _ZN24CIptvTestDownloadManager8GetErrorER13RHttpDownloadRl @ 152 NONAME
+ _ZN24CIptvTestDownloadManager9DownloadLER7TDesC16S1_S1_S1_li @ 153 NONAME
+ _ZN24CIptvTestDownloadManagerD0Ev @ 154 NONAME
+ _ZN24CIptvTestDownloadManagerD1Ev @ 155 NONAME
+ _ZN24CIptvTestDownloadManagerD2Ev @ 156 NONAME
+ _ZN25CTestUtilConnectionWaiter17WaitForConnectionEm @ 157 NONAME
+ _ZN25CTestUtilConnectionWaiter18IsConnectionActiveEm @ 158 NONAME
+ _ZN25CTestUtilConnectionWaiter27WaitUntilConnectionIsClosedEm @ 159 NONAME
+ _ZN25CTestUtilConnectionWaiter4NewLEP27MTestUtilConnectionObserver @ 160 NONAME
+ _ZN25CTestUtilConnectionWaiter5NewLCEP27MTestUtilConnectionObserver @ 161 NONAME
+ _ZN25CTestUtilConnectionWaiterC1EP27MTestUtilConnectionObserver @ 162 NONAME
+ _ZN25CTestUtilConnectionWaiterC2EP27MTestUtilConnectionObserver @ 163 NONAME
+ _ZN25CTestUtilConnectionWaiterD0Ev @ 164 NONAME
+ _ZN25CTestUtilConnectionWaiterD1Ev @ 165 NONAME
+ _ZN25CTestUtilConnectionWaiterD2Ev @ 166 NONAME
+ _ZN27CIptvTestMobilecrashWatcher16CheckNewCrashesLEv @ 167 NONAME
+ _ZN27CIptvTestMobilecrashWatcher16ReturnNewCrashesER13RPointerArrayI7HBufC16E @ 168 NONAME
+ _ZN27CIptvTestMobilecrashWatcher18ReadMobilecrashesLER13RPointerArrayI7HBufC16ERK7TDesC16 @ 169 NONAME
+ _ZN27CIptvTestMobilecrashWatcher21CompareMobilecrashesLER13RPointerArrayI7HBufC16ES3_ @ 170 NONAME
+ _ZN27CIptvTestMobilecrashWatcher22ReturnMobileCrashCountEv @ 171 NONAME
+ _ZN27CIptvTestMobilecrashWatcher4NewLEi @ 172 NONAME
+ _ZN27CIptvTestMobilecrashWatcher4NewLEv @ 173 NONAME
+ _ZN27CIptvTestMobilecrashWatcherD0Ev @ 174 NONAME
+ _ZN27CIptvTestMobilecrashWatcherD1Ev @ 175 NONAME
+ _ZN27CIptvTestMobilecrashWatcherD2Ev @ 176 NONAME
+ _ZTI11CVerifyFile @ 177 NONAME ; #<TI>#
+ _ZTI14CIptvTestEvent @ 178 NONAME ; #<TI>#
+ _ZTI14CIptvTestTimer @ 179 NONAME ; #<TI>#
+ _ZTI14CVCXTestCommon @ 180 NONAME ; #<TI>#
+ _ZTI16CIptvTestUtilALR @ 181 NONAME ; #<TI>#
+ _ZTI17CVCXTestStatsItem @ 182 NONAME ; #<TI>#
+ _ZTI17CVCXTestTimerWait @ 183 NONAME ; #<TI>#
+ _ZTI19CIptvTestActiveWait @ 184 NONAME ; #<TI>#
+ _ZTI19CIptvTestVerifyData @ 185 NONAME ; #<TI>#
+ _ZTI19CTestUtilConnection @ 186 NONAME ; #<TI>#
+ _ZTI19CVCXTestMessageWait @ 187 NONAME ; #<TI>#
+ _ZTI19CVCXTestStatsKeeper @ 188 NONAME ; #<TI>#
+ _ZTI20CIptvTestEventWaiter @ 189 NONAME ; #<TI>#
+ _ZTI20CVCXTestPSSubscriber @ 190 NONAME ; #<TI>#
+ _ZTI21CIptvTestVideoCreator @ 191 NONAME ; #<TI>#
+ _ZTI24CIptvTestDownloadManager @ 192 NONAME ; #<TI>#
+ _ZTI24CVCXTestStatsItemSummary @ 193 NONAME ; #<TI>#
+ _ZTI25CTestUtilConnectionWaiter @ 194 NONAME ; #<TI>#
+ _ZTI27CIptvTestMobilecrashWatcher @ 195 NONAME ; #<TI>#
+ _ZTV11CVerifyFile @ 196 NONAME ; #<VT>#
+ _ZTV14CIptvTestEvent @ 197 NONAME ; #<VT>#
+ _ZTV14CIptvTestTimer @ 198 NONAME ; #<VT>#
+ _ZTV14CVCXTestCommon @ 199 NONAME ; #<VT>#
+ _ZTV16CIptvTestUtilALR @ 200 NONAME ; #<VT>#
+ _ZTV17CVCXTestStatsItem @ 201 NONAME ; #<VT>#
+ _ZTV17CVCXTestTimerWait @ 202 NONAME ; #<VT>#
+ _ZTV19CIptvTestActiveWait @ 203 NONAME ; #<VT>#
+ _ZTV19CIptvTestVerifyData @ 204 NONAME ; #<VT>#
+ _ZTV19CTestUtilConnection @ 205 NONAME ; #<VT>#
+ _ZTV19CVCXTestMessageWait @ 206 NONAME ; #<VT>#
+ _ZTV19CVCXTestStatsKeeper @ 207 NONAME ; #<VT>#
+ _ZTV20CIptvTestEventWaiter @ 208 NONAME ; #<VT>#
+ _ZTV20CVCXTestPSSubscriber @ 209 NONAME ; #<VT>#
+ _ZTV21CIptvTestVideoCreator @ 210 NONAME ; #<VT>#
+ _ZTV24CIptvTestDownloadManager @ 211 NONAME ; #<VT>#
+ _ZTV24CVCXTestStatsItemSummary @ 212 NONAME ; #<VT>#
+ _ZTV25CTestUtilConnectionWaiter @ 213 NONAME ; #<VT>#
+ _ZTV27CIptvTestMobilecrashWatcher @ 214 NONAME ; #<VT>#
+ _ZN14CVCXTestCommon29ListFilesProcessesAndThreadsLER3RFs @ 215 NONAME
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/group/VCXTestCommon.mmp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,100 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+TARGET VCXTestCommon.dll
+TARGETTYPE dll
+UID 0x1000008D 0x101FB3E7
+
+#if defined(EKA2)
+
+CAPABILITY CAP_GENERAL_DLL
+/* Remove comments and replace 0x00000000 with correct vendor id */
+// VENDORID 0x101FB657
+/* Remove comments and replace 0x00000000 with correct secure id */
+// SECUREID 0x102073DB
+#endif
+
+//TARGETPATH ?target_path
+DEFFILE VCXTestCommon.def
+
+SOURCEPATH ../src
+SOURCE CIptvTestTimer.cpp
+SOURCE CIptvTestVerifyData.cpp
+SOURCE CIptvTestMobilecrashWatcher.cpp
+SOURCE CIptvTestEventWaiter.cpp
+SOURCE CIptvTestEvent.cpp
+SOURCE CIptvTestActiveWait.cpp
+SOURCE TestUtilConnectionWaiter.cpp
+SOURCE IptvTestDownloadManager.cpp
+SOURCE IptvTestUtilALR.cpp
+SOURCE CIptvTestVideoCreator.cpp
+SOURCE TestUtilConnection.cpp
+SOURCE VCXTestCommon.cpp
+SOURCE VCXTestTimerWait.cpp
+SOURCE VCXTestPSSubscriber.cpp
+SOURCE VCXTestMessageWait.cpp
+SOURCE VCXTestStatsKeeper.cpp
+
+//RESOURCE resource_file
+//RESOURCE resource_file2
+
+USERINCLUDE ../inc
+
+APP_LAYER_SYSTEMINCLUDE
+
+LIBRARY euser.lib
+LIBRARY FLOGGER.lib
+LIBRARY efsrv.lib
+LIBRARY bafl.lib
+LIBRARY commdb.lib
+LIBRARY estor.lib // filestore
+LIBRARY edbms.lib // rdbstoredatabase
+LIBRARY tzclient.lib // RTz
+LIBRARY DownloadMgr.lib
+LIBRARY esock.lib
+LIBRARY cmmanager.lib
+LIBRARY centralrepository.lib
+LIBRARY ezip.lib
+
+LANG SC
+
+/*
+START WINS
+?wins_specific_information
+END
+
+START MARM
+?marm_specific_information
+END
+*/
+// Other possible keywords:
+
+// DOCUMENT ?file, that is not compiled, but added to MSVC project workspace (i.e. release notes)
+/*
+START BITMAP ?target
+TARGETPATH ?emulated_path_on_target_machine
+HEADER
+SOURCE ?color_depth ?source_bitmap
+END
+*/
+// DEFFILE ?filename
+// AIF ?filename
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+
+PRJ_TESTEXPORTS
+
+PRJ_MMPFILES
+
+PRJ_TESTMMPFILES
+VCXTestCommon.mmp
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/CIptvTestActiveWait.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,110 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+
+#ifndef CIPTVTESTACTIVEWAIT_H
+#define CIPTVTESTACTIVEWAIT_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+
+// MACROS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// CLASS DECLARATION
+
+/**
+*
+*
+*
+*
+* @since
+*/
+class CIptvTestActiveWait : public CBase
+ {
+ public: // Constructors and destructor
+ /**
+ * Two-phased constructor.
+ */
+ IMPORT_C static CIptvTestActiveWait * NewL();
+
+ /**
+ * Destructor.
+ */
+ IMPORT_C virtual ~CIptvTestActiveWait ();
+
+
+ enum TIptvTestActiveWaitCmd
+ {
+ EActiveWaitStart,
+ EActiveWaitStop
+ };
+
+ public: // New functions
+
+ /*
+ * To start and stop CActiveSchedulerWait
+ */
+
+ IMPORT_C void ActiveWait( TIptvTestActiveWaitCmd aActiveWaitCmd );
+
+ /*
+ * Returns ETrue if CActiveSchedulerWait is running.
+ */
+ IMPORT_C TBool IsWaiting();
+
+ /*
+ * Starts active wait.
+ */
+ IMPORT_C TInt Start();
+
+ /*
+ * Stops active wait.
+ */
+ IMPORT_C TInt Stop();
+
+
+ protected: // From base classes
+
+ private:
+
+ /**
+ * C++ default constructor.
+ */
+ CIptvTestActiveWait ();
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ IMPORT_C void ConstructL();
+
+ private: // Data
+ CActiveSchedulerWait* iActiveSchedulerWait;
+ };
+
+
+#endif // CIPTVTESTACTIVEWAIT_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/CIptvTestEvent.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,119 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#ifndef CIPTVTESTEVENT_H
+#define CIPTVTESTEVENT_H
+
+// INCLUDES
+#include <e32base.h>
+#include <e32std.h>
+
+// CONSTANTS
+
+// MACROS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+class CIptvTestEvent;
+
+// CLASS DECLARATION
+
+/**
+*
+*
+*
+*
+* @since
+*/
+class CIptvTestEvent : public CBase
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ //IMPORT_C static CIptvTestEvent* NewL(TInt aTimeoutSeconds);
+
+ /**
+ * C++ default constructor.
+ */
+ IMPORT_C CIptvTestEvent( const TDesC& aName, TInt aTimeoutSeconds);
+
+ /**
+ * Destructor.
+ */
+ IMPORT_C virtual ~CIptvTestEvent();
+
+
+ public: // New functions
+
+ /**
+ * Compares if this and aEvent are same. Returns ETrue if so, else EFalse.
+ */
+ IMPORT_C virtual TBool Compare( CIptvTestEvent& aEvent ) = 0;
+
+ /**
+ * Returns error code if there's error in the event, otherwise KErrNone.
+ */
+ IMPORT_C virtual TInt GetError( ) = 0;
+
+ /**
+ * Getter for even name.
+ */
+ IMPORT_C void GetName( TDes& aName );
+
+ /**
+ * Returns if event has timed out.
+ */
+ IMPORT_C TBool HasTimeouted( TTime& aTimeNow );
+
+ /*
+ * Starts timing for this event
+ */
+ IMPORT_C void Activate( );
+
+ /*
+ * Stops timing for this event
+ */
+ IMPORT_C void Deactivate( );
+
+ protected: //from base classes
+
+ private:
+
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ private: // Data
+
+ TInt iTimeoutSeconds;
+ TTime iActivationTime;
+ TBuf<32> iName;
+ TBool iActive;
+ };
+
+
+#endif // CIPTVTESTEVENT_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/CIptvTestEventWaiter.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,155 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+
+#ifndef CIPTVTESTEVENTWAITER_H
+#define CIPTVTESTEVENTWAITER_H
+
+// INCLUDES
+#include <e32base.h>
+#include <e32cmn.h>
+
+// CONSTANTS
+
+// MACROS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+class MIptvTestEventWaiterObserver;
+class CIptvTestEvent;
+
+// CLASS DECLARATION
+
+/**
+*
+* CIptvTestEventWaiter USAGE:
+*
+* Implement callbacks from MIptvTestEventWaiterObserver.
+* Create your own event class inherited from CIptvTestEvent.
+* Create instance.
+*
+* Add events that are expected to happen with CIptvTestEventWaiter::AddEvent method.
+* - Two queues: sequential events and others
+*
+* When event happen, call CIptvTestEventWaiter::EventHappened(event)
+* - This will compare the event to the ones in queues with CIptvTestEvent::Compare() method.
+* First tries to find not sequential events and then last sequential event in queue.
+* - If event is not found or it's timedout MIptvTestEventWaiterObserver::EventWaiterErrorL is called.
+*
+* @since
+*/
+
+class CIptvTestEventWaiter : public CActive
+ {
+ public:
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ IMPORT_C static CIptvTestEventWaiter* NewL(MIptvTestEventWaiterObserver& aObserver);
+
+ /**
+ * Destructor.
+ */
+ IMPORT_C virtual ~CIptvTestEventWaiter();
+
+ public: // New functions
+
+ /**
+ * Checks if events have timeouted
+ */
+ IMPORT_C TInt CheckTimeouts();
+
+ /**
+ * Will add an event to queue and also check all events if they have timeouted
+ */
+ IMPORT_C TInt AddEvent(CIptvTestEvent* aEvent, TBool aSequential);
+
+ /**
+ * Will check the event against the events in queue
+ * If event is found it is returned in aQueuedEvent
+ * If event is not found the first event in event queue is returned in aQueuedEvent
+ */
+ IMPORT_C TInt EventHappened(CIptvTestEvent* aEvent, CIptvTestEvent** aQueuedEvent);
+
+ /**
+ * Resets the event waiter system. All events are deleted.
+ */
+ IMPORT_C TInt Reset();
+
+ /**
+ * Returns the amount of events left in queues
+ */
+ IMPORT_C TInt GetEventCount();
+
+ protected: //from base classes
+
+ // from CActive
+
+ /*
+ * RunL()
+ *
+ * Handle request completion events
+ *
+ */
+ void RunL();
+
+ /*
+ * DoCancel()
+ *
+ * Cancel any outstanding requests
+ *
+ */
+ void DoCancel();
+
+ private:
+
+ /**
+ * C++ default constructor.
+ */
+ CIptvTestEventWaiter(MIptvTestEventWaiterObserver& aObserver);
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ private: // Data
+
+ private:
+
+ // Events which should happen sequential
+ RPointerArray<CIptvTestEvent> iEventQueue;
+
+ // Events which have no particular order where they happen
+ RPointerArray<CIptvTestEvent> iEventDump;
+
+ RPointerArray<CIptvTestEvent> iPastEvents;
+
+ MIptvTestEventWaiterObserver& iObserver;
+
+ RTimer iTimer;
+ };
+
+#endif // CIPTVTESTEVENTWAITER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/CIptvTestMobilecrashWatcher.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,145 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+
+
+#ifndef CIPTVTESTMOBILECRASHWATCHER_H
+#define CIPTVTESTMOBILECRASHWATCHER_H
+
+// INCLUDES
+#include <e32base.h>
+#include <e32cmn.h> // RArray
+#include <f32file.h> // RFs
+
+// CONSTANTS
+
+// MACROS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+
+// CLASS DECLARATION
+
+
+/**
+*
+*
+*
+*
+* @since
+*/
+class CIptvTestMobilecrashWatcher : public CBase
+ {
+ public: // Constructors and destructor
+
+
+ /**
+ * Two-phased constructor.
+ * This has iPanicEnabled member set ETrue which will cause panic in destructor if there's new mobilecrashes
+ */
+ IMPORT_C static CIptvTestMobilecrashWatcher* NewL();
+
+ /**
+ * Two-phased constructor.
+ */
+ IMPORT_C static CIptvTestMobilecrashWatcher* NewL(TBool aPanicEnabled);
+
+ /**
+ * Destructor.
+ */
+ IMPORT_C virtual ~CIptvTestMobilecrashWatcher();
+
+
+ public: // New functions
+
+ /**
+ * Reads all mobilecrashes in c:\data and e:\ directories.
+ * @since
+ * @param aCrashes list of mobilecrash files are stored into here
+ * @return
+ */
+ void ReadMobilecrashesL( RPointerArray<HBufC>& aCrashes, const TDesC& aDrive );
+
+ /**
+ * Compares the two arrays of filenames and reports new files in aCrashesNow and causes a panic.
+ * @since
+ * @param aCrashesBefore old filelist
+ * @param aCrashesNow new filelist
+ * @return ETrue if new mobilecrashes are found, otherwise EFalse
+ */
+ IMPORT_C TBool CompareMobilecrashesL(RPointerArray<HBufC>& aCrashesBefore, RPointerArray<HBufC>& aCrashesNow);
+
+ /**
+ * Checks for new mobilecrashes. Panics if found.
+ * @since
+ * @param
+ * @return
+ */
+ IMPORT_C void CheckNewCrashesL();
+
+ /**
+ * Checks for new mobilecrashes.
+ * @since
+ * @param aArray is populated of the new mobilecrashes.
+ * @return EFalse if new mobilecrashes are not found. ETrue if found.
+ */
+ IMPORT_C TBool ReturnNewCrashes(RPointerArray<HBufC>& aArray);
+
+ /**
+ * Returns the count of mobilecrashes in c:\\data and e:\\
+ * @since
+ * @param
+ * @return Count of mobilecrashes in c:\\data and e:\\
+ */
+ IMPORT_C TInt ReturnMobileCrashCount();
+
+ protected: //from base classes
+
+
+ private:
+
+ /**
+ * C++ default constructor.
+ */
+ CIptvTestMobilecrashWatcher();
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL(TBool aPanicEnabled);
+
+ private: // Data
+ // If ETrue and new mobilecrashes are found then a panic will be thrown in destructor
+ TBool iPanicEnabled;
+
+ // File system session
+ RFs iFsSession;
+
+ RPointerArray<HBufC> iCrashesBefore;
+
+ RPointerArray<HBufC> iCrashesNow;
+ };
+
+
+#endif // CIPTVTESTMOBILECRASHWATCHER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/CIptvTestTimer.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,92 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+
+#ifndef CIPTVTESTTIMER_H
+#define CIPTVTESTTIMER_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+
+// MACROS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+class MIptvTestTimerObserver;
+
+// CLASS DECLARATION
+
+/**
+*
+*
+*
+*
+* @since
+*/
+class CIptvTestTimer : public CActive
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ IMPORT_C static CIptvTestTimer* NewL(MIptvTestTimerObserver& aObserver, TInt aId);
+
+ /**
+ * Destructor.
+ */
+ IMPORT_C virtual ~CIptvTestTimer();
+
+
+ public: // New functions
+ IMPORT_C void After(TTimeIntervalMicroSeconds32 aInterval);
+ IMPORT_C void CancelTimer( );
+
+ protected: //from base classes
+ void RunL();
+ void DoCancel();
+
+ private:
+
+ /**
+ * C++ default constructor.
+ */
+ CIptvTestTimer(MIptvTestTimerObserver& aObserver, TInt aId);
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ private: // Data
+ RTimer iTimer;
+ MIptvTestTimerObserver& iObserver;
+ TInt iId;
+ TBool iRestartAfterCancel;
+ TTimeIntervalMicroSeconds32 iInterval;
+ };
+
+
+#endif // CIPTVTESTTIMER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/CIptvTestVerifyData.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,274 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+/*
+
+Testmodule needs two new blocks:
+ EnableVerifying
+ - Parameters: verify ID, appendmode: 0 = if verify file exists it will be
+ overwritten, 1 data is written to end of file
+ - Verify ID can be the Case ID
+ - Calls IptvTestUtility::CreateVerifyData
+ - The case can call EnableVerifying block of multiple modules. Verify ID should be same in each call,
+ just use append mode in other calls but the first.
+ - If this has not been called then IptvTestUtility::VerifyData and
+ IptvTestUtility::WriteVerifyData do nothing
+
+ Verify
+ - Parameters: The verify ID used in the case
+ - Calls IptvTestUtility::VerifyData(CaseId) for the ID
+ - Case should call Verify block only once, even EnableVerifying is called for multiple test modules
+
+ After call to EnableVerifying the test module can write data with two different
+ IptvTestUtility::WriteVerifyData methods.
+
+ VerifyData will fail at the first time it's called. This is because it can't
+ find already verified file to compare with the one generated during the case run.
+ The unverified file can be found from E (or C if MMC is not installed) drive
+ in the folder: \iptvtest\verify\<VerifyID>.txt. This file must be verified by
+ hand and copied to IPTV_engine\internal\data\verify.
+
+ Note: Only logs from HW test runs should be accepted. Emulator and HW might give
+ different results.
+
+ IPTV_engine\internal\sis\generateverifylist.pl script generates
+ internal\data\verifyExports.inf file which exports the verified files to
+ correct locations. internal\sis\pkgExports.txt is also created and the
+ lines inside must be copied to STIF_IPTV_Engine.pkg. The verified files will
+ be installed in c:\Testframework\Iptvtest\verify folder on the terminal.
+
+ File & directory summary.
+ 1. (E/C):\iptvtest\verify\<VerifyID>.txt (on hardware)
+ - Generated during the case run
+ 2. internal\data\verify
+ - #1 should be copied here after it has been verified manually for first time.
+ 3. c:\Testframework\Iptvtest\verify (on hardware)
+ - Verified files are installed here. Compared to #1
+ 4. internal\sis\generateverifylist.pl
+ - Creates files #5 & #6
+ 5. internal\data\verifyExports.inf
+ - Exports the files in folders: epoc32\winscw\c\testframework\iptvtest\verify
+ epoc32\data\Z\System\Data\Iptvtest\Verify
+ 6. \internal\sis\pkgExports.txt
+ - Pkg lines for the files, copy to STIF_IPTV_Engine.pkg
+
+Example case:
+
+[Test]
+title ET39000 Data verifying example
+create IptvProvisioningTest ProvTest
+create IptvServiceManagementApiTest SMTest
+SMTest DeleteServicesDb
+ProvTest Create
+ProvTest EnableVerifying ET39000 // first module and first call will create new data file
+ProvTest LocalProvision "c:\TestFramework\testvod_services.xml"
+create IptvVodContentApiTest VCTest
+VCTest Create SERV_1
+VCTest EnableVerifying ET39000 APPEND // second module will append to the same file
+VCTest SelectIap 3G_AP
+VCTest UpdateEcg
+waittestclass VCTest
+VCTest VerifyAllCategoryContent KIptvVodContentCategoryRootId
+ProvTest Verify ET39000 // only one module will do the verifying
+VCTest Destroy
+delete VCTest
+ProvTest Destroy
+delete ProvTest
+SMTest Destroy
+delete SMTest
+[Endtest]
+
+*/
+
+
+#ifndef CIPTVTESTVERIFYDATA_H
+#define CIPTVTESTVERIFYDATA_H
+
+// INCLUDES
+#include <e32base.h>
+#include <e32cmn.h> // RArray
+#include <f32file.h> // RFs
+#include <BAUTILS.H>
+#include <S32FILE.H>
+
+// CONSTANTS
+const TInt KIptvTestErrVerifyFailed = -1112;
+_LIT(KIptvVerifyZipFile, "c:\\testing\\data\\verifyzip\\verify.zip" );
+
+// MACROS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+class CZipFile;
+
+// CLASS DECLARATION
+
+class CVerifyFile : public CBase
+ {
+ public:
+ static CVerifyFile* CVerifyFile::NewL();
+
+ virtual ~CVerifyFile();
+
+ // data
+
+ TBuf<64> iId;
+
+ /**
+ * Returns the file name and path where case data is written to be verified
+ * @since
+ * @param aFileName pointer to descriptor where file name is written
+ * @return Error code, KErrNone if no errors,
+ */
+ void GetFileToWrite(TDes& aFileName);
+
+ void CreateNewFile();
+
+ void WriteData(TDesC& aData);
+
+ void CloseFileHandles();
+
+ protected:
+ CVerifyFile();
+ void ConstructL();
+
+ private:
+ RFs iFs;
+ HBufC* iFileName;
+ TBool iFileOpen;
+ RFileWriteStream iFileStream;
+ RFile iFile;
+
+ void OpenStream();
+ void ResolveFileName();
+ };
+
+
+/**
+*
+* @since
+*/
+class CIptvTestVerifyData : public CBase
+ {
+ public: // Constructors and destructor
+
+ enum TVerifyResult
+ {
+ EVerifyOk = 0,
+ EVerifyFailed = -1112,
+ EVerifiedFileNotFound = -1111,
+ EFileToVerifyNotFound = -1110,
+ ESystemError = -1109
+ };
+
+ /**
+ * Two-phased constructor.
+ */
+ IMPORT_C static CIptvTestVerifyData* NewL();
+
+
+ /**
+ * Destructor.
+ */
+ IMPORT_C virtual ~CIptvTestVerifyData();
+
+
+ public: // New functions
+
+ /**
+ * Initializes the verify file, deletes if the file exists
+ * @since
+ * @param aVerifyId An id to identify the file where verify data is written
+ * @return Error code, KErrNone if no errors,
+ */
+ IMPORT_C TInt CreateVerifyDataL(TDesC& aVerifyId, TBool aAppend);
+
+ /**
+ * Writes verify data to a file
+ * @since
+ * @param aVerifyId An id to identify the file where verify data is written
+ * @param aVerifyData Data to write into the file
+ * @return Error code, KErrNone if no errors,
+ */
+ IMPORT_C TInt WriteVerifyDataL(TDesC& aVerifyId, TDesC& aVerifyData);
+
+ /**
+ * Verifies the results, result is written to aVerifyResult
+ * @since
+ * @param aVerifyId An id to identify the files which are compared
+ * @return Error code, KErrNone if no errors,
+ */
+ IMPORT_C TInt VerifyDataL(TDesC& aVerifyId, TVerifyResult& aVerifyResult);
+
+ /**
+ * Enables timestamp writing to the file.
+ * @since
+ * @param aUseTimestamps
+ * @return Error code, KErrNone if no errors,
+ */
+ IMPORT_C void EnableTimestamps( TBool aUseTimestamps );
+
+ protected: //from base classes
+
+ private:
+
+ /**
+ * C++ default constructor.
+ */
+ CIptvTestVerifyData();
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ TInt GetVerifyFileIndex(TInt& aIndex, TDesC& aVerifyId);
+
+ /*
+ * Reads a file into the buffer.
+ */
+ TInt ReadFileL(RFs& aFs, TDes& aFileName, HBufC8** aBuff, TVerifyResult& aVerifyResult);
+
+ /*
+ * Extracts a file from zip file.
+ */
+ void ExtractVerifyFileL( TDesC& aVerifyId, const TDesC& aDestFile );
+
+ /*
+ * Checks if file exists in zip file.
+ */
+ TBool FileExistsInZip( CZipFile* aZipFile, const TDesC& aFileName );
+
+ private: // Data
+ RFs iFs;
+
+ RPointerArray<CVerifyFile> iVerifyFiles;
+
+ CZipFile* iZipFile;
+
+ TBool iUseTimestamps;
+
+ HBufC* iBuffer;
+ };
+
+#endif // CIPTVTESTVERIFYDATA_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/CIptvTestVideoCreator.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,124 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#ifndef CIptvTestVideoCreator_H
+#define CIptvTestVideoCreator_H
+
+// INCLUDES
+#include <e32base.h>
+#include <e32std.h>
+#include <f32file.h>
+#include <BAUTILS.H>
+
+// CONSTANTS
+const int KVcxTestLargeFile3GB = -999;
+
+// MACROS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// CLASS DECLARATION
+
+/**
+*
+*
+*
+*
+* @since
+*/
+class CIptvTestVideoCreator : public CBase
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ IMPORT_C static CIptvTestVideoCreator* NewL();
+
+ /**
+ * C++ default constructor.
+ */
+ IMPORT_C CIptvTestVideoCreator();
+
+ /**
+ * Destructor.
+ */
+ IMPORT_C virtual ~CIptvTestVideoCreator();
+
+ enum TIptvTestVideoType
+ {
+ IptvTestVideo3Gp, // Extension .3GP
+ IptvTestVideo3Gp2, // Extension .3G2
+ IptvTestVideoMp2, // Extension .MP2
+ IptvTestVideoMpeg1, // Extension .MPG
+ IptvTestVideoMpeg2, // Extension .MPG
+ IptvTestVideoSuperVideoCd, // Extension .MPG
+ IptvTestVideoMp3, // Extension .MP3
+ IptvTestVideoAppleMpeg, // Extension .MP4
+ IptvTestVideoMpeg4, // Extension .MP4
+ IptvTestVideoMpegAvc, // Extension .MP4
+ IptvTestVideoQuicktime, // Extension .MOV
+ IptvTestVideoRealVideo, // Extension .RM
+ IptvTestVideoAvi, // Extension .AVI
+ IptvTestVideoWmv, // Extension .WMV
+ IptvTestVideoAviAC3 // Extension .AVI
+ };
+
+ public: // New functions
+
+ /**
+ * Creates video to specified location by copying file from e/c:\testing\data according to the video type.
+ * @param aVideoType a type of video which is created
+ * @param aFileName path filename where video is created
+ * @param aSize size of the video. If -1 then size will not be changed, if any other, playback of
+ * video will probably fail.
+ */
+ IMPORT_C void CreateVideoL( TIptvTestVideoType aVideoType, TDesC& aFileName, TInt aSize );
+
+ /*
+ * Creates number of video files to specified location.
+ */
+ IMPORT_C void CreateVideosL( TIptvTestVideoType aVideoType, TDesC& aFileName, TInt aCount, RPointerArray<HBufC>& aFileArray );
+
+ protected: //from base classes
+
+ private:
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ IMPORT_C void ConstructL();
+
+ /**
+ * Returns the file and path for specied file type.
+ */
+ IMPORT_C void GetVideoFile( TDes& aFileName, CIptvTestVideoCreator::TIptvTestVideoType aVideoType, const TDesC& aDrive );
+
+ private: // Data
+ RFs iFs;
+ CFileMan* iFileMan;
+ };
+
+
+#endif // CIptvTestVideoCreator_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/IptvTestDownloadManager.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,92 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#ifndef IPTVTESTDOWNLOADMANAGER_H
+#define IPTVTESTDOWNLOADMANAGER_H
+
+#include <e32base.h>
+#include <CommDbConnPref.h>
+#include <es_sock.h>
+#include <DownloadMgrClient.h>
+#include <HttpDownloadMgrCommon.h>
+#include "MTestUtilDownloadObserver.h"
+#include "MIptvTestTimerObserver.h"
+
+// FORWARD DECLARATIONS;
+class CIptvTestTimer;
+
+// CLASS DECLARATION
+
+
+/**
+* CTestUtilConnection Controls the internet connection initiation and shutdown
+*/
+class CIptvTestDownloadManager : public CBase, MHttpDownloadMgrObserver, public MIptvTestTimerObserver
+ {
+ public:
+
+ /*
+ * NewL()
+ */
+ IMPORT_C static CIptvTestDownloadManager* NewL(MTestUtilDownloadObserver *aObs);
+
+ /*
+ * NewL()
+ */
+ IMPORT_C static CIptvTestDownloadManager* NewLC(MTestUtilDownloadObserver *aObs);
+
+ /*
+ * ~CTestUtilConnection()
+ */
+ IMPORT_C virtual ~CIptvTestDownloadManager();
+
+
+ IMPORT_C TInt DownloadL( TDesC& aAddress, TDesC16& aOutFile, TDesC& aUserName, TDesC& aPassword, TInt32 aIapId = 0, TInt aTimeoutSeconds = 300);
+
+ IMPORT_C void GetError(RHttpDownload& aDownload, TInt32& aDownloadError);
+
+ private:
+
+ virtual void HandleDMgrEventL( RHttpDownload& aDownload, THttpDownloadEvent aEvent );
+
+ virtual void TimerComplete(TInt aTimerId, TInt aError);
+
+ void DeleteDownloadAsync( TInt aError );
+
+ private:
+
+ void ConstructL();
+
+ CIptvTestDownloadManager(MTestUtilDownloadObserver *aObs);
+
+ private:
+ RHttpDownloadMgr iDownloadMgr;
+ RHttpDownload* iDownload;
+
+ MTestUtilDownloadObserver *iObserver;
+
+ TBool iDownloadRunning;
+ CIptvTestTimer* iTimer;
+
+ TBool iTimerStartedForDownloadDeletion;
+ TInt iError;
+ TBool iDownloadFinishInformed;
+ };
+
+
+#endif // IAPCONNECT_V20ENGINE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/IptvTestUtilALR.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,173 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#ifndef IptvTestUtilALR_H
+#define IptvTestUtilALR_H
+
+#include <e32base.h>
+#include "MTestUtilConnectionObserver.h"
+
+#include <cmmanagerext.h>
+#include <cmdestinationext.h>
+#include <cmconnectionmethodext.h>
+#include <cmconnectionmethoddef.h>
+
+// FORWARD DECLARATIONS;
+class CIptvTestActiveWait;
+
+// CONSTANTS
+
+// Declared in CIptvUtil.h and vcxconnutilimpl.cpp
+const TUid VCXTEST_KIptvAlrCenRepUid = { 0x2000B438 };
+const TInt VCXTEST_KIptvCenRepUsedSnapIdKey = 0x1;
+const TInt VCXTEST_KIptvCenRepAPModeAlwaysAsk = 0;
+
+// CLASS DECLARATION
+
+/**
+* CIptvTestUtilALR Controls the internet connection initiation and shutdown
+*/
+class CIptvTestUtilALR : public CBase, public MTestUtilConnectionObserver
+ {
+public:
+
+ /*
+ * NewL()
+ */
+ IMPORT_C static CIptvTestUtilALR* NewL();
+
+ /*
+ * NewL()
+ */
+ IMPORT_C static CIptvTestUtilALR* NewLC();
+
+ /*
+ * ~CIptvTestUtilALR()
+ */
+ IMPORT_C virtual ~CIptvTestUtilALR();
+
+public: // Functions from base classes
+
+ void ConnectionCreated();
+ void ConnectionClosed();
+ void ConnectionFailed();
+ void ConnectionAlreadyExists();
+ void ConnectionTimeout();
+
+public: // New functions
+
+ /**
+ * Delete the used destination cenrep value.
+ */
+ IMPORT_C void RemoveUsedDestinationCenRepL();
+
+ /**
+ * Set the used destination cenrep value for Video Center & IPTV_Engine.
+ */
+ IMPORT_C void SetUsedDestinationL( TDesC& aDestinationName );
+
+ /**
+ * Create new destination (SNAP)
+ */
+ IMPORT_C void CreateDestinationL( TDesC& aDestinationName );
+
+ /**
+ * Delete a destination (SNAP)
+ */
+ IMPORT_C void DeleteDestinationL( TDesC& aDestinationName );
+
+ /**
+ * Copy existing connection method to defined SNAP.
+ */
+ IMPORT_C void CopyMethodL( TDesC& aMethodName, TDesC& aNewMethodName, TDesC& aNewDestinationName );
+
+ /**
+ * Delete a connection method.
+ */
+ IMPORT_C void DeleteMethodL( TDesC& aDestinationName, TDesC& aMethodName );
+
+ /**
+ * Set priority for a connection method.
+ */
+ IMPORT_C void SetMethodPriorityL( TDesC& aDestinationName, TDesC& aMethodName, TUint32 aPriority );
+
+ /**
+ * Sets specified string attribute for a method.
+ */
+ IMPORT_C void SetMethodStringAttributeL( TDesC& aDestinationName, TDesC& aMethodName, TInt aAttribute, TDesC& aAttributeValue );
+
+ /**
+ * Sets specified integer attribute for a method.
+ */
+ IMPORT_C void SetMethodIntAttributeL( TDesC& aDestinationName, TDesC& aMethodName, TInt aAttribute, TInt aAttributeValue );
+
+ /**
+ * Sets specified boolean attribute for a method.
+ */
+ IMPORT_C void SetMethodBoolAttributeL( TDesC& aDestinationName, TDesC& aMethodName, TInt aAttribute, TBool aAttributeValue );
+
+ /**
+ * Returns id of given destination.
+ */
+ IMPORT_C TInt GetDestinationIdL( TDesC& aDestinationName );
+
+ /**
+ * Terminates active connections for the destination's IAPs.
+ */
+ IMPORT_C void TerminateDestinationConnectionsL( TDesC& aDestinationName );
+
+private: // New functions
+
+ /**
+ * Prints destination's IAPs and their priorities to debug output.
+ */
+ void PrintDestinationL( RCmDestinationExt& aDestination );
+
+ /**
+ * Compares two connection method names.
+ * @param aSearchedName name for the method to search for.
+ * @param aCurrentName name to compare against.
+ * @param aStrict If false then and aSearchedName is "Internet" there's few alternatives for
+ * aCurrentName which will match too.
+ * @return ETrue if match, otherwise EFalse.
+ */
+ TBool MethodMatchesL( const TDesC& aSearchedName, const TDesC& aCurrentName, TBool aStrict );
+
+private:
+
+ /*
+ * CIptvTestUtilALR()
+ */
+ CIptvTestUtilALR();
+
+ /*
+ * ConstructL()
+ */
+ void ConstructL();
+
+private: // Data
+
+ RCmManagerExt iCmManager;
+
+ // CIptvTestActiveWait
+ CIptvTestActiveWait* iActiveWait;
+
+ };
+
+
+#endif // IAPCONNECT_V20ENGINE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/MIptvTestEventWaiterObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,48 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#ifndef MIPTVTESTEVENTWAITEROBSERVER_H
+#define MIPTVTESTEVENTWAITEROBSERVER_H
+
+// INCLUDES
+
+#include <e32def.h>
+
+// FORWARD DECLARATIONS
+class CIptvTestEvent;
+
+// CLASS DECLARATION
+
+class MIptvTestEventWaiterObserver
+ {
+ public:
+ /**
+ * Which event caused an error and why
+ */
+ virtual void EventWaiterErrorL(TInt aError, CIptvTestEvent& aEvent) = 0;
+
+ /**
+ *
+ */
+ virtual void EventWaiterAllEventsValidated() = 0;
+
+ };
+
+#endif // MIPTVTESTEVENTWAITEROBSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/MIptvTestTimerObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#ifndef MIPTVTESTTIMEROBSERVER_H
+#define MIPTVTESTTIMEROBSERVER_H
+
+// INCLUDES
+
+#include <e32def.h>
+
+// FORWARD DECLARATIONS
+
+
+// CLASS DECLARATION
+
+class MIptvTestTimerObserver
+ {
+ public:
+ virtual void TimerComplete(TInt aTimerId, TInt aError) = 0;
+
+ };
+
+#endif // MIPTVTESTTIMEROBSERVER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/MTestUtilConnectionObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,40 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#ifndef MIPTVUTILCONNECIONTOBSERVER_H
+#define MIPTVUTILCONNECIONTOBSERVER_H
+
+// INCLUDES
+
+#include <e32std.h>
+
+// CLASS DECLARATION
+
+class MTestUtilConnectionObserver
+ {
+public:
+
+ virtual void ConnectionCreated() = 0;
+ virtual void ConnectionClosed() = 0;
+ virtual void ConnectionFailed() = 0;
+ virtual void ConnectionAlreadyExists() = 0;
+ virtual void ConnectionTimeout() = 0;
+ };
+
+#endif // IPTVUTILCONNECIONTOBSERVER_H
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/MTestUtilDownloadObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#ifndef MIPTVUTILDOWNLOADOBSERVER_H
+#define MIPTVUTILDOWNLOADOBSERVER_H
+
+// INCLUDES
+
+#include <e32std.h>
+
+// CLASS DECLARATION
+
+class MTestUtilDownloadObserver
+ {
+public:
+
+ virtual void DownloadFinished(TInt aError) = 0;
+
+ };
+
+#endif // MIPTVUTILDOWNLOADOBSERVER_H
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/TestUtilConnection.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,160 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#ifndef TESTUTILCONNECTION_H
+#define TESTUTILCONNECTION_H
+
+#include <e32base.h>
+#include <CommDbConnPref.h>
+#include <es_sock.h>
+#include <e32std.h>
+#include "MTestUtilConnectionObserver.h"
+
+// FORWARD DECLARATIONS;
+//class CCommDbOverrideSettings;
+
+// CONSTANTS
+const TUint32 KUndefinedIAPid = 0x00;
+const TUint32 KTimeout = 1000000;
+
+// CLASS DECLARATION
+
+
+/**
+* CTestUtilConnection Controls the internet connection initiation and shutdown
+*/
+class CTestUtilConnection : public CActive
+ {
+public:
+
+ enum TConnectionState
+ {
+ EIdle = 0, EConnecting, EFailed, EConnected
+ };
+
+ /*
+ * NewL()
+ */
+ IMPORT_C static CTestUtilConnection* NewL(MTestUtilConnectionObserver* aObserver);
+
+ /*
+ * NewL()
+ */
+ IMPORT_C static CTestUtilConnection* NewLC(MTestUtilConnectionObserver* aObserver);
+
+ /*
+ * ~CTestUtilConnection()
+ */
+ IMPORT_C virtual ~CTestUtilConnection();
+
+ /*
+ * ConnectL()
+ *
+ * Creates a connection to IAP. ASYNC.
+ *
+ */
+ IMPORT_C void ConnectL();
+
+ /*
+ * TerminateConnectionL()
+ *
+ * Terminate an active connection
+ *
+ */
+ IMPORT_C void TerminateConnectionL();
+
+ /*
+ * SetConnectionPreferences()
+ *
+ * Sets connection preferences
+ *
+ * Params:
+ * TUint aBearer Bearer type
+ * TUint32 aIapId IAP to be connected, default KUndefinedIAPid
+ *
+ */
+ IMPORT_C void SetConnectionPreferences(TUint aBearer, TUint32 aIapId = KUndefinedIAPid);
+
+ /*
+ * AttachL()
+ *
+ * Attach to active connection.
+ *
+ */
+ IMPORT_C void AttachL();
+
+ /*
+ * GetState()
+ *
+ * Get connection state
+ *
+ * Params:
+ *
+ */
+ IMPORT_C TConnectionState GetState();
+
+protected: // from CActive
+
+ /*
+ * RunL()
+ *
+ * Handle request completion events
+ *
+ */
+ void RunL();
+
+ /*
+ * DoCancel()
+ *
+ * Cancel any outstanding requests
+ *
+ */
+ void DoCancel();
+
+ // From MTestUtilConnectionObserver
+
+private:
+
+ /*
+ * CTestUtilConnection()
+ */
+ CTestUtilConnection(MTestUtilConnectionObserver* aObserver);
+
+ /*
+ * ConstructL()
+ */
+ void ConstructL();
+
+private:
+
+ TCommDbConnPref iPref;
+
+ // Owns
+ RConnection iConnect;
+ RSocketServ iSocketServ;
+
+ TRequestStatus iTimerStatus;
+
+ TConnectionState iConnectionState;
+
+ MTestUtilConnectionObserver* iObserver;
+
+ };
+
+
+#endif // IAPCONNECT_V20ENGINE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/TestUtilConnectionWaiter.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,141 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#ifndef TESTUTILCONNECTIONWAITER_H
+#define TESTUTILCONNECTIONWAITER_H
+
+#include <e32base.h>
+#include <CommDbConnPref.h>
+
+#include <es_enum.h>
+#include <es_sock.h>
+#include <in_sock.h>
+
+
+// FORWARD DECLARATIONS;
+//class CCommDbOverrideSettings;
+class MTestUtilConnectionObserver;
+
+// CONSTANTS
+
+// CLASS DECLARATION
+
+/**
+* CTestUtilConnectionWaiter
+*/
+class CTestUtilConnectionWaiter : public CActive
+ {
+public:
+
+ /*
+ * NewL()
+ */
+ IMPORT_C static CTestUtilConnectionWaiter* NewL(MTestUtilConnectionObserver* aObserver);
+
+ /*
+ * NewLC()
+ */
+ IMPORT_C static CTestUtilConnectionWaiter* NewLC(MTestUtilConnectionObserver* aObserver);
+
+ /*
+ * ~CTestUtilConnection()
+ */
+ IMPORT_C virtual ~CTestUtilConnectionWaiter();
+
+ /*
+ * WaitForConnection(TUint32 aIapId)
+ *
+ * Waits until connection is created. Asynchronous.
+ *
+ */
+ IMPORT_C void WaitForConnection(TUint32 aIapId);
+
+ /*
+ * WaitUntilConnectionIsClosed(TUint32 aIapId)
+ *
+ * Waits until connection is closed. Asynchronous.
+ *
+ */
+ IMPORT_C void WaitUntilConnectionIsClosed(TUint32 aIapId);
+
+ /*
+ * TBool IsConnectionActive()
+ *
+ * Checks if connection is active
+ *
+ */
+ IMPORT_C TBool IsConnectionActive(TUint32 aIapId);
+
+
+protected: // from CActive
+
+ /*
+ * RunL()
+ *
+ * Handle request completion events
+ *
+ */
+ void RunL();
+
+ /*
+ * DoCancel()
+ *
+ * Cancel any outstanding requests
+ *
+ */
+ void DoCancel();
+
+ // From MTestUtilConnectionObserver
+
+private:
+
+ /*
+ * CTestUtilConnectionWaiter()
+ */
+ CTestUtilConnectionWaiter(MTestUtilConnectionObserver* aObserver);
+
+ /*
+ * ConstructL()
+ */
+ void ConstructL();
+
+ enum TConnectionWaiterState
+ {
+ ENoWaitState,
+ EWaitingConnection,
+ EWaitingConnectionClosed
+ };
+
+private:
+
+ MTestUtilConnectionObserver* iObserver;
+
+ TUint32 iIapId;
+
+ RTimer iTimer;
+
+ RSocketServ iServ;
+
+ TInt iCheckCount;
+
+ TConnectionWaiterState iWaitState;
+
+ };
+
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/VCXTestCommon.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,293 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+
+#ifndef CVCXTestCommon_H
+#define CVCXTestCommon_H
+
+// INCLUDES
+#include "CIptvTestVerifyData.h"
+#include "MTestUtilConnectionObserver.h"
+#include "CIptvTestVideoCreator.h"
+#include "VCXTestConstants.h"
+
+// MACROS
+// FORWARD DECLARATIONS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// CLASS DECLARATION
+
+/**
+* This class should have no depencies to any Video Center release!
+* Add functionality with depencies to IptvTestUtility.
+*
+* @since
+*/
+class CVCXTestCommon : public CBase, public MTestUtilConnectionObserver
+ {
+ public: // Constructors and destructor
+
+ enum TIptvTestIapType
+ {
+ EWlanIap, // Any WLAN AP
+ EGprsIap, // Any GPRS AP
+ };
+
+ /**
+ * Two-phased constructor.
+ */
+ IMPORT_C static CVCXTestCommon* NewL();
+
+ /**
+ * Destructor.
+ */
+ virtual ~CVCXTestCommon();
+
+ public: // New functions
+
+ /**
+ * Gets size of a file.
+ * @since
+ * @param
+ */
+ IMPORT_C TBool GetFileSize(TDesC& aFullPath, TUint32& aFileSize);
+
+ /**
+ * Searches AP by name.
+ * First searches if there's IAP matchin for the name. After that following rules are used:
+ * If name is Internet tries to find first GPRS AP, Internet2 second GPRS AP
+ * If name is Wlan tries to find first WLAN AP, Wlan2 second WLAN AP
+ * If AP is not found returns on of the known APs, if one is found.
+ */
+ IMPORT_C TBool GetIapIdL(const TDesC& aIapName, TUint32& aIapId);
+
+ /**
+ * Searches AP by name.
+ */
+ IMPORT_C TBool GetIapIdByNameL(const TDesC& aIapName, TUint32& aIapId);
+
+ /**
+ * Searches for AP as defined in TIptvTestIapType. In emulator always returns "Ethernet with Daemon Dynamic IP"
+ * @since
+ * @param aType AP type which is wanted
+ * @param aIapId id of found AP is written here
+ * @param aOrderNumber return nTh AP of the specified type
+ * @return KErrNotFound if no AP with the type is found, KErrNone if no errors,
+ */
+ IMPORT_C TInt GetIapIdByTypeL(TIptvTestIapType aType, TUint32& aIapId, TInt aOrderNumber);
+
+ /**
+ * Returns a name of AP.
+ */
+ IMPORT_C TBool GetIapNameById(TDes& aIapName, TUint32 aIapId);
+
+ /**
+ * Prints APs in COMMDB into debug output.
+ */
+ IMPORT_C void PrintIaps();
+
+ /**
+ * Initializes the verify file, deletes if the file exists
+ * @since
+ * @param aVerifyId An id to identify the file where verify data is written
+ * @return Error code, KErrNone if no errors,
+ */
+ IMPORT_C TInt CreateVerifyData(TDesC& aVerifyId, TBool aAppend);
+
+ /**
+ * Writes verify data to a file
+ * @since
+ * @param aVerifyId An id to identify the file where verify data is written
+ * @param aVerifyData Data to write into the file
+ * @return Error code, KErrNone if no errors,
+ */
+ IMPORT_C TInt WriteVerifyData(TDesC& aVerifyId, TDesC& aVerifyData);
+
+ /**
+ * Writes verify data to a file
+ * @since
+ * @param aVerifyId An id to identify the file where verify data is written
+ * @param aVerifyData Data to write into the file
+ * @return Error code, KErrNone if no errors,
+ */
+ IMPORT_C TInt WriteVerifyData(TDesC& aVerifyId, TRefByValue<const TDesC> aFmt, ... );
+
+ /**
+ *
+ * @since
+ * @param aVerifyId An id to identify the files which are compared
+ * @param aVerifyResult Result is written here
+ * @return Error code, KErrNone if no errors,
+ */
+ IMPORT_C TInt VerifyData(TDesC& aVerifyId, CIptvTestVerifyData::TVerifyResult& aVerifyResult);
+
+ /**
+ * Enables timestamp writing into the verify file.
+ * @since
+ * @param aUseTimestamps
+ */
+ IMPORT_C void EnableVerifyTimestamps( TBool aUseTimestamps );
+
+ /**
+ * Converts string to integer.
+ * @param aInt parsed int is stored here
+ * @param aString string containing the number
+ * @return KErrNone if succeed, otherwise an error code
+ */
+ IMPORT_C static TInt ParseIntFromString(TInt& aInt, TDesC& aString);
+
+ /**
+ * Creates bad iap for testing purposes
+ * @param aName name of the iap to be created
+ */
+ IMPORT_C TUint32 CreateBadIapL(TDesC& aName);
+
+ /**
+ * static TInt AdvanceSystemTimeSeconds();
+ * @return KErrNone if succeed, otherwise an error code
+ */
+ IMPORT_C static TInt AdvanceSystemTimeSeconds( TInt aCount );
+
+ /**
+ * static TInt AdvanceSystemTimeMinutes();
+ * @return KErrNone if succeed, otherwise an error code
+ */
+ IMPORT_C static TInt AdvanceSystemTimeMinutes( TInt aCount );
+
+ /**
+ * static TInt AdvanceSystemTimeHours();
+ * @return KErrNone if succeed, otherwise an error code
+ */
+ IMPORT_C static TInt AdvanceSystemTimeHours( TInt aCount );
+
+ /**
+ * static TInt SetSystemTime();
+ * @return KErrNone if succeed, otherwise an error code
+ */
+ IMPORT_C static TInt SetSystemTime(TTime aTime);
+
+ /**
+ * static TInt SetTimeZone();
+ * @return KErrNone if succeed, otherwise an error code
+ */
+ IMPORT_C static TInt SetTimeZone(TDesC& aTimeZone);
+
+ /*
+ * Creates a video file to the system.
+ */
+ IMPORT_C void CreateVideoFileL( CIptvTestVideoCreator::TIptvTestVideoType aVideoType, TDesC& aFileName, TInt aSize );
+
+ /*
+ * Creates video files to the system.
+ */
+ IMPORT_C void CreateVideoFilesL( CIptvTestVideoCreator::TIptvTestVideoType aVideoType, TDesC& aFileName, TInt aCount, RPointerArray<HBufC>& aFileArray );
+
+ /*
+ * Sets free space for a drive.
+ */
+ IMPORT_C void SetDriveFreeSpaceL( TInt aDriveNumber, TUint aDesiredFreeSpace );
+
+ /**
+ * Deletes files created by SetDriveFreeSpaceL. Should be called by any test module which
+ * has reserved disk space.
+ */
+ IMPORT_C void DeleteDummyFilesL( TInt aDriveNumber );
+
+ /*
+ * Returns KErrNone if file is not in use.
+ */
+ IMPORT_C TInt EnsureFileIsNotInUse( const TPtrC& aFileName );
+
+ /*
+ * CalculateSpaceToReserveL
+ */
+ void CalculateSpaceToReserveL( RFs &aFs, TInt aDriveNumber, TInt aDesiredSpace, TInt64& aSpaceToReserve );
+
+ /**
+ * PrintDriveInfo
+ */
+ void PrintDriveInfo( const TPtrC& aDriveLetter );
+
+ /**
+ * ListDir
+ */
+ IMPORT_C TInt ListDir( const TDesC& aDir, TInt aLevel );
+
+ /**
+ * Reads integer from P&S.
+ * @return KErrNone if succeed, otherwise an error code
+ */
+ IMPORT_C static TInt GetPSProperty( const TUid aCategory, const TUint aKey, TInt& aValue );
+
+ /**
+ * Writes integer to P&S.
+ * @return KErrNone if succeed, otherwise an error code
+ */
+ IMPORT_C static TInt SetPSProperty( const TUid aCategory, const TUint aKey, const TInt aValue );
+
+ /**
+ * Reads descriptor from P&S.
+ * @return KErrNone if succeed, otherwise an error code
+ */
+ IMPORT_C static TInt GetPSProperty( const TUid aCategory, const TUint aKey, TDes& aValue );
+
+ /**
+ * Writes descriptor to P&S.
+ * @return KErrNone if succeed, otherwise an error code
+ */
+ IMPORT_C static TInt SetPSProperty( const TUid aCategory, const TUint aKey, const TDesC& aValue );
+
+ /**
+ * Prints open files in the file session and which thread / process is keeping the files open.
+ * @param aFs file session, for example CCoeEnv::Static()->FsSession() as param is good idea.
+ */
+ IMPORT_C static void ListFilesProcessesAndThreadsL( RFs &aFs );
+
+ public: // From base classes
+
+ void ConnectionCreated() {};
+ void ConnectionClosed() {};
+ void ConnectionFailed() {};
+ void ConnectionAlreadyExists() {};
+ void ConnectionTimeout() {};
+
+ private:
+
+ /**
+ * C++ default constructor.
+ */
+ CVCXTestCommon();
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ private: // Data
+ CIptvTestVerifyData* iIptvVerifyData;
+ CIptvTestVideoCreator* iVideoCreator;
+ RFs iFs;
+ };
+
+
+#endif // CVCXTestCommon_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/VCXTestConstants.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+
+#ifndef VCXTESTCONSTANTS_H
+#define VCXTESTCONSTANTS_H
+
+// CONSTANTS
+const TInt KIptvTestErrNotFound = -1111;
+const TInt KIptvTestNoSignal = -999666;
+
+_LIT(KIptvTestBadIapName, "BadIap");
+
+#endif // VCXTESTCONSTANTS_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/VCXTestLog.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,106 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#ifndef VCXTESTLOG_H
+#define VCXTESTLOG_H
+
+// INCLUDES
+#include <e32std.h>
+#include <e32svr.h>
+
+//#define FILE_LOGGING_IN_UREL_BUILD 1
+
+// MACROS
+#ifdef _DEBUG
+
+// SELECT LOG TYPE FROM HERE
+// 0 = RDebug
+// 1 = file logging
+// 2 = no logging
+#ifdef __WINSCW__
+ #define LOGTYPE 0
+#else
+ #define LOGTYPE 1
+#endif __WINSCW__
+
+#if LOGTYPE == 0
+
+ #define VCXLOGLO1(s) RDebug::Print(_L(#s))
+ #define VCXLOGLO2(s, a) RDebug::Print(_L(#s), a)
+ #define VCXLOGLO3(s, a, b) RDebug::Print(_L(#s), a, b)
+ #define VCXLOGLO4(s, a, b, c) RDebug::Print(_L(#s), a, b, c)
+ #define VCXLOGLO5(s, a, b, c, d) RDebug::Print(_L(#s), a, b, c, d)
+
+#endif
+
+#if LOGTYPE == 1
+
+ #include <flogger.h>
+
+ _LIT(KIPTVLogFolder2,"Fusion");
+ _LIT(KIPTVLogFile2,"Fusion.txt");
+
+ #define VCXLOGLO1(AAA) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::Write(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,tempIPTVLogDes()); } while ( EFalse )
+ #define VCXLOGLO2(AAA,BBB) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB); } while ( EFalse )
+ #define VCXLOGLO3(AAA,BBB,CCC) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB,CCC); } while ( EFalse )
+ #define VCXLOGLO4(AAA,BBB,CCC,DDD) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB,CCC,DDD); } while ( EFalse )
+ #define VCXLOGLO5(AAA,BBB,CCC,DDD,EEE) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB,CCC,DDD,EEE); } while ( EFalse )
+
+#endif
+
+#if LOGTYPE == 2
+
+ #define VCXLOGLO1(s)
+ #define VCXLOGLO2(s, a)
+ #define VCXLOGLO3(s, a, b)
+ #define VCXLOGLO4(s, a, b, c)
+ #define VCXLOGLO5(s, a, b, c, d)
+
+#endif
+
+#else // _DEBUG
+
+ #ifdef FILE_LOGGING_IN_UREL_BUILD
+
+ #include <flogger.h>
+
+ _LIT(KIPTVLogFolder2,"Fusion");
+ _LIT(KIPTVLogFile2,"Fusion.txt");
+
+ #define VCXLOGLO1(AAA) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::Write(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,tempIPTVLogDes()); } while ( EFalse )
+ #define VCXLOGLO2(AAA,BBB) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB); } while ( EFalse )
+ #define VCXLOGLO3(AAA,BBB,CCC) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB,CCC); } while ( EFalse )
+ #define VCXLOGLO4(AAA,BBB,CCC,DDD) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB,CCC,DDD); } while ( EFalse )
+ #define VCXLOGLO5(AAA,BBB,CCC,DDD,EEE) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB,CCC,DDD,EEE); } while ( EFalse )
+
+ #else // FILE_LOGGING_IN_UREL_BUILD
+
+ #define VCXLOGLO1(s)
+ #define VCXLOGLO2(s, a)
+ #define VCXLOGLO3(s, a, b)
+ #define VCXLOGLO4(s, a, b, c)
+ #define VCXLOGLO5(s, a, b, c, d)
+
+ #endif // FILE_LOGGING_IN_UREL_BUILD
+
+#endif // _DEBUG
+
+
+#endif // VCXTESTLOG_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/VCXTestMessageWait.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,149 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#ifndef VCXTESTMESSAGEWAIT_H_
+#define VCXTESTMESSAGEWAIT_H_
+
+// INCLUDES
+#include <e32base.h>
+#include "MIptvTestTimerObserver.h"
+
+// CONSTANTS
+
+// MACROS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// CLASS DECLARATION
+class CIptvTestActiveWait;
+class CIptvTestTimer;
+
+/**
+* MVCXTestMessageWaitObserver
+*/
+class MVCXTestMessageWaitObserver
+ {
+ public:
+
+ /**
+ * Called when message queue empties or there's timeout.
+ */
+ virtual void MessageWaitComplete( TInt aError ) = 0;
+
+ };
+
+/**
+* CVCXTestMessageWait
+*/
+class CVCXTestMessageWait : public CBase, public MIptvTestTimerObserver
+ {
+ public: // Constructors and destructor
+ /**
+ * Two-phased constructor.
+ */
+ IMPORT_C static CVCXTestMessageWait * NewL( MVCXTestMessageWaitObserver* aObserver );
+
+ /**
+ * Destructor.
+ */
+ IMPORT_C virtual ~CVCXTestMessageWait ();
+
+
+ public: // New functions
+
+ /**
+ * Resets already received messages, wait queue and cancels previous receiving.
+ */
+ IMPORT_C void Reset();
+
+ /**
+ * Resets only already received messages.
+ */
+ IMPORT_C void ResetReceivedMessages();
+
+ /**
+ * Adds message to the wait queue.
+ */
+ IMPORT_C void AddMessage( TInt32 aMsg );
+
+ /**
+ * Waits for a message. Calls observer callback when message is received. This will reset
+ * previously added messages.
+ */
+ IMPORT_C void WaitForMessageL( TInt32 aMsg, TInt aTimeoutSeconds, TBool aDoBlock );
+
+ /**
+ * Waits for the added messages. Calls observer callback when messages have been received.
+ */
+ IMPORT_C void WaitForAllL( TInt aTimeoutSeconds, TBool aDoBlock );
+
+ /**
+ * Waits until messages have not been received for the specified seconds.
+ */
+ IMPORT_C void CoolDownL( TInt aSeconds );
+
+ /**
+ * Checks wait queue for the message.
+ */
+ IMPORT_C void ReceiveMessage( TInt32 aMsg, TInt aError );
+
+ public: // From base classes.
+
+ void TimerComplete( TInt aTimerId, TInt aError );
+
+ private:
+
+ /**
+ * C++ default constructor.
+ */
+ CVCXTestMessageWait( MVCXTestMessageWaitObserver* aObserver );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ IMPORT_C void ConstructL();
+
+ private: // Data
+
+ MVCXTestMessageWaitObserver* iObserver;
+
+ CIptvTestActiveWait* iActiveWaitBlocking;
+
+ CIptvTestTimer* iTimeoutTimer;
+
+ // Messages which are received while waited messages array is empty.
+ RArray<TInt32> iReceivedMessages;
+
+ RArray<TInt32> iWaitedMessages;
+
+ TInt iTimeoutSeconds;
+
+ TBool iWaitStarted;
+
+ TBool iCoolingDown;
+
+ TInt iError;
+ };
+
+#endif // VCXTESTMESSAGEWAIT_H_
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/VCXTestPSObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#ifndef VCXTESTPSOBSERVER_H
+#define VCXTESTPSOBSERVER_H
+
+#include <e32def.h>
+#include <e32cmn.h>
+
+class MVCXTestPSObserver
+ {
+public:
+ virtual void ValueChangedL( const TUid& aUid, const TUint32& aKey, const TInt& aValue ) = 0;
+ virtual void ValueChangedL( const TUid& aUid, const TUint32& aKey, const TDesC& aValue ) = 0;
+ };
+
+#endif // VCXTESTPSOBSERVER_H
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/VCXTestPSSubscriber.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,174 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#ifndef VCXTESTPSSUBSCRIBER_H
+#define VCXTESTPSSUBSCRIBER_H
+
+#include <e32base.h> // For CActive, link against: euser.lib
+#include <e32std.h> // For RTimer, link against: euser.lib
+
+#include <e32property.h>
+
+class MVCXTestPSObserver;
+
+class CVCXTestPSSubscriber : public CActive
+ {
+ public:
+
+ /**
+ * Construction.
+ *
+ * @param aUid category for the property
+ * @param aKey key id for the property
+ * @param aType type of the key (at the moment only int and text are supported)
+ * @param aObserver pointer to observer to who to notify about changes
+ *
+ * @return The newly constructed CVcxConnUtilPubSub
+ */
+ IMPORT_C static CVCXTestPSSubscriber* NewL( const TUid aUid,
+ const TUint32 aKey,
+ RProperty::TType aType,
+ MVCXTestPSObserver* aObserver );
+
+ /**
+ * Destructor.
+ *
+ */
+ IMPORT_C virtual ~CVCXTestPSSubscriber();
+
+ /**
+ * Returns a pubsub value from this property
+ *
+ *@param &aValue value to fetch
+ *
+ *@return TInt KErrNone or some system level error code
+ */
+ IMPORT_C TInt Get( TInt& aValue );
+
+ /**
+ * Returns a pubsub value from this property
+ *
+ *@param &aValue value tofetch
+ *
+ *@return TInt KErrNone or some system level error code
+ */
+ IMPORT_C TInt Get( TDes& aValue );
+
+ /**
+ * Sets a pubsub value from this property
+ *
+ *@param aValue value to set
+ *
+ *@return TInt KErrNone or some system level error code
+ */
+ IMPORT_C TInt Set( TInt& aValue );
+
+ /**
+ * Sets a pubsub value from this property
+ *
+ *@param aValue value to set
+ *
+ *@return TInt KErrNone or some system level error code
+ */
+ IMPORT_C TInt Set( const TDesC& aValue );
+
+ /**
+ * Start subscribing if not already started
+ */
+ IMPORT_C void Start();
+
+ /**
+ * Activate safe wait object to wait modifications
+ */
+ IMPORT_C void WaitChangeL();
+
+ /**
+ * Explicitly ends waiting
+ */
+ IMPORT_C void EndWait();
+
+ private: // constuct / destruct
+
+ /**
+ * Constructor
+ *
+ */
+ CVCXTestPSSubscriber( const TUid aUid,
+ const TUint32 aKey,
+ RProperty::TType aType,
+ MVCXTestPSObserver* aObserver );
+
+ /**
+ * Symbian 2nd phase construction
+ *
+ */
+ void ConstructL();
+
+ private: // from CActive
+
+ /**
+ * From CActive. Calles when value subscribed to changes
+ *
+ */
+ void RunL();
+
+ /**
+ * From CActive. Cancels subscribtion
+ *
+ */
+ void DoCancel();
+
+ private:
+
+ /**
+ * ETrue if object is initialized and subscribtion starts
+ */
+ TBool iInitialized;
+
+ /**
+ * Property to subscribe
+ */
+ RProperty iProperty;
+
+ /**
+ * Category uid for the property
+ */
+ const TUid iUid;
+
+ /**
+ * Key id for the property
+ */
+ const TUint32 iKey;
+
+ /**
+ * type of the property
+ */
+ RProperty::TType iKeyType;
+
+ /**
+ * Waiter object for data change
+ */
+ CActiveSchedulerWait* iSafeWait;
+
+ /**
+ * Observer
+ */
+ MVCXTestPSObserver* iObserver;
+ };
+
+#endif // VCXTESTPSSUBSCRIBER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/VCXTestStatsKeeper.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,236 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#ifndef VCXTESTSTATSKEEPER_H
+#define VCXTESTSTATSKEEPER_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+
+// MACROS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// CLASS DECLARATION
+
+/**
+* Class to hold a single statistics item.
+*/
+class CVCXTestStatsItem : public CBase
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ static CVCXTestStatsItem* NewL();
+
+ /**
+ * Destructor.
+ */
+ virtual ~CVCXTestStatsItem();
+
+ private:
+
+ /**
+ * C++ default constructor.
+ */
+ CVCXTestStatsItem();
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ public: // Data
+
+ TBool iIsActive;
+
+ TInt32 iId;
+ HBufC* iDescId;
+ HBufC* iDesc;
+ TInt iError;
+ TTime iStartTime;
+ TTime iEndTime;
+
+ RPointerArray<HBufC> iTraces;
+ RPointerArray<CVCXTestStatsItem> iProgresses;
+ };
+
+/**
+* Class to hold summary for statistics.
+*/
+class CVCXTestStatsItemSummary : public CBase
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ static CVCXTestStatsItemSummary* NewL();
+
+ /**
+ * Destructor.
+ */
+ virtual ~CVCXTestStatsItemSummary();
+
+ private:
+
+ /**
+ * C++ default constructor.
+ */
+ CVCXTestStatsItemSummary();
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ public: // Data
+ TInt32 iId;
+ HBufC* iDescId;
+ HBufC* iDesc;
+
+ TUint iCount;
+ TUint iFailCount;
+
+ // These are all microseconds.
+ TInt64 iMinTime;
+ TInt64 iMaxTime;
+ TReal iAvgTime;
+
+ TInt64 iTotalTime;
+ TInt64 iFailTime;
+ };
+
+/**
+* Class to keep track of statistics.
+*/
+class CVCXTestStatsKeeper : public CBase
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ IMPORT_C static CVCXTestStatsKeeper* NewL();
+
+ /**
+ * Destructor.
+ */
+ virtual ~CVCXTestStatsKeeper ();
+
+ public: // New functions
+
+ /**
+ * Sets the name and filename for statistics. Report is written when class is desctructed.
+ */
+ IMPORT_C void StartStatsKeepingL( const TDesC& aName, const TDesC& aFileName );
+
+ /**
+ * Adds an action to the statistics lists.
+ */
+ IMPORT_C void ActionStartL( TInt32 aId, const TDesC& aDesc );
+
+ /**
+ * Adds an action to the statistics lists.
+ * if param aDescMerge is true then action descsription will contain the descid.
+ */
+ IMPORT_C void ActionStartL( const TDesC& aDescId, const TDesC& aDesc, TBool aDescMerge = EFalse );
+
+ /**
+ * Ends an action.
+ * Leaves with KErrAbort if more than 33% of actions have failed. Test should abort itself in that case.
+ */
+ IMPORT_C void ActionEndL( TInt32 aId, TInt aError );
+
+ /**
+ * Ends an action.
+ * Leaves with KErrAbort if more than 33% of actions have failed. Test should abort itself in that case.
+ */
+ IMPORT_C void ActionEndL( const TDesC& aDescId, TInt aError );
+
+ /**
+ * Sets progress information for an action. These are saved in the report.
+ */
+ IMPORT_C void ActionProgressL( TInt32 aId, const TDesC& aProgressDesc );
+
+ /**
+ * Sets progress information for an action. These are saved in the report.
+ */
+ IMPORT_C void ActionProgressL( const TDesC& aDescId, const TDesC& aProgressDesc );
+
+ /**
+ * Generic trace for different actions. Last 20 of these are saved in the report only if action fails.
+ */
+ IMPORT_C void ActionTraceL( const TDesC& aDesc );
+
+ private:
+
+ /**
+ * C++ default constructor.
+ */
+ CVCXTestStatsKeeper();
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ private: // New functions.
+
+ CVCXTestStatsItem* GetActiveAction( TInt32 aId );
+
+ CVCXTestStatsItem* GetActiveAction( const TDesC& aDesc );
+
+ CVCXTestStatsItem* GetLastActiveAction( TBool aOnlyDescId );
+
+ TInt FormatDate( const TTime& aDate, TDes& aStr );
+
+ void GenerateReportL( const TDesC& aFileName, TBool aFullReport );
+
+ TUint DataSizeL();
+
+ void CheckFailsL();
+
+ void GetActionSummariesL( RPointerArray<CVCXTestStatsItemSummary>& aSummaries, TBool aFailActiveActions );
+
+ private: // Data
+
+ TBool iStarted;
+
+ HBufC* iReportName;
+
+ HBufC* iReportFileName;
+
+ RPointerArray<CVCXTestStatsItem> iActions;
+
+ RPointerArray<HBufC> iTraces;
+
+ TBool iAbortedBecauseTooManyFails;
+ };
+
+#endif // VCXTESTSTATSKEEPER_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/inc/VCXTestTimerWait.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,62 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#ifndef VCXTIMERWAIT_H
+#define VCXTIMERWAIT_H
+
+// INCLUDES
+#include <e32base.h>
+#include "VCXTestLog.h"
+#include "MIptvTestTimerObserver.h"
+
+// FORWARD DECLARATIONS
+class CIptvTestTimer;
+class CIptvTestActiveWait;
+
+// DATA TYPES
+
+// CLASS DECLARATION
+
+/**
+ * Timer waiter class.
+ */
+class CVCXTestTimerWait : public CBase, public MIptvTestTimerObserver
+ {
+ public:
+ IMPORT_C static CVCXTestTimerWait* NewL();
+
+ IMPORT_C ~CVCXTestTimerWait();
+
+ IMPORT_C void WaitL( TUint32 aMicroSeconds );
+
+ public:
+ void TimerComplete(TInt aTimerId, TInt aError);
+
+ private:
+
+ IMPORT_C void ConstructL();
+
+ CVCXTestTimerWait();
+
+ private:
+ CIptvTestTimer* iTimer;
+ CIptvTestActiveWait* iWait;
+
+ };
+
+#endif // VCXTIMERWAIT_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/src/CIptvTestActiveWait.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,194 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "CIptvTestActiveWait.h"
+#include "VCXTestLog.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CIptvTestActiveWait::
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestActiveWait* CIptvTestActiveWait::NewL()
+ {
+ VCXLOGLO1(">>>CIptvTestActiveWait::NewL");
+ CIptvTestActiveWait* self = new (ELeave) CIptvTestActiveWait();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ VCXLOGLO1("<<<CIptvTestActiveWait::NewL");
+ return self;
+ }
+// -----------------------------------------------------------------------------
+// CIptvTestActiveWait::~CIptvTestActiveWait
+// destructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestActiveWait::~CIptvTestActiveWait()
+ {
+ VCXLOGLO1(">>>CIptvTestActiveWait::~CIptvTestActiveWait");
+
+ ActiveWait(EActiveWaitStop);
+ delete iActiveSchedulerWait;
+ iActiveSchedulerWait = NULL;
+
+ VCXLOGLO1("<<<CIptvTestActiveWait::~CIptvTestActiveWait");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestActiveWait::~CIptvTestActiveWait
+// destructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestActiveWait::CIptvTestActiveWait()
+ {
+ VCXLOGLO1(">>>CIptvTestActiveWait::CIptvTestActiveWait");
+
+
+ VCXLOGLO1("<<<CIptvTestActiveWait::CIptvTestActiveWait");
+ }
+
+
+// -----------------------------------------------------------------------------
+// CIptvTestActiveWait::ConstructL
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestActiveWait::ConstructL()
+ {
+ VCXLOGLO1(">>>CIptvTestActiveWait::ConstructL");
+
+ iActiveSchedulerWait = new (ELeave) CActiveSchedulerWait;
+
+ VCXLOGLO1("<<<CIptvTestActiveWait::ConstructL");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestActiveWait::ActiveWait
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestActiveWait::ActiveWait( TIptvTestActiveWaitCmd aActiveWaitCmd )
+ {
+ VCXLOGLO1(">>>CIptvTestActiveWait::ActiveWait");
+
+ VCXLOGLO2("aActiveWaitCmd=%d", aActiveWaitCmd );
+
+ switch( aActiveWaitCmd )
+ {
+ case EActiveWaitStart:
+ {
+ if( !iActiveSchedulerWait->IsStarted() )
+ {
+ iActiveSchedulerWait->Start();
+ }
+ else
+ {
+ VCXLOGLO1("ActiveSchedulerWait already started");
+ }
+ }
+ break;
+ case EActiveWaitStop:
+ {
+ if( iActiveSchedulerWait->IsStarted() )
+ {
+ iActiveSchedulerWait->AsyncStop();
+ }
+ else
+ {
+ VCXLOGLO1("ActiveSchedulerWait already stopped");
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ VCXLOGLO1("<<<CIptvTestActiveWait::ActiveWait");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestActiveWait::IsWaiting
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CIptvTestActiveWait::IsWaiting()
+ {
+ return iActiveSchedulerWait->IsStarted();
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestActiveWait::Start
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvTestActiveWait::Start( )
+ {
+ TInt err = KErrNotReady;
+ if( !iActiveSchedulerWait->IsStarted() )
+ {
+ iActiveSchedulerWait->Start();
+ err = KErrNone;
+ }
+ else
+ {
+ VCXLOGLO1("ActiveSchedulerWait already started");
+ }
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestActiveWait::Stop
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvTestActiveWait::Stop( )
+ {
+ TInt err = KErrNotReady;
+ if( iActiveSchedulerWait->IsStarted() )
+ {
+ iActiveSchedulerWait->AsyncStop();
+ err = KErrNone;
+ }
+ else
+ {
+ VCXLOGLO1("ActiveSchedulerWait already stopped");
+ }
+ return err;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/src/CIptvTestEvent.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,77 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+// INCLUDES
+#include "CIptvTestEvent.h"
+#include "VCXTestLog.h"
+
+EXPORT_C CIptvTestEvent::~CIptvTestEvent()
+ {
+ }
+
+EXPORT_C TBool CIptvTestEvent::HasTimeouted(TTime& aTimeNow)
+ {
+ if(!iActive)
+ {
+ return EFalse;
+ }
+ TTimeIntervalSeconds secondsAlive;
+ aTimeNow.SecondsFrom(iActivationTime, secondsAlive);
+
+ VCXLOGLO3("CIptvTestEvent:: '%S' seconds to timeout: %d", &iName, iTimeoutSeconds - secondsAlive.Int() );
+
+ if(secondsAlive.Int() >= iTimeoutSeconds)
+ {
+ return ETrue;
+ }
+ return EFalse;
+ }
+
+EXPORT_C CIptvTestEvent::CIptvTestEvent( const TDesC& aName, TInt aTimeoutSeconds)
+ {
+ iName = _L("Noname Event");
+ iName = aName;
+ iTimeoutSeconds = aTimeoutSeconds;
+ iActive = EFalse;
+ }
+
+void CIptvTestEvent::ConstructL()
+ {
+ }
+
+EXPORT_C void CIptvTestEvent::GetName(TDes& aName)
+ {
+ aName = iName;
+ }
+
+
+EXPORT_C void CIptvTestEvent::Activate()
+ {
+ iActive = ETrue;
+ iActivationTime.UniversalTime();
+ VCXLOGLO2("ACTIVATED %S", &iName);
+ }
+
+EXPORT_C void CIptvTestEvent::Deactivate()
+ {
+ iActive = EFalse;
+ VCXLOGLO2("DEACTIVATED %S", &iName);
+ }
+
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/src/CIptvTestEventWaiter.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,327 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+// INCLUDES
+#include "CIptvTestEventWaiter.h"
+#include "MIptvTestEventWaiterObserver.h"
+#include "CIptvTestEvent.h"
+#include "VCXTestLog.h"
+
+// -----------------------------------------------------------------------------
+// CIptvTestEventWaiter::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestEventWaiter* CIptvTestEventWaiter::NewL(MIptvTestEventWaiterObserver& aObserver)
+{
+ VCXLOGLO1(">>>CIptvTestEventWaiter::NewL");
+ CIptvTestEventWaiter* self = new (ELeave) CIptvTestEventWaiter(aObserver);
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ VCXLOGLO1("<<<CIptvTestEventWaiter::NewL");
+ return self;
+}
+
+// -----------------------------------------------------------------------------
+// CIptvTestEventWaiter::~CIptvTestEventWaiter
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestEventWaiter::~CIptvTestEventWaiter()
+{
+ VCXLOGLO1(">>>CIptvTestEventWaiter::~CIptvTestEventWaiter");
+ if( IsAdded() )
+ {
+ Deque(); // calls also Cancel()
+ }
+
+ iTimer.Close();
+
+ Reset();
+ VCXLOGLO1("<<<CIptvTestEventWaiter::~CIptvTestEventWaiter");
+}
+
+// -----------------------------------------------------------------------------
+// CIptvTestEventWaiter::CheckTimeouts
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvTestEventWaiter::CheckTimeouts()
+{
+ VCXLOGLO1(">>>CIptvTestEventWaiter::CheckTimeouts");
+ TTime now;
+ now.UniversalTime();
+
+ TInt i;
+ for(i=0; i<iEventQueue.Count();i++)
+ {
+ CIptvTestEvent* event = iEventQueue[i];
+ if( event->HasTimeouted( now ) )
+ {
+ VCXLOGLO1("CIptvTestEventWaiter:: event timedout");
+ iObserver.EventWaiterErrorL( KErrTimedOut, *event );
+ VCXLOGLO1("<<<CIptvTestEventWaiter::CheckTimeouts");
+ return KErrTimedOut;
+ }
+ }
+
+ for(i=0; i<iEventDump.Count();i++)
+ {
+ CIptvTestEvent* event = iEventDump[i];
+ if( event->HasTimeouted( now ) )
+ {
+ VCXLOGLO1("CIptvTestEventWaiter:: event timedout");
+ iObserver.EventWaiterErrorL( KErrTimedOut, *event );
+ VCXLOGLO1("<<<CIptvTestEventWaiter::CheckTimeouts");
+ return KErrTimedOut;
+ }
+ }
+
+ VCXLOGLO1("<<<CIptvTestEventWaiter::CheckTimeouts");
+
+ return KErrNone;
+}
+
+// -----------------------------------------------------------------------------
+// CIptvTestEventWaiter::AddEvent
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvTestEventWaiter::AddEvent(CIptvTestEvent* aEvent, TBool aSequential)
+{
+ VCXLOGLO1(">>>CIptvTestEventWaiter::AddEvent");
+
+ if(aSequential)
+ {
+ // First event in queue, activate it
+ if(iEventQueue.Count() <= 0)
+ {
+ aEvent->Activate();
+ }
+ // Add event
+ iEventQueue.Append( aEvent );
+ }
+ else
+ {
+ // All events in dump are active
+ iEventDump.Append( aEvent );
+ aEvent->Activate();
+ }
+
+ if( !IsActive() )
+ {
+ iTimer.After(iStatus, 1000000); // once in second
+ SetActive();
+ }
+
+ VCXLOGLO1("<<<CIptvTestEventWaiter::AddEvent");
+ return KErrNone;
+}
+
+// -----------------------------------------------------------------------------
+// CIptvTestEventWaiter::EventHappened
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvTestEventWaiter::EventHappened(CIptvTestEvent* aEvent, CIptvTestEvent** aQueuedEvent)
+{
+ VCXLOGLO1(">>>CIptvTestEventWaiter::EventHappened");
+ TBool eventFound = EFalse;
+
+ // Check first from the queue.
+
+ VCXLOGLO1("Event queue:");
+
+ for(TInt i=0; i<iEventQueue.Count();i++)
+ {
+ CIptvTestEvent* event = iEventQueue[i];
+ TBuf<32> name;
+ event->GetName(name);
+ VCXLOGLO3(" queue %d: %S, %d", i, &name);
+ }
+
+ //CheckTimeouts();
+
+ if(iEventQueue.Count() > 0)
+ {
+ CIptvTestEvent* event = iEventQueue[0];
+ TBuf<32> name;
+ event->GetName(name);
+ VCXLOGLO2(" - %S", &name);
+
+ if( !eventFound && event->Compare( *aEvent ) )
+ {
+ iEventQueue.Remove( 0 );
+ if(iEventQueue.Count() > 0)
+ {
+ iEventQueue[0]->Activate();
+ }
+ iPastEvents.Append( event );
+ eventFound = ETrue;
+
+ *aQueuedEvent = event;
+
+ VCXLOGLO1("*Match*");
+ }
+ }
+
+ // Check if the event is in the dump, meaning it can happen any time.
+
+ VCXLOGLO1("Event dump:");
+
+ if(!eventFound)
+ {
+ for(TInt i=0; i<iEventDump.Count();i++)
+ {
+ CIptvTestEvent* event = iEventDump[i];
+
+ TBuf<32> name;
+ event->GetName(name);
+ VCXLOGLO2(" - %S", &name);
+
+ if( !eventFound && event->Compare( *aEvent ) )
+ {
+ iEventDump.Remove( i );
+ iPastEvents.Append( event );
+ eventFound = ETrue;
+ *aQueuedEvent = event;
+ VCXLOGLO1("*Match*");
+ }
+ }
+ }
+
+ // Event was found and there's no more events in queues. Message observer that all events are validated.
+
+ if( eventFound && iEventQueue.Count() == 0 && iEventDump.Count() == 0 )
+ {
+ iObserver.EventWaiterAllEventsValidated();
+ }
+
+ if( !eventFound )
+ {
+ VCXLOGLO1("CIptvTestEventWaiter:: Event not found from queues.");
+
+ if(iEventQueue.Count() > 0)
+ {
+ CIptvTestEvent* event = iEventQueue[0];
+ *aQueuedEvent = event;
+ }
+
+ VCXLOGLO1("<<<CIptvTestEventWaiter::EventHappened");
+ return KErrNotFound;
+ }
+
+ VCXLOGLO1("<<<CIptvTestEventWaiter::EventHappened");
+ return KErrNone;
+}
+
+// -----------------------------------------------------------------------------
+// CIptvTestEventWaiter::Reset
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvTestEventWaiter::Reset()
+{
+ VCXLOGLO1(">>>CIptvTestEventWaiter::Reset");
+ iEventQueue.ResetAndDestroy();
+ iEventDump.ResetAndDestroy();
+ iPastEvents.ResetAndDestroy();
+ VCXLOGLO1("<<<CIptvTestEventWaiter::Reset");
+ return KErrNone;
+}
+
+
+// -----------------------------------------------------------------------------
+// CIptvTestEventWaiter::GetEventCount
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvTestEventWaiter::GetEventCount()
+{
+ VCXLOGLO1(">>>CIptvTestEventWaiter::GetEventCount");
+ TInt count = 0;
+ count += iEventQueue.Count();
+ count += iEventDump.Count();
+ VCXLOGLO2("<<<CIptvTestEventWaiter:: events in queue: %d", count);
+
+ VCXLOGLO1("<<<CIptvTestEventWaiter::GetEventCount");
+ return count;
+}
+
+// -----------------------------------------------------------------------------
+// CIptvTestEventWaiter::CIptvTestEventWaiter
+// -----------------------------------------------------------------------------
+//
+CIptvTestEventWaiter::CIptvTestEventWaiter(MIptvTestEventWaiterObserver& aObserver)
+ : CActive(CActive::EPriorityStandard), iObserver(aObserver)
+{
+
+}
+
+// -----------------------------------------------------------------------------
+// CIptvTestEventWaiter::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CIptvTestEventWaiter::ConstructL()
+{
+ VCXLOGLO1(">>>CIptvTestEventWaiter::ConstructL");
+ User::LeaveIfError(iTimer.CreateLocal());
+ CActiveScheduler::Add(this);
+ VCXLOGLO1("<<<CIptvTestEventWaiter::ConstructL");
+}
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnectionWaiter::RunL()
+//
+// Handle request completion events
+// ---------------------------------------------------------------------------
+//
+void CIptvTestEventWaiter::RunL()
+ {
+ //VCXLOGLO1(">>>CIptvTestEventWaiter::RunL");
+
+// TInt statusCode = iStatus.Int();
+
+ CheckTimeouts();
+
+ // Start timer again if waiting for events
+
+ if(iEventQueue.Count() > 0 || iEventDump.Count() > 0)
+ {
+
+ if( !IsActive() )
+ {
+ iTimer.After(iStatus, 1000000); // once in second
+ SetActive();
+ }
+ }
+
+
+ //VCXLOGLO1("<<<CIptvTestEventWaiter::RunL");
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestEventWaiter::DoCancel()
+//
+// Cancels ongoing requests
+// ---------------------------------------------------------------------------
+//
+void CIptvTestEventWaiter::DoCancel()
+ {
+ VCXLOGLO1(">>>CIptvTestEventWaiter::DoCancel");
+ iTimer.Cancel();
+ VCXLOGLO1("<<<CIptvTestEventWaiter::DoCancel");
+ }
+
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/src/CIptvTestMobilecrashWatcher.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,299 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+// INCLUDE FILES
+
+#include <BAUTILS.H>
+#include <S32FILE.H>
+
+#include "CIptvTestMobilecrashWatcher.h"
+#include "VCXTestLog.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+_LIT(KDriveC, "C:\\");
+_LIT(KDriveE, "E:\\");
+_LIT(KDriveF, "F:\\");
+
+// -----------------------------------------------------------------------------
+// CIptvTestMobilecrashWatcher::
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestMobilecrashWatcher* CIptvTestMobilecrashWatcher::NewL()
+ {
+ VCXLOGLO1(">>>CIptvTestMobilecrashWatcher::NewL");
+ CIptvTestMobilecrashWatcher* self = new (ELeave) CIptvTestMobilecrashWatcher( );
+ CleanupStack::PushL(self);
+ self->ConstructL(ETrue);
+ CleanupStack::Pop();
+ VCXLOGLO1("<<<CIptvTestMobilecrashWatcher::NewL");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestMobilecrashWatcher::
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestMobilecrashWatcher* CIptvTestMobilecrashWatcher::NewL(TBool aPanicEnabled)
+ {
+ VCXLOGLO1(">>>CIptvTestMobilecrashWatcher::NewL");
+ CIptvTestMobilecrashWatcher* self = new (ELeave) CIptvTestMobilecrashWatcher( );
+ CleanupStack::PushL(self);
+ self->ConstructL(aPanicEnabled);
+ CleanupStack::Pop();
+ VCXLOGLO1("<<<CIptvTestMobilecrashWatcher::NewL");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestMobilecrashWatcher::~CIptvTestMobilecrashWatcher
+// destructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestMobilecrashWatcher::~CIptvTestMobilecrashWatcher()
+ {
+ VCXLOGLO1(">>>CIptvTestMobilecrashWatcher::~CIptvTestMobilecrashWatcher");
+
+ iCrashesBefore.ResetAndDestroy();
+ iCrashesNow.ResetAndDestroy();
+ iFsSession.Close();
+
+ VCXLOGLO1("<<<CIptvTestMobilecrashWatcher::~CIptvTestMobilecrashWatcher");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestMobilecrashWatcher::CIptvTestMobilecrashWatcher
+// -----------------------------------------------------------------------------
+//
+CIptvTestMobilecrashWatcher::CIptvTestMobilecrashWatcher()
+ {
+ VCXLOGLO1(">>>CIptvTestMobilecrashWatcher::CIptvTestMobilecrashWatcher");
+
+
+ VCXLOGLO1("<<<CIptvTestMobilecrashWatcher::CIptvTestMobilecrashWatcher");
+ }
+
+
+// -----------------------------------------------------------------------------
+// CIptvTestMobilecrashWatcher::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CIptvTestMobilecrashWatcher::ConstructL(TBool aPanicEnabled)
+ {
+ VCXLOGLO1(">>>CIptvTestMobilecrashWatcher::ConstructL");
+
+ iPanicEnabled = aPanicEnabled;
+ iFsSession.Connect();
+
+ iCrashesBefore.ResetAndDestroy();
+ TRAP_IGNORE( ReadMobilecrashesL(iCrashesBefore, KDriveC) );
+ TRAP_IGNORE( ReadMobilecrashesL(iCrashesBefore, KDriveE) );
+ TRAP_IGNORE( ReadMobilecrashesL(iCrashesBefore, KDriveF) );
+ VCXLOGLO1("<<<CIptvTestMobilecrashWatcher::ConstructL");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestMobilecrashWatcher::ReadMobilecrashesL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestMobilecrashWatcher::ReadMobilecrashesL( RPointerArray<HBufC>& aCrashes, const TDesC& aDrive )
+ {
+ VCXLOGLO1(">>>CIptvTestMobilecrashWatcher::ReadMobilecrashes");
+
+ CDir* dirList = NULL;
+
+ TBuf<KMaxFileName> path(aDrive);
+
+ if(aDrive == KDriveC)
+ {
+ path.Append(_L("data\\"));
+ }
+
+ path.Append(_L("*.*"));
+
+ if( !iFsSession.IsValidDrive(EDriveE) )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+ if ( iFsSession.GetDir( path, KEntryAttMatchExclude|KEntryAttDir, ESortByName, dirList ) == KErrNone )
+ {
+ CleanupStack::PushL( dirList );
+
+ for ( TInt file = 0; file < dirList->Count(); file++ )
+ {
+ HBufC* fileName = HBufC::NewL(KMaxFileName);
+ CleanupStack::PushL( fileName );
+
+ fileName->Des().Append(aDrive);
+ fileName->Des().Append((*dirList)[file].iName);
+
+ if(fileName->Des().FindF( _L("mobilecrash") ) >= 0)
+ {
+ CleanupStack::Pop( fileName );
+ aCrashes.Append(fileName);
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy( fileName );
+ }
+ }
+ CleanupStack::PopAndDestroy( dirList );
+ }
+
+ VCXLOGLO1("<<<CIptvTestMobilecrashWatcher::ReadMobilecrashes");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestMobilecrashWatcher::CompareMobilecrashesL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CIptvTestMobilecrashWatcher::CompareMobilecrashesL(RPointerArray<HBufC>& aCrashesBefore, RPointerArray<HBufC>& aCrashesNow)
+ {
+ VCXLOGLO1(">>>CIptvTestMobilecrashWatcher::CompareMobilecrashesL");
+ TBool newCrashes = EFalse;
+
+ TInt i = 0;
+ TInt e = 0;
+
+ VCXLOGLO2("CIptvTestMobilecrashWatcher:: crash files before: %d", aCrashesBefore.Count());
+ VCXLOGLO2("CIptvTestMobilecrashWatcher:: crash files now: %d", aCrashesNow.Count());
+
+ // remove crashesBefore from crashesNow
+
+ // Check is the mobilecrash log in the before array
+ for(e=0;e<aCrashesBefore.Count();e++)
+ {
+ for(i=0; i<aCrashesNow.Count(); i++)
+ {
+ TPtrC before = aCrashesBefore[e]->Des();
+ TPtrC now = aCrashesNow[i]->Des();
+
+ if(before == now )
+ {
+ HBufC* buf = aCrashesNow[i];
+ aCrashesNow.Remove(i);
+ delete buf;
+ break;
+ }
+ }
+ }
+
+ if(aCrashesNow.Count() > 0)
+ {
+ newCrashes = ETrue;
+ VCXLOGLO1("CIptvTestMobilecrashWatcher:: New mobilecrashes:");
+ for(i=0;i<aCrashesNow.Count(); i++)
+ {
+ TPtr16 file = aCrashesNow[i]->Des();
+ VCXLOGLO2("CIptvTestMobilecrashWatcher:: %S", &file);
+ }
+ }
+
+ VCXLOGLO1("<<<CIptvTestMobilecrashWatcher::CompareMobilecrashesL");
+ return newCrashes;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestMobilecrashWatcher::CheckNewCrashesL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestMobilecrashWatcher::CheckNewCrashesL()
+ {
+ VCXLOGLO1(">>>CIptvTestMobilecrashWatcher::CheckNewCrashesL");
+
+ iCrashesNow.ResetAndDestroy();
+ TRAP_IGNORE( ReadMobilecrashesL(iCrashesNow, KDriveC) );
+ TRAP_IGNORE( ReadMobilecrashesL(iCrashesNow, KDriveE) );
+ TRAP_IGNORE( ReadMobilecrashesL(iCrashesNow, KDriveF) );
+ if( CompareMobilecrashesL(iCrashesBefore, iCrashesNow) )
+ {
+ VCXLOGLO1("CIptvTestMobilecrashWatcher:: * ERROR * There's new mobilecrashes, panicing!");
+ User::Panic(_L("New mobilecrash log"), KErrGeneral);
+ }
+
+ VCXLOGLO1("<<<CIptvTestMobilecrashWatcher::CheckNewCrashesL");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestMobilecrashWatcher::ReturnNewCrashes()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CIptvTestMobilecrashWatcher::ReturnNewCrashes(RPointerArray<HBufC>& aArray)
+ {
+ VCXLOGLO1(">>>CIptvTestMobilecrashWatcher::CheckNewCrashesL");
+
+ aArray.ResetAndDestroy();
+ TRAP_IGNORE( ReadMobilecrashesL(aArray, KDriveC) );
+ TRAP_IGNORE( ReadMobilecrashesL(aArray, KDriveE) );
+ TRAP_IGNORE( ReadMobilecrashesL(aArray, KDriveF) );
+ TBool newCrashes = CompareMobilecrashesL(iCrashesBefore, aArray);
+ if( newCrashes )
+ {
+ VCXLOGLO1("CIptvTestMobilecrashWatcher:: * ERROR * There's new mobilecrashes!");
+ }
+
+ VCXLOGLO1("<<<CIptvTestMobilecrashWatcher::CheckNewCrashesL");
+ return newCrashes;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestMobilecrashWatcher::ReturnMobileCrashCount()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvTestMobilecrashWatcher::ReturnMobileCrashCount()
+ {
+ VCXLOGLO1(">>>CIptvTestMobilecrashWatcher::ReturnMobileCrashCount");
+
+ RPointerArray<HBufC> array;
+
+ array.ResetAndDestroy();
+ TRAP_IGNORE( ReadMobilecrashesL(array, KDriveC) );
+ TRAP_IGNORE( ReadMobilecrashesL(array, KDriveE) );
+ TRAP_IGNORE( ReadMobilecrashesL(array, KDriveF) );
+ TInt count = array.Count();
+ array.ResetAndDestroy();
+
+ VCXLOGLO1("<<<CIptvTestMobilecrashWatcher::ReturnMobileCrashCount");
+ return count;
+ }
+
+// ---------------------------------
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/src/CIptvTestTimer.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,184 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "CIptvTestTimer.h"
+#include "MIptvTestTimerObserver.h"
+#include "VCXTestLog.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CIptvTestTimer::
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestTimer* CIptvTestTimer::NewL(MIptvTestTimerObserver& aObserver, TInt aId)
+ {
+ VCXLOGLO1(">>>CIptvTestTimer::NewL");
+ CIptvTestTimer* self = new (ELeave) CIptvTestTimer(aObserver, aId);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ VCXLOGLO1("<<<CIptvTestTimer::NewL");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestTimer::~CIptvTestTimer
+// destructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestTimer::~CIptvTestTimer()
+ {
+ VCXLOGLO1(">>>CIptvTestTimer::~CIptvTestTimer");
+ iRestartAfterCancel = EFalse;
+ Cancel();
+ iTimer.Close();
+
+ if( IsAdded() )
+ {
+ Deque(); // calls also Cancel()
+ }
+
+ VCXLOGLO1("<<<CIptvTestTimer::~CIptvTestTimer");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestTimer::~CIptvTestTimer
+// destructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestTimer::CancelTimer()
+ {
+ VCXLOGLO1(">>>CIptvTestTimer::CancelTimer");
+ if( IsActive() )
+ {
+ iRestartAfterCancel = EFalse;
+ Cancel();
+ }
+ VCXLOGLO1("<<<CIptvTestTimer::CancelTimer");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestTimer::CIptvTestTimer
+//
+// -----------------------------------------------------------------------------
+//
+CIptvTestTimer::CIptvTestTimer(MIptvTestTimerObserver& aObserver, TInt aId) : CActive(EPriorityStandard), iObserver(aObserver),
+ iId(aId)
+ {
+ VCXLOGLO1(">>>CIptvTestTimer::CIptvTestTimer");
+ CActiveScheduler::Add(this);
+ VCXLOGLO1("<<<CIptvTestTimer::CIptvTestTimer");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestTimer::ConstructL
+//
+// -----------------------------------------------------------------------------
+//
+void CIptvTestTimer::ConstructL()
+ {
+ VCXLOGLO1(">>>CIptvTestTimer::ConstructL");
+ User::LeaveIfError(iTimer.CreateLocal());
+ VCXLOGLO1("<<<CIptvTestTimer::ConstructL");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestTimer::After
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestTimer::After(TTimeIntervalMicroSeconds32 aInterval)
+ {
+
+ iInterval = aInterval;
+
+if( !IsActive() )
+ {
+ VCXLOGLO2("CIptvTestTimer::After: Setting active. (%d)", this);
+ iTimer.After( iStatus, aInterval );
+ SetActive();
+ iRestartAfterCancel = EFalse;
+ }
+ else
+ {
+ // Cancel and start again when cancel is done.
+ VCXLOGLO2("CIptvTestTimer::After: Restarting! (%d)", this);
+ iRestartAfterCancel = ETrue;
+ iTimer.Cancel();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestTimer::RunL
+//
+// -----------------------------------------------------------------------------
+//
+void CIptvTestTimer::RunL()
+ {
+ TInt status = iStatus.Int();
+
+ if( status == KErrNone )
+ {
+ iObserver.TimerComplete( iId, iStatus.Int() );
+ }
+ else
+ if( status == KErrCancel && iRestartAfterCancel )
+ {
+ iRestartAfterCancel = EFalse;
+ iTimer.After( iStatus, iInterval );
+ SetActive();
+ VCXLOGLO2("CIptvTestTimer::RunL: Restarted! (%d)", this);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestTimer::DoCancel
+//
+// -----------------------------------------------------------------------------
+//
+void CIptvTestTimer::DoCancel()
+ {
+ VCXLOGLO1(">>>CIptvTestTimer::DoCancel");
+ iTimer.Cancel();
+ VCXLOGLO1("<<<CIptvTestTimer::DoCancel");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/src/CIptvTestVerifyData.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,762 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+// INCLUDE FILES
+
+#include <zipfile.h>
+
+#include "CIptvTestVerifyData.h"
+#include "VCXTestLog.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+_LIT(KDriveC, "C:\\");
+_LIT(KLineBreak, "\r\n");
+
+_LIT(KPathVerifyWrite, "testing\\data\\verifynew\\");
+_LIT(KVerifyExtension, ".txt");
+
+// -----------------------------------------------------------------------------
+// CVerifyFile::NewL
+// -----------------------------------------------------------------------------
+//
+CVerifyFile* CVerifyFile::NewL()
+ {
+ CVerifyFile* self = new (ELeave) CVerifyFile();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVerifyFile::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CVerifyFile::ConstructL()
+ {
+ iFs.Connect();
+ iId.Zero();
+ }
+
+// -----------------------------------------------------------------------------
+// CVerifyFile::CVerifyFile
+// -----------------------------------------------------------------------------
+//
+CVerifyFile::CVerifyFile()
+ {
+
+ }
+
+// -----------------------------------------------------------------------------
+// CVerifyFile::~CVerifyFile
+// -----------------------------------------------------------------------------
+//
+CVerifyFile::~CVerifyFile()
+ {
+ delete iFileName;
+ iFileName = NULL;
+ CloseFileHandles();
+ iFs.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// CVerifyFile::CloseFileHandles
+// -----------------------------------------------------------------------------
+//
+void CVerifyFile::CloseFileHandles()
+ {
+ VCXLOGLO1(">>>CVerifyFile::CloseFileHandles");
+ if(iFileOpen)
+ {
+ iFile.Close();
+ iFileStream.Close();
+ }
+ iFileOpen = EFalse;
+ VCXLOGLO1("<<<CVerifyFile::CloseFileHandles");
+ }
+
+// -----------------------------------------------------------------------------
+// CVerifyFile::ResolveFileName
+// -----------------------------------------------------------------------------
+//
+void CVerifyFile::ResolveFileName()
+ {
+ if(iFileName == NULL)
+ {
+ iFileName = HBufC::NewL(256);
+ }
+ else
+ {
+ return;
+ }
+
+ VCXLOGLO1(">>>CVerifyFile::ResolveFileName");
+
+ iFileName->Des().Zero();
+
+ iFileName->Des().Append(KDriveC);
+
+ iFileName->Des().Append(KPathVerifyWrite);
+
+ BaflUtils::EnsurePathExistsL(iFs, iFileName->Des());
+
+ iFileName->Des().Append(iId);
+ iFileName->Des().Append(KVerifyExtension);
+
+ VCXLOGLO1("<<CVerifyFile::ResolveFileName");
+ }
+
+// -----------------------------------------------------------------------------
+// CVerifyFile::OpenStream
+// -----------------------------------------------------------------------------
+//
+void CVerifyFile::OpenStream()
+ {
+ if(iFileOpen)
+ {
+ return;
+ }
+
+ VCXLOGLO1(">>>CVerifyFile::OpenStream");
+
+ ResolveFileName();
+
+ // create the stream
+
+ TInt filePos = 0;
+ if(BaflUtils::FileExists(iFs, iFileName->Des()))
+ {
+ TInt result = iFile.Open(iFs, iFileName->Des(), EFileShareAny | EFileWrite | EFileStreamText);
+ if(result != KErrNone)
+ {
+ TPtrC fileName = iFileName->Des();
+ VCXLOGLO2("Could not open file: %S", &fileName);
+ VCXLOGLO1("<<<CIptvTestVerifyData::WriteVerifyData");
+ iFile.Close();
+ User::Leave(result);
+ }
+ iFile.Seek(ESeekEnd, filePos);
+
+ iFileStream.Attach(iFile, filePos);
+ }
+ else
+ {
+ User::Leave(KErrCorrupt);
+ }
+
+ iFileOpen = ETrue;
+ VCXLOGLO1("<<<CVerifyFile::OpenStream");
+ }
+
+// -----------------------------------------------------------------------------
+// CVerifyFile::CreateNewFile
+// -----------------------------------------------------------------------------
+//
+void CVerifyFile::CreateNewFile()
+ {
+ ResolveFileName();
+
+ VCXLOGLO1(">>>CVerifyFile::CreateNewFile");
+
+ if(BaflUtils::FileExists(iFs, iFileName->Des() ))
+ {
+ iFs.Delete(iFileName->Des());
+ }
+
+ if(KErrNone == iFile.Create(iFs, iFileName->Des(), EFileShareAny | EFileWrite | EFileStreamText))
+ {
+ iFile.Close();
+ }
+
+ VCXLOGLO1("<<<CVerifyFile::CreateNewFile");
+ }
+
+// -----------------------------------------------------------------------------
+// CVerifyFile::WriteData
+// -----------------------------------------------------------------------------
+//
+void CVerifyFile::WriteData(TDesC& aData)
+ {
+ OpenStream();
+
+ iFileStream.WriteL(aData);
+ }
+
+// -----------------------------------------------------------------------------
+// CVerifyFile::GetFileToWrite
+// -----------------------------------------------------------------------------
+//
+void CVerifyFile::GetFileToWrite(TDes& aFileName)
+ {
+ ResolveFileName();
+
+ if(iFileName->Des().Length() > 0)
+ {
+ aFileName = iFileName->Des();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestVerifyData::
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestVerifyData* CIptvTestVerifyData::NewL()
+ {
+ VCXLOGLO1(">>>CIptvTestVerifyData::NewL");
+ CIptvTestVerifyData* self = new (ELeave) CIptvTestVerifyData( );
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ VCXLOGLO1("<<<CIptvTestVerifyData::NewL");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestVerifyData::~CIptvTestVerifyData
+// destructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestVerifyData::~CIptvTestVerifyData()
+ {
+ VCXLOGLO1(">>>CIptvTestVerifyData::~CIptvTestVerifyData");
+
+ delete iZipFile;
+ iZipFile = NULL;
+
+ iFs.Close();
+
+ iVerifyFiles.ResetAndDestroy();
+
+ delete iBuffer;
+ iBuffer = NULL;
+
+ VCXLOGLO1("<<<CIptvTestVerifyData::~CIptvTestVerifyData");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestVerifyData::GetVerifyFileIndex
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestVerifyData::GetVerifyFileIndex(TInt& aIndex, TDesC& aVerifyId)
+ {
+ aIndex = -1;
+
+ TInt i;
+
+ for(i=0; i<iVerifyFiles.Count(); i++)
+ {
+ if(iVerifyFiles[i]->iId == aVerifyId)
+ {
+ aIndex = i;
+ }
+ }
+
+ if(aIndex == -1)
+ {
+ return KErrNotFound;
+ }
+
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestVerifyData::CreateVerifyData
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvTestVerifyData::CreateVerifyDataL(TDesC& aVerifyId, TBool aAppend)
+ {
+ VCXLOGLO1(">>>CIptvTestVerifyData::CreateVerifyData");
+
+ if(aVerifyId.Length() <= 0)
+ {
+ VCXLOGLO1("No verify Id");
+ VCXLOGLO1("<<<CIptvTestVerifyData::CreateVerifyData");
+ return KErrNone;
+ }
+
+//BAFL::EnsurePathExistsL
+
+ TInt result = KErrNone;
+
+ TInt index;
+
+ if(KErrNone != GetVerifyFileIndex(index, aVerifyId))
+ {
+ CVerifyFile *vf = CVerifyFile::NewL();
+ vf->iId = aVerifyId;
+ iVerifyFiles.Append(vf);
+ if(KErrNone != GetVerifyFileIndex(index, aVerifyId))
+ {
+ VCXLOGLO1("CIptvTestVerifyData:: Verify file not found even after creating one.");
+ VCXLOGLO1("<<<CIptvTestVerifyData::CreateVerifyData");
+ return KErrGeneral;
+ }
+ }
+
+ TBuf<256> fileName;
+
+ if(!aAppend)
+ {
+ iVerifyFiles[index]->CreateNewFile();
+ }
+
+ iVerifyFiles[index]->GetFileToWrite(fileName);
+
+ VCXLOGLO2("CIptvTestVerifyData:: writePath %S", &fileName);
+
+ VCXLOGLO1("<<<CIptvTestVerifyData::CreateVerifyData");
+ return result;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CIptvTestVerifyData::WriteVerifyData
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvTestVerifyData::WriteVerifyDataL(TDesC& aVerifyId, TDesC& aVerifyData)
+ {
+ TInt index;
+
+ if(KErrNone != GetVerifyFileIndex(index, aVerifyId))
+ {
+ //VCXLOGLO1("Call to WriteVerifyData before CreateVerifyData is called.");
+ //VCXLOGLO1("<<<CIptvTestVerifyData::WriteVerifyData");
+ return KErrNone;
+ }
+
+// VCXLOGLO1(">>>CIptvTestVerifyData::WriteVerifyData");
+
+ iBuffer->Des().Zero();
+
+ if( iUseTimestamps )
+ {
+ _LIT(KDateTimeString,"%D%M%Y%/0%1%/1%2%/2%3%/3 %-B%:0%H%:1%T%:2%S%.%*C2%:3%-B");
+ TBuf<128> timeString;
+ TTime time;
+ time.HomeTime();
+ TBuf<128> buff;
+ time.FormatL( buff, KDateTimeString );
+ iBuffer->Des().Append( buff );
+ iBuffer->Des().Append( _L(" ") );
+ }
+
+ iBuffer->Des().Append( aVerifyData );
+
+ TInt result = KErrNone;
+ iVerifyFiles[index]->WriteData( *iBuffer );
+ TBuf<12> lineChange(KLineBreak);
+ iVerifyFiles[index]->WriteData( lineChange );
+
+// VCXLOGLO1("<<<CIptvTestVerifyData::WriteVerifyData");
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestVerifyData::VerifyData
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvTestVerifyData::VerifyDataL(TDesC& aVerifyId, TVerifyResult& aVerifyResult)
+ {
+ // Get index for the verified file info
+ // If not found then exit w/o error
+ TInt index;
+
+ if(KErrNone != GetVerifyFileIndex(index, aVerifyId))
+ {
+ VCXLOGLO1("CIptvTestVerifyData::VerifyDataL - Data verifying is not enabled.");
+ aVerifyResult = EVerifiedFileNotFound;
+ return KErrNone;
+ }
+
+ VCXLOGLO1(">>>CIptvTestVerifyData::VerifyData");
+
+ TInt result = KErrNone;
+ aVerifyResult = EVerifyOk;
+
+ // Connect to file system
+ TBuf<256> fileNameRead( _L("c:\\testing\\data\\iptvtempverify.txt") ); // File which is extracted from verify.zip
+ TBuf<256> fileNameWrite; // File which is written during the test
+
+ TRAPD( err, ExtractVerifyFileL( aVerifyId, fileNameRead ) );
+ if( err != KErrNone )
+ {
+ VCXLOGLO2("CIptvTestVerifyData:: verify file extract failed: %d", err);
+ VCXLOGLO1("<<<CIptvTestVerifyData::VerifyDataL");
+ aVerifyResult = EVerifiedFileNotFound;
+ return KErrNone;
+ }
+
+ iVerifyFiles[index]->GetFileToWrite(fileNameWrite);
+ iVerifyFiles[index]->CloseFileHandles();
+
+ // Check that the files exist
+
+ if(!BaflUtils::FileExists(iFs, fileNameRead))
+ {
+ VCXLOGLO2("File used to verify data not found. %S must be verified by hand and added to the verify.zip.", &fileNameWrite);
+ VCXLOGLO1("<<<CIptvTestVerifyData::VerifyDataL");
+ aVerifyResult = EVerifiedFileNotFound;
+ return KErrNone;
+ }
+
+ if(!BaflUtils::FileExists(iFs, fileNameWrite))
+ {
+ VCXLOGLO2("File %S not found. This should not happen.", &fileNameWrite);
+ VCXLOGLO1("<<<CIptvTestVerifyData::VerifyDataL");
+ aVerifyResult = EVerifiedFileNotFound;
+ return KErrNone;
+ }
+
+ // Open files and do comparison line by line
+
+ // Verified file from installation
+ RFile fileFromInst;
+ TFileText fromInst;
+ HBufC* lineFromInstBuff = HBufC::NewL( 1024 * 4 );
+ CleanupStack::PushL( lineFromInstBuff );
+ TPtr lineFromInst( lineFromInstBuff->Des() );
+
+ // File from test case
+ RFile fileFromTest;
+ TFileText fromTest;
+ HBufC* lineFromTestBuff = HBufC::NewL( 1024 * 4 );
+ CleanupStack::PushL( lineFromTestBuff );
+ TPtr lineFromTest( lineFromTestBuff->Des() );
+
+ result = fileFromInst.Open(iFs, fileNameRead, EFileRead | EFileStreamText);
+ if(result != KErrNone)
+ {
+ VCXLOGLO2("Could not open file 1: %S", &fileNameRead);
+ CleanupStack::PopAndDestroy( lineFromTestBuff );
+ CleanupStack::PopAndDestroy( lineFromInstBuff );
+ VCXLOGLO1("<<<CIptvTestVerifyData::VerifyDataL");
+ aVerifyResult = ESystemError;
+ return result;
+ }
+ CleanupClosePushL(fileFromInst);
+
+ result = fileFromTest.Open(iFs, fileNameWrite, EFileRead | EFileStreamText);
+ if(result != KErrNone)
+ {
+ VCXLOGLO2("Could not open file 2: %S", &fileNameRead);
+ VCXLOGLO1("<<<CIptvTestVerifyData::VerifyDataL");
+ aVerifyResult = ESystemError;
+ CleanupStack::PopAndDestroy(&fileFromInst);
+ CleanupStack::PopAndDestroy( lineFromTestBuff );
+ CleanupStack::PopAndDestroy( lineFromInstBuff );
+ return result;
+ }
+ CleanupClosePushL(fileFromTest);
+
+ TInt lineNumber(0);
+ TInt totalResult(0);
+ TInt32 totalLength(0);
+
+ fromInst.Set(fileFromInst);
+ fromTest.Set(fileFromTest);
+
+ while(result == KErrNone)
+ {
+ TInt result2(KErrNone);
+
+ result = fromInst.Read(lineFromInst);
+ result2 = fromTest.Read(lineFromTest);
+
+ // End of file reached for both files. No differences.
+ if(result == KErrEof && result2 == KErrEof)
+ {
+ result = KErrNone;
+ break;
+ }
+
+ // Eof reached only for one file. Verify failed.
+ if( result == KErrEof )
+ {
+ aVerifyResult = EVerifyFailed;
+ VCXLOGLO1("End of file reached for installed verify file!");
+ break;
+ }
+ else if( result2 == KErrEof )
+ {
+ aVerifyResult = EVerifyFailed;
+ VCXLOGLO1("End of file reached for test verify file!");
+ break;
+ }
+
+ // Error reading the files.
+ if(result != KErrNone && result != KErrTooBig)
+ {
+ VCXLOGLO3("CIptvTestVerifyData:: reading file (test) failed at line: %d, result: %d", lineNumber, result);
+ break;
+ }
+
+ if(result2 != KErrNone && result2 != KErrTooBig)
+ {
+ VCXLOGLO3("CIptvTestVerifyData:: reading file (test) failed at line: %d, result: %d", lineNumber, result);
+ result = result2;
+ break;
+ }
+
+ totalLength += lineFromInst.Length();
+
+ // Don't compare if line is for path because it can have service id which varies
+ if( KErrNotFound != lineFromTest.Match(_L("*\\Data\\videocenter\\*")) && KErrNotFound != lineFromTest.Match(_L("*\\Data\\videocenter\\*")) )
+ {
+ TInt res = lineFromInst.Compare(lineFromTest);
+ if(res < 0)
+ {
+ totalResult += (res *- 1);
+ }
+ else
+ {
+ totalResult += res;
+ }
+
+ if(res != KErrNone)
+ {
+ VCXLOGLO3("CIptvTestVerifyData:: Lines at line %d are different. Res: %d", lineNumber, res);
+ VCXLOGLO2("CIptvTestVerifyData:: %S", &lineFromInst);
+ VCXLOGLO2("CIptvTestVerifyData:: %S", &lineFromTest);
+ aVerifyResult = EVerifyFailed;
+ break; // No more verifying
+ }
+ }
+
+ lineNumber++;
+ }
+
+ VCXLOGLO2("CIptvTestVerifyData:: %d lines verified.", lineNumber);
+ VCXLOGLO2("CIptvTestVerifyData:: %d total length of file.", totalLength);
+ VCXLOGLO2("CIptvTestVerifyData:: %d total difference.", totalResult);
+
+ CleanupStack::PopAndDestroy(&fileFromTest);
+ CleanupStack::PopAndDestroy(&fileFromInst);
+ CleanupStack::PopAndDestroy( lineFromTestBuff );
+ CleanupStack::PopAndDestroy( lineFromInstBuff );
+
+ VCXLOGLO1("<<<CIptvTestVerifyData::VerifyData");
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestVerifyData::VerifyData
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestVerifyData::EnableTimestamps( TBool aUseTimestamps )
+ {
+ iUseTimestamps = aUseTimestamps;
+ }
+// -----------------------------------------------------------------------------
+// CIptvTestVerifyData::CIptvTestVerifyData
+// -----------------------------------------------------------------------------
+//
+CIptvTestVerifyData::CIptvTestVerifyData()
+ {
+ VCXLOGLO1(">>>CIptvTestVerifyData::CIptvTestVerifyData");
+
+ VCXLOGLO1("<<<CIptvTestVerifyData::CIptvTestVerifyData");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestVerifyData::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CIptvTestVerifyData::ConstructL()
+ {
+ VCXLOGLO1(">>>CIptvTestVerifyData::ConstructL");
+ iVerifyFiles.ResetAndDestroy();
+ User::LeaveIfError( iFs.Connect() );
+ TRAPD(err, iZipFile = CZipFile::NewL( iFs, KIptvVerifyZipFile ) );
+ if( err == KErrNoMemory )
+ {
+ User::Leave( err );
+ }
+ if( err != KErrNone )
+ {
+ VCXLOGLO2("CIptvTestVerifyData:: CZipFile::NewL err: %d", err);
+ delete iZipFile;
+ iZipFile = NULL;
+ }
+
+ iBuffer = HBufC::NewL( 1024 * 5 );
+
+ VCXLOGLO1("<<<CIptvTestVerifyData::ConstructL");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestVerifyData::ReadFile()
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestVerifyData::ReadFileL(RFs& aFs, TDes& aFileName, HBufC8** aBuff, TVerifyResult& aVerifyResult)
+ {
+ VCXLOGLO2(">>>CIptvTestVerifyData::ReadFile: %S", &aFileName);
+
+ TInt result = KErrNone;
+ RFile file;
+ TInt fileSize;
+
+ result = file.Open(aFs, aFileName, EFileRead | EFileStreamText);
+ if(result != KErrNone)
+ {
+ VCXLOGLO2("Could not open file 1: %S", &aFileName);
+ VCXLOGLO1("<<<CIptvTestVerifyData::VerifyDataL");
+ aVerifyResult = ESystemError;
+ return result;
+ }
+ CleanupClosePushL(file);
+
+ file.Size(fileSize);
+
+ TInt filePos = 0;
+ file.Seek(ESeekStart, filePos);
+
+ HBufC8* buff = HBufC8::NewL( fileSize);
+
+ TPtr8 ptr( buff->Des() );
+ file.Read(ptr);
+
+ *aBuff = buff;
+
+ CleanupStack::PopAndDestroy(&file);
+
+ VCXLOGLO1("<<<CIptvTestVerifyData::ReadFile");
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestVerifyData::ExtractVerifyFile()
+// -----------------------------------------------------------------------------
+//
+void CIptvTestVerifyData::ExtractVerifyFileL( TDesC& aVerifyId, const TDesC& aDestFile )
+ {
+ VCXLOGLO1(">>>CIptvTestVerifyData::ExtractVerifyFile");
+
+ iFs.Delete( aDestFile );
+
+ if( !iZipFile )
+ {
+ VCXLOGLO1("CIptvTestVerifyData:: iZipFile == NULL! Leaving..");
+ User::Leave( KErrNotReady );
+ }
+
+ TBuf<256> verifyFileName( aVerifyId );
+ verifyFileName.Append( KVerifyExtension );
+ VCXLOGLO2("CIptvTestVerifyData:: verifyFileName: %S", &verifyFileName);
+ VCXLOGLO2("CIptvTestVerifyData:: aDestFile: %S", &aDestFile);
+
+ if( !FileExistsInZip( iZipFile, verifyFileName ) )
+ {
+ VCXLOGLO1("CIptvTestVerifyData:: No such file in zip! Leaving..");
+ User::Leave( CIptvTestVerifyData::EVerifiedFileNotFound );
+ }
+
+ // Get zip file member from the archive
+ VCXLOGLO1("CIptvTestVerifyData:: Get zip file member from the archive");
+ CZipFileMember* member = iZipFile->CaseInsensitiveMemberL( verifyFileName );
+ if( member == NULL )
+ {
+ VCXLOGLO1("CIptvTestVerifyData:: zip member is null. Leaving..");
+ User::Leave(KErrGeneral);
+ }
+ CleanupStack::PushL( member );
+
+ // Get read stream for the file
+ VCXLOGLO1("CIptvTestVerifyData:: Get read stream for the file");
+ RZipFileMemberReaderStream* stream;
+ iZipFile->GetInputStreamL( member, stream );
+ CleanupStack::PushL( stream );
+
+ // Alloc buffer and read the archived file
+ VCXLOGLO1("CIptvTestVerifyData:: Alloc buffer and read the archived file");
+ HBufC8* buffer = HBufC8::NewLC( member->UncompressedSize() );
+ TPtr8 bufferPtr( buffer->Des() );
+ User::LeaveIfError( stream->Read( bufferPtr, member->UncompressedSize() ) );
+
+ // Write the file to the filesystem
+ VCXLOGLO1("CIptvTestVerifyData:: Write the file to the filesystem");
+ RFile file;
+ User::LeaveIfError( file.Replace( iFs, aDestFile, EFileWrite ) );
+ CleanupClosePushL( file );
+ User::LeaveIfError( file.Write(*buffer) );
+
+ CleanupStack::PopAndDestroy( &file );
+ CleanupStack::PopAndDestroy( buffer );
+ CleanupStack::PopAndDestroy( stream );
+ CleanupStack::PopAndDestroy( member );
+
+ VCXLOGLO1("<<<CIptvTestVerifyData::ExtractVerifyFile");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestVerifyData::FileExistsInZip()
+// -----------------------------------------------------------------------------
+//
+TBool CIptvTestVerifyData::FileExistsInZip( CZipFile* aZipFile, const TDesC& aFileName )
+ {
+ VCXLOGLO1(">>>CIptvTestVerifyData::FileExistsInZip");
+
+ CZipFileMember* member = NULL;
+
+ VCXLOGLO1("CIptvTestVerifyData:: list of members");
+ CZipFileMemberIterator* members = aZipFile->GetMembersL();
+
+ VCXLOGLO1("CIptvTestVerifyData:: loop all members");
+
+ while ((member = members->NextL()) != 0)
+ {
+ VCXLOGLO3("CIptvTestVerifyData:: member %S, size: %d", &(*member->Name()), member->CompressedSize());
+
+ if( aFileName == (*member->Name()) )
+ {
+ delete member;
+ delete members;
+ VCXLOGLO1("<<<CIptvTestVerifyData::FileExistsInZip");
+ return ETrue;
+ }
+
+ delete member;
+ }
+
+ delete members;
+ VCXLOGLO1("<<<CIptvTestVerifyData::FileExistsInZip");
+ return EFalse;
+ }
+
+// ---------------------------------
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/src/CIptvTestVideoCreator.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,363 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+// INCLUDES
+#include <f32file.h>
+#include <BAUTILS.H>
+
+#include "CIptvTestVideoCreator.h"
+#include "VCXTestLog.h"
+
+// -----------------------------------------------------------------------------
+// NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestVideoCreator* CIptvTestVideoCreator::NewL()
+ {
+ CIptvTestVideoCreator* self;
+ self = new (ELeave) CIptvTestVideoCreator();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestVideoCreator
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestVideoCreator::~CIptvTestVideoCreator()
+ {
+ delete iFileMan;
+ iFileMan = NULL;
+ iFs.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestVideoCreator
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestVideoCreator::CIptvTestVideoCreator()
+ {
+
+ }
+
+// -----------------------------------------------------------------------------
+// ConstructL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestVideoCreator::ConstructL()
+ {
+ User::LeaveIfError( iFs.Connect() );
+ iFileMan = CFileMan::NewL( iFs );
+ }
+
+// -----------------------------------------------------------------------------
+// CreateVideoL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestVideoCreator::CreateVideoL(CIptvTestVideoCreator::TIptvTestVideoType aVideoType, TDesC& aFileName, TInt aSize)
+ {
+ VCXLOGLO1(">>>CIptvTestVideoCreator::CreateVideoL");
+
+ // Resolve source filename
+ TBuf<256> srcFileName;
+
+ GetVideoFile( srcFileName, aVideoType, _L("C") );
+ if( !BaflUtils::FileExists(iFs, srcFileName) )
+ {
+ VCXLOGLO2("CIptvTestVideoCreator:: %S does not exist.", &srcFileName);
+ GetVideoFile( srcFileName, aVideoType, _L("E") );
+ if( !BaflUtils::FileExists(iFs, srcFileName) )
+ {
+ VCXLOGLO2("CIptvTestVideoCreator:: %S does not exist.", &srcFileName);
+ VCXLOGLO2("CIptvTestVideoCreator:: test video file %S missing! PANIC.", &srcFileName);
+ User::Panic(_L("Video files missing!"), KErrNotFound);
+ }
+ }
+
+ BaflUtils::EnsurePathExistsL( iFs, aFileName.Left( aFileName.LocateReverse('\\') ) );
+
+ BaflUtils::DeleteFile( iFs, aFileName );
+
+ VCXLOGLO2("CIptvTestVideoCreator:: aSize = %d", aSize);
+
+ TInt64 wantedSize( 0 );
+
+ // Check the size
+ if( aSize == KVcxTestLargeFile3GB ) {
+ wantedSize = 3000000000;
+ }
+ else {
+ wantedSize = aSize;
+ }
+
+ //wantedSize = wantedSize == 0 ? wantedSize -1 : wantedSize;
+
+ VCXLOGLO2("CIptvTestVideoCreator:: Wanted file size: %Ld", wantedSize);
+
+ // Read source file into memory, won't work on huge files.
+ RFile64 srcFile;
+ VCXLOGLO2("CIptvTestVideoCreator:: Opening %S", &srcFileName);
+ User::LeaveIfError( srcFile.Open( iFs, srcFileName, EFileRead ) );
+ CleanupClosePushL( srcFile );
+
+ TInt64 srcSize(0);
+ VCXLOGLO2("CIptvTestVideoCreator:: Getting size of %S", &srcFileName);
+ User::LeaveIfError( srcFile.Size( srcSize ) );
+
+ HBufC8* data = HBufC8::NewL( srcSize );
+ TPtr8 ptr( data->Des() );
+ srcFile.Read( ptr, srcSize );
+ CleanupStack::PopAndDestroy( &srcFile );
+
+ CleanupStack::PushL( data );
+
+ // Write new file.
+ RFile64 dstFile;
+ VCXLOGLO1("CIptvTestVideoCreator:: Replace");
+ User::LeaveIfError( dstFile.Replace( iFs, aFileName, EFileWrite ) );
+ CleanupClosePushL(dstFile);
+
+ if( wantedSize <= srcSize )
+ {
+ if( wantedSize == -1 )
+ {
+ VCXLOGLO2("CIptvTestVideoCreator:: Writing %Ld", srcSize);
+ User::LeaveIfError( dstFile.Write( *data, srcSize ) );
+ }
+ else
+ {
+ VCXLOGLO2("CIptvTestVideoCreator:: Writing %Ld", wantedSize);
+ User::LeaveIfError( dstFile.Write( *data, wantedSize ) );
+ }
+ }
+ else
+ {
+ VCXLOGLO2("CIptvTestVideoCreator:: Writing %Ld", srcSize);
+ User::LeaveIfError( dstFile.Write( *data, srcSize ) );
+
+ const TInt KIptvTest200Kilos = 1024*200;
+ HBufC8* buff = HBufC8::NewL( KIptvTest200Kilos );
+ buff->Des().SetLength( KIptvTest200Kilos );
+ CleanupStack::PushL( buff );
+ TInt64 bytesToWrite = wantedSize - srcSize;
+ while( bytesToWrite > 0 )
+ {
+ if( bytesToWrite >= KIptvTest200Kilos )
+ {
+ bytesToWrite -= KIptvTest200Kilos;
+ User::LeaveIfError( dstFile.Write( *buff ) );
+ }
+ else
+ {
+ User::LeaveIfError( dstFile.Write( *buff, bytesToWrite ) );
+ bytesToWrite = 0;
+ }
+ }
+ CleanupStack::PopAndDestroy( buff );
+ }
+
+ CleanupStack::PopAndDestroy( &dstFile );
+ CleanupStack::PopAndDestroy( data );
+
+ VCXLOGLO1("<<<CIptvTestVideoCreator::CreateVideoL");
+ }
+
+
+// -----------------------------------------------------------------------------
+// CreateVideosL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestVideoCreator::CreateVideosL(CIptvTestVideoCreator::TIptvTestVideoType aVideoType, TDesC& aFileName, TInt aCount, RPointerArray<HBufC>& aFileArray )
+ {
+ VCXLOGLO1(">>>CIptvTestVideoCreator::CreateVideosL");
+
+ // Resolve source filename
+ TBuf<256> srcFileName;
+
+ GetVideoFile( srcFileName, aVideoType, _L("C") );
+
+ if( !BaflUtils::FileExists(iFs, srcFileName) )
+ {
+ VCXLOGLO2("CIptvTestVideoCreator:: %S does not exist.", &srcFileName);
+ GetVideoFile( srcFileName, aVideoType, _L("E") );
+ if( !BaflUtils::FileExists(iFs, srcFileName) )
+ {
+ VCXLOGLO2("CIptvTestVideoCreator:: %S does not exist.", &srcFileName);
+ VCXLOGLO2("CIptvTestVideoCreator:: test video file %S missing! PANIC.", &srcFileName);
+ // Comment next line if you want dummy files to be created. They won't be recognized by MDS.
+ User::Panic(_L("Video files missing!"), KErrNotFound);
+ }
+ }
+
+ TBool fileExists = BaflUtils::FileExists(iFs, srcFileName);
+
+ HBufC* newFileName = HBufC::NewL( 256 );
+ CleanupStack::PushL( newFileName );
+
+ newFileName->Des().Copy( aFileName.Left( aFileName.LocateReverse('\\') ) );
+ BaflUtils::EnsurePathExistsL(iFs, *newFileName);
+
+ TInt dotPos = aFileName.LocateReverse('.');
+
+ for( TInt i = 0; i < aCount; i++ )
+ {
+ newFileName->Des().Copy( aFileName.Left( dotPos ) );
+ newFileName->Des().Append( _L("_") );
+ newFileName->Des().AppendNum( i );
+ newFileName->Des().Append( aFileName.Right( aFileName.Length() - dotPos ) );
+
+ HBufC* fileForClient = newFileName->Des().AllocL();
+ aFileArray.Append( fileForClient );
+
+ if( fileExists )
+ {
+ User::LeaveIfError( iFileMan->Copy(srcFileName, *newFileName) );
+ VCXLOGLO2("CIptvTestVideoCreator:: copy file: '%S'", newFileName);
+ }
+ else
+ {
+ VCXLOGLO2("CIptvTestVideoCreator:: new fake file: '%S'", newFileName);
+ RFile file;
+ CleanupClosePushL(file);
+ User::LeaveIfError( file.Replace(iFs, *newFileName, EFileWrite) );
+ User::LeaveIfError( file.SetSize( 1024*10 ) );
+ CleanupStack::PopAndDestroy( &file );
+ }
+ User::After( 100000 ); // Wait tenth of a second.
+ }
+
+ CleanupStack::PopAndDestroy( newFileName );
+
+ VCXLOGLO1("<<<CIptvTestVideoCreator::CreateVideosL");
+ }
+
+// -----------------------------------------------------------------------------
+// GetVideoFile
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestVideoCreator::GetVideoFile( TDes& aFileName, CIptvTestVideoCreator::TIptvTestVideoType aVideoType, const TDesC& aDrive )
+ {
+ VCXLOGLO1(">>>CIptvTestVideoCreator::GetVideoFile");
+ aFileName.Copy( aDrive );
+
+ _LIT(KIptvTestVideoBasePath, ":\\testing\\data\\");
+
+ aFileName.Append( KIptvTestVideoBasePath );
+
+ VCXLOGLO2("CIptvTestVideoCreator::GetVideoFile -- using %S", &aFileName);
+
+ switch (aVideoType)
+ {
+ case CIptvTestVideoCreator::IptvTestVideo3Gp:
+ {
+ aFileName.Append( _L("video_3gp.xxx") );
+ }
+ break;
+
+ case CIptvTestVideoCreator::IptvTestVideo3Gp2:
+ {
+ aFileName.Append( _L("video_3gp2.xxx") );
+ }
+ break;
+
+ case CIptvTestVideoCreator::IptvTestVideoMp2:
+ {
+ aFileName.Append( _L("video_mp2.xxx") );
+ }
+ break;
+
+ case CIptvTestVideoCreator::IptvTestVideoMpeg1:
+ {
+ aFileName.Append( _L("video_mpeg1.xxx") );
+ }
+ break;
+
+ case CIptvTestVideoCreator::IptvTestVideoMpeg2:
+ {
+ aFileName.Append( _L("video_mpeg2.xxx") );
+ }
+ break;
+
+ case CIptvTestVideoCreator::IptvTestVideoSuperVideoCd:
+ {
+ aFileName.Append( _L("video_supervideocd.xxx") );
+ }
+ break;
+
+ case CIptvTestVideoCreator::IptvTestVideoMp3:
+ {
+ aFileName.Append( _L("video_mp3.xxx") );
+ }
+ break;
+
+ case CIptvTestVideoCreator::IptvTestVideoAppleMpeg:
+ {
+ aFileName.Append( _L("video_applempeg.xxx") );
+ }
+ break;
+
+ case CIptvTestVideoCreator::IptvTestVideoMpeg4:
+ {
+ aFileName.Append( _L("video_mpeg4.xxx") );
+ }
+ break;
+
+ case CIptvTestVideoCreator::IptvTestVideoMpegAvc:
+ {
+ aFileName.Append( _L("video_mpegavc.xxx") );
+ }
+ break;
+
+ case CIptvTestVideoCreator::IptvTestVideoQuicktime:
+ {
+ aFileName.Append( _L("video_quicktime.xxx") );
+ }
+ break;
+
+ case CIptvTestVideoCreator::IptvTestVideoRealVideo:
+ {
+ aFileName.Append( _L("video_realvideo.xxx") );
+ }
+ break;
+
+ case CIptvTestVideoCreator::IptvTestVideoAvi:
+ {
+ aFileName.Append( _L("video_avi.xxx") );
+ }
+ break;
+
+ case CIptvTestVideoCreator::IptvTestVideoWmv:
+ {
+ aFileName.Append( _L("video_wmv.xxx") );
+ }
+ break;
+
+ case CIptvTestVideoCreator::IptvTestVideoAviAC3:
+ {
+ aFileName.Append( _L("video_aviac3.xxx") );
+ }
+ break;
+ default:
+ User::Panic(_L("IptvMyVideosApiTest: Unknown video type!"), KErrCorrupt);
+ }
+ VCXLOGLO1("<<<CIptvTestVideoCreator::GetVideoFile");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/src/IptvTestDownloadManager.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,519 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+// INCLUDE FILES
+
+#include <e32base.h>
+#include <f32file.h>
+#include <DownloadMgrClient.h>
+#include <HttpDownloadMgrCommon.h>
+
+#include "IptvTestDownloadManager.h"
+#include "VCXTestLog.h"
+#include "CIptvTestTimer.h"
+
+// ========================== MEMBER FUNCTIONS ===============================
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnection::NewL()
+//
+// Constructs CTestUtilConnection object
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestDownloadManager* CIptvTestDownloadManager::NewL(MTestUtilDownloadObserver *aObs)
+ {
+ VCXLOGLO1(">>>CIptvTestDownloadManager::NewL");
+ CIptvTestDownloadManager* self = NewLC(aObs);
+ CleanupStack::Pop(self);
+ VCXLOGLO1("<<<CIptvTestDownloadManager::NewL");
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnection::NewLC()
+//
+// Constructs CTestUtilConnection object
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestDownloadManager* CIptvTestDownloadManager::NewLC(MTestUtilDownloadObserver *aObs)
+ {
+ VCXLOGLO1(">>>CIptvTestDownloadManager::NewLC");
+ CIptvTestDownloadManager* self = new (ELeave) CIptvTestDownloadManager(aObs);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ VCXLOGLO1("<<<CIptvTestDownloadManager::NewLC");
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnection::CTestUtilConnection()
+//
+// Constructor
+// ---------------------------------------------------------------------------
+//
+CIptvTestDownloadManager::CIptvTestDownloadManager(MTestUtilDownloadObserver *aObs)
+: iObserver(aObs)
+ {
+ VCXLOGLO1(">>>CIptvTestDownloadManager::CIptvTestUtilConnection");
+
+ VCXLOGLO1("<<<CIptvTestDownloadManager::CIptvTestUtilConnection");
+ }
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnection::~CTestUtilConnection()
+//
+// Destructor
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestDownloadManager::~CIptvTestDownloadManager()
+ {
+ VCXLOGLO1(">>>CIptvTestDownloadManager::~CIptvTestDownloadManager");
+
+ iDownloadMgr.DeleteAll();
+ iDownloadMgr.RemoveObserver(*this);
+ iDownloadMgr.Close();
+
+ if( iDownload )
+ {
+ iDownload->Delete();
+ iDownload = NULL;
+ }
+
+ if( iTimer )
+ {
+ delete iTimer;
+ iTimer = NULL;
+ }
+
+ VCXLOGLO1("<<<CIptvTestDownloadManager::~CIptvTestDownloadManager");
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestDownloadManager::ConstructL()
+//
+// Second phase constructor
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestDownloadManager::ConstructL()
+ {
+ VCXLOGLO1(">>>CIptvTestDownloadManager::ConstructL");
+
+ iDownloadRunning = EFalse;
+ TUid uid;
+ uid.iUid = 0x101FB3E3;
+ iDownloadMgr.ConnectL(uid, *this, ETrue);
+
+ iTimer = CIptvTestTimer::NewL(*this, 0);
+
+ VCXLOGLO1("<<<CIptvTestDownloadManager::ConstructL");
+ }
+
+
+// ---------------------------------------------------------------------------
+// CIptvTestDownloadManager::HandleDMgrEventL()
+//
+// ---------------------------------------------------------------------------
+//
+void CIptvTestDownloadManager::HandleDMgrEventL( RHttpDownload& aDownload, THttpDownloadEvent aEvent )
+ {
+ VCXLOGLO1(">>>CIptvTestDownloadManager::HandleDMgrEventL");
+
+ TInt32 downloadId;
+ aDownload.GetIntAttribute(EDlAttrId, downloadId);
+
+ VCXLOGLO3("CIptvTestDownloadManager:: downloadId: %d, aEvent: %d", downloadId, aEvent);
+
+ switch (aEvent.iProgressState)
+ {
+ case EHttpContentTypeReceived:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpContentTypeReceived");
+ User::LeaveIfError(aDownload.Start());
+ break;
+ case EHttpProgNone:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgNone");
+ break;
+ case EHttpStarted:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpStarted");
+ break;
+ case EHttpProgCreatingConnection:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgCreatingConnection");
+ break;
+ case EHttpProgConnectionNeeded:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgConnectionNeeded");
+ break;
+ case EHttpProgConnected:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgConnected");
+ break;
+ case EHttpProgConnectionSuspended:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgConnectionSuspended");
+ break;
+ case EHttpProgDisconnected:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgDisconnected");
+ break;
+ case EHttpProgDownloadStarted:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgDownloadStarted");
+ break;
+ case EHttpContentTypeRequested:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpContentTypeRequested");
+ break;
+ case EHttpProgSubmitIssued:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgSubmitIssued");
+ break;
+ case EHttpProgResponseHeaderReceived:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgResponseHeaderReceived");
+ break;
+ case EHttpProgResponseBodyReceived:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgResponseBodyReceived");
+ break;
+ case EHttpProgRedirectedPermanently:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgRedirectedPermanently");
+ break;
+ case EHttpProgRedirectedTemporarily:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgRedirectedTemporarily");
+ break;
+ case EHttpProgDlNameChanged:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgDlNameChanged");
+ break;
+ case EHttpProgContentTypeChanged:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgContentTypeChanged");
+ break;
+ case EHttpProgCodDescriptorDownloaded:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgCodDescriptorDownloaded");
+ break;
+ case EHttpProgCodDownloadStarted:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgCodDownloadStarted");
+ break;
+ case EHttpProgCodDescriptorAccepted:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgCodDescriptorAccepted");
+ break;
+ case EHttpProgCodLoadEnd:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgCodLoadEnd");
+ break;
+ case EHttpProgSupportedMultiPart:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgSupportedMultiPart");
+ break;
+ case EHttpProgMovingContentFile:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgMovingContentFilep");
+ break;
+ case EHttpProgContentFileMoved:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpProgContentFileMoved");
+ break;
+ default:
+ VCXLOGLO1("CIptvTestDownloadManager:: Unknown state");
+ break;
+ }
+
+ switch (aEvent.iDownloadState)
+ {
+ case EHttpDlCompleted:
+ {
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpDlCompleted");
+
+ DeleteDownloadAsync( KErrNone );
+ }
+ break;
+
+ case EHttpDlFailed:
+ {
+ TInt32 err;
+ GetError( aDownload, err );
+ VCXLOGLO2("CIptvTestDownloadManager:: Download failed, err: %d", err);
+ if( err == KErrNone )
+ {
+ err = KErrGeneral;
+ }
+ DeleteDownloadAsync( err );
+ }
+ break;
+
+ case EHttpDlCreated:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpDlCreated");
+ iDownloadRunning = ETrue;
+ break;
+
+ case EHttpDlInprogress:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpDlInprogress");
+ break;
+
+ case EHttpDlPaused:
+ {
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpDlPaused");
+
+ TInt32 err;
+ GetError(aDownload, err);
+ VCXLOGLO2("CIptvTestDownloadManager:: Download is paused, err: %d", err);
+ if(err == KErrNone) err = KErrGeneral;
+
+ DeleteDownloadAsync( err );
+ }
+ break;
+
+ case EHttpDlMoved:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpDlMoved");
+ break;
+
+ case EHttpDlMediaRemoved:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpDlMediaRemoved");
+ break;
+
+ case EHttpDlMediaInserted:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpDlMediaInserted");
+ break;
+
+ case EHttpDlPausable:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpDlPausable");
+ break;
+
+ case EHttpDlNonPausable:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpDlNonPausable");
+ break;
+
+ case EHttpDlDeleted:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpDlDeleted");
+
+ if( !iDownloadFinishInformed )
+ {
+ VCXLOGLO1("CIptvTestDownloadManager:: Informing observer.");
+ iDownloadFinishInformed = ETrue;
+ iObserver->DownloadFinished( iError );
+ iDownloadRunning = EFalse;
+ }
+ break;
+
+ case EHttpDlAlreadyRunning:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpDlAlreadyRunning");
+ break;
+
+ case EHttpDlDeleting:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpDlDeleting");
+ if( !iDownloadFinishInformed )
+ {
+ VCXLOGLO1("CIptvTestDownloadManager:: Informing observer.");
+ iDownloadFinishInformed = ETrue;
+ iObserver->DownloadFinished( iError );
+ iDownloadRunning = EFalse;
+ }
+ break;
+
+ case EHttpDlCancelTransaction:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpDlCancelTransaction");
+ break;
+
+ default:
+ VCXLOGLO1("CIptvTestDownloadManager:: Unknown state");
+ break;
+ }
+
+
+ VCXLOGLO1("<<<CIptvTestDownloadManager::HandleDMgrEventL");
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestDownloadManager::DownloadL()
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvTestDownloadManager::DownloadL( TDesC& aAddress, TDesC16& aOutFile, TDesC& aUserName, TDesC& aPassword, TInt32 aIapId, TInt aTimeoutSeconds)
+ {
+ VCXLOGLO1(">>>CIptvTestDownloadManager::DownloadL");
+
+ TBool result;
+
+ if( iDownload )
+ {
+ VCXLOGLO1("Download already ongoing.");
+ VCXLOGLO1("<<<CIptvTestDownloadManager::DownloadL");
+ return KErrNone;
+ }
+
+ iDownloadFinishInformed = EFalse;
+ iTimerStartedForDownloadDeletion = EFalse;
+ iError = KErrNone;
+
+ iTimer->After(aTimeoutSeconds * 1000000);
+
+ TBuf8<3000> address;
+ TBuf8<256> username;
+ TBuf8<256> password;
+
+ address.Copy(aAddress);
+ username.Copy(aUserName);
+ password.Copy(aPassword);
+
+ VCXLOGLO3("CIptvTestDownloadManager:: Starting downloading: %S -> %S", &aAddress, &aOutFile);
+ VCXLOGLO3("CIptvTestDownloadManager:: User: %S, PW %S", &aUserName, &aPassword);
+ VCXLOGLO2("CIptvTestDownloadManager:: Timeout: %d", aTimeoutSeconds);
+
+ TInt err = KErrNone;
+
+ err = iDownloadMgr.SetIntAttribute( EDlMgrIap, aIapId );
+ if ( err != KErrNone )
+ {
+ VCXLOGLO2("CIptvTestDownloadManager:: Could not set AP! err: %d", err);
+ return err;
+ }
+
+ RHttpDownload& download = iDownloadMgr.CreateDownloadL( address, result );
+
+ iDownload = &download;
+
+ err = iDownload->SetStringAttribute( EDlAttrDestFilename, aOutFile);
+ if(err != KErrNone)
+ {
+ VCXLOGLO1("Setting destfilename failed.");
+ VCXLOGLO1("<<<CIptvTestDownloadManager::DownloadL");
+ return err;
+ }
+
+ download.SetBoolAttribute(EDlAttrNoContentTypeCheck, ETrue);
+ download.SetIntAttribute(EDlAttrUserData, 0);
+
+ err = download.SetStringAttribute(EDlAttrUsername, username);
+ if(err != KErrNone)
+ {
+ VCXLOGLO1("Setting download username failed.");
+ VCXLOGLO1("<<<CIptvTestDownloadManager::DownloadL");
+ return err;
+ }
+
+ err = download.SetStringAttribute(EDlAttrPassword, password);
+ if(err != KErrNone)
+ {
+ VCXLOGLO1("Setting download password failed.");
+ VCXLOGLO1("<<<CIptvTestDownloadManager::DownloadL");
+ return err;
+ }
+
+ err = iDownload->Start();
+ if(err != KErrNone)
+ {
+ VCXLOGLO1("Starting download failed.");
+ VCXLOGLO1("<<<CIptvTestDownloadManager::DownloadL");
+ return err;
+ }
+
+ VCXLOGLO1("<<<CIptvTestDownloadManager::DownloadL");
+
+ return err;
+ }
+
+// ---------------------------------------------------------
+// CIptvTestDownloadManager::GetError
+// ---------------------------------------------------------
+//
+EXPORT_C void CIptvTestDownloadManager::GetError(RHttpDownload& aDownload,
+ TInt32& aDownloadError)
+ {
+ TInt32 errorId;
+ TInt32 globalErrorId;
+ aDownload.GetIntAttribute(EDlAttrErrorId, errorId);
+ aDownload.GetIntAttribute(EDlAttrGlobalErrorId, globalErrorId);
+ VCXLOGLO2("CIptvTestDownloadManager:: DL error ID: %d", errorId);
+ VCXLOGLO2("CIptvTestDownloadManager:: DL global error ID: %d", globalErrorId);
+
+ switch(errorId)
+ {
+ case EConnectionFailed:
+ aDownloadError = EConnectionFailed;
+ VCXLOGLO1("CIptvTestDownloadManager:: EConnectionFailed -> EIptvDlConnectionFailed");
+ if(globalErrorId == KErrServerBusy)
+ {
+ VCXLOGLO1("CIptvTestDownloadManager:: server busy -> EIptvDlGeneral");
+ aDownloadError = KErrServerBusy;
+ }
+ break;
+ case EHttpAuthenticationFailed:
+ VCXLOGLO1("CIptvTestDownloadManager:: EHttpAuthenticationFailed -> EIptvDlAuthFailed");
+ aDownloadError = EHttpAuthenticationFailed;
+ break;
+ case EProxyAuthenticationFailed:
+ VCXLOGLO1("CIptvTestDownloadManager:: EProxyAuthenticationFailed -> EIptvDlProxyAuthFailed");
+ aDownloadError = EProxyAuthenticationFailed;
+ break;
+ case EDestFileInUse:
+ VCXLOGLO1("CIptvTestDownloadManager:: EDestFileInUse -> EIptvDlDestFileInUse");
+ aDownloadError = EDestFileInUse;
+ break;
+ case EBadUrl:
+ VCXLOGLO1("CIptvTestDownloadManager:: EBadUrl -> EIptvDlBadUrl");
+ aDownloadError = EBadUrl;
+ break;
+ case EMMCRemoved:
+ VCXLOGLO1("CIptvTestDownloadManager:: EMMCRemoved -> EIptvDlMmcRemoved");
+ aDownloadError = EMMCRemoved;
+ break;
+ case EDiskFull:
+ VCXLOGLO1("CIptvTestDownloadManager:: EDiskFull -> EIptvDlDiskFull");
+ aDownloadError = EDiskFull;
+ break;
+ case EObjectNotFound:
+ VCXLOGLO1("CIptvTestDownloadManager:: EObjectNotFound -> EIptvDlContentNotFound");
+ aDownloadError = EObjectNotFound;
+ break;
+
+ default:
+ VCXLOGLO1("CIptvTestDownloadManager:: unknown -> EIptvDlGeneral");
+ aDownloadError = KErrGeneral;
+ break;
+ }
+ }
+
+// ---------------------------------------------------------
+// CIptvTestDownloadManager::DeleteDownloadAsync
+// ---------------------------------------------------------
+//
+void CIptvTestDownloadManager::DeleteDownloadAsync( TInt aErrorToObserver )
+ {
+ VCXLOGLO1(">>>CIptvTestDownloadManager::DeleteDownloadAsync");
+ if( iDownload )
+ {
+ iTimer->After( 1000000 ); // 1 second
+ iTimerStartedForDownloadDeletion = ETrue;
+ iError = aErrorToObserver;
+ }
+ VCXLOGLO1("<<<CIptvTestDownloadManager::DeleteDownloadAsync");
+ }
+
+void CIptvTestDownloadManager::TimerComplete( TInt aTimerId, TInt aError )
+ {
+ VCXLOGLO1(">>>CIptvTestDownloadManager::TimerComplete");
+
+ VCXLOGLO3("CIptvTestDownloadManager:: aTimerId: %d, aError: %d", aTimerId, aError);
+
+ if( iTimerStartedForDownloadDeletion )
+ {
+ iTimerStartedForDownloadDeletion = EFalse;
+ VCXLOGLO1("IptvTestDownloadManager:: Deleting the download.");
+
+ if( iDownload )
+ {
+ iDownload->Delete();
+ iDownload = NULL;
+ }
+
+ // Obsever is informed at DL deletion.
+ }
+ else
+ {
+ iObserver->DownloadFinished(KErrTimedOut);
+ }
+
+ VCXLOGLO1("<<<CIptvTestDownloadManager::TimerComplete");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/src/IptvTestUtilALR.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,1012 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+// INCLUDE FILES
+
+#include <centralrepository.h>
+
+#include "IptvTestUtilALR.h"
+#include "VCXTestLog.h"
+#include "TestUtilConnection.h"
+#include "CIptvTestActiveWait.h"
+#include "TestUtilConnectionWaiter.h"
+#include "VCXTestConstants.h"
+#include <cmpluginpacketdatadef.h>
+
+// ========================== MEMBER FUNCTIONS ===============================
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::NewL()
+//
+// Constructs CIptvTestUtilALR object
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestUtilALR* CIptvTestUtilALR::NewL()
+ {
+ VCXLOGLO1(">>>CIptvIptvTestUtilALR::NewL");
+ CIptvTestUtilALR* self = NewLC();
+ CleanupStack::Pop(self);
+ VCXLOGLO1("<<<CIptvIptvTestUtilALR::NewL");
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::NewLC()
+//
+// Constructs CIptvTestUtilALR object
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestUtilALR* CIptvTestUtilALR::NewLC()
+ {
+ VCXLOGLO1(">>>CIptvIptvTestUtilALR::NewLC");
+ CIptvTestUtilALR* self = new (ELeave) CIptvTestUtilALR();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ VCXLOGLO1("<<<CIptvIptvTestUtilALR::NewLC");
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::~CIptvTestUtilALR()
+//
+// Destructor
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CIptvTestUtilALR::~CIptvTestUtilALR()
+ {
+ VCXLOGLO1(">>>CIptvIptvTestUtilALR::~CIptvIptvTestUtilALR");
+
+ iCmManager.Close();
+
+ delete iActiveWait;
+ iActiveWait = NULL;
+
+ VCXLOGLO1("<<<CIptvIptvTestUtilALR::~CIptvIptvTestUtilALR");
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::ConstructL()
+//
+// Second phase constructor
+// ---------------------------------------------------------------------------
+//
+void CIptvTestUtilALR::ConstructL()
+ {
+ VCXLOGLO1(">>>CIptvIptvTestUtilALR::ConstructL");
+
+ iCmManager.OpenL();
+
+ iActiveWait = CIptvTestActiveWait::NewL();
+
+ VCXLOGLO1("<<<CIptvIptvTestUtilALR::ConstructL");
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::CIptvTestUtilALR()
+//
+// Constructor
+// ---------------------------------------------------------------------------
+//
+CIptvTestUtilALR::CIptvTestUtilALR()
+ {
+ VCXLOGLO1(">>>CIptvIptvTestUtilALR::CIptvIptvTestUtilALR");
+
+ VCXLOGLO1("<<<CIptvIptvTestUtilALR::CIptvIptvTestUtilALR");
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::RemoveUsedDestinationCenRepL()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestUtilALR::RemoveUsedDestinationCenRepL()
+ {
+ VCXLOGLO1(">>>CIptvIptvTestUtilALR::RemoveUsedDestinationCenRep");
+
+ CRepository* cenRep = CRepository::NewLC( VCXTEST_KIptvAlrCenRepUid );
+ User::LeaveIfError( cenRep->Delete( VCXTEST_KIptvCenRepUsedSnapIdKey ) );
+ CleanupStack::PopAndDestroy( cenRep );
+
+ VCXLOGLO1("<<<CIptvIptvTestUtilALR::RemoveUsedDestinationCenRep");
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::SetUsedDestinationL()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestUtilALR::SetUsedDestinationL( TDesC& aDestinationName )
+ {
+ VCXLOGLO1(">>>CIptvIptvTestUtilALR::SetUsedDestinationL");
+
+ VCXLOGLO2("CIptvIptvTestUtilALR:: dest name: %S", &aDestinationName);
+
+ TInt destId(0);
+
+ if( aDestinationName.Compare( _L("ALWAYS_ASK") ) != KErrNone )
+ {
+ destId = GetDestinationIdL( aDestinationName );
+ }
+ VCXLOGLO2("CIptvIptvTestUtilALR:: dest id: %d", destId);
+
+ TCmDefConnValue defaultConnection;
+ defaultConnection.iType = ECmDefConnDestination;
+ defaultConnection.iId = destId;
+ iCmManager.WriteDefConnL( defaultConnection );
+
+ VCXLOGLO1("<<<CIptvIptvTestUtilALR::SetUsedDestinationL");
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::CreateDestinationL()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestUtilALR::CreateDestinationL( TDesC& aDestinationName )
+ {
+ VCXLOGLO1(">>>CIptvIptvTestUtilALR::CreateDestinationL");
+
+ VCXLOGLO2("CIptvIptvTestUtilALR:: dest name: %S", &aDestinationName);
+
+ RCmDestinationExt dest;
+ TRAPD( err, dest = iCmManager.CreateDestinationL( aDestinationName ) );
+ VCXLOGLO2("CIptvIptvTestUtilALR::CreateDestinationL: CreateDestinationL returned: %d", err);
+ User::LeaveIfError( err );
+
+ CleanupClosePushL( dest );
+ TRAP( err, dest.SetHiddenL( EFalse ) );
+ VCXLOGLO2("CIptvIptvTestUtilALR::CreateDestinationL: SetHiddenL returned: %d", err);
+ User::LeaveIfError( err );
+
+ // This leaves sometimes with KErrLocked, try again in that case few times.
+ for( TInt retry = 0; retry < 5; retry++ )
+ {
+ TRAP( err, dest.UpdateL() );
+ VCXLOGLO2("CIptvIptvTestUtilALR::CreateDestinationL: UpdateL returned: %d", err);
+ if( err != KErrLocked )
+ {
+ User::LeaveIfError( err );
+ break; // All ok.
+ }
+ User::After( 1000000 );
+ }
+
+ CleanupStack::PopAndDestroy( &dest );
+
+ VCXLOGLO1("<<<CIptvIptvTestUtilALR::CreateDestinationL");
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::DeleteDestinationL()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestUtilALR::DeleteDestinationL( TDesC& aDestinationName )
+ {
+ VCXLOGLO1(">>>CIptvIptvTestUtilALR::DeleteDestinationL");
+
+ VCXLOGLO2("CIptvIptvTestUtilALR:: dest name: '%S'", &aDestinationName);
+
+ TInt destId = GetDestinationIdL( aDestinationName );
+ RCmDestinationExt destination = iCmManager.DestinationL( destId );
+ CleanupClosePushL( destination );
+
+ TRAP_IGNORE( TerminateDestinationConnectionsL( aDestinationName ) );
+
+ // Delete methods first.
+ for(TInt e=destination.ConnectionMethodCount()-1; e>=0 ; e--)
+ {
+ RCmConnectionMethodExt method = destination.ConnectionMethodL( e );
+ CleanupClosePushL( method );
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: deleting method: %d", e );
+
+ destination.DeleteConnectionMethodL( method );
+ destination.UpdateL();
+ CleanupStack::PopAndDestroy( &method );
+ }
+
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: deleting destination id: %d", destId );
+ destination.DeleteLD();
+
+ CleanupStack::PopAndDestroy( &destination );
+
+ VCXLOGLO1("<<<CIptvIptvTestUtilALR::DeleteDestinationL");
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::CopyMethodL()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestUtilALR::CopyMethodL( TDesC& aMethodName, TDesC& aNewMethodName, TDesC& aNewDestinationName )
+ {
+ VCXLOGLO1(">>>CIptvIptvTestUtilALR::CopyMethodL");
+
+ TBuf<256> srcMethodName( aMethodName );
+
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: srcMethodName: %S", &srcMethodName );
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aNewMethodName: %S", &aNewMethodName );
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aNewDestinationName: %S", &aNewDestinationName );
+
+ // Find target destination.
+ TInt targetDestId = GetDestinationIdL( aNewDestinationName );
+ RCmDestinationExt targetDestination = iCmManager.DestinationL( targetDestId );
+ CleanupClosePushL( targetDestination );
+
+ // Check if target has destination with the name already.
+ for(TInt e=0; e<targetDestination.ConnectionMethodCount(); e++)
+ {
+ RCmConnectionMethodExt method = targetDestination.ConnectionMethodL( e );
+ CleanupClosePushL( method );
+
+ HBufC* methodName = method.GetStringAttributeL( CMManager::ECmName );
+ CleanupStack::PushL( methodName );
+
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: method: '%S'", methodName );
+ if( MethodMatchesL( srcMethodName, *methodName, ETrue ) )
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: Target destination already has method with the name.");
+ CleanupStack::PopAndDestroy( methodName );
+ CleanupStack::PopAndDestroy( &method );
+ CleanupStack::PopAndDestroy( &targetDestination );
+ VCXLOGLO1("<<<CIptvIptvTestUtilALR::CopyMethodL");
+ return;
+ }
+ CleanupStack::PopAndDestroy( methodName );
+ CleanupStack::PopAndDestroy( &method );
+ }
+
+ // Find method from destinations and create copy of it.
+ TBool found( EFalse );
+ TBool foundExact( EFalse );
+ TUint32 foundDestId( 0 );
+ TInt foundIapIndex( 0 );
+
+ RArray<TUint32> destIds(5);
+ iCmManager.AllDestinationsL( destIds );
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: dest Count: %d", destIds.Count() );
+
+ for(TInt i=0; i<destIds.Count(); i++ )
+ {
+ RCmDestinationExt sourceDestination = iCmManager.DestinationL( destIds[i] );
+ CleanupClosePushL( sourceDestination );
+
+ HBufC* name = sourceDestination.NameLC();
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: dest: '%S'", name );
+ TInt methodCount = sourceDestination.ConnectionMethodCount();
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: methodCount: %d", methodCount );
+
+ for(TInt e=0; e<sourceDestination.ConnectionMethodCount(); e++)
+ {
+ RCmConnectionMethodExt sourceMethod = sourceDestination.ConnectionMethodL( e );
+ CleanupClosePushL( sourceMethod );
+
+ HBufC* methodName = sourceMethod.GetStringAttributeL( CMManager::ECmName );
+ CleanupStack::PushL( methodName );
+
+ TInt iapId = sourceMethod.GetIntAttributeL( CMManager::ECmIapId );
+ VCXLOGLO3( "CIptvIptvTestUtilALR:: method: '%S', id: %d", methodName, iapId );
+
+ // Check for exact match.
+ if( MethodMatchesL( srcMethodName, *methodName, ETrue ) )
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: exact match.");
+ foundExact = ETrue;
+ foundDestId = destIds[i];
+ foundIapIndex = e;
+ }
+
+ // No exact match found yet, check if its any of the alternative iaps.
+ if( !foundExact && MethodMatchesL( srcMethodName, *methodName, EFalse ) )
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: alt match.");
+ found = ETrue;
+ foundDestId = destIds[i];
+ foundIapIndex = e;
+ }
+
+ CleanupStack::PopAndDestroy( methodName );
+ CleanupStack::PopAndDestroy( &sourceMethod );
+
+ // No need to search further.
+ if( foundExact )
+ {
+ break;
+ }
+ }
+
+ CleanupStack::PopAndDestroy( name );
+ CleanupStack::PopAndDestroy( &sourceDestination );
+
+ // No need to search further.
+ if( foundExact )
+ {
+ break;
+ }
+ }
+
+ // Iap found, create copy of it.
+ if( foundExact || found )
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: Creating copy of the method." );
+
+ RCmDestinationExt sourceDestination = iCmManager.DestinationL( foundDestId );
+ CleanupClosePushL( sourceDestination );
+
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: source dest ok." );
+
+ RCmConnectionMethodExt sourceMethod = sourceDestination.ConnectionMethodL( foundIapIndex );
+ CleanupClosePushL( sourceMethod );
+
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: source method ok." );
+
+ HBufC* sourceMethodName = sourceMethod.GetStringAttributeL( CMManager::ECmName );
+ CleanupStack::PushL( sourceMethodName );
+
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: source method name ok." );
+
+ RCmConnectionMethodExt newMethod = sourceMethod.CreateCopyL();
+ CleanupClosePushL( newMethod );
+
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: copy ok." );
+
+ // If method names are same rename source method because there can't be two with same name.
+ if( *sourceMethodName == aNewMethodName )
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: Method names are same, renaming source method." );
+ HBufC* newName = HBufC::NewL( sourceMethodName->Length() + 5);
+ newName->Des().Append( *sourceMethodName );
+ newName->Des().Append( _L("_old") );
+ sourceMethod.SetStringAttributeL( CMManager::ECmName, *newName );
+ delete newName;
+ sourceMethod.UpdateL();
+ }
+
+ // Set name for new method.
+ newMethod.SetStringAttributeL( CMManager::ECmName, aNewMethodName );
+ // Disable dialog asking permission.
+ newMethod.SetIntAttributeL( CMManager::ECmSeamlessnessLevel, CMManager::ESeamlessnessShowprogress );
+
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: new method updated." );
+
+ targetDestination.AddConnectionMethodL( newMethod );
+ targetDestination.UpdateL();
+
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: method added to target dest." );
+
+ CleanupStack::PopAndDestroy( &newMethod );
+ CleanupStack::PopAndDestroy( sourceMethodName );
+ CleanupStack::PopAndDestroy( &sourceMethod );
+ CleanupStack::PopAndDestroy( &sourceDestination );
+ }
+ // No iap found, search from uncategorized IAPs.
+ else
+ {
+ RArray<TUint32> cmarray;
+ TRAPD( err, iCmManager.ConnectionMethodL( cmarray, EFalse, EFalse, EFalse ) );
+ if( err != KErrNone )
+ {
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: could not get uncategorized IAPs. err: %d", err );
+ cmarray.Reset();
+ cmarray.Close();
+ }
+
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: uncategorized IAP count: %d", cmarray.Count() );
+
+ for( TInt e = 0; e < cmarray.Count(); e++ )
+ {
+ RCmConnectionMethodExt sourceMethod = iCmManager.ConnectionMethodL( cmarray[e] );
+ CleanupClosePushL( sourceMethod );
+
+ HBufC* methodName = sourceMethod.GetStringAttributeL( CMManager::ECmName );
+ CleanupStack::PushL( methodName );
+
+ TInt iapId = sourceMethod.GetIntAttributeL( CMManager::ECmIapId );
+ VCXLOGLO3( "CIptvIptvTestUtilALR:: method: '%S', id: %d", methodName, iapId );
+
+ // Check for exact match.
+ if( MethodMatchesL( srcMethodName, *methodName, ETrue ) )
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: exact match.");
+ foundExact = ETrue;
+ foundIapIndex = e;
+ }
+
+ // No exact match found yet, check if its any of the alternative iaps.
+ if( !foundExact && MethodMatchesL( srcMethodName, *methodName, EFalse ) )
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: alt match.");
+ found = ETrue;
+ foundIapIndex = e;
+ }
+
+ CleanupStack::PopAndDestroy( methodName );
+ CleanupStack::PopAndDestroy( &sourceMethod );
+
+ // No need to search further.
+ if( foundExact )
+ {
+ break;
+ }
+ }
+
+ // Found IAP from uncategorized dest.
+ if( found || foundExact )
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: Creating copy of the method." );
+
+ RCmConnectionMethodExt sourceMethod = iCmManager.ConnectionMethodL( cmarray[foundIapIndex] );
+ CleanupClosePushL( sourceMethod );
+
+ HBufC* sourceMethodName = sourceMethod.GetStringAttributeL( CMManager::ECmName );
+ CleanupStack::PushL( sourceMethodName );
+
+ RCmConnectionMethodExt newMethod = sourceMethod.CreateCopyL();
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: New Method ok." );
+ CleanupClosePushL( newMethod );
+
+ // If method names are same rename source method because there can't be two with same name.
+ if( *sourceMethodName == aNewMethodName )
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: Method names are same, renaming source method." );
+ HBufC* newName = HBufC::NewL( sourceMethodName->Length() + 5);
+ newName->Des().Append( *sourceMethodName );
+ newName->Des().Append( _L("_old") );
+ sourceMethod.SetStringAttributeL( CMManager::ECmName, *newName );
+ delete newName;
+ sourceMethod.UpdateL();
+ }
+
+ // Set name for new method.
+ newMethod.SetStringAttributeL( CMManager::ECmName, aNewMethodName );
+ // Disable dialog asking permission.
+ newMethod.SetIntAttributeL( CMManager::ECmSeamlessnessLevel, CMManager::ESeamlessnessShowprogress );
+
+ targetDestination.AddConnectionMethodL( newMethod );
+ targetDestination.UpdateL();
+
+ CleanupStack::PopAndDestroy( &newMethod );
+ CleanupStack::PopAndDestroy( sourceMethodName );
+ CleanupStack::PopAndDestroy( &sourceMethod );
+ }
+
+ cmarray.Reset();
+ cmarray.Close();
+ }
+
+ destIds.Reset();
+ destIds.Close();
+
+ PrintDestinationL( targetDestination );
+ CleanupStack::PopAndDestroy( &targetDestination );
+
+ if( !foundExact && !found )
+ {
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: source method %S not found!", &srcMethodName );
+#ifdef __WINSCW__
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: EMULATOR BUILD, check that iap is not uncategorized." );
+#endif
+ User::Leave(KErrNotFound);
+ }
+
+ VCXLOGLO1("<<<CIptvIptvTestUtilALR::CopyMethodL");
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::DeleteMethodL()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestUtilALR::DeleteMethodL( TDesC& aDestinationName, TDesC& aMethodName )
+ {
+ VCXLOGLO1(">>>CIptvIptvTestUtilALR::DeleteMethodL");
+
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aDestinationName: %S", &aDestinationName );
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aMethodName: %S", &aMethodName );
+
+ TInt destId = GetDestinationIdL( aDestinationName );
+ RCmDestinationExt destination = iCmManager.DestinationL( destId );
+ CleanupClosePushL( destination );
+
+ TBool found( EFalse );
+
+ // Find method and delete it.
+ for(TInt e=0; e< destination.ConnectionMethodCount(); e++)
+ {
+ RCmConnectionMethodExt method = destination.ConnectionMethodL( e );
+ CleanupClosePushL( method );
+
+ HBufC* methodName = method.GetStringAttributeL( CMManager::ECmName );
+ CleanupStack::PushL( methodName );
+ TInt iapId = method.GetIntAttributeL( CMManager::ECmIapId );
+ VCXLOGLO3( "CIptvIptvTestUtilALR:: method: '%S', id: %d", methodName, iapId );
+
+ if( methodName->Compare( aMethodName ) == 0 )
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: Match. Deleting." );
+ found = ETrue;
+ destination.DeleteConnectionMethodL( method );
+ destination.UpdateL();
+ }
+ CleanupStack::PopAndDestroy( methodName );
+ CleanupStack::PopAndDestroy( &method );
+ }
+
+ if(!found)
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: method not found!");
+ User::Leave(KErrNotFound);
+ }
+
+ PrintDestinationL( destination );
+ CleanupStack::PopAndDestroy( &destination );
+
+ VCXLOGLO1("<<<CIptvIptvTestUtilALR::DeleteMethodL");
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::SetMethodPriorityL()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestUtilALR::SetMethodPriorityL( TDesC& aDestinationName, TDesC& aMethodName, TUint32 aPriority )
+ {
+ VCXLOGLO1(">>>CIptvIptvTestUtilALR::SetMethodPriorityL");
+
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aDestinationName: %S", &aDestinationName );
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aMethodName: %S", &aMethodName );
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aPriority: %d", aPriority );
+
+ TInt destId = GetDestinationIdL( aDestinationName );
+ RCmDestinationExt destination = iCmManager.DestinationL( destId );
+ CleanupClosePushL( destination );
+
+ TBool found( EFalse );
+
+ if( aPriority > destination.ConnectionMethodCount() )
+ {
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: Priority must be less than there's methods in the destination, count: %d!", destination.ConnectionMethodCount() );
+ User::Leave( KErrCorrupt );
+ }
+
+ // No need to set priority here.
+ if( destination.ConnectionMethodCount() <= 1 )
+ {
+ CleanupStack::PopAndDestroy( &destination );
+ VCXLOGLO1("<<<CIptvIptvTestUtilALR::SetMethodPriorityL");
+ return;
+ }
+
+ // Find the method and set priority
+ for(TInt e=0; e < destination.ConnectionMethodCount(); e++)
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: Get method." );
+ RCmConnectionMethodExt method = destination.ConnectionMethodL( e );
+ CleanupClosePushL( method );
+
+ HBufC* methodName = method.GetStringAttributeL( CMManager::ECmName );
+ CleanupStack::PushL( methodName );
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: Get iap id." );
+ TInt iapId = method.GetIntAttributeL( CMManager::ECmIapId );
+ VCXLOGLO3( "CIptvIptvTestUtilALR:: method: '%S', id: %d", methodName, iapId );
+
+ if( methodName->Compare( aMethodName ) == 0 )
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: Match. Setting priority." );
+ found = ETrue;
+ destination.ModifyPriorityL( method, aPriority );
+ destination.UpdateL();
+ }
+ CleanupStack::PopAndDestroy( methodName );
+ CleanupStack::PopAndDestroy( &method );
+ }
+
+ if(!found)
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: method not found!");
+ User::Leave(KErrNotFound);
+ }
+
+ PrintDestinationL( destination );
+ CleanupStack::PopAndDestroy( &destination );
+
+ VCXLOGLO1("<<<CIptvIptvTestUtilALR::SetMethodPriorityL");
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::SetMethodStringAttributeL()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestUtilALR::SetMethodStringAttributeL( TDesC& aDestinationName, TDesC& aMethodName, TInt aAttribute, TDesC& aAttributeValue )
+ {
+ VCXLOGLO1(">>>CIptvIptvTestUtilALR::SetMethodStringAttributeL");
+
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aDestinationName: %S", &aDestinationName );
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aMethodName: %S", &aMethodName );
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aAttribute: %d", aAttribute );
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aAttributeValue: %S", &aAttributeValue );
+
+ TInt destId = GetDestinationIdL( aDestinationName );
+ RCmDestinationExt destination = iCmManager.DestinationL( destId );
+ CleanupClosePushL( destination );
+
+ TBool found( EFalse );
+
+ // Find the method and set attribute
+ for(TInt e=0; e < destination.ConnectionMethodCount(); e++)
+ {
+ RCmConnectionMethodExt method = destination.ConnectionMethodL( e );
+ CleanupClosePushL( method );
+
+ HBufC* methodName = method.GetStringAttributeL( CMManager::ECmName );
+ CleanupStack::PushL( methodName );
+ TInt iapId = method.GetIntAttributeL( CMManager::ECmIapId );
+ VCXLOGLO3( "CIptvIptvTestUtilALR:: method: '%S', id: %d", methodName, iapId );
+
+ if( MethodMatchesL( aMethodName, *methodName, EFalse ) )
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: Match. Setting attribute." );
+ found = ETrue;
+
+ method.SetStringAttributeL( aAttribute, aAttributeValue );
+ method.UpdateL();
+ }
+
+ CleanupStack::PopAndDestroy( methodName );
+ CleanupStack::PopAndDestroy( &method );
+ }
+
+ if(!found)
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: method not found!");
+ User::Leave(KErrNotFound);
+ }
+
+ CleanupStack::PopAndDestroy( &destination );
+
+ VCXLOGLO1("<<<CIptvIptvTestUtilALR::SetMethodStringAttributeL");
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::SetMethodIntAttributeL()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestUtilALR::SetMethodIntAttributeL( TDesC& aDestinationName, TDesC& aMethodName, TInt aAttribute, TInt aAttributeValue )
+ {
+ VCXLOGLO1(">>>CIptvIptvTestUtilALR::SetMethodIntAttributeL");
+
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aDestinationName: %S", &aDestinationName );
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aMethodName: %S", &aMethodName );
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aAttribute: %d", aAttribute );
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aAttributeValue: %d", aAttributeValue );
+
+ TInt destId = GetDestinationIdL( aDestinationName );
+ RCmDestinationExt destination = iCmManager.DestinationL( destId );
+ CleanupClosePushL( destination );
+
+ TBool found( EFalse );
+
+ // Find the method and set attribute
+ for(TInt e=0; e < destination.ConnectionMethodCount(); e++)
+ {
+ RCmConnectionMethodExt method = destination.ConnectionMethodL( e );
+ CleanupClosePushL( method );
+
+ HBufC* methodName = method.GetStringAttributeL( CMManager::ECmName );
+ CleanupStack::PushL( methodName );
+ TInt iapId = method.GetIntAttributeL( CMManager::ECmIapId );
+ VCXLOGLO3( "CIptvIptvTestUtilALR:: method: '%S', id: %d", methodName, iapId );
+
+ if( MethodMatchesL( aMethodName, *methodName, EFalse ) )
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: Match. Setting attribute." );
+ found = ETrue;
+
+ method.SetIntAttributeL( aAttribute, aAttributeValue );
+ method.UpdateL();
+ }
+
+ CleanupStack::PopAndDestroy( methodName );
+ CleanupStack::PopAndDestroy( &method );
+ }
+
+ if(!found)
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: method not found!");
+ User::Leave(KErrNotFound);
+ }
+
+ CleanupStack::PopAndDestroy( &destination );
+
+ VCXLOGLO1("<<<CIptvIptvTestUtilALR::SetMethodIntAttributeL");
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::SetMethodBoolAttributeL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestUtilALR::SetMethodBoolAttributeL( TDesC& aDestinationName, TDesC& aMethodName, TInt aAttribute, TBool aAttributeValue )
+ {
+ VCXLOGLO1(">>>CIptvIptvTestUtilALR::SetMethodBoolAttributeL");
+
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aDestinationName: %S", &aDestinationName );
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aMethodName: %S", &aMethodName );
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aAttribute: %d", aAttribute );
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aAttributeValue: %d", &aAttributeValue );
+
+ TInt destId = GetDestinationIdL( aDestinationName );
+ RCmDestinationExt destination = iCmManager.DestinationL( destId );
+ CleanupClosePushL( destination );
+
+ TBool found = EFalse;
+
+ // Find the method and set attribute
+ for(TInt e=0; e < destination.ConnectionMethodCount(); e++)
+ {
+ RCmConnectionMethodExt method = destination.ConnectionMethodL( e );
+ CleanupClosePushL( method );
+
+ HBufC* methodName = method.GetStringAttributeL( CMManager::ECmName );
+ CleanupStack::PushL( methodName );
+ TInt iapId = method.GetIntAttributeL( CMManager::ECmIapId );
+ VCXLOGLO3( "CIptvIptvTestUtilALR:: method: '%S', id: %d", methodName, iapId );
+
+ if( MethodMatchesL( aMethodName, *methodName, EFalse ) )
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: Match. Setting attribute." );
+ found = ETrue;
+
+ method.SetBoolAttributeL( aAttribute, aAttributeValue );
+ method.UpdateL();
+ }
+
+ CleanupStack::PopAndDestroy( methodName );
+ CleanupStack::PopAndDestroy( &method );
+ }
+
+ if(!found)
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: method not found!");
+ User::Leave(KErrNotFound);
+ }
+
+ CleanupStack::PopAndDestroy( &destination );
+
+ VCXLOGLO1("<<<CIptvIptvTestUtilALR::SetMethodBoolAttributeL");
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::GetDestinationIdL()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvTestUtilALR::GetDestinationIdL( TDesC& aDestinationName )
+ {
+ VCXLOGLO1(">>>CIptvIptvTestUtilALR::GetDestinationIdL");
+
+ VCXLOGLO2("CIptvIptvTestUtilALR:: dest name: '%S'", &aDestinationName);
+
+ RArray<TUint32> destIds(5);
+
+ iCmManager.AllDestinationsL( destIds );
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: dest Count: %d", destIds.Count() );
+
+ TInt foundDestId(0);
+
+ for(TInt i=0; i<destIds.Count(); i++ )
+ {
+ RCmDestinationExt dest = iCmManager.DestinationL( destIds[i] );
+ CleanupClosePushL( dest );
+ HBufC* name = dest.NameLC();
+ VCXLOGLO3( "CIptvIptvTestUtilALR:: dest: '%S', id: %d", name, destIds[i] );
+ if( name->Compare( aDestinationName ) == 0 )
+ {
+ foundDestId = destIds[i];
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: found destination id: %d", destIds[i] );
+ CleanupStack::PopAndDestroy( name );
+ CleanupStack::PopAndDestroy( &dest );
+ break;
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy( name );
+ CleanupStack::PopAndDestroy( &dest );
+ }
+ }
+
+ if( foundDestId == 0 )
+ {
+ VCXLOGLO1( "CIptvIptvTestUtilALR:: destination not found!");
+ User::Leave( KErrNotFound );
+ }
+
+ destIds.Reset();
+ destIds.Close();
+
+ VCXLOGLO1("<<<CIptvIptvTestUtilALR::GetDestinationIdL");
+ return foundDestId;
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::TerminateDestinationConnectionsL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CIptvTestUtilALR::TerminateDestinationConnectionsL( TDesC& aDestinationName )
+ {
+ VCXLOGLO1(">>>CIptvIptvTestUtilALR::TerminateDestinationConnectionsL");
+
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: aDestinationName: %S", &aDestinationName );
+
+ TInt destId = GetDestinationIdL( aDestinationName );
+ RCmDestinationExt destination = iCmManager.DestinationL( destId );
+ CleanupClosePushL( destination );
+
+ // Check if there's active connections for the methods
+ for(TInt e=0; e < destination.ConnectionMethodCount(); e++)
+ {
+ RCmConnectionMethodExt method = destination.ConnectionMethodL( e );
+ CleanupClosePushL( method );
+
+ HBufC* methodName = method.GetStringAttributeL( CMManager::ECmName );
+ CleanupStack::PushL( methodName );
+ TInt iapId = method.GetIntAttributeL( CMManager::ECmIapId );
+ VCXLOGLO3( "CIptvIptvTestUtilALR:: method: '%S', id: %d", methodName, iapId );
+
+ CTestUtilConnectionWaiter* connectionWaiter = CTestUtilConnectionWaiter::NewL( this );
+ CleanupStack::PushL( connectionWaiter );
+
+ // Terminate active connection
+ if( connectionWaiter->IsConnectionActive( iapId ) )
+ {
+ CTestUtilConnection* connectionUtil = CTestUtilConnection::NewL( this );
+ CleanupStack::PushL( connectionUtil );
+ connectionUtil->SetConnectionPreferences( KCommDbBearerUnknown, iapId );
+ connectionUtil->AttachL();
+
+ connectionUtil->TerminateConnectionL();
+ connectionWaiter->WaitUntilConnectionIsClosed( iapId );
+ iActiveWait->Start();
+
+ CleanupStack::PopAndDestroy( connectionUtil );
+ }
+ CleanupStack::PopAndDestroy( connectionWaiter );
+ CleanupStack::PopAndDestroy( methodName );
+ CleanupStack::PopAndDestroy( &method );
+ }
+
+ CleanupStack::PopAndDestroy( &destination );
+
+ VCXLOGLO1("<<<CIptvIptvTestUtilALR::TerminateDestinationConnectionsL");
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::PrintDestinationL
+// ---------------------------------------------------------------------------
+//
+void CIptvTestUtilALR::PrintDestinationL( RCmDestinationExt& aDestination )
+ {
+ HBufC* destName = aDestination.NameLC();
+
+ TPtr destNamePtr = destName->Des();
+ VCXLOGLO2( "CIptvIptvTestUtilALR:: Destination: %S", &destNamePtr );
+
+ for(TInt e=0; e < aDestination.ConnectionMethodCount(); e++)
+ {
+ RCmConnectionMethodExt method = aDestination.ConnectionMethodL( e );
+ CleanupClosePushL( method );
+
+ HBufC* methodName = method.GetStringAttributeL( CMManager::ECmName );
+ CleanupStack::PushL( methodName );
+
+ TUint priority = aDestination.PriorityL( method );
+ TInt iapId = method.GetIntAttributeL( CMManager::ECmIapId );
+ VCXLOGLO4( "CIptvIptvTestUtilALR:: Method: %S, priority: %d, id: %d", methodName, priority, iapId );
+
+ CleanupStack::PopAndDestroy( methodName );
+ CleanupStack::PopAndDestroy( &method );
+ }
+
+ CleanupStack::PopAndDestroy( destName );
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::MethodMatchesL
+// ---------------------------------------------------------------------------
+//
+TBool CIptvTestUtilALR::MethodMatchesL( const TDesC& aSearchedName, const TDesC& aCurrentName, TBool aStrict )
+ {
+#ifdef __WINSCW__
+ if( aSearchedName.Compare( _L("Ethernet with Daemon Dynamic IP") ) == 0 )
+ {
+ return ETrue;
+ }
+#endif
+
+ if( aSearchedName.Compare( aCurrentName ) == 0 )
+ {
+ return ETrue;
+ }
+
+ if( aStrict)
+ {
+ return EFalse;
+ }
+
+ if( aSearchedName.Compare( _L("Internet") ) == 0 || aSearchedName.Compare( _L("Internet2") ) == 0 )
+ {
+ TBuf<256> temp( aCurrentName );
+ temp.LowerCase();
+
+ _LIT(KIapElisaInternet, "elisa internet");
+ _LIT(KIapDnaGPRS, "dna gprs");
+ _LIT(KIapSoneraGPRS, "sonera gprs");
+ _LIT(KIapRLGPRS, "rl gprs");
+ _LIT(KIapInternet, "internet");
+ _LIT(KIapProinternet, "prointernet");
+ _LIT(KGprsInternet, "gprs internet");
+
+ if( temp.Compare( KIapElisaInternet ) == KErrNone ) return ETrue;
+ if( temp.Compare( KIapDnaGPRS ) == KErrNone ) return ETrue;
+ if( temp.Compare( KIapRLGPRS ) == KErrNone ) return ETrue;
+ if( temp.Compare( KIapInternet ) == KErrNone ) return ETrue;
+ if( temp.Compare( KIapProinternet ) == KErrNone ) return ETrue;
+ if( temp.Compare( KGprsInternet ) == KErrNone ) return ETrue;
+ if( temp.Compare( KIapSoneraGPRS ) == KErrNone ) return ETrue;
+ }
+
+ return EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::ConnectionCreated
+// ---------------------------------------------------------------------------
+//
+void CIptvTestUtilALR::ConnectionCreated()
+ {
+ iActiveWait->Stop();
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::ConnectionClosed
+// ---------------------------------------------------------------------------
+//
+void CIptvTestUtilALR::ConnectionClosed()
+ {
+ iActiveWait->Stop();
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::ConnectionFailed
+// ---------------------------------------------------------------------------
+//
+void CIptvTestUtilALR::ConnectionFailed()
+ {
+ iActiveWait->Stop();
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::ConnectionAlreadyExists
+// ---------------------------------------------------------------------------
+//
+void CIptvTestUtilALR::ConnectionAlreadyExists()
+ {
+ iActiveWait->Stop();
+ }
+
+// ---------------------------------------------------------------------------
+// CIptvTestUtilALR::ConnectionTimeout
+// ---------------------------------------------------------------------------
+//
+void CIptvTestUtilALR::ConnectionTimeout()
+ {
+ iActiveWait->Stop();
+ }
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/src/TestUtilConnection.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,365 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+// INCLUDE FILES
+
+#include "TestUtilConnection.h"
+
+#include "VCXTestLog.h"
+#include "MTestUtilConnectionObserver.h"
+#include <es_enum.h>
+
+// ========================== MEMBER FUNCTIONS ===============================
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnection::NewL()
+//
+// Constructs CTestUtilConnection object
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CTestUtilConnection* CTestUtilConnection::NewL(MTestUtilConnectionObserver* aObserver)
+ {
+ VCXLOGLO1(">>>CIptvTestUtilConnection::NewL");
+ CTestUtilConnection* self = NewLC(aObserver);
+ CleanupStack::Pop(self);
+ VCXLOGLO1("<<<CIptvTestUtilConnection::NewL");
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnection::NewLC()
+//
+// Constructs CTestUtilConnection object
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CTestUtilConnection* CTestUtilConnection::NewLC(MTestUtilConnectionObserver* aObserver)
+ {
+ VCXLOGLO1(">>>CIptvTestUtilConnection::NewLC");
+ CTestUtilConnection* self = new (ELeave) CTestUtilConnection(aObserver);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ VCXLOGLO1("<<<CIptvTestUtilConnection::NewLC");
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnection::CTestUtilConnection()
+//
+// Constructor
+// ---------------------------------------------------------------------------
+//
+CTestUtilConnection::CTestUtilConnection(MTestUtilConnectionObserver* aObserver)
+: CActive(CActive::EPriorityHigh), iConnectionState(EIdle), iObserver(aObserver)
+ {
+ VCXLOGLO1(">>>CIptvTestUtilConnection::CIptvTestUtilConnection");
+ SetConnectionPreferences(ECommDbBearerUnknown, 0);
+ VCXLOGLO1("<<<CIptvTestUtilConnection::CIptvTestUtilConnection");
+ }
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnection::~CTestUtilConnection()
+//
+// Destructor
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CTestUtilConnection::~CTestUtilConnection()
+ {
+ VCXLOGLO1(">>>CIptvTestUtilConnection::~CIptvTestUtilConnection");
+ Cancel();
+
+ iConnect.Close();
+ iSocketServ.Close();
+
+// iTimer.Cancel();
+// iTimer.Close();
+
+ if( IsAdded() )
+ {
+ Deque(); // calls also Cancel()
+ }
+
+ VCXLOGLO1("<<<CIptvTestUtilConnection::~CIptvTestUtilConnection");
+ }
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnection::ConstructL()
+//
+// Second phase constructor
+// ---------------------------------------------------------------------------
+//
+void CTestUtilConnection::ConstructL()
+ {
+ VCXLOGLO1(">>>CIptvTestUtilConnection::ConstructL");
+
+ iSocketServ.Connect();
+ iConnect.Open(iSocketServ);
+
+// User::LeaveIfError(iTimer.CreateLocal());
+
+ CActiveScheduler::Add(this);
+
+ VCXLOGLO1("<<<CIptvTestUtilConnection::ConstructL");
+ }
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnection::ConnectL()
+//
+// Start connecting to IAP.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CTestUtilConnection::ConnectL()
+ {
+ VCXLOGLO1(">>>CIptvTestUtilConnection::ConnectL");
+
+ if(iConnectionState == CTestUtilConnection::EConnected)
+ {
+ VCXLOGLO1(">>>CIptvTestUtilConnection:: Already connected");
+ return;
+ }
+
+ if (!IsActive())
+ {
+ iConnect.Start(iPref, iStatus);
+ iConnectionState = CTestUtilConnection::EConnecting;
+
+ //if the line below panics it's either because you made a request but you haven't
+ //SetActive the object (pR->iStatus.iFlags&TRequestStatus::EActive==0) or you didn't set the iStatus
+ //to KRequestPending (pR->iStatus.iFlags&TRequestStatus::ERequestPending==0)
+// iTimerStatus = KRequestPending;
+// iTimer.After(iTimerStatus, KTimeout);
+
+ SetActive();
+ VCXLOGLO1(">>>CIptvTestUtilConnection:: Connecting");
+ }
+ else
+ {
+ //globalNote->ShowNoteL(EAknGlobalInformationNote, KTextNotReady);
+ }
+ VCXLOGLO1("<<<CIptvTestUtilConnection::ConnectL");
+ }
+
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnection::AttachL()
+//
+// Attach to open IAP.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CTestUtilConnection::AttachL()
+ {
+ VCXLOGLO1(">>>CIptvTestUtilConnection::AttachL");
+
+ if(iConnectionState == CTestUtilConnection::EConnected)
+ {
+ VCXLOGLO1(">>>CIptvTestUtilConnection:: Already connected");
+ VCXLOGLO1("<<<CIptvTestUtilConnection::AttachL");
+ User::Leave(KErrAlreadyExists);
+ }
+
+ if (!IsActive())
+ {
+ TUint activeConnections = 0;
+ User::LeaveIfError(iConnect.EnumerateConnections(activeConnections));
+
+ TConnectionInfo info;
+ TPckg<TConnectionInfo> infoPckg(info);
+
+ TInt found = EFalse;
+ for(TInt i=1;i<=activeConnections;i++)
+ {
+
+ User::LeaveIfError(iConnect.GetConnectionInfo(i, infoPckg));
+
+ VCXLOGLO3("CIptvTestUtilConnection:: %d vs %d.", iPref.IapId(), info.iIapId);
+
+ if(info.iIapId == iPref.IapId())
+ {
+ found = ETrue;
+ break;
+ }
+
+ }
+ if(!found)
+ {
+ VCXLOGLO1(">>>CIptvTestUtilConnection:: No connection found to that AP.");
+ VCXLOGLO1("<<<CIptvTestUtilConnection::AttachL");
+ User::Leave(KErrNotFound);
+ }
+
+ User::LeaveIfError(iConnect.Attach(infoPckg, RConnection::EAttachTypeNormal));
+ iConnectionState = CTestUtilConnection::EConnected;
+ }
+
+ VCXLOGLO1("<<<CIptvTestUtilConnection::AttachL");
+ return;
+ }
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnection::RunL()
+//
+// Handle request completion events
+// ---------------------------------------------------------------------------
+//
+void CTestUtilConnection::RunL()
+ {
+ VCXLOGLO1(">>>CIptvTestUtilConnection::RunL");
+
+ /*if(iTimerStatus.Int() == KErrNone)
+ {
+ VCXLOGLO1("CTestUtilConnection:: Connection timeout.");
+ iObserver->ConnectionTimeout();
+ iTimer.Cancel();
+ }
+ */
+ TInt statusCode = iStatus.Int();
+
+ switch (statusCode)
+ {
+ case KErrNone: // Connection created succesfully
+ {
+ //PrintNoteL(KTextConnectionCreated);
+ VCXLOGLO1("CTestUtilConnection:: Connection created.");
+ iConnectionState = CTestUtilConnection::EConnected;
+// iTimer.Cancel();
+ iObserver->ConnectionCreated();
+ break;
+ }
+
+ case KErrNotFound: // Connection failed
+ {
+ //PrintNoteL(KTextGeneralError);
+ VCXLOGLO1("CTestUtilConnection:: Connection failed.");
+ iConnectionState = CTestUtilConnection::EFailed;
+ //iTimer.Cancel();
+ iObserver->ConnectionFailed();
+ break;
+ }
+
+ case KErrCancel: // Connection attempt cancelled
+ {
+ //PrintNoteL(KTextConnectionCancelled);
+ VCXLOGLO1("CTestUtilConnection:: Connection attemption canceled.");
+ iConnectionState = CTestUtilConnection::EFailed;
+// iTimer.Cancel();
+ iObserver->ConnectionFailed();
+ break;
+ }
+
+ case KErrAlreadyExists: // Connection already exists
+ {
+ //PrintNoteL(KTextConnectionExists);
+ VCXLOGLO1("CTestUtilConnection:: Connection already exists.");
+ iConnectionState = CTestUtilConnection::EFailed;
+// iTimer.Cancel();
+ iObserver->ConnectionAlreadyExists();
+ break;
+ }
+
+ default:
+ {
+ //TBuf<KErrorResolverMaxTextLength> errorText;
+ // Use text resolver to resolve error text
+ //errorText = iTextResolver->ResolveError(statusCode);
+ //PrintErrorL(errorText, statusCode);
+ VCXLOGLO2("CTestUtilConnection:: Unknown error: %d", statusCode);
+ iConnectionState = CTestUtilConnection::EFailed;
+// iTimer.Cancel();
+ iObserver->ConnectionFailed();
+ break;
+ }
+ }
+
+ VCXLOGLO1("<<<CIptvTestUtilConnection::RunL");
+ }
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnection::DoCancel()
+//
+// Cancels ongoing requests
+// ---------------------------------------------------------------------------
+//
+void CTestUtilConnection::DoCancel()
+ {
+ VCXLOGLO1(">>>CIptvTestUtilConnection::DoCancel");
+ VCXLOGLO1("<<<CIptvTestUtilConnection::DoCancel");
+ // Nothing to do here
+ }
+
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnection::TerminateConnectionL()
+//
+// This function should not be used in normal situation, since it terminates
+// the active connection, even if there are other application using
+// the connection. Calling the RConnection::Close() closes the connection.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CTestUtilConnection::TerminateConnectionL()
+ {
+ VCXLOGLO1(">>>CIptvTestUtilConnection::TermínateConnectionL");
+
+/*
+ if (iProgressNotifier->GetState() == EIAPConnectStateConnected)
+ {
+ // Show confirmation dialog first
+ if (ShowQueryDialogL())
+ {
+ // RConnection::Stop() terminates connection by stopping whole
+ // network interface even if there are other clients using
+ // the connection. It is not recommended to use it unless it is
+ // really meaningful.
+ User::LeaveIfError(iConnect.Stop());
+
+ }
+ }
+ else
+ {
+ PrintNoteL(KTextNotConnected);
+ }
+ */
+ User::LeaveIfError(iConnect.Stop());
+ VCXLOGLO1("<<<CIptvTestUtilConnection::TermínateConnectionL");
+ }
+
+CTestUtilConnection::TConnectionState CTestUtilConnection::GetState()
+ {
+ return iConnectionState;
+ }
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnection::SetConnectionPreferences(TUint aBearer,
+// TBool aDialog,
+// TUint32 aIapId)
+//
+// This function sets connection preferences.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CTestUtilConnection::SetConnectionPreferences(
+ TUint aBearer,
+ TUint32 aIapId)
+ {
+ VCXLOGLO1(">>>CIptvTestUtilConnection::SetConnectionPreferences");
+ iPref.SetDirection(ECommDbConnectionDirectionOutgoing);
+ iPref.SetDialogPreference(ECommDbDialogPrefDoNotPrompt);
+ iPref.SetIapId(aIapId);
+ iPref.SetBearerSet(aBearer);
+ iPref.SetDirection(ECommDbConnectionDirectionOutgoing);
+ VCXLOGLO1("<<<CIptvTestUtilConnection::SetConnectionPreferences");
+ }
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/src/TestUtilConnectionWaiter.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,315 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+// INCLUDE FILES
+
+#include "TestUtilConnectionWaiter.h"
+#include "VCXTestLog.h"
+#include "MTestUtilConnectionObserver.h"
+
+const TInt KMillion = 1000000;
+
+// ========================== MEMBER FUNCTIONS ===============================
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnectionWaiter::NewL()
+//
+// Constructs CTestUtilConnectionWaiter object
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CTestUtilConnectionWaiter* CTestUtilConnectionWaiter::NewL(MTestUtilConnectionObserver* aObserver)
+ {
+ VCXLOGLO1(">>>CTestUtilConnectionWaiter::NewL");
+ CTestUtilConnectionWaiter* self = NewLC(aObserver);
+ CleanupStack::Pop(self);
+ VCXLOGLO1("<<<CTestUtilConnectionWaiter::NewL");
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnectionWaiter::NewLC()
+//
+// Constructs CTestUtilConnectionWaiter object
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CTestUtilConnectionWaiter* CTestUtilConnectionWaiter::NewLC(MTestUtilConnectionObserver* aObserver)
+ {
+ VCXLOGLO1(">>>CTestUtilConnectionWaiter::NewLC");
+ CTestUtilConnectionWaiter* self = new (ELeave) CTestUtilConnectionWaiter(aObserver);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ VCXLOGLO1("<<<CTestUtilConnectionWaiter::NewLC");
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnectionWaiter::CTestUtilConnectionWaiter()
+//
+// Constructor
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CTestUtilConnectionWaiter::CTestUtilConnectionWaiter(MTestUtilConnectionObserver* aObserver)
+: CActive(CActive::EPriorityHigh), iObserver(aObserver)
+ {
+ VCXLOGLO1(">>>CTestUtilConnectionWaiter::CTestUtilConnectionWaiter");
+
+ VCXLOGLO1("<<<CTestUtilConnectionWaiter::CTestUtilConnectionWaiter");
+ }
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnectionWaiter::~CTestUtilConnectionWaiter()
+//
+// Destructor
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CTestUtilConnectionWaiter::~CTestUtilConnectionWaiter()
+ {
+ VCXLOGLO1(">>>CTestUtilConnectionWaiter::~CTestUtilConnectionWaiter");
+
+ if( IsAdded() )
+ {
+ Deque(); // calls also Cancel()
+ }
+
+ iServ.Close();
+
+ iTimer.Close();
+
+ VCXLOGLO1("<<<CTestUtilConnectionWaiter::~CTestUtilConnectionWaiter");
+ }
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnectionWaiter::ConstructL()
+//
+// Second phase constructor
+// ---------------------------------------------------------------------------
+//
+void CTestUtilConnectionWaiter::ConstructL()
+ {
+ VCXLOGLO1(">>>CTestUtilConnectionWaiter::ConstructL");
+
+ // get connection for the iap
+
+ TInt err = iServ.Connect();
+ if(err != KErrNone)
+ {
+ VCXLOGLO2("Could not connect to socket server, %d.", err);
+ User::Leave(err);
+ }
+
+ User::LeaveIfError(iTimer.CreateLocal());
+
+ CActiveScheduler::Add(this);
+
+
+ VCXLOGLO1("<<<CTestUtilConnectionWaiter::ConstructL");
+ }
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnectionWaiter::WaitForConnection()
+//
+// Start waiting the IAP to be active
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CTestUtilConnectionWaiter::WaitForConnection(TUint32 aIapId)
+ {
+ VCXLOGLO1(">>>CTestUtilConnectionWaiter::WaitForConnection");
+
+ if (!IsActive())
+ {
+ iWaitState = EWaitingConnection;
+
+ iIapId = aIapId;
+ iTimer.After(iStatus, KMillion);
+ SetActive();
+ iCheckCount = 0;
+
+ VCXLOGLO2(">>>CTestUtilConnectionWaiter:: Waiting until connection is created for Iap: %d", aIapId);
+ }
+ else
+ {
+ VCXLOGLO1(">>>CTestUtilConnectionWaiter:: error - already ACTIVE");
+ }
+
+ VCXLOGLO1("<<<CTestUtilConnectionWaiter::WaitForConnection");
+ }
+
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnectionWaiter::WaitUntilConnectionIsClosed()
+//
+// Start waiting the IAP to be active
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CTestUtilConnectionWaiter::WaitUntilConnectionIsClosed(TUint32 aIapId)
+ {
+ VCXLOGLO1(">>>CTestUtilConnectionWaiter::WaitUntilConnectionIsClosed");
+
+ if (!IsActive())
+ {
+ iWaitState = EWaitingConnectionClosed;
+
+ iIapId = aIapId;
+ iTimer.After(iStatus, KMillion);
+ SetActive();
+ iCheckCount = 0;
+
+ VCXLOGLO2(">>>CTestUtilConnectionWaiter:: Waiting until connection closed for Iap: %d", aIapId);
+ }
+ else
+ {
+ VCXLOGLO1(">>>CTestUtilConnectionWaiter:: error - already ACTIVE");
+ }
+
+ VCXLOGLO1("<<<CTestUtilConnectionWaiter::WaitUntilConnectionIsClosed");
+ }
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnectionWaiter::RunL()
+//
+// Handle request completion events
+// ---------------------------------------------------------------------------
+//
+void CTestUtilConnectionWaiter::RunL()
+ {
+ VCXLOGLO1(">>>CTestUtilConnectionWaiter::RunL");
+
+// TInt statusCode = iStatus.Int();
+
+ if( iCheckCount++ == 30 )
+ {
+ VCXLOGLO1("CTestUtilConnectionWaiter:: Connection request timed out.");
+ iObserver->ConnectionTimeout();
+ iCheckCount = 0;
+ Cancel();
+ }
+ else
+ {
+ switch(iWaitState)
+ {
+ case EWaitingConnection:
+ {
+ if(IsConnectionActive(iIapId))
+ {
+ iObserver->ConnectionCreated();
+ iWaitState = ENoWaitState;
+ VCXLOGLO1("Connection is active!");
+ }
+ else
+ {
+ SetActive();
+ iTimer.After(iStatus, KMillion);
+ }
+ }
+ break;
+
+ case EWaitingConnectionClosed:
+ {
+ if(!IsConnectionActive(iIapId))
+ {
+ iObserver->ConnectionClosed();
+ iWaitState = ENoWaitState;
+ VCXLOGLO1("Connection is closed!");
+ }
+ else
+ {
+ SetActive();
+ iTimer.After(iStatus, KMillion);
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ VCXLOGLO1("<<<CTestUtilConnectionWaiter::RunL");
+
+ }
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnectionWaiter::DoCancel()
+//
+// Cancels ongoing requests
+// ---------------------------------------------------------------------------
+//
+void CTestUtilConnectionWaiter::DoCancel()
+ {
+ VCXLOGLO1(">>>CTestUtilConnectionWaiter::DoCancel");
+ iTimer.Cancel();
+ VCXLOGLO1("<<<CTestUtilConnectionWaiter::DoCancel");
+ }
+
+// ---------------------------------------------------------------------------
+// CTestUtilConnectionWaiter::IsConnectionActive(TUint32 aIapId)
+//
+// Checks if IAP specified in iWaitConnectionForIapId is active
+// ---------------------------------------------------------------------------
+EXPORT_C TBool CTestUtilConnectionWaiter::IsConnectionActive(TUint32 aIapId)
+ {
+ VCXLOGLO1(">>>CTestUtilConnectionWaiter::IsConnectionActive");
+
+ RConnection connection;
+
+ TUint count;
+
+ TInt err = connection.Open(iServ, KAfInet);
+
+ if(err != KErrNone)
+ {
+ iServ.Close();
+ VCXLOGLO2("CTestUtilConnectionWaiter::Could not connect to open connection: %d.", err);
+ User::Leave(err);
+ }
+
+ err = connection.EnumerateConnections(count);
+ if(err != KErrNone)
+ {
+ connection.Close();
+ iServ.Close();
+ VCXLOGLO2("CTestUtilConnectionWaiter::Could not enum connections, %d.", err);
+ User::Leave(err);
+ }
+
+ for(; count; --count)
+ {
+ TPckgBuf<TConnectionInfo> connInfo;
+
+ if(connection.GetConnectionInfo(count, connInfo) == KErrNone)
+ {
+ VCXLOGLO2("CTestUtilConnectionWaiter:: Connection IAP id: %d", connInfo().iIapId);
+
+ if(aIapId == connInfo().iIapId)
+ {
+ VCXLOGLO1("CTestUtilConnectionWaiter:: IAP is connected.");
+ VCXLOGLO1("<<<CTestUtilConnectionWaiter::IsConnectionActive");
+ connection.Close();
+ return ETrue;
+ }
+ }
+ }
+
+ connection.Close();
+
+ VCXLOGLO1("<<<CTestUtilConnectionWaiter::IsConnectionActive");
+ return EFalse;
+ }
+
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/src/VCXTestCommon.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,1308 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32Base.h>
+#include <tz.h>
+#include <badesca.h>
+#include <commdb.h>
+#include <mmf/common/mmfcontrollerpluginresolver.h>
+
+#include "VCXTestCommon.h"
+#include "CIptvTestVerifyData.h"
+#include "TestUtilConnectionWaiter.h"
+#include "VCXTestLog.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+_LIT(KDummyfilePathFormat, "%S:\\data\\temp");
+_LIT(KDummyfileFormat, "%d.dat");
+_LIT(KDoubleBacklash, "\\");
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::CVCXTestCommon
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CVCXTestCommon::CVCXTestCommon()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CVCXTestCommon::ConstructL()
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::ConstructL");
+
+ User::LeaveIfError( iFs.Connect() );
+
+ PrintIaps();
+
+ PrintDriveInfo( _L("C") );
+ PrintDriveInfo( _L("E") );
+ PrintDriveInfo( _L("D") );
+ PrintDriveInfo( _L("F") );
+
+ //ListDir( _L("C:\\"), 0 );
+ //ListDir( _L("E:\\"), 0 );
+
+ iIptvVerifyData = CIptvTestVerifyData::NewL();
+ iVideoCreator = CIptvTestVideoCreator::NewL();
+
+ VCXLOGLO1("<<<CVCXTestCommon::ConstructL");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServicesFromFile::~CVCXTestCommon
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CVCXTestCommon::~CVCXTestCommon()
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::~CVCXTestCommon");
+
+ delete iIptvVerifyData;
+ iIptvVerifyData = NULL;
+
+ delete iVideoCreator;
+ iVideoCreator = NULL;
+
+ iFs.Close();
+
+ VCXLOGLO1("<<<CVCXTestCommon::~CVCXTestCommon");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CVCXTestCommon* CVCXTestCommon::NewL()
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::NewL");
+ CVCXTestCommon* self = new( ELeave ) CVCXTestCommon;
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ VCXLOGLO1("<<<CVCXTestCommon::NewL");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::GetFileSize
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CVCXTestCommon::GetFileSize(TDesC& aFullPath, TUint32& aFileSize)
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::GetFileSize");
+ TBool rv = FALSE;
+ TEntry entry;
+ TInt err = KErrNone;
+
+ aFileSize=0;
+
+ err = iFs.Entry( aFullPath, entry );
+
+ if(KErrNone == err && !entry.IsDir())
+ {
+ aFileSize = entry.iSize;
+ rv = TRUE;
+ }
+
+ VCXLOGLO1("<<<CVCXTestCommon::GetFileSize");
+ return rv;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::GetIapIdL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CVCXTestCommon::GetIapIdL(const TDesC& aIapName, TUint32& aIapId)
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::GetIapIdL");
+
+ TBool found( EFalse );
+
+#ifdef __WINSCW__
+ if( aIapName != KIptvTestBadIapName && aIapName != _L("invalidiap") )
+ {
+ _LIT(KEmulatorIap, "Ethernet with Daemon Dynamic IP");
+ found = GetIapIdByNameL(KEmulatorIap, aIapId);
+ VCXLOGLO1("<<<CVCXTestCommon::GetIapIdL");
+ return found;
+ }
+#endif
+
+ VCXLOGLO2("CVCXTestCommon:: Searching IAP: %S", &aIapName);
+
+ found = GetIapIdByNameL(aIapName, aIapId);
+
+ // Iap with exact name found
+ if( found )
+ {
+ VCXLOGLO1("<<<CVCXTestCommon::GetIapIdL");
+ return found;
+ }
+ else
+ if(aIapName == KIptvTestBadIapName) // Search bad iap only for a name.
+ {
+ VCXLOGLO2("CVCXTestCommon:: Iap with name %S not found!", &aIapName);
+ VCXLOGLO1("<<<CVCXTestCommon::GetIapIdL");
+ return found;
+ }
+
+ VCXLOGLO1("<<<CVCXTestCommon:: Iap with exact name was not found.");
+
+ TBuf<128> searchFor(aIapName);
+ searchFor.LowerCase();
+
+ if(searchFor == _L("invalidiap") )
+ {
+ aIapId = 6000;
+ VCXLOGLO1("<<<CVCXTestCommon::GetIapIdL");
+ return ETrue;
+ }
+
+ TBool isWlanIapName( EFalse );
+
+ if( aIapName == _L("wlan") )
+ {
+ found = GetIapIdByTypeL(CVCXTestCommon::EWlanIap, aIapId, 0);
+ isWlanIapName = ETrue;
+ }
+ else
+ if( aIapName == _L("wlan2") )
+ {
+ found = GetIapIdByTypeL(CVCXTestCommon::EWlanIap, aIapId, 1);
+ isWlanIapName = ETrue;
+ }
+ else
+ if( aIapName == _L("internet") )
+ {
+ found = GetIapIdByTypeL(CVCXTestCommon::EGprsIap, aIapId, 0);
+ }
+ else
+ if( aIapName == _L("internet2") )
+ {
+ found = GetIapIdByTypeL(CVCXTestCommon::EGprsIap, aIapId, 1);
+ }
+
+ if( !found && !isWlanIapName )
+ {
+ VCXLOGLO1("<<<CVCXTestCommon:: Trying to find alternative IAP.");
+
+ // Try search other known GPRS IAPs
+ _LIT(KIapElisaInternet, "elisa internet");
+ _LIT(KIapElisaMMS, "elisa mms");
+ _LIT(KIapInternet, "internet");
+ _LIT(KIapProinternet, "prointernet");
+ _LIT(KGprsInternet, "gprs internet");
+
+ if( GetIapIdByNameL(KIapElisaInternet, aIapId) ||
+ GetIapIdByNameL(KIapElisaMMS, aIapId) ||
+ GetIapIdByNameL(KIapInternet, aIapId) ||
+ GetIapIdByNameL(KIapProinternet, aIapId) ||
+ GetIapIdByNameL(KGprsInternet, aIapId) )
+ {
+ found = ETrue;
+ }
+
+ if( !found )
+ {
+ VCXLOGLO1("<<<CVCXTestCommon:: Any GPRS IAP is good...");
+ found = GetIapIdByTypeL(CVCXTestCommon::EGprsIap, aIapId, 0);
+ }
+ }
+ else
+ {
+ VCXLOGLO1("<<<CVCXTestCommon:: WLAN IAP wanted. Not found.");
+ }
+
+ VCXLOGLO1("<<<CVCXTestCommon::GetIapIdL");
+ return found;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::GetIapIdByNameL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CVCXTestCommon::GetIapIdByNameL(const TDesC& aIapName, TUint32& aIapId)
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::GetIapIdByNameL");
+ TBool found = EFalse;
+ aIapId = 0;
+
+ TBuf<128> searchFor(aIapName);
+ searchFor.LowerCase();
+
+ // Get IAP names and ids from the database
+ CCommsDatabase* cdb( NULL );
+ TRAPD( err, cdb = CCommsDatabase::NewL( EDatabaseTypeIAP ) );
+ if( err != KErrNone )
+ {
+ VCXLOGLO2("CVCXTestCommon::GetIapIdByNameL: CCommsDatabase::NewL left: %d, leaving", err);
+ User::Leave( err );
+ }
+ CleanupStack::PushL( cdb );
+
+ cdb->ShowHiddenRecords();
+
+ CCommsDbTableView* view( NULL );
+ TRAP( err, view = cdb->OpenTableLC( TPtrC(IAP) ); CleanupStack::Pop( view ); );
+ CleanupStack::PushL( view );
+
+ if( err != KErrNone )
+ {
+ VCXLOGLO2("CVCXTestCommon::GetIapIdByNameL: CCommsDatabase::OpenTableLC left: %d, leaving", err);
+ User::Leave( err );
+ }
+
+ TBuf<40> name;
+ TUint32 id;
+ TInt res = view->GotoFirstRecord();
+ while( res == KErrNone )
+ {
+ TRAP( err, view->ReadTextL( TPtrC(COMMDB_NAME), name ) );
+ if( err != KErrNone ) continue;
+ TRAP( err, view->ReadUintL( TPtrC(COMMDB_ID), id ) );
+ if( err != KErrNone ) continue;
+
+ name.LowerCase();
+ if(searchFor == name)
+ {
+ aIapId = id;
+ VCXLOGLO3("CVCXTestCommon:: Found IAP: %d, %S", aIapId, &aIapName);
+ found = ETrue;
+ break;
+ }
+ res = view->GotoNextRecord();
+ }
+
+ CleanupStack::PopAndDestroy( view );
+ CleanupStack::PopAndDestroy( cdb );
+
+ VCXLOGLO1("<<<CVCXTestCommon::GetIapIdByNameL");
+ return found;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::GetIapIdByTypeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CVCXTestCommon::GetIapIdByTypeL(TIptvTestIapType aType, TUint32& aIapId, TInt aOrderNumber)
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::GetIapIdByTypeL");
+
+ aIapId = 0;
+ TBool found( EFalse );
+
+ #ifdef __WINSCW__
+ found = GetIapIdByNameL( _L("Ethernet with Daemon Dynamic IP"), aIapId );
+ VCXLOGLO1("<<<CVCXTestCommon::GetIapIdByTypeL");
+ return found;
+ #endif
+
+ // Get AP names and ids from the database
+ CCommsDatabase* TheDb = CCommsDatabase::NewL( EDatabaseTypeIAP );
+ CleanupStack::PushL( TheDb );
+
+ TheDb->ShowHiddenRecords();
+
+ CCommsDbTableView* view = TheDb->OpenTableLC( TPtrC(IAP) );
+
+ TBuf<40> name;
+ TUint32 id;
+ TBuf<255> iapType;
+ TInt matchCount(0);
+
+ TInt res = view->GotoFirstRecord();
+
+ while( res == KErrNone )
+ {
+ view->ReadTextL( TPtrC(COMMDB_NAME), name );
+ view->ReadUintL( TPtrC(COMMDB_ID), id );
+ view->ReadTextL( TPtrC(IAP_SERVICE_TYPE), iapType);
+
+ VCXLOGLO3("CVCXTestCommon:: name: %S, id: %d", &name, id);
+ VCXLOGLO2("CVCXTestCommon:: type: %S", &iapType);
+
+ if( ( iapType == _L("LANService") && aType == EWlanIap && name != _L("Easy WLAN") ) ||
+ ( iapType == _L("OutgoingGPRS") && aType == EGprsIap ) )
+ {
+ if( matchCount == aOrderNumber )
+ {
+ found = ETrue;
+ aIapId = id;
+ break;
+ }
+ matchCount++;
+ }
+
+ res = view->GotoNextRecord();
+ }
+
+ CleanupStack::PopAndDestroy( view ); // view
+ CleanupStack::PopAndDestroy( TheDb ); // TheDb
+
+ VCXLOGLO1("<<<CVCXTestCommon::GetIapIdByTypeL");
+ return found;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::GetIapNameById
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CVCXTestCommon::GetIapNameById(TDes& aIapName, TUint32 aIapId)
+ {
+ TBool found = FALSE;
+
+ // Get AP names and ids from the database
+ CCommsDatabase* TheDb = CCommsDatabase::NewL( EDatabaseTypeIAP );
+ CleanupStack::PushL( TheDb );
+
+ TheDb->ShowHiddenRecords();
+
+ CCommsDbTableView* view = TheDb->OpenTableLC( TPtrC(IAP) );
+
+ TBuf<40> name;
+ TUint32 id;
+ TInt res = view->GotoFirstRecord();
+
+ while( res == KErrNone )
+ {
+ view->ReadTextL( TPtrC(COMMDB_NAME), name );
+ view->ReadUintL( TPtrC(COMMDB_ID), id );
+
+ res = view->GotoNextRecord();
+ //VCXLOGLO3("IAP name, id: %S, %d", &name, id);
+ if(id == aIapId)
+ {
+ found = TRUE;
+ aIapName.Zero();
+ aIapName.Append(name);
+ break;
+ }
+ }
+
+ CleanupStack::PopAndDestroy( view ); // view
+ CleanupStack::PopAndDestroy( TheDb ); // TheDb
+
+ return found;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::PrintIaps
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestCommon::PrintIaps()
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::PrintIaps");
+ // Get IAP names and ids from the database
+ CCommsDatabase* TheDb( NULL );
+ TRAPD( err, TheDb = CCommsDatabase::NewL( EDatabaseTypeIAP ) );
+
+ if( err == KErrNone && TheDb )
+ {
+ CleanupStack::PushL( TheDb );
+
+ TheDb->ShowHiddenRecords();
+
+ CCommsDbTableView* view( NULL );
+ TRAP( err, view = TheDb->OpenTableLC( TPtrC(IAP) ); CleanupStack::Pop( view ); );
+ CleanupStack::PushL( view );
+
+ if( err == KErrNone && view )
+ {
+ TBuf<40> name;
+ TUint32 id;
+ err = view->GotoFirstRecord();
+ while( err == KErrNone )
+ {
+ TRAP( err, view->ReadTextL( TPtrC(COMMDB_NAME), name ) );
+ if( err != KErrNone ) break;
+ TRAP( err, view->ReadUintL( TPtrC(COMMDB_ID), id ) );
+ if( err != KErrNone ) break;
+ VCXLOGLO3("CVCXTestCommon:: IAP name, id: %S, %d", &name, id);
+
+ err = view->GotoNextRecord();
+ if( err != KErrNone ) break;
+ }
+ }
+ CleanupStack::PopAndDestroy( view ); // view
+ CleanupStack::PopAndDestroy( TheDb ); // TheDb
+ }
+ VCXLOGLO1("<<<CVCXTestCommon::PrintIaps");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestVerifyData::CreateVerifyData
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVCXTestCommon::CreateVerifyData(TDesC& aVerifyId, TBool aAppend)
+ {
+ VCXLOGLO2(">>>CVCXTestCommon::CreateVerifyData: %S", &aVerifyId);
+ TInt result = KErrNone;
+ TRAPD(err, result = iIptvVerifyData->CreateVerifyDataL(aVerifyId, aAppend));
+ if(err != KErrNone)
+ {
+ VCXLOGLO2("CIptvVerifyData::CreateVerifyDataL caused a leave. %d", err);
+ result = err;
+ }
+ VCXLOGLO1("<<<CVCXTestCommon::CreateVerifyData");
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestVerifyData::WriteVerifyData
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVCXTestCommon::WriteVerifyData(TDesC& aVerifyId, TDesC& aVerifyData)
+ {
+ //VCXLOGLO1(">>>CVCXTestCommon::WriteVerifyData");
+ TInt result = KErrNone;
+ TRAPD(err, result = iIptvVerifyData->WriteVerifyDataL(aVerifyId, aVerifyData));
+ if(err != KErrNone)
+ {
+ VCXLOGLO2("CIptvVerifyData::WriteVerifyDataL caused a leave. %d", err);
+ result = err;
+ }
+ //VCXLOGLO1("<<<CVCXTestCommon::WriteVerifyData");
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestVerifyData::WriteVerifyData
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVCXTestCommon::WriteVerifyData(TDesC& aVerifyId, TRefByValue<const TDesC> aFmt, ... )
+ {
+ //VCXLOGLO1(">>>CVCXTestCommon::WriteVerifyData(formatted)");
+
+ VA_LIST argptr; //pointer to argument list
+ VA_START( argptr, aFmt );
+
+ HBufC* str;
+ str = HBufC::NewLC(1024*3);
+
+ //TBuf<512*3> str;
+ //TBuf<512> format(_L("TESTI: %d, %S"));
+
+ str->Des().FormatList(aFmt, argptr);
+
+ TInt result = KErrNone;
+ TRAPD(err, result = iIptvVerifyData->WriteVerifyDataL(aVerifyId, *str));
+
+ CleanupStack::PopAndDestroy(str);
+
+ if(err != KErrNone)
+ {
+ VCXLOGLO2("CIptvVerifyData::WriteVerifyDataL caused a leave. %d", err);
+ result = err;
+ }
+
+ //VCXLOGLO1("<<<CVCXTestCommon::WriteVerifyData(formatted)");
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestVerifyData::VerifyData
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVCXTestCommon::VerifyData(TDesC& aVerifyId, CIptvTestVerifyData::TVerifyResult& aVerifyResult)
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::VerifyData");
+ TInt result = KErrNone;
+ TRAPD(err, result = iIptvVerifyData->VerifyDataL(aVerifyId, aVerifyResult));
+ if(err != KErrNone)
+ {
+ VCXLOGLO2("CIptvVerifyData::VerifyDataL caused a leave. %d", err);
+ result = err;
+ }
+ VCXLOGLO1("<<<CVCXTestCommon::VerifyData");
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestVerifyData::EnableVerifyTimestamps
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestCommon::EnableVerifyTimestamps( TBool aUseTimestamps )
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::EnableVerifyTimestamps");
+ iIptvVerifyData->EnableTimestamps( aUseTimestamps );
+ VCXLOGLO1("<<<CVCXTestCommon::EnableVerifyTimestamps");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::ParseIntFromString
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CVCXTestCommon::ParseIntFromString(TInt& aInt, TDesC& aString)
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::ParseIntFromString");
+
+ TLex lex(aString);
+ TInt err = lex.Val(aInt);
+
+ VCXLOGLO1("<<<CVCXTestCommon::ParseIntFromString");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::CreateBadIapL
+// Creates a not working, crappy iap with given name.
+// Use with caution, because there is no easy way of removing created iaps
+//
+// @param aName name of the iap to be created
+// @return iapId new iap's id.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TUint32 CVCXTestCommon::CreateBadIapL(TDesC& aName)
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::CreateBadIapL");
+ CCommsDatabase* cdb = CCommsDatabase::NewL( EDatabaseTypeIAP );
+ CleanupStack::PushL( cdb );
+
+ TBuf16<40> name;
+ name.Copy( aName );
+
+ TUint32 iapId( 0 );
+ TUint32 iapServiceId( 1 );
+ TUint32 id( 2 );
+ TUint32 iapNetworkId( 3 );
+ TUint32 weighting( 4 );
+ TUint32 loc( 5 );
+
+ User::LeaveIfError( cdb->BeginTransaction() );
+
+ CCommsDbTableView* iapTable = cdb->OpenTableLC( TPtrC( IAP ) );
+
+ User::LeaveIfError( iapTable->InsertRecord( iapId ) );
+
+ iapTable->WriteTextL( TPtrC( COMMDB_NAME ), name );
+ iapTable->WriteUintL( TPtrC( IAP_SERVICE ), iapServiceId );
+ iapTable->WriteTextL( TPtrC( IAP_SERVICE_TYPE ), TPtrC( LAN_SERVICE ) );
+ iapTable->WriteTextL( TPtrC( IAP_BEARER_TYPE ), TPtrC( LAN_BEARER ) );
+ iapTable->WriteUintL( TPtrC( IAP_BEARER ), id );
+ iapTable->WriteUintL( TPtrC( IAP_NETWORK ), iapNetworkId );
+ iapTable->WriteUintL( TPtrC( IAP_NETWORK_WEIGHTING ), weighting );
+ iapTable->WriteUintL( TPtrC( IAP_LOCATION ), loc );
+
+ User::LeaveIfError( iapTable->PutRecordChanges( EFalse, EFalse ) );
+
+ CleanupStack::PopAndDestroy( iapTable );
+
+ User::LeaveIfError( cdb->CommitTransaction() );
+
+ CleanupStack::PopAndDestroy( cdb );
+ VCXLOGLO1("<<<CVCXTestCommon::CreateBadIapL");
+ return iapId;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::AdvanceSystemTimeSeconds
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVCXTestCommon::AdvanceSystemTimeSeconds( TInt aCount )
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::AdvanceSystemTimeSeconds");
+
+ TTime now;
+ now.HomeTime();
+
+ TTimeIntervalSeconds second(1*aCount);
+ now += second;
+
+ TInt err = CVCXTestCommon::SetSystemTime(now);
+
+ VCXLOGLO1("<<<CVCXTestCommon::AdvanceSystemTimeSeconds");
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::AdvanceSystemTimeMinutes
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVCXTestCommon::AdvanceSystemTimeMinutes( TInt aCount )
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::AdvanceSystemTimeMinutes");
+
+ TTime now;
+ now.HomeTime();
+
+ TTimeIntervalSeconds minute(1*60*aCount);
+ now += minute;
+
+ TInt err = CVCXTestCommon::SetSystemTime(now);
+
+ VCXLOGLO1("<<<CVCXTestCommon::AdvanceSystemTimeMinutes");
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::AdvanceSystemTimeHours
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVCXTestCommon::AdvanceSystemTimeHours( TInt aCount )
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::AdvanceSystemTimeHours");
+
+ TTime now;
+ now.HomeTime();
+
+ TTimeIntervalSeconds hour(1*60*60*aCount);
+ now += hour;
+
+ TInt err = CVCXTestCommon::SetSystemTime(now);
+
+ VCXLOGLO1("<<<CVCXTestCommon::AdvanceSystemTimeHours");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::SetSystemTime()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVCXTestCommon::SetSystemTime(TTime aTime)
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::SetSystemTime");
+
+ TTime noDST(aTime);
+ RTz tz;
+ TInt err = tz.Connect();
+ if(err != KErrNone)
+ {
+ VCXLOGLO2("RTz::Connect failed: %d", err);
+ VCXLOGLO1("<<<CVCXTestCommon::SetSystemTime");
+ return err;
+ }
+ CleanupClosePushL(tz);
+ err = tz.SetHomeTime(noDST);
+ if(err != KErrNone)
+ {
+ VCXLOGLO2("RTz::SetHomeTime failed: %d", err);
+ VCXLOGLO1("<<<CVCXTestCommon::SetSystemTime");
+ CleanupStack::PopAndDestroy(&tz);
+ return err;
+ }
+
+ CleanupStack::PopAndDestroy(&tz);
+
+ VCXLOGLO1("<<<CVCXTestCommon::SetSystemTime");
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::SetTimeZone()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVCXTestCommon::SetTimeZone(TDesC& aTimeZone)
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::SetTimeZone");
+
+ RTz tz;
+ TInt err = tz.Connect();
+ if(err != KErrNone)
+ {
+ VCXLOGLO2("RTz::Connect failed: %d", err);
+ VCXLOGLO1("<<<CVCXTestCommon::SetTimeZone");
+ return err;
+ }
+ CleanupClosePushL(tz);
+
+ TBuf8<256> timezone;
+ timezone.Copy( aTimeZone ); // Conversion
+
+ CTzId* tzId = CTzId::NewL( timezone );
+ CleanupStack::PushL(tzId);
+
+ TRAP(err, tz.SetTimeZoneL( *tzId ) );
+ CleanupStack::PopAndDestroy(tzId);
+ CleanupStack::PopAndDestroy(&tz);
+
+ if(err != KErrNone)
+ {
+ VCXLOGLO2("RTz::SetTimeZone failed: %d", err);
+ VCXLOGLO1("<<<CVCXTestCommon::SetTimeZone");
+ return err;
+ }
+
+ VCXLOGLO1("<<<CVCXTestCommon::SetTimeZone");
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::CreateVideoFileL()
+//
+// Creates a video file to file system.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestCommon::CreateVideoFileL( CIptvTestVideoCreator::TIptvTestVideoType aVideoType, TDesC& aFileName, TInt aSize )
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::CreateVideoFileL");
+ iVideoCreator->CreateVideoL( aVideoType, aFileName, aSize );
+ VCXLOGLO1("<<<CVCXTestCommon::CreateVideoFileL");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::CreateVideoFilesL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestCommon::CreateVideoFilesL( CIptvTestVideoCreator::TIptvTestVideoType aVideoType, TDesC& aFileName, TInt aCount, RPointerArray<HBufC>& aFileArray )
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::CreateVideoFilesL");
+ iVideoCreator->CreateVideosL( aVideoType, aFileName, aCount, aFileArray );
+ VCXLOGLO1("<<<CVCXTestCommon::CreateVideoFilesL");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::SetDriveFreeSpaceL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestCommon::SetDriveFreeSpaceL( TInt aDriveNumber, TUint aDesiredFreeSpace )
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::SetDriveFreeSpaceL");
+
+ const TInt KIptvTest1KB = 1024;
+ const TInt KIptvTest1MB = KIptvTest1KB*KIptvTest1KB;
+
+#ifdef __WINSCW__
+ if(aDriveNumber == EDriveC)
+ {
+ VCXLOGLO1("CVCXTestCommon:: ABORT! No C drive fill in emulator.");
+ User::Leave( KErrAbort );
+ }
+#endif
+
+ TChar driveLetter;
+ User::LeaveIfError( RFs::DriveToChar( aDriveNumber, driveLetter ) );
+
+ TBuf<255> path;
+ path.Append( driveLetter );
+ path.Append( _L(":\\data\\temp") );
+ path.Append( KDoubleBacklash );
+
+ // First check that if there's free space to fill.
+
+ TInt64 spaceToReserve = 0;
+ CalculateSpaceToReserveL(iFs, aDriveNumber, aDesiredFreeSpace, spaceToReserve);
+
+ if( spaceToReserve == 0 )
+ {
+ VCXLOGLO1("<<<CVCXTestCommon::SetDriveFreeSpaceL");
+ return;
+ }
+
+ // No space, try freeing by deleting existing dummy files.
+ if( spaceToReserve < 0 )
+ {
+ VCXLOGLO1("CVCXTestCommon:: Trying to free some space.");
+
+ for( TInt i=50; i>0; i-- )
+ {
+ TBuf<256> filePath;
+ filePath.Zero();
+ filePath.Append( path );
+ filePath.AppendFormat( KDummyfileFormat, i );
+ if( BaflUtils::FileExists( iFs, filePath ) )
+ {
+ VCXLOGLO2("CVCXTestCommon:: Deleting %S.", &filePath);
+ iFs.Delete( filePath );
+ CalculateSpaceToReserveL(iFs, aDriveNumber, aDesiredFreeSpace, spaceToReserve);
+
+ // Is there's enough free space now.
+ if( spaceToReserve > 0 )
+ {
+ break;
+ }
+ }
+ }
+
+ // Recheck free space.
+ if( spaceToReserve < 0 )
+ {
+ VCXLOGLO1("CVCXTestCommon:: Error! There's already less than wanted space!");
+ User::Leave( KErrAbort );
+ }
+ }
+
+ BaflUtils::EnsurePathExistsL(iFs, path);
+
+ // Start creating files of 256 MB size.
+ TInt64 dummyFileSize = 256 * KIptvTest1MB;
+
+ TInt count = 0;
+ while( ETrue )
+ {
+ // Check that there's still enough free space for the dummyfile
+ CalculateSpaceToReserveL( iFs, aDriveNumber, aDesiredFreeSpace, spaceToReserve );
+
+ if( spaceToReserve <= 0 )
+ {
+ VCXLOGLO1("CVCXTestCommon:: Nothing to reserve anymore.");
+ break;
+ }
+
+ // Fill all at once if less than 1MB to go.
+ if( spaceToReserve < KIptvTest1MB )
+ {
+ dummyFileSize = spaceToReserve;
+ }
+
+ // Not enough space for dummy file, find smaller size.
+ while( dummyFileSize > spaceToReserve )
+ {
+ dummyFileSize /= 2;
+ }
+
+ // Find free filename.
+ TBuf<256> filePath;
+ do
+ {
+ filePath.Zero();
+ filePath.Append( path );
+ count++;
+ filePath.AppendFormat(KDummyfileFormat, count);
+ }
+ while ( BaflUtils::FileExists( iFs, filePath ) );
+
+ VCXLOGLO3("Creating %Ld b file to '%S'", dummyFileSize, &filePath);
+
+ // Create the file.
+ RFile file;
+ TInt err = file.Replace(iFs, filePath, EFileWrite);
+ if(err != KErrNone)
+ {
+ VCXLOGLO2("file.Replace fail: %d", err);
+ }
+ User::LeaveIfError(err);
+ err = file.SetSize( dummyFileSize );
+ if(err != KErrNone)
+ {
+ VCXLOGLO2("file.SetSize fail: %d", err);
+ }
+ User::LeaveIfError(err);
+ file.Close();
+
+ TVolumeInfo volumeInfo;
+ User::LeaveIfError(iFs.Volume(volumeInfo, aDriveNumber));
+ VCXLOGLO2("Free space after: %Ld b", volumeInfo.iFree);
+ }
+
+ VCXLOGLO1("<<<CVCXTestCommon::SetDriveFreeSpaceL");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::CalculateSpaceToReserve
+// -----------------------------------------------------------------------------
+//
+void CVCXTestCommon::CalculateSpaceToReserveL( RFs &aFs, TInt aDriveNumber, TInt aDesiredSpace, TInt64& aSpaceToReserve)
+ {
+ TVolumeInfo volumeInfo;
+ User::LeaveIfError(aFs.Volume(volumeInfo, aDriveNumber));
+
+ TInt64 driveSize = volumeInfo.iSize;
+ TInt64 reservedSpace = 0;
+ if(aDriveNumber == EDriveC)
+ {
+ reservedSpace = 1024*500; // Leave 500KB extra free to C drive
+ }
+
+ TInt64 driveFreeSpace = volumeInfo.iFree;
+ TInt64 usableSpace = driveFreeSpace - reservedSpace;
+ aSpaceToReserve = usableSpace - aDesiredSpace;
+
+ VCXLOGLO2("CVCXTestCommon: driveSize = %Ld", driveSize);
+ VCXLOGLO2("CVCXTestCommon: reservedSpace = %Ld", reservedSpace);
+ VCXLOGLO2("CVCXTestCommon: freeSpace = %Ld", driveFreeSpace);
+ VCXLOGLO2("CVCXTestCommon: usableSpace = %Ld", usableSpace);
+ VCXLOGLO2("CVCXTestCommon: desiredSpace = %d", aDesiredSpace);
+ VCXLOGLO2("CVCXTestCommon: spaceToReserve = %Ld", aSpaceToReserve);
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::DeleteDummyFilesL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestCommon::DeleteDummyFilesL( TInt aDriveNumber )
+ {
+ VCXLOGLO1(">>>CVCXTestCommon::DeleteDummyFilesL");
+
+ CFileMan* fileMan = CFileMan::NewL(iFs);
+ CleanupStack::PushL(fileMan);
+
+ TBuf<3> driveLetter;
+ TChar driveChar;
+ RFs::DriveToChar( aDriveNumber, driveChar );
+ driveLetter.Append(driveChar);
+
+ TBuf<255>path;
+
+ path.Format( KDummyfilePathFormat, &driveLetter );
+ path.Append(KDoubleBacklash);
+ fileMan->RmDir(path);
+
+ CleanupStack::PopAndDestroy(fileMan);
+
+ VCXLOGLO1("<<<CVCXTestCommon::DeleteDummyFilesL");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::EnsureFileIsNotInUse()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVCXTestCommon::EnsureFileIsNotInUse( const TPtrC& aFileName )
+ {
+ TInt error( KErrNone );
+ RFile file;
+ // MDS or someone else could have the file in exclusive use. Try 6 times in 10 second intervals.
+ for(TInt retry = 0; retry < 6; retry++)
+ {
+ error = file.Open(iFs, aFileName, EFileShareExclusive);
+ if( error == KErrInUse )
+ {
+ User::After( 1000000 * 10 );
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ file.Close();
+ VCXLOGLO2("CVCXTestCommon::EnsureFileIsNotInUse: %d", error);
+ return error;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::PrintDriveInfo()
+// -----------------------------------------------------------------------------
+//
+void CVCXTestCommon::PrintDriveInfo( const TPtrC& aDriveLetter )
+ {
+ TInt driveNumber(-1);
+ TInt64 driveSize(0);
+ TInt64 driveFreeSpace(0);
+
+ if( aDriveLetter.Length() > 0 && iFs.CharToDrive( aDriveLetter[0], driveNumber ) == KErrNone )
+ {
+ TVolumeInfo volumeInfo;
+ if( iFs.Volume(volumeInfo, driveNumber) == KErrNone )
+ {
+ driveSize = volumeInfo.iSize / 1024 / 1024;
+ driveFreeSpace = volumeInfo.iFree / 1024 / 1024;
+ VCXLOGLO2("CVCXTestCommon:: drive: %S", &aDriveLetter );
+ VCXLOGLO2("CVCXTestCommon:: - size: %d MB", driveSize);
+ VCXLOGLO2("CVCXTestCommon:: - free: %d MB", driveFreeSpace);
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::ListDir
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVCXTestCommon::ListDir( const TDesC& aDir, TInt aLevel )
+ {
+ CDir* fileList = NULL;
+ CDir* dirList = NULL;
+
+ if( aLevel == 0 )
+ {
+ VCXLOGLO2("CVCXTestCommon:: Listing directory %S", &aDir);
+ }
+
+ TInt err( KErrNone );
+ err = iFs.GetDir( aDir, KEntryAttMatchExclusive | KEntryAttDir, ESortByName, dirList );
+ if( err == KErrNone )
+ {
+ err = iFs.GetDir( aDir, KEntryAttMatchExclude | KEntryAttDir, ESortByName, fileList );
+ }
+
+ CleanupStack::PushL( dirList );
+ CleanupStack::PushL( fileList );
+
+ HBufC* pre = HBufC::NewL( 256 );
+ CleanupStack::PushL( pre );
+
+ for( TInt i=0; i<aLevel; i++ )
+ {
+ pre->Des().Append( _L(" ") );
+ }
+
+ if( err == KErrNone )
+ {
+ HBufC* fileName = HBufC::NewL( 256 );
+ CleanupStack::PushL( fileName );
+
+ if( dirList )
+ for ( TInt file = 0; file < dirList->Count(); file++ )
+ {
+ fileName->Des().Zero();
+ fileName->Des().Append( aDir );
+ fileName->Des().Append( (*dirList)[file].iName );
+ VCXLOGLO3("%S (d) %S", pre, fileName);
+ fileName->Des().Append( _L("\\") );
+ fileName->Des().LowerCase();
+#if 0
+ ListDir( *fileName, aLevel+1 );
+#else
+ if( fileName->Des().Find( _L(":\\private\\") ) < 0 &&
+ fileName->Des().Find( _L(":\\resource\\") ) < 0 &&
+ fileName->Des().Find( _L(":\\sys\\") ) < 0 &&
+ fileName->Des().Find( _L(":\\testframework\\") ) < 0 &&
+ fileName->Des().Find( _L(":\\nokia\\") ) < 0 &&
+ fileName->Des().Find( _L(":\\system\\") ) < 0 )
+ {
+ ListDir( fileName->Des(), aLevel+1 );
+ }
+#endif
+ }
+
+ TUint32 totalSize(0);
+ if( fileList )
+ for ( TInt file = 0; file < fileList->Count(); file++ )
+ {
+ fileName->Des().Zero();
+ fileName->Des().Append( aDir );
+ fileName->Des().Append( (*fileList)[file].iName );
+
+ RFile rf;
+ if( rf.Open( iFs, *fileName, EFileRead|EFileShareAny ) == KErrNone )
+ {
+ TInt size(0);
+ if( rf.Size( size ) == KErrNone )
+ {
+ totalSize += size;
+ VCXLOGLO4("%S (f) %S - %d KB", pre, fileName, size/1024 );
+ }
+ rf.Close();
+ }
+ else
+ {
+ VCXLOGLO3("%S (f) %S", pre, fileName);
+ }
+
+ }
+ VCXLOGLO3("%S Total size: %d KB", pre, totalSize/1024 );
+ CleanupStack::PopAndDestroy( fileName );
+ }
+
+ CleanupStack::PopAndDestroy( pre );
+ CleanupStack::PopAndDestroy( fileList );
+ CleanupStack::PopAndDestroy( dirList );
+
+ if( aLevel == 0 )
+ {
+ VCXLOGLO1("CVCXTestCommon:: Directory listed.");
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::GetPSProperty
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVCXTestCommon::GetPSProperty( const TUid aCategory, const TUint aKey, TInt& aValue )
+ {
+ VCXLOGLO2("CVCXTestCommon:: RProperty::Get key %d.", aKey);
+ TInt err = RProperty::Get( aCategory, aKey, aValue );
+ if( err != KErrNone )
+ {
+ VCXLOGLO2("CVCXTestCommon:: RProperty::Get int returned error: %d.", err);
+ }
+ return err;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::SetPSProperty
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVCXTestCommon::SetPSProperty( const TUid aCategory, const TUint aKey, const TInt aValue )
+ {
+ VCXLOGLO2("CVCXTestCommon:: RProperty::Set key %d.", aKey);
+ TInt err = RProperty::Set( aCategory, aKey, aValue );
+ if( err != KErrNone )
+ {
+ VCXLOGLO2("CVCXTestCommon:: RProperty::Set int returned error: %d.", err);
+ }
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::GetPSProperty
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVCXTestCommon::GetPSProperty( const TUid aCategory, const TUint aKey, TDes& aValue )
+ {
+ VCXLOGLO2("CVCXTestCommon:: RProperty::Get key %d.", aKey);
+ TInt err = RProperty::Get( aCategory, aKey, aValue );
+ if( err != KErrNone )
+ {
+ VCXLOGLO2("CVCXTestCommon:: RProperty::Get desc returned error: %d.", err);
+ }
+ return err;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::SetPSProperty
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVCXTestCommon::SetPSProperty( const TUid aCategory, const TUint aKey, const TDesC& aValue )
+ {
+ VCXLOGLO2("CVCXTestCommon:: RProperty::Set key %d.", aKey);
+ TInt err = RProperty::Set( aCategory, aKey, aValue );
+ if( err != KErrNone )
+ {
+ VCXLOGLO2("CVCXTestCommon:: RProperty::Set desc returned error: %d.", err);
+ }
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestCommon::ListFilesProcessesAndThreadsL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestCommon::ListFilesProcessesAndThreadsL( RFs& aFs )
+ {
+ RArray<TInt> fileThreadIds;
+ CleanupClosePushL( fileThreadIds );
+
+ RPointerArray<HBufC> fileNames;
+ CleanupResetAndDestroyPushL( fileNames );
+
+ // Get list of open files.
+ CFileList* fileList = 0;
+ TOpenFileScan fileScan( aFs );
+ fileScan.NextL( fileList );
+
+ CleanupStack::PushL( fileList );
+
+ while( fileList )
+ {
+ for (TInt i = 0; i < fileList->Count(); ++i)
+ {
+ fileNames.Append( (*fileList)[i].iName.AllocL() );
+ fileThreadIds.Append( fileScan.ThreadId() );
+ //VCXLOGLO4("File: %S Size: %d Thread Id: %d", &(*fileList)[i].iName, (*fileList)[i].iSize, fileScan.ThreadId() );
+ }
+ CleanupStack::PopAndDestroy( fileList );
+ fileScan.NextL( fileList );
+ CleanupStack::PushL( fileList );
+ }
+
+ CleanupStack::PopAndDestroy( fileList );
+
+ // Get list of processes and their threads.
+ TFindProcess findProcess;
+ TFullName processName;
+
+ TInt err( KErrNone );
+
+ // List processes.
+ while( findProcess.Next( processName ) == KErrNone )
+ {
+ RProcess process;
+ err = process.Open( processName );
+ if( err != KErrNone )
+ {
+ continue;
+ }
+ CleanupClosePushL( process );
+
+ TProcessId pid;
+ pid = process.Id();
+ TInt id = pid.Id();
+ VCXLOGLO4("Process: %S, ID: %d (%x)", &processName, id, pid.Id() );
+
+ TFindThread findThread;
+ TFullName threadName;
+
+ // List threads that belong to current process.
+ while( findThread.Next( threadName ) == KErrNone )
+ {
+ RThread thread;
+ err = thread.Open( threadName );
+ if( err == KErrNone )
+ {
+ CleanupClosePushL( thread );
+ RProcess threadProcess;
+ err = thread.Process( threadProcess ) ;
+ if( err == KErrNone )
+ {
+ CleanupClosePushL( threadProcess );
+ if( threadProcess.Id() == process.Id() )
+ {
+ TThreadId tid;
+ tid = thread.Id();
+ id = tid.Id();
+ VCXLOGLO4(" - Thread: %S, ID: %d (%x)", &threadName, id, tid.Id() );
+
+ // And list open files for the thread.
+ for( TInt i = 0; i < fileThreadIds.Count(); i++ )
+ {
+ if( fileThreadIds[i] == tid.Id() )
+ {
+ VCXLOGLO2(" - %S", fileNames[i] );
+ }
+ }
+ }
+ CleanupStack::PopAndDestroy( &threadProcess );
+ }
+ CleanupStack::PopAndDestroy( &thread );
+ }
+ }
+
+ VCXLOGLO1("---");
+ CleanupStack::PopAndDestroy( &process );
+ }
+
+ CleanupStack::PopAndDestroy( &fileNames );
+ CleanupStack::PopAndDestroy( &fileThreadIds );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/src/VCXTestMessageWait.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,345 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+// INCLUDE FILES
+#include "VCXTestMessageWait.h"
+#include "VCXTestLog.h"
+#include "CIptvTestActiveWait.h"
+#include "CIptvTestTimer.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+const TInt KTimeoutSecond = 1000000;
+
+// MACROS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CVCXTestMessageWait::
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CVCXTestMessageWait* CVCXTestMessageWait::NewL( MVCXTestMessageWaitObserver* aObserver )
+ {
+ VCXLOGLO1(">>>CVCXTestMessageWait::NewL");
+ CVCXTestMessageWait* self = new (ELeave) CVCXTestMessageWait( aObserver );
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ VCXLOGLO1("<<<CVCXTestMessageWait::NewL");
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestMessageWait::~CVCXTestMessageWait
+// destructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CVCXTestMessageWait::~CVCXTestMessageWait()
+ {
+ VCXLOGLO1(">>>CVCXTestMessageWait::~CVCXTestMessageWait");
+
+ iActiveWaitBlocking->Stop();
+ delete iActiveWaitBlocking;
+ iActiveWaitBlocking = NULL;
+
+ if( iTimeoutTimer )
+ {
+ iTimeoutTimer->CancelTimer();
+ delete iTimeoutTimer;
+ iTimeoutTimer = NULL;
+ }
+
+ iReceivedMessages.Reset();
+ iWaitedMessages.Reset();
+
+ VCXLOGLO1("<<<CVCXTestMessageWait::~CVCXTestMessageWait");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestMessageWait::~CVCXTestMessageWait
+// destructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CVCXTestMessageWait::CVCXTestMessageWait( MVCXTestMessageWaitObserver* aObserver )
+ : iObserver( aObserver )
+ {
+ VCXLOGLO1(">>>CVCXTestMessageWait::CVCXTestMessageWait");
+
+ VCXLOGLO1("<<<CVCXTestMessageWait::CVCXTestMessageWait");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestMessageWait::ConstructL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestMessageWait::ConstructL()
+ {
+ VCXLOGLO1(">>>CVCXTestMessageWait::ConstructL");
+
+ iActiveWaitBlocking = CIptvTestActiveWait::NewL();
+ iTimeoutTimer = CIptvTestTimer::NewL(*this, 0);
+
+ VCXLOGLO1("<<<CVCXTestMessageWait::ConstructL");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestMessageWait::Reset
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestMessageWait::Reset()
+ {
+ VCXLOGLO1(">>>CVCXTestMessageWait::Reset");
+ iCoolingDown = EFalse;
+ iWaitStarted = EFalse;
+ iWaitedMessages.Reset();
+ iReceivedMessages.Reset();
+ iTimeoutTimer->Cancel();
+ iActiveWaitBlocking->Stop();
+ VCXLOGLO1("<<<CVCXTestMessageWait::Reset");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestMessageWait::ResetReceivedMessages
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestMessageWait::ResetReceivedMessages()
+ {
+ VCXLOGLO1(">>>CVCXTestMessageWait::ResetReceivedMessages");
+ iReceivedMessages.Reset();
+ VCXLOGLO1("<<<CVCXTestMessageWait::ResetReceivedMessages");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestMessageWait::AddMessage
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestMessageWait::AddMessage( TInt32 aMsg )
+ {
+ VCXLOGLO1(">>>CVCXTestMessageWait::AddMessage");
+ iWaitedMessages.Append( aMsg );
+ VCXLOGLO1("<<<CVCXTestMessageWait::AddMessage");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestMessageWait::WaitForMessageL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestMessageWait::WaitForMessageL( TInt32 aMsg, TInt aTimeoutSeconds, TBool aDoBlock )
+ {
+ VCXLOGLO1(">>>CVCXTestMessageWait::WaitForMessageL");
+
+ iWaitedMessages.Reset();
+ iWaitedMessages.Append( aMsg );
+
+ iTimeoutSeconds = aTimeoutSeconds;
+ WaitForAllL( aTimeoutSeconds, aDoBlock );
+
+ VCXLOGLO1("<<<CVCXTestMessageWait::WaitForMessageL");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestMessageWait::WaitForAllL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestMessageWait::WaitForAllL( TInt aTimeoutSeconds, TBool aDoBlock )
+ {
+ VCXLOGLO1(">>>CVCXTestMessageWait::WaitForAllL");
+
+ iWaitStarted = ETrue;
+
+ iTimeoutSeconds = aTimeoutSeconds;
+
+ // Nothing to wait.
+ if( iWaitedMessages.Count() <= 0 )
+ {
+ VCXLOGLO1("<<<CVCXTestMessageWait::WaitForAllL");
+ User::Leave( KErrNotReady );
+ }
+
+ // Check already received messages.
+ for( TInt i = iReceivedMessages.Count()-1; i >= 0; i-- )
+ {
+ for( TInt e = iWaitedMessages.Count()-1; e >= 0; e-- )
+ {
+ if( iReceivedMessages[i] == iWaitedMessages[e] )
+ {
+ iWaitedMessages.Remove( e );
+ iReceivedMessages.Remove( i );
+ break;
+ }
+ }
+ }
+
+ if( iWaitedMessages.Count() > 0 )
+ {
+ // There's messages to wait. Start timeout timer.
+ iTimeoutTimer->After( aTimeoutSeconds * KTimeoutSecond );
+
+ // Client wants blocking call.
+ if( aDoBlock )
+ {
+ iActiveWaitBlocking->Start();
+ User::LeaveIfError( iError );
+ }
+ }
+ else
+ {
+ // Nothing to wait for.
+ iTimeoutTimer->CancelTimer();
+
+ // Not blocking, inform client with callback.
+ if( !aDoBlock )
+ {
+ iObserver->MessageWaitComplete( KErrNone );
+ }
+ }
+
+ VCXLOGLO1("<<<CVCXTestMessageWait::WaitForAllL");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestMessageWait::CoolDownL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestMessageWait::CoolDownL( TInt aSeconds )
+ {
+ VCXLOGLO1(">>>CVCXTestMessageWait::CoolDownL");
+
+ Reset();
+
+ iTimeoutSeconds = aSeconds;
+
+ iCoolingDown = ETrue;
+
+ iTimeoutTimer->After( iTimeoutSeconds * KTimeoutSecond );
+
+ iActiveWaitBlocking->Start();
+
+ VCXLOGLO1("<<<CVCXTestMessageWait::CoolDownL");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestMessageWait::ReceiveMessage
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestMessageWait::ReceiveMessage( TInt32 aMsg, TInt aError )
+ {
+ VCXLOGLO1(">>>CVCXTestMessageWait::ReceiveMessage");
+
+ if( aError != KErrNone )
+ {
+ if( iActiveWaitBlocking->IsWaiting() )
+ {
+ iError = aError;
+ iActiveWaitBlocking->Stop();
+ }
+ else
+ {
+ iObserver->MessageWaitComplete( aError );
+ }
+ iTimeoutTimer->CancelTimer();
+ VCXLOGLO1("<<<CVCXTestMessageWait::ReceiveMessage");
+ return;
+ }
+
+ if( iCoolingDown )
+ {
+ iTimeoutTimer->After( iTimeoutSeconds * KTimeoutSecond );
+ VCXLOGLO1("<<<CVCXTestMessageWait::ReceiveMessage");
+ return;
+ }
+
+ if( !iWaitStarted )
+ {
+ iReceivedMessages.Append( aMsg );
+ VCXLOGLO1("<<<CVCXTestMessageWait::ReceiveMessage");
+ return;
+ }
+
+ if( iWaitedMessages.Count() > 0 )
+ {
+ // Check if message is in wait queue.
+ for( TInt i = iWaitedMessages.Count()-1; i >= 0; i-- )
+ {
+ if( iWaitedMessages[i] == aMsg )
+ {
+ iWaitedMessages.Remove( i );
+ break;
+ }
+ }
+
+ if( iWaitedMessages.Count() <= 0 )
+ {
+ // Stop wait.
+ if( iActiveWaitBlocking->IsWaiting() )
+ {
+ iError = KErrNone;
+ iActiveWaitBlocking->Stop();
+ }
+ // Not waiting, client wants callback.
+ else
+ {
+ iObserver->MessageWaitComplete( KErrNone );
+ }
+ // Stop timer too.
+ iTimeoutTimer->CancelTimer();
+ }
+ }
+
+ VCXLOGLO1("<<<CVCXTestMessageWait::ReceiveMessage");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestMessageWait::TimerComplete
+// -----------------------------------------------------------------------------
+//
+void CVCXTestMessageWait::TimerComplete( TInt /* aTimerId */, TInt aError )
+ {
+ if( aError != KErrCancel )
+ {
+ if( iCoolingDown )
+ {
+ VCXLOGLO1("CVCXTestMessageWait:: Cooldown done.");
+ iActiveWaitBlocking->Stop();
+ iCoolingDown = EFalse;
+ }
+ else
+ if( iWaitedMessages.Count() > 0 )
+ {
+ VCXLOGLO2("CVCXTestMessageWait:: Timeout. Messages left: %d", iWaitedMessages.Count());
+ if( iActiveWaitBlocking->IsWaiting() )
+ {
+ iActiveWaitBlocking->Stop();
+ iError = KErrTimedOut;
+ }
+ else
+ {
+ // Client wants callback.
+ iObserver->MessageWaitComplete( KErrTimedOut );
+ }
+ }
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/src/VCXTestPSSubscriber.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,215 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#include "VCXTestLog.h"
+#include "VCXTestPSSubscriber.h"
+#include "VCXTestPSObserver.h"
+
+const TInt KMaxStrLenght( 100 );
+
+// -----------------------------------------------------------------------------
+// CVCXTestPSSubscriber::CVCXTestPSSubscriber()
+// -----------------------------------------------------------------------------
+//
+CVCXTestPSSubscriber::CVCXTestPSSubscriber( const TUid aUid,
+ const TUint32 aKey,
+ RProperty::TType aType,
+ MVCXTestPSObserver* aObserver ) :
+ CActive( EPriorityStandard ),
+ iUid( aUid ),
+ iKey( aKey ),
+ iKeyType(aType),
+ iObserver( aObserver )
+ {
+ // NOP
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestPSSubscriber::NewL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CVCXTestPSSubscriber* CVCXTestPSSubscriber::NewL( const TUid aUid,
+ const TUint32 aKey,
+ RProperty::TType aType,
+ MVCXTestPSObserver* aObserver )
+ {
+ CVCXTestPSSubscriber* self =
+ new( ELeave ) CVCXTestPSSubscriber( aUid, aKey, aType, aObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestPSSubscriber::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CVCXTestPSSubscriber::ConstructL()
+ {
+ iInitialized = EFalse;
+ User::LeaveIfError( iProperty.Attach( iUid, iKey ) );
+ CActiveScheduler::Add( this );
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestPSSubscriber::~CVCXTestPSSubscriber()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CVCXTestPSSubscriber::~CVCXTestPSSubscriber()
+ {
+ if( IsActive() )
+ {
+ Cancel();
+ }
+ iProperty.Close();
+
+ delete iSafeWait;
+ iSafeWait = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestPSSubscriber::Get()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVCXTestPSSubscriber::Get( TInt& aValue )
+ {
+ return iProperty.Get( aValue );
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestPSSubscriber::Get()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVCXTestPSSubscriber::Get( TDes& aValue )
+ {
+ return iProperty.Get( aValue );
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestPSSubscriber::Set()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVCXTestPSSubscriber::Set( TInt& aValue )
+ {
+ return iProperty.Set( aValue );
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestPSSubscriber::Set()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CVCXTestPSSubscriber::Set( const TDesC& aValue )
+ {
+ return iProperty.Set( aValue );
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestPSSubscriber::Start()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestPSSubscriber::Start()
+ {
+ if( !IsActive() )
+ {
+ iProperty.Subscribe( iStatus );
+ SetActive();
+ iInitialized = ETrue;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestPSSubscriber::WaitChange()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestPSSubscriber::WaitChangeL()
+ {
+ if( !iSafeWait )
+ {
+ iSafeWait = new ( ELeave ) CActiveSchedulerWait;
+ }
+ if ( iSafeWait && !iSafeWait->IsStarted() )
+ {
+ iSafeWait->Start();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestPSSubscriber::EndWait()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestPSSubscriber::EndWait()
+ {
+ if ( iSafeWait && iSafeWait->IsStarted() )
+ {
+ iSafeWait->AsyncStop();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestPSSubscriber::DoCancel()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestPSSubscriber::DoCancel()
+ {
+ if( IsActive() )
+ {
+ iProperty.Cancel();
+ }
+ iInitialized = EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestPSSubscriber::RunL()
+// -----------------------------------------------------------------------------
+//
+void CVCXTestPSSubscriber::RunL()
+ {
+ VCXLOGLO1(">>>CVCXTestPSSubscriber::RunL");
+ // resubscribe before processing new
+ // value to prevent missing updates
+ iProperty.Subscribe( iStatus );
+ SetActive();
+
+ if( iInitialized )
+ {
+ TBuf< KMaxStrLenght > strValue;
+ TInt intValue;
+
+ if( iKeyType == RProperty::EInt )
+ {
+ // int type changed
+ if( iProperty.Get( intValue ) == KErrNone && iObserver )
+ {
+ iObserver->ValueChangedL( iUid, iKey, intValue );
+ }
+ }
+ else if( iKeyType == RProperty::EText )
+ {
+ if( iProperty.Get( strValue ) == KErrNone && iObserver )
+ {
+ iObserver->ValueChangedL( iUid, iKey, strValue );
+ }
+ }
+ }
+ EndWait();
+ iInitialized = ETrue;
+ VCXLOGLO1("<<<CVCXTestPSSubscriber::RunL");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/src/VCXTestStatsKeeper.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,827 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+// INCLUDES
+#include "VCXTestStatsKeeper.h"
+#include "VCXTestLog.h"
+#include <flogger.h>
+#include <mmf/common/mmfcontrollerpluginresolver.h> // CleanupResetAndDestroyPushL
+
+// CONSTANTS
+const TUint KMaxTraces = 20;
+
+// MACROS
+
+#ifndef __WINSCW__
+
+_LIT( KVCXTestLogFolder, "Fusion" );
+
+#define VCXTESTSTATS_W1(FILE,AAA) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::Write(KVCXTestLogFolder,FILE,EFileLoggingModeAppend,tempIPTVLogDes()); } while ( EFalse )
+#define VCXTESTSTATS_W2(FILE,AAA,BBB) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KVCXTestLogFolder,FILE,EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB); } while ( EFalse )
+#define VCXTESTSTATS_W3(FILE,AAA,BBB,CCC) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KVCXTestLogFolder,FILE,EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB,CCC); } while ( EFalse )
+#define VCXTESTSTATS_W4(FILE,AAA,BBB,CCC,DDD) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KVCXTestLogFolder,FILE,EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB,CCC,DDD); } while ( EFalse )
+#define VCXTESTSTATS_W5(FILE,AAA,BBB,CCC,DDD,EEE) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KVCXTestLogFolder,FILE,EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB,CCC,DDD,EEE); } while ( EFalse )
+
+#else
+
+#define VCXTESTSTATS_W1(FILE,s) RDebug::Print(_L(#s))
+#define VCXTESTSTATS_W2(FILE,s, a) RDebug::Print(_L(#s), a)
+#define VCXTESTSTATS_W3(FILE,s, a, b) RDebug::Print(_L(#s), a, b)
+#define VCXTESTSTATS_W4(FILE,s, a, b, c) RDebug::Print(_L(#s), a, b, c)
+#define VCXTESTSTATS_W5(FILE,s, a, b, c, d) RDebug::Print(_L(#s), a, b, c, d)
+
+#endif
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsItem::NewL
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CVCXTestStatsItem* CVCXTestStatsItem::NewL()
+ {
+ CVCXTestStatsItem* self = new (ELeave)CVCXTestStatsItem();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsItem::~CVCXTestStatsKeeper
+// destructor
+// -----------------------------------------------------------------------------
+//
+CVCXTestStatsItem::~CVCXTestStatsItem()
+ {
+ delete iDesc;
+ iDesc = NULL;
+
+ delete iDescId;
+ iDescId = NULL;
+
+ iTraces.ResetAndDestroy();
+ iProgresses.ResetAndDestroy();
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsItem::CVCXTestStatsItem()
+// -----------------------------------------------------------------------------
+//
+CVCXTestStatsItem::CVCXTestStatsItem()
+ {
+
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsItem::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CVCXTestStatsItem::ConstructL()
+ {
+
+ }
+
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsItemSummary::NewL
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CVCXTestStatsItemSummary* CVCXTestStatsItemSummary::NewL()
+ {
+ CVCXTestStatsItemSummary* self = new (ELeave)CVCXTestStatsItemSummary();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsItemSummary::~CVCXTestStatsKeeper
+// destructor
+// -----------------------------------------------------------------------------
+//
+CVCXTestStatsItemSummary::~CVCXTestStatsItemSummary()
+ {
+ delete iDesc;
+ iDesc = NULL;
+
+ delete iDescId;
+ iDescId = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsItemSummary::CVCXTestStatsItemSummary()
+// -----------------------------------------------------------------------------
+//
+CVCXTestStatsItemSummary::CVCXTestStatsItemSummary()
+ {
+
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsItemSummary::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CVCXTestStatsItemSummary::ConstructL()
+ {
+
+ }
+
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::NewL
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CVCXTestStatsKeeper* CVCXTestStatsKeeper::NewL()
+ {
+ CVCXTestStatsKeeper* self = new (ELeave)CVCXTestStatsKeeper();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::~CVCXTestStatsKeeper
+// destructor
+// -----------------------------------------------------------------------------
+//
+CVCXTestStatsKeeper::~CVCXTestStatsKeeper ()
+ {
+ if( iStarted )
+ {
+ GenerateReportL( _L("FusionStats.txt"), EFalse );
+ GenerateReportL( _L("FusionStatsFull.txt"), ETrue );
+ }
+
+ delete iReportName;
+ iReportName = NULL;
+
+ delete iReportFileName;
+ iReportFileName = NULL;
+
+ iActions.ResetAndDestroy();
+ iTraces.ResetAndDestroy();
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::CVCXTestStatsKeeper
+// -----------------------------------------------------------------------------
+//
+CVCXTestStatsKeeper::CVCXTestStatsKeeper()
+ {
+
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CVCXTestStatsKeeper::ConstructL()
+ {
+
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::StartStatsKeepingL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestStatsKeeper::StartStatsKeepingL( const TDesC& aName, const TDesC& aFileName )
+ {
+ iStarted = ETrue;
+ iReportName = aName.AllocL();
+ iReportFileName = aFileName.AllocL();
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::ActionStartL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestStatsKeeper::ActionStartL( TInt32 aId, const TDesC& aDesc )
+ {
+ VCXLOGLO3(">>>CVCXTestStatsKeeper::ActionStartL: %d = %S ------>", aId, &aDesc);
+ if( !iStarted )
+ {
+ return;
+ }
+
+ CVCXTestStatsItem* item = CVCXTestStatsItem::NewL();
+ item->iId = aId;
+ item->iDesc = aDesc.AllocL();
+ item->iStartTime.HomeTime();
+ item->iIsActive = ETrue;
+
+ iActions.AppendL( item );
+ VCXLOGLO1("<<<CVCXTestStatsKeeper::ActionStartL");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::ActionStartL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestStatsKeeper::ActionStartL( const TDesC& aDescId, const TDesC& aDesc, TBool aDescMerge )
+ {
+ VCXLOGLO3(">>>CVCXTestStatsKeeper::ActionStartL %S = %S ------>", &aDescId, &aDesc);
+ if( !iStarted )
+ {
+ return;
+ }
+
+ CVCXTestStatsItem* item = CVCXTestStatsItem::NewL();
+ item->iDescId = aDescId.AllocL();
+ if( aDescMerge )
+ {
+ item->iDesc = HBufC::NewL( aDesc.Length() + aDescId.Length() );
+ item->iDesc->Des().Append( aDesc );
+ item->iDesc->Des().Append( aDescId );
+ }
+ else
+ {
+ item->iDesc = aDesc.AllocL();
+ }
+ item->iStartTime.HomeTime();
+ item->iIsActive = ETrue;
+
+ iActions.AppendL( item );
+ VCXLOGLO1("<<<CVCXTestStatsKeeper::ActionStartL (desc)");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::ActionEndL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestStatsKeeper::ActionEndL( TInt32 aId, TInt aError )
+ {
+ VCXLOGLO3(">>>CVCXTestStatsKeeper::ActionEndL: %d, err: %d ------>", aId, aError);
+ if( !iStarted )
+ {
+ return;
+ }
+
+ CVCXTestStatsItem* item = GetActiveAction( aId );
+
+ if( !item )
+ {
+ VCXLOGLO1("CVCXTestStatsKeeper:: No active action to end!");
+ VCXLOGLO1("<<<CVCXTestStatsKeeper::ActionEndL");
+ return;
+ }
+
+ item->iError = aError;
+ item->iEndTime.HomeTime();
+
+ TBuf<64> prgBuff( _L("OK") );
+ if( aError != KErrNone )
+ {
+ prgBuff.Format( _L("Failed (%d)"), item->iError);
+ }
+ ActionProgressL( aId, prgBuff );
+
+ item->iIsActive = EFalse;
+
+ if( aError != KErrNone )
+ {
+ for( TInt i = 0; i < iTraces.Count(); i++ )
+ {
+ item->iTraces.AppendL( iTraces[i] );
+ }
+ iTraces.Reset();
+ }
+
+ CheckFailsL();
+
+ VCXLOGLO1("<<<CVCXTestStatsKeeper::ActionEndL");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::ActionEndL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestStatsKeeper::ActionEndL( const TDesC& aDescId, TInt aError )
+ {
+ VCXLOGLO3(">>>CVCXTestStatsKeeper::ActionEndL :%S, err: %d ------>", &aDescId, aError);
+ if( !iStarted )
+ {
+ return;
+ }
+
+ CVCXTestStatsItem* item = GetActiveAction( aDescId );
+
+ if( !item )
+ {
+ VCXLOGLO1("CVCXTestStatsKeeper:: No active action to end!");
+ VCXLOGLO1("<<<CVCXTestStatsKeeper::ActionEndL (tdesc)");
+ return;
+ }
+
+ item->iError = aError;
+ item->iEndTime.HomeTime();
+
+ TBuf<64> prgBuff( _L("OK") );
+ if( aError != KErrNone )
+ {
+ prgBuff.Format( _L("Failed (%d)"), item->iError);
+ }
+ ActionProgressL( aDescId, prgBuff );
+
+ item->iIsActive = EFalse;
+
+ if( aError != KErrNone )
+ {
+ for( TInt i = 0; i < iTraces.Count(); i++ )
+ {
+ item->iTraces.AppendL( iTraces[i] );
+ }
+ iTraces.Reset();
+ }
+
+ CheckFailsL();
+
+ VCXLOGLO1("<<<CVCXTestStatsKeeper::ActionEndL (tdesc)");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::ActionProgressL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestStatsKeeper::ActionProgressL( TInt32 aId, const TDesC& aProgressDesc )
+ {
+ VCXLOGLO3(">>>CVCXTestStatsKeeper::ActionProgressL: %d = %S", aId, &aProgressDesc);
+ if( !iStarted )
+ {
+ return;
+ }
+
+ CVCXTestStatsItem* item = GetActiveAction( aId );
+
+ if( !item )
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ CVCXTestStatsItem* progress = CVCXTestStatsItem::NewL();
+
+ progress->iStartTime.HomeTime();
+ progress->iDesc = aProgressDesc.AllocL();
+
+ item->iProgresses.AppendL( progress );
+ VCXLOGLO1("<<<CVCXTestStatsKeeper::ActionProgressL");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::ActionProgressL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestStatsKeeper::ActionProgressL( const TDesC& aDescId, const TDesC& aProgressDesc )
+ {
+ VCXLOGLO3(">>>CVCXTestStatsKeeper::ActionProgressL: %S = %S", &aDescId, &aProgressDesc);
+ if( !iStarted )
+ {
+ return;
+ }
+
+ CVCXTestStatsItem* item = GetActiveAction( aDescId );
+
+ if( !item )
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ CVCXTestStatsItem* progress = CVCXTestStatsItem::NewL();
+
+ progress->iStartTime.HomeTime();
+ progress->iDesc = aProgressDesc.AllocL();
+
+ item->iProgresses.AppendL( progress );
+ VCXLOGLO1("<<<CVCXTestStatsKeeper::ActionProgressL (desc)");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::ActionTraceL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestStatsKeeper::ActionTraceL( const TDesC& aDesc )
+ {
+ VCXLOGLO1(">>>CVCXTestStatsKeeper::ActionTraceL");
+ if( !iStarted )
+ {
+ return;
+ }
+
+ while( iTraces.Count() > KMaxTraces )
+ {
+ iTraces.Remove( 0 );
+ }
+
+ iTraces.AppendL( aDesc.AllocL() );
+ VCXLOGLO1("<<<CVCXTestStatsKeeper::ActionTraceL");
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::GetActiveAction
+// -----------------------------------------------------------------------------
+//
+CVCXTestStatsItem* CVCXTestStatsKeeper::GetActiveAction( TInt32 aId )
+ {
+ VCXLOGLO1(">>>CVCXTestStatsKeeper::GetActiveAction");
+ for( TInt i = 0; i < iActions.Count(); i++ )
+ {
+ if( iActions[i]->iId == aId && iActions[i]->iIsActive )
+ {
+ VCXLOGLO2("CVCXTestStatsKeeper:: Found %S.", iActions[i]->iDesc);
+ VCXLOGLO1("<<<CVCXTestStatsKeeper::GetActiveAction");
+ return iActions[i];
+ }
+ }
+ VCXLOGLO1("<<<CVCXTestStatsKeeper::GetActiveAction");
+ return GetLastActiveAction( EFalse );
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::GetActiveAction
+// -----------------------------------------------------------------------------
+//
+CVCXTestStatsItem* CVCXTestStatsKeeper::GetActiveAction( const TDesC& aDescId )
+ {
+ VCXLOGLO1(">>>CVCXTestStatsKeeper::GetActiveAction (desc)");
+ for( TInt i = 0; i < iActions.Count(); i++ )
+ {
+ if( iActions[i]->iDescId && *iActions[i]->iDescId == aDescId && iActions[i]->iIsActive )
+ {
+ VCXLOGLO2("CVCXTestStatsKeeper:: Found %S.", iActions[i]->iDesc);
+ VCXLOGLO1("<<<CVCXTestStatsKeeper::GetActiveAction (desc)");
+ return iActions[i];
+ }
+ }
+ VCXLOGLO1("<<<CVCXTestStatsKeeper::GetActiveAction (desc)");
+ return GetLastActiveAction( ETrue );
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::GetLastActiveAction
+// -----------------------------------------------------------------------------
+//
+CVCXTestStatsItem* CVCXTestStatsKeeper::GetLastActiveAction( TBool aOnlyDescId )
+ {
+ VCXLOGLO1(">>>CVCXTestStatsKeeper::GetLastActiveAction");
+ for( TInt i = iActions.Count()-1; i >= 0; i-- )
+ {
+ if( iActions[i]->iIsActive )
+ {
+ if( ( aOnlyDescId && iActions[i]->iDesc ) || ( !aOnlyDescId && !iActions[i]->iDesc ) )
+ {
+ continue;
+ }
+ VCXLOGLO2("CVCXTestStatsKeeper:: Found: %S.", iActions[i]->iDesc);
+ VCXLOGLO1("<<<CVCXTestStatsKeeper::GetLastActiveAction");
+ return iActions[i];
+ }
+ }
+ VCXLOGLO1("<<<CVCXTestStatsKeeper::GetLastActiveAction");
+ return NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::FormatDate
+// -----------------------------------------------------------------------------
+//
+TInt CVCXTestStatsKeeper::FormatDate( const TTime& aDate, TDes& aStr )
+ {
+ _LIT(KDateTimeString,"%D%M%Y%/0%1%/1%2%/2%3%/3 %-B%:0%H%:1%T%:2%S%.%*C2%:3%-B");
+
+ TRAPD( err, aDate.FormatL( aStr, KDateTimeString ) );
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::GenerateReport
+// -----------------------------------------------------------------------------
+//
+void CVCXTestStatsKeeper::GenerateReportL( const TDesC& aFileName, TBool aFullReport )
+ {
+ aFileName.Length();
+
+ if( !iStarted )
+ {
+ return;
+ }
+
+ VCXTESTSTATS_W2( aFileName, "CVCXTestStatsKeeper:: Data size for the report: %d kBs", DataSizeL() );
+
+ if( iReportName )
+ {
+ VCXTESTSTATS_W1(aFileName, "");
+ VCXTESTSTATS_W1(aFileName, "-------------------------------------------------------------------------");
+ VCXTESTSTATS_W2(aFileName, " %S", iReportName);
+ VCXTESTSTATS_W1(aFileName, "-------------------------------------------------------------------------");
+ }
+
+ if( aFullReport )
+ {
+ const TInt KMaxDescLen = 52;
+
+ for( TInt i = 0; i < iActions.Count(); i++ )
+ {
+ TBuf<256> startTime;
+ TBuf<256> endTime;
+
+ CVCXTestStatsItem* item = iActions[i];
+
+ FormatDate( item->iStartTime, startTime );
+ if( !item->iIsActive )
+ {
+ FormatDate( item->iEndTime, endTime );
+ }
+
+ TBuf<KMaxDescLen+10> shortened;
+ if( item->iDesc->Length() > KMaxDescLen )
+ {
+ TPtrC left = item->iDesc->Left( KMaxDescLen/2 );
+ TPtrC right = item->iDesc->Right( KMaxDescLen/2 );
+ shortened.Format( _L("%S ... %S"), &left, &right );
+ }
+ else
+ {
+ shortened.Copy( *item->iDesc );
+ }
+
+ TBuf<1024*2> buff;
+ buff.Format( _L("%- *S %S"), 60, &shortened, &startTime);
+ VCXTESTSTATS_W2(aFileName, "%S", &buff);
+
+ if( item->iProgresses.Count() > 0 )
+ {
+ for( TInt e = 0; e < item->iProgresses.Count(); e++ )
+ {
+ FormatDate( item->iProgresses[e]->iStartTime, startTime );
+ if( item->iProgresses[e]->iDesc->Length() > KMaxDescLen )
+ {
+ TPtrC left = item->iProgresses[e]->iDesc->Left( KMaxDescLen/2-2 );
+ TPtrC right = item->iProgresses[e]->iDesc->Right( KMaxDescLen/2-2 );
+ shortened.Format( _L("%S .. %S"), &left, &right );
+ }
+ else
+ {
+ shortened.Copy( *item->iProgresses[e]->iDesc );
+ }
+ buff.Format( _L(" %- *S %S"), 57, &shortened, &startTime );
+ VCXTESTSTATS_W2(aFileName, "%S", &buff);
+ }
+ }
+
+ if( item->iTraces.Count() > 0 )
+ {
+ VCXTESTSTATS_W1(aFileName, " Traces:");
+ for( TInt e = 0; e < item->iTraces.Count(); e++ )
+ {
+ VCXTESTSTATS_W2(aFileName, " %S", item->iTraces[e]);
+ }
+ }
+ }
+ }
+
+ RPointerArray<CVCXTestStatsItemSummary> summaries;
+ CleanupResetAndDestroyPushL( summaries );
+ GetActionSummariesL( summaries, ETrue );
+
+ TBuf<256> buff;
+
+ _LIT( KVCXTESTDest, "Desc" );
+ _LIT( KVCXTESTFails, "Fails" );
+ _LIT( KVCXTESTTotal, "Total" );
+ _LIT( KVCXTESTMinTime, "MinTime" );
+ _LIT( KVCXTESTMaxTime, "MaxTime" );
+ _LIT( KVCXTESTAvgTime, "AvgTime");
+ _LIT( KVCXTESTTotalTime, "TotTime");
+
+ const TInt KDescFieldLen = 32;
+
+ // Header.
+ buff.Format( _L("%- *S %+ 6S %+ 6S %+ 6S %+ 6S %+ 6S %+ 6S"), KDescFieldLen,
+ &KVCXTESTDest, &KVCXTESTFails, &KVCXTESTTotal, &KVCXTESTMinTime, &KVCXTESTMaxTime, &KVCXTESTAvgTime, &KVCXTESTTotalTime );
+ VCXTESTSTATS_W2(aFileName, "%S", &buff);
+
+ // Data.
+ for( TInt e = 0; e < summaries.Count(); e++ )
+ {
+ TBuf<KDescFieldLen+10> shortened;
+ if( summaries[e]->iDesc->Length() > KDescFieldLen )
+ {
+ TPtrC left = summaries[e]->iDesc->Left( KDescFieldLen/2-2 );
+ TPtrC right = summaries[e]->iDesc->Right( KDescFieldLen/2-2 );
+ shortened.Format( _L("%S .. %S"), &left, &right );
+ }
+ else
+ {
+ shortened.Copy( *summaries[e]->iDesc );
+ }
+
+ const TReal KXXXMillion = 1000000;
+ TReal minTime = (TReal)summaries[e]->iMinTime / KXXXMillion;
+ TReal maxTime = (TReal)summaries[e]->iMaxTime / KXXXMillion;
+ TReal avgTime = (TReal)summaries[e]->iAvgTime / KXXXMillion;
+ TInt totalTime = (TReal)summaries[e]->iTotalTime / KXXXMillion;
+
+ buff.Format( _L("%- *S %+ 6d %+ 6d %+ 6.2f %+ 6.2f %+ 6.2f %+ 6d"), KDescFieldLen,
+ &shortened, summaries[e]->iFailCount, summaries[e]->iCount,
+ minTime, maxTime, avgTime, totalTime );
+ VCXTESTSTATS_W2(aFileName, "%S", &buff);
+ }
+
+ if( iAbortedBecauseTooManyFails )
+ {
+ VCXTESTSTATS_W1(aFileName, "Too many fails, test was aborted!");
+ }
+
+ CleanupStack::PopAndDestroy( &summaries );
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::GetActionSummariesL
+// -----------------------------------------------------------------------------
+//
+void CVCXTestStatsKeeper::GetActionSummariesL( RPointerArray<CVCXTestStatsItemSummary>& aSummaries, TBool aFailActiveActions )
+ {
+ if( aFailActiveActions )
+ {
+ for( TInt i = 0; i < iActions.Count(); i++ )
+ {
+ CVCXTestStatsItem* item = iActions[i];
+ if( item->iIsActive )
+ {
+ item->iError = KErrUnknown;
+ item->iEndTime.HomeTime();
+ item->iIsActive = EFalse;
+ }
+ }
+ }
+
+ for( TInt i = 0; i < iActions.Count(); i++ )
+ {
+ CVCXTestStatsItem* item = iActions[i];
+ if( item->iIsActive )
+ {
+ continue;
+ }
+
+ CVCXTestStatsItemSummary* itemSummary( NULL );
+
+ // Find summary item.
+ for( TInt e = 0; e < aSummaries.Count(); e++ )
+ {
+ if( item->iDesc && aSummaries[e]->iDesc && *item->iDesc == *aSummaries[e]->iDesc )
+ {
+ itemSummary = aSummaries[e];
+ break;
+ }
+ }
+
+ // Not found, create new one.
+ if( !itemSummary )
+ {
+ itemSummary = CVCXTestStatsItemSummary::NewL();
+ itemSummary->iId = item->iId;
+ itemSummary->iTotalTime = 0;
+ itemSummary->iMaxTime = -1;
+ itemSummary->iMinTime = -1;
+ if( item->iDescId ) itemSummary->iDescId = item->iDescId->AllocL();
+ itemSummary->iDesc = item->iDesc->AllocL();
+ aSummaries.Append( itemSummary );
+ }
+
+ // Increase counts.
+ itemSummary->iCount++;
+ if( item->iError != KErrNone )
+ {
+ itemSummary->iFailCount++;
+ }
+
+ // Add item to stats.
+ TTimeIntervalMicroSeconds runTime( 0 );
+ runTime = item->iEndTime.MicroSecondsFrom( item->iStartTime );
+ if( runTime.Int64() > 0 )
+ {
+ if( item->iError != KErrNone )
+ {
+ itemSummary->iFailTime += runTime.Int64();
+ }
+ itemSummary->iTotalTime += runTime.Int64();
+ TReal run = (TReal)runTime.Int64() / 1000000;
+
+ itemSummary->iMaxTime =
+ ( runTime.Int64() > itemSummary->iMaxTime || itemSummary->iMaxTime < 0 ) ? runTime.Int64() : itemSummary->iMaxTime;
+ itemSummary->iMinTime =
+ ( runTime.Int64() < itemSummary->iMinTime || itemSummary->iMinTime < 0) ? runTime.Int64() : itemSummary->iMinTime;
+ }
+ }
+
+ // Calc avg times and check other times.
+ for( TInt e = 0; e < aSummaries.Count(); e++ )
+ {
+ aSummaries[e]->iAvgTime = (TReal)aSummaries[e]->iTotalTime / (TReal)aSummaries[e]->iCount;
+ aSummaries[e]->iMinTime = aSummaries[e]->iMinTime < 0 ? 0 : aSummaries[e]->iMinTime;
+ aSummaries[e]->iMaxTime = aSummaries[e]->iMaxTime < 0 ? 0 : aSummaries[e]->iMaxTime;
+ }
+
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::DataSizeL
+// -----------------------------------------------------------------------------
+//
+TUint CVCXTestStatsKeeper::DataSizeL()
+ {
+ TUint size( 0 );
+
+ size += iActions.Count() * sizeof( CVCXTestStatsItem );
+
+ for( TInt i = 0; i < iActions.Count(); i++ )
+ {
+ CVCXTestStatsItem* item = iActions[i];
+ if( item->iDescId ) size += item->iDescId->Size();
+ size += item->iDesc->Size();
+
+ size += item->iProgresses.Count() * sizeof( CVCXTestStatsItem );
+
+ for( TInt e = 0; e < item->iProgresses.Count(); e++ )
+ {
+ size += item->iProgresses[e]->iDesc->Size();
+ }
+
+ if( item->iTraces.Count() > 0 )
+ {
+ for( TInt e = 0; e < item->iTraces.Count(); e++ )
+ {
+ size += item->iTraces[e]->Size();
+ }
+ }
+ }
+ return size/1024;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestStatsKeeper::CheckFailsL
+// -----------------------------------------------------------------------------
+//
+void CVCXTestStatsKeeper::CheckFailsL()
+ {
+ RPointerArray<CVCXTestStatsItemSummary> summaries;
+ CleanupResetAndDestroyPushL( summaries );
+ GetActionSummariesL( summaries, EFalse );
+
+ const TReal KVCXTestStatsKeeperMaxFailPercent = 0.33;
+
+ for( TInt i = 0; i < summaries.Count(); i++ )
+ {
+ // Check fails only when there's some actions done.
+ if( summaries[i]->iCount > 10 )
+ {
+ // Check if there's too many fails.
+ TReal failPercent = (TReal)summaries[i]->iFailCount / (TReal)summaries[i]->iCount;
+
+ if( failPercent > KVCXTestStatsKeeperMaxFailPercent )
+ {
+ iAbortedBecauseTooManyFails = ETrue;
+ VCXLOGLO1("CVCXTestStatsKeeper:: Too many fails, leaving with KErrAbort");
+ User::Leave( KErrAbort );
+ }
+
+ const TInt64 KTest10Minutes = 1000000 * 60 * 10;
+
+ // Check if failing cases take too long to run.
+ if( summaries[i]->iTotalTime > 0 && summaries[i]->iFailTime > KTest10Minutes )
+ {
+ TReal failTimePercent = (TReal)summaries[i]->iFailTime / (TReal)summaries[i]->iTotalTime;
+ if( failTimePercent > KVCXTestStatsKeeperMaxFailPercent )
+ {
+ VCXLOGLO1("CVCXTestStatsKeeper:: Too many fails, leaving with KErrAbort");
+ iAbortedBecauseTooManyFails = ETrue;
+ User::Leave( KErrAbort );
+ }
+ }
+ }
+ }
+ CleanupStack::PopAndDestroy( &summaries );
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestCommon/src/VCXTestTimerWait.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+// INCLUDES
+#include <e32base.h>
+
+#include "CIptvTestActiveWait.h"
+#include "CIptvTestTimer.h"
+#include "VCXTestTimerWait.h"
+
+// -----------------------------------------------------------------------------
+// CTestTimerWait::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CVCXTestTimerWait* CVCXTestTimerWait::NewL()
+ {
+ CVCXTestTimerWait* self = new (ELeave) CVCXTestTimerWait();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestTimerWait::CVCXTestTimerWait
+// -----------------------------------------------------------------------------
+//
+CVCXTestTimerWait::CVCXTestTimerWait()
+ {
+
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestTimerWait::ConstructL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestTimerWait::ConstructL()
+ {
+ iWait = CIptvTestActiveWait::NewL();
+ iTimer = CIptvTestTimer::NewL(*this, 0);
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestTimerWait::~CVCXTestTimerWait
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CVCXTestTimerWait::~CVCXTestTimerWait()
+ {
+ if(iTimer != NULL)
+ {
+ iTimer->CancelTimer();
+ delete iTimer;
+ iTimer = NULL;
+ }
+
+ if( iWait )
+ {
+ iWait->Stop();
+ delete iWait;
+ iWait = NULL;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestTimerWait::WaitL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CVCXTestTimerWait::WaitL( TUint32 aMicroSeconds )
+ {
+ iTimer->After( aMicroSeconds );
+ iWait->Start();
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXTestTimerWait::TimerComplete
+// -----------------------------------------------------------------------------
+//
+void CVCXTestTimerWait::TimerComplete( TInt /* aTimerId */, TInt /* aError */ )
+ {
+ if( iWait ) iWait->Stop();
+ }
+
+// EOF
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestUtilModule/Bwins/VCXTestUtilModuleu.def Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,3 @@
+EXPORTS
+ ?LibEntryL@@YAPAVCScriptBase@@AAVCTestModuleIf@@@Z @ 1 NONAME ; class CScriptBase * LibEntryL(class CTestModuleIf &)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestUtilModule/EABI/VCXTestUtilModuleu.def Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,34 @@
+EXPORTS
+ _Z9LibEntryLR13CTestModuleIf @ 1 NONAME
+ _ZN14CVCXTestCommon10VerifyDataER7TDesC16RN19CIptvTestVerifyData13TVerifyResultE @ 2 NONAME ABSENT
+ _ZN14CVCXTestCommon11GetFileSizeER7TDesC16Rm @ 3 NONAME ABSENT
+ _ZN14CVCXTestCommon11SetTimeZoneER7TDesC16 @ 4 NONAME ABSENT
+ _ZN14CVCXTestCommon13CreateBadIapLER7TDesC16 @ 5 NONAME ABSENT
+ _ZN14CVCXTestCommon13GetPSPropertyE4TUidjR6TDes16 @ 6 NONAME ABSENT
+ _ZN14CVCXTestCommon13GetPSPropertyE4TUidjRi @ 7 NONAME ABSENT
+ _ZN14CVCXTestCommon13SetPSPropertyE4TUidjRK7TDesC16 @ 8 NONAME ABSENT
+ _ZN14CVCXTestCommon13SetPSPropertyE4TUidji @ 9 NONAME ABSENT
+ _ZN14CVCXTestCommon13SetSystemTimeE5TTime @ 10 NONAME ABSENT
+ _ZN14CVCXTestCommon14GetIapNameByIdER6TDes16m @ 11 NONAME ABSENT
+ _ZN14CVCXTestCommon15GetIapIdByNameLERK7TDesC16Rm @ 12 NONAME ABSENT
+ _ZN14CVCXTestCommon15GetIapIdByTypeLENS_16TIptvTestIapTypeERmi @ 13 NONAME ABSENT
+ _ZN14CVCXTestCommon15WriteVerifyDataER7TDesC1611TRefByValueIKS0_Ez @ 14 NONAME ABSENT
+ _ZN14CVCXTestCommon15WriteVerifyDataER7TDesC16S1_ @ 15 NONAME ABSENT
+ _ZN14CVCXTestCommon16CreateVerifyDataER7TDesC16i @ 16 NONAME ABSENT
+ _ZN14CVCXTestCommon16CreateVideoFileLEN21CIptvTestVideoCreator18TIptvTestVideoTypeER7TDesC16i @ 17 NONAME ABSENT
+ _ZN14CVCXTestCommon17CreateVideoFilesLEN21CIptvTestVideoCreator18TIptvTestVideoTypeER7TDesC16iR13RPointerArrayI7HBufC16E @ 18 NONAME ABSENT
+ _ZN14CVCXTestCommon17DeleteDummyFilesLEi @ 19 NONAME ABSENT
+ _ZN14CVCXTestCommon18ParseIntFromStringERiR7TDesC16 @ 20 NONAME ABSENT
+ _ZN14CVCXTestCommon18SetDriveFreeSpaceLEij @ 21 NONAME ABSENT
+ _ZN14CVCXTestCommon20EnsureFileIsNotInUseERK7TPtrC16 @ 22 NONAME ABSENT
+ _ZN14CVCXTestCommon22AdvanceSystemTimeHoursEi @ 23 NONAME ABSENT
+ _ZN14CVCXTestCommon22EnableVerifyTimestampsEi @ 24 NONAME ABSENT
+ _ZN14CVCXTestCommon24AdvanceSystemTimeMinutesEi @ 25 NONAME ABSENT
+ _ZN14CVCXTestCommon24AdvanceSystemTimeSecondsEi @ 26 NONAME ABSENT
+ _ZN14CVCXTestCommon4NewLEv @ 27 NONAME ABSENT
+ _ZN14CVCXTestCommon7ListDirERK7TDesC16i @ 28 NONAME ABSENT
+ _ZN14CVCXTestCommon9GetIapIdLERK7TDesC16Rm @ 29 NONAME ABSENT
+ _ZN14CVCXTestCommon9PrintIapsEv @ 30 NONAME ABSENT
+ _ZTI14CVCXTestCommon @ 31 NONAME ABSENT ; #<TI>#
+ _ZTV14CVCXTestCommon @ 32 NONAME ABSENT ; #<VT>#
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestUtilModule/group/VCXTestUtilModule.mmp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,56 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+TARGET VCXTestUtilModule.dll
+TARGETTYPE dll
+UID 0x1000008D 0x101FB3E3
+
+#if defined(EKA2)
+CAPABILITY CAP_GENERAL_DLL
+VENDORID 0x101FB657
+SECUREID 0x102073DB
+#endif
+
+DEFFILE VCXTestUtilModule.def
+
+SOURCEPATH ../src
+SOURCE IptvTestUtilModule.cpp
+SOURCE IptvTestUtilModuleBlocks.cpp
+
+USERINCLUDE ../inc
+USERINCLUDE ../../VCXTestCommon/inc
+
+APP_LAYER_SYSTEMINCLUDE
+
+LIBRARY euser.lib
+LIBRARY stiftestinterface.lib
+LIBRARY commdb.lib
+LIBRARY bafl.lib
+LIBRARY esock.lib
+LIBRARY FLOGGER.lib
+LIBRARY DownloadMgr.lib
+LIBRARY efsrv.lib
+LIBRARY tzclient.lib
+LIBRARY ezip.lib
+LIBRARY VCXTestCommon.lib
+
+LANG SC
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestUtilModule/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,33 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+
+PRJ_PLATFORMS
+DEFAULT
+
+
+PRJ_EXPORTS
+
+PRJ_TESTEXPORTS
+
+PRJ_MMPFILES
+
+PRJ_TESTMMPFILES
+VCXTestUtilModule.mmp
+
+// End of File
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestUtilModule/inc/IptvTestUtilModule.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,451 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#ifndef IPTVTESTUTILMODULE_H
+#define IPTVTESTUTILMODULE_H
+
+// INCLUDES
+#include <f32file.h>
+#include <BAUTILS.H>
+
+#include <StifLogger.h>
+#include <TestScripterInternal.h>
+#include <StifTestModule.h>
+
+#include "MTestUtilConnectionObserver.h"
+#include "MTestUtilDownloadObserver.h"
+#include "MIptvTestTimerObserver.h"
+
+// CONSTANTS
+const TInt KConnectionTimerId = 500;
+
+// Logging path
+_LIT( KIptvTestUtilModuleLogPath, "\\logs\\testframework\\IptvTestUtilModule\\" );
+// Log file
+_LIT( KIptvTestUtilModuleLogFile, "IptvTestUtilModule.txt" );
+
+// MACROS
+
+// FUNCTION PROTOTYPES
+//?type ?function_name(?arg_list);
+
+// FORWARD DECLARATIONS
+//class ?FORWARD_CLASSNAME;
+class CIptvTestUtilModule;
+class CTestUtilConnection;
+class CTestUtilConnectionWaiter;
+class CIptvTestDownloadManager;
+class CIptvTestTimer;
+class CIptvTestMobilecrashWatcher;
+class CIptvTestUtilALR;
+class CVCXTestCommon;
+class CZipFile;
+
+// DATA TYPES
+//enum ?declaration
+//typedef ?declaration
+//extern ?data_type;
+
+// CLASS DECLARATION
+
+/**
+* CIptvTestUtilModule test class for STIF Test Framework TestScripter.
+* This class should have no depencies to Video Center code.
+*
+* @lib ?library
+* @since ?Series60_version
+*/
+NONSHARABLE_CLASS(CIptvTestUtilModule) : public CScriptBase, public MTestUtilConnectionObserver, public MTestUtilDownloadObserver, public MIptvTestTimerObserver
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ static CIptvTestUtilModule* NewL( CTestModuleIf& aTestModuleIf );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CIptvTestUtilModule();
+
+ public: // New functions
+
+ /**
+ * ?member_description.
+ * @since ?Series60_version
+ * @param ?arg1 ?description
+ * @return ?description
+ */
+ //?type ?member_function( ?type ?arg1 );
+
+ public: // Functions from base classes
+
+ /**
+ * From CScriptBase Runs a script line.
+ * @since ?Series60_version
+ * @param aItem Script line containing method name and parameters
+ * @return Symbian OS error code
+ */
+ virtual TInt RunMethodL( CStifItemParser& aItem );
+
+ void ConnectionCreated();
+ void ConnectionClosed();
+ void ConnectionFailed();
+ void ConnectionAlreadyExists();
+ void ConnectionTimeout();
+
+ void DownloadFinished(TInt aError);
+
+ void TimerComplete(TInt aTimerId, TInt aError);
+
+ protected: // New functions
+
+ /**
+ * ?member_description.
+ * @since ?Series60_version
+ * @param ?arg1 ?description
+ * @return ?description
+ */
+ //?type ?member_function( ?type ?arg1 );
+
+ protected: // Functions from base classes
+
+ private:
+
+ /**
+ * C++ default constructor.
+ */
+ CIptvTestUtilModule( CTestModuleIf& aTestModuleIf );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ // Prohibit copy constructor if not deriving from CBase.
+ // ?classname( const ?classname& );
+ // Prohibit assigment operator if not deriving from CBase.
+ // ?classname& operator=( const ?classname& );
+
+ /**
+ * Frees all resources allocated from test methods.
+ * @since ?Series60_version
+ */
+ void Delete();
+
+ /**
+ * Test methods are listed below.
+ */
+
+ /**
+ * Creates MobilecrashesWatcher
+ * @return Symbian OS error code.
+ */
+ virtual TInt CreateMobilecrashWatcherL( CStifItemParser& aItem );
+
+ /**
+ * Checks if there's any new mobilecrashes since the watcher was created.
+ * @param aItem Script line containing IptvTest Case ID. Required.
+ * @return KErrNone if there's no new mobilecrash files, else KErrAbort.
+ */
+ virtual TInt CheckMobilecrashesL( CStifItemParser& aItem );
+
+ /**
+ * Checks if there's any mobilecrash files.
+ * @param aItem Script line containing IptvTest Case ID. Required.
+ * @return KErrNone if there's no mobilecrash files, else KErrAbort.
+ */
+ virtual TInt CheckMobilecrashesZeroToleranceL( CStifItemParser& aItem );
+
+ /**
+ * Writes line ">>> Case start: <parameters>" using Iptv logging methods.
+ * @param aItem Script line containing IptvTest Case ID. Required.
+ * @return Symbian OS error code.
+ */
+ virtual TInt IptvLogCaseStart( CStifItemParser& aItem );
+
+ /**
+ * Writes line "<<< Case end." using Iptv logging methods.
+ * @param
+ * @return Symbian OS error code.
+ */
+ virtual TInt IptvLogCaseEnd( CStifItemParser& aItem );
+
+ /**
+ * Writes line using Iptv logging methods.
+ * @param aItem Text which is written into the log. Not required.
+ * @return Symbian OS error code.
+ */
+ virtual TInt IptvLogWrite( CStifItemParser& aItem );
+
+ /**
+ * Opens a socket to a specified IAP.
+ * ASYNC.
+ * @param aItem IAP name.
+ * @return Symbian OS error code.
+ */
+ virtual TInt ConnectL( CStifItemParser& aItem );
+
+ /**
+ * Attached to open connection specified by IAP.
+ * SYNC.
+ * @param aItem IAP name.
+ * @return Symbian OS error code.
+ */
+ virtual TInt AttachL( CStifItemParser& aItem );
+
+ /**
+ * Disconnects from the currently open connection.
+ * SYNC.
+ * @param none
+ * @return Symbian OS error code.
+ */
+ virtual TInt DisconnectL( CStifItemParser& aItem );
+
+ /**
+ * Terminates the currently open connection, i.e. closes it immediately.
+ * The connection can be opened by this module or other application.
+ * SYNC.
+ * @param none
+ * @return Symbian OS error code.
+ */
+ virtual TInt TerminateConnectionL( CStifItemParser& aItem );
+
+ /**
+ * Starts observing the connection until it's activated, Signals test script.
+ * @param IAP name
+ * @return Symbian OS error code.
+ */
+ virtual TInt WaitForConnectionActivityL( CStifItemParser& aItem );
+
+ /**
+ * Starts observing the connection until it's closed, Signals test script.
+ * @param IAP name
+ * @return Symbian OS error code.
+ */
+ virtual TInt WaitUntilConnectionIsClosed(CStifItemParser& aItem );
+
+ /**
+ * Start a download.
+ */
+ virtual TInt DownloadL( CStifItemParser& aItem );
+
+ /**
+ * Stop downloads.
+ */
+ virtual TInt StopDownloadsL( CStifItemParser& aItem );
+
+ /**
+ * Advance system time for 1 second.
+ */
+ virtual TInt AdvanceSystemTime1Second( CStifItemParser& aItem );
+
+ /**
+ * Advance system time for X seconds.
+ */
+ virtual TInt AdvanceSystemTimeSeconds( CStifItemParser& aItem );
+
+ /**
+ * Advance system time for X minute.
+ */
+ virtual TInt AdvanceSystemTimeMinutes( CStifItemParser& aItem );
+
+ /**
+ * Advance system time for X hour.
+ */
+ virtual TInt AdvanceSystemTimeHours( CStifItemParser& aItem );
+
+ /**
+ * Advance system time for specified number of days.
+ */
+ virtual TInt AdvanceSystemTimeDays(CStifItemParser& aItem );
+
+ /**
+ * Set the system time.
+ * Must be in format YYYYMMDD:HHMMSS.MMMMMM (First day / month is 0)
+ */
+ virtual TInt SetSystemTime(CStifItemParser& aItem );
+
+ /**
+ * Set the system time within the ongoing day.
+ *
+ */
+ virtual TInt SetSystemTimeToday(CStifItemParser& aItem );
+
+ /**
+ * Set the system timezone.
+ */
+ virtual TInt SetTimeZone(CStifItemParser& aItem );
+
+
+ /**
+ * Removes the used destination cenrep value.
+ */
+ virtual TInt DeleteUsedDestinationCenRepL( CStifItemParser& aItem );
+
+ /**
+ * Set the used destination cenrep value for Video Center & IPTV_Engine.
+ */
+ virtual TInt SetUsedDestinationL( CStifItemParser& aItem );
+
+ /**
+ * Create new destination (SNAP)
+ */
+ virtual TInt CreateDestinationL( CStifItemParser& aItem );
+
+ /**
+ * Delete a destination (SNAP)
+ */
+ virtual TInt DeleteDestinationL( CStifItemParser& aItem );
+
+ /**
+ * Copy existing connection method to defined SNAP.
+ */
+ virtual TInt CopyMethodL( CStifItemParser& aItem );
+
+ /**
+ * Delete a connection method.
+ */
+ virtual TInt DeleteMethodL( CStifItemParser& aItem );
+
+ /**
+ * Set priority for a connection method.
+ */
+ virtual TInt SetMethodPriorityL( CStifItemParser& aItem );
+
+ /**
+ * Delete the destination when classes destructor is run.
+ */
+ virtual TInt DeleteDestinationAfterwardsL( CStifItemParser& aItem );
+
+ /**
+ * Sets string attribute for connection method.
+ */
+ virtual TInt SetConnectionMethodStringAttributeL( CStifItemParser& aItem );
+
+ /**
+ * Sets integer attribute for connection method.
+ */
+ virtual TInt SetConnectionMethodIntAttributeL( CStifItemParser& aItem );
+
+ /**
+ * Sets boolean attribute for connection method.
+ */
+ virtual TInt SetConnectionMethodBoolAttributeL( CStifItemParser& aItem );
+
+ /**
+ * CreateFileL
+ */
+ virtual TInt CreateFileL( CStifItemParser& aItem );
+
+ /**
+ * DeleteFileL
+ */
+ virtual TInt DeleteFileL( CStifItemParser& aItem );
+
+ /*
+ * CreateFolderL
+ */
+ virtual TInt CreateFolderL( CStifItemParser& aItem );
+
+ /*
+ * DeleteFolderL
+ */
+ virtual TInt DeleteFolderL( CStifItemParser& aItem );
+
+ /*
+ * LockFileL
+ */
+ virtual TInt LockFileL( CStifItemParser& aItem );
+
+ /*
+ * UnlockFileL
+ */
+ virtual TInt UnlockFileL( CStifItemParser& aItem );
+
+ /*
+ * ExtractFile
+ */
+ virtual TInt ExtractFileL( CStifItemParser& aItem );
+
+ /*
+ * FileExistsInZip
+ */
+ virtual TBool FileExistsInZip( CZipFile* aZipFile, const TDesC& aFileName );
+
+ /**
+ * Prints IAPs from commdb to debug output.
+ */
+ virtual void PrintIAPs();
+
+ /**
+ * Gets IAp by name.
+ */
+ virtual void GetIap(TDesC& aIapName, TUint32& aIapId);
+
+ /**
+ * Sets free space on drive.
+ * @param aDriveLetter
+ * @param aDesiredSpace, bytes
+ */
+ virtual TInt SetDriveFreeSpaceL( CStifItemParser& aItem );
+
+ public: // Data
+ // ?one_line_short_description_of_data
+ //?data_declaration;
+
+ protected: // Data
+ // ?one_line_short_description_of_data
+ //?data_declaration;
+
+ private: // Data
+
+ // ?one_line_short_description_of_data
+ //?data_declaration;
+
+ // Reserved pointer for future extension
+ //TAny* iReserved;
+
+ CTestUtilConnection* iConnect;
+ CTestUtilConnectionWaiter* iConnectionWaiter;
+ TInt iRetryCount;
+ CIptvTestDownloadManager* iDownload;
+ CIptvTestTimer* iTimer;
+ CIptvTestMobilecrashWatcher* iIptvTestMobilecrashWatcher;
+ HBufC* iObservedServicePath;
+ RPointerArray<HBufC> iObservedFiles;
+ RArray<TTime> iFileModifiedDates;
+
+ RPointerArray<HBufC> iToBeDeletedDestinations;
+
+ CIptvTestUtilALR* iTestUtilALR;
+ RFs iFs;
+ RFile iLockedFile;
+ TBool iFileIsLocked;
+
+ TBool iCaseStarted;
+
+ CVCXTestCommon* iTestCommon;
+
+ TBool iDummyFilesCreated;
+ };
+
+#endif // IPTVTESTUTILMODULE_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestUtilModule/src/IptvTestUtilModule.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,129 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <Stiftestinterface.h>
+#include "IptvTestUtilModule.h"
+
+#include <commdb.h>
+
+#include "VCXTestCommon.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::CIptvTestUtilModule
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CIptvTestUtilModule::CIptvTestUtilModule(
+ CTestModuleIf& aTestModuleIf ):
+ CScriptBase( aTestModuleIf )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CIptvTestUtilModule::ConstructL()
+ {
+ iLog = CStifLogger::NewL( KIptvTestUtilModuleLogPath,
+ KIptvTestUtilModuleLogFile,
+ CStifLogger::ETxt,
+ CStifLogger::EFile,
+ EFalse );
+ User::LeaveIfError( iFs.Connect() );
+ iTestCommon = CVCXTestCommon::NewL();
+ TRAP_IGNORE( iTestCommon->DeleteDummyFilesL( EDriveC ) );
+ TRAP_IGNORE( iTestCommon->DeleteDummyFilesL( EDriveE ) );
+ TRAP_IGNORE( iTestCommon->DeleteDummyFilesL( EDriveF ) );
+ TRAP_IGNORE( iTestCommon->DeleteDummyFilesL( EDriveG ) );
+
+ TestModuleIf().SetBehavior( CTestModuleIf::ETestLeaksHandles );
+
+ CStifItemParser* nullParser( NULL );
+ CreateMobilecrashWatcherL( *nullParser );
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CIptvTestUtilModule* CIptvTestUtilModule::NewL(
+ CTestModuleIf& aTestModuleIf )
+ {
+ CIptvTestUtilModule* self = new (ELeave) CIptvTestUtilModule( aTestModuleIf );
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+
+ return self;
+ }
+
+// Destructor
+CIptvTestUtilModule::~CIptvTestUtilModule()
+ {
+
+ // Delete resources allocated from test methods
+ Delete();
+
+ // Delete logger
+ delete iLog;
+
+ delete iTestCommon;
+ iTestCommon = NULL;
+
+ iFs.Close();
+ }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+// -----------------------------------------------------------------------------
+// LibEntryL is a polymorphic Dll entry point.
+// Returns: CScriptBase: New CScriptBase derived object
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CScriptBase* LibEntryL(
+ CTestModuleIf& aTestModuleIf ) // Backpointer to STIF Test Framework
+ {
+
+ return ( CScriptBase* ) CIptvTestUtilModule::NewL( aTestModuleIf );
+
+ }
+
+// -----------------------------------------------------------------------------
+// E32Dll is a DLL entry point function.
+// Returns: KErrNone
+// -----------------------------------------------------------------------------
+//
+#ifndef EKA2 // Hide Dll entry point to EKA2
+GLDEF_C TInt E32Dll(
+ TDllReason /*aReason*/) // Reason code
+ {
+ return(KErrNone);
+
+ }
+#endif // EKA2
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/VCXTestUtilModule/src/IptvTestUtilModuleBlocks.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,1893 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32svr.h>
+#include <StifParser.h>
+#include <Stiftestinterface.h>
+
+#include <BADESCA.H>
+#include <COMMDB.H>
+#include <zipfile.h>
+
+#include "VCXTestLog.h"
+#include "IptvTestUtilModule.h"
+#include "TestUtilConnection.h"
+#include "TestUtilConnectionWaiter.h"
+#include "IptvTestDownloadManager.h"
+#include "VCXTestCommon.h"
+#include "CIptvTestMobilecrashWatcher.h"
+#include "CIptvTestTimer.h"
+
+#include "IptvTestUtilALR.h"
+
+// CONSTANTS
+_LIT( KDateTimeString, "%D%M%Y%/0%1%/1%2%/2%3%/3 %-B%:0%H%:1%T%:2%S%.%*C2%:3%-B" );
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// FORWARD DECLARATIONS
+class CIptvTestTimer;
+class CZipFile;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::Delete
+// Delete here all resources allocated and opened from test methods.
+// Called from destructor.
+// -----------------------------------------------------------------------------
+//
+void CIptvTestUtilModule::Delete()
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::Delete");
+ if(iConnect)
+ {
+ delete iConnect;
+ iConnect = NULL;
+ }
+
+ if(iConnectionWaiter)
+ {
+ delete iConnectionWaiter;
+ iConnectionWaiter = NULL;
+ }
+
+ if(iDownload)
+ {
+ delete iDownload;
+ iDownload = NULL;
+ }
+
+ if(iTimer)
+ {
+ delete iTimer;
+ iTimer = NULL;
+ }
+
+ if( iFileIsLocked )
+ {
+ VCXLOGLO1("CIptvTestUtilModule:: Release locked file.");
+ iLockedFile.Close();
+ }
+ iFileIsLocked = EFalse;
+
+ delete iObservedServicePath;
+ iObservedServicePath = NULL;
+ iObservedFiles.ResetAndDestroy();
+ //iObservedFiles.Close();
+ VCXLOGLO1("CIptvTestUtilModule::Observed array deleted.");
+
+ iFileModifiedDates.Reset();
+ iFileModifiedDates.Close();
+ VCXLOGLO1("CIptvTestUtilModule::File date array deleted.");
+
+ iFs.Close();
+
+ TInt i;
+ for( i = 0; i < iToBeDeletedDestinations.Count(); i++ )
+ {
+ TPtr ptr = iToBeDeletedDestinations[i]->Des();
+ iTestUtilALR->DeleteDestinationL( ptr );
+ }
+
+ iToBeDeletedDestinations.ResetAndDestroy();
+
+ if( iTestUtilALR )
+ {
+ delete iTestUtilALR;
+ iTestUtilALR = NULL;
+ }
+
+ if( iCaseStarted )
+ {
+ VCXLOGLO1("<<< Case end.");
+ iCaseStarted = EFalse;
+ }
+
+ if( iDummyFilesCreated )
+ {
+ TRAP_IGNORE( iTestCommon->DeleteDummyFilesL( EDriveC ) );
+ TRAP_IGNORE( iTestCommon->DeleteDummyFilesL( EDriveE ) );
+ TRAP_IGNORE( iTestCommon->DeleteDummyFilesL( EDriveF ) );
+ TRAP_IGNORE( iTestCommon->DeleteDummyFilesL( EDriveG ) );
+ }
+
+ if(iIptvTestMobilecrashWatcher)
+ {
+ CStifItemParser* nullParser( NULL );
+ CheckMobilecrashesL( *nullParser );
+
+ delete iIptvTestMobilecrashWatcher;
+ iIptvTestMobilecrashWatcher = NULL;
+ }
+
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::Delete");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::RunMethodL
+// Run specified method. Contains also table of test mothods and their names.
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::RunMethodL(
+ CStifItemParser& aItem )
+ {
+
+ static TStifFunctionInfo const KFunctions[] =
+ {
+ // Copy this line for every implemented function.
+ // First string is the function name used in TestScripter script file.
+ // Second is the actual implementation member function.
+ ENTRY( "IptvLogCaseStart", CIptvTestUtilModule::IptvLogCaseStart ),
+ ENTRY( "IptvLogCaseEnd", CIptvTestUtilModule::IptvLogCaseEnd ),
+ ENTRY( "IptvLogWrite", CIptvTestUtilModule::IptvLogWrite ),
+
+ ENTRY( "Connect", CIptvTestUtilModule::ConnectL ),
+ ENTRY( "Attach", CIptvTestUtilModule::AttachL ),
+ ENTRY( "Disconnect", CIptvTestUtilModule::DisconnectL ),
+ ENTRY( "Terminate", CIptvTestUtilModule::TerminateConnectionL ),
+ ENTRY( "WaitForConnectionActivity", CIptvTestUtilModule::WaitForConnectionActivityL ),
+ ENTRY( "WaitUntilConnectionIsClosed", CIptvTestUtilModule::WaitUntilConnectionIsClosed ),
+ ENTRY( "Download", CIptvTestUtilModule::DownloadL ),
+ ENTRY( "StopDownloads", CIptvTestUtilModule::StopDownloadsL ),
+
+ ENTRY( "CreateMobilecrashWatcher", CIptvTestUtilModule::CreateMobilecrashWatcherL ),
+ ENTRY( "CheckMobilecrashes", CIptvTestUtilModule::CheckMobilecrashesL ),
+ ENTRY( "CheckMobilecrashesZeroTolerance", CIptvTestUtilModule::CheckMobilecrashesZeroToleranceL ),
+
+ ENTRY( "DeleteUsedDestinationCenRep", CIptvTestUtilModule::DeleteUsedDestinationCenRepL ),
+ ENTRY( "SetUsedDestination", CIptvTestUtilModule::SetUsedDestinationL ),
+ ENTRY( "CreateDestination", CIptvTestUtilModule::CreateDestinationL ),
+ ENTRY( "SetConnectionMethodStringAttribute", CIptvTestUtilModule::SetConnectionMethodStringAttributeL ),
+ ENTRY( "SetConnectionMethodIntAttribute", CIptvTestUtilModule::SetConnectionMethodIntAttributeL ),
+ ENTRY( "SetConnectionMethodBoolAttribute", CIptvTestUtilModule::SetConnectionMethodBoolAttributeL ),
+ ENTRY( "DeleteDestination", CIptvTestUtilModule::DeleteDestinationL ),
+ ENTRY( "CopyMethod", CIptvTestUtilModule::CopyMethodL ),
+ ENTRY( "DeleteMethod", CIptvTestUtilModule::DeleteMethodL ),
+ ENTRY( "SetMethodPriority", CIptvTestUtilModule::SetMethodPriorityL ),
+ ENTRY( "DeleteDestinationAfterwards", CIptvTestUtilModule::DeleteDestinationAfterwardsL ),
+
+ ENTRY( "SetSystemTimeToday", CIptvTestUtilModule::SetSystemTimeToday ),
+ ENTRY( "SetSystemTime", CIptvTestUtilModule::SetSystemTime ),
+ ENTRY( "AdvanceSystemTime1Second", CIptvTestUtilModule::AdvanceSystemTime1Second ),
+ ENTRY( "AdvanceSystemTimeSeconds", CIptvTestUtilModule::AdvanceSystemTimeSeconds ),
+ ENTRY( "AdvanceSystemTimeMinutes", CIptvTestUtilModule::AdvanceSystemTimeMinutes ),
+ ENTRY( "AdvanceSystemTimeHours", CIptvTestUtilModule::AdvanceSystemTimeHours ),
+ ENTRY( "AdvanceSystemTimeDays", CIptvTestUtilModule::AdvanceSystemTimeDays ),
+ ENTRY( "SetTimeZone", CIptvTestUtilModule::SetTimeZone ),
+
+ ENTRY( "CreateFile", CIptvTestUtilModule::CreateFileL ),
+ ENTRY( "DeleteFile", CIptvTestUtilModule::DeleteFileL ),
+ ENTRY( "CreateFolder", CIptvTestUtilModule::CreateFolderL ),
+ ENTRY( "DeleteFolder", CIptvTestUtilModule::DeleteFolderL ),
+ ENTRY( "LockFile", CIptvTestUtilModule::LockFileL ),
+ ENTRY( "UnlockFile", CIptvTestUtilModule::UnlockFileL ),
+ ENTRY( "ExtractFile", CIptvTestUtilModule::ExtractFileL ),
+ ENTRY( "SetDriveFreeSpace", CIptvTestUtilModule::SetDriveFreeSpaceL ),
+ };
+
+ const TInt count = sizeof( KFunctions ) /
+ sizeof( TStifFunctionInfo );
+
+ return RunInternalL( KFunctions, count, aItem );
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::IptvLogCaseStart
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::IptvLogCaseStart( CStifItemParser& aItem )
+ {
+ //VCXLOGLO1(">>>CIptvTestUtilModule::IptvLogCaseStart");
+
+ _LIT( KIptvTestUtilModule, "IptvTestUtilModule" );
+ _LIT( KWhere, "In IptvLogCaseStart" );
+ TestModuleIf().Printf( 0, KIptvTestUtilModule, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TPtrC string;
+
+ if( aItem.GetNextString ( string ) != KErrNone )
+ {
+ VCXLOGLO1("CIptvTestUtilModule::IptvLogCaseStart: Could not read parameter!");
+ return KErrGeneral;
+ }
+
+ VCXLOGLO2(">>> Case start: %S", &string);
+
+ iCaseStarted = ETrue;
+
+ return KErrNone;
+ //VCXLOGLO1("<<<CIptvTestUtilModule::IptvLogCaseStart");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::IptvLogCaseEnd
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::IptvLogCaseEnd( CStifItemParser& /* aItem */ )
+ {
+ //VCXLOGLO1(">>>CIptvTestUtilModule::IptvLogCaseEnd");
+
+ _LIT( KIptvTestUtilModule, "IptvTestUtilModule" );
+ _LIT( KWhere, "In IptvLogCaseEnd" );
+ TestModuleIf().Printf( 0, KIptvTestUtilModule, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ VCXLOGLO1("<<< Case end.");
+ iCaseStarted = EFalse;
+
+ return KErrNone;
+ //VCXLOGLO1("<<<CIptvTestUtilModule::IptvLogCaseEnd");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::IptvLogWrite
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::IptvLogWrite( CStifItemParser& aItem )
+ {
+ //VCXLOGLO1(">>>CIptvTestUtilModule::IptvLogWrite");
+
+ _LIT( KIptvTestUtilModule, "IptvTestUtilModule" );
+ _LIT( KWhere, "In IptvLogWrite" );
+ TestModuleIf().Printf( 0, KIptvTestUtilModule, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TPtrC string;
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ if( aItem.GetNextString ( string ) != KErrNone )
+ {
+ VCXLOGLO1("CIptvTestUtilModule::IptvLogWrite: Could not read parameter!");
+ return KErrGeneral;
+ }
+
+ VCXLOGLO2("%S", &string);
+
+ return KErrNone;
+ //VCXLOGLO1("<<<CIptvTestUtilModule::IptvLogWrite");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::ConnectL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::ConnectL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::ConnectL");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In ConnectL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ if(iConnect)
+ {
+ VCXLOGLO1("CIptvTestUtilModule:: Connection already exists.");
+ return KErrAlreadyExists;
+ }
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TInt err = KErrNone;
+
+ TPtrC iapName;
+
+ if(KErrNone != aItem.GetNextString(iapName) )
+ {
+ VCXLOGLO1("** FAIL ** Invalid testcase parameter! Iap name was not specified.");
+ iLog->Log( _L("** FAIL ** Invalid testcase parameter! Iap name was not specified.") );
+ VCXLOGLO1("<<<CIptvTestUtilModule::ConnectL");
+ return KErrGeneral;
+ }
+
+ TBufC<256> name(iapName);
+ TUint32 iapId;
+ if(!iTestCommon->GetIapIdL(name, iapId))
+ {
+ VCXLOGLO2("** FAIL ** Could not find iap with name %S.", &name);
+ iLog->Log( _L("** FAIL ** Could not find specified iap.") );
+ VCXLOGLO1("<<<CIptvTestUtilModule::ConnectL");
+ return KErrGeneral;
+ }
+
+ iRetryCount = 10;
+
+ iConnect = CTestUtilConnection::NewL(this);
+
+ iConnect->SetConnectionPreferences(KCommDbBearerUnknown, iapId);
+ iConnect->ConnectL();
+
+ if(!iTimer)
+ {
+ iTimer = CIptvTestTimer::NewL(*this, KConnectionTimerId);
+ }
+ iTimer->After(1000000 * 20);
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::ConnectL");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::AttachL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::AttachL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::AttachL");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In AttachL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ if(iConnect)
+ {
+ VCXLOGLO1("<<<CIptvTestUtilModule:: Connection already exists.");
+ return KErrAlreadyExists;
+ }
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TInt err = KErrNone;
+
+ TRAP(err, PrintIAPs() );
+
+ TPtrC iapName;
+
+ if(KErrNone != aItem.GetNextString(iapName) )
+ {
+ VCXLOGLO1("** FAIL ** Invalid testcase parameter! Iap name was not specified.");
+ iLog->Log( _L("** FAIL ** Invalid testcase parameter! Iap name was not specified.") );
+ VCXLOGLO1("<<<CIptvTestUtilModule::AttachL");
+ return KErrGeneral;
+ }
+
+ TBufC<256> name(iapName);
+ TUint32 iapId;
+ if(!iTestCommon->GetIapIdL(name, iapId))
+ {
+ VCXLOGLO2("** FAIL ** Could not find iap with name %S.", &name);
+ iLog->Log( _L("** FAIL ** Could not find specified iap.") );
+ VCXLOGLO1("<<<CIptvTestUtilModule::AttachL");
+ return KErrGeneral;
+ }
+
+ iConnect = CTestUtilConnection::NewL(this);
+
+ iConnect->SetConnectionPreferences(KCommDbBearerUnknown, iapId);
+ iConnect->AttachL();
+
+ if(!iTimer)
+ {
+ iTimer = CIptvTestTimer::NewL(*this, KConnectionTimerId);
+ }
+ iTimer->After(1000000 * 20);
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::AttachL");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::DisconnectL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::DisconnectL( CStifItemParser& /* aItem */ )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::DisconnectL");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In DisconnectL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TInt err = KErrNone;
+
+ if(iTimer)
+ {
+ iTimer->CancelTimer();
+ }
+
+ delete iConnect;
+ iConnect = NULL;
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::DisconnectL");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::TerminateConnectionL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::TerminateConnectionL( CStifItemParser& /* aItem */ )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::TerminateConnectionL");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In TerminateConnectionL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TInt err = KErrNone;
+
+ if(iConnect)
+ {
+ iConnect->TerminateConnectionL();
+
+ delete iConnect;
+ iConnect = NULL;
+ }
+
+ if(iTimer)
+ {
+ iTimer->CancelTimer();
+ }
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::TerminateConnectionL");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::DownloadL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::DownloadL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::DownloadL");
+ // Print to UI
+ _LIT( KIptvTestUtilModule, "IptvTestUtilModule" );
+ _LIT( KWhere, "In DownloadL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilModule, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TInt err = KErrNone;
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TPtrC pAddress, pOutFile, pUserName, pPassword, pIapName;
+
+ if( aItem.GetNextString ( pAddress ) != KErrNone )
+ {
+ VCXLOGLO1("CIptvTestUtilModule::DownloadL: Could not read parameter address!");
+ return KErrGeneral;
+ }
+
+ HBufC* heapBuffer = HBufC::NewL(4000);
+ TPtr ptr( heapBuffer->Des() );
+ ptr.Copy( pAddress );
+
+ if( aItem.GetNextString ( pOutFile ) != KErrNone )
+ {
+ VCXLOGLO1("CIptvTestUtilModule::DownloadL: Could not read parameter outputfile!");
+ return KErrGeneral;
+ }
+
+ if( aItem.GetNextString ( pUserName ) != KErrNone )
+ {
+ VCXLOGLO1("CIptvTestUtilModule::DownloadL: no user name specified!");
+ }
+
+ if( aItem.GetNextString ( pPassword ) != KErrNone )
+ {
+ VCXLOGLO1("CIptvTestUtilModule::DownloadL: no password specified!");
+ }
+
+ if( aItem.GetNextString ( pIapName ) != KErrNone )
+ {
+ VCXLOGLO1("CIptvTestUtilModule::DownloadL: no iap specified!");
+ }
+
+ VCXLOGLO2("Address: %S", &pAddress);
+ VCXLOGLO2("OutFile: %S", &pOutFile);
+ VCXLOGLO2("name: %S", &pUserName);
+ VCXLOGLO2("Password: %S", &pPassword);
+ VCXLOGLO2("Iap: %S", &pIapName);
+
+ if(!iDownload)
+ {
+ iDownload = CIptvTestDownloadManager::NewL(this);
+ }
+
+ TUint32 iapId(0);
+ GetIap(pIapName, iapId);
+
+ err = iDownload->DownloadL(ptr, pOutFile, pUserName, pPassword, iapId);
+ if(err != KErrNone)
+ {
+ VCXLOGLO2("iDownload returned: %d", err);
+ }
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::DownloadL");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::StopDownloadsL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::StopDownloadsL( CStifItemParser& /* aItem */ )
+ {
+
+ VCXLOGLO1(">>>CIptvTestUtilModule::StopDownloads");
+ // Print to UI
+ _LIT( KIptvTestUtilModule, "IptvTestUtilModule" );
+ _LIT( KWhere, "In StopDownloadsL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilModule, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TInt err = KErrNone;
+
+ if(iDownload)
+ {
+ delete iDownload;
+ iDownload = NULL;
+ }
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::StopDownloads");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::ConnectionCreated
+// -----------------------------------------------------------------------------
+//
+void CIptvTestUtilModule::ConnectionCreated()
+ {
+ VCXLOGLO1("CIptvTestUtilModule:: Connection created.");
+ if(iTimer)
+ {
+ iTimer->CancelTimer();
+ }
+ Signal();
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::ConnectionClosed
+// -----------------------------------------------------------------------------
+//
+void CIptvTestUtilModule::ConnectionClosed()
+ {
+ VCXLOGLO1("CIptvTestUtilModule:: Connection closed.");
+ Signal();
+ if(iTimer)
+ {
+ iTimer->CancelTimer();
+ }
+
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::ConnectionTimeout
+// -----------------------------------------------------------------------------
+//
+void CIptvTestUtilModule::ConnectionTimeout()
+ {
+ VCXLOGLO1("CIptvTestUtilModule:: Connection timeout!");
+ Signal(KErrTimedOut);
+ if(iTimer)
+ {
+ iTimer->CancelTimer();
+ }
+
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::ConnectionFailed
+// -----------------------------------------------------------------------------
+//
+void CIptvTestUtilModule::ConnectionFailed()
+ {
+ if(--iRetryCount <= 0)
+ {
+ Signal(KErrGeneral);
+ VCXLOGLO1("CIptvTestUtilModule:: Connection failed!");
+ }
+ else
+ {
+ VCXLOGLO1("CIptvTestUtilModule:: retrying");
+ iConnect->ConnectL();
+ }
+ if(iTimer)
+ {
+ iTimer->CancelTimer();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::ConnectionAlreadyExists
+// -----------------------------------------------------------------------------
+//
+void CIptvTestUtilModule::ConnectionAlreadyExists()
+ {
+ VCXLOGLO1("CIptvTestUtilModule:: Connection already exists.");
+ if(iTimer)
+ {
+ iTimer->CancelTimer();
+ }
+ Signal();
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::DownloadFinished
+// -----------------------------------------------------------------------------
+//
+void CIptvTestUtilModule::DownloadFinished(TInt aError)
+ {
+ VCXLOGLO1("CIptvTestUtilModule:: Download finished.");
+ Signal(aError);
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::PrintIAPs
+// -----------------------------------------------------------------------------
+//
+void CIptvTestUtilModule::PrintIAPs()
+ {
+ RArray<TUint32> idArray;
+ CleanupClosePushL( idArray );
+
+ CDesCArrayFlat* nameArray = new (ELeave) CDesCArrayFlat(16);
+ CleanupStack::PushL( nameArray );
+
+ // Get IAP names and ids from the database
+ CCommsDatabase* TheDb = CCommsDatabase::NewL( EDatabaseTypeIAP );
+ CleanupStack::PushL( TheDb );
+
+ TheDb->ShowHiddenRecords();
+
+ CCommsDbTableView* view = TheDb->OpenTableLC( TPtrC(IAP) );
+ //Ethernet with Daemon Dynamic IP
+ TBuf<40> name;
+ TUint32 id;
+ TInt res = view->GotoFirstRecord();
+ while( res == KErrNone )
+ {
+ view->ReadTextL( TPtrC(COMMDB_NAME), name );
+ view->ReadUintL( TPtrC(COMMDB_ID), id );
+
+ idArray.Insert( id, 0 );
+ nameArray->InsertL( 0, name );
+
+ res = view->GotoNextRecord();
+ VCXLOGLO3("IAP name, id: %S, %d", &name, id);
+ }
+
+ CleanupStack::PopAndDestroy( view ); // view
+ CleanupStack::PopAndDestroy( TheDb ); // TheDb
+
+ CleanupStack::PopAndDestroy( 2, &idArray ); // nameArray, idArray
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::GetIap
+// -----------------------------------------------------------------------------
+//
+void CIptvTestUtilModule::GetIap(TDesC& aIapName, TUint32& aIapId)
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::GetIap");
+ RArray<TUint32> idArray;
+ CleanupClosePushL( idArray );
+
+ CDesCArrayFlat* nameArray = new (ELeave) CDesCArrayFlat(16);
+ CleanupStack::PushL( nameArray );
+
+ // Get IAP names and ids from the database
+ CCommsDatabase* TheDb = CCommsDatabase::NewL( EDatabaseTypeIAP );
+ CleanupStack::PushL( TheDb );
+
+ TheDb->ShowHiddenRecords();
+
+ CCommsDbTableView* view = TheDb->OpenTableLC( TPtrC(IAP) );
+ //Ethernet with Daemon Dynamic IP
+ TBuf<40> name;
+ TUint32 id;
+ TInt res = view->GotoFirstRecord();
+ while( res == KErrNone )
+ {
+ view->ReadTextL( TPtrC(COMMDB_NAME), name );
+ view->ReadUintL( TPtrC(COMMDB_ID), id );
+
+#ifdef __WINSCW__
+ if(_L("Ethernet with Daemon Dynamic IP") == name)
+ {
+ aIapId = id;
+ VCXLOGLO3("CIptvTestUtilModule:: Found IAP: %d, %S", _L("Ethernet with Daemon Dynamic IP"), &aIapName);
+ }
+#else
+ if(aIapName == name)
+ {
+ aIapId = id;
+ VCXLOGLO3("CIptvTestUtilModule:: Found IAP: %d, %S", aIapId, &aIapName);
+ }
+#endif
+
+ idArray.Insert( id, 0 );
+ nameArray->InsertL( 0, name );
+
+ res = view->GotoNextRecord();
+ }
+
+ CleanupStack::PopAndDestroy( view ); // view
+ CleanupStack::PopAndDestroy( TheDb ); // TheDb
+
+ CleanupStack::PopAndDestroy( 2, &idArray ); // nameArray, idArray
+ VCXLOGLO1("<<<CIptvTestUtilModule::GetIap");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::WaitForConnectionActivityL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::WaitForConnectionActivityL(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::WaitForConnectionActivityL");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In WaitForConnectionActivityL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TInt err = KErrNone;
+
+ TPtrC iapName;
+
+ if( KErrNone != aItem.GetNextString(iapName) )
+ {
+ VCXLOGLO1("** FAIL ** Invalid testcase parameter! Iap name was not specified.");
+ iLog->Log( _L("** FAIL ** Invalid testcase parameter! Iap name was not specified.") );
+ VCXLOGLO1("<<<CIptvTestUtilModule::WaitForConnectionActivityL");
+ return KErrGeneral;
+ }
+
+ if( iConnectionWaiter == NULL )
+ {
+ iConnectionWaiter = CTestUtilConnectionWaiter::NewL(this);
+ }
+
+ TUint32 iapId;
+ if( !iTestCommon->GetIapIdL( iapName, iapId ) )
+ {
+ VCXLOGLO2("** FAIL ** Could not find iap with name %S.", &iapName);
+ iLog->Log( _L("** FAIL ** Could not find specified iap.") );
+ VCXLOGLO1("<<<CIptvTestUtilModule::WaitForConnectionActivityL");
+ return KErrArgument;
+ }
+
+ iConnectionWaiter->WaitForConnection(iapId);
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::WaitForConnectionActivityL");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::WaitUntilConnectionIsClosed
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::WaitUntilConnectionIsClosed(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::WaitUntilConnectionIsClosed");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In WaitForConnectionActivityL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TInt err = KErrNone;
+
+ TRAP(err, PrintIAPs() );
+
+ TPtrC iapName;
+
+ if(KErrNone != aItem.GetNextString(iapName) )
+ {
+ VCXLOGLO1("** FAIL ** Invalid testcase parameter! Iap name was not specified.");
+ iLog->Log( _L("** FAIL ** Invalid testcase parameter! Iap name was not specified.") );
+ VCXLOGLO1("<<<CIptvTestUtilModule::WaitUntilConnectionIsClosed");
+ return KErrGeneral;
+ }
+
+ if(iConnectionWaiter == NULL)
+ {
+ iConnectionWaiter = CTestUtilConnectionWaiter::NewL(this);
+ }
+
+ TUint32 iapId;
+ if(!iTestCommon->GetIapIdL(iapName, iapId))
+ {
+ VCXLOGLO2("** FAIL ** Could not find iap with name %S.", &iapName);
+ iLog->Log( _L("** FAIL ** Could not find specified iap.") );
+ VCXLOGLO1("<<<CIptvTestUtilModule::WaitUntilConnectionIsClosed");
+ return KErrArgument;
+ }
+
+ iConnectionWaiter->WaitUntilConnectionIsClosed(iapId);
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::WaitUntilConnectionIsClosed");
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::TimerComplete
+// -----------------------------------------------------------------------------
+//
+void CIptvTestUtilModule::TimerComplete(TInt aTimerId, TInt aError )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::TimerComplete");
+ VCXLOGLO2(">>>CIptvTestUtilModule:: aError: %d", aError);
+
+ if(aError == KErrNone && aTimerId == KConnectionTimerId)
+ {
+ VCXLOGLO1("* ERROR * Connection timedout!");
+ Signal(KErrTimedOut);
+ }
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::TimerComplete");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::AdvanceSystemTime1Second
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::AdvanceSystemTime1Second(CStifItemParser& /* aItem */ )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::AdvanceSystemTime1Second");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In AdvanceSystemTime1Second" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TInt err = CVCXTestCommon::AdvanceSystemTimeSeconds(1);
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::AdvanceSystemTime1Second");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::AdvanceSystemTimeSeconds
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::AdvanceSystemTimeSeconds(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::AdvanceSystemTimeSeconds");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In AdvanceSystemTimeSeconds" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TInt count;
+ if(aItem.GetNextInt(count) != KErrNone)
+ {
+ VCXLOGLO1("* ERROR * Parameter missing.");
+ VCXLOGLO1("<<<CIptvTestUtilModule::AdvanceSystemTimeDays");
+ return KErrArgument;
+ }
+
+ TInt err = CVCXTestCommon::AdvanceSystemTimeSeconds(count);
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::AdvanceSystemTimeSeconds");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::AdvanceSystemTimeMinutes
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::AdvanceSystemTimeMinutes(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::AdvanceSystemTimeMinutes");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In AdvanceSystemTimeMinutes" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TInt count;
+ if(aItem.GetNextInt(count) != KErrNone)
+ {
+ VCXLOGLO1("* ERROR * Parameter missing.");
+ VCXLOGLO1("<<<CIptvTestUtilModule::AdvanceSystemTimeDays");
+ return KErrArgument;
+ }
+
+ TInt err = CVCXTestCommon::AdvanceSystemTimeMinutes(count);
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::AdvanceSystemTimeMinutes");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::AdvanceSystemTimeHours
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::AdvanceSystemTimeHours(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::AdvanceSystemTimeHours");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In AdvanceSystemTimeHours" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TInt count;
+ if(aItem.GetNextInt(count) != KErrNone)
+ {
+ VCXLOGLO1("* ERROR * Parameter missing.");
+ VCXLOGLO1("<<<CIptvTestUtilModule::AdvanceSystemTimeDays");
+ return KErrArgument;
+ }
+
+ TInt err = CVCXTestCommon::AdvanceSystemTimeHours(count);
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::AdvanceSystemTimeHours");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::AdvanceSystemTimeDays
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::AdvanceSystemTimeDays(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::AdvanceSystemTimeDays");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In AdvanceSystemTimeDays" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TInt daysInt;
+ if(aItem.GetNextInt(daysInt) != KErrNone)
+ {
+ VCXLOGLO1("* ERROR * Parameter days missing.");
+ VCXLOGLO1("<<<CIptvTestUtilModule::AdvanceSystemTimeDays");
+ return KErrArgument;
+ }
+
+ TTime now;
+ now.HomeTime();
+
+ TTimeIntervalDays days(daysInt);
+ now += days;
+
+ TInt err = CVCXTestCommon::SetSystemTime(now);
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::AdvanceSystemTimeDays");
+
+ return err;
+}
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::SetSystemTime
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::SetSystemTime(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::SetSystemTime");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In SetSystemTime" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TPtrC dayString;
+ if(aItem.GetNextString(dayString) != KErrNone)
+ {
+ VCXLOGLO1("* ERROR * Parameter missing.");
+ VCXLOGLO1("<<<CIptvTestUtilModule::SetSystemTime");
+ return KErrArgument;
+ }
+
+ TTime time( dayString );
+ TInt err = CVCXTestCommon::SetSystemTime(time);
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::SetSystemTime");
+ return err;
+}
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::SetSystemTimeToday
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::SetSystemTimeToday(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::SetSystemTimeToday");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In SetSystemTimeToday" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TInt hour( 0 );
+ TInt minute( 0 );
+
+ aItem.GetNextInt( hour );
+ aItem.GetNextInt( minute );
+
+ TTime time;
+ TBuf<256> timeString;
+ time.HomeTime();
+ time.FormatL( timeString, KDateTimeString );
+ VCXLOGLO2("CIptvTestUtilModule::SetSystemTimeToday -- HomeTime() %S", &timeString);
+
+ TDateTime dateTime( time.DateTime() );
+ dateTime = time.DateTime();
+ dateTime.SetHour( hour );
+ dateTime.SetMinute( minute );
+
+ time = dateTime;
+ time.FormatL( timeString, KDateTimeString );
+ VCXLOGLO2("CIptvTestUtilModule::SetSystemTimeToday -- System time set to: %S", &timeString);
+
+ /*
+ time.UniversalTime();
+ time.FormatL( timeString, KDateTimeString );
+ VCXLOGLO2("CIptvTestUtilModule::SetSystemTimeToday -- Universal time: %S", &timeString);
+ */
+
+ TInt err = CVCXTestCommon::SetSystemTime(time);
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::SetSystemTimeToday");
+ return err;
+}
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::SetTimeZone
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::SetTimeZone(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::SetTimeZone");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In SetTimeZone" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TPtrC timeZone;
+ if(aItem.GetNextString(timeZone) != KErrNone)
+ {
+ VCXLOGLO1("* ERROR * Parameter missing.");
+ VCXLOGLO1("<<<CIptvTestUtilModule::SetTimeZone");
+ return KErrArgument;
+ }
+
+ TInt err = CVCXTestCommon::SetTimeZone(timeZone);
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::SetTimeZone");
+ return err;
+}
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::CreateMobilecrashWatcherL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::CreateMobilecrashWatcherL(CStifItemParser& /* aItem */ )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::CreateMobilecrashWatcherL");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In CreateMobilecrashWatcherL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ if(iIptvTestMobilecrashWatcher)
+ {
+ delete iIptvTestMobilecrashWatcher;
+ iIptvTestMobilecrashWatcher = NULL;
+ }
+
+ iIptvTestMobilecrashWatcher = CIptvTestMobilecrashWatcher::NewL(EFalse);
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::CreateMobilecrashWatcherL");
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::CheckMobilecrashesL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::CheckMobilecrashesL(CStifItemParser& /* aItem */ )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::CheckMobilecrashesL");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In CheckMobilecrashesl" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ if(!iIptvTestMobilecrashWatcher)
+ {
+ VCXLOGLO1("<<<CIptvTestUtilModule::CheckMobilecrashesL");
+ return KErrNotReady;
+ }
+
+ RPointerArray<HBufC> crashes;
+ if(iIptvTestMobilecrashWatcher->ReturnNewCrashes(crashes))
+ {
+ VCXLOGLO1("<<<CIptvTestUtilModule::CheckMobilecrashesL");
+ crashes.ResetAndDestroy();
+ return KErrAbort;
+ }
+ crashes.ResetAndDestroy();
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::CheckMobilecrashesL");
+ return KErrNone;
+}
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::CheckMobilecrashesZeroToleranceL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::CheckMobilecrashesZeroToleranceL(CStifItemParser& /* aItem */ )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::CheckMobilecrashesZeroToleranceL");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In CheckMobilecrashesl" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ if(!iIptvTestMobilecrashWatcher)
+ {
+ iIptvTestMobilecrashWatcher = CIptvTestMobilecrashWatcher::NewL(EFalse);
+ }
+
+ TInt ret = KErrNone;
+ if(iIptvTestMobilecrashWatcher->ReturnMobileCrashCount() > 0)
+ {
+ ret = KErrAbort;
+ }
+
+ VCXLOGLO2("<<<CIptvTestUtilModule:: returning: %d", ret);
+ VCXLOGLO1("<<<CIptvTestUtilModule::CheckMobilecrashesZeroToleranceL");
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::DeleteUsedDestinationCenRepL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::DeleteUsedDestinationCenRepL(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::DeleteUsedDestinationCenRepL");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In DeleteUsedDestinationCenRepL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TInt ret( KErrNone );
+
+ if( !iTestUtilALR )
+ {
+ iTestUtilALR = CIptvTestUtilALR::NewL();
+ }
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TRAP( ret, iTestUtilALR->RemoveUsedDestinationCenRepL() );
+
+ VCXLOGLO2("<<<CIptvTestUtilModule:: returning: %d", ret);
+ VCXLOGLO1("<<<CIptvTestUtilModule::DeleteUsedDestinationCenRepL");
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::SetUsedDestinationL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::SetUsedDestinationL(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::SetUsedDestinationL");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In SetUsedDestinationL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TInt ret( KErrNone );
+
+ if( !iTestUtilALR )
+ {
+ iTestUtilALR = CIptvTestUtilALR::NewL();
+ }
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TPtrC destinationName;
+ User::LeaveIfError( aItem.GetNextString( destinationName ) );
+
+ TRAP( ret, iTestUtilALR->SetUsedDestinationL( destinationName ) );
+
+ VCXLOGLO2("<<<CIptvTestUtilModule:: returning: %d", ret);
+ VCXLOGLO1("<<<CIptvTestUtilModule::SetUsedDestinationL");
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::CreateDestinationL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::CreateDestinationL(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::CreateDestinationL");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In CreateDestinationL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TInt ret( KErrNotSupported );
+
+ if( !iTestUtilALR )
+ {
+ iTestUtilALR = CIptvTestUtilALR::NewL();
+ }
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TPtrC destinationName;
+ User::LeaveIfError( aItem.GetNextString( destinationName ) );
+
+ TRAP(ret, iTestUtilALR->CreateDestinationL( destinationName ) );
+
+ VCXLOGLO2("<<<CIptvTestUtilModule:: returning: %d", ret);
+ VCXLOGLO1("<<<CIptvTestUtilModule::CreateDestinationL");
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::DeleteDestinationL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::DeleteDestinationL(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::DeleteDestinationL");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In DeleteDestinationL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TInt ret( KErrNotSupported );
+
+ if( !iTestUtilALR )
+ {
+ iTestUtilALR = CIptvTestUtilALR::NewL();
+ }
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TPtrC destinationName;
+ User::LeaveIfError( aItem.GetNextString( destinationName ) );
+
+ TRAP(ret, iTestUtilALR->DeleteDestinationL( destinationName ) );
+
+ VCXLOGLO2("<<<CIptvTestUtilModule:: returning: %d", ret);
+ VCXLOGLO1("<<<CIptvTestUtilModule::DeleteDestinationL");
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::CopyMethodL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::CopyMethodL(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::CopyMethodL");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In CopyMethodL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TInt ret( KErrNotSupported );
+
+ if( !iTestUtilALR )
+ {
+ iTestUtilALR = CIptvTestUtilALR::NewL();
+ }
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TPtrC sourceMethodName;
+ TPtrC targetMethodName;
+ TPtrC targetDestinationName;
+
+ User::LeaveIfError( aItem.GetNextString( sourceMethodName ) );
+ User::LeaveIfError( aItem.GetNextString( targetMethodName ) );
+ User::LeaveIfError( aItem.GetNextString( targetDestinationName ) );
+
+ TRAP(ret, iTestUtilALR->CopyMethodL( sourceMethodName, targetMethodName, targetDestinationName ) );
+
+ VCXLOGLO2("<<<CIptvTestUtilModule:: returning: %d", ret);
+ VCXLOGLO1("<<<CIptvTestUtilModule::CopyMethodL");
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::DeleteMethodL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::DeleteMethodL(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::DeleteMethodL");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In DeleteMethodL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TInt ret( KErrNotSupported );
+
+ if( !iTestUtilALR )
+ {
+ iTestUtilALR = CIptvTestUtilALR::NewL();
+ }
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TPtrC destinationName;
+ TPtrC methodName;
+
+ User::LeaveIfError( aItem.GetNextString( destinationName ) );
+ User::LeaveIfError( aItem.GetNextString( methodName ) );
+
+ TRAP(ret, iTestUtilALR->DeleteMethodL( destinationName, methodName ) );
+
+ VCXLOGLO2("<<<CIptvTestUtilModule:: returning: %d", ret);
+ VCXLOGLO1("<<<CIptvTestUtilModule::DeleteMethodL");
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::SetMethodPriorityL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::SetMethodPriorityL(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::SetMethodPriorityL");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In SetMethodPriorityL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TInt ret( KErrNotSupported );
+
+ if( !iTestUtilALR )
+ {
+ iTestUtilALR = CIptvTestUtilALR::NewL();
+ }
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TPtrC destinationName;
+ TPtrC methodName;
+ TInt priority;
+
+ User::LeaveIfError( aItem.GetNextString( destinationName ) );
+ User::LeaveIfError( aItem.GetNextString( methodName ) );
+ User::LeaveIfError( aItem.GetNextInt( priority ) );
+
+ TRAP(ret, iTestUtilALR->SetMethodPriorityL( destinationName, methodName, priority ) );
+
+ VCXLOGLO2("<<<CIptvTestUtilModule:: returning: %d", ret);
+ VCXLOGLO1("<<<CIptvTestUtilModule::SetMethodPriorityL");
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::DeleteDestinationAfterwardsL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::DeleteDestinationAfterwardsL(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::DeleteDestinationAfterwardsL");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In DeleteDestinationAfterwardsL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TInt ret( KErrNotSupported );
+
+ if( !iTestUtilALR )
+ {
+ iTestUtilALR = CIptvTestUtilALR::NewL();
+ }
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TPtrC destinationName;
+
+ User::LeaveIfError( aItem.GetNextString( destinationName ) );
+
+ iToBeDeletedDestinations.AppendL( destinationName.AllocL() );
+
+ ret = KErrNone;
+
+ VCXLOGLO2("<<<CIptvTestUtilModule:: returning: %d", ret);
+ VCXLOGLO1("<<<CIptvTestUtilModule::DeleteDestinationAfterwardsL");
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::SetConnectionMethodStringAttributeL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::SetConnectionMethodStringAttributeL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::SetConnectionMethodStringAttributeL");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In SetConnectionMethodStringAttributeL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TInt ret( KErrNotSupported );
+
+ if( !iTestUtilALR )
+ {
+ iTestUtilALR = CIptvTestUtilALR::NewL();
+ }
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TPtrC destinationName;
+ TPtrC methodName;
+ TInt attribute;
+ TPtrC value;
+
+ User::LeaveIfError( aItem.GetNextString( destinationName ) );
+ User::LeaveIfError( aItem.GetNextString( methodName ) );
+ User::LeaveIfError( aItem.GetNextInt( attribute ) );
+ User::LeaveIfError( aItem.GetNextString( value ) );
+
+ TRAP(ret, iTestUtilALR->SetMethodStringAttributeL( destinationName, methodName, attribute, value ) );
+
+ VCXLOGLO2("<<<CIptvTestUtilModule:: returning: %d", ret);
+ VCXLOGLO1("<<<CIptvTestUtilModule::SetConnectionMethodStringAttributeL");
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::SetConnectionMethodIntAttributeL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::SetConnectionMethodIntAttributeL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::SetConnectionMethodIntAttributeL");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In SetConnectionMethodIntAttributeL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TInt ret( KErrNotSupported );
+
+ if( !iTestUtilALR )
+ {
+ iTestUtilALR = CIptvTestUtilALR::NewL();
+ }
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TPtrC destinationName;
+ TPtrC methodName;
+ TInt attribute;
+ TInt value;
+
+ User::LeaveIfError( aItem.GetNextString( destinationName ) );
+ User::LeaveIfError( aItem.GetNextString( methodName ) );
+ User::LeaveIfError( aItem.GetNextInt( attribute ) );
+ User::LeaveIfError( aItem.GetNextInt( value ) );
+
+ TRAP(ret, iTestUtilALR->SetMethodIntAttributeL( destinationName, methodName, attribute, value ) );
+
+ VCXLOGLO2("<<<CIptvTestUtilModule:: returning: %d", ret);
+ VCXLOGLO1("<<<CIptvTestUtilModule::SetConnectionMethodIntAttributeL");
+ return ret;
+ }
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::DeleteDestinationL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::SetConnectionMethodBoolAttributeL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::SetConnectionMethodBoolAttributeL");
+ // Print to UI
+ _LIT( KIptvTestUtilConnect, "IptvTestUtilModule" );
+ _LIT( KWhere, "In SetConnectionMethodBoolAttributeL" );
+ TestModuleIf().Printf( 0, KIptvTestUtilConnect, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TInt ret( KErrNotSupported );
+
+ if( !iTestUtilALR )
+ {
+ iTestUtilALR = CIptvTestUtilALR::NewL();
+ }
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TPtrC destinationName;
+ TPtrC methodName;
+ TInt attribute;
+ TInt value;
+
+ User::LeaveIfError( aItem.GetNextString( destinationName ) );
+ User::LeaveIfError( aItem.GetNextString( methodName ) );
+ User::LeaveIfError( aItem.GetNextInt( attribute ) );
+ User::LeaveIfError( aItem.GetNextInt( value ) );
+
+ TRAP(ret, iTestUtilALR->SetMethodBoolAttributeL( destinationName, methodName, attribute, static_cast<TBool>(value) ) );
+
+ VCXLOGLO2("<<<CIptvTestUtilModule:: returning: %d", ret);
+ VCXLOGLO1("<<<CIptvTestUtilModule::SetConnectionMethodBoolAttributeL");
+ return ret;
+ }
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::CreateFileL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::CreateFileL(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::CreateFileL");
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+ TPtrC fileName;
+ User::LeaveIfError( aItem.GetNextString( fileName ) );
+
+ RFile file;
+ CleanupClosePushL(file);
+ TInt err = file.Replace(iFs, fileName, EFileWrite);
+ CleanupStack::PopAndDestroy( &file );
+ VCXLOGLO2("<<<CIptvTestUtilModule:: returning: %d", err);
+ VCXLOGLO1("<<<CIptvTestUtilModule::CreateFileL");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::DeleteFileL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::DeleteFileL(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::DeleteFileL");
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+ TPtrC fileName;
+ User::LeaveIfError( aItem.GetNextString( fileName ) );
+ TInt err = iFs.Delete( fileName );
+ VCXLOGLO2("<<<CIptvTestUtilModule:: returning: %d", err);
+ VCXLOGLO1("<<<CIptvTestUtilModule::DeleteFileL");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::CreateFolderL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::CreateFolderL(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::CreateFolderL");
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+ TPtrC path;
+ User::LeaveIfError( aItem.GetNextString( path ) );
+ BaflUtils::EnsurePathExistsL(iFs, path);
+ VCXLOGLO1("<<<CIptvTestUtilModule::CreateFolderL");
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::DeleteFolderL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::DeleteFolderL(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::DeleteFolderL");
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+ TPtrC path;
+ User::LeaveIfError( aItem.GetNextString( path ) );
+ CFileMan* fileMan = CFileMan::NewL(iFs);
+ CleanupStack::PushL(fileMan);
+ fileMan->RmDir( path );
+ CleanupStack::PopAndDestroy( fileMan );
+ VCXLOGLO1("<<<CIptvTestUtilModule::DeleteFolderL");
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::LockFileL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::LockFileL(CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::LockFileL");
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+ TPtrC fileName;
+ User::LeaveIfError( aItem.GetNextString( fileName ) );
+
+ TInt err( KErrInUse );
+ if( !iFileIsLocked )
+ {
+ err = iLockedFile.Open(iFs, fileName, EFileShareExclusive | EFileOpen);
+ iFileIsLocked = ETrue;
+ }
+ VCXLOGLO2("<<<CIptvTestUtilModule:: returning: %d", err);
+ VCXLOGLO1("<<<CIptvTestUtilModule::LockFileL");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::LockFileL
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::UnlockFileL(CStifItemParser& /* aItem */ )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::UnlockFileL");
+ if( iFileIsLocked )
+ {
+ iLockedFile.Close();
+ }
+ iFileIsLocked = EFalse;
+ VCXLOGLO1("<<<CIptvTestUtilModule::UnlockFileL");
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvTestUtilModule::SetDriveFreeSpaceL(TUint size in bytes)
+//
+// Creates dummy file so that the remaining disk space equals to given parameter
+//
+// OLD INFO???
+// Note that the videocenter considers C: drive to be full when there is 10% left,
+// so if "free space" param is 0, this leaves actually 10% of drive space free.
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::SetDriveFreeSpaceL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::SetDriveFreeSpaceL");
+ // Print to UI
+ _LIT( KWhere, "IptvTestUtilModule" );
+ _LIT( KSetCFreeSpace, "In SetDriveFreeSpaceL" );
+ TestModuleIf().Printf( 0, KWhere, KSetCFreeSpace );
+ // Print to log file
+ iLog->Log( KSetCFreeSpace );
+
+ TPtrC driveLetter;
+ User::LeaveIfError(aItem.GetNextString( driveLetter ));
+
+ VCXLOGLO2("CVCXTestCommon:: drive: %S", &driveLetter);
+
+ TInt driveNumber(0);
+ User::LeaveIfError( iFs.CharToDrive( driveLetter[0], driveNumber ) );
+
+ TUint desiredSpace(0);
+ User::LeaveIfError(aItem.GetNextInt( desiredSpace ));
+
+ VCXLOGLO2("CVCXTestCommon:: desired space: %d", desiredSpace);
+
+ iDummyFilesCreated = ETrue;
+
+ iTestCommon->SetDriveFreeSpaceL( driveNumber, desiredSpace );
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::SetDriveFreeSpaceL");
+ return KErrNone;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CIptvTestVerifyData::ExtractFile()
+// -----------------------------------------------------------------------------
+//
+TInt CIptvTestUtilModule::ExtractFileL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1(">>>CIptvTestUtilModule::ExtractFile");
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TPtrC zipFileName;
+ User::LeaveIfError(aItem.GetNextString( zipFileName ));
+
+ TPtrC sourceFileName;
+ User::LeaveIfError(aItem.GetNextString( sourceFileName ));
+
+ TPtrC destFileName;
+ User::LeaveIfError(aItem.GetNextString( destFileName ));
+
+ iFs.Delete( sourceFileName );
+
+ CZipFile* zipFile;
+ TRAPD(err, zipFile = CZipFile::NewL( iFs, zipFileName ) );
+
+ if( err != KErrNone )
+ {
+ VCXLOGLO2("CIptvTestUtilModule:: error %d", err);
+ delete zipFile;
+ return err;
+ }
+
+ VCXLOGLO2("CIptvTestUtilModule:: zipFileName: %S", &zipFileName);
+ VCXLOGLO2("CIptvTestUtilModule:: sourceFileName: %S", &sourceFileName);
+ VCXLOGLO2("CIptvTestUtilModule:: destFileName: %S", &destFileName);
+
+ if( !FileExistsInZip( zipFile, sourceFileName ) )
+ {
+ VCXLOGLO1("CIptvTestUtilModule:: No such file in zip! Leaving..");
+ delete zipFile;
+ User::Leave( KErrNotFound );
+ }
+
+ // Get zip file member from the archive
+ VCXLOGLO1("CIptvTestUtilModule:: Get zip file member from the archive");
+ CZipFileMember* member = zipFile->CaseInsensitiveMemberL( sourceFileName );
+ if( member == NULL )
+ {
+ VCXLOGLO1("CIptvTestUtilModule:: zip member is null. Leaving..");
+ delete zipFile;
+ User::Leave(KErrGeneral);
+ }
+ CleanupStack::PushL( member );
+
+ // Get read stream for the file
+ VCXLOGLO1("CIptvTestUtilModule:: Get read stream for the file");
+ RZipFileMemberReaderStream* stream;
+ zipFile->GetInputStreamL( member, stream );
+ CleanupStack::PushL( stream );
+
+ // Alloc buffer and read the archived file
+ VCXLOGLO1("CIptvTestUtilModule:: Alloc buffer and read the archived file");
+ HBufC8* buffer = HBufC8::NewLC( member->UncompressedSize() );
+ TPtr8 bufferPtr( buffer->Des() );
+ User::LeaveIfError( stream->Read( bufferPtr, member->UncompressedSize() ) );
+
+ // Write the file to the filesystem
+ VCXLOGLO1("CIptvTestUtilModule:: Write the file to the filesystem");
+ RFile file;
+ User::LeaveIfError( file.Replace( iFs, destFileName, EFileWrite ) );
+ CleanupClosePushL( file );
+ User::LeaveIfError( file.Write(*buffer) );
+
+ delete zipFile;
+ CleanupStack::PopAndDestroy( &file );
+ CleanupStack::PopAndDestroy( buffer );
+ CleanupStack::PopAndDestroy( stream );
+ CleanupStack::PopAndDestroy( member );
+
+ VCXLOGLO1("<<<CIptvTestUtilModule::ExtractFile");
+ return 0;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CIptvTestVerifyData::FileExistsInZip()
+// -----------------------------------------------------------------------------
+//
+TBool CIptvTestUtilModule::FileExistsInZip( CZipFile* aZipFile, const TDesC& aFileName )
+ {
+ VCXLOGLO1(">>>CIptvTestVerifyData::FileExistsInZip");
+
+ CZipFileMember* member = NULL;
+
+ VCXLOGLO1("CIptvTestVerifyData:: list of members");
+ CZipFileMemberIterator* members = aZipFile->GetMembersL();
+
+ VCXLOGLO1("CIptvTestVerifyData:: loop all members");
+
+ while ((member = members->NextL()) != 0)
+ {
+ VCXLOGLO3("CIptvTestVerifyData:: member %S, size: %d", &(*member->Name()), member->CompressedSize());
+
+ if( aFileName == (*member->Name()) )
+ {
+ delete member;
+ delete members;
+ VCXLOGLO1("<<<CIptvTestVerifyData::FileExistsInZip");
+ return ETrue;
+ }
+
+ delete member;
+ }
+
+ delete members;
+ VCXLOGLO1("<<<CIptvTestVerifyData::FileExistsInZip");
+ return EFalse;
+ }
+
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+// None
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/conf/VCXConnUtilTest.inc Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,65 @@
+KVcxConnUtilTestModeSubscriber 0 // No connectivity functionality in this mode
+KVcxConnUtilTestModeConnectivity 1 // No P&S property subscriptions, properties can be read
+KVcxConnUtilTestModeBoth 2
+
+// From vcxconnectionutility.hrh
+EVCxNotConnected 10
+EVCxConnecting 11
+EVCxConnected 12
+EVCxDisconnecting 13
+EVCxRoamingRequest 14
+EVCxRoamingAccepted 15
+EVCxError 16
+
+// From vcxconnectionutility.hrh
+EVCxPSConnectionStatus 1
+EVCxPSIapId 2
+EVCxPSSnapId 3
+EVCxPSMasterExists 4
+EVCxPSNbrConnInstances 5
+EVCxPSRoamingRequestStatus 6
+EVCxPSNbrRoamResp 7
+EVCxPSNbRoamAccepted 8
+
+// From vcxconnectionutility.hrh
+EVCxRoamingNotInit 50
+EVCxRoamingAllowed 51
+
+// From cmconnectionmethoddef.h
+// Only part of attributes are listed here.
+ECmName 501
+ECmStartPage 503
+ECmHidden 504 // Not supported yet
+ECmProtected 505 // Needs NW ctrl cap
+ECmNamingMethod 506
+ECmSeamlessnessLevel 507
+
+ECmMetaHighlight 600
+ECmMetaHiddenAgent 601
+
+ECmNextLayerIapId 602
+ECmNextLayerSNAPId 603
+
+ECmProxyUsageEnabled 1000 // Proxy record is deleted on UpdateL() if ECmProxyServerName is an empty string.
+ECmProxyServerName 1001
+ECmProxyProtocolName 1002
+ECmProxyPortNumber 1003
+ECmProxyExceptions 1004
+
+ECmIsLinked 6001
+
+DEST_TEST "dest_test_connutil"
+DEST_TEST2 "dest_test_connutil2"
+
+
+AP1 "test_ap_1"
+AP2 "test_ap_2"
+AP3 "test_ap_3"
+AP4 "test_ap_4"
+AP5 "test_ap_5"
+AP6 "test_ap_6"
+AP7 "test_ap_7"
+AP8 "test_ap_8"
+AP9 "test_ap_9"
+AP10 "test_ap_10"
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/conf/VCXConnUtilTestHelium.cfg Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,927 @@
+#-----------------------------------------------------------------------------------
+#
+# STIF test script file for testing service management client API.
+#
+# This cfg has test cases which are run when Helium generates ATS3 test drops.
+# The cases are from other cfgs under the test module, if they are changed then
+# easiest way to update cases here is to run perl script in the internal tool folder.
+#
+#-----------------------------------------------------------------------------------
+
+[StifSettings]
+CapsModifier= IptvTestClientApiCapsMod.exe
+[EndStifSettings]
+
+[Define]
+INCLUDE c:\testframework\VCXConnUtilTest.inc
+INCLUDE c:\testframework\VCXDrives.inc
+INCLUDE c:\testframework\VCXConsts.inc
+INCLUDE c:\testframework\VCXErrors.inc
+[Enddefine]
+
+
+[Test]
+title ET31100 <not a test> Setup and cleanup
+create VCXTestUtilModule Util
+
+Util CopyMethod "Internet" "Internet" "Internet"
+// Disable connection dialog for "Internet" destination.
+Util SetConnectionMethodIntAttribute "Internet" "Internet" ECmSeamlessnessLevel 2
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST2
+
+delete Util
+[Endtest]
+
+[Test]
+title ET31126 Create and destroy
+create VCXTestUtilModule Util
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+
+VCXCONN Create "MASTERPS"
+
+print created
+pause 3000
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxNotConnected
+print pausing
+pause 3000
+print OK!
+
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31101 Connect to destination with 1 IAP
+create VCXTestUtilModule Util
+
+// Destination with 1 working IAP
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31102 Connect to destination with 2 IAPs
+create VCXTestUtilModule Util
+
+// Destination with 2 working IAPs
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP2 0
+Util SetMethodPriority DEST_TEST AP1 1´
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP2
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31103 Connect to destination with 10 IAPs
+create VCXTestUtilModule Util
+
+// Destination with 10 working IAPs
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util CopyMethod 3G_AP AP3 DEST_TEST
+Util CopyMethod 3G_AP AP4 DEST_TEST
+Util CopyMethod 3G_AP AP5 DEST_TEST
+Util CopyMethod 3G_AP AP6 DEST_TEST
+Util CopyMethod 3G_AP AP7 DEST_TEST
+Util CopyMethod 3G_AP AP8 DEST_TEST
+Util CopyMethod 3G_AP AP9 DEST_TEST
+Util CopyMethod 3G_AP AP10 DEST_TEST
+
+Util SetMethodPriority DEST_TEST AP5 0
+Util SetMethodPriority DEST_TEST AP1 1
+Util SetMethodPriority DEST_TEST AP2 2
+Util SetMethodPriority DEST_TEST AP3 3
+Util SetMethodPriority DEST_TEST AP4 4
+Util SetMethodPriority DEST_TEST AP6 5
+Util SetMethodPriority DEST_TEST AP7 6
+Util SetMethodPriority DEST_TEST AP8 7
+Util SetMethodPriority DEST_TEST AP9 8
+Util SetMethodPriority DEST_TEST AP10 9
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP5
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31108 Connect, disconnect
+create VCXTestUtilModule Util
+
+// Destination with 1 working IAP
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxNotConnected
+pause 3000
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31109 Connect, disconnect, connect
+create VCXTestUtilModule Util
+
+// Destination with 1 working IAP
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+pause 3000
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxNotConnected
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+Util WaitForConnectionActivity AP1
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31110 Connect, disconnect, disconnect
+create VCXTestUtilModule Util
+
+// Destination with 1 working IAP
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31111 Disconnect without connection, then connect
+create VCXTestUtilModule Util
+
+// Destination with 1 working IAP
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN Disconnect
+waittestclass VCXCONN
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+pause 3000
+Util WaitForConnectionActivity AP1
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31112 2nd IAP priority changes during connection
+create VCXTestUtilModule Util
+
+// Destination with 1 working IAP
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+pause 1000
+Util SetMethodPriority DEST_TEST AP2 0
+
+pause 5000
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+pause 5000
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31113 IAP priority changes during connection
+create VCXTestUtilModule Util
+
+// Destination with 1 working IAP
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+pause 1000
+Util SetMethodPriority DEST_TEST AP1 1
+
+pause 5000
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+pause 5000
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31114 2nd IAP removed during connection
+create VCXTestUtilModule Util
+
+// Destination with 1 working IAP
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+Util DeleteMethod DEST_TEST AP2
+
+pause 5000
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31115 Another app connected to the dest, connect 1
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+Util Connect AP1
+waittestclass Util
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util Disconnect
+pause 3000
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31116 Another app connected to the dest, connect 2
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+Util Connect 3G_AP
+waittestclass Util
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util Disconnect
+pause 3000
+
+Util WaitForConnectionActivity 3G_AP
+waittestclass Util
+
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31117 Another app connected to 2nd dest, connect
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+Util Connect 3G_AP
+waittestclass Util
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+VCXCONN PrintConnUtilDetails
+
+Util Disconnect
+pause 3000
+
+Util WaitForConnectionActivity 3G_AP
+waittestclass Util
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31118 Connect, another app connects, disconnect
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+Util Connect AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+VCXCONN PrintConnUtilDetails
+
+pause 4000
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31120 Connect 2nd dest when connected to 1st already
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+VCXCONN GetIap "Internet"
+waittestclass VCXCONN
+
+pause 2000
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31121 Connect 2nd dest, disconnect, connect to 1st
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST2
+pause 1000
+Util CreateDestination DEST_TEST2
+Util DeleteDestinationAfterwards DEST_TEST2
+Util CopyMethod 3G_AP AP3 DEST_TEST2
+Util SetMethodPriority DEST_TEST2 AP3 0
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxNotConnected
+
+VCXCONN GetIap DEST_TEST2
+waittestclass VCXCONN
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+Util WaitForConnectionActivity AP3
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31122 Connect, disconnect, change IAP prio, repeat
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+Util WaitUntilConnectionIsClosed AP2
+waittestclass Util
+
+Util SetMethodPriority DEST_TEST AP2 0
+Util SetMethodPriority DEST_TEST AP1 1
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP2
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+Util WaitUntilConnectionIsClosed AP2
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31123 Connect, terminate connection 2nd app, connect
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+Util Attach AP1
+Util Terminate
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+pause 5000
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+pause 5000
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31124 Connect, terminate connection 2nd app, disconnect
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+pause 2000
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+pause 500
+
+Util Attach AP1
+pause 500
+Util Terminate
+pause 500
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+pause 500
+VCXCONN Disconnect
+waittestclass VCXCONN
+pause 500
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxNotConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31125 Connect, delete instance
+create VCXTestUtilModule Util
+
+// Destination with 1 working IAP
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+delete Util
+[Endtest]
+
+[Test]
+title ET31131 WapIdFromIapIdL
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+
+VCXCONN WapIdFromIapId AP2
+waittestclass VCXCONN
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+[Test]
+title ET31132 WapIdFromIapIdL invalid IAP ID
+create VCXTestUtilModule Util
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+
+VCXCONN WapIdFromIapId "invalidiap"
+allownextresult KERRNOTFOUND
+waittestclass VCXCONN
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/conf/VCXConnUtilTestMasterAndSlave.cfg Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,504 @@
+#***********************************************************************************
+#
+# STIF test script file for testing vcxconnectionutility.dll.
+#
+#***********************************************************************************
+
+[StifSettings]
+CapsModifier= IptvTestClientApiCapsMod.exe
+[EndStifSettings]
+
+[Define]
+INCLUDE c:\testframework\VCXConnUtilTest.inc
+INCLUDE c:\testframework\VCXDrives.inc
+INCLUDE c:\testframework\VCXConsts.inc
+INCLUDE c:\testframework\VCXErrors.inc
+[Enddefine]
+
+// NotAllowedProperty etc queued
+
+
+#************************************************************************************
+
+#------------------------------------------------------------------------------------
+#
+# Setup the environment.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31000 <not a test> Setup and cleanup
+create VCXTestUtilModule Util
+
+Util CopyMethod "Internet" "Internet" "Internet"
+// Disable connection dialog for "Internet" destination.
+Util SetConnectionMethodIntAttribute "Internet" "Internet" ECmSeamlessnessLevel 2
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST2
+
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31001 Master only
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+create VCXConnUtilTest CONNPS
+CONNPS Create "PS" KVcxConnUtilTestModeSubscriber
+
+create VCXConnUtilTest MASTER
+MASTER Create "MASTER" KVcxConnUtilTestModeConnectivity
+MASTER GetIap DEST_TEST
+waittestclass MASTER
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+CONNPS CheckProperty EVCxPSConnectionStatus EVCxConnected
+CONNPS CheckProperty EVCxPSMasterExists 1
+CONNPS CheckProperty EVCxPSNbrConnInstances 1
+
+MASTER Disconnect
+waittestclass MASTER
+
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+delete MASTER
+
+CONNPS PrintConnUtilDetails
+CONNPS CheckProperty EVCxPSNbrConnInstances 0
+
+delete CONNPS
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31002 Master and slave - no disconnect
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+create VCXConnUtilTest CONNPS
+CONNPS Create "PS" KVcxConnUtilTestModeSubscriber
+
+create VCXConnUtilTest MASTER
+MASTER Create "MASTER" KVcxConnUtilTestModeConnectivity
+MASTER GetIap DEST_TEST
+waittestclass MASTER
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+CONNPS CheckProperty EVCxPSConnectionStatus EVCxConnected
+CONNPS CheckProperty EVCxPSMasterExists 1
+CONNPS CheckProperty EVCxPSNbrConnInstances 1
+
+create VCXConnUtilTest SLAVE
+SLAVE Create "SLAVE" KVcxConnUtilTestModeConnectivity
+SLAVE GetIap DEST_TEST
+waittestclass SLAVE
+pause 2000
+CONNPS CheckProperty EVCxPSNbrConnInstances 2
+CONNPS CheckProperty EVCxPSMasterExists 1
+
+delete SLAVE
+
+delete MASTER
+
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+CONNPS PrintConnUtilDetails
+CONNPS CheckProperty EVCxPSNbrConnInstances 0
+
+delete CONNPS
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31003 Master and two slaves - no disconnect
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+create VCXConnUtilTest CONNPS
+CONNPS Create "PS" KVcxConnUtilTestModeSubscriber
+
+create VCXConnUtilTest MASTER
+MASTER Create "MASTER" KVcxConnUtilTestModeConnectivity
+MASTER GetIap DEST_TEST
+waittestclass MASTER
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+CONNPS CheckProperty EVCxPSConnectionStatus EVCxConnected
+CONNPS CheckProperty EVCxPSMasterExists 1
+CONNPS CheckProperty EVCxPSNbrConnInstances 1
+
+create VCXConnUtilTest SLAVE
+SLAVE Create "SLAVE" KVcxConnUtilTestModeConnectivity
+SLAVE GetIap DEST_TEST
+waittestclass SLAVE
+
+create VCXConnUtilTest SLAVE2
+SLAVE2 Create "SLAVE2" KVcxConnUtilTestModeConnectivity
+SLAVE2 GetIap DEST_TEST
+waittestclass SLAVE2
+pause 4000
+CONNPS CheckProperty EVCxPSNbrConnInstances 3
+CONNPS CheckProperty EVCxPSMasterExists 1
+
+delete SLAVE2
+
+pause 2000
+CONNPS CheckProperty EVCxPSNbrConnInstances 2
+delete SLAVE
+
+pause 2000
+CONNPS CheckProperty EVCxPSNbrConnInstances 1
+
+delete MASTER
+pause 2000
+
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+CONNPS PrintConnUtilDetails
+CONNPS CheckProperty EVCxPSNbrConnInstances 0
+
+delete CONNPS
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31004 Slave disconnect before master
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+create VCXConnUtilTest CONNPS
+CONNPS Create "PS" KVcxConnUtilTestModeSubscriber
+
+create VCXConnUtilTest MASTER
+MASTER Create "MASTER" KVcxConnUtilTestModeConnectivity
+MASTER GetIap DEST_TEST
+waittestclass MASTER
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+CONNPS CheckProperty EVCxPSConnectionStatus EVCxConnected
+CONNPS CheckProperty EVCxPSMasterExists 1
+CONNPS CheckProperty EVCxPSNbrConnInstances 1
+
+create VCXConnUtilTest SLAVE
+SLAVE Create "SLAVE" KVcxConnUtilTestModeConnectivity
+SLAVE GetIap DEST_TEST
+waittestclass SLAVE
+SLAVE Disconnect
+waittestclass SLAVE
+pause 2000
+
+CONNPS CheckProperty EVCxPSConnectionStatus EVCxConnected
+CONNPS CheckProperty EVCxPSNbrConnInstances 1
+CONNPS CheckProperty EVCxPSMasterExists 1
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+MASTER Disconnect
+waittestclass MASTER
+
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+CONNPS CheckProperty EVCxPSConnectionStatus EVCxNotConnected
+CONNPS CheckProperty EVCxPSNbrConnInstances 0
+CONNPS CheckProperty EVCxPSMasterExists 0
+
+delete SLAVE
+delete MASTER
+
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+CONNPS PrintConnUtilDetails
+CONNPS CheckProperty EVCxPSNbrConnInstances 0
+
+delete CONNPS
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31005 Master disconnect before slave
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+// Create and connect master and slave
+
+create VCXConnUtilTest CONNPS
+CONNPS Create "PS" KVcxConnUtilTestModeSubscriber
+
+create VCXConnUtilTest MASTER
+MASTER Create "MASTER" KVcxConnUtilTestModeConnectivity
+MASTER GetIap DEST_TEST
+waittestclass MASTER
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+CONNPS CheckProperty EVCxPSConnectionStatus EVCxConnected
+CONNPS CheckProperty EVCxPSMasterExists 1
+CONNPS CheckProperty EVCxPSNbrConnInstances 1
+
+create VCXConnUtilTest SLAVE
+SLAVE Create "SLAVE" KVcxConnUtilTestModeConnectivity
+SLAVE GetIap DEST_TEST
+waittestclass SLAVE
+
+MASTER Disconnect
+waittestclass MASTER
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+CONNPS CheckProperty EVCxPSConnectionStatus EVCxConnected
+CONNPS CheckProperty EVCxPSNbrConnInstances 1
+CONNPS CheckProperty EVCxPSMasterExists 1
+
+SLAVE Disconnect
+waittestclass SLAVE
+pause 2000
+
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+CONNPS CheckProperty EVCxPSConnectionStatus EVCxNotConnected
+CONNPS CheckProperty EVCxPSNbrConnInstances 0
+CONNPS CheckProperty EVCxPSMasterExists 0
+
+delete SLAVE
+
+delete MASTER
+
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+CONNPS PrintConnUtilDetails
+CONNPS CheckProperty EVCxPSNbrConnInstances 0
+
+delete CONNPS
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31006 Master and slave disconnect and connect again
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+// Create and connect master and slave
+
+create VCXConnUtilTest CONNPS
+CONNPS Create "PS" KVcxConnUtilTestModeSubscriber
+
+create VCXConnUtilTest MASTER
+MASTER Create "MASTER" KVcxConnUtilTestModeConnectivity
+MASTER GetIap DEST_TEST
+waittestclass MASTER
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+CONNPS CheckProperty EVCxPSConnectionStatus EVCxConnected
+CONNPS CheckProperty EVCxPSMasterExists 1
+CONNPS CheckProperty EVCxPSNbrConnInstances 1
+
+create VCXConnUtilTest SLAVE
+SLAVE Create "SLAVE" KVcxConnUtilTestModeConnectivity
+SLAVE GetIap DEST_TEST
+waittestclass SLAVE
+
+// Disconnect both
+MASTER Disconnect
+waittestclass MASTER
+pause 2000
+Util WaitForConnectionActivity AP1
+waittestclass Util
+CONNPS CheckProperty EVCxPSConnectionStatus EVCxConnected
+CONNPS CheckProperty EVCxPSNbrConnInstances 1
+CONNPS CheckProperty EVCxPSMasterExists 1
+
+SLAVE Disconnect
+waittestclass SLAVE
+pause 2000
+
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+CONNPS CheckProperty EVCxPSConnectionStatus EVCxNotConnected
+CONNPS CheckProperty EVCxPSNbrConnInstances 0
+CONNPS CheckProperty EVCxPSMasterExists 0
+
+// Connect again
+
+SLAVE GetIap DEST_TEST
+waittestclass SLAVE
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+CONNPS CheckProperty EVCxPSConnectionStatus EVCxConnected
+CONNPS CheckProperty EVCxPSMasterExists 1
+CONNPS CheckProperty EVCxPSNbrConnInstances 1
+
+MASTER GetIap DEST_TEST
+waittestclass MASTER
+CONNPS CheckProperty EVCxPSConnectionStatus EVCxConnected
+CONNPS CheckProperty EVCxPSMasterExists 1
+CONNPS CheckProperty EVCxPSNbrConnInstances 2
+
+delete SLAVE
+delete MASTER
+
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+CONNPS PrintConnUtilDetails
+CONNPS CheckProperty EVCxPSNbrConnInstances 0
+
+delete CONNPS
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31007 No master, two instances connect same time.
+timeout 120000 // 2 minutes
+
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+create VCXConnUtilTest CONNPS
+CONNPS Create "PS" KVcxConnUtilTestModeSubscriber
+
+create VCXConnUtilTest MASTER
+MASTER Create "MASTER" KVcxConnUtilTestModeConnectivity
+
+create VCXConnUtilTest SLAVE
+SLAVE Create "SLAVE" KVcxConnUtilTestModeConnectivity
+
+// These two GetIap calls are timed to be executed at the same time
+MASTER GetIap DEST_TEST 1
+SLAVE GetIap DEST_TEST 1
+
+waittestclass SLAVE
+waittestclass MASTER
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+CONNPS CheckProperty EVCxPSConnectionStatus EVCxConnected
+CONNPS CheckProperty EVCxPSMasterExists 1
+CONNPS CheckProperty EVCxPSNbrConnInstances 2
+
+delete MASTER
+
+delete SLAVE
+
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+CONNPS PrintConnUtilDetails
+CONNPS CheckProperty EVCxPSNbrConnInstances 0
+
+delete CONNPS
+pause 3000
+delete Util
+[Endtest]
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/conf/VCXConnUtilTestSNAP.cfg Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,1517 @@
+#***********************************************************************************
+#
+# STIF test script file for testing vcxconnectionutility.dll.
+#
+#***********************************************************************************
+
+[StifSettings]
+CapsModifier= IptvTestClientApiCapsMod.exe
+[EndStifSettings]
+
+[Define]
+INCLUDE c:\testframework\VCXConnUtilTest.inc
+INCLUDE c:\testframework\VCXDrives.inc
+INCLUDE c:\testframework\VCXConsts.inc
+INCLUDE c:\testframework\VCXErrors.inc
+[Enddefine]
+
+#------------------------------------------------------------------------------------
+#
+# Setup the environment.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31100 <not a test> Setup and cleanup
+create VCXTestUtilModule Util
+
+Util CopyMethod "Internet" "Internet" "Internet"
+// Disable connection dialog for "Internet" destination.
+Util SetConnectionMethodIntAttribute "Internet" "Internet" ECmSeamlessnessLevel 2
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST2
+
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31126 Create and destroy
+create VCXTestUtilModule Util
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+
+VCXCONN Create "MASTERPS"
+
+print created
+pause 3000
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxNotConnected
+print pausing
+pause 3000
+print OK!
+
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31101 Connect to destination with 1 IAP
+create VCXTestUtilModule Util
+
+// Destination with 1 working IAP
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31102 Connect to destination with 2 IAPs
+create VCXTestUtilModule Util
+
+// Destination with 2 working IAPs
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP2 0
+Util SetMethodPriority DEST_TEST AP1 1´
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP2
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31103 Connect to destination with 10 IAPs
+create VCXTestUtilModule Util
+
+// Destination with 10 working IAPs
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util CopyMethod 3G_AP AP3 DEST_TEST
+Util CopyMethod 3G_AP AP4 DEST_TEST
+Util CopyMethod 3G_AP AP5 DEST_TEST
+Util CopyMethod 3G_AP AP6 DEST_TEST
+Util CopyMethod 3G_AP AP7 DEST_TEST
+Util CopyMethod 3G_AP AP8 DEST_TEST
+Util CopyMethod 3G_AP AP9 DEST_TEST
+Util CopyMethod 3G_AP AP10 DEST_TEST
+
+Util SetMethodPriority DEST_TEST AP5 0
+Util SetMethodPriority DEST_TEST AP1 1
+Util SetMethodPriority DEST_TEST AP2 2
+Util SetMethodPriority DEST_TEST AP3 3
+Util SetMethodPriority DEST_TEST AP4 4
+Util SetMethodPriority DEST_TEST AP6 5
+Util SetMethodPriority DEST_TEST AP7 6
+Util SetMethodPriority DEST_TEST AP8 7
+Util SetMethodPriority DEST_TEST AP9 8
+Util SetMethodPriority DEST_TEST AP10 9
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP5
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+# Note: Disabled, shows IAP query notification.
+#
+#------------------------------------------------------------------------------------
+//[Test]
+//title ET31104 Connect to destination with no IAP
+//create VCXTestUtilModule Util
+
+// Destination with no IAPs
+//allowerrorcodes KERRNOTFOUND
+//Util DeleteDestination DEST_TEST
+//pause 1000
+//Util CreateDestination DEST_TEST
+//Util DeleteDestinationAfterwards DEST_TEST
+
+//create VCXConnUtilTest VCXCONN
+//VCXCONN PrepareCase
+//VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+//allownextresult KERRGENERAL
+//VCXCONN GetIap DEST_TEST
+//VCXCONN PrintConnUtilDetails
+//VCXCONN CheckProperty EVCxPSConnectionStatus EVCxNotConnected
+
+//print OK!
+//VCXCONN ShutdownTester
+//delete VCXCONN
+//pause 3000
+//delete Util
+//[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+# Note: Disabled, shows IAP query notification.
+#
+#------------------------------------------------------------------------------------
+#[Test]
+#title ET31106 Connect to destination with working and bad IAPs
+#//create VCXTestUtilModule Util
+
+#// Destination with good and bad IAP
+#allowerrorcodes KERRNOTFOUND
+#Util DeleteDestination DEST_TEST
+#pause 1000
+#Util CreateDestination DEST_TEST
+#Util DeleteDestinationAfterwards DEST_TEST
+#Util CopyMethod 3G_AP AP1 DEST_TEST
+#Util CopyMethod BAD_AP AP2 DEST_TEST
+#Util SetMethodPriority DEST_TEST AP1 0
+#Util SetMethodPriority DEST_TEST AP2 1
+
+#create VCXConnUtilTest VCXCONN
+#VCXCONN PrepareCase
+#VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+#VCXCONN GetIap DEST_TEST
+#waittestclass VCXCONN
+
+#Util WaitForConnectionActivity AP1
+#waittestclass Util
+#VCXCONN PrintConnUtilDetails
+#VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+#
+#print OK!
+#VCXCONN ShutdownTester
+#delete VCXCONN
+#pause 3000
+#delete Util
+#[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31107 Connect to destination with bad and working IAPs
+create VCXTestUtilModule Util
+
+// Destination with bad and good IAP
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod BAD_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+
+VCXCONN GetIap DEST_TEST
+allowerrorcodes KERRGENERAL
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP2
+allowerrorcodes KERRTIMEDOUT
+waittestclass Util
+
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31108 Connect, disconnect
+create VCXTestUtilModule Util
+
+// Destination with 1 working IAP
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxNotConnected
+pause 3000
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31109 Connect, disconnect, connect
+create VCXTestUtilModule Util
+
+// Destination with 1 working IAP
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+pause 3000
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxNotConnected
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+Util WaitForConnectionActivity AP1
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31110 Connect, disconnect, disconnect
+create VCXTestUtilModule Util
+
+// Destination with 1 working IAP
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31111 Disconnect without connection, then connect
+create VCXTestUtilModule Util
+
+// Destination with 1 working IAP
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN Disconnect
+waittestclass VCXCONN
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+pause 3000
+Util WaitForConnectionActivity AP1
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31112 2nd IAP priority changes during connection
+create VCXTestUtilModule Util
+
+// Destination with 1 working IAP
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+pause 1000
+Util SetMethodPriority DEST_TEST AP2 0
+
+pause 5000
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+pause 5000
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31113 IAP priority changes during connection
+create VCXTestUtilModule Util
+
+// Destination with 1 working IAP
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+pause 1000
+Util SetMethodPriority DEST_TEST AP1 1
+
+pause 5000
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+pause 5000
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31114 2nd IAP removed during connection
+create VCXTestUtilModule Util
+
+// Destination with 1 working IAP
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+Util DeleteMethod DEST_TEST AP2
+
+pause 5000
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31115 Another app connected to the dest, connect 1
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+Util Connect AP1
+waittestclass Util
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util Disconnect
+pause 3000
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31116 Another app connected to the dest, connect 2
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+Util Connect 3G_AP
+waittestclass Util
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util Disconnect
+pause 3000
+
+Util WaitForConnectionActivity 3G_AP
+waittestclass Util
+
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31117 Another app connected to 2nd dest, connect
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+Util Connect 3G_AP
+waittestclass Util
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+VCXCONN PrintConnUtilDetails
+
+Util Disconnect
+pause 3000
+
+Util WaitForConnectionActivity 3G_AP
+waittestclass Util
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31118 Connect, another app connects, disconnect
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+Util Connect AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+VCXCONN PrintConnUtilDetails
+
+pause 4000
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31120 Connect 2nd dest when connected to 1st already
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+VCXCONN GetIap "Internet"
+waittestclass VCXCONN
+
+pause 2000
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31121 Connect 2nd dest, disconnect, connect to 1st
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST2
+pause 1000
+Util CreateDestination DEST_TEST2
+Util DeleteDestinationAfterwards DEST_TEST2
+Util CopyMethod 3G_AP AP3 DEST_TEST2
+Util SetMethodPriority DEST_TEST2 AP3 0
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxNotConnected
+VCXCONN GetIap DEST_TEST2
+waittestclass VCXCONN
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31122 Connect, disconnect, change IAP prio, repeat
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+Util WaitUntilConnectionIsClosed AP2
+waittestclass Util
+
+Util SetMethodPriority DEST_TEST AP2 0
+Util SetMethodPriority DEST_TEST AP1 1
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP2
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+Util WaitUntilConnectionIsClosed AP2
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31123 Connect, terminate connection 2nd app, connect
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+Util Attach AP1
+Util Terminate
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+pause 5000
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+pause 5000
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31124 Connect, terminate connection 2nd app, disconnect
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+pause 2000
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+pause 500
+
+Util Attach AP1
+pause 500
+Util Terminate
+pause 500
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+pause 500
+VCXCONN Disconnect
+waittestclass VCXCONN
+pause 500
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxNotConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31125 Connect, delete instance
+create VCXTestUtilModule Util
+
+// Destination with 1 working IAP
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31127 Roaming - Connect 3G, WLAN becomes available
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+
+VCXCONN AddWaitedProperty EVCxPSConnectionStatus EVCxConnected
+VCXCONN AddWaitedProperty EVCxPSConnectionStatus EVCxRoamingRequest
+VCXCONN AddWaitedProperty EVCxPSNbRoamAccepted 1
+VCXCONN AddWaitedProperty EVCxPSConnectionStatus EVCxConnected
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP2
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+Util CopyMethod WLAN_AP AP3 DEST_TEST
+Util SetMethodPriority DEST_TEST AP3 0
+
+VCXCONN WaitForPropertyQueue
+waittestclass VCXCONN
+
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+Util WaitForConnectionActivity AP3
+waittestclass Util
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31128 Roaming - Connect WLAN, 3G becomes available
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod WLAN_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP2
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+Util CopyMethod 3G_AP AP3 DEST_TEST
+Util SetMethodPriority DEST_TEST AP3 0
+
+pause 5000
+
+Util WaitForConnectionActivity AP2
+waittestclass Util
+
+Util WaitUntilConnectionIsClosed AP3
+waittestclass Util
+
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31129 Roaming - Connect WLAN, another WLAN becomes available
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod WLAN_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP2
+waittestclass Util
+
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+Util CopyMethod WLAN_AP2 AP3 DEST_TEST
+Util SetMethodPriority DEST_TEST AP3 0
+
+pause 5000
+
+Util WaitForConnectionActivity AP2
+waittestclass Util
+
+Util WaitUntilConnectionIsClosed AP3
+waittestclass Util
+
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+VCXCONN AddWaitedProperty EVCxPSConnectionStatus EVCxNotConnected
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+
+VCXCONN WaitForPropertyQueue
+waittestclass VCXCONN
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31130 Roaming not allowed - Connect 3G, WLAN becomes available
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+
+VCXCONN AddWaitedProperty EVCxPSConnectionStatus EVCxConnected
+//VCXCONN AddWaitedProperty EVCxPSConnectionStatus EVCxRoamingRequest
+VCXCONN AddWaitedProperty EVCxPSNbRoamAccepted 0
+VCXCONN AddWaitedProperty EVCxPSConnectionStatus EVCxConnected
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+VCXCONN SetRoamingAllowed 0
+
+Util WaitForConnectionActivity AP2
+waittestclass Util
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+Util CopyMethod WLAN_AP AP3 DEST_TEST
+Util SetMethodPriority DEST_TEST AP3 0
+
+VCXCONN WaitForPropertyQueue
+waittestclass VCXCONN
+
+Util WaitForConnectionActivity AP2
+waittestclass Util
+
+Util WaitUntilConnectionIsClosed AP3
+waittestclass Util
+
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31131 WapIdFromIapIdL
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+
+VCXCONN WapIdFromIapId AP2
+waittestclass VCXCONN
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31132 WapIdFromIapIdL invalid IAP ID
+create VCXTestUtilModule Util
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+
+VCXCONN WapIdFromIapId "invalidiap"
+allownextresult KERRNOTFOUND
+waittestclass VCXCONN
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31133 Connect, default SNAP changes, connect again
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST2
+pause 1000
+
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+
+Util CreateDestination DEST_TEST2
+Util DeleteDestinationAfterwards DEST_TEST2
+Util CopyMethod 3G_AP AP2 DEST_TEST2
+Util SetMethodPriority DEST_TEST2 AP2 0
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+// wait for connection
+Util WaitForConnectionActivity AP1
+print Wait for ap1
+waittestclass Util
+
+// disconnect, wait for disconnect
+print Disconnect ap1
+VCXCONN Disconnect
+waittestclass VCXCONN
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+// set DEST_TEST2 as default
+print default dest_test2
+Util SetUsedDestination DEST_TEST2
+
+// attempt to connect to DEST_TEST
+print connect dest_test
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+
+// wait for connection on AP2
+print Wait for ap2
+Util WaitForConnectionActivity AP2
+waittestclass Util
+
+print Disconnect AP2
+VCXCONN Disconnect
+waittestclass VCXCONN
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtility class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31134 Default SNAP has no IAPs, connect
+create VCXTestUtilModule Util
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST2
+pause 1000
+
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+
+Util CreateDestination DEST_TEST2
+Util DeleteDestinationAfterwards DEST_TEST2
+Util CopyMethod 3G_AP AP2 DEST_TEST2
+Util SetMethodPriority DEST_TEST2 AP2 0
+
+create VCXConnUtilTest VCXCONN
+VCXCONN PrepareCase
+VCXCONN Create "MASTERPS" KVcxConnUtilTestModeBoth
+
+print connect default
+VCXCONN GetIap DEST_TEST
+allownextresult KERRGENERAL
+waittestclass VCXCONN
+
+print connect dest_test2
+VCXCONN GetIap DEST_TEST2
+allownextresult KERRGENERAL
+waittestclass VCXCONN
+
+VCXCONN PrintConnUtilDetails
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxNotConnected
+
+print OK!
+VCXCONN ShutdownTester
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/conf/VCXConnUtilTestStates.cfg Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,238 @@
+#***********************************************************************************
+#
+# STIF test script file for testing vcxconnectionutility.dll.
+#
+#***********************************************************************************
+
+[StifSettings]
+CapsModifier= IptvTestClientApiCapsMod.exe
+[EndStifSettings]
+
+[Define]
+INCLUDE c:\testframework\VCXConnUtilTest.inc
+INCLUDE c:\testframework\VCXDrives.inc
+INCLUDE c:\testframework\VCXConsts.inc
+INCLUDE c:\testframework\VCXErrors.inc
+[Enddefine]
+
+#------------------------------------------------------------------------------------
+#
+# Setup the environment.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31180 <not a test> Setup and cleanup
+create VCXTestUtilModule Util
+
+Util CopyMethod "Internet" "Internet" "Internet"
+// Disable connection dialog for "Internet" destination.
+Util SetConnectionMethodIntAttribute "Internet" "Internet" ECmSeamlessnessLevel 2
+
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST2
+
+delete VCXCONN
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtilEngine class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31181 Initial state
+create VCXTestUtilModule Util
+
+create VCXConnUtilTest VCXCONN
+VCXCONN Create
+
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxNotConnected
+
+print OK!
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtilEngine class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31182 Connect, state
+create VCXTestUtilModule Util
+
+// Destination with 2 working IAPs
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN Create
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+Util WaitForConnectionActivity AP1
+waittestclass Util
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+print OK!
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtilEngine class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31183 Connect, disconnect, state
+create VCXTestUtilModule Util
+
+// Destination with 2 working IAPs
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN Create
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxNotConnected
+Util WaitUntilConnectionIsClosed AP1
+
+print OK!
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtilEngine class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31184 Disconnect wo connection, state
+create VCXTestUtilModule Util
+
+create VCXConnUtilTest VCXCONN
+VCXCONN Create
+
+VCXCONN Disconnect
+waittestclass VCXCONN
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxNotConnected
+
+print OK!
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtilEngine class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31186 Connection terminated by another app, state
+create VCXTestUtilModule Util
+
+// Destination with 2 working IAPs
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN Create
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+Util Attach AP1
+Util Terminate AP1
+Util WaitUntilConnectionIsClosed AP1
+waittestclass Util
+
+pause 5000
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxNotConnected
+
+print OK!
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
+
+#------------------------------------------------------------------------------------
+#
+# Test CVcxConnUtilEngine class.
+#
+#------------------------------------------------------------------------------------
+[Test]
+title ET31187 Connect, connect again, state
+create VCXTestUtilModule Util
+
+// Destination with 2 working IAPs
+allowerrorcodes KERRNOTFOUND
+Util DeleteDestination DEST_TEST
+pause 1000
+Util CreateDestination DEST_TEST
+Util SetUsedDestination DEST_TEST
+Util DeleteDestinationAfterwards DEST_TEST
+Util CopyMethod 3G_AP AP1 DEST_TEST
+Util CopyMethod 3G_AP AP2 DEST_TEST
+Util SetMethodPriority DEST_TEST AP1 0
+Util SetMethodPriority DEST_TEST AP2 1
+
+create VCXConnUtilTest VCXCONN
+VCXCONN Create
+VCXCONN GetIap DEST_TEST
+waittestclass VCXCONN
+Util WaitForConnectionActivity AP1
+waittestclass Util
+
+VCXCONN GetIap DEST_TEST
+
+VCXCONN CheckProperty EVCxPSConnectionStatus EVCxConnected
+
+print OK!
+delete VCXCONN
+pause 3000
+delete Util
+[Endtest]
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/conf/VCXConsts.inc Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,15 @@
+TRUE 1
+FALSE 0
+SYNC 0
+ASYNC 1
+FAKE 13579
+
+DEFAULT_DEST "Internet"
+
+3G_AP "Internet"
+3G_AP2 "Internet2"
+WLAN_AP "Wlan"
+WLAN_AP2 "Wlan2"
+EMULATOR_AP "Ethernet with Daemon Dynamic IP"
+BAD_AP "BadIap" // CIptvTestUtilities::GetIapIdL returns AP that does not work
+INVALID_AP "invalidiap" // CIptvTestUtilities::GetIapIdL returns invalid AP ID
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/conf/VCXDrives.inc Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,24 @@
+//
+// C is not used by Video Center when phone has F drive, change these accordingly.
+//
+// If phone has only C and E drives:
+// C_DRIVE e
+// E_DRIVE f
+//
+// If phone has F drive:
+// C_DRIVE e
+// E_DRIVE f
+//
+
+A_DRIVE a
+C_DRIVE e
+E_DRIVE f
+O_DRIVE o
+Z_DRIVE z
+
+ANY_DRIVE "anydrive"
+
+// Don't change these drives
+C_DRIVE_FORCED c
+E_DRIVE_FORCED e
+F_DRIVE_FORCED f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/conf/VCXErrors.inc Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,103 @@
+KIptvTestErrNotFound -1111
+KIptvTestErrVerifyFailed -1112
+
+KERRNONE 0
+KERRNOTFOUND -1
+KERRGENERAL -2
+KERRCANCEL -3
+KERRNOMEMORY -4
+KERRNOTSUPPORTED -5
+KERRARGUMENT -6
+KERRBADHANDLE -8
+KERROVERFLOW -9
+KERRUNDERFLOW -10
+KERRALREADYEXISTS -11
+KERRINUSE -14
+KERRSERVERBUSY -16
+KERRNOTREADY -18
+KERRUNKNOWN -19
+KERRCORRUPT -20
+KERRLOCKED -22
+KERRDISKFULL -26
+KERRBADNAME -28
+KERRTIMEDOUT -33
+KERRABORT -39
+KERRTOOBIG -40
+KErrCouldNotConnect -34
+
+
+// EPG manager server side error codes
+KIptvErrorGetUpdateInformationLNotFound 123
+KIptvErrorEpgUpdateFailed 133
+KIptvErrorEpgUpdateSuccessed 134
+KIptvVodUpdateNotStarted 137
+KIptvVodUpdateStarted 136
+KIptvErrorVodNoIap 139
+KIptvErrorNoService 140
+KIptvThumbnailCount 141
+KIptvContentUpdateCompleted 146
+KIptvServiceThumbnailDownloaded 143
+KIptvContentThumbnailDownloaded 144
+KIptvRssParserError 145
+
+KIptvErrorRssSearchStarted 170
+KIptvErrorRssSearchFailed 171
+KIptvErrorRssSearchSucceed 172
+KIptvErrorRssSearchNoIap 173
+
+EIptvDlNoError 0
+EIptvDlOutOfMemory 1
+EIptvDlOutOfMemoryInVodDlPluginCreate 2
+EIptvDlVodDlPluginNotFound 3
+EIptvDlGeneralErrorInVodDlPluginCreate 4
+EIptvDlMessageAlreadyPending 5
+EIptvDlTypeNotSupported 6
+EIptvDlMaxDownloadsExceeded 7
+EIptvDlAlreadyExists 8
+KIptvDlCouldNotGetServiceData 9
+EIptvDlEpgManagerNotReady 10
+EIptvDlCouldNotGetContentFullDetails 11
+EIptvDlFailedToAddNewVideoToMyVideos 12
+EIptvDlCouldNotConnectToS60DlMgr 13
+EIptvDlCouldNotSetIapAttrToS60DlMgr 14
+EIptvDlCouldNotCreateS60Download 15
+EIptvDlCouldNotStartS60Download 16
+EIptvDlConnectionFailed 17
+EIptvDlAuthFailed 18
+EIptvDlProxyAuthFailed 19
+EIptvDlContentNotFound 20
+EIptvDlDiskFull 21
+EIptvDlDestFileInUse 22
+EIptvDlBadUrl 23
+EIptvDlMmcRemoved 24
+EIptvDlGeneral 25
+EIptvDlDisconnected 26
+EIptvDlContentUnchanged 27
+
+KIptvSchemaMismatch 301
+KIptvInvalidServiceType 302
+EXmlNoElements -997
+KErrNotFound -1
+
+KErrGsmMMServiceOptionTemporaryOutOfOrder -4162
+
+// From HttpDownloadMgrCommon.h
+EGeneral -30421
+EInternal -30422
+EContentFileIntegrity -30423
+EDiskFull -30424
+EConnectionFailed -30425
+ETransactionFailed -30426
+EMoveFailed -30427
+EDestFileWriteFailed -30428
+EMMCRemoved -30429
+EBadUrl -30430
+EWrongDestFilename -30431
+EDestFileInUse -30432
+EHttpUnhandled -30433
+EHttpAuthenticationFailed -30434
+EProxyAuthenticationFailed -30435
+EObjectNotFound -30436
+EPartialContentModified -30437
+EContentExpired -30438
+EHttpRestartFailed -30450
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/conf/atsconf.txt Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,14 @@
+;Run \vado\videoplayer\tsrc\testing\tools\genATSdrop.pl from
+;the tsrc folder to create ATS3 drop.
+[DROP]
+NAME VaDo - videoutils_plat - videoconnutility_api
+DEVICE INSERT_DEVICE
+FLASH INSERT_FLASH_IMAGE
+FLASH INSERT_FLASH_IMAGE
+FLASH INSERT_FLASH_IMAGE
+;SIS \VideoApp_Domain\videoplayer\videoplayerapp\mpxvideoplayer\sis\VideoPlayer.sisx
+PKG group\videoconnutility_apitest.pkg
+INI init\TestFramework.ini 200
+EMAIL INSERT_EMAIL
+RUN
+[ENDDROP]
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/custom/postrun_custom.xml Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,64 @@
+<step name="Fetch Test module Report" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>fetch-log</command>
+ <params>
+ <param type="text"/>
+ <param delete="true"/>
+ <param path="C:\Logs\TestFramework\*"/>
+ </params>
+</step>
+<step name="Fetch Fusion logs" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>fetch-log</command>
+ <params>
+ <param type="text"/>
+ <param delete="true"/>
+ <param path="c:\logs\Fusion\*"/>
+ </params>
+</step>
+<step name="Fetch Livetv logs" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>fetch-log</command>
+ <params>
+ <param type="text"/>
+ <param delete="true"/>
+ <param path="c:\logs\Livetv\*"/>
+ </params>
+</step>
+<step name="Fetch IPTV logs" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>fetch-log</command>
+ <params>
+ <param type="text"/>
+ <param delete="true"/>
+ <param path="c:\logs\iptv\*"/>
+ </params>
+</step>
+<step name="Fetch verify files" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>fetch-log</command>
+ <params>
+ <param type="text"/>
+ <param delete="true"/>
+ <param path="c:\testing\data\verifynew\*"/>
+ </params>
+</step>
+<step name="Fetch TestScripter logs" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>fetch-log</command>
+ <params>
+ <param type="text"/>
+ <param delete="true"/>
+ <param path="C:\Logs\TestFramework\TestScripter\*"/>
+ </params>
+</step>
+<step name="Fetch Testengine logs" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>fetch-log</command>
+ <params>
+ <param type="text"/>
+ <param delete="true"/>
+ <param path="C:\Logs\TestFramework\Testengine\*"/>
+ </params>
+</step>
+<step name="Fetch Testserver logs" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>fetch-log</command>
+ <params>
+ <param type="text"/>
+ <param delete="true"/>
+ <param path="C:\Logs\TestFramework\Testserver\*"/>
+ </params>
+</step>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/custom/prerun_custom.xml Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,54 @@
+<step name="Create log directory for testmodule" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>makedir</command>
+ <params>
+ <param dir="c:\logs\testframework"/>
+ </params>
+</step>
+<step name="Create log directory for fusion" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>makedir</command>
+ <params>
+ <param dir="c:\logs\Fusion"/>
+ </params>
+</step>
+<step name="Create log directory for livetv" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>makedir</command>
+ <params>
+ <param dir="c:\logs\Livetv"/>
+ </params>
+</step>
+<step name="Create log directory for iptv" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>makedir</command>
+ <params>
+ <param dir="c:\logs\iptv"/>
+ </params>
+</step>
+<step name="Create directory for verify files" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>makedir</command>
+ <params>
+ <param dir="c:\testing\data\verifyzip"/>
+ </params>
+</step>
+<step name="Create directory for verify files" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>makedir</command>
+ <params>
+ <param dir="c:\testing\data\verifynew"/>
+ </params>
+</step>
+<step name="Create directory for TestScripter logs" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>makedir</command>
+ <params>
+ <param dir="c:\logs\testframework\TestScripter"/>
+ </params>
+</step>
+<step name="Create directory for Testengine logs" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>makedir</command>
+ <params>
+ <param dir="c:\logs\testframework\Testengine"/>
+ </params>
+</step>
+<step name="Create directory for Testserver logs" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>makedir</command>
+ <params>
+ <param dir="c:\logs\testframework\Testserver"/>
+ </params>
+</step>
Binary file videoutils_plat/videoconnutility_api/tsrc/data/cccccc00.cre has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/group/VCXConnUtilTest.mmp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,90 @@
+/*
+* Copyright (c) 2002 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:
+*
+*/
+
+
+
+#include <platform_paths.hrh>
+
+TARGET VCXConnUtilTest.dll
+TARGETTYPE dll
+UID 0x1000008D 0x101FB3E3
+
+CAPABILITY CAP_GENERAL_DLL
+/* Remove comments and replace 0x00000000 with correct vendor id */
+// VENDORID 0x00000000
+/* Remove comments and replace 0x00000000 with correct secure id */
+// SECUREID 0x00000000
+
+//TARGETPATH ?target_path
+DEFFILE VCXConnUtilTest.def
+
+SOURCEPATH ../src
+SOURCE VCXConnUtilTest.cpp
+SOURCE VCXConnUtilTestBlocks.cpp
+SOURCE VCXConnUtilTestSubscriber.cpp
+
+//RESOURCE resource_file
+//RESOURCE resource_file2
+
+USERINCLUDE ../inc
+USERINCLUDE ../../inc/ipvideo
+USERINCLUDE ../VCXTestUtilModule/inc
+USERINCLUDE ../VCXTestCommon/inc
+
+SYSTEMINCLUDE /Epoc32/include/ecom
+/// SYSTEMINCLUDE /Epoc32/include/ipvideo
+APP_LAYER_SYSTEMINCLUDE
+
+LIBRARY stiftestinterface.lib
+LIBRARY stiftestengine.lib
+LIBRARY vcxconnectionutility.lib
+
+LIBRARY cone.lib
+LIBRARY euser.lib
+LIBRARY estor.lib
+LIBRARY VCXTestCommon.lib
+LIBRARY FLOGGER.lib
+LIBRARY efsrv.lib
+LIBRARY bafl.lib
+LIBRARY edbms.lib // rdbstoredatabase
+LIBRARY centralrepository.lib
+
+LANG SC
+
+/*
+START WINS
+?wins_specific_information
+END
+
+START MARM
+?marm_specific_information
+END
+*/
+// Other possible keywords:
+
+// DOCUMENT ?file, that is not compiled, but added to MSVC project workspace (i.e. release notes)
+/*
+START BITMAP ?target
+TARGETPATH ?emulated_path_on_target_machine
+HEADER
+SOURCE ?color_depth ?source_bitmap
+END
+*/
+// DEFFILE ?filename
+// AIF ?filename
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 2002 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: ?Description*
+*/
+
+
+
+PRJ_PLATFORMS
+// specify the platforms your component needs to be built for here
+// defaults to WINS MARM so you can ignore this if you just build these
+DEFAULT
+
+PRJ_TESTEXPORTS
+../conf/VCXConnUtilTestMasterAndSlave.cfg /epoc32/winscw/c/testframework/VCXConnUtilTestMasterAndSlave.cfg
+../conf/VCXConnUtilTestSNAP.cfg /epoc32/winscw/c/testframework/VCXConnUtilTestSNAP.cfg
+../conf/VCXConnUtilTestStates.cfg /epoc32/winscw/c/testframework/VCXConnUtilTestStates.cfg
+../conf/VCXConnUtilTest.inc /epoc32/winscw/c/testframework/VCXConnUtilTest.inc
+../conf/VCXConsts.inc /epoc32/winscw/c/testframework/VCXConsts.inc
+../conf/VCXDrives.inc /epoc32/winscw/c/testframework/VCXDrives.inc
+../conf/VCXErrors.inc /epoc32/winscw/c/testframework/VCXErrors.inc
+
+PRJ_EXPORTS
+
+PRJ_TESTMMPFILES
+../VCXTestCommon/group/VCXTestCommon.mmp
+../VCXTestUtilModule/group/VCXTestUtilModule.mmp
+VCXConnUtilTest.mmp
+../VCXConnUtilTestExe/group/VCXConnUtilTestExe.mmp
+
+PRJ_MMPFILES
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/group/videoconnutility_apitest.pkg Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,72 @@
+;
+; Copyright (c) 2009 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: Package file for video connection utility API STIF tests;
+
+; Languages
+&EN
+
+; Provide value for uid
+#{"VCXConnUtilTest"},(0x00000000),1,1,0,TYPE=SA
+
+; Series60 product id for S60 3.0
+[0x101F7961], 0, 0, 0, {"Series60ProductID"}
+
+; Localised Vendor name
+%{"Nokia"}
+
+; Unique Vendor name
+:"Nokia"
+
+; Logo
+; None
+
+; Package signature - Optional
+; None
+
+; Start of Package body
+
+; Condition blocks
+; None
+
+; Options list
+; None
+
+; Install files
+"/epoc32/release/armv5/udeb/VCXConnUtilTest.dll" - "!:/Sys/Bin/VCXConnUtilTest.dll"
+"/epoc32/release/armv5/udeb/VCXConnUtilTestExe.exe" - "!:/Sys/Bin/VCXConnUtilTestExe.exe"
+"/epoc32/release/armv5/udeb/VCXTestUtilModule.dll" - "!:/Sys/Bin/VCXTestUtilModule.dll"
+"/epoc32/release/armv5/udeb/VCXTestCommon.dll" - "!:/Sys/Bin/VCXTestCommon.dll"
+"../conf/VCXConnUtilTestMasterAndSlave.cfg" - "C:/TestFramework/VCXConnUtilTestMasterAndSlave.cfg"
+"../conf/VCXConnUtilTestSNAP.cfg" - "C:/TestFramework/VCXConnUtilTestSNAP.cfg"
+"../conf/VCXConnUtilTestHelium.cfg" - "C:/TestFramework/VCXConnUtilTestHelium.cfg"
+"../conf/VCXConnUtilTestStates.cfg" - "C:/TestFramework/VCXConnUtilTestStates.cfg"
+"../conf/VCXConnUtilTest.inc" - "C:/TestFramework/VCXConnUtilTest.inc"
+"../conf/VCXConsts.inc" - "C:/TestFramework/VCXConsts.inc"
+"../conf/VCXDrives.inc" - "C:/TestFramework/VCXDrives.inc"
+"../conf/VCXErrors.inc" - "C:/TestFramework/VCXErrors.inc"
+
+; The cenrep and testframework.ini files won't install with sis, only for ATS test runs.
+"../init/TestFramework.ini" - "C:/TestFramework/TestFramework.ini"
+; If tests are run in XXXXX CATS uncomment the cenrep file installation line.
+; "../data/cccccc00.cre" - "c:\private\10202be9\persists\cccccc00.cre"
+; Embedded SIS
+; None
+
+; End of Package body
+
+; PKG dependencies
+; None
+
+; PKG capabilities
+; None
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/inc/VCXConnUtilTest.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,341 @@
+/*
+* Copyright (c) 2002 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: ?Description*
+*/
+
+
+#ifndef VCXCONNUTILTEST_H
+#define VCXCONNUTILTEST_H
+
+// INCLUDES
+#include <StifLogger.h>
+#include <TestScripterInternal.h>
+#include <StifTestModule.h>
+
+#include "MIptvTestTimerObserver.h"
+
+#include "vcxconnutilengineobserver.h"
+#include "VCXConnUtilTestPSObserver.h"
+#include "../../../../videoconnutility/inc/vcxconnectionutility.hrh"
+#include "../../../../videoconnutility/inc/vcxconnutilcommon.h"
+
+// CONSTANTS
+const TInt KVcxConnUtilTestModeSubscriber = 0;
+const TInt KVcxConnUtilTestModeConnectivity = 1;
+const TInt KVcxConnUtilTestModeBoth = 2; // Default mode, P&S is subscribed and connection creation is allowed
+
+const TInt KTimeoutTimerId = 0;
+
+// MACROS
+
+// Logging path
+_LIT( KVCXConnUtilTestLogPath, "\\logs\\testframework\\VCXConnUtilTest\\" );
+// Log file
+_LIT( KVCXConnUtilTestLogFile, "VCXConnUtilTest.txt" );
+_LIT( KVCXConnUtilTestLogFileWithTitle, "VCXConnUtilTest_[%S].txt" );
+
+// FUNCTION PROTOTYPES
+//?type ?function_name(?arg_list);
+
+// FORWARD DECLARATIONS
+//class ?FORWARD_CLASSNAME;
+class CVCXConnUtilTest;
+class CVCXTestCommon;
+class CVCXConnUtilTestSubscriber;
+class CIptvTestTimer;
+class CIptvTestActiveWait;
+
+// DATA TYPES
+//enum ?declaration
+//typedef ?declaration
+//extern ?data_type;
+
+// CLASS DECLARATION
+
+class TVcxConnTestPSProperty
+ {
+ public:
+ TVcxConnTestPSProperty( )
+ {
+ iIsInteger = EFalse;
+ }
+ TVcxConnTestPSProperty( TInt aProperty, TInt aValue )
+ {
+ iProperty = aProperty;
+ iIntegerValue = aValue;
+ iIsInteger = ETrue;
+ }
+ TVcxConnTestPSProperty( TInt aProperty, TDesC& aValue )
+ {
+ iProperty = aProperty;
+ iStringValue = aValue;
+ iIsInteger = EFalse;
+ }
+ ~TVcxConnTestPSProperty( )
+ {
+
+ }
+ public:
+ TBool iIsInteger;
+ TInt iProperty;
+ TInt iIntegerValue;
+ TBufC<256> iStringValue;
+ };
+
+/**
+* CVCXConnUtilTest test class for STIF Test Framework TestScripter.
+*/
+NONSHARABLE_CLASS(CVCXConnUtilTest) : public CScriptBase,
+ public MVCXConnUtilTestPSObserver,
+ public MIptvTestTimerObserver
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ static CVCXConnUtilTest* NewL( CTestModuleIf& aTestModuleIf );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CVCXConnUtilTest();
+
+ public: // New functions
+
+ public: // Functions from base classes
+
+ /**
+ * From CScriptBase Runs a script line.
+ * @since ?Series60_version
+ * @param aItem Script line containing method name and parameters
+ * @return Symbian OS error code
+ */
+ virtual TInt RunMethodL( CStifItemParser& aItem );
+
+ /**
+ * From MVCXConnUtilTestPSObserver, called when P&S key changes.
+ */
+ void ValueChangedL( const TUid& aUid, const TUint32& aKey, const TInt& aValue );
+
+ /**
+ * From MVCXConnUtilTestPSObserver, called when P&S key changes.
+ */
+ void ValueChangedL( const TUid& aUid, const TUint32& aKey, const TDesC& aValue );
+
+ /**
+ * From MIptvTestTimerObserver Handles timer completion
+ * @since
+ * @param aTimerId
+ * @param aError
+ */
+ void TimerComplete(TInt aTimerId, TInt aError);
+
+ private: // New functions
+
+ /**
+ * Gets name string for property.
+ */
+ void GetPropertyNameL( TInt aProperty, TDes& aPropertyName );
+
+ /**
+ * Gets connection name into a string.
+ */
+ void GetConnectionStatusL( TInt aConnectionStatus, TDes& aStatusString );
+
+ /**
+ * Checks that the tester process is still alive. Leaves if it's dead.
+ */
+ void TesterExeAliveL();
+
+ void CreateTesterProcessL();
+
+ protected: // New functions
+
+ private:
+
+ /**
+ * C++ default constructor.
+ */
+ CVCXConnUtilTest( CTestModuleIf& aTestModuleIf );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ /**
+ * Frees all resources allocated from test methods.
+ * @since ?Series60_version
+ */
+ void Delete();
+
+ /**
+ * Test methods are listed below.
+ */
+
+ /**
+ * Tries to close all tester exe's, should be called in start of each case before call
+ * to any CreateL.
+ */
+ virtual TInt PrepareCaseL( CStifItemParser& aItem );
+
+ /**
+ * Commands the tester exe to shutdown checks for any error codes for the process exit.
+ * Should be called in end of each test case before deleting test module.
+ */
+ virtual TInt ShutdownTesterL( CStifItemParser& aItem );
+
+ /**
+ * Initializes the test module.
+ * @param mode, If KVcxConnUtilTestModeNormal
+ * - Doesn't subscribe ConnUtil P&S keys.
+ * - Main use connectivity.
+ *
+ * If KVcxConnUtilTestModeSubscribe
+ * - Subscribes ConnUtil P&S keys and keeps track of the changes.
+ * - Doesn't create instance of ConnUtil, can't be used for connectivity.
+ * @param caseId.
+ */
+ virtual TInt CreateL( CStifItemParser& aItem );
+
+ /**
+ * Calls CVcxConnectionUtility::GetIap which creates connection.
+ * Can only be used when test module is created in KVcxConnUtilTestModeNormal mode.
+ */
+ virtual TInt GetIapL( CStifItemParser& aItem );
+
+ /**
+ * Calls CVcxConnectionUtility::WapIdFromIapIdL for the defined IAP.
+ * @param iapName, if IAP is not found then invalid IAP ID is used.
+ */
+ virtual TInt WapIdFromIapIdL( CStifItemParser& aItem );
+
+ /**
+ * Calls CVcxConnectionUtility::Disconnect which disconnects active connection.
+ * Can only be used when test module is created in KVcxConnUtilTestModeNormal mode.
+ */
+ virtual TInt DisconnectL( CStifItemParser& aItem );
+
+ /**
+ * Calls CVcxConnectionUtility::Disconnect which disconnects active connection.
+ * Can be used always.
+ */
+ virtual TInt CheckPropertyL( CStifItemParser& aItem );
+
+ /**
+ * Sets roaming flag which is returned to ConnUtil upon request.
+ * Can only be used when test module is created in KVcxConnUtilTestModeNormal mode.
+ */
+ virtual TInt SetRoamingAllowedL( CStifItemParser& aItem );
+
+ /**
+ * Sets flag for test module to cause User::Leave when it gets roaming request.
+ * Can only be used when test module is created in KVcxConnUtilTestModeNormal mode.
+ */
+ virtual TInt SetLeaveAtRoamingRequestL( CStifItemParser& aItem );
+
+ /**
+ * Sets delay before roaming request is answered.
+ * Can only be used when test module is created in KVcxConnUtilTestModeNormal mode.
+ */
+ virtual TInt SetDelayBeforeRoamingRequestL( CStifItemParser& aItem );
+
+ /**
+ * Gets the values for ConnUtil P&S properties and prints 'em to debug ouput.
+ * Can be used always.
+ */
+ virtual TInt PrintConnUtilDetails( CStifItemParser& aItem );
+
+ /**
+ * Adds property and value to queue of waited P&S changes.
+ * @param property
+ * @param value
+ * Can only be used when test module is created in KVcxConnUtilTestModeSubscriber mode.
+ */
+ virtual TInt AddWaitedPropertyL( CStifItemParser& aItem );
+
+ /**
+ * Adds property that is causes error signal while there's properties in queue
+ * added with AddWaitedProperty.
+ * @param property
+ * @param value
+ * Can only be used when test module is created in KVcxConnUtilTestModeSubscriber mode.
+ */
+ virtual TInt AddNotAllowedPropertyL( CStifItemParser& aItem );
+
+ /**
+ * Resets the queue of expected property changes.
+ * Can only be used when test module is created in KVcxConnUtilTestModeSubscriber mode.
+ */
+ virtual TInt ResetWaitedPropertiesL( CStifItemParser& aItem );
+
+ /**
+ * After call to this when queue for waited properties is empty the test script will be signaled.
+ * Can only be used when test module is created in KVcxConnUtilTestModeSubscriber mode.
+ */
+ virtual TInt WaitForPropertyQueueL( CStifItemParser& aItem );
+
+ private: // Data
+
+ CVCXTestCommon* iTestCommon;
+
+ // KVcxConnUtilTestModeSubscriber or KVcxConnUtilTestModeNormal
+ TInt iMode;
+
+ CVCXConnUtilTestSubscriber* iConnectionStatusSubscriber;
+ CVCXConnUtilTestSubscriber* iIapIdSubscriber;
+ CVCXConnUtilTestSubscriber* iSnapIdSubscriber;
+ CVCXConnUtilTestSubscriber* iMasterExistsSubscriber;
+ CVCXConnUtilTestSubscriber* iNbrConnInstancesSubscriber;
+ CVCXConnUtilTestSubscriber* iRoamingRequestStatusSubscriber;
+ CVCXConnUtilTestSubscriber* iNbrRoamRespSubscriber;
+ CVCXConnUtilTestSubscriber* iNbRoamAcceptedSubscriber;
+
+ // Array of P&S changes to properties of VcxConnUtil
+ RArray<TVcxConnTestPSProperty> iWaitedPSChanges;
+
+ RArray<TVcxConnTestPSProperty> iNotAllowedPSChanges;
+
+ TBool iWaitingForEmptyPropertyQueue;
+
+ // Timeout timer
+ CIptvTestTimer* iTimeoutTimer;
+
+ CIptvTestActiveWait* iWait;
+
+ // Is wait for connection request enabled.
+ TInt iWaitTimedRequest;
+
+ // This will show in function traces.
+ TBuf<256> iName;
+
+ // Testexe
+ RProcess iProcess;
+
+ TInt iPSKeyBase;
+
+ CVCXConnUtilTestSubscriber* iTesterGetAckResponseSubscriber;
+ CVCXConnUtilTestSubscriber* iTesterResponseSubscriber;
+
+ CVCXConnUtilTestSubscriber* iTesterCountSubscriber;
+
+ TBool iShutdownCalled;
+
+ TBool iTesterCountChangedAlready;
+ };
+
+#endif // VCXCONNUTILTEST_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/inc/VCXConnUtilTestCommon.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,68 @@
+/*
+* Copyright (c) 2002 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: ?Description*
+*/
+
+
+#ifndef VCXCONNUTILTESTCOMMON_H_
+#define VCXCONNUTILTESTCOMMON_H_
+
+// Category for PS keys used by tests.
+const TUid KVCXConnUtilTestPScategory = { 0x101FB3E3 };
+
+const TInt KVCXConnUtilTestExeGlobalTesterCount = 1;
+
+// Set this to 1 to inform all the tester exe's for shutdown.
+const TInt KVCXConnUtilTestExeGlobalShutdownKey = 2;
+
+/**
+ * P&S key for commands, created by tester exe which adds it's own process id to this.
+ */
+const TUint KVCXConnUtilTestExePsKeyCmd = 10; // Observed for changes by tester exe.
+
+/**
+ * Parameters for the commands, created by tester exe which adds it's own process id to these.
+ */
+const TUint KVCXConnUtilTestExePsKeyCmdIntParam1 = 11;
+const TUint KVCXConnUtilTestExePsKeyCmdIntParam2 = 12;
+const TUint KVCXConnUtilTestExePsKeyCmdDescParam1 = 13;
+
+/**
+ * P&S keys for responses, created by tester exe which adds it's own process id to these.
+ */
+// This is sent after tester exe has received the cmd.
+const TUint KVCXConnUtilTestExePsKeyResponseAck = 21;
+// Will contain command which sent the repsonse.
+const TUint KVCXConnUtilTestExePsKeyResponseCmd = 22;
+// Will contain parameter for the repsonse.
+const TUint KVCXConnUtilTestExePsKeyResponseParam = 23;
+// Symbian error code for the response.
+const TUint KVCXConnUtilTestExePsKeyResponseError = 24;
+
+/**
+ * List of commands to tester exe.
+ */
+enum TVcxConnUtilCommand
+ {
+ EVcxConnUtilCommandShutdown, // Params: none
+ EVcxConnUtilCommandSetName, // Params: desc for name
+ EVcxConnUtilCommandGetIap, // Params: int1 = silent, int2 = timed call
+ EVcxConnUtilCommandGetWapIdForIap, // Params: int1 = IAP ID
+ EVcxConnUtilCommandDisconnect, // Params: none
+ EVcxConnUtilCommandSetRoamingAllowed, // Params: int1 = the value
+ EVcxConnUtilCommandSetRoamingLeaveAtRoamingRequest, // Params: int1 = the value
+ EVcxConnUtilCommandSetDelayBeforeRoamingRequest, // Params: int1 = the value
+ };
+
+#endif /*VCXCONNUTILTESTCOMMON_H_*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/inc/VCXConnUtilTestPSObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2006 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: Class to observe P&S properties.*
+*/
+
+
+#ifndef VCXCONNUTILTESTPSOBSERVER_H
+#define VCXCONNUTILTESTPSOBSERVER_H
+
+#include <e32def.h>
+#include <e32cmn.h>
+
+class MVCXConnUtilTestPSObserver
+ {
+public:
+ virtual void ValueChangedL( const TUid& aUid, const TUint32& aKey, const TInt& aValue ) = 0;
+ virtual void ValueChangedL( const TUid& aUid, const TUint32& aKey, const TDesC& aValue ) = 0;
+ };
+
+#endif // VCXCONNUTILTESTPSOBSERVER_H
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/inc/VCXConnUtilTestSubscriber.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,173 @@
+/*
+* Copyright (c) 2006 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: Class to handle subscribtions from PS*
+*/
+
+
+#ifndef VCXCONNUTILTESTSUBSCRIBER_H
+#define VCXCONNUTILTESTSUBSCRIBER_H
+
+#include <e32base.h> // For CActive, link against: euser.lib
+#include <e32std.h> // For RTimer, link against: euser.lib
+
+#include <e32property.h>
+
+class MVCXConnUtilTestPSObserver;
+
+class CVCXConnUtilTestSubscriber : public CActive
+ {
+ public:
+
+ /**
+ * Construction.
+ *
+ * @param aUid category for the property
+ * @param aKey key id for the property
+ * @param aType type of the key (at the moment only int and text are supported)
+ * @param aObserver pointer to observer to who to notify about changes
+ *
+ * @return The newly constructed CVcxConnUtilPubSub
+ */
+ static CVCXConnUtilTestSubscriber* NewL( const TUid aUid,
+ const TUint32 aKey,
+ RProperty::TType aType,
+ MVCXConnUtilTestPSObserver* aObserver );
+
+ /**
+ * Destructor.
+ *
+ */
+ virtual ~CVCXConnUtilTestSubscriber();
+
+ /**
+ * Returns a pubsub value from this property
+ *
+ *@param &aValue value to fetch
+ *
+ *@return TInt KErrNone or some system level error code
+ */
+ TInt Get( TInt& aValue );
+
+ /**
+ * Returns a pubsub value from this property
+ *
+ *@param &aValue value tofetch
+ *
+ *@return TInt KErrNone or some system level error code
+ */
+ TInt Get( TDes& aValue );
+
+ /**
+ * Sets a pubsub value from this property
+ *
+ *@param aValue value to set
+ *
+ *@return TInt KErrNone or some system level error code
+ */
+ TInt Set( TInt& aValue );
+
+ /**
+ * Sets a pubsub value from this property
+ *
+ *@param aValue value to set
+ *
+ *@return TInt KErrNone or some system level error code
+ */
+ TInt Set( const TDesC& aValue );
+
+ /**
+ * Start subscribing if not already started
+ */
+ void Start();
+
+ /**
+ * Activate safe wait object to wait modifications
+ */
+ void WaitChangeL();
+
+ /**
+ * Explicitly ends waiting
+ */
+ void EndWait();
+
+ private: // constuct / destruct
+
+ /**
+ * Constructor
+ *
+ */
+ CVCXConnUtilTestSubscriber( const TUid aUid,
+ const TUint32 aKey,
+ RProperty::TType aType,
+ MVCXConnUtilTestPSObserver* aObserver );
+
+ /**
+ * Symbian 2nd phase construction
+ *
+ */
+ void ConstructL();
+
+ private: // from CActive
+
+ /**
+ * From CActive. Calles when value subscribed to changes
+ *
+ */
+ void RunL();
+
+ /**
+ * From CActive. Cancels subscribtion
+ *
+ */
+ void DoCancel();
+
+ private:
+
+ /**
+ * ETrue if object is initialized and subscribtion starts
+ */
+ TBool iInitialized;
+
+ /**
+ * Property to subscribe
+ */
+ RProperty iProperty;
+
+ /**
+ * Category uid for the property
+ */
+ const TUid iUid;
+
+ /**
+ * Key id for the property
+ */
+ const TUint32 iKey;
+
+ /**
+ * type of the property
+ */
+ RProperty::TType iKeyType;
+
+ /**
+ * Waiter object for data change
+ */
+ CActiveSchedulerWait* iSafeWait;
+
+ /**
+ * Observer
+ */
+ MVCXConnUtilTestPSObserver* iObserver;
+ };
+
+#endif // VCXCONNUTILTESTSUBSCRIBER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/init/All/TestFramework.ini Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,167 @@
+#
+# This is STIFTestFramework initialization file
+# Comment lines start with '#'-character.
+# See STIF TestFramework users guide.doc for instructions
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Set following test engine settings:
+# - Set Test Reporting mode. TestReportMode's possible values are:
+# + 'Summary': Summary of the tested test cases.
+# + 'Environment': Hardware and software info.
+# + 'TestCases': Test case report.
+# + 'FullReport': Set of all above ones.
+# + Example 'TestReportMode= Summary TestCases'
+#
+# - CreateTestReport setting controls report creation mode
+# + YES, Test report will created.
+# + NO, No Test report.
+#
+# - File path indicates the base path of the test report.
+# - File name indicates the name of the test report.
+#
+# - File format indicates the type of the test report.
+# + TXT, Test report file will be txt type, for example 'TestReport.txt'.
+# + HTML, Test report will be html type, for example 'TestReport.html'.
+#
+# - File output indicates output source of the test report.
+# + FILE, Test report logging to file.
+# + RDEBUG, Test report logging to using rdebug.
+#
+# - File Creation Mode indicates test report overwriting if file exist.
+# + OVERWRITE, Overwrites if the Test report file exist.
+# + APPEND, Continue logging after the old Test report information if
+# report exist.
+
+[Engine_Defaults]
+
+TestReportMode= FullReport # Possible values are:
+ # 'Summary', 'Environment', 'TestCases' or 'FullReport'
+
+CreateTestReport= YES # Possible values: YES or NO
+
+TestReportFilePath= C:\Logs\Fusion\
+TestReportFileName= TestReport
+
+TestReportFormat= TXT # Possible values: TXT or HTML
+TestReportOutput= FILE # Possible values: FILE or RDEBUG
+TestReportFileCreationMode= APPEND # Possible values: OVERWRITE or APPEND
+UITestingSupport= Yes
+SeparateProcesses= YES
+[End_Defaults]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Module configurations start
+# Modules are added between module tags
+# tags. Module name is specified after ModuleName= tag, like
+# ModuleName= XXXXXXXXX
+# Modules might have initialisation file, specified as
+# IniFile= c:\testframework\YYYYYY
+# Modules might have several configuration files, like
+# TestCaseFile= c:\testframework\NormalCases.txt
+# TestCaseFile= c:\testframework\SmokeCases.txt
+# TestCaseFile= c:\testframework\ManualCases.txt
+
+# (TestCaseFile is synonym for old term ConfigFile)
+
+# Following case specifies demo module settings. Demo module
+# does not read any settings from file, so tags
+# IniFile and TestCaseFile are not used.
+# In the simplest case it is enough to specify only the
+# name of the test module when adding new test module
+
+
+[New_Module]
+ModuleName= testscripter
+TestCaseFile= c:\testframework\VCXConnUtilTestSNAP.cfg
+TestCaseFile= c:\testframework\VCXConnUtilTestMasterAndSlave.cfg
+[End_Module]
+
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Set STIFTestFramework logging overwrite parameters for Logger.
+# Hardware and emulator environment logging path and styles can
+# be configured from here to overwrite the Logger's implemented values.
+#
+# Settings description:
+# - Indicates option for creation log directory/directories. If log directory/directories
+# is/are not created by user they will make by software.
+# + YES, Create log directory/directories if not allready exist.
+# + NO, Log directory/directories not created. Only created one is used.
+#
+# - Overwrite emulator path setting.
+# + Example: If 'EmulatorBasePath= C:\LOGS\TestFramework\' and in code is defined
+# Logger's path 'D:\\LOGS\\Module\\' with those definition the path
+# will be 'C:\LOGS\TestFramework\LOGS\Module\'
+#
+# - Overwrite emulator's logging format.
+# + TXT, Log file(s) will be txt type(s), for example 'Module.txt'.
+# + HTML, Log file(s) will be html type(s), for example 'Module.html'.
+#
+# - Overwrited emulator logging output source.
+# + FILE, Logging to file(s).
+# + RDEBUG, Logging to using rdebug(s).
+#
+# - Overwrite hardware path setting (Same description as above in emulator path).
+# - Overwrite hardware's logging format(Same description as above in emulator format).
+# - Overwrite hardware's logging output source(Same description as above in emulator output).
+#
+# - File Creation Mode indicates file overwriting if file exist.
+# + OVERWRITE, Overwrites if file(s) exist.
+# + APPEND, Continue logging after the old logging information if file(s) exist.
+#
+# - Will thread id include to the log filename.
+# + YES, Thread id to log file(s) name, Example filename 'Module_b9.txt'.
+# + NO, No thread id to log file(s), Example filename 'Module.txt'.
+#
+# - Will time stamps include the to log file.
+# + YES, Time stamp added to each line in log file(s). Time stamp is
+# for example'12.Nov.2003 115958 LOGGING INFO'
+# + NO, No time stamp(s).
+#
+# - Will line breaks include to the log file.
+# + YES, Each logging event includes line break and next log event is in own line.
+# + NO, No line break(s).
+#
+# - Will event ranking include to the log file.
+# + YES, Event ranking number added to each line in log file(s). Ranking number
+# depends on environment's tics, for example(includes time stamp also)
+# '012 12.Nov.2003 115958 LOGGING INFO'
+# + NO, No event ranking.
+#
+# - Will write log file in unicode format.
+# + YES, Log file will be written in unicode format
+# + NO, Log will be written as normal, not unicode, file.
+#
+
+[Logger_Defaults]
+
+#NOTE: If you want to set Logger using next setting(s) remove comment(s)'#'
+
+CreateLogDirectories= YES # Possible values: YES or NO
+
+#EmulatorBasePath= C:\LOGS\TestFramework\
+#EmulatorFormat= HTML # Possible values: TXT or HTML
+#EmulatorOutput= FILE # Possible values: FILE or RDEBUG
+
+#HardwareBasePath= C:\
+#HardwareFormat= TXT # Possible values: TXT or HTML
+#HardwareOutput= FILE # Possible values: FILE or RDEBUG
+
+FileCreationMode= APPEND # Possible values: OVERWRITE or APPEND
+
+#ThreadIdToLogFile= YES # Possible values: YES or NO
+#WithTimeStamp= YES # Possible values: YES or NO
+#WithLineBreak= YES # Possible values: YES or NO
+#WithEventRanking= YES # Possible values: YES or NO
+
+[End_Logger_Defaults]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+# End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/init/TestFramework.ini Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,166 @@
+#
+# This is STIFTestFramework initialization file
+# Comment lines start with '#'-character.
+# See STIF TestFramework users guide.doc for instructions
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Set following test engine settings:
+# - Set Test Reporting mode. TestReportMode's possible values are:
+# + 'Summary': Summary of the tested test cases.
+# + 'Environment': Hardware and software info.
+# + 'TestCases': Test case report.
+# + 'FullReport': Set of all above ones.
+# + Example 'TestReportMode= Summary TestCases'
+#
+# - CreateTestReport setting controls report creation mode
+# + YES, Test report will created.
+# + NO, No Test report.
+#
+# - File path indicates the base path of the test report.
+# - File name indicates the name of the test report.
+#
+# - File format indicates the type of the test report.
+# + TXT, Test report file will be txt type, for example 'TestReport.txt'.
+# + HTML, Test report will be html type, for example 'TestReport.html'.
+#
+# - File output indicates output source of the test report.
+# + FILE, Test report logging to file.
+# + RDEBUG, Test report logging to using rdebug.
+#
+# - File Creation Mode indicates test report overwriting if file exist.
+# + OVERWRITE, Overwrites if the Test report file exist.
+# + APPEND, Continue logging after the old Test report information if
+# report exist.
+
+[Engine_Defaults]
+
+TestReportMode= FullReport # Possible values are:
+ # 'Summary', 'Environment', 'TestCases' or 'FullReport'
+
+CreateTestReport= YES # Possible values: YES or NO
+
+TestReportFilePath= C:\Logs\Fusion\
+TestReportFileName= TestReport
+
+TestReportFormat= TXT # Possible values: TXT or HTML
+TestReportOutput= FILE # Possible values: FILE or RDEBUG
+TestReportFileCreationMode= APPEND # Possible values: OVERWRITE or APPEND
+UITestingSupport= Yes
+SeparateProcesses= YES
+[End_Defaults]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Module configurations start
+# Modules are added between module tags
+# tags. Module name is specified after ModuleName= tag, like
+# ModuleName= XXXXXXXXX
+# Modules might have initialisation file, specified as
+# IniFile= c:\testframework\YYYYYY
+# Modules might have several configuration files, like
+# TestCaseFile= c:\testframework\NormalCases.txt
+# TestCaseFile= c:\testframework\SmokeCases.txt
+# TestCaseFile= c:\testframework\ManualCases.txt
+
+# (TestCaseFile is synonym for old term ConfigFile)
+
+# Following case specifies demo module settings. Demo module
+# does not read any settings from file, so tags
+# IniFile and TestCaseFile are not used.
+# In the simplest case it is enough to specify only the
+# name of the test module when adding new test module
+
+[New_Module]
+ModuleName= testscripter
+TestCaseFile= c:\testframework\VCXConnUtilTestHelium.cfg
+TestCaseFile= c:\testframework\VCXConnUtilTestMasterAndSlave.cfg
+[End_Module]
+
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Set STIFTestFramework logging overwrite parameters for Logger.
+# Hardware and emulator environment logging path and styles can
+# be configured from here to overwrite the Logger's implemented values.
+#
+# Settings description:
+# - Indicates option for creation log directory/directories. If log directory/directories
+# is/are not created by user they will make by software.
+# + YES, Create log directory/directories if not allready exist.
+# + NO, Log directory/directories not created. Only created one is used.
+#
+# - Overwrite emulator path setting.
+# + Example: If 'EmulatorBasePath= C:\LOGS\TestFramework\' and in code is defined
+# Logger's path 'D:\\LOGS\\Module\\' with those definition the path
+# will be 'C:\LOGS\TestFramework\LOGS\Module\'
+#
+# - Overwrite emulator's logging format.
+# + TXT, Log file(s) will be txt type(s), for example 'Module.txt'.
+# + HTML, Log file(s) will be html type(s), for example 'Module.html'.
+#
+# - Overwrited emulator logging output source.
+# + FILE, Logging to file(s).
+# + RDEBUG, Logging to using rdebug(s).
+#
+# - Overwrite hardware path setting (Same description as above in emulator path).
+# - Overwrite hardware's logging format(Same description as above in emulator format).
+# - Overwrite hardware's logging output source(Same description as above in emulator output).
+#
+# - File Creation Mode indicates file overwriting if file exist.
+# + OVERWRITE, Overwrites if file(s) exist.
+# + APPEND, Continue logging after the old logging information if file(s) exist.
+#
+# - Will thread id include to the log filename.
+# + YES, Thread id to log file(s) name, Example filename 'Module_b9.txt'.
+# + NO, No thread id to log file(s), Example filename 'Module.txt'.
+#
+# - Will time stamps include the to log file.
+# + YES, Time stamp added to each line in log file(s). Time stamp is
+# for example'12.Nov.2003 115958 LOGGING INFO'
+# + NO, No time stamp(s).
+#
+# - Will line breaks include to the log file.
+# + YES, Each logging event includes line break and next log event is in own line.
+# + NO, No line break(s).
+#
+# - Will event ranking include to the log file.
+# + YES, Event ranking number added to each line in log file(s). Ranking number
+# depends on environment's tics, for example(includes time stamp also)
+# '012 12.Nov.2003 115958 LOGGING INFO'
+# + NO, No event ranking.
+#
+# - Will write log file in unicode format.
+# + YES, Log file will be written in unicode format
+# + NO, Log will be written as normal, not unicode, file.
+#
+
+[Logger_Defaults]
+
+#NOTE: If you want to set Logger using next setting(s) remove comment(s)'#'
+
+CreateLogDirectories= YES # Possible values: YES or NO
+
+#EmulatorBasePath= C:\LOGS\TestFramework\
+#EmulatorFormat= HTML # Possible values: TXT or HTML
+#EmulatorOutput= FILE # Possible values: FILE or RDEBUG
+
+#HardwareBasePath= C:\
+#HardwareFormat= TXT # Possible values: TXT or HTML
+#HardwareOutput= FILE # Possible values: FILE or RDEBUG
+
+FileCreationMode= APPEND # Possible values: OVERWRITE or APPEND
+
+#ThreadIdToLogFile= YES # Possible values: YES or NO
+#WithTimeStamp= YES # Possible values: YES or NO
+#WithLineBreak= YES # Possible values: YES or NO
+#WithEventRanking= YES # Possible values: YES or NO
+
+[End_Logger_Defaults]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+# End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/src/VCXConnUtilTest.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,131 @@
+/*
+* Copyright (c) 2002 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: ?Description*
+*/
+
+
+// INCLUDE FILES
+#include <Stiftestinterface.h>
+#include "VCXConnUtilTest.h"
+#include <SettingServerClient.h>
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTest::CVCXConnUtilTest
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CVCXConnUtilTest::CVCXConnUtilTest(
+ CTestModuleIf& aTestModuleIf ):
+ CScriptBase( aTestModuleIf )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTest::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTest::ConstructL()
+ {
+ //Read logger settings to check whether test case name is to be
+ //appended to log file name.
+ RSettingServer settingServer;
+ TInt ret = settingServer.Connect();
+ if(ret != KErrNone)
+ {
+ User::Leave(ret);
+ }
+ // Struct to StifLogger settigs.
+ TLoggerSettings loggerSettings;
+ // Parse StifLogger defaults from STIF initialization file.
+ ret = settingServer.GetLoggerSettings(loggerSettings);
+ if(ret != KErrNone)
+ {
+ User::Leave(ret);
+ }
+ // Close Setting server session
+ settingServer.Close();
+
+ TFileName logFileName;
+
+ if(loggerSettings.iAddTestCaseTitle)
+ {
+ TName title;
+ TestModuleIf().GetTestCaseTitleL(title);
+ logFileName.Format(KVCXConnUtilTestLogFileWithTitle, &title);
+ }
+ else
+ {
+ logFileName.Copy(KVCXConnUtilTestLogFile);
+ }
+
+ iLog = CStifLogger::NewL( KVCXConnUtilTestLogPath,
+ logFileName,
+ CStifLogger::ETxt,
+ CStifLogger::EFile,
+ EFalse );
+
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTest::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CVCXConnUtilTest* CVCXConnUtilTest::NewL(
+ CTestModuleIf& aTestModuleIf )
+ {
+ CVCXConnUtilTest* self = new (ELeave) CVCXConnUtilTest( aTestModuleIf );
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// Destructor
+CVCXConnUtilTest::~CVCXConnUtilTest()
+ {
+
+ // Delete resources allocated from test methods
+ Delete();
+
+ // Delete logger
+ delete iLog;
+
+ }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+// -----------------------------------------------------------------------------
+// LibEntryL is a polymorphic Dll entry point.
+// Returns: CScriptBase: New CScriptBase derived object
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CScriptBase* LibEntryL(
+ CTestModuleIf& aTestModuleIf ) // Backpointer to STIF Test Framework
+ {
+
+ return ( CScriptBase* ) CVCXConnUtilTest::NewL( aTestModuleIf );
+
+ }
+
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/src/VCXConnUtilTestBlocks.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,1381 @@
+/*
+* Copyright (c) 2002 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: ?Description*
+*/
+
+
+// [INCLUDE FILES] - do not remove
+#include <e32svr.h>
+#include <commdbconnpref.h>
+#include <centralrepository.h>
+#include <mmf/common/mmfcontrollerpluginresolver.h> // CleanupResetAndDestroyPushL
+
+#include <StifParser.h>
+#include <Stiftestinterface.h>
+
+#include "VCXConnUtilTest.h"
+#include "VCXConnUtilTestCommon.h"
+#include "VCXTestCommon.h"
+#include "IptvTestUtilALR.h"
+#include "VCXConnUtilTestSubscriber.h"
+#include "CIptvTestTimer.h"
+#include "CIptvTestActiveWait.h"
+#include "VCXTestTimerWait.h"
+
+#include "vcxconnectionutility.h"
+#include "VCXTestLog.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTest::Delete
+// Delete here all resources allocated and opened from test methods.
+// Called from destructor.
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTest::Delete()
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTest::Delete (%S)", &iName);
+
+ delete iTestCommon;
+ iTestCommon = NULL;
+
+ if( iConnectionStatusSubscriber )
+ {
+ iConnectionStatusSubscriber->EndWait();
+ }
+ delete iConnectionStatusSubscriber;
+ iConnectionStatusSubscriber = NULL;
+
+ if( iIapIdSubscriber )
+ {
+ iIapIdSubscriber->EndWait();
+ }
+ delete iIapIdSubscriber;
+ iIapIdSubscriber = NULL;
+
+ if( iSnapIdSubscriber )
+ {
+ iSnapIdSubscriber->EndWait();
+ }
+ delete iSnapIdSubscriber;
+ iSnapIdSubscriber = NULL;
+
+ if( iMasterExistsSubscriber )
+ {
+ iMasterExistsSubscriber->EndWait();
+ }
+ delete iMasterExistsSubscriber;
+ iMasterExistsSubscriber = NULL;
+
+ if( iNbrConnInstancesSubscriber )
+ {
+ iNbrConnInstancesSubscriber->EndWait();
+ }
+ delete iNbrConnInstancesSubscriber;
+ iNbrConnInstancesSubscriber = NULL;
+
+ if( iRoamingRequestStatusSubscriber )
+ {
+ iRoamingRequestStatusSubscriber->EndWait();
+ }
+ delete iRoamingRequestStatusSubscriber;
+ iRoamingRequestStatusSubscriber = NULL;
+
+ if( iNbrRoamRespSubscriber )
+ {
+ iNbrRoamRespSubscriber->EndWait();
+ }
+ delete iNbrRoamRespSubscriber;
+ iNbrRoamRespSubscriber = NULL;
+
+ if( iNbRoamAcceptedSubscriber )
+ {
+ iNbRoamAcceptedSubscriber->EndWait();
+ }
+ delete iNbRoamAcceptedSubscriber;
+ iNbRoamAcceptedSubscriber = NULL;
+
+ delete iTesterCountSubscriber;
+ iTesterCountSubscriber = NULL;
+
+ iWaitedPSChanges.Reset();
+ iWaitedPSChanges.Close();
+
+ iNotAllowedPSChanges.Reset();
+ iNotAllowedPSChanges.Close();
+
+ if( iTimeoutTimer )
+ {
+ iTimeoutTimer->CancelTimer();
+ delete iTimeoutTimer;
+ iTimeoutTimer = NULL;
+ }
+
+ delete iWait;
+ iWait = NULL;
+
+ if( !iShutdownCalled )
+ {
+ CStifItemParser* fakeParser = NULL;
+ ShutdownTesterL( *fakeParser );
+ }
+
+ VCXLOGLO2("<<<CVCXConnUtilTest::Delete (%S)", &iName);
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTest::RunMethodL
+// Run specified method. Contains also table of test mothods and their names.
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTest::RunMethodL(
+ CStifItemParser& aItem )
+ {
+ static TStifFunctionInfo const KFunctions[] =
+ {
+ // Copy this line for every implemented function.
+ // First string is the function name used in TestScripter script file.
+ // Second is the actual implementation member function.
+ ENTRY( "PrepareCase", CVCXConnUtilTest::PrepareCaseL ),
+ ENTRY( "ShutdownTester", CVCXConnUtilTest::ShutdownTesterL ),
+ ENTRY( "Create", CVCXConnUtilTest::CreateL ),
+ ENTRY( "GetIap", CVCXConnUtilTest::GetIapL ),
+ ENTRY( "WapIdFromIapId", CVCXConnUtilTest::WapIdFromIapIdL ),
+ ENTRY( "Disconnect", CVCXConnUtilTest::DisconnectL ),
+ ENTRY( "CheckProperty", CVCXConnUtilTest::CheckPropertyL ),
+ ENTRY( "SetRoamingAllowed", CVCXConnUtilTest::SetRoamingAllowedL ),
+ ENTRY( "SetLeaveAtRoamingRequest", CVCXConnUtilTest::SetLeaveAtRoamingRequestL ),
+ ENTRY( "SetDelayBeforeRoamingRequest", CVCXConnUtilTest::SetDelayBeforeRoamingRequestL ),
+ ENTRY( "PrintConnUtilDetails", CVCXConnUtilTest::PrintConnUtilDetails ),
+ ENTRY( "AddWaitedProperty", CVCXConnUtilTest::AddWaitedPropertyL ),
+ ENTRY( "AddNotAllowedProperty", CVCXConnUtilTest::AddNotAllowedPropertyL ),
+ ENTRY( "ResetWaitedProperties", CVCXConnUtilTest::ResetWaitedPropertiesL ),
+ ENTRY( "WaitForPropertyQueue", CVCXConnUtilTest::WaitForPropertyQueueL ),
+ };
+
+ const TInt count = sizeof( KFunctions ) /
+ sizeof( TStifFunctionInfo );
+
+ return RunInternalL( KFunctions, count, aItem );
+
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXMyVideosCollectionPluginTest::PrepareCaseL
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTest::PrepareCaseL( CStifItemParser& /* aItem */ )
+ {
+ VCXLOGLO1(">>>CVCXConnUtilTest::PrepareCaseL");
+ // Print to UI
+ _LIT( KVCXConnUtilTest, "CVCXConnUtilTest" );
+ _LIT( KWhere, "In PrepareCaseL" );
+ TestModuleIf().Printf( 0, KVCXConnUtilTest, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TInt err = CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory, KVCXConnUtilTestExeGlobalShutdownKey, 1 );
+ if( err != KErrNone )
+ {
+ VCXLOGLO2("CVCXConnUtilTest:: Could not read KVCXConnUtilTestExeGlobalShutdownKey from PS. err: %d", err);
+ }
+
+ VCXLOGLO1("<<<CVCXConnUtilTest::PrepareCaseL");
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXMyVideosCollectionPluginTest::ShutdownTesterL
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTest::ShutdownTesterL( CStifItemParser& /* aItem */ )
+ {
+ VCXLOGLO1(">>>CVCXConnUtilTest::ShutdownTesterL");
+ // Print to UI
+ _LIT( KVCXConnUtilTest, "CVCXConnUtilTest" );
+ _LIT( KWhere, "In ShutdownTesterL" );
+ TestModuleIf().Printf( 0, KVCXConnUtilTest, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ iShutdownCalled = ETrue;
+
+ // Stop listening P&S changes.
+
+ delete iTesterGetAckResponseSubscriber;
+ iTesterGetAckResponseSubscriber = NULL;
+
+ delete iTesterResponseSubscriber;
+ iTesterResponseSubscriber = NULL;
+
+ // Tell tester exe to shutdown.
+
+ VCXLOGLO1("CVCXConnUtilTest:: Setting cmd EVcxConnUtilCommandShutdown");
+
+ CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyCmd + iPSKeyBase, EVcxConnUtilCommandShutdown );
+
+ User::After( 3000000 );
+
+ // Check the shutdown.
+
+ VCXLOGLO2("CVCXConnUtilTest:: Exit type: %d", iProcess.ExitType());
+ VCXLOGLO2("CVCXConnUtilTest:: Exit reason: %d", iProcess.ExitReason());
+ TExitCategoryName exitCatName = iProcess.ExitCategory();
+ VCXLOGLO2("CVCXConnUtilTest:: Exit category: %S", &exitCatName);
+
+ TInt err = iProcess.ExitReason();
+
+ if( err == KErrNone && iProcess.ExitType() != EExitKill && exitCatName.Length() == 0 )
+ {
+ VCXLOGLO1("CVCXConnUtilTest:: ERROR: No exit error, no panic but exit type is unusual or exe is stil running.");
+ err = KErrGeneral;
+ }
+
+ VCXLOGLO1("<<<CVCXConnUtilTest::ShutdownTesterL");
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXMyVideosCollectionPluginTest::CreateL
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTest::CreateL( CStifItemParser& aItem )
+ {
+ // Print to UI
+ _LIT( KVCXConnUtilTest, "CVCXConnUtilTest" );
+ _LIT( KWhere, "In CreateL" );
+ TestModuleIf().Printf( 0, KVCXConnUtilTest, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TPtrC name;
+ if( aItem.GetNextString( name ) == KErrNone )
+ {
+ iName = name;
+ }
+ else
+ {
+ iName = _L("DEFAULT");
+ }
+
+ VCXLOGLO2(">>>CVCXConnUtilTest::CreateL (%S) ----->", &iName);
+
+ if( aItem.GetNextInt( iMode ) != KErrNone )
+ {
+ iMode = KVcxConnUtilTestModeBoth;
+ }
+
+ iTestCommon = CVCXTestCommon::NewL();
+ iWait = CIptvTestActiveWait::NewL();
+ iTimeoutTimer = CIptvTestTimer::NewL( *this, KTimeoutTimerId );
+ iPSKeyBase = 0;
+
+ if( iMode == KVcxConnUtilTestModeBoth || iMode == KVcxConnUtilTestModeConnectivity )
+ {
+ CreateTesterProcessL();
+
+ User::LeaveIfError( CVCXTestCommon::GetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExeGlobalTesterCount, iPSKeyBase ) );
+
+ iPSKeyBase = iPSKeyBase * 1000 + iProcess.Id();
+ VCXLOGLO2("CVCXConnUtilTest:: iPSKeyBase: %d", iPSKeyBase);
+
+ CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyCmd + iPSKeyBase, EVcxConnUtilCommandSetName );
+
+ CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyCmdDescParam1 + iPSKeyBase, iName );
+
+ // Start listening P&S for the tester responses.
+ iTesterGetAckResponseSubscriber = CVCXConnUtilTestSubscriber::NewL( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyResponseAck + iPSKeyBase, RProperty::EInt, this );
+ iTesterGetAckResponseSubscriber->Start();
+ VCXLOGLO2("CVCXConnUtilTestExeTester:: Listening P&S key KVCXConnUtilTestExePsKeyResponseAck: %d", KVCXConnUtilTestExePsKeyResponseAck + iPSKeyBase);
+
+ iTesterResponseSubscriber = CVCXConnUtilTestSubscriber::NewL( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyResponseCmd + iPSKeyBase, RProperty::EInt, this );
+ iTesterResponseSubscriber->Start();
+ VCXLOGLO2("CVCXConnUtilTestExeTester:: Listening P&S key KVCXConnUtilTestExePsKeyResponseCmd: %d", KVCXConnUtilTestExePsKeyResponseCmd + iPSKeyBase);
+ }
+
+ // Start listening P&S for connutil status changes.
+ iConnectionStatusSubscriber = CVCXConnUtilTestSubscriber::NewL( KVcxConnUtilPScategory,
+ EVCxPSConnectionStatus, RProperty::EInt, this );
+
+ iIapIdSubscriber = CVCXConnUtilTestSubscriber::NewL( KVcxConnUtilPScategory,
+ EVCxPSIapId, RProperty::EInt, this );
+
+ iSnapIdSubscriber = CVCXConnUtilTestSubscriber::NewL( KVcxConnUtilPScategory,
+ EVCxPSSnapId, RProperty::EInt, this );
+
+ iMasterExistsSubscriber = CVCXConnUtilTestSubscriber::NewL( KVcxConnUtilPScategory,
+ EVCxPSMasterExists, RProperty::EInt, this );
+
+ iNbrConnInstancesSubscriber = CVCXConnUtilTestSubscriber::NewL( KVcxConnUtilPScategory,
+ EVCxPSNbrConnInstances, RProperty::EInt, this );
+
+ iRoamingRequestStatusSubscriber = CVCXConnUtilTestSubscriber::NewL( KVcxConnUtilPScategory,
+ EVCxPSRoamingRequestStatus, RProperty::EInt, this );
+
+ iNbrRoamRespSubscriber = CVCXConnUtilTestSubscriber::NewL( KVcxConnUtilPScategory,
+ EVCxPSNbrRoamResp, RProperty::EInt, this );
+
+ iNbRoamAcceptedSubscriber = CVCXConnUtilTestSubscriber::NewL( KVcxConnUtilPScategory,
+ EVCxPSNbRoamAccepted, RProperty::EInt, this );
+
+ if( iMode == KVcxConnUtilTestModeSubscriber || iMode == KVcxConnUtilTestModeBoth )
+ {
+ iConnectionStatusSubscriber->Start();
+ iIapIdSubscriber->Start();
+ iSnapIdSubscriber->Start();
+ iMasterExistsSubscriber->Start();
+ iNbrConnInstancesSubscriber->Start();
+ iRoamingRequestStatusSubscriber->Start();
+ iNbrRoamRespSubscriber->Start();
+ iNbRoamAcceptedSubscriber->Start();
+ }
+
+ VCXLOGLO2("<<<CVCXConnUtilTest::CreateL (%S)", &iName);
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXMyVideosCollectionPluginTest::CreateTesterProcessL
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTest::CreateTesterProcessL()
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTest::CreateTesterProcessL (%S)", &iName);
+ // Define tester count P&S key before starting the exe.
+ TInt err = CVCXTestCommon::GetPSProperty(
+ KVCXConnUtilTestPScategory, KVCXConnUtilTestExeGlobalTesterCount, iPSKeyBase );
+
+ if( err == KErrNotFound )
+ {
+ User::LeaveIfError( RProperty::Define(
+ KVCXConnUtilTestPScategory, KVCXConnUtilTestExeGlobalTesterCount, RProperty::EInt ) );
+ VCXLOGLO1("CVCXConnUtilTest:: Defined KVCXConnUtilTestExeGlobalTesterCount");
+ User::LeaveIfError( CVCXTestCommon::SetPSProperty(
+ KVCXConnUtilTestPScategory, KVCXConnUtilTestExeGlobalTesterCount, 1 ) );
+ }
+ else
+ if( err != KErrNone )
+ {
+ VCXLOGLO2("CVCXConnUtilTest:: err getting tester count P&S: %d", err);
+ User::Leave( err );
+ }
+
+ // Lets subscribe tester count for changes.
+ iTesterCountSubscriber = CVCXConnUtilTestSubscriber::NewL( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExeGlobalTesterCount, RProperty::EInt, this );
+ iTesterCountSubscriber->Start();
+ VCXLOGLO1("CVCXConnUtilTestExeTester:: Listening P&S key KVCXConnUtilTestExeGlobalTesterCount");
+
+ // Create the process.
+ User::LeaveIfError( iProcess.Create( _L("VCXConnUtilTestExe.exe"), _L("") ) );
+ iProcess.Resume();
+
+ TesterExeAliveL();
+
+ // Wait until tester count P&S key has been updated.
+ if( !iTesterCountChangedAlready )
+ {
+ iTesterCountSubscriber->WaitChangeL();
+ }
+
+ // Not interested anymore.
+ delete iTesterCountSubscriber;
+ iTesterCountSubscriber = NULL;
+
+ VCXLOGLO2("<<<CVCXConnUtilTest::CreateTesterProcessL (%S)", &iName);
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXMyVideosCollectionPluginTest::GetIapL
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTest::GetIapL( CStifItemParser& aItem )
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTest::GetIapL (%S)", &iName);
+ // Print to UI
+ _LIT( KVCXConnUtilTest, "CVCXConnUtilTest" );
+ _LIT( KWhere, "In GetIapL" );
+ TestModuleIf().Printf( 0, KVCXConnUtilTest, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ if( iMode == KVcxConnUtilTestModeSubscriber )
+ {
+ User::Leave( KErrNotSupported );
+ }
+ TesterExeAliveL();
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TPtrC destName;
+ User::LeaveIfError( aItem.GetNextString( destName ) );
+
+ CIptvTestUtilALR* alrUtil = CIptvTestUtilALR::NewLC();
+ TInt destId = alrUtil->GetDestinationIdL( destName );
+ CleanupStack::PopAndDestroy( alrUtil );
+
+ VCXLOGLO1("CVCXConnUtilTest:: Create cenrep.");
+ CRepository* cenRep = CRepository::NewLC( VCXTEST_KIptvAlrCenRepUid );
+ VCXLOGLO1("CVCXConnUtilTest:: Set cenrep.");
+ User::LeaveIfError( cenRep->Set( VCXTEST_KIptvCenRepUsedSnapIdKey, destId ) );
+ CleanupStack::PopAndDestroy( cenRep );
+
+ TInt isTimed(0);
+ if( aItem.GetNextInt( isTimed ) != KErrNone )
+ {
+ isTimed = 0;
+ }
+
+ VCXLOGLO2("CVCXConnUtilTest:: Setting cmd EVcxConnUtilCommandGetIap (%S) ----->", &iName);
+
+ // Silent call.
+ User::LeaveIfError( CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyCmdIntParam1 + iPSKeyBase, 1 ) );
+
+ // Is this timed call.
+ User::LeaveIfError( CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyCmdIntParam2 + iPSKeyBase, isTimed ) );
+
+ // Set the cmd.
+ User::LeaveIfError( CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyCmd + iPSKeyBase, EVcxConnUtilCommandGetIap ) );
+
+ iTesterGetAckResponseSubscriber->WaitChangeL();
+
+ VCXLOGLO2("<<<CVCXConnUtilTest::GetIapL (%S)", &iName);
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXMyVideosCollectionPluginTest::WapIdFromIapIdL
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTest::WapIdFromIapIdL( CStifItemParser& aItem )
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTest::WapIdFromIapIdL (%S)", &iName);
+ // Print to UI
+ _LIT( KVCXConnUtilTest, "CVCXConnUtilTest" );
+ _LIT( KWhere, "In WapIdFromIapIdL" );
+ TestModuleIf().Printf( 0, KVCXConnUtilTest, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ TesterExeAliveL();
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TPtrC iapName;
+ User::LeaveIfError( aItem.GetNextString( iapName ) );
+
+ VCXLOGLO3("CVCXConnUtilTest:: Iap name: %S (%S) ----->", &iapName, &iName);
+
+ TUint32 iapId( 0 );
+
+ TInt err( KErrNone );
+ if( !iTestCommon->GetIapIdL( iapName, iapId ) )
+ {
+ VCXLOGLO2("CVCXConnUtilTest:: Iap not found, error! (%S) ----->", &iName);
+ err = KErrNotFound;
+ }
+ else
+ {
+ VCXLOGLO2("CVCXConnUtilTest:: Setting cmd EVcxConnUtilCommandGetWapIdForIap (%S) ----->", &iName);
+
+ // IAP ID
+ User::LeaveIfError( CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyCmdIntParam1 + iPSKeyBase, iapId ) );
+
+ // Set the cmd.
+ User::LeaveIfError( CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyCmd + iPSKeyBase, EVcxConnUtilCommandGetWapIdForIap ) );
+
+ iTesterGetAckResponseSubscriber->WaitChangeL();
+ }
+
+ VCXLOGLO2("<<<CVCXConnUtilTest::WapIdFromIapIdL (%S)", &iName);
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXMyVideosCollectionPluginTest::DisconnectL
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTest::DisconnectL( CStifItemParser& aItem )
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTest::DisconnectL (%S)", &iName);
+ // Print to UI
+ _LIT( KVCXConnUtilTest, "CVCXConnUtilTest" );
+ _LIT( KWhere, "In DisconnectL" );
+ TestModuleIf().Printf( 0, KVCXConnUtilTest, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ if( iMode == KVcxConnUtilTestModeSubscriber )
+ {
+ User::Leave( KErrNotSupported );
+ }
+ TesterExeAliveL();
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ VCXLOGLO2("CVCXConnUtilTest:: Setting cmd EVcxConnUtilCommandDisconnect (%S) ----->", &iName);
+
+ // Set the cmd.
+ User::LeaveIfError( CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyCmd + iPSKeyBase, EVcxConnUtilCommandDisconnect ) );
+
+ iTesterGetAckResponseSubscriber->WaitChangeL();
+
+ VCXLOGLO2("<<<CVCXConnUtilTest::DisconnectL (%S)", &iName);
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXMyVideosCollectionPluginTest::CheckPropertyL
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTest::CheckPropertyL( CStifItemParser& aItem )
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTest::CheckPropertyL (%S)", &iName);
+ // Print to UI
+ _LIT( KVCXConnUtilTest, "CVCXConnUtilTest" );
+ _LIT( KWhere, "In CheckPropertyL" );
+ TestModuleIf().Printf( 0, KVCXConnUtilTest, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TInt property;
+ User::LeaveIfError( aItem.GetNextInt( property ) );
+
+ TInt intValue(0);
+ TBuf<256> stringValue;
+ stringValue.Zero();
+
+ TBuf<256> propertyName;
+ GetPropertyNameL( property, propertyName );
+
+ VCXLOGLO2("CVCXConnUtilTest:: check %S", &propertyName);
+
+ switch( property )
+ {
+ case EVCxPSConnectionStatus:
+ {
+ User::LeaveIfError( iConnectionStatusSubscriber->Get( intValue ) );
+ break;
+ }
+
+ case EVCxPSIapId:
+ {
+ User::LeaveIfError( iIapIdSubscriber->Get( intValue ) );
+ break;
+ }
+
+ case EVCxPSSnapId:
+ {
+ User::LeaveIfError( iSnapIdSubscriber->Get( intValue ) );
+ break;
+ }
+
+ case EVCxPSMasterExists:
+ {
+ User::LeaveIfError( iMasterExistsSubscriber->Get( intValue ) );
+ break;
+ }
+
+ case EVCxPSNbrConnInstances:
+ {
+ User::LeaveIfError( iNbrConnInstancesSubscriber->Get( intValue ) );
+ break;
+ }
+
+ case EVCxPSRoamingRequestStatus:
+ {
+ User::LeaveIfError( iRoamingRequestStatusSubscriber->Get( intValue ) );
+ break;
+ }
+
+ case EVCxPSNbrRoamResp:
+ {
+ User::LeaveIfError( iNbrRoamRespSubscriber->Get( intValue ) );
+ break;
+ }
+
+ case EVCxPSNbRoamAccepted:
+ {
+ User::LeaveIfError( iNbRoamAcceptedSubscriber->Get( intValue ) );
+ break;
+ }
+
+ default:
+ {
+ User::Leave( KErrArgument );
+ }
+ break;
+ }
+
+ TInt err(KErrNone);
+ TInt expectedValue(0);
+ if( aItem.GetNextInt( expectedValue ) != KErrNone )
+ {
+ err = KErrArgument;
+ }
+ else
+ if( err == KErrNone && intValue != expectedValue )
+ {
+ VCXLOGLO3("CVCXConnUtilTest:: mismatch: %d, expected: %d", intValue, expectedValue );
+ err = KErrCorrupt;
+ }
+
+ VCXLOGLO2("<<<CVCXConnUtilTest::CheckPropertyL (%S)", &iName);
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXMyVideosCollectionPluginTest::PrintConnUtilDetails
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTest::PrintConnUtilDetails( CStifItemParser& /* aItem */ )
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTest::PrintConnUtilDetails (%S)", &iName);
+
+ TInt connectionStatus( 0 );
+ TInt iapId( 0 );
+ TInt snapId( 0 );
+ TInt masterExists( 0 );
+ TInt nbrConnInstances( 0 );
+ TInt roamingRequestStatus( 0 );
+ TInt nbrRoamResp( 0 );
+ TInt nbrRoamAccepted( 0 );
+ TInt err( KErrNone );
+
+ err = iConnectionStatusSubscriber->Get( connectionStatus );
+ if( err != KErrNone ) VCXLOGLO2("CVCXConnUtilTest:: err: %d getting PS iConnectionStatusSubscriber", err);
+
+ err = iIapIdSubscriber->Get( iapId );
+ if( err != KErrNone ) VCXLOGLO2("CVCXConnUtilTest:: err: %d getting PS iIapIdSubscriber", err);
+
+ err = iSnapIdSubscriber->Get( snapId );
+ if( err != KErrNone ) VCXLOGLO2("CVCXConnUtilTest:: err: %d getting PS iSnapIdSubscriber", err);
+
+ err = iMasterExistsSubscriber->Get( masterExists );
+ if( err != KErrNone ) VCXLOGLO2("CVCXConnUtilTest:: err: %d getting PS iMasterExistsSubscriber", err);
+
+ err = iNbrConnInstancesSubscriber->Get( nbrConnInstances );
+ if( err != KErrNone ) VCXLOGLO2("CVCXConnUtilTest:: err: %d getting PS iNbrConnInstancesSubscriber", err);
+
+ err = iRoamingRequestStatusSubscriber->Get( roamingRequestStatus );
+ if( err != KErrNone ) VCXLOGLO2("CVCXConnUtilTest:: err: %d getting PS iRoamingRequestStatusSubscriber", err);
+
+ err = iNbrRoamRespSubscriber->Get( nbrRoamResp );
+ if( err != KErrNone ) VCXLOGLO2("CVCXConnUtilTest:: err: %d getting PS iNbrRoamRespSubscriber", err);
+
+ err = iNbRoamAcceptedSubscriber->Get( nbrRoamAccepted );
+ if( err != KErrNone ) VCXLOGLO2("CVCXConnUtilTest:: err: %d getting PS iNbRoamAcceptedSubscriber", err);
+
+ TBuf<256> statusStr;
+ TRAP_IGNORE( GetConnectionStatusL( connectionStatus, statusStr ) );
+
+ VCXLOGLO3("CVCXConnUtilTest:: status: %S (%d)", &statusStr, connectionStatus);
+ VCXLOGLO2("CVCXConnUtilTest:: iapId: %d", iapId);
+ VCXLOGLO2("CVCXConnUtilTest:: snapId: %d", snapId);
+ VCXLOGLO2("CVCXConnUtilTest:: masterExists: %d", masterExists);
+ VCXLOGLO2("CVCXConnUtilTest:: nbrConnInstances: %d", nbrConnInstances);
+ VCXLOGLO2("CVCXConnUtilTest:: roamingRequestStatus: %d", roamingRequestStatus);
+ VCXLOGLO2("CVCXConnUtilTest:: nbrRoamResp: %d", nbrRoamResp);
+ VCXLOGLO2("CVCXConnUtilTest:: nbrRoamAccepted: %d", nbrRoamAccepted);
+
+ VCXLOGLO2("<<<CVCXConnUtilTest::PrintConnUtilDetails (%S)", &iName);
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXMyVideosCollectionPluginTest::SetRoamingAllowedL
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTest::SetRoamingAllowedL( CStifItemParser& aItem )
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTest::SetRoamingAllowedL (%S)", &iName);
+ // Print to UI
+ _LIT( KVCXConnUtilTest, "CVCXConnUtilTest" );
+ _LIT( KWhere, "In SetRoamingAllowedL" );
+ TestModuleIf().Printf( 0, KVCXConnUtilTest, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ if( iMode == KVcxConnUtilTestModeSubscriber )
+ {
+ User::Leave( KErrNotSupported );
+ }
+ TesterExeAliveL();
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TInt temp;
+ User::LeaveIfError( aItem.GetNextInt( temp ) );
+
+ VCXLOGLO2("CVCXConnUtilTest:: Setting cmd EVcxConnUtilCommandSetRoamingAllowed (%S) ----->", &iName);
+
+ // Set value.
+ User::LeaveIfError( CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyCmdIntParam1 + iPSKeyBase, temp ) );
+
+ // Set the cmd.
+ User::LeaveIfError( CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyCmd + iPSKeyBase, EVcxConnUtilCommandSetRoamingAllowed ) );
+
+ iTesterGetAckResponseSubscriber->WaitChangeL();
+
+ VCXLOGLO2("<<<CVCXConnUtilTest::SetRoamingAllowedL (%S)", &iName);
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXMyVideosCollectionPluginTest::SetLeaveAtRoamingRequestL
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTest::SetLeaveAtRoamingRequestL( CStifItemParser& aItem )
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTest::SetLeaveAtRoamingRequestL (%S)", &iName);
+ // Print to UI
+ _LIT( KVCXConnUtilTest, "CVCXConnUtilTest" );
+ _LIT( KWhere, "In SetLeaveAtRoamingRequestL" );
+ TestModuleIf().Printf( 0, KVCXConnUtilTest, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ if( iMode == KVcxConnUtilTestModeSubscriber )
+ {
+ User::Leave( KErrNotSupported );
+ }
+ TesterExeAliveL();
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TInt temp;
+ User::LeaveIfError( aItem.GetNextInt( temp ) );
+
+ VCXLOGLO2("CVCXConnUtilTest:: Setting cmd EVcxConnUtilCommandSetRoamingLeaveAtRoamingRequest (%S) ----->", &iName);
+
+ // Set value.
+ User::LeaveIfError( CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyCmdIntParam1 + iPSKeyBase, temp ) );
+
+ // Set the cmd.
+ User::LeaveIfError( CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyCmd + iPSKeyBase, EVcxConnUtilCommandSetRoamingLeaveAtRoamingRequest ) );
+
+ iTesterGetAckResponseSubscriber->WaitChangeL();
+
+ VCXLOGLO2("<<<CVCXConnUtilTest::SetLeaveAtRoamingRequestL (%S)", &iName);
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXMyVideosCollectionPluginTest::SetDelayBeforeRoamingRequest
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTest::SetDelayBeforeRoamingRequestL( CStifItemParser& aItem )
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTest::SetDelayBeforeRoamingRequestL (%S)", &iName);
+ // Print to UI
+ _LIT( KVCXConnUtilTest, "CVCXConnUtilTest" );
+ _LIT( KWhere, "In SetDelayBeforeRoamingRequestL" );
+ TestModuleIf().Printf( 0, KVCXConnUtilTest, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ if( iMode == KVcxConnUtilTestModeSubscriber )
+ {
+ User::Leave( KErrNotSupported );
+ }
+ TesterExeAliveL();
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TInt seconds(0);
+ User::LeaveIfError( aItem.GetNextInt( seconds ) );
+
+ VCXLOGLO2("CVCXConnUtilTest:: Setting cmd EVcxConnUtilCommandSetDelayBeforeRoamingRequest (%S) ----->", &iName);
+
+ // Set value.
+ User::LeaveIfError( CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyCmdIntParam1 + iPSKeyBase, seconds ) );
+
+ // Set the cmd.
+ User::LeaveIfError( CVCXTestCommon::SetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyCmd + iPSKeyBase, EVcxConnUtilCommandSetDelayBeforeRoamingRequest ) );
+
+ iTesterGetAckResponseSubscriber->WaitChangeL();
+
+ VCXLOGLO2("<<<CVCXConnUtilTest::SetDelayBeforeRoamingRequestL (%S)", &iName);
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXMyVideosCollectionPluginTest::AddWaitedProperty
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTest::AddWaitedPropertyL( CStifItemParser& aItem )
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTest::AddWaitedPropertyL (%S)", &iName);
+ // Print to UI
+ _LIT( KVCXConnUtilTest, "CVCXConnUtilTest" );
+ _LIT( KWhere, "In AddWaitedPropertyL" );
+ TestModuleIf().Printf( 0, KVCXConnUtilTest, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ if( iMode == KVcxConnUtilTestModeConnectivity )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TInt property( -1 );
+ User::LeaveIfError( aItem.GetNextInt( property ) );
+
+ TBuf<256> propertyName;
+ GetPropertyNameL( property, propertyName );
+
+ TInt value(0);
+ User::LeaveIfError( aItem.GetNextInt( value ) );
+
+ if( property == EVCxPSConnectionStatus )
+ {
+ TBuf<256> connStr;
+ GetConnectionStatusL( value, connStr );
+ VCXLOGLO3("CVCXConnUtilTest:: %S = %S", &propertyName, &connStr);
+ }
+ else
+ {
+ VCXLOGLO3("CVCXConnUtilTest:: %S = %d", &propertyName, value);
+ }
+
+ TVcxConnTestPSProperty prop( property, value );
+ iWaitedPSChanges.Append( prop );
+
+ VCXLOGLO2("<<<CVCXConnUtilTest::AddWaitedPropertyL (%S)", &iName);
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXMyVideosCollectionPluginTest::AddNotAllowedPropertyL
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTest::AddNotAllowedPropertyL( CStifItemParser& aItem )
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTest::AddNotAllowedPropertyL (%S)", &iName);
+ // Print to UI
+ _LIT( KVCXConnUtilTest, "CVCXConnUtilTest" );
+ _LIT( KWhere, "In AddNotAllowedPropertyL" );
+ TestModuleIf().Printf( 0, KVCXConnUtilTest, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ if( iMode == KVcxConnUtilTestModeConnectivity )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ TInt property( -1 );
+ User::LeaveIfError( aItem.GetNextInt( property ) );
+
+ TBuf<256> propertyName;
+ GetPropertyNameL( property, propertyName );
+
+ TInt value(0);
+ User::LeaveIfError( aItem.GetNextInt( value ) );
+
+ if( property == EVCxPSConnectionStatus )
+ {
+ TBuf<256> connStr;
+ GetConnectionStatusL( value, connStr );
+ VCXLOGLO3("CVCXConnUtilTest:: %S = %S", &propertyName, &connStr);
+ }
+ else
+ {
+ VCXLOGLO3("CVCXConnUtilTest:: %S = %d", &propertyName, value);
+ }
+
+ TVcxConnTestPSProperty prop( property, value );
+ iNotAllowedPSChanges.Append( prop );
+
+ VCXLOGLO2("<<<CVCXConnUtilTest::AddNotAllowedPropertyL (%S)", &iName);
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXMyVideosCollectionPluginTest::ResetWaitedProperties
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTest::ResetWaitedPropertiesL( CStifItemParser& aItem )
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTest::ResetWaitedPropertiesL (%S)", &iName);
+ // Print to UI
+ _LIT( KVCXConnUtilTest, "CVCXConnUtilTest" );
+ _LIT( KWhere, "In ResetWaitedPropertiesL" );
+ TestModuleIf().Printf( 0, KVCXConnUtilTest, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ if( iMode == KVcxConnUtilTestModeConnectivity )
+ {
+ User::Leave( KErrNotSupported );
+ }
+
+ iWaitedPSChanges.Reset();
+ iWaitingForEmptyPropertyQueue = EFalse;
+ iNotAllowedPSChanges.Reset();
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+ VCXLOGLO2("<<<CVCXConnUtilTest::ResetWaitedPropertiesL (%S)", &iName);
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXMyVideosCollectionPluginTest::WaitForPropertyQueueL
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTest::WaitForPropertyQueueL( CStifItemParser& aItem )
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTest::WaitForPropertyQueueL (%S)", &iName);
+ // Print to UI
+ _LIT( KVCXConnUtilTest, "CVCXConnUtilTest" );
+ _LIT( KWhere, "In WaitForPropertyQueueL" );
+ TestModuleIf().Printf( 0, KVCXConnUtilTest, KWhere );
+ // Print to log file
+ iLog->Log( KWhere );
+
+ if( iMode == KVcxConnUtilTestModeConnectivity )
+ {
+ User::Leave( KErrNotSupported );
+ }
+ TesterExeAliveL();
+
+ iWaitingForEmptyPropertyQueue = ETrue;
+
+ // Timer is started always again when we correct property changes.
+ const TInt KTimeoutMinute = 60 * 1000000;
+ iTimeoutTimer->CancelTimer();
+ iTimeoutTimer->After( KTimeoutMinute * 1 );
+
+ aItem.SetParsingType(CStifItemParser::EQuoteStyleParsing);
+ VCXLOGLO2("<<<CVCXConnUtilTest::WaitForPropertyQueueL (%S)", &iName);
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTest::ValueChangedL
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTest::ValueChangedL( const TUid& aUid, const TUint32& aKey, const TInt& aValue )
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTest::ValueChangedL (%S)", &iName);
+
+ if( aUid == KVcxConnUtilPScategory )
+ {
+ TBuf<256> pName;
+ GetPropertyNameL( aKey, pName );
+ if( aKey == EVCxPSConnectionStatus )
+ {
+ TBuf<256> connStr;
+ GetConnectionStatusL( aValue, connStr );
+ VCXLOGLO4("CVCXConnUtilTest::ValueChanged: %S = %S (%S) ----->", &pName, &connStr, &iName);
+
+ _LIT( KVCXConnUtilTest, "S:" );
+ TestModuleIf().Printf( 0, KVCXConnUtilTest, connStr );
+ }
+ else
+ {
+ VCXLOGLO4("CVCXConnUtilTest::ValueChanged: %S = %d (%S) ----->", &pName, aValue, &iName);
+ }
+
+ TBool found = EFalse;
+ for( TInt i = iWaitedPSChanges.Count() - 1; i >= 0; i-- )
+ {
+ if( iWaitedPSChanges[i].iProperty == aKey && iWaitedPSChanges[i].iIntegerValue == aValue )
+ {
+ iWaitedPSChanges.Remove( i );
+ found = ETrue;
+ break;
+ }
+ }
+
+ if( !found )
+ {
+ VCXLOGLO1("CVCXConnUtilTest:: The key was not found from wait queue.");
+
+ // Check not allowed property changes.
+ for( TInt i = iNotAllowedPSChanges.Count() - 1; i >= 0; i-- )
+ {
+ if( iNotAllowedPSChanges[i].iProperty == aKey && iNotAllowedPSChanges[i].iIntegerValue == aValue )
+ {
+ VCXLOGLO1("CVCXConnUtilTest:: Property change is not allowed. Error! SIGNAL.");
+ iNotAllowedPSChanges.Remove( i );
+ Signal( KErrCorrupt );
+ break;
+ }
+ }
+ }
+ else
+ {
+ VCXLOGLO1("CVCXConnUtilTest:: Key found and removed from wait queue.");
+
+ // Restart timer.
+ const TInt KTimeoutMinute = 60 * 1000000;
+ iTimeoutTimer->CancelTimer();
+ iTimeoutTimer->After( KTimeoutMinute * 1 );
+
+ if( iWaitedPSChanges.Count() == 0 )
+ {
+ if( iWaitingForEmptyPropertyQueue )
+ {
+ iWaitingForEmptyPropertyQueue = EFalse;
+ VCXLOGLO1("CVCXConnUtilTest:: Property queue empty, SIGNAL.");
+ iTimeoutTimer->CancelTimer();
+ Signal();
+ }
+ }
+ }
+
+ if( iWaitedPSChanges.Count() == 0 )
+ {
+ iNotAllowedPSChanges.Reset();
+ }
+ }
+
+ TInt err( KErrNone );
+
+ if( aUid == KVCXConnUtilTestPScategory )
+ {
+ if( aKey == KVCXConnUtilTestExeGlobalTesterCount )
+ {
+ iTesterCountChangedAlready = ETrue;
+ VCXLOGLO1("CVCXConnUtilTest:: KVCXConnUtilTestExeGlobalTesterCount changed.");
+ }
+
+ if( aKey == KVCXConnUtilTestExePsKeyResponseAck + iPSKeyBase )
+ {
+ VCXLOGLO3("CVCXConnUtilTest:: received KVCXConnUtilTestExePsKeyResponseAck, value: %d (%S) ----->", aValue, &iName);
+ }
+
+ if( aKey == KVCXConnUtilTestExePsKeyResponseCmd + iPSKeyBase )
+ {
+ VCXLOGLO2("CVCXConnUtilTest:: received KVCXConnUtilTestExePsKeyResponseCmd (%S) ----->", &iName);
+
+ TInt cmd( aValue );
+
+ TInt response( 0 );
+
+ CVCXTestCommon::GetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyResponseParam + iPSKeyBase, response );
+
+ CVCXTestCommon::GetPSProperty( KVCXConnUtilTestPScategory,
+ KVCXConnUtilTestExePsKeyResponseError + iPSKeyBase, err );
+
+ if( cmd == EVcxConnUtilCommandDisconnect )
+ {
+ VCXLOGLO3("CVCXConnUtilTest:: response for EVcxConnUtilCommandDisconnect, error: %d (%S) ----->", err, &iName);
+ }
+
+ if( cmd == EVcxConnUtilCommandGetIap )
+ {
+ if( response == 0 )
+ {
+ VCXLOGLO1("CVCXConnUtilTest:: response for EVcxConnUtilCommandGetIap, IAP is 0, error!");
+ err = KErrGeneral;
+ }
+ else
+ {
+ VCXLOGLO2("CVCXConnUtilTest:: response for EVcxConnUtilCommandGetIap returned IAP: %d", response);
+ }
+ }
+
+ if( cmd == EVcxConnUtilCommandGetWapIdForIap )
+ {
+ VCXLOGLO2("CVCXConnUtilTest:: response for EVcxConnUtilCommandGetWapIdForIap returned: %d", response);
+ }
+
+ Signal( err );
+ }
+ }
+
+ VCXLOGLO2("<<<CVCXConnUtilTest::ValueChangedL (%S)", &iName);
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTest::ValueChangedL
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTest::ValueChangedL( const TUid& aUid, const TUint32& aKey, const TDesC& aValue )
+ {
+ VCXLOGLO2(">>>CVCXConnUtilTest::ValueChangedL (%S)", &iName);
+
+ if( aUid == KVcxConnUtilPScategory )
+ {
+ TBuf<256> pName;
+ GetPropertyNameL( aKey, pName );
+ VCXLOGLO3("CVCXConnUtilTest::ValueChanged: %S = %S", &pName, &aValue);
+
+ TBool found = EFalse;
+ for( TInt i = iWaitedPSChanges.Count() - 1; i >= 0; i-- )
+ {
+ if( iWaitedPSChanges[i].iProperty == aKey && iWaitedPSChanges[i].iStringValue.Compare( aValue ) == 0 )
+ {
+ iWaitedPSChanges.Remove( i );
+ found = ETrue;
+ break;
+ }
+ }
+
+ if( !found )
+ {
+ VCXLOGLO1("CVCXConnUtilTest:: The key was not found from wait queue.");
+
+ // Check not allowed property changes.
+ for( TInt i = iNotAllowedPSChanges.Count() - 1; i >= 0; i-- )
+ {
+ if( iNotAllowedPSChanges[i].iProperty == aKey && iWaitedPSChanges[i].iStringValue.Compare( aValue ) )
+ {
+ VCXLOGLO1("CVCXConnUtilTest:: Property change is not allowed. Error!");
+ iNotAllowedPSChanges.Remove( i );
+ Signal( KErrCorrupt );
+ break;
+ }
+ }
+ }
+ else
+ {
+ VCXLOGLO1("CVCXConnUtilTest:: Key found and removed from wait queue.");
+
+ const TInt KTimeoutMinute = 60 * 1000000;
+ iTimeoutTimer->CancelTimer();
+ iTimeoutTimer->After( KTimeoutMinute * 1 );
+
+ if( iWaitedPSChanges.Count() == 0 )
+ {
+ if( iWaitingForEmptyPropertyQueue )
+ {
+ iWaitingForEmptyPropertyQueue = EFalse;
+ VCXLOGLO1("CVCXConnUtilTest:: Property queue empty, SIGNAL.");
+ iTimeoutTimer->CancelTimer();
+ Signal();
+ }
+ }
+ }
+
+ if( iWaitedPSChanges.Count() == 0 )
+ {
+ iNotAllowedPSChanges.Reset();
+ }
+ }
+
+ if( aUid == KVCXConnUtilTestPScategory )
+ {
+
+ }
+
+ VCXLOGLO2("<<<CVCXConnUtilTest::ValueChangedL (%S)", &iName);
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTest::TimerComplete
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTest::TimerComplete( TInt aTimerId, TInt aError )
+ {
+ VCXLOGLO3(">>>CVCXConnUtilTest::TimerComplete, err: %d (%S)", aError, &iName);
+
+ if( aError == KErrNone && aTimerId == KTimeoutTimerId && iWaitingForEmptyPropertyQueue )
+ {
+ if( iWaitedPSChanges.Count() > 0 )
+ {
+ VCXLOGLO1("CVCXConnUtilTest:: ---- TIMEOUT --- when waiting P&S changes ----->");
+
+ _LIT( KVCXConnUtilTest, "CVCXConnUtilTest" );
+ _LIT( KWhere, "TIMEOUT!" );
+ TestModuleIf().Printf( 0, KVCXConnUtilTest, KWhere );
+
+ Signal( KErrTimedOut );
+ }
+ else
+ {
+ VCXLOGLO1("CVCXConnUtilTest:: Timed out but property queue empty. Signal ok.");
+ Signal( KErrNone );
+ }
+ }
+
+ VCXLOGLO2("<<<CVCXConnUtilTest::TimerComplete (%S)", &iName);
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTest::GetConnectionStatusL
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTest::GetConnectionStatusL( TInt aConnectionStatus, TDes& aStatusString )
+ {
+ switch( aConnectionStatus )
+ {
+ case EVCxNotConnected:
+ {
+ aStatusString.Copy( _L("EVCxNotConnected") );
+ }
+ break;
+
+ case EVCxConnecting:
+ {
+ aStatusString.Copy( _L("EVCxConnecting") );
+ }
+ break;
+
+ case EVCxConnected:
+ {
+ aStatusString.Copy( _L("EVCxConnected") );
+ }
+ break;
+
+ case EVCxDisconnecting:
+ {
+ aStatusString.Copy( _L("EVCxDisconnecting") );
+ }
+ break;
+
+ case EVCxRoamingRequest:
+ {
+ aStatusString.Copy( _L("EVCxRoamingRequest") );
+ }
+ break;
+
+ case EVCxRoamingAccepted:
+ {
+ aStatusString.Copy( _L("EVCxRoamingAccepted") );
+ }
+ break;
+
+ case EVCxError:
+ {
+ aStatusString.Copy( _L("EVCxError") );
+ }
+ break;
+
+ default:
+ {
+ VCXLOGLO2("CVCXConnUtilTest:: state %d is UKNOWN!", aConnectionStatus);
+ User::Leave( KErrArgument );
+ }
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTest::TesterExeAliveL
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTest::TesterExeAliveL()
+ {
+ if( iProcess.ExitType() != EExitPending || iProcess.ExitReason() != KErrNone )
+ {
+ VCXLOGLO2("CVCXConnUtilTest:: ERROR: Tester process has terminated! (%S)", &iName);
+ VCXLOGLO2("CVCXConnUtilTest:: Exit type: %d", iProcess.ExitType());
+ VCXLOGLO2("CVCXConnUtilTest:: Exit reason: %d", iProcess.ExitReason());
+ TExitCategoryName exitCatName = iProcess.ExitCategory();
+ VCXLOGLO2("CVCXConnUtilTest:: Exit category: %S", &exitCatName);
+ User::Leave( KErrGeneral );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTest::GetPropertyNameL
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTest::GetPropertyNameL( TInt aProperty, TDes& aPropertyName )
+ {
+ switch( aProperty )
+ {
+ case EVCxPSConnectionStatus:
+ {
+ aPropertyName.Copy( _L("EVCxPSConnectionStatus") );
+ break;
+ }
+
+ case EVCxPSIapId:
+ {
+ aPropertyName.Copy( _L("EVCxPSIapId") );
+ break;
+ }
+
+ case EVCxPSSnapId:
+ {
+ aPropertyName.Copy( _L("EVCxPSSnapId") );
+ break;
+ }
+
+ case EVCxPSMasterExists:
+ {
+ aPropertyName.Copy( _L("EVCxPSMasterExists") );
+ break;
+ }
+
+ case EVCxPSNbrConnInstances:
+ {
+ aPropertyName.Copy( _L("EVCxPSNbrConnInstances") );
+ break;
+ }
+
+ case EVCxPSRoamingRequestStatus:
+ {
+ aPropertyName.Copy( _L("EVCxPSRoamingRequestStatus") );
+ break;
+ }
+
+ case EVCxPSNbrRoamResp:
+ {
+ aPropertyName.Copy( _L("EVCxPSNbrRoamResp") );
+ break;
+ }
+
+ case EVCxPSNbRoamAccepted:
+ {
+ aPropertyName.Copy( _L("EVCxPSNbRoamAccepted") );
+ break;
+ }
+
+ default:
+ {
+ VCXLOGLO2("CVCXConnUtilTest:: Unknown property: %d!", aProperty);
+ User::Leave( KErrArgument );
+ }
+ break;
+ }
+ }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+// None
+
+// [End of File] - Do not remove
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/tsrc/src/VCXConnUtilTestSubscriber.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,214 @@
+/*
+* Copyright (c) 2006 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: Class to handle subscribtions from PS*
+*/
+
+
+#include "VCXTestLog.h"
+#include "VCXConnUtilTestSubscriber.h"
+#include "VCXConnUtilTestPSObserver.h"
+
+const TInt KMaxStrLenght( 100 );
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTestSubscriber::CVCXConnUtilTestSubscriber()
+// -----------------------------------------------------------------------------
+//
+CVCXConnUtilTestSubscriber::CVCXConnUtilTestSubscriber( const TUid aUid,
+ const TUint32 aKey,
+ RProperty::TType aType,
+ MVCXConnUtilTestPSObserver* aObserver ) :
+ CActive( EPriorityStandard ),
+ iUid( aUid ),
+ iKey( aKey ),
+ iKeyType(aType),
+ iObserver( aObserver )
+ {
+ // NOP
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTestSubscriber::NewL()
+// -----------------------------------------------------------------------------
+//
+CVCXConnUtilTestSubscriber* CVCXConnUtilTestSubscriber::NewL( const TUid aUid,
+ const TUint32 aKey,
+ RProperty::TType aType,
+ MVCXConnUtilTestPSObserver* aObserver )
+ {
+ CVCXConnUtilTestSubscriber* self =
+ new( ELeave ) CVCXConnUtilTestSubscriber( aUid, aKey, aType, aObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTestSubscriber::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTestSubscriber::ConstructL()
+ {
+ iInitialized = EFalse;
+ User::LeaveIfError( iProperty.Attach( iUid, iKey ) );
+ CActiveScheduler::Add( this );
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTestSubscriber::~CVCXConnUtilTestSubscriber()
+// -----------------------------------------------------------------------------
+//
+CVCXConnUtilTestSubscriber::~CVCXConnUtilTestSubscriber()
+ {
+ if( IsActive() )
+ {
+ Cancel();
+ }
+ iProperty.Close();
+
+ delete iSafeWait;
+ iSafeWait = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTestSubscriber::Get()
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTestSubscriber::Get( TInt& aValue )
+ {
+ return iProperty.Get( aValue );
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTestSubscriber::Get()
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTestSubscriber::Get( TDes& aValue )
+ {
+ return iProperty.Get( aValue );
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTestSubscriber::Set()
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTestSubscriber::Set( TInt& aValue )
+ {
+ return iProperty.Set( aValue );
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTestSubscriber::Set()
+// -----------------------------------------------------------------------------
+//
+TInt CVCXConnUtilTestSubscriber::Set( const TDesC& aValue )
+ {
+ return iProperty.Set( aValue );
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTestSubscriber::Start()
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTestSubscriber::Start()
+ {
+ if( !IsActive() )
+ {
+ iProperty.Subscribe( iStatus );
+ SetActive();
+ iInitialized = ETrue;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTestSubscriber::WaitChange()
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTestSubscriber::WaitChangeL()
+ {
+ if( !iSafeWait )
+ {
+ iSafeWait = new ( ELeave ) CActiveSchedulerWait;
+ }
+ if ( iSafeWait && !iSafeWait->IsStarted() )
+ {
+ iSafeWait->Start();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTestSubscriber::EndWait()
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTestSubscriber::EndWait()
+ {
+ if ( iSafeWait && iSafeWait->IsStarted() )
+ {
+ iSafeWait->AsyncStop();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTestSubscriber::DoCancel()
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTestSubscriber::DoCancel()
+ {
+ if( IsActive() )
+ {
+ iProperty.Cancel();
+ }
+ iInitialized = EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CVCXConnUtilTestSubscriber::RunL()
+// -----------------------------------------------------------------------------
+//
+void CVCXConnUtilTestSubscriber::RunL()
+ {
+ VCXLOGLO1(">>>CVCXConnUtilTestSubscriber::RunL");
+ // resubscribe before processing new
+ // value to prevent missing updates
+ iProperty.Subscribe( iStatus );
+ SetActive();
+
+ if( iInitialized )
+ {
+ TBuf< KMaxStrLenght > strValue;
+ TInt intValue;
+
+ if( iKeyType == RProperty::EInt )
+ {
+ // int type changed
+ if( iProperty.Get( intValue ) == KErrNone && iObserver )
+ {
+ iObserver->ValueChangedL( iUid, iKey, intValue );
+ }
+ }
+ else if( iKeyType == RProperty::EText )
+ {
+ if( iProperty.Get( strValue ) == KErrNone && iObserver )
+ {
+ iObserver->ValueChangedL( iUid, iKey, strValue );
+ }
+ }
+ }
+ EndWait();
+ iInitialized = ETrue;
+ VCXLOGLO1("<<<CVCXConnUtilTestSubscriber::RunL");
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoconnutility_api/videoconnutility_api.metaxml Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0" ?>
+<api id="fdf27dbec5a24efe0ffb847134fa8f99" dataversion="1.0">
+<name>Video Connection Utility API</name>
+<description>Video Connection Utility API can be used for managing network connections within the same scope for different SW components</description>
+<type>C++</type>
+<subsystem>videoserviceutils</subsystem>
+<libs><lib name="vcxconnectionutility.lib"/>
+</libs>
+<release category="domain" sinceversion="5.1"/>
+<attributes>
+<htmldocprovided>no</htmldocprovided>
+<adaptation>no</adaptation>
+</attributes>
+</api>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoplayer_constants_api/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,33 @@
+/*
+* Copyright (c) 2004-2008 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:
+*
+*/
+
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+PRJ_EXPORTS
+
+../inc/vcxmyvideosdefs.h MW_LAYER_PLATFORM_EXPORT_PATH( vcxmyvideosdefs.h )
+../inc/vcxmyvideosuids.h MW_LAYER_PLATFORM_EXPORT_PATH( vcxmyvideosuids.h )
+../inc/videoplayeruid.hrh MW_LAYER_PLATFORM_EXPORT_PATH( videoplayeruid.hrh )
+../inc/mpxmediavideodefs.h MW_LAYER_PLATFORM_EXPORT_PATH( mpxmediavideodefs.h )
+../inc/mpxvideoplaybackdefs.h MW_LAYER_PLATFORM_EXPORT_PATH( mpxvideoplaybackdefs.h )
+
+PRJ_MMPFILES
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoplayer_constants_api/inc/mpxmediavideodefs.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,54 @@
+/*
+* Copyright (c) 2008 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: Definitions for video media type*
+*/
+
+
+// Version : %version: 3 %
+
+
+
+
+#ifndef __MPXMEDIAVIDEODEFS_H__
+#define __MPXMEDIAVIDEODEFS_H__
+
+#include <e32base.h>
+#include <mpxattribute.h>
+
+//
+// Content ID identifying video category of content provided
+// in the media object and associated attributes.
+//
+
+const TInt KMPXMediaIdVideo = 0x200159B0;
+
+//
+// Attributes supported for KMPXMediaIdVideo
+//
+const TMPXAttributeData KMPXMediaVideoArtist = { KMPXMediaIdVideo, 0x01 };
+const TMPXAttributeData KMPXMediaVideoAudioEnabled = { KMPXMediaIdVideo, 0x02 };
+const TMPXAttributeData KMPXMediaVideoVideoEnabled = { KMPXMediaIdVideo, 0x04 };
+const TMPXAttributeData KMPXMediaVideoPlaybackMode = { KMPXMediaIdVideo, 0x08 };
+const TMPXAttributeData KMPXMediaVideoSeekable = { KMPXMediaIdVideo, 0x10 };
+const TMPXAttributeData KMPXMediaVideoPartialPlayback = { KMPXMediaIdVideo, 0x20 };
+const TMPXAttributeData KMPXMediaVideoHeight = { KMPXMediaIdVideo, 0x40 };
+const TMPXAttributeData KMPXMediaVideoWidth = { KMPXMediaIdVideo, 0x80 };
+const TMPXAttributeData KMPXMediaVideoBitRate = { KMPXMediaIdVideo, 0x100 };
+const TMPXAttributeData KMPXMediaVideoDrmProtected = { KMPXMediaIdVideo, 0x200 };
+const TMPXAttributeData KMPXMediaVideoPausableStream = { KMPXMediaIdVideo, 0x400 };
+const TMPXAttributeData KMPXMediaFourCCCode = { KMPXMediaIdVideo, 0x800 };
+
+const TMPXAttributeData KMPXMediaVideoAll = { KMPXMediaIdVideo, 0xffffffff };
+
+#endif // __MPXMEDIAVIDEODEFS_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoplayer_constants_api/inc/mpxvideoplaybackdefs.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,173 @@
+/*
+* Copyright (c) 2008 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: Definitions for video type*
+*/
+
+
+// Version : %version: ou1cpsw#4 %
+
+
+#ifndef CMPXVIDEOPLAYBACKDEFS_H
+#define CMPXVIDEOPLAYBACKDEFS_H
+
+#include <e32base.h>
+#include <mpxattribute.h>
+
+/**
+* Content ID identifying video category of content provided
+* in the media object and associated attributes.
+*/
+const TInt KMPXMediaIdVideoPlayback = 0x200159B1;
+
+//
+// TInt for Command Id
+//
+const TMPXAttributeData KMPXMediaVideoPlaybackCommand = { KMPXMediaIdVideoPlayback, 0x01 };
+
+//
+// Video Region
+//
+const TMPXAttributeData KMPXMediaVideoPlaybackDSARegion = { KMPXMediaIdVideoPlayback, 0x02 };
+
+//
+// TRect
+//
+const TMPXAttributeData KMPXMediaVideoPlaybackTRect = { KMPXMediaIdVideoPlayback, 0x04 };
+
+//
+// File Name
+//
+const TMPXAttributeData KMPXMediaVideoPlaybackFileName = { KMPXMediaIdVideoPlayback, 0x08 };
+
+//
+// TMPXVideoMode
+//
+const TMPXAttributeData KMPXMediaVideoMode = { KMPXMediaIdVideoPlayback, 0x10 };
+
+//
+// TInt
+//
+const TMPXAttributeData KMPXMediaVideoError = { KMPXMediaIdVideoPlayback, 0x20 };
+
+
+//
+// TInt
+//
+const TMPXAttributeData KMPXMediaVideoAspectRatio = { KMPXMediaIdVideoPlayback, 0x40 };
+
+//
+// TInt
+//
+const TMPXAttributeData KMPXMediaVideoMovePdlFile = { KMPXMediaIdVideoPlayback, 0x80 };
+
+//
+// TBool
+//
+const TMPXAttributeData KMPXMediaVideoAppForeground = { KMPXMediaIdVideoPlayback, 0x100 };
+
+//
+// TInt
+//
+const TMPXAttributeData KMPXMediaVideoTvOutConnected = { KMPXMediaIdVideoPlayback, 0x200 };
+
+//
+// TInt
+//
+const TMPXAttributeData KMPXMediaVideoTvOutPlayAllowed = { KMPXMediaIdVideoPlayback, 0x400 };
+
+//
+// MimeType returned by the recognizer
+//
+const TMPXAttributeData KMPXMediaVideoRecognizedMimeType = { KMPXMediaIdVideoPlayback, 0x800 };
+
+//
+// TInt
+//
+const TMPXAttributeData KMPXMediaVideoBufferingPercentage = { KMPXMediaIdVideoPlayback, 0x1000 };
+
+
+enum TMPXVideoPlaybackCommand
+{
+ EPbCmdInitView,
+ EPbCmdAbortDSA,
+ EPbCmdRestartDSA,
+ EPbCmdSetDisplayWindow,
+ EPbCmdStartVideoSeekingForward,
+ EPbCmdStartVideoSeekingBackward,
+ EPbCmdStopVideoSeeking,
+ EPbCmdHandleForeground,
+ EPbCmdHandleBackground,
+ EPbCmdNaturalAspectRatio,
+ EPbCmdZoomAspectRatio,
+ EPbCmdStretchAspectRatio,
+ EPbCmdSetDefaultAspectRatio,
+ EPbCmdTvOutEvent,
+ EPbCmdUpdateSeekable,
+ EPbCmdPluginError,
+ EPbCmdEndofClipReached,
+ EPbCmdHandleIncreaseVolume,
+ EPbCmdHandleDecreaseVolume,
+ EPbCmdCustomPause,
+ EPbCmdCustomPlay,
+ EPbCmdRetrieveBufferingPercentage
+};
+
+enum TMPXGeneralError
+{
+ KMPXVideoCallOngoingError = 1,
+ KMPXVideoPlayOver2GDuringVoiceCallError,
+ KMPXVideoTvOutPlaybackNotAllowed,
+ KMPXVideoTvOutPlaybackNotAllowedClose,
+
+ KMPXPluginError
+};
+
+
+//
+// Content ID identifying video display window category of content provided
+// in the media object and associated attributes.
+//
+const TInt KMPXMediaIdVideoDisplayMessage = 0x20024333;
+
+//
+// TInt for Command Id
+//
+const TMPXAttributeData KMPXMediaVideoDisplayCommand = { KMPXMediaIdVideoDisplayMessage, 0x01 };
+
+//
+// TSurfaceId
+//
+const TMPXAttributeData KMPXMediaVideoDisplayTSurfaceId = { KMPXMediaIdVideoDisplayMessage, 0x02 };
+
+//
+// TRect
+//
+const TMPXAttributeData KMPXMediaVideoDisplayCropRect = { KMPXMediaIdVideoDisplayMessage, 0x04 };
+
+//
+// TVideoAspectRatio
+//
+const TMPXAttributeData KMPXMediaVideoDisplayAspectRatio = { KMPXMediaIdVideoDisplayMessage, 0x08 };
+
+enum TMPXVideoDisplayCommand
+{
+ EPbMsgVideoSurfaceCreated,
+ EPbMsgVideoSurfaceChanged,
+ EPbMsgVideoSurfaceRemoved
+};
+
+
+#endif
+
+// EOF
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoplayer_constants_api/inc/vcxmyvideosdefs.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,1045 @@
+/*
+* Copyright (c) 2008 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: Definitions for My Videos*
+*/
+
+
+
+
+
+#ifndef VCXMYVIDEOSDEFS_H
+#define VCXMYVIDEOSDEFS_H
+
+#include <e32base.h>
+#include <mpxattribute.h>
+#include <mdeconstants.h>
+#include <mpxcollectionpath.h>
+
+/**
+* My Videos Collection category IDs.
+* MPX ID has this as iId1 member and 1 as iId2.
+* These are same as indexes in path.
+*/
+const TInt KVcxMvcCategoryIdAll = 0;
+const TInt KVcxMvcCategoryIdDownloads = 1;
+const TInt KVcxMvcCategoryIdTvRecordings = 2;
+const TInt KVcxMvcCategoryIdCaptured = 3;
+const TInt KVcxMvcCategoryIdOther = 4;
+
+/**
+* Same as KIptvUrlMaxLength in IptvUtil.h.
+* Comment copied from IptvUtil.h:
+* As far as I know url specification allows url to be as big as 2048, but
+* S60 (v3.1/w31) download manager crashes if url length goes somewhere around
+* 1200-1400 so we need to limit it here. If someone finds out that
+* download manager get fixed please feel free to change value to 2048
+*/
+const TInt KVcxMvcMaxUrlLength = 1024;
+
+/**
+* Content ID (UID) identifying My Videos category of content provided
+* in the media object and associated attributes.
+*/
+const TInt KVcxMediaIdMyVideos = 0x20016B9D;
+
+// real values!!
+const TInt KVcxNsMpxMediatorDomain = 0x20016B9D;
+const TInt KVcxNsMpxMediatorCategory = 0x1;
+const TInt KVcxNsMpxEventDownloadStarted = 0x1;
+const TInt KVcxNsMpxEventAllDownloadsEnded = 0x2;
+const TInt KVcxNsMpxEventDownloadCompleted = 0x4;
+const TInt KVcxNsMpxEventNewVideosCountDecreased = 0x5;
+const TInt KVcxNsMpxEventResetDownloadNotification = 0x6;
+const TInt KVcxNsMpxEventVersion = 1;
+typedef enum // Video flags
+ {
+ EVcxMyVideosVideoNew = (1 << 0), // New video flag.
+ EVcxMyVideosVideoScheduledDownload = (1 << 1), // Scheduled flag, not downloaded yet.
+ EVcxMyVideosVideoDeleteWarning = (1 << 2), // Deletion warning flag.
+ EVcxMyVideosVideoProtected = (1 << 3), // Protection flag.
+ EVcxMyVideosVideoDrmProtected = (1 << 4), // DRM protection flag.
+ EVcxMyVideosVideoMemoryCard = (1 << 5), // Video located at the memorycard flag.
+ EVcxMyVideosVideoPreview = (1 << 6), // Preview, not full clip.
+ EVcxMyVideosVideoRecPartiallyFailed = (1 << 7), // Recording partially failed // DUPLICATE in harvesterrtpmetadatarader.h : do not change this!
+ EVcxMyVideosVideoRecFailed = (1 << 8), // Recording failed // DUPLICATE in harvesterrtpmetadatarader.h : do not change this!
+ EVcxMyVideosServiceHasReadOnlyIap = (1 << 9),
+ EVcxMyVideosSilent = (1 << 10) // Set to indicate that there is no UI present, used in KVcxCommandMyVideosStartDownload command only
+ } TVcxMyVideosVideoFlags;
+
+/**
+* Values for KVcxMediaMyVideosDownloadState attribute.
+*/
+typedef enum
+ {
+ EVcxMyVideosDlStateNone,
+ EVcxMyVideosDlStateDownloading,
+ EVcxMyVideosDlStateFailed,
+ EVcxMyVideosDlStatePaused,
+
+ /*
+ * Collection updates media object to this state only once when the downloaded event occurs.
+ * Later when the collection is opened the downloaded state is not in the MPX/MDS object anymore.
+ * It is clients responsiblity to keep track whether MPX/MDS item is downloaded or not.
+ * Client should do that by saving MDS ID and remote URL pairs. If the saved MDS ID is found from the
+ * collection and download ID(KVcxMediaMyVideosDownloadId) is 0, then the item is downloaded.
+ * If MDS ID is found and download ID != 0, then download state (KVcxMediaMyVideosDownloadState)
+ * has a valid value in collection.
+ */
+ EVcxMyVideosDlStateDownloaded
+ } TVcxMyVideosDownloadState;
+
+/**
+* Values for KVcxMediaMyVideosOrigin attribute. Currently this is exactly the
+* same as MDS Origin attribute. EVcxMyVideosOriginSideLoaded is treated like
+* EVcxMyVideosOriginOther in My Videos collection plugin, ie side loaded
+* videos are cathegorized as "other".
+*/
+typedef enum
+ {
+ EVcxMyVideosOriginOther = MdeConstants::Object::EOther,
+ EVcxMyVideosOriginCapturedWithCamera = MdeConstants::Object::ECamera,
+ EVcxMyVideosOriginDownloaded = MdeConstants::Object::EDownloaded,
+ EVcxMyVideosOriginSideLoaded = MdeConstants::Object::ESideLoaded,
+ EVcxMyVideosOriginTvRecording = MdeConstants::Object::ERecorded
+ } TVcxMyVideosOrigin;
+
+const TInt KVcxMyVideosCollectionCenrepUid = 0x2001B2A9;
+const TInt KVcxMyVideosCollectionCenrepKeySortingOrder = 0x01;
+
+const TInt KVcxMyVideosCenRepUid = 0x102750E2; // same as KIptvCenRepUid in CIptvUtil.h
+const TInt KVcxMyVideosCenRepPreferredMemoryKey = 0x01; // same as KIptvCenRepPreferredMemoryKey in CIptvUtil.h
+const TInt KVcxMyvideosCenRepParentControlKey = 0xC; // same as KIptvCenRepParentControlKey in CIptvUtil.h
+const TInt KVcxMyvideosCenRepParentControlKeyOff = 0; // same as KIptvCenRepParentControlKeyOff in CIptvUtil.h
+const TInt KVcxMyvideosCenRepParentControlKeyDefault = KVcxMyvideosCenRepParentControlKeyOff; // same as KIptvCenRepParentControlKeyDefault in CIptvUtil.h
+
+/**
+* Sorting order, this value is written to Cenrep.
+* UID = KVcxMyVideosCollectionCenrepUid
+* Key = KVcxMyVideosCollectionCenrepKeySortingOrder
+*/
+enum TVcxMyVideosSortingOrder
+ {
+ EVcxMyVideosSortingNone,
+ EVcxMyVideosSortingId, //not supported, results can be anything
+ EVcxMyVideosSortingCreationDate,
+ EVcxMyVideosSortingModified, // not supported, results can be anything
+ EVcxMyVideosSortingName,
+ EVcxMyVideosSortingSize
+ };
+
+/**
+* These values are written to EMPXItemModified events (KVcxMediaMyVideosInt32Value attribute)
+* to give extra information about the event.
+*/
+enum TVcxMyVideosEventInfo
+ {
+ EVcxMyVideosListNoInfo,
+
+ /**
+ * This is sent for a container item, it indicates that the list under
+ * the container has changed greatly ( order changed or items added or
+ * removed so many that the new list has to be fetched).
+ * If UI is showing the list under the container which receives this event,
+ * UI must fetch new list by calling OpenL().
+ */
+ EVcxMyVideosVideoListOrderChanged
+ };
+
+//
+// These are the general attributes used in My Videos media object.
+// "(BRIEF)" means that this field is filled when requesting list of videos from
+// collection (using OpenL method). Other than "BRIEF" fields must be requested
+// separately with MediaL method.
+//
+
+/**
+* 1. (BRIEF)
+* MPX ID, TMPXItemId.
+* ID of the item.
+* If iId2 member != 0, then the item is category (=container).
+* If iId2 member == 0, then the item is media object and iId1 member is MDS ID.
+* TMPXItemId::iId1 member is saved to MDS. Ready only.
+*/
+//KMPXMediaGeneralId
+
+/**
+* 2. (BRIEF)
+* Descriptor, contains video name.
+* Saved to MDS.
+*/
+//KMPXMediaGeneralTitle
+
+/**
+* 3. (FULL)
+* Descriptor, description of the video.
+* Saved to MDS.
+*/
+//KMPXMediaGeneralComment
+
+/**
+* 4. (BRIEF)
+* Descriptor. File path.
+* Saved to MDS.
+*/
+//KMPXMediaGeneralUri
+
+/**
+* 5. (BRIEF)
+* This should be made TUint32
+* TInt, size in bytes.
+* Obsolete, use KMPXMediaGeneralExtSizeInt64 instead.
+*/
+//KMPXMediaGeneralSize
+
+/**
+* 6. (BRIEF)
+* TTime.Int64(). Storing as TTime instead TInt64
+* will result in compilation warning.
+* If video item, contains creation date of the item.
+* if category, contains New Video item's creation date.
+* Ready only.
+*/
+//KMPXMediaGeneralDate
+
+/**
+* 7. (BRIEF)
+* Flags, TUint32, see TMpxMyVideosVideoFlags for values.
+* Saved to MDS.
+*/
+//KMPXMediaGeneralFlags
+
+/**
+* 8. (FULL)
+* Descriptor, copyright information.
+* Saved to MDS.
+*/
+//KMPXMediaGeneralCopyright
+
+/**
+* 9. (FULL)
+* Descriptor
+* Saved to MDS. Ready only.
+*/
+//KMPXMediaGeneralMimeType
+
+/**
+ * 10. (FULL)
+ * TInt, last playback position.
+ * Saved to MDS.
+ */
+//KMPXMediaGeneralLastPlaybackPosition
+
+/**
+ * 10.1 (FULL)
+ * TInt, clip bitrate
+ * Saved to MDS.
+ */
+//KMPXMediaVideoBitRate
+
+/**
+* 11. (BRIEF)
+* TInt64, size in bytes.
+* Saved to MDS.
+*/
+//KMPXMediaGeneralExtSizeInt64
+
+//
+// Here are My Videos Collection specific attributes:
+// "(BRIEF)" means that this field is filled when requesting list of videos from
+// collection. Other fields must be requested separately with Media requests.
+//
+
+/**
+* 12. (FULL)
+* TTime.Int64(). Storing as TTime instead TInt64
+* will result in compilation warning.
+* Modified date.
+* Saved to MDS.
+*/
+const TMPXAttributeData KVcxMediaMyVideosModifiedDate = {KVcxMediaIdMyVideos, 1 << 0};
+
+/**
+ * 13. (BRIEF)
+ * TInt32, Age profile / rating age.
+ * Saved to MDS.
+ */
+const TMPXAttributeData KVcxMediaMyVideosAgeProfile = {KVcxMediaIdMyVideos, 1 << 1};
+
+/**
+ * 14. (FULL)
+ * Descriptor
+ * Saved to MDS.
+ */
+const TMPXAttributeData KVcxMediaMyVideosAudioLanguage = {KVcxMediaIdMyVideos, 1 << 2};
+
+/**
+ * 15. (FULL)
+ * Descriptor
+ * Saved to MDS.
+ */
+const TMPXAttributeData KVcxMediaMyVideosAuthor = {KVcxMediaIdMyVideos, 1 << 3};
+
+/**
+ * 16. (BRIEF)
+ * TUint8, The origin of the object, see values from TVcxMyVideosOrigin.
+ * Saved to MDS.
+ */
+const TMPXAttributeData KVcxMediaMyVideosOrigin = {KVcxMediaIdMyVideos, 1 << 4};
+
+/**
+ * 17. (BRIEF)
+ * TReal32, duration of the video (play time).
+ * KMPXMediaGeneralDuration can't be used since it is TInt.
+ * Saved to MDS.
+ */
+const TMPXAttributeData KVcxMediaMyVideosDuration = {KVcxMediaIdMyVideos, 1 << 5};
+
+/**
+ * 18. (BRIEF)
+ * TUint32. Download ID in Download Manager, 0 means none.
+ * Saved to MDS.
+ */
+const TMPXAttributeData KVcxMediaMyVideosDownloadId = {KVcxMediaIdMyVideos, 1 << 6};
+
+/**
+ * 19. (BRIEF)
+ * TUint8. Rating.
+ * Saved to MDS.
+ */
+const TMPXAttributeData KVcxMediaMyVideosRating = {KVcxMediaIdMyVideos, 1 << 7};
+
+/**
+ * 20. (BRIEF)
+ * TUint32.
+ * Saved to MDS.
+ */
+const TMPXAttributeData KVcxMediaMyVideosAudioFourCc = {KVcxMediaIdMyVideos, 1 << 8};
+
+/**
+ * 21. (BRIEF)
+ * Descriptor. KMPXMediaGeneralUri contains local filename and this has the
+ * remote url.
+ * Not saved to MDS, only used in downloading.
+ */
+const TMPXAttributeData KVcxMediaMyVideosRemoteUrl = {KVcxMediaIdMyVideos, 1 << 9};
+
+/**
+ * 22. (BRIEF)
+ * TUint8, download state, see values from TVcxMyVideosDownloadState.
+ * Not saved to MDS, only used in downloading.
+ */
+const TMPXAttributeData KVcxMediaMyVideosDownloadState = {KVcxMediaIdMyVideos, 1 << 10};
+
+/**
+ * 23.
+ * TUint32, IAP ID in CommsDb.
+ * Not saved to MDS, only used in downloading.
+ */
+const TMPXAttributeData KVcxMediaMyVideosIapId = {KVcxMediaIdMyVideos, 1 << 11};
+
+/**
+ * 24.
+ * Descriptor. Username. This is used in KVcxCommandMyVideosStartDownload only.
+ * Client gets the value from services database.
+ * Not saved to MDS, only used in downloading.
+ */
+const TMPXAttributeData KVcxMediaMyVideosUsername = {KVcxMediaIdMyVideos, 1 << 12};
+
+/**
+ * 25.
+ * Descriptor. Password. This is used in KVcxCommandMyVideosStartDownload only.
+ * Client gets the value from services database.
+ * Not saved to MDS, only used in downloading.
+ */
+const TMPXAttributeData KVcxMediaMyVideosPassword = {KVcxMediaIdMyVideos, 1 << 13};
+
+/**
+ * 26.
+ * TUint32. My Videos command/message ID. Used when sending commands to my videos collection
+ * and when collection sends messages to client.
+ * KMPXCommandGeneralId contains KVcxCommandIdMyVideos.
+ * KVcxMediaMyVideosCommandId contains the operation ID.
+ * Not saved to MDS.
+ */
+const TMPXAttributeData KVcxMediaMyVideosCommandId = {KVcxMediaIdMyVideos, 1 << 14};
+
+/**
+ * 27.
+ * TInt8. Download progress. My Videos collection updates this value when download is
+ * active. Note that collection does not send events when progress is changed. User
+ * should read the value frequently when download is progressing.
+ * Not saved to MDS, only used in downloading.
+ */
+const TMPXAttributeData KVcxMediaMyVideosDownloadProgress = {KVcxMediaIdMyVideos, 1 << 15};
+
+/**
+ * 28.
+ * TUint32, This attribute is only used in category items. Indicates how many items are under it.
+ * Not saved to MDS.
+ */
+const TMPXAttributeData KVcxMediaMyVideosCategoryItemCount = {KVcxMediaIdMyVideos, 1 << 16};
+
+/**
+ * 29.
+ * TUint32. This attribute is only used in category items. Indicates how many new items are under it.
+ * Not saved to MDS.
+ */
+const TMPXAttributeData KVcxMediaMyVideosCategoryNewItemCount = {KVcxMediaIdMyVideos, 1 << 17};
+
+/**
+ * 30.
+ * TUint32. Identifies collection message, used for debugging. Collection increases the ID by
+ * one every time a message is sent. If client detects that ID has increased more than by one
+ * since the last message, it knows that a message has been lost.
+ * Not saved to MDS.
+ */
+const TMPXAttributeData KVcxMediaMyVideosMessageId = {KVcxMediaIdMyVideos, 1 << 18};
+
+/**
+ * 31.
+ * TInt32. When download fails, the reason is stored here. See possible values from
+ * HttpDownloadMgrCommon.h THttpDownloadMgrError type.
+ * Not saved to MDS.
+ */
+const TMPXAttributeData KVcxMediaMyVideosDownloadError = {KVcxMediaIdMyVideos, 1 << 19};
+
+/**
+ * 32.
+ * TInt32. When download fails, the global reason is stored here. See possible values from
+ * HttpDownloadMgrCommon.h EDlAttrGlobalErrorId.
+ * Not saved to MDS.
+ */
+const TMPXAttributeData KVcxMediaMyVideosDownloadGlobalError = {KVcxMediaIdMyVideos, 1 << 20};
+
+/**
+ * 33.
+ * Descriptor. Name of the latest non watched item. Used only in categories.
+ * Not saved to MDS.
+ */
+const TMPXAttributeData KVcxMediaMyVideosCategoryNewItemName = {KVcxMediaIdMyVideos, 1 << 21};
+
+/**
+ * 34.
+ * TInt32, general parameter, the usage depends on context.
+ * Not saved to MDS
+ */
+const TMPXAttributeData KVcxMediaMyVideosInt32Value = {KVcxMediaIdMyVideos, 1 << 22};
+
+/**
+ * 35.
+ * TUint32, transaction ID, client sets this field when making asynchronous request.
+ * Collection sets the same ID to response messages. Client can use this to pair
+ * requests and responses.
+ * Not saved to MDS
+ */
+const TMPXAttributeData KVcxMediaMyVideosTransactionId = {KVcxMediaIdMyVideos, 1 << 23};
+
+
+
+// -------- end of my videos media attributes -------- //
+
+/*
+* Unique ID for My Videos collection commands and messages, this is set to KMPXCommandGeneralId
+* field in CMPXCommand and CMPXMessage classes.
+*/
+const TUint KVcxCommandIdMyVideos = 0x20016BA0;
+
+/**
+* My Videos command and message IDs. These
+* are set to KVcxMediaMyVideosCommandId attribute, in both
+* CMPXCommand and CMPXMessage classes.
+*/
+const TInt KVcxCommandMyVideosStartDownload = 0;
+const TInt KVcxCommandMyVideosCancelDownload = 1;
+const TInt KVcxCommandMyVideosResumeDownload = 2;
+const TInt KVcxCommandMyVideosPauseDownload = 3;
+const TInt KVcxCommandMyVideosGetMediaFullDetailsByMpxId = 4; //async
+const TInt KVcxCommandMyVideosGetMediasByMpxId = 5; //async
+const TInt KVcxCommandMyVideosMove = 6; //async
+const TInt KVcxCommandMyVideosCopy = 7; //async
+const TInt KVcxCommandMyVideosDelete = 8; //async
+
+/** This command cancels the move or copy operation only if it
+ * is allready being processed by the collection plugin. If the
+ * command is still in queue, this cancel has no effect.
+ * If Move or Copy operations were not in progress the command
+ * leaves with KErrNotFound.
+ */
+const TInt KVcxCommandMyVideosCancelMoveOrCopy = 9; //sync
+
+/** This command cancels the delete operation only if it
+ * is allready being processed by the collection plugin. If the
+ * command is still in queue, this cancel has no effect.
+ * If delete operation was not in progress the command
+ * leaves with KErrNotFound.
+ */
+const TInt KVcxCommandMyVideosCancelDelete = 10; //sync
+
+const TInt KVcxMessageMyVideosGetMediasByMpxIdResp = 11;
+
+/**
+* Collection sends this message when new items are added
+* to the end of the collection plugins cache. If client has not yet received
+* KVcxMessageMyVideosListComplete event, then the media list received with
+* previous HandleOpen contains already the new items at the end of the list.
+* Client can draw them immedetially. However client must still do a new OpenL()
+* call to keep collection frameworks path variable updated.
+* KVcxMessageMyVideosItemsAppended and KVcxMessageMyVideosListComplete events
+* are broadcasted to all clients. So they might appear even when client hasn't
+* done OpenL.
+*/
+const TInt KVcxMessageMyVideosItemsAppended = 12; //event
+
+/**
+* Collection sends this message when media list fetching has ended
+* and no more KVcxMessageMyVideosItemsAppended events will be sent.
+* Collection also cuts off the shared memory connection to video lists
+* between clients and collection. Ie, if new KVcxMessageMyVideosItemsAppended
+* events arrive after this event, the client knows that they are not automatically
+* in the list it had received earlier (unless client itself initiated the new fetching
+* by calling OpenL().
+*/
+const TInt KVcxMessageMyVideosListComplete = 13; //event
+
+/* Collection sends this message when it starts processing
+ * Move Or Copy command. When this event is received,
+ * KVcxCommandMyVideosCancelMoveOrCopy can be sent.
+ */
+const TInt KVcxMessageMyVideosMoveOrCopyStarted = 14; //event
+
+/* Collection sends this message when it starts processing
+ * KVcxCommandMyVideosDelete command. After this event is received,
+ * KVcxCommandMyVideosCancelDelete can be sent.
+ */
+const TInt KVcxMessageMyVideosDeleteStarted = 15; //event
+
+/* End events for Move/Copy/Delete operations. The response contains
+ * MDS ID and error codes for each item.
+ */
+const TInt KVcxMessageMyVideosMoveResp = 16; //event
+const TInt KVcxMessageMyVideosCopyResp = 17; //event
+const TInt KVcxMessageMyVideosDeleteResp = 18; //event
+
+/**
+* Indicates that media array variable contains other messages.
+* This message is only sent as the highest level item in the message tree.
+*/
+const TInt KVcxMessageMyVideosMessageArray = 19;
+
+/*
+ OpenL() (video list) MSC
+ ------------------------
+ Opening the collection is quite complicated due the fact that it allows multiple clients to open
+ video list at the same time. The scenario described below involves video list fetching from MDS. If the collection
+ has the video list already fetched, then the HandleOpenL will contain all videos and KVcxMessageMyVideosListComplete
+ is received immedetially.
+
+ KVcxMessageMyVideosItemsAppended and KVcxMessageMyVideosListComplete events concern only video lists.
+ Category level always returns all categories at HandleOpenL.
+
+ .------. .-------------------------.
+ |CLIENT| |MPX My Videos Collection |
+ '------' '-------------------------'
+ | |
+ | |
+iCollectionUtility->Collection().OpenL() |
+ |--------------------------------------------------------------------------------->|
+ | |
+ | HandleOpenL(const CMPXMedia& aEntries) |
+ | This is returned immedetially by the collection, the list might be empty. |
+ | Client should prevent all calls which cause access to MDS, until |
+ | KVcxMessageMyVideosListComplete event is received. This is due the fact that |
+ | MDS fails commands when there is video list fetching going on. |
+ |<---------------------------------------------------------------------------------|
+ | |
+ | |
+ | HandleCollectionMessage( CMPXMessage* aMessage, TInt aError ) |
+ | aMessage contains: |
+ | KMPXMessageGeneralId = KVcxCommandIdMyVideos |
+ | KVcxMediaMyVideosCommandId = KVcxMessageMyVideosItemsAppended |
+ | KMPXMessageCollectionId = KVcxUidMyVideosMpxCollection |
+ | |
+ | At this point the new items are at the end of aEntries received earlier with |
+ | "HandleOpenL". |
+ |<---------------------------------------------------------------------------------|
+ | |
+ | |
+ | |
+ | HandleCollectionMessage( CMPXMessage* aMessage, TInt aError ) |
+ | aMessage contains: |
+ | KMPXMessageGeneralId = KVcxCommandIdMyVideos |
+ | KVcxMediaMyVideosCommandId = KVcxMessageMyVideosListComplete |
+ | KMPXMessageCollectionId = KVcxUidMyVideosMpxCollection |
+ | |
+ | The shared memory link between collection video list and list received |
+ | by the client is cut off. Single video media items still point to same shared |
+ | memory. |
+ | |
+ | If new KVcxMessageMyVideosItemsAppended events arrive |
+ | after this point (without client doing OpenL()), it means that someone else |
+ | changed sorting order and started fetching new video list. |
+ | In that case this client should also fetch new list by calling OpenL(). |
+ |<---------------------------------------------------------------------------------|
+ | |
+ | |
+
+
+ DOWNLOAD START MSC
+ ------------------
+
+ In future download request parameters can be made to contain media array of download parameters,
+ allowing multiple downloads. Currently it is not supported.
+
+ .------. .-------------------------.
+ |CLIENT| |MPX My Videos Collection |
+ '------' '-------------------------'
+ | |
+ | |
+iCollectionUtility->Collection().CommandL( *downloadStartCommand ) |
+ |
+downloadStartCommand (CMPXCommand type) contains: |
+ KMPXCommandGeneralId = KVcxCommandIdMyVideos |
+ KVcxMediaMyVideosCommandId = KVcxCommandMyVideosStartDownload |
+ KMPXCommandGeneralCollectionId = KVcxUidMyVideosMpxCollection |
+ KMPXCommandColAddMedia = Download request parameters (CMPXMedia type) |
+ Download request parameters CMPXMedia type) contains: |
+ KVcxMediaMyVideosIapId = IAP ID |
+ KVcxMediaMyVideosUsername = User name |
+ KVcxMediaMyVideosPassword = Password |
+ KMPXMediaGeneralFlags = EVcxMyVideosServiceHasReadOnlyIap|EVcxMyVideosSilent |
+ KVcxMediaMyVideosRemoteUrl = Remote URL |
+ KMPXMediaGeneralTitle = Video title |
+ |--------------------------------------------------------------------------------->|
+ | |
+ | |
+ | HandleCommandComplete(downloadStartCommand, FAIL/SUCCESS) |
+ |<---------------------------------------------------------------------------------|
+ | |
+ | |
+ | |
+ | HandleCollectionMessage( CMPXMessage* aMessage, TInt aError ) |
+ | |
+ | aMessage contains: |
+ | KMPXMessageGeneralId = KMPXMessageIdItemChanged |
+ | KMPXMessageChangeEventType = EMPXItemInserted |
+ | KMPXMessageCollectionId = KVcxUidMyVideosMpxCollection |
+ | KMPXMessageMediaGeneralId = MPX ID |
+ | |
+ | The corresponding media object contains: |
+ | KMPXMediaGeneralId = MPX ID |
+ | KMPXMediaGeneralUri = Local file path |
+ | KVcxMediaMyVideosRemoteUrl = Remote URL |
+ |<---------------------------------------------------------------------------------|
+ | |
+ | |
+ | |
+ | |
+ | HandleCollectionMessage( CMPXMessage* aMessage, TInt aError ) |
+ | |
+ | aMessage contains: |
+ | KMPXMessageGeneralId = KMPXMessageIdItemChanged |
+ | KMPXMessageChangeEventType = EMPXItemModified |
+ | KMPXMessageCollectionId = KVcxUidMyVideosMpxCollection |
+ | KMPXMessageMediaGeneralId = MPX ID |
+ | |
+ | The corresponding media object contains: |
+ | KMPXMediaGeneralId = MPX ID |
+ | KVcxMediaMyVideosDownloadState = Download state |
+ | KVcxMediaMyVideosDownloadId = Download ID |
+ |<---------------------------------------------------------------------------------|
+ | |
+ | |
+
+
+
+DOWNLOAD CANCEL MSC
+-------------------
+
+ .------. .-------------------------.
+ |CLIENT| |MPX My Videos Collection |
+ '------' '-------------------------'
+ | |
+ | |
+iCollectionUtility->Collection().CommandL( *cancelDownloadCommand ) |
+ |
+cancelDownloadCommand (CMPXCommand type) contains: |
+ KMPXCommandGeneralId = KVcxCommandIdMyVideos |
+ KVcxMediaMyVideosCommandId = KVcxCommandMyVideosCancelDownload |
+ KMPXCommandGeneralCollectionId = KVcxUidMyVideosMpxCollection |
+ KMPXCommandColAddMedia = Cancel download request parameters (CMPXMedia type) |
+ Cancel download request parameters (CMPXMedia type) contains: |
+ KMPXMediaGeneralId = MPX ID |
+ KVcxMediaMyVideosDownloadId = download ID |
+ KMPXMediaGeneralUri = file path |
+ |--------------------------------------------------------------------------------->|
+ | |
+ | |
+ | HandleCommandComplete(cancelDownloadCommand, TInt aError ) |
+ | aError is != KErrNone if either dl object (in Download Manager), file or |
+ | MPX object was left to system. |
+ |<---------------------------------------------------------------------------------|
+ | |
+ | |
+ | |
+ | HandleCollectionMessage( CMPXMessage* aMessage, TInt aError ) |
+ | |
+ | aMessage contains: |
+ | KMPXMessageGeneralId = KMPXMessageIdItemChanged |
+ | KMPXMessageChangeEventType = EMPXItemDeleted |
+ | KMPXMessageCollectionId = KVcxUidMyVideosMpxCollection |
+ | KMPXMessageMediaGeneralId = MPX ID |
+ | |
+ | The corresponding media object is gone |
+ |<---------------------------------------------------------------------------------|
+ | |
+
+
+GET MEDIA FULL DETAILS BY MPX ID MSC
+------------------------------------
+
+Fetches media full details from MDS using MPX ID.
+
+
+ .------. .-------------------------.
+ |CLIENT| |MPX My Videos Collection |
+ '------' '-------------------------'
+ | |
+ | |
+ | |
+iCollectionUtility->Collection().CommandL( *getMediaFullDetailsByMpxIdCommand ) |
+ |
+getMediaFullDetailsByMpxIdCommand (CMPXCommand type) contains: |
+ KMPXCommandGeneralId = KVcxCommandIdMyVideos |
+ KVcxMediaMyVideosCommandId = KVcxCommandMyVideosGetMediaFullDetailsByMpxId |
+ KMPXMediaGeneralId = MPX ID (item to fetch) |
+ |--------------------------------------------------------------------------------->|
+ | |
+ | |
+ | HandleCommandComplete(getMediaFullDetailsByMpxIdCommand, FAIL/SUCCESS) |
+ | |
+ | getMediaFullDetailsByMpxIdCommand contains: |
+ | KVcxMediaMyVideosCommandId = KVcxMessageMyVideosGetMediaFullDetailsByMpxId |
+ | KMPXCommandColAddMedia = The fetched video (CMPXMedia* type) |
+ | Contains also all the same data which was sent in getMediaFullDetailsByMpxIdCommand.
+ | On failure the KMPXCommandColAddMedia is not supported |
+ |<---------------------------------------------------------------------------------|
+ | |
+
+GET MEDIAS BY MPX ID MSC
+------------------------
+
+ This command loads requested MDS items to MPX My Videos collection cache and returns the requested
+ items to the client ( subset of the cache ).
+
+ .------. .-------------------------.
+ |CLIENT| |MPX My Videos Collection |
+ '------' '-------------------------'
+ | |
+ | |
+ | |
+iCollectionUtility->Collection().CommandL( *getMediasByMpxIdCommand ) |
+ |
+getMediasByMpxIdCommand (CMPXCommand type) contains: |
+ KMPXCommandGeneralId = KVcxCommandIdMyVideos |
+ KVcxMediaMyVideosCommandId = KVcxCommandMyVideosGetMediasByMpxId |
+ KMPXCommandGeneralCollectionId = KVcxUidMyVideosMpxCollection |
+ KMPXMediaArrayContents = Media array (CMPXMediaArray) |
+ Media array contains array of CMPXMedia objects which contain: |
+ KMPXMessageMediaGeneralId = MPX ID |
+ |--------------------------------------------------------------------------------->|
+ | |
+ | |
+ | HandleCommandComplete(getMediasByMpxIdCommand, FAIL/SUCCESS) |
+ |<---------------------------------------------------------------------------------|
+ | |
+ | |
+ | HandleCollectionMessage( CMPXMessage* aMessage, TInt aError ) |
+ | |
+ | aMessage contains: |
+ | KMPXCommandGeneralId = KVcxCommandIdMyVideos |
+ | KVcxMediaMyVideosCommandId = KVcxMessageMyVideosGetMediasByMpxIdResp |
+ | KMPXMediaArrayContents = Media array (CMPXMediaArray) |
+ | KMPXMessageCollectionId = KVcxUidMyVideosMpxCollection |
+ |<---------------------------------------------------------------------------------|
+ | |
+
+DOWNLOAD PAUSE MSC
+-------------------
+
+ .------. .-------------------------.
+ |CLIENT| |MPX My Videos Collection |
+ '------' '-------------------------'
+ | |
+ | |
+iCollectionUtility->Collection().CommandL( *pauseDownloadCommand ) |
+ |
+cancelDownloadCommand (CMPXCommand type) contains: |
+ KMPXCommandGeneralId = KVcxCommandIdMyVideos |
+ KVcxMediaMyVideosCommandId = KVcxCommandMyVideosPauseDownload |
+ KMPXCommandGeneralCollectionId = KVcxUidMyVideosMpxCollection |
+ KVcxMediaMyVideosDownloadId = download id |
+ |--------------------------------------------------------------------------------->|
+ | |
+ | |
+ | HandleCommandComplete(pauseDownloadCommand, FAIL/SUCCESS) |
+ |<---------------------------------------------------------------------------------|
+ | |
+ | |
+ | |
+ | HandleCollectionMessage( CMPXMessage* aMessage, TInt aError ) |
+ | |
+ | aMessage contains: |
+ | KMPXMessageGeneralId = KMPXMessageIdItemChanged |
+ | KMPXMessageChangeEventType = EMPXItemModified |
+ | KMPXMessageCollectionId = KVcxUidMyVideosMpxCollection |
+ | KMPXMessageMediaGeneralId = MPX ID |
+ |<---------------------------------------------------------------------------------|
+ | |
+
+DOWNLOAD RESUME MSC
+-------------------
+
+ .------. .-------------------------.
+ |CLIENT| |MPX My Videos Collection |
+ '------' '-------------------------'
+ | |
+ | |
+iCollectionUtility->Collection().CommandL( *downloadStartCommand ) |
+ |
+downloadStartCommand (CMPXCommand type) contains: |
+ KMPXCommandGeneralId = KVcxCommandIdMyVideos |
+ KVcxMediaMyVideosCommandId = KVcxCommandMyVideosStartDownload |
+ KMPXCommandGeneralCollectionId = KVcxUidMyVideosMpxCollection |
+ KMPXCommandColAddMedia = Download request parameters (CMPXMedia type) |
+ Download request parameters (CMPXMedia type) contains: |
+ KVcxMediaMyVideosIapId = IAP ID |
+ KVcxMediaMyVideosUsername = User name |
+ KVcxMediaMyVideosPassword = Password |
+ KMPXMediaGeneralFlags = EVcxMyVideosServiceHasReadOnlyIap|EVcxMyVideosSilent |
+ KVcxMediaMyVideosDownloadId = Download ID |
+ |--------------------------------------------------------------------------------->|
+ | |
+ | |
+ | HandleCommandComplete(downloadStartCommand, FAIL/SUCCESS) |
+ |<---------------------------------------------------------------------------------|
+ | |
+ | |
+ | |
+ | HandleCollectionMessage( CMPXMessage* aMessage, TInt aError ) |
+ | |
+ | aMessage contains: |
+ | KMPXMessageGeneralId = KMPXMessageIdItemChanged |
+ | KMPXMessageChangeEventType = EMPXItemModified |
+ | KMPXMessageCollectionId = KVcxUidMyVideosMpxCollection |
+ | KMPXMessageMediaGeneralId = MPX ID |
+ | |
+ | The corresponding media object contains: |
+ | KMPXMediaGeneralId = MPX ID |
+ | KVcxMediaMyVideosDownloadState = Download state |
+ | KVcxMediaMyVideosDownloadId = Download ID |
+ |<---------------------------------------------------------------------------------|
+ | |
+ | |
+
+VIDEO ADD MSC
+-------------
+
+Currently only synchronous version is supported. Only one item can be added per call. This is currently
+available only for udeb builds for testing purposes. Urel will leave with KErrNotSupported.
+Does not make checks for duplicate items for the same filename. If urel version is required in a future,
+then the command should be asynchronous and perform necessarry checks.
+
+ .------. .-------------------------.
+ |CLIENT| |MPX My Videos Collection |
+ '------' '-------------------------'
+ | |
+ | |
+iCollectionUtility->Collection().CommandL( *videoAddCommand ) |
+ |
+videoAddCommand (CMPXCommand type) contains: |
+ KMPXCommandGeneralId = KMPXCommandIdCollectionAdd |
+ KMPXCommandGeneralCollectionId = 0x20016B97 |
+ KMPXCommandColAddMedia = media to be added (CMPXMedia type) |
+ KMPXCommandColAddMedia contains all or subset of parameters which are saved to MDS, |
+ other parameters are ignored. On return the KMPXCommandColAddMedia KMPXMediaGeneralId |
+ attribute contains the new MPX ID. |
+ |--------------------------------------------------------------------------------->|
+ | |
+ | |
+ | |
+ | HandleCollectionMessage( CMPXMessage aMessage, TInt aError ) |
+ | |
+ | aMessage contains: |
+ | KMPXMessageGeneralId = KMPXMessageIdItemChanged |
+ | KMPXMessageChangeEventType = EMPXItemInserted |
+ | KMPXMessageCollectionId = KVcxUidMyVideosMpxCollection |
+ | KMPXMessageMediaGeneralId = MPX ID |
+ |<---------------------------------------------------------------------------------|
+ | |
+
+VIDEO SET MSC
+-------------
+
+Currently only synchronous version is supported. Only one item can be modified per call.
+
+NOTE: Don't write directly to a media object fetched with OpenL(). Those objects are shared with collection.
+Instead create a new media object with CMPXMedia::NewL() and set the attributes you want to change.
+Set MPX ID of the modified item to KMPXMediaGeneralId attribute. It is used by the collection to find
+out which item will be modified. Set this media object to KMPXCommandColSetMedia attribute in CMPXCommand.
+
+ .------. .-------------------------.
+ |CLIENT| |MPX My Videos Collection |
+ '------' '-------------------------'
+ | |
+ | |
+iCollectionUtility->Collection().CommandL( *videoSetCommand ) |
+ |
+videoSetCommand (CMPXCommand type) contains: |
+ KMPXCommandGeneralId = KMPXCommandIdCollectionSet |
+ KMPXCommandGeneralCollectionId = 0x20016B97 |
+ KMPXCommandColSetMedia = media to be set (CMPXMedia type) |
+ Media to be set (CMPXMedia type) contains all or subset of parameters which are saved to MDS, |
+ other parameters are ignored. KMPXMediaGeneralId, KMPXMediaGeneralDate and |
+ KMPXMediaGeneralMimeType are read only parameters, they can't be modified either. |
+ Set values to attributes which are needed to change, that gives the best performance, ie |
+ don't make a copy of media item from collection, change something and use that. Instead create |
+ a new empty media item and set only values you wish to change. |
+ |--------------------------------------------------------------------------------->|
+ | |
+ | |
+ | |
+ | HandleCollectionMessage( CMPXMessage* aMessage, TInt aError ) |
+ | |
+ | aMessage contains: |
+ | KMPXMessageGeneralId = KMPXMessageIdItemChanged |
+ | KMPXMessageChangeEventType = EMPXItemModified |
+ | KMPXMessageCollectionId = KVcxUidMyVideosMpxCollection |
+ | KMPXMessageMediaGeneralId = MPX ID |
+ |<---------------------------------------------------------------------------------|
+ | |
+
+VIDEO MOVE MSC
+--------------
+
+ Copy is similar, only message ids are different.
+
+ .------. .-------------------------.
+ |CLIENT| |MPX My Videos Collection |
+ '------' '-------------------------'
+ | |
+ | |
+iCollectionUtility->Collection().CommandL( *videoMoveCommand ) |
+ |
+videoMoveCommand (CMPXCommand type) contains: |
+ KMPXCommandGeneralId = KVcxCommandMyVideosMove |
+ KMPXCommandGeneralCollectionId = 0x20016B97 |
+ KMPXCommandGeneralDoSync = EFalse |
+ KVcxMediaMyVideosInt32Value = Target Drive |
+ KVcxMediaMyVideosTransactionId = TR ID |
+ KMPXMediaArrayContents = Media array (CMPXMediaArray) |
+ Media array contains array of CMPXMedia objects which contain: |
+ KMPXMessageMediaGeneralId = MPX ID |
+ |--------------------------------------------------------------------------------->|
+ | |
+ | |
+ | |
+ | HandleCollectionMessage( CMPXMessage* aMessage, TInt aError ) |
+ | |
+ | aMessage contains: |
+ | KMPXMessageGeneralId = KVcxCommandIdMyVideos |
+ | KVcxMediaMyVideosCommandId = KVcxMessageMyVideosMoveOrCopyStarted |
+ | KMPXMessageCollectionId = KVcxUidMyVideosMpxCollection |
+ | KVcxMediaMyVideosTransactionId = TR ID |
+ |<---------------------------------------------------------------------------------|
+ | |
+ | |
+ | |
+ | |
+ | HandleCollectionMessage( CMPXMessage* aMessage, TInt aError ) |
+ | |
+ | aMessage contains: |
+ | KMPXMessageGeneralId = KVcxCommandIdMyVideos |
+ | KVcxMediaMyVideosCommandId = KVcxMessageMyVideosMoveResp |
+ | KMPXMessageCollectionId = KVcxUidMyVideosMpxCollection |
+ | KVcxMediaMyVideosTransactionId = TR ID |
+ | KMPXMediaArrayContents = Media array (CMPXMediaArray) |
+ | Media array contains array of CMPXMedia objects which contain: |
+ | KMPXMessageMediaGeneralId = MPX ID |
+ | KVcxMediaMyVideosInt32Value = result (system wide error code) |
+ |<---------------------------------------------------------------------------------|
+ | |
+ | HandleCommandComplete(videoMoveCommand, FAIL/SUCCESS) |
+ |<---------------------------------------------------------------------------------|
+
+
+VIDEO DELETE MSC
+----------------
+
+
+ .------. .-------------------------.
+ |CLIENT| |MPX My Videos Collection |
+ '------' '-------------------------'
+ | |
+ | |
+iCollectionUtility->Collection().CommandL( *videoDeleteCommand ) |
+ |
+videoDeleteCommand (CMPXCommand type) contains: |
+ KMPXCommandGeneralId = KVcxCommandMyVideosDelete |
+ KMPXCommandGeneralCollectionId = 0x20016B97 |
+ KMPXCommandGeneralDoSync = EFalse |
+ KVcxMediaMyVideosTransactionId = TR ID |
+ KMPXMediaArrayContents = Media array (CMPXMediaArray) |
+ Media array contains array of CMPXMedia objects which contain: |
+ KMPXMessageMediaGeneralId = MPX ID |
+ |--------------------------------------------------------------------------------->|
+ | |
+ | |
+ | |
+ | HandleCollectionMessage( CMPXMessage* aMessage, TInt aError ) |
+ | |
+ | aMessage contains: |
+ | KMPXMessageGeneralId = KVcxCommandIdMyVideos |
+ | KVcxMediaMyVideosCommandId = KVcxMessageMyVideosDeleteStarted |
+ | KMPXMessageCollectionId = KVcxUidMyVideosMpxCollection |
+ | KVcxMediaMyVideosTransactionId = TR ID |
+ |<---------------------------------------------------------------------------------|
+ | |
+ | |
+ | |
+ | |
+ | HandleCollectionMessage( CMPXMessage* aMessage, TInt aError ) |
+ | |
+ | aMessage contains: |
+ | KMPXMessageGeneralId = KVcxCommandIdMyVideos |
+ | KVcxMediaMyVideosCommandId = KVcxMessageMyVideosDeleteResp |
+ | KMPXMessageCollectionId = KVcxUidMyVideosMpxCollection |
+ | KVcxMediaMyVideosTransactionId = TR ID |
+ | KMPXMediaArrayContents = Media array (CMPXMediaArray) |
+ | Media array contains array of CMPXMedia objects which contain: |
+ | KMPXMessageMediaGeneralId = MPX ID |
+ | KVcxMediaMyVideosInt32Value = result (system wide error code) |
+ |<---------------------------------------------------------------------------------|
+ | |
+ | HandleCommandComplete(videoDeleteCommand, FAIL/SUCCESS) |
+ |<---------------------------------------------------------------------------------|
+
+
+CANCEL VIDEO DELETE MSC
+-----------------------
+
+
+*/
+
+#endif // VCXMYVIDEOSDEFS_H
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoplayer_constants_api/inc/vcxmyvideosuids.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,29 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+
+
+#ifndef VCXMYVIDEOSUIDS_H
+#define VCXMYVIDEOSUIDS_H
+
+/**
+* UID of My Videos MPX Collection.
+*/
+#define KVcxUidMyVideosMpxCollection 0x20016B97
+
+#endif // VCXMYVIDEOSUIDS_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoplayer_constants_api/inc/videoplayeruid.hrh Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,20 @@
+/*
+* Copyright (c) 2009 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: Video Player UID*
+*/
+
+
+// Version : %version: 2 %
+
+#define KVideoPlayerUID 0x200159B2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoplayer_constants_api/videoplayer_constants_api.metaxml Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" ?>
+<api id="21b87e81b29cc0ef90733f45855d411b" dataversion="1.0">
+<name>Videoplayer Constants API</name>
+<description>Constants used in Videoplayer components</description>
+<type>c++</type>
+<subsystem>videoserviceutils</subsystem>
+<libs></libs>
+<release category="domain" sinceversion=""/>
+<attributes>
+<htmldocprovided>no</htmldocprovided>
+<adaptation>no</adaptation>
+</attributes>
+</api>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,42 @@
+/*
+* Copyright (c) 2004-2005 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:
+*
+*/
+
+
+
+
+PRJ_PLATFORMS
+WINSCW ARMV5
+
+PRJ_EXPORTS
+// SchedulerClient
+../inc/ipvideo/CseEngineUids.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/CseEngineUids.h )
+../inc/ipvideo/CCseSchedulerAPI.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/CCseSchedulerAPI.h )
+../inc/ipvideo/RCseSchedulerClient.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/RCseSchedulerClient.h )
+../inc/ipvideo/RCseSchedulerService.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/RCseSchedulerService.h )
+../inc/ipvideo/RCseSchedulerServiceBase.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/RCseSchedulerServiceBase.h )
+../inc/ipvideo/CCseScheduledProgram.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/CCseScheduledProgram.h )
+../inc/ipvideo/CseSchedulerClientServerCommon.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/CseSchedulerClientServerCommon.h )
+
+// SchedulerServer
+../inc/ipvideo/CCseSchedulerPluginIF.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/CCseSchedulerPluginIF.h )
+../inc/ipvideo/CCseSchedulerPluginIF.inl MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/CCseSchedulerPluginIF.inl )
+../inc/ipvideo/MCseScheduleObserver.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/MCseScheduleObserver.h )
+../inc/ipvideo/MCsePluginObserver.h MW_LAYER_PLATFORM_EXPORT_PATH( ipvideo/MCsePluginObserver.h )
+
+
+PRJ_MMPFILES
+PRJ_TESTMMPFILES
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/inc/ipvideo/CCseScheduledProgram.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,286 @@
+/*
+* Copyright (c) 2006 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: This class contains data for scheduled programs.*
+*/
+
+
+#ifndef __CCSESCHEDULEDPROGRAM_H__
+#define __CCSESCHEDULEDPROGRAM_H__
+
+#include <e32def.h>
+#include <e32base.h>
+#include <s32strm.h>
+
+// CONSTANTS
+const TInt KCseNameMaxLength = 255; // Based on SymbianDB column max length
+
+/**
+* Scheduled program data.
+*/
+class CCseScheduledProgram : public CBase
+ {
+ public: // Constructors and destructors
+ /**
+ * Two-phased constructor.
+ */
+ IMPORT_C static CCseScheduledProgram* NewL();
+
+ /**
+ * Two-phased copy constructor.
+ */
+ IMPORT_C static CCseScheduledProgram* NewL( CCseScheduledProgram& aProg );
+
+ /**
+ * Destructor.
+ * @return None.
+ */
+ IMPORT_C virtual ~CCseScheduledProgram();
+
+
+ // Enums
+ // Schedule type
+ enum TCseScheduleType
+ {
+ ECseReminder = 0,
+ ECseRecording,
+ ECseProgramGuideUpdate,
+ ECseScheduleDownload,
+ ECseOther
+ };
+
+ // Plugin type:
+ enum TCsePluginType
+ {
+ // Only one of this kind of plugin can be running at same time
+ ECseUniPlugin = 1,
+ // Several of this kind of plugin can be running same time
+ ECseMultiPlugin
+ };
+ public: // New methods
+ /**
+ * Externalizes class content to stream.
+ * @param aStream Writestream where to write content
+ * @return None.
+ */
+ IMPORT_C void ExternalizeL( RWriteStream& aStream );
+
+ /**
+ * Internalizes class content from stream.
+ * @param aStream Readstream from where to read content
+ * @return None.
+ */
+ IMPORT_C void InternalizeL( RReadStream& aStream );
+
+ /**
+ * Calculates externalization length.
+ * @return Length of the stream needed when class is externalized.
+ */
+ IMPORT_C TInt ExternalizeLength();
+
+ public: // Setters
+
+ /**
+ * Sets new plugin type for schedule.
+ * EUniPlugin for plugins that can have only one running at a given time.
+ * EMultiPlugin for plugins that can have several running at a given time
+ * @param aPluginType New plugin type
+ */
+ IMPORT_C void SetPluginType( TInt32 aPluginType );
+
+ /**
+ * Sets new schedule name.
+ * @param aName New name of the schedule
+ */
+ IMPORT_C void SetName( const TDesC8& aName );
+
+ /**
+ * Sets new schedule start time.
+ * @param aStartTime New start time of the schedule
+ */
+ IMPORT_C void SetStartTime( const TTime& aStartTime );
+
+ /**
+ * Sets new schedule end time.
+ * @param aEndTime New end time of the schedule
+ */
+ IMPORT_C void SetEndTime( const TTime& aEndTime );
+
+ /**
+ * Sets new application uid for schedule.
+ * @param aAppUid New application uid of the schedule
+ */
+ IMPORT_C void SetAppUid( const TInt32 aAppUid );
+
+ /**
+ * Sets new plugin uid for schedule
+ * @param aPluginUid New plugin uid of the schedule
+ */
+ IMPORT_C void SetPluginUid( const TInt32 aPluginUid );
+
+ /**
+ * Sets new application data for schedule
+ * @param aAppData New application data of the schedule
+ */
+ IMPORT_C void SetApplicationDataL( const TDesC8& aAppData );
+
+ /**
+ * Sets new database identifier for the schedule. Note that this should only
+ * be set by Common Scheduling Engine, not the application using it.
+ * @param aDbIdentifier New database identifier of the schedule
+ */
+ IMPORT_C void SetDbIdentifier( const TUint32 aDbIdentifier );
+
+ /**
+ * Sets new schedule for the schedule.
+ * @param aScheduleType New schedule type of the schedule
+ */
+ IMPORT_C void SetScheduleType( const TInt32 aScheduleType );
+
+ // Getters
+ /**
+ * Get the type of scheduler plugin
+ * EUniPlugin for plugins that can have only one running at a given time.
+ * EMultiPlugin for plugins that can have several running at a given time
+ * @return Schedule plugin type.
+ */
+ IMPORT_C TInt32 PluginType() const;
+
+ /**
+ * Get the name of the schedule.
+ * @return Schedule name.
+ */
+ IMPORT_C TPtrC8 Name() const;
+
+ /**
+ * Gets the start time of the schedule.
+ * @return Start time.
+ */
+ IMPORT_C TTime& StartTime();
+
+ /**
+ * Gets the end time of the schedule.
+ * @return End time.
+ */
+ IMPORT_C TTime& EndTime();
+
+ /**
+ * Gets the application uid of the schedule
+ * @return Application uid.
+ */
+ IMPORT_C TInt32 AppUid() const;
+
+ /**
+ * Gets the plugin uid of the schedule.
+ * @return Plugin uid.
+ */
+ IMPORT_C TInt32 PluginUid() const;
+
+ /**
+ * Gets the application data of the schedule.
+ * @return Application data.
+ */
+ IMPORT_C TPtrC8 ApplicationData();
+
+ /**
+ * Gets the database identifier of the schedule.
+ * @return Database identifier
+ */
+ IMPORT_C TUint32 DbIdentifier() const;
+
+ /**
+ * Gets the schedule type of the schedule.
+ * @return Schedule type
+ */
+ IMPORT_C TInt32 ScheduleType() const;
+
+ /**
+ * Dumps content of schedule to debug trace
+ * @return None
+ */
+ IMPORT_C void DebugDump() const;
+
+ protected: // Constructors
+ /**
+ * Default constructor
+ */
+ EXPORT_C CCseScheduledProgram();
+
+ /**
+ * Symbian 2nd phase constructor can leave.
+ */
+ void ConstructL();
+
+ protected: // Data
+ /**
+ * Name
+ * Name of the scheduled program, e.g. name of the TV program.
+ */
+ TBuf8<KCseNameMaxLength> iName;
+
+ /**
+ * Start time
+ * Start time when the scheduled program is run (passed to plugin which is defined here).
+ */
+ TTime iStartTime;
+
+ /**
+ * End time
+ * End time for schedules that take longer time to complete, for example recording of the TV program.
+ * If schedule is "instant" (e.g. just notification to user) start time and end time should be the same.
+ */
+ TTime iEndTime;
+
+ /**
+ * Application UID
+ * This is the application uid of the program that has added this schedule. Can be used to retrieve
+ * all schedules of certain application.
+ */
+ TInt32 iAppUid;
+
+ /**
+ * Plugin UID
+ * UID of the plugin where this scheduled program is passed when the time is right.
+ */
+ TInt32 iPluginUid;
+
+ /**
+ * Application Data
+ * Application specific data for the plugin. Common scheduling Engine has no knowledge what
+ * this data contains.
+ */
+ HBufC8* iAppData;
+
+ /**
+ * DB identifier
+ * Used to separate schedules from each other in database. Should be only added by Common
+ * scheduling engine, not by application using it.
+ */
+ TUint32 iDbIdentifier;
+
+ /**
+ * Schedule type
+ * Type of this schedule, e.g. reminder, recording...
+ */
+ TInt32 iScheduleType;
+
+ /**
+ * Schedule plugin type
+ * Type of the plugin where this schedule will be run
+ */
+ TInt32 iPluginType;
+ };
+
+#endif //__CCSESCHEDULEDPROGRAM_H__
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/inc/ipvideo/CCseSchedulerAPI.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,166 @@
+/*
+* Copyright (c) 2006 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:
+*
+*/
+
+
+
+#ifndef _CCSESCHEDULERAPI_H
+#define _CCSESCHEDULERAPI_H
+
+// INCLUDES
+#include <e32base.h>
+#include <ipvideo/RCseSchedulerClient.h> // Client common methods (server start up etc)
+#include <ipvideo/RCseSchedulerService.h> // Client common methods (open, close etc)
+
+// CONSTANTS
+// None.
+
+// MACROS
+// None.
+
+// DATA TYPES
+// None.
+
+// FUNCTION PROTOTYPES
+// None.
+
+// FORWARD DECLARATIONS
+class CCseScheduledProgram;
+
+// CLASS DECLARATION
+/**
+* General client api that manages service functionality.
+*
+* @lib CseSchedulerClient.lib
+*/
+class CCseSchedulerApi : public CBase
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ IMPORT_C static CCseSchedulerApi* NewL();
+
+ /**
+ * Destructor.
+ * @return None.
+ */
+ IMPORT_C virtual ~CCseSchedulerApi();
+
+ private: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ */
+ CCseSchedulerApi();
+
+ /**
+ * Symbian 2nd phase constructor can leave.
+ */
+ void ConstructL();
+
+ public: // New methods
+ /**
+ * Adds given schedule to Common Scheduling Engine database. After the call is
+ * completed, the parameter contains the DB identifier of the schedule.
+ * @param aData Schedule to be added to database.
+ * @return Generic symbian error code.
+ */
+ IMPORT_C TInt AddSchedule( CCseScheduledProgram& aData ) const;
+
+ /**
+ * Removes schedule from database.
+ * @param aDbIdentifier Database identifier of the schedule to be removed.
+ * @return Generic symbian error code.
+ */
+ IMPORT_C TInt RemoveSchedule( const TUint32 aDbIdentifier ) const;
+
+ /**
+ * Gets schedule from database.
+ * @param aDbIdentifier Database identifier of the schedule that is wanted
+ * from the database
+ * @param aProg Pointer where this scheduled program is get.
+ * @return Generic symbian error codes.
+ */
+ IMPORT_C TInt GetSchedule( const TUint32 aDbIdentifier,
+ CCseScheduledProgram* aProg ) const;
+
+ /**
+ * Get list of scheduled events from the scheduling engine based on given UID.
+ * @param aAppUid Application UID.
+ * @param aArray On return contains items from the database.
+ * @return Generic symbian error code.
+ */
+ IMPORT_C TInt GetSchedulesByAppUid( const TInt32 aAppUid,
+ RPointerArray<CCseScheduledProgram>& aArray ) const;
+
+ /**
+ * Get overlapping schedule (if any) from the scheduling engine.
+ * Uses schedule type, start and end times to find overalapping
+ * schedules from the Commone Scheduling Engine database.
+ * @param aProgram Schedule to used for finding overlapping schedules.
+ * @param aResultArray On return, contains array of overlapping
+ * schedules, empty if none found.
+ * @return Generic symbian error code.
+ */
+ IMPORT_C TInt GetOverlappingSchedules( CCseScheduledProgram& aProgram,
+ RPointerArray<CCseScheduledProgram>& aResultArray );
+
+ /**
+ * Get list of scheduled events from the scheduling engine based on given UID.
+ * @param aPluginUid Plugin UID.
+ * @param aArray On return contains items from the database.
+ * @return Generic symbian error code.
+ */
+ TInt GetSchedulesByPluginUid( const TInt32 aPluginUid,
+ RPointerArray<CCseScheduledProgram>& aArray ) const;
+
+ /**
+ * Get list of scheduled events from the scheduling engine based on given schedule type.
+ * @param aScheduleType Schedule type.
+ * @param aArray On return contains items from the database.
+ * @return Generic symbian error code.
+ */
+ TInt GetSchedulesByType( const TInt32 aScheduleType,
+ RPointerArray<CCseScheduledProgram>& aArray ) const;
+
+ /**
+ * Get list of scheduled events from the scheduling engine between given timeframe.
+ * @param aBeginning Beginning of the time frame
+ * @param aEnd End of the time frame
+ * @return Generic symbian error code.
+ */
+ TInt GetSchedulesByTime( const TTime& aBeginning,
+ const TTime& aEnd,
+ RPointerArray<CCseScheduledProgram>& aArray ) const;
+
+
+ private: // Data
+ /**
+ * Scheduler engine - Client
+ */
+ RCseSchedulerClient iClient;
+
+ /**
+ * Scheduler engine - Service
+ */
+ RCseSchedulerService iService;
+ };
+
+#endif //_CCSESCHEDULERAPI_H
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/inc/ipvideo/CCseSchedulerPluginIF.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,80 @@
+/*
+* Copyright (c) 2006 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: Common interface for scheduler plugins.*
+*/
+
+
+
+
+#ifndef CCSESCHEDULERPLUGINIF_H
+#define CCSESCHEDULERPLUGINIF_H
+
+#include <e32std.h>
+#include <e32base.h>
+class CCseScheduledProgram;
+class MCsePluginObserver;
+
+class CCseSchedulerPluginIF : public CBase
+ {
+public:
+ /**
+ * Construction method.
+ * @param aUid Ecom implementation uid of the used plugin.
+ * @return None
+ */
+ static CCseSchedulerPluginIF* NewL( const TUid& aUid );
+
+ /**
+ * Runs given task in plugin.
+ * @param aProg Schedule to be run in plugin.
+ * @param aObserver Pointer back to scheduling engine. Called
+ * when schedule is completed or error occurs.
+ * @return None
+ */
+ virtual void RunTaskL( CCseScheduledProgram& aProg,
+ MCsePluginObserver* aObserver ) = 0;
+
+ /**
+ * Return the ECom implementation uid of this plugin.
+ * @return ECom implementation uid.
+ */
+ TUid ImplementationUid() const;
+
+ /**
+ * Destructor
+ */
+ virtual ~CCseSchedulerPluginIF();
+
+protected:
+ /**
+ * Instance identifier key. When instance of an
+ * implementation is created by ECOM framework, the
+ * framework will assign UID for it. The UID is used in
+ * destructor to notify framework that this instance is
+ * being destroyed and resources can be released.
+ */
+ TUid iDtorIDKey;
+
+ /**
+ * Ecom implementation uid
+ */
+ TUid iImplementationUid;
+ };
+
+
+
+#include <ecom/ecom.h>
+#include <ipvideo/CCseSchedulerPluginIF.inl>
+
+#endif //CCSESCHEDULERPLUGINIF_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/inc/ipvideo/CCseSchedulerPluginIF.inl Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,55 @@
+/*
+* Copyright (c) 2006 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: CSE inlines.*
+*/
+
+
+
+#ifndef CIPTVSCHEDULERPLUGIN_INL
+#define CIPTVSCHEDULERPLUGIN_INL
+
+// INLINES
+
+/**
+* Contructor
+*/
+inline CCseSchedulerPluginIF* CCseSchedulerPluginIF::NewL( const TUid& aUid )
+ {
+ TAny* ext = REComSession::CreateImplementationL( aUid, _FOFF( CCseSchedulerPluginIF, iDtorIDKey ));
+
+ CCseSchedulerPluginIF* result = reinterpret_cast< CCseSchedulerPluginIF* >( ext );
+ result->iImplementationUid = aUid; // set the plugin's implementation uid
+
+ return result;
+ }
+
+
+/**
+* Destructor
+*/
+inline CCseSchedulerPluginIF::~CCseSchedulerPluginIF()
+ {
+ // Inform the ECOM framework that this specific instance of the
+ // interface has been destroyed.
+ REComSession::DestroyedImplementation( iDtorIDKey );
+ }
+/**
+* ImplementationUid
+*/
+inline TUid CCseSchedulerPluginIF::ImplementationUid() const
+ {
+ return iImplementationUid;
+ }
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/inc/ipvideo/CseEngineUids.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,22 @@
+/*
+* Copyright (c) 2006 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: Common scheduling engine UIDs*
+*/
+
+
+
+
+
+const TUint CSE_SCHEDULER_SERVER_UID = 0x10281F20
+const TUint CSE_SCHEDULER_CLIENT_UID = 0x10281F1F
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/inc/ipvideo/CseSchedulerClientServerCommon.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,74 @@
+/*
+* Copyright (c) 2006 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: scheduling engine client/server common header.*
+*/
+
+
+
+
+
+#ifndef __CSESCHEDULERCLIENTSERVERCOMMON_H__
+#define __CSESCHEDULERCLIENTSERVERCOMMON_H__
+
+// INCLUDE FILES
+#include <e32base.h>
+
+// CONSTANTS
+_LIT( KCseSchedulerServerName, "CseSchedulerEngineServer" ); // Server name
+_LIT( KCseSchedulerServerSemaphoreName, "CseSchedulerServerSemaphore" );
+_LIT( KCseSchedulerServerFileName, "CseSchedulerServer.exe" );
+
+
+// The server version. A version must be specified when
+// creating a session with the server.
+const TUint KCseServMajorVersionNumber=0;
+const TUint KCseServMinorVersionNumber=1;
+const TUint KCseServBuildVersionNumber=1;
+
+
+// Enum for different server requests
+typedef enum
+ {
+ ECseRequestBase = 0,
+ ECseAddSchedule,
+ ECseRemoveSchedule,
+ ECseGetSchedules,
+ ECseGetSchedule,
+ ECseGetScheduleLength,
+ ECseGetSchedulesByAppUid,
+ ECseGetScheduleArrayLengthByAppUid,
+ ECseServCreateSubSession,
+ ECseServCloseSubSession,
+ ECseServCloseSession,
+ ECseGetOverlappingSchedulesLength,
+ ECseGetOverlappingSchedules,
+ ECseGetScheduleArrayLengthByPluginUid,
+ ECseGetSchedulesByPluginUid,
+ ECseGetScheduleArrayLengthByType,
+ ECseGetSchedulesByType,
+ ECseGetScheduleArrayLengthByTimeframe,
+ ECseGetSchedulesByTimeframe,
+ ECseRequestLast
+ } MCseSchedulerServerRequests;
+
+// Enum for different server responses
+typedef enum
+ {
+ ECseNoSubsessionHandle = 0x100,
+ } MCseSchedulerRetValues;
+
+
+#endif // __CSESCHEDULERCLIENTSERVERCOMMON_H__
+
+// End of file
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/inc/ipvideo/MCsePluginObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,42 @@
+/*
+* Copyright (c) 2006 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: Observer to inform common scheduling engine when plugin is*
+*/
+
+
+
+
+#ifndef __MCSEPLUGINOBSERVER_H__
+#define __MCSEPLUGINOBSERVER_H__
+
+// CLASS DECLARATION
+/**
+* MCsePluginObserver
+* This class specifies the function to be called when a plugin
+* cause error or completes.
+*/
+class MCsePluginObserver
+ {
+ public: // New functions
+ /**
+ * Called when plugin is finihed progressing
+ * @param aCompletionCode Completion code of plugin. KErrNone
+ * if everything went alright.
+ */
+ virtual void PluginCompleted( TInt aCompletionCode ) = 0;
+ };
+
+#endif // __MCSEPLUGINOBSERVER_H__
+
+// End of File
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/inc/ipvideo/MCseScheduleObserver.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,49 @@
+/*
+* Copyright (c) 2006 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:
+*
+*/
+
+
+
+
+#ifndef __MCSESCHEDULEOBSERVER_H__
+#define __MCSESCHEDULEOBSERVER_H__
+
+// FORWARD DECLARATIONS
+// None
+
+// CLASS DECLARATION
+/**
+* MCseScheduleObserver
+* This class specifies the function to be called when a scheduler
+* cause error or completes.
+*/
+class MCseScheduleObserver
+ {
+ public: // New functions
+ /**
+ * Called when schedule is finished prosessing-
+ * @param aDbIdentifier DbIdentifier of scheduled program that just
+ * has been processed.
+ * @param aCompletionCode Completion code of schedule. KErrNone
+ * if everything went alright.
+ */
+ virtual void ScheduleCompletedL( const TUint32 aDbIdentifier,
+ TInt aCompletionCode ) = 0;
+ };
+
+#endif // __MCSESCHEDULEOBSERVER_H__
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/inc/ipvideo/RCseSchedulerClient.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,95 @@
+/*
+* Copyright (c) 2006 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: Interface for Cse Scheduler engine Client class*
+*/
+
+
+
+
+
+#ifndef _RCSESCHEDULERCLIENT_H
+#define _RCSESCHEDULERCLIENT_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+// None.
+
+// MACROS
+// None.
+
+// DATA TYPES
+// None.
+
+// FUNCTION PROTOTYPES
+// None.
+
+// FORWARD DECLARATIONS
+// None.
+
+// CLASS DECLARATION
+
+/**
+* This is the client-side interface through which communication
+* with the server is channeled.
+*
+* @lib CseSchedulerClient.dll
+*/
+class RCseSchedulerClient : public RSessionBase
+ {
+ public: // Constructors and destructor
+
+ /**
+ * C++ default constructor.
+ * @return None
+ */
+ RCseSchedulerClient();
+
+ /**
+ * Destructor.
+ * @return None.
+ */
+ virtual ~RCseSchedulerClient();
+
+ public: // New functions
+
+ /**
+ * Connect to the server.
+ * @return KErrNone if successful, otherwise another of the system-wide
+ * error codes.
+ */
+ TInt Connect();
+
+ /**
+ * Close the session.
+ * @return None
+ */
+ void Close();
+
+ /**
+ * Version
+ * @return version number
+ */
+ TVersion Version() const;
+
+ private: // Data
+
+ };
+
+#endif // _RCSESCHEDULERCLIENT_H
+
+// End of File
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/inc/ipvideo/RCseSchedulerService.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,141 @@
+/*
+* Copyright (c) 2006 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: Interface for CseScheduler Client's Service class*
+*/
+
+
+
+#ifndef __RCSESCHEDULERSERVICE_H__
+#define __RCSESCHEDULERSERVICE_H__
+
+// INCLUDES
+#include <ipvideo/RCseSchedulerServiceBase.h> // Client common methods (open, close etc)
+
+// CONSTANTS
+// None.
+
+// MACROS
+// None.
+
+// DATA TYPES
+// None.
+
+// FUNCTION PROTOTYPES
+// None.
+
+// FORWARD DECLARATIONS
+class CCseScheduledProgram;
+
+// CLASS DECLARATION
+/**
+* General client api that manages service functionality.
+*
+* @lib CseSchedulerClient.lib
+*/
+class RCseSchedulerService : public RCseSchedulerServiceBase
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Constructor.
+ * @return None.
+ */
+ RCseSchedulerService();
+
+ /**
+ * Destructor.
+ * @return None.
+ */
+ virtual ~RCseSchedulerService();
+
+ public: // New methods
+ /**
+ * Adds given schedule to Common Scheduling Engine database. After the call is
+ * completed, the parameter contains the DB identifier of the schedule.
+ * @param aData Schedule to be added to database.
+ */
+ void AddScheduleL( CCseScheduledProgram& aData ) const;
+
+ /**
+ * Removes schedule from database.
+ * @param aDbIdentifier Database identifier of the schedule to be removed.
+ * @return Generic symbian error code.
+ */
+ void RemoveScheduleL( const TUint32 aDbIdentifier ) const;
+
+ /**
+ * Gets schedule from database.
+ * @param aDbIdentifier Database identifier of the schedule that is wanted
+ * from the database
+ * @param aProg Pointer where this scheduled program is get.
+ * @return Generic symbian error codes.
+ */
+ void GetScheduleL( const TUint32 aDbIdentifier,
+ CCseScheduledProgram* aProg ) const;
+
+ /**
+ * Get list of scheduled events from the scheduling engine based on given UID.
+ * @param aAppUid Application UID.
+ * @param aArray On return contains items from the database.
+ * @return Generic symbian error code.
+ */
+ void GetSchedulesL( const TInt32 aAppUid,
+ RPointerArray<CCseScheduledProgram>& aArray ) const;
+
+ /**
+ * Get overlapping schedule (if any) from the scheduling engine.
+ * Uses schedule type, start and end times to find overalapping
+ * schedules from the Commone Scheduling Engine database.
+ * @param aProgram Schedule to used for finding overlapping schedules.
+ * @param aResultArray On return, contains array of overlapping
+ * schedules, empty if none found.
+ * @return Generic symbian error code.
+ */
+ void GetOverlappingSchedulesL( CCseScheduledProgram& aProgram,
+ RPointerArray<CCseScheduledProgram>& aResultArray );
+
+ /**
+ * Get list of scheduled events from the scheduling engine based on given plugin UID.
+ * @param aPluginUid Plugin UID.
+ * @param aArray On return contains items from the database.
+ * @return Generic symbian error code.
+ */
+ void GetSchedulesByPluginUidL( const TInt32 aPluginUid,
+ RPointerArray<CCseScheduledProgram>& aArray ) const;
+
+ /**
+ * Get list of scheduled events from the scheduling engine based on given schedule type.
+ * @param aType Schedule type.
+ * @param aArray On return contains items from the database.
+ * @return Generic symbian error code.
+ */
+ void GetSchedulesByTypeL( const TInt32 aType,
+ RPointerArray<CCseScheduledProgram>& aArray ) const;
+
+ /**
+ * Get list of scheduled events from the scheduling engine between given timeframe.
+ * @param aBeginning Beginning of the timeframe.
+ * @param aEnd End of the timeframe.
+ * @param aArray On return contains items from the database.
+ * @return Generic symbian error code.
+ */
+ void GetSchedulesByTimeL( const TTime& aBegining,
+ const TTime& aEnd,
+ RPointerArray<CCseScheduledProgram>& aArray ) const;
+ };
+
+#endif //__RCSESCHEDULERSERVICE_H__
+
+// End of File
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/inc/ipvideo/RCseSchedulerServiceBase.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,102 @@
+/*
+* Copyright (c) 2006 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: Interface for Cse Scheduler engine Client's ServiceBase class.*
+*/
+
+
+
+
+
+#ifndef __RCSESCHEDULERSERVICEBASE_H
+#define __RCSESCHEDULERSERVICEBASE_H
+
+// INCLUDES
+#include <e32base.h>
+
+// CONSTANTS
+// None.
+
+// MACROS
+// None.
+
+// DATA TYPES
+// None.
+
+// FUNCTION PROTOTYPES
+// None.
+
+// FORWARD DECLARATIONS
+class RCseSchedulerClient;
+
+// CLASS DECLARATION
+
+/**
+* Base class for services. This represents a client-side sub-session
+* and has a corresponding sub-session object on the server-side.
+*
+* @lib CseSchedulerClient.dll
+*/
+class RCseSchedulerServiceBase : public RSubSessionBase
+ {
+ public:
+ /**
+ * C++ default constructor.
+ */
+ RCseSchedulerServiceBase();
+
+ /**
+ * Destructor.
+ * @return None.
+ */
+ virtual ~RCseSchedulerServiceBase();
+
+ /**
+ * Open server.
+ * @param aServer
+ * @return KErrNone if successful, otherwise one of the system-wide error codes.
+ */
+ TInt Open( RCseSchedulerClient& aClient );
+
+ /**
+ * Close server.
+ * @return None
+ */
+ void Close();
+
+ /**
+ * Uses user panic to panic client.
+ * @param aFault Panic reason.
+ * @return None.
+ */
+ void PanicClient( TInt aFault ) const;
+
+ /**
+ * Sessionhandle
+ */
+ inline RCseSchedulerClient& SessionHandle() const { return *iClient; }
+
+ private:
+
+ /**
+ * Pointer to client. Own.
+ */
+ RCseSchedulerClient* iClient;
+
+ };
+
+#endif // __RCSESCHEDULERSERVICEBASE_H
+
+// End of File
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/tsrc/Bmarm/videoscheduler_apitestU.DEF Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,3 @@
+EXPORTS
+ LibEntryL__FR13CTestModuleIf @ 1 NONAME R3UNUSED ; LibEntryL(CTestModuleIf &)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/tsrc/Bwins/videoscheduler_apitestU.DEF Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,3 @@
+EXPORTS
+ ?LibEntryL@@YAPAVCScriptBase@@AAVCTestModuleIf@@@Z @ 1 NONAME ; class CScriptBase * __cdecl LibEntryL(class CTestModuleIf &)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/tsrc/EABI/videoscheduler_apitestU.def Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,3 @@
+EXPORTS
+ _Z9LibEntryLR13CTestModuleIf @ 1 NONAME
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/tsrc/conf/atsconf.txt Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,14 @@
+;Run \vado\videoplayer\tsrc\testing\tools\genATSdrop.pl from
+;the tsrc folder to create ATS3 drop.
+[DROP]
+NAME VaDo - videoutils_plat - videoscheduler_api
+DEVICE INSERT_DEVICE
+FLASH INSERT_FLASH_IMAGE
+FLASH INSERT_FLASH_IMAGE
+FLASH INSERT_FLASH_IMAGE
+SIS \VideoApp_Domain\videoplayer\videoplayerapp\mpxvideoplayer\sis\VideoPlayer.sisx
+PKG group\videoscheduler_apitest.pkg
+INI init\TestFramework.ini 200
+EMAIL INSERT_EMAIL
+RUN
+[ENDDROP]
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/tsrc/conf/videoscheduler_apitest.cfg Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,295 @@
+#***********************************************************************************
+#
+# STIF test script file for testing videoscheduler.
+#
+#***********************************************************************************
+
+[Test]
+title ET00101 Program_NewL
+create videoscheduler_apitest test
+test Program_NewL
+delete test
+[Endtest]
+
+[Test]
+title ET00102 Program_NewLFromProgram
+create videoscheduler_apitest test
+test Program_NewL
+test Program_NewLFromProgram
+delete test
+[Endtest]
+
+[Test]
+title ET00103 Program_Externalize
+create videoscheduler_apitest test
+test Program_NewL
+test Program_Externalize
+delete test
+[Endtest]
+
+[Test]
+title ET00104 Program_ExternalizeLength
+create videoscheduler_apitest test
+test Program_NewL
+test Program_ExternalizeLength
+delete test
+[Endtest]
+
+[Test]
+title ET00105 Program_Internalize
+create videoscheduler_apitest test
+test Program_NewL
+test Program_Externalize
+test Program_Internalize
+delete test
+[Endtest]
+
+[Test]
+title ET00106 Program_PluginType
+create videoscheduler_apitest test
+test Program_NewL
+test Program_SetPluginType 1
+test Program_PluginType 1
+delete test
+[Endtest]
+
+[Test]
+title ET00107 Program_Name
+create videoscheduler_apitest test
+test Program_NewL
+test Program_SetName "Ohojelma"
+test Program_Name "Ohojelma"
+delete test
+[Endtest]
+
+[Test]
+title ET00108 Program_StartTime
+create videoscheduler_apitest test
+test Program_NewL
+test Program_SetStartTime "20090217:142100.000000"
+test Program_StartTime "20090217:142100.000000"
+delete test
+[Endtest]
+
+[Test]
+title ET00109 Program_EndTime
+create videoscheduler_apitest test
+test Program_NewL
+test Program_SetEndTime "20090217:142100.000000"
+test Program_EndTime "20090217:142100.000000"
+delete test
+[Endtest]
+
+[Test]
+title ET00110 Program_AppUid
+create videoscheduler_apitest test
+test Program_NewL
+test Program_SetAppUid 666
+test Program_AppUid 666
+delete test
+[Endtest]
+
+[Test]
+title ET00111 Program_PluginUid
+create videoscheduler_apitest test
+test Program_NewL
+test Program_SetPluginUid 666
+test Program_PluginUid 666
+delete test
+[Endtest]
+
+[Test]
+title ET00112 Program_ApplicationData
+create videoscheduler_apitest test
+test Program_NewL
+test Program_SetApplicationData "Chuck Norris would never give up his whipped cream"
+test Program_ApplicationData "Chuck Norris would never give up his whipped cream"
+delete test
+[Endtest]
+
+[Test]
+title ET00113 Program_DbIdentifier
+create videoscheduler_apitest test
+test Program_NewL
+test Program_SetDbIdentifier 666
+test Program_DbIdentifier 666
+delete test
+[Endtest]
+
+[Test]
+title ET00114 Program_ScheduleType Reminder
+create videoscheduler_apitest test
+test Program_NewL
+test Program_SetScheduleType 0
+test Program_ScheduleType 0
+delete test
+[Endtest]
+
+[Test]
+title ET00115 Program_ScheduleType Recording
+create videoscheduler_apitest test
+test Program_NewL
+test Program_SetScheduleType 1
+test Program_ScheduleType 1
+delete test
+[Endtest]
+
+[Test]
+title ET00116 Program_ScheduleType EPG Update
+create videoscheduler_apitest test
+test Program_NewL
+test Program_SetScheduleType 2
+test Program_ScheduleType 2
+delete test
+[Endtest]
+
+[Test]
+title ET00117 Program_ScheduleType Scheduled download
+create videoscheduler_apitest test
+test Program_NewL
+test Program_SetScheduleType 3
+test Program_ScheduleType 3
+delete test
+[Endtest]
+
+[Test]
+title ET00118 Program_ScheduleType Other
+create videoscheduler_apitest test
+test Program_NewL
+test Program_SetScheduleType 4
+test Program_ScheduleType 4
+delete test
+[Endtest]
+
+[Test]
+title ET00119 Program_DebugDump
+create videoscheduler_apitest test
+test Program_NewL
+test Program_DebugDump
+delete test
+[Endtest]
+
+[Test]
+title ET00120 API_NewL
+create videoscheduler_apitest test
+test API_NewL 0
+delete test
+[Endtest]
+
+[Test]
+title ET00121 API_AddSchedule
+create videoscheduler_apitest test
+test API_NewL
+test API_AddSchedule
+delete test
+[Endtest]
+
+[Test]
+title ET00122 API_RemoveSchedule
+create videoscheduler_apitest test
+test API_NewL
+test Program_SetToFuture 20 30
+test API_AddSchedule
+test API_RemoveSchedule
+delete test
+[Endtest]
+
+[Test]
+title ET00123 API_GetSchedule
+create videoscheduler_apitest test
+test API_NewL
+test Program_SetToFuture 20 30
+test API_AddSchedule
+test API_GetSchedule
+test RemoveAllSchedules
+delete test
+[Endtest]
+
+[Test]
+title ET00124 API_GetSchedulesByAppUid
+create videoscheduler_apitest test
+test API_NewL
+test Program_SetAppUid 666
+test Program_SetToFuture 20 30
+test API_AddSchedule
+pause 1000
+test API_GetSchedulesByAppUid 666 1
+test Program_AppUid 666
+test RemoveAllSchedules
+delete test
+[Endtest]
+
+[Test]
+title ET00125 API_GetOverlappingSchedules
+create videoscheduler_apitest test
+test API_NewL
+test Program_NewL
+test Program_SetToFuture 30 60
+test API_AddSchedule
+test Program_NewL
+test Program_SetToFuture 30 60
+test API_AddSchedule
+test Program_NewL
+test Program_SetToFuture 30 60
+test API_AddSchedule
+test API_GetOverlappingSchedules 3
+test RemoveAllSchedules
+pause 2000
+test API_GetOverlappingSchedules 0
+delete test
+[Endtest]
+
+[Test]
+title ET00126 API_GetSchedulesByPluginUid
+create videoscheduler_apitest test
+test API_NewL
+test Program_NewL
+test Program_SetToFuture 20 30
+test Program_SetPluginUid 666
+test API_AddSchedule
+test API_GetSchedulesByPluginUid 666 1
+test Program_PluginUid 666
+test RemoveAllSchedules
+delete test
+[Endtest]
+
+[Test]
+title ET00127 API_GetSchedulesByType
+create videoscheduler_apitest test
+test API_NewL
+test Program_NewL
+test Program_SetToFuture 20 30
+test Program_SetScheduleType 0
+test API_AddSchedule
+test API_GetSchedulesByType 0 1
+test Program_ScheduleType 0
+test RemoveAllSchedules
+delete test
+[Endtest]
+
+[Test]
+title ET00128 API_GetSchedulesByTime
+create videoscheduler_apitest test
+test API_NewL
+test Program_NewL
+test Program_SetToFuture 20 30
+test API_AddSchedule
+test API_GetSchedulesByTime 1 100 1
+test RemoveAllSchedules
+delete test
+[Endtest]
+
+[Test]
+title ET00129 Schedule reminder, wait for launch
+create videoscheduler_apitest test
+test API_NewL
+test Program_NewL
+test Program_SetScheduleType 0
+test Program_SetToFuture 10 20
+test API_AddSchedule
+test API_GetSchedule
+pause 25000
+allownextresult -20
+test API_GetSchedule
+delete test
+[Endtest]
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/tsrc/custom/postrun_custom.xml Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,64 @@
+<step name="Fetch Test module Report" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>fetch-log</command>
+ <params>
+ <param type="text"/>
+ <param delete="true"/>
+ <param path="C:\Logs\TestFramework\*"/>
+ </params>
+</step>
+<step name="Fetch Fusion logs" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>fetch-log</command>
+ <params>
+ <param type="text"/>
+ <param delete="true"/>
+ <param path="c:\logs\Fusion\*"/>
+ </params>
+</step>
+<step name="Fetch Livetv logs" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>fetch-log</command>
+ <params>
+ <param type="text"/>
+ <param delete="true"/>
+ <param path="c:\logs\Livetv\*"/>
+ </params>
+</step>
+<step name="Fetch IPTV logs" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>fetch-log</command>
+ <params>
+ <param type="text"/>
+ <param delete="true"/>
+ <param path="c:\logs\iptv\*"/>
+ </params>
+</step>
+<step name="Fetch verify files" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>fetch-log</command>
+ <params>
+ <param type="text"/>
+ <param delete="true"/>
+ <param path="c:\testing\data\verifynew\*"/>
+ </params>
+</step>
+<step name="Fetch TestScripter logs" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>fetch-log</command>
+ <params>
+ <param type="text"/>
+ <param delete="true"/>
+ <param path="C:\Logs\TestFramework\TestScripter\*"/>
+ </params>
+</step>
+<step name="Fetch Testengine logs" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>fetch-log</command>
+ <params>
+ <param type="text"/>
+ <param delete="true"/>
+ <param path="C:\Logs\TestFramework\Testengine\*"/>
+ </params>
+</step>
+<step name="Fetch Testserver logs" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>fetch-log</command>
+ <params>
+ <param type="text"/>
+ <param delete="true"/>
+ <param path="C:\Logs\TestFramework\Testserver\*"/>
+ </params>
+</step>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/tsrc/custom/prerun_custom.xml Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,54 @@
+<step name="Create log directory for testmodule" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>makedir</command>
+ <params>
+ <param dir="c:\logs\testframework"/>
+ </params>
+</step>
+<step name="Create log directory for fusion" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>makedir</command>
+ <params>
+ <param dir="c:\logs\Fusion"/>
+ </params>
+</step>
+<step name="Create log directory for livetv" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>makedir</command>
+ <params>
+ <param dir="c:\logs\Livetv"/>
+ </params>
+</step>
+<step name="Create log directory for iptv" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>makedir</command>
+ <params>
+ <param dir="c:\logs\iptv"/>
+ </params>
+</step>
+<step name="Create directory for verify files" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>makedir</command>
+ <params>
+ <param dir="c:\testing\data\verifyzip"/>
+ </params>
+</step>
+<step name="Create directory for verify files" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>makedir</command>
+ <params>
+ <param dir="c:\testing\data\verifynew"/>
+ </params>
+</step>
+<step name="Create directory for TestScripter logs" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>makedir</command>
+ <params>
+ <param dir="c:\logs\testframework\TestScripter"/>
+ </params>
+</step>
+<step name="Create directory for Testengine logs" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>makedir</command>
+ <params>
+ <param dir="c:\logs\testframework\Testengine"/>
+ </params>
+</step>
+<step name="Create directory for Testserver logs" harness="STIF" enabled="true" passrate="100" significant="false">
+ <command>makedir</command>
+ <params>
+ <param dir="c:\logs\testframework\Testserver"/>
+ </params>
+</step>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/tsrc/group/bld.inf Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2004-2005 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:
+*
+*/
+
+
+PRJ_PLATFORMS
+// specify the platforms your component needs to be built for here
+// defaults to WINS MARM so you can ignore this if you just build these
+DEFAULT
+
+PRJ_TESTEXPORTS
+../conf/videoscheduler_apitest.cfg /epoc32/data/z/system/data/videoscheduler_apitest.cfg
+../conf/videoscheduler_apitest.cfg /epoc32/winscw/c/testframework/videoscheduler_apitest.cfg
+
+PRJ_EXPORTS
+
+PRJ_TESTMMPFILES
+videoscheduler_apitest.mmp
+
+PRJ_MMPFILES
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/tsrc/group/videoscheduler_apitest.mmp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,60 @@
+/*
+* Copyright (c) 2004-2005 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:
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+TARGET videoscheduler_apitest.dll
+TARGETTYPE dll
+UID 0x1000008D 0x101FB3E3
+
+CAPABILITY ALL -TCB
+/* Remove comments and replace 0x00000000 with correct vendor id */
+// VENDORID 0x00000000
+/* Remove comments and replace 0x00000000 with correct secure id */
+// SECUREID 0x00000000
+
+//TARGETPATH ?target_path
+DEFFILE videoscheduler_apitest.def
+
+USERINCLUDE ../inc
+
+APP_LAYER_SYSTEMINCLUDE
+
+SOURCEPATH ../src
+
+SOURCE videoscheduler_apitest.cpp
+SOURCE videoscheduler_apitestblocks.cpp
+
+//RESOURCE resource_file
+//RESOURCE resource_file2
+
+LIBRARY euser.lib
+LIBRARY stiftestinterface.lib
+LIBRARY stiftestengine.lib
+LIBRARY CseSchedulerClient.lib // Common Scheduling Engine client
+LIBRARY estor.lib
+LIBRARY flogger.lib
+
+LANG SC
+
+// Other possible keywords:
+
+// DEFFILE ?filename
+// AIF ?filename
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/tsrc/group/videoscheduler_apitest.pkg Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,59 @@
+;
+; Copyright (c) 2009 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: Package file for video scheduler API STIF tests;
+
+; Languages
+&EN
+
+; Provide value for uid
+#{"videoscheduler_apitest"},(0x00000000),1,1,0,TYPE=SA
+
+; Series60 product id for S60 3.0
+[0x101F7961], 0, 0, 0, {"Series60ProductID"}
+
+; Localised Vendor name
+%{"Nokia"}
+
+; Unique Vendor name
+:"Nokia"
+
+; Logo
+; None
+
+; Package signature - Optional
+; None
+
+; Start of Package body
+
+; Condition blocks
+; None
+
+; Options list
+; None
+
+; Install files
+"/epoc32/release/armv5/udeb/videoscheduler_apitest.dll" - "!:/Sys/Bin/videoscheduler_apitest.dll"
+"../conf/videoscheduler_apitest.cfg" - "C:/TestFramework/videoscheduler_apitest.cfg"
+"../init/TestFramework.ini" - "C:/TestFramework/TestFramework.ini"
+
+; Embedded SIS
+; None
+
+; End of Package body
+
+; PKG dependencies
+; None
+
+; PKG capabilities
+; None
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/tsrc/inc/vcxtestlog.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,106 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+#ifndef VCXTESTLOG_H
+#define VCXTESTLOG_H
+
+// INCLUDES
+#include <e32std.h>
+#include <e32svr.h>
+
+//#define FILE_LOGGING_IN_UREL_BUILD 1
+
+// MACROS
+#ifdef _DEBUG
+
+// SELECT LOG TYPE FROM HERE
+// 0 = RDebug
+// 1 = file logging
+// 2 = no logging
+#ifdef __WINSCW__
+ #define LOGTYPE 0
+#else
+ #define LOGTYPE 1
+#endif __WINSCW__
+
+#if LOGTYPE == 0
+
+ #define VCXLOGLO1(s) RDebug::Print(_L(#s))
+ #define VCXLOGLO2(s, a) RDebug::Print(_L(#s), a)
+ #define VCXLOGLO3(s, a, b) RDebug::Print(_L(#s), a, b)
+ #define VCXLOGLO4(s, a, b, c) RDebug::Print(_L(#s), a, b, c)
+ #define VCXLOGLO5(s, a, b, c, d) RDebug::Print(_L(#s), a, b, c, d)
+
+#endif
+
+#if LOGTYPE == 1
+
+ #include <flogger.h>
+
+_LIT(KIPTVLogFolder2,"Fusion");
+_LIT(KIPTVLogFile2,"Fusion.txt");
+
+ #define VCXLOGLO1(AAA) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::Write(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,tempIPTVLogDes()); } while ( EFalse )
+ #define VCXLOGLO2(AAA,BBB) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB); } while ( EFalse )
+ #define VCXLOGLO3(AAA,BBB,CCC) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB,CCC); } while ( EFalse )
+ #define VCXLOGLO4(AAA,BBB,CCC,DDD) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB,CCC,DDD); } while ( EFalse )
+ #define VCXLOGLO5(AAA,BBB,CCC,DDD,EEE) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB,CCC,DDD,EEE); } while ( EFalse )
+
+#endif
+
+#if LOGTYPE == 2
+
+ #define VCXLOGLO1(s)
+ #define VCXLOGLO2(s, a)
+ #define VCXLOGLO3(s, a, b)
+ #define VCXLOGLO4(s, a, b, c)
+ #define VCXLOGLO5(s, a, b, c, d)
+
+#endif
+
+#else // _DEBUG
+
+ #ifdef FILE_LOGGING_IN_UREL_BUILD
+
+ #include <flogger.h>
+
+ _LIT(KIPTVLogFolder2,"Fusion");
+ _LIT(KIPTVLogFile2,"Fusion.txt");
+
+ #define VCXLOGLO1(AAA) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::Write(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,tempIPTVLogDes()); } while ( EFalse )
+ #define VCXLOGLO2(AAA,BBB) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB); } while ( EFalse )
+ #define VCXLOGLO3(AAA,BBB,CCC) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB,CCC); } while ( EFalse )
+ #define VCXLOGLO4(AAA,BBB,CCC,DDD) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB,CCC,DDD); } while ( EFalse )
+ #define VCXLOGLO5(AAA,BBB,CCC,DDD,EEE) do { _LIT(tempIPTVLogDes,AAA); RFileLogger::WriteFormat(KIPTVLogFolder2(),KIPTVLogFile2(),EFileLoggingModeAppend,TRefByValue<const TDesC>(tempIPTVLogDes()),BBB,CCC,DDD,EEE); } while ( EFalse )
+
+ #else // FILE_LOGGING_IN_UREL_BUILD
+
+ #define VCXLOGLO1(s)
+ #define VCXLOGLO2(s, a)
+ #define VCXLOGLO3(s, a, b)
+ #define VCXLOGLO4(s, a, b, c)
+ #define VCXLOGLO5(s, a, b, c, d)
+
+ #endif // FILE_LOGGING_IN_UREL_BUILD
+
+#endif // _DEBUG
+
+
+#endif // VCXTESTLOG_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/tsrc/inc/videoscheduler_apitest.h Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,496 @@
+/*
+* Copyright (c) 2002 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: ?Description*
+*/
+
+
+
+
+#ifndef VIDEOSCHEDULER_APITEST_H
+#define VIDEOSCHEDULER_APITEST_H
+
+// INCLUDES
+#include <StifLogger.h>
+#include <TestScripterInternal.h>
+#include <StifTestModule.h>
+#include <TestclassAssert.h>
+
+// CONSTANTS
+//const ?type ?constant_var = ?constant;
+
+// MACROS
+//#define ?macro ?macro_def
+#define TEST_CLASS_VERSION_MAJOR 0
+#define TEST_CLASS_VERSION_MINOR 0
+#define TEST_CLASS_VERSION_BUILD 0
+
+// Logging path
+_LIT( KVideoScheduler_ApiTestLogPath, "\\logs\\testframework\\VideoScheduler_ApiTest\\" );
+// Log file
+_LIT( KVideoScheduler_ApiTestLogFile, "VideoScheduler_ApiTest.txt" );
+_LIT( KVideoScheduler_ApiTestLogFileWithTitle, "VideoScheduler_ApiTest_[%S].txt" );
+
+_LIT( KTestModuleName, "VideoScheduler_ApiTest" );
+_LIT( KLogLocation, "In %S" );
+
+// FUNCTION PROTOTYPES
+//?type ?function_name(?arg_list);
+
+// FORWARD DECLARATIONS
+//class ?FORWARD_CLASSNAME;
+class CVideoScheduler_ApiTest;
+class CCseScheduledProgram;
+class CCseSchedulerApi;
+
+// DATA TYPES
+//enum ?declaration
+//typedef ?declaration
+//extern ?data_type;
+
+// CLASS DECLARATION
+
+/**
+* CVideoScheduler_ApiTest test class for STIF Test Framework TestScripter.
+* ?other_description_lines
+*
+* @lib ?library
+* @since ?Series60_version
+*/
+NONSHARABLE_CLASS(CVideoScheduler_ApiTest) : public CScriptBase
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ static CVideoScheduler_ApiTest* NewL( CTestModuleIf& aTestModuleIf );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CVideoScheduler_ApiTest();
+
+ public: // New functions
+
+ /**
+ * ?member_description.
+ * @since ?Series60_version
+ * @param ?arg1 ?description
+ * @return ?description
+ */
+ //?type ?member_function( ?type ?arg1 );
+
+ /**
+ * CompareProgramsL
+ * @since ?Series60_version
+ * @param aProgram1
+ * @param aProgram2
+ * @return Symbian OS error code.
+ */
+ TInt ComparePrograms( CCseScheduledProgram& aProgram1, CCseScheduledProgram& aProgram2 );
+
+ /**
+ * LogMethod
+ * @since ?Series60_version
+ * @param aMethod Name of the method where this function is called
+ * @return Nothing
+ */
+ void LogMethod( TPtrC aMethod );
+
+ public: // Functions from base classes
+
+ /**
+ * From CScriptBase Runs a script line.
+ * @since ?Series60_version
+ * @param aItem Script line containing method name and parameters
+ * @return Symbian OS error code
+ */
+ virtual TInt RunMethodL( CStifItemParser& aItem );
+
+ protected: // New functions
+
+ /**
+ * ?member_description.
+ * @since ?Series60_version
+ * @param ?arg1 ?description
+ * @return ?description
+ */
+ //?type ?member_function( ?type ?arg1 );
+
+ protected: // Functions from base classes
+
+ /**
+ * From ?base_class ?member_description
+ */
+ //?type ?member_function();
+
+ private:
+
+ /**
+ * C++ default constructor.
+ */
+ CVideoScheduler_ApiTest( CTestModuleIf& aTestModuleIf );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ // Prohibit copy constructor if not deriving from CBase.
+ // ?classname( const ?classname& );
+ // Prohibit assigment operator if not deriving from CBase.
+ // ?classname& operator=( const ?classname& );
+
+ /**
+ * Frees all resources allocated from test methods.
+ * @since ?Series60_version
+ */
+ void Delete();
+
+ /**
+ * Test methods are listed below.
+ *
+ * Methods starting with API_ test CCseSchedulerAPI class.
+ *
+ * Methods starting with Program_ test CCseScheduledProgram class. Test class has member
+ * instance of this class and it's used when CCseSchedulerAPI methods need the program data.
+ *
+ * Default app uid for programs is 0x020202, all these will be removed
+ * when API_NewL is called without parameter 0.
+ */
+
+ /**
+ * API_NewL test method.
+ * Creates also CCseScheduledProgram if parameter is not 0.
+ *
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt API_NewL( CStifItemParser& aItem );
+
+ /**
+ * API_AddSchedule test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt API_AddScheduleL( CStifItemParser& aItem );
+
+ /**
+ * API_RemoveSchedule test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt API_RemoveScheduleL( CStifItemParser& aItem );
+
+ /**
+ * API_RemoveSchedule test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt RemoveAllSchedulesL( CStifItemParser& aItem );
+
+ /**
+ * API_GetSchedule test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt API_GetScheduleL( CStifItemParser& aItem );
+
+ /**
+ * API_GetSchedulesByAppUid test method.
+ * First schedule is copied to member variable.
+ *
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt API_GetSchedulesByAppUidL( CStifItemParser& aItem );
+
+ /**
+ * API_GetOverlappingSchedules test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt API_GetOverlappingSchedulesL( CStifItemParser& aItem );
+
+ /**
+ * API_GetSchedulesByPluginUidL test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt API_GetSchedulesByPluginUidL( CStifItemParser& aItem );
+
+ /**
+ * API_GetSchedulesByTypeL test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt API_GetSchedulesByTypeL( CStifItemParser& aItem );
+
+ /**
+ * API_GetSchedulesByTimeL test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt API_GetSchedulesByTimeL( CStifItemParser& aItem );
+
+ /**
+ * Program_NewL test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_NewL( CStifItemParser& aItem );
+
+ /**
+ * Program_NewLFromProgramL test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_NewLFromProgramL( CStifItemParser& aItem );
+
+ /**
+ * Program_ExternalizeL test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_ExternalizeLL( CStifItemParser& aItem );
+
+ /**
+ * Program_InternalizeL test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_InternalizeLL( CStifItemParser& aItem );
+
+ /**
+ * Program_ExternalizeLength test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_ExternalizeLengthL( CStifItemParser& aItem );
+
+ /**
+ * Program_SetPluginType test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_SetPluginTypeL( CStifItemParser& aItem );
+
+ /**
+ * Program_SetName test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_SetNameL( CStifItemParser& aItem );
+
+ /**
+ * Program_SetStartTime test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_SetStartTimeL( CStifItemParser& aItem );
+
+ /**
+ * Program_SetEndTime test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_SetEndTimeL( CStifItemParser& aItem );
+
+ /**
+ * Program_SetAppUid test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_SetAppUidL( CStifItemParser& aItem );
+
+ /**
+ * Program_SetPluginUid test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_SetPluginUidL( CStifItemParser& aItem );
+
+ /**
+ * Program_SetApplicationDataL test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_SetApplicationDataLL( CStifItemParser& aItem );
+
+ /**
+ * Program_SetDbIdentifier test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_SetDbIdentifierL( CStifItemParser& aItem );
+
+ /**
+ * Program_SetScheduleType test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_SetScheduleTypeL( CStifItemParser& aItem );
+
+ /**
+ * Program_PluginType test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_PluginTypeL( CStifItemParser& aItem );
+
+ /**
+ * Program_Name test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_NameL( CStifItemParser& aItem );
+
+ /**
+ * Program_StartTime test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_StartTimeL( CStifItemParser& aItem );
+
+ /**
+ * Program_EndTime test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_EndTimeL( CStifItemParser& aItem );
+
+ /**
+ * Program_EndTime test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_SetToFutureL( CStifItemParser& aItem );
+
+ /**
+ * Program_AppUid test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_AppUidL( CStifItemParser& aItem );
+
+ /**
+ * Program_PluginUid test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_PluginUidL( CStifItemParser& aItem );
+
+ /**
+ * Program_ApplicationData test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_ApplicationDataL( CStifItemParser& aItem );
+
+ /**
+ * Program_DbIdentifier test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_DbIdentifierL( CStifItemParser& aItem );
+
+ /**
+ * Program_ScheduleType test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_ScheduleTypeL( CStifItemParser& aItem );
+
+ /**
+ * Program_DebugDump test method.
+ * @since ?Series60_version
+ * @param aItem Script line containing parameters.
+ * @return Symbian OS error code.
+ */
+ virtual TInt Program_DebugDumpL( CStifItemParser& aItem );
+
+ /**
+ * Method used to log version of test class
+ */
+ void SendTestClassVersion();
+
+ //ADD NEW METHOD DEC HERE
+ //[TestMethods] - Do not remove
+
+ public: // Data
+ // ?one_line_short_description_of_data
+ //?data_declaration;
+
+ protected: // Data
+ // ?one_line_short_description_of_data
+ //?data_declaration;
+
+ private: // Data
+
+ // ?one_line_short_description_of_data
+ //?data_declaration;
+
+ // Reserved pointer for future extension
+ //TAny* iReserved;
+
+ public: // Friend classes
+ //?friend_class_declaration;
+ protected: // Friend classes
+ //?friend_class_declaration;
+ private: // Friend classes
+ //?friend_class_declaration;
+
+ CCseSchedulerApi* iApi;
+ CCseScheduledProgram* iProgram;
+ HBufC8* iExternalizeBuff;
+ RArray<TUint32> iAddedProgramIds;
+ };
+
+#endif // VIDEOSCHEDULER_APITEST_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/tsrc/init/TestFramework.ini Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,165 @@
+#
+# This is STIFTestFramework initialization file
+# Comment lines start with '#'-character.
+# See STIF TestFramework users guide.doc for instructions
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Set following test engine settings:
+# - Set Test Reporting mode. TestReportMode's possible values are:
+# + 'Summary': Summary of the tested test cases.
+# + 'Environment': Hardware and software info.
+# + 'TestCases': Test case report.
+# + 'FullReport': Set of all above ones.
+# + Example 'TestReportMode= Summary TestCases'
+#
+# - CreateTestReport setting controls report creation mode
+# + YES, Test report will created.
+# + NO, No Test report.
+#
+# - File path indicates the base path of the test report.
+# - File name indicates the name of the test report.
+#
+# - File format indicates the type of the test report.
+# + TXT, Test report file will be txt type, for example 'TestReport.txt'.
+# + HTML, Test report will be html type, for example 'TestReport.html'.
+#
+# - File output indicates output source of the test report.
+# + FILE, Test report logging to file.
+# + RDEBUG, Test report logging to using rdebug.
+#
+# - File Creation Mode indicates test report overwriting if file exist.
+# + OVERWRITE, Overwrites if the Test report file exist.
+# + APPEND, Continue logging after the old Test report information if
+# report exist.
+
+[Engine_Defaults]
+
+TestReportMode= FullReport # Possible values are:
+ # 'Summary', 'Environment', 'TestCases' or 'FullReport'
+
+CreateTestReport= YES # Possible values: YES or NO
+
+TestReportFilePath= C:\Logs\Fusion\
+TestReportFileName= TestReport
+
+TestReportFormat= TXT # Possible values: TXT or HTML
+TestReportOutput= FILE # Possible values: FILE or RDEBUG
+TestReportFileCreationMode= APPEND # Possible values: OVERWRITE or APPEND
+UITestingSupport= Yes
+SeparateProcesses= YES
+[End_Defaults]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Module configurations start
+# Modules are added between module tags
+# tags. Module name is specified after ModuleName= tag, like
+# ModuleName= XXXXXXXXX
+# Modules might have initialisation file, specified as
+# IniFile= c:\testframework\YYYYYY
+# Modules might have several configuration files, like
+# TestCaseFile= c:\testframework\NormalCases.txt
+# TestCaseFile= c:\testframework\SmokeCases.txt
+# TestCaseFile= c:\testframework\ManualCases.txt
+
+# (TestCaseFile is synonym for old term ConfigFile)
+
+# Following case specifies demo module settings. Demo module
+# does not read any settings from file, so tags
+# IniFile and TestCaseFile are not used.
+# In the simplest case it is enough to specify only the
+# name of the test module when adding new test module
+
+[New_Module]
+ModuleName= TestScripter
+TestCaseFile= c:\TestFramework\videoscheduler_apitest.cfg
+[End_Module]
+
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Set STIFTestFramework logging overwrite parameters for Logger.
+# Hardware and emulator environment logging path and styles can
+# be configured from here to overwrite the Logger's implemented values.
+#
+# Settings description:
+# - Indicates option for creation log directory/directories. If log directory/directories
+# is/are not created by user they will make by software.
+# + YES, Create log directory/directories if not allready exist.
+# + NO, Log directory/directories not created. Only created one is used.
+#
+# - Overwrite emulator path setting.
+# + Example: If 'EmulatorBasePath= C:\LOGS\TestFramework\' and in code is defined
+# Logger's path 'D:\\LOGS\\Module\\' with those definition the path
+# will be 'C:\LOGS\TestFramework\LOGS\Module\'
+#
+# - Overwrite emulator's logging format.
+# + TXT, Log file(s) will be txt type(s), for example 'Module.txt'.
+# + HTML, Log file(s) will be html type(s), for example 'Module.html'.
+#
+# - Overwrited emulator logging output source.
+# + FILE, Logging to file(s).
+# + RDEBUG, Logging to using rdebug(s).
+#
+# - Overwrite hardware path setting (Same description as above in emulator path).
+# - Overwrite hardware's logging format(Same description as above in emulator format).
+# - Overwrite hardware's logging output source(Same description as above in emulator output).
+#
+# - File Creation Mode indicates file overwriting if file exist.
+# + OVERWRITE, Overwrites if file(s) exist.
+# + APPEND, Continue logging after the old logging information if file(s) exist.
+#
+# - Will thread id include to the log filename.
+# + YES, Thread id to log file(s) name, Example filename 'Module_b9.txt'.
+# + NO, No thread id to log file(s), Example filename 'Module.txt'.
+#
+# - Will time stamps include the to log file.
+# + YES, Time stamp added to each line in log file(s). Time stamp is
+# for example'12.Nov.2003 115958 LOGGING INFO'
+# + NO, No time stamp(s).
+#
+# - Will line breaks include to the log file.
+# + YES, Each logging event includes line break and next log event is in own line.
+# + NO, No line break(s).
+#
+# - Will event ranking include to the log file.
+# + YES, Event ranking number added to each line in log file(s). Ranking number
+# depends on environment's tics, for example(includes time stamp also)
+# '012 12.Nov.2003 115958 LOGGING INFO'
+# + NO, No event ranking.
+#
+# - Will write log file in unicode format.
+# + YES, Log file will be written in unicode format
+# + NO, Log will be written as normal, not unicode, file.
+#
+
+[Logger_Defaults]
+
+#NOTE: If you want to set Logger using next setting(s) remove comment(s)'#'
+
+CreateLogDirectories= YES # Possible values: YES or NO
+
+#EmulatorBasePath= C:\LOGS\TestFramework\
+#EmulatorFormat= HTML # Possible values: TXT or HTML
+#EmulatorOutput= FILE # Possible values: FILE or RDEBUG
+
+#HardwareBasePath= C:\
+#HardwareFormat= TXT # Possible values: TXT or HTML
+#HardwareOutput= FILE # Possible values: FILE or RDEBUG
+
+FileCreationMode= APPEND # Possible values: OVERWRITE or APPEND
+
+#ThreadIdToLogFile= YES # Possible values: YES or NO
+#WithTimeStamp= YES # Possible values: YES or NO
+#WithLineBreak= YES # Possible values: YES or NO
+#WithEventRanking= YES # Possible values: YES or NO
+
+[End_Logger_Defaults]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+# End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/tsrc/src/videoscheduler_apitest.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,201 @@
+/*
+* Copyright (c) 2002 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: ?Description*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <Stiftestinterface.h>
+#include "videoscheduler_apitest.h"
+#include <SettingServerClient.h>
+
+// EXTERNAL DATA STRUCTURES
+//extern ?external_data;
+
+// EXTERNAL FUNCTION PROTOTYPES
+//extern ?external_function( ?arg_type,?arg_type );
+
+// CONSTANTS
+//const ?type ?constant_var = ?constant;
+
+// MACROS
+//#define ?macro ?macro_def
+
+// LOCAL CONSTANTS AND MACROS
+//const ?type ?constant_var = ?constant;
+//#define ?macro_name ?macro_def
+
+// MODULE DATA STRUCTURES
+//enum ?declaration
+//typedef ?declaration
+
+// LOCAL FUNCTION PROTOTYPES
+//?type ?function_name( ?arg_type, ?arg_type );
+
+// FORWARD DECLARATIONS
+//class ?FORWARD_CLASSNAME;
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// ?function_name ?description.
+// ?description
+// Returns: ?value_1: ?description
+// ?value_n: ?description_line1
+// ?description_line2
+// -----------------------------------------------------------------------------
+//
+/*
+?type ?function_name(
+ ?arg_type arg, // ?description
+ ?arg_type arg) // ?description
+ {
+
+ ?code // ?comment
+
+ // ?comment
+ ?code
+ }
+*/
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::CVideoScheduler_ApiTest
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CVideoScheduler_ApiTest::CVideoScheduler_ApiTest(
+ CTestModuleIf& aTestModuleIf ):
+ CScriptBase( aTestModuleIf )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CVideoScheduler_ApiTest::ConstructL()
+ {
+ //Read logger settings to check whether test case name is to be
+ //appended to log file name.
+ RSettingServer settingServer;
+ TInt ret = settingServer.Connect();
+ if(ret != KErrNone)
+ {
+ User::Leave(ret);
+ }
+ // Struct to StifLogger settigs.
+ TLoggerSettings loggerSettings;
+ // Parse StifLogger defaults from STIF initialization file.
+ ret = settingServer.GetLoggerSettings(loggerSettings);
+ if(ret != KErrNone)
+ {
+ User::Leave(ret);
+ }
+ // Close Setting server session
+ settingServer.Close();
+
+ TFileName logFileName;
+
+ if(loggerSettings.iAddTestCaseTitle)
+ {
+ TName title;
+ TestModuleIf().GetTestCaseTitleL(title);
+ logFileName.Format(KVideoScheduler_ApiTestLogFileWithTitle, &title);
+ }
+ else
+ {
+ logFileName.Copy(KVideoScheduler_ApiTestLogFile);
+ }
+
+ iLog = CStifLogger::NewL( KVideoScheduler_ApiTestLogPath,
+ logFileName,
+ CStifLogger::ETxt,
+ CStifLogger::EFile,
+ EFalse );
+
+ SendTestClassVersion();
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CVideoScheduler_ApiTest* CVideoScheduler_ApiTest::NewL(
+ CTestModuleIf& aTestModuleIf )
+ {
+ CVideoScheduler_ApiTest* self = new (ELeave) CVideoScheduler_ApiTest( aTestModuleIf );
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+
+ return self;
+
+ }
+
+// Destructor
+CVideoScheduler_ApiTest::~CVideoScheduler_ApiTest()
+ {
+
+ // Delete resources allocated from test methods
+ Delete();
+
+ // Delete logger
+ delete iLog;
+
+ }
+
+//-----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::SendTestClassVersion
+// Method used to send version of test class
+//-----------------------------------------------------------------------------
+//
+void CVideoScheduler_ApiTest::SendTestClassVersion()
+ {
+ TVersion moduleVersion;
+ moduleVersion.iMajor = TEST_CLASS_VERSION_MAJOR;
+ moduleVersion.iMinor = TEST_CLASS_VERSION_MINOR;
+ moduleVersion.iBuild = TEST_CLASS_VERSION_BUILD;
+
+ TFileName moduleName;
+ moduleName = _L("VideoScheduler_ApiTest.dll");
+
+ TBool newVersionOfMethod = ETrue;
+ TestModuleIf().SendTestModuleVersion(moduleVersion, moduleName, newVersionOfMethod);
+ }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+// -----------------------------------------------------------------------------
+// LibEntryL is a polymorphic Dll entry point.
+// Returns: CScriptBase: New CScriptBase derived object
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CScriptBase* LibEntryL(
+ CTestModuleIf& aTestModuleIf ) // Backpointer to STIF Test Framework
+ {
+
+ return ( CScriptBase* ) CVideoScheduler_ApiTest::NewL( aTestModuleIf );
+
+ }
+
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/tsrc/src/videoscheduler_apitestblocks.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,1162 @@
+/*
+* Copyright (c) 2002 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: ?Description*
+*/
+
+
+
+
+// [INCLUDE FILES] - do not remove
+#include <e32svr.h>
+#include <StifParser.h>
+#include <Stiftestinterface.h>
+#include "videoscheduler_apitest.h"
+#include <S32MEM.H>
+
+#include <ipvideo/CCseSchedulerAPI.h>
+#include <ipvideo/CCseScheduledProgram.h>
+
+#include "vcxtestlog.h"
+
+// EXTERNAL DATA STRUCTURES
+//extern ?external_data;
+
+// EXTERNAL FUNCTION PROTOTYPES
+//extern ?external_function( ?arg_type,?arg_type );
+
+// CONSTANTS
+//const ?type ?constant_var = ?constant;
+
+// MACROS
+//#define ?macro ?macro_def
+
+// LOCAL CONSTANTS AND MACROS
+//const ?type ?constant_var = ?constant;
+//#define ?macro_name ?macro_def
+
+// MODULE DATA STRUCTURES
+//enum ?declaration
+//typedef ?declaration
+
+// LOCAL FUNCTION PROTOTYPES
+//?type ?function_name( ?arg_type, ?arg_type );
+
+// FORWARD DECLARATIONS
+//class ?FORWARD_CLASSNAME;
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// ?function_name ?description.
+// ?description
+// Returns: ?value_1: ?description
+// ?value_n: ?description_line1
+// ?description_line2
+// -----------------------------------------------------------------------------
+//
+/*
+?type ?function_name(
+ ?arg_type arg, // ?description
+ ?arg_type arg) // ?description
+ {
+
+ ?code // ?comment
+
+ // ?comment
+ ?code
+ }
+*/
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Delete
+// Delete here all resources allocated and opened from test methods.
+// Called from destructor.
+// -----------------------------------------------------------------------------
+//
+void CVideoScheduler_ApiTest::Delete()
+ {
+ if( iApi )
+ {
+ for( TInt i=0; i<iAddedProgramIds.Count(); i++ )
+ {
+ iApi->RemoveSchedule( iAddedProgramIds[i] );
+ }
+ }
+
+ delete iApi;
+ iApi = NULL;
+
+ delete iProgram;
+ iProgram = NULL;
+
+ delete iExternalizeBuff;
+ iExternalizeBuff = NULL;
+
+ iAddedProgramIds.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::RunMethodL
+// Run specified method. Contains also table of test mothods and their names.
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::RunMethodL(
+ CStifItemParser& aItem )
+ {
+
+ static TStifFunctionInfo const KFunctions[] =
+ {
+ // Copy this line for every implemented function.
+ // First string is the function name used in TestScripter script file.
+ // Second is the actual implementation member function.
+ ENTRY( "API_NewL", CVideoScheduler_ApiTest::API_NewL ),
+ ENTRY( "API_AddSchedule", CVideoScheduler_ApiTest::API_AddScheduleL ),
+ ENTRY( "API_RemoveSchedule", CVideoScheduler_ApiTest::API_RemoveScheduleL ),
+ ENTRY( "RemoveAllSchedules", CVideoScheduler_ApiTest::RemoveAllSchedulesL ),
+ ENTRY( "API_GetSchedule", CVideoScheduler_ApiTest::API_GetScheduleL ),
+ ENTRY( "API_GetSchedulesByAppUid", CVideoScheduler_ApiTest::API_GetSchedulesByAppUidL ),
+ ENTRY( "API_GetOverlappingSchedules", CVideoScheduler_ApiTest::API_GetOverlappingSchedulesL ),
+ ENTRY( "API_GetSchedulesByPluginUid", CVideoScheduler_ApiTest::API_GetSchedulesByPluginUidL ),
+ ENTRY( "API_GetSchedulesByType", CVideoScheduler_ApiTest::API_GetSchedulesByTypeL ),
+ ENTRY( "API_GetSchedulesByTime", CVideoScheduler_ApiTest::API_GetSchedulesByTimeL ),
+
+ ENTRY( "Program_NewL", CVideoScheduler_ApiTest::Program_NewL ),
+ ENTRY( "Program_NewLFromProgram", CVideoScheduler_ApiTest::Program_NewLFromProgramL ),
+ ENTRY( "Program_Externalize", CVideoScheduler_ApiTest::Program_ExternalizeLL ),
+ ENTRY( "Program_Internalize", CVideoScheduler_ApiTest::Program_InternalizeLL ),
+ ENTRY( "Program_ExternalizeLength", CVideoScheduler_ApiTest::Program_ExternalizeLengthL ),
+ ENTRY( "Program_SetPluginType", CVideoScheduler_ApiTest::Program_SetPluginTypeL ),
+ ENTRY( "Program_SetName", CVideoScheduler_ApiTest::Program_SetNameL ),
+ ENTRY( "Program_SetStartTime", CVideoScheduler_ApiTest::Program_SetStartTimeL ),
+ ENTRY( "Program_SetEndTime", CVideoScheduler_ApiTest::Program_SetEndTimeL ),
+ ENTRY( "Program_SetAppUid", CVideoScheduler_ApiTest::Program_SetAppUidL ),
+ ENTRY( "Program_SetPluginUid", CVideoScheduler_ApiTest::Program_SetPluginUidL ),
+ ENTRY( "Program_SetApplicationData", CVideoScheduler_ApiTest::Program_SetApplicationDataLL ),
+ ENTRY( "Program_SetDbIdentifier", CVideoScheduler_ApiTest::Program_SetDbIdentifierL ),
+ ENTRY( "Program_SetScheduleType", CVideoScheduler_ApiTest::Program_SetScheduleTypeL ),
+ ENTRY( "Program_PluginType", CVideoScheduler_ApiTest::Program_PluginTypeL ),
+ ENTRY( "Program_Name", CVideoScheduler_ApiTest::Program_NameL ),
+ ENTRY( "Program_StartTime", CVideoScheduler_ApiTest::Program_StartTimeL ),
+ ENTRY( "Program_EndTime", CVideoScheduler_ApiTest::Program_EndTimeL ),
+ ENTRY( "Program_AppUid", CVideoScheduler_ApiTest::Program_AppUidL ),
+ ENTRY( "Program_PluginUid", CVideoScheduler_ApiTest::Program_PluginUidL ),
+ ENTRY( "Program_ApplicationData", CVideoScheduler_ApiTest::Program_ApplicationDataL ),
+ ENTRY( "Program_DbIdentifier", CVideoScheduler_ApiTest::Program_DbIdentifierL ),
+ ENTRY( "Program_ScheduleType", CVideoScheduler_ApiTest::Program_ScheduleTypeL ),
+ ENTRY( "Program_DebugDump", CVideoScheduler_ApiTest::Program_DebugDumpL ),
+
+ ENTRY( "Program_SetToFuture", CVideoScheduler_ApiTest::Program_SetToFutureL ),
+ // [test cases entries] - Do not remove
+
+ };
+
+ const TInt count = sizeof( KFunctions ) /
+ sizeof( TStifFunctionInfo );
+
+ return RunInternalL( KFunctions, count, aItem );
+
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::LogMethod
+// Generate log from current method
+// -----------------------------------------------------------------------------
+//
+void CVideoScheduler_ApiTest::LogMethod( TPtrC aMethod )
+ {
+ // Print to UI
+ TBuf< 64 > buffer;
+ buffer.Format( KLogLocation, &aMethod );
+ TestModuleIf().Printf( 0, KTestModuleName, buffer );
+ // Print to log file
+ iLog->Log( buffer );
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::API_NewL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::API_NewL( CStifItemParser& aItem )
+ {
+ LogMethod(_L("API_NewL"));
+
+ TInt err( KErrNone );
+
+ iApi = CCseSchedulerApi::NewL();
+
+ TInt createProgram( 1 );
+ if( aItem.GetNextInt( createProgram ) != KErrNone )
+ {
+ createProgram = 1;
+ }
+
+ if( createProgram == 1 )
+ {
+ iProgram = CCseScheduledProgram::NewL();
+
+ RPointerArray<CCseScheduledProgram> programs;
+ err = iApi->GetSchedulesByAppUid( 0x020202, programs );
+ if( err == KErrNone )
+ {
+ for( TInt i=0; i < programs.Count(); i++ )
+ {
+ iApi->RemoveSchedule( programs[i]->DbIdentifier() );
+ }
+ }
+ programs.ResetAndDestroy();
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::API_AddScheduleL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::API_AddScheduleL( CStifItemParser& /*aItem*/ )
+ {
+ LogMethod(_L("API_AddSchedule"));
+ VCXLOGLO1("CVideoScheduler_ApiTest::API_AddScheduleL ------>");
+
+ TInt err( KErrNone );
+
+ err = iApi->AddSchedule( *iProgram );
+ VCXLOGLO2("CVideoScheduler_ApiTest::API_AddScheduleL: DBID after: %d", iProgram->DbIdentifier() );
+ iAddedProgramIds.Append( iProgram->DbIdentifier() );
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::API_RemoveScheduleL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::API_RemoveScheduleL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::API_RemoveScheduleL ------>");
+ LogMethod(_L("API_RemoveScheduleL"));
+
+ TInt err( KErrNone );
+
+ VCXLOGLO2("CVideoScheduler_ApiTest::API_RemoveScheduleL: DBID: %d", iProgram->DbIdentifier() );
+
+ TUint32 id = iProgram->DbIdentifier();
+ err = iApi->RemoveSchedule( id );
+
+ for( TInt i=0; i<iAddedProgramIds.Count(); i++ )
+ {
+ if( iAddedProgramIds[i] == id )
+ {
+ iAddedProgramIds.Remove( i );
+ break;
+ }
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::RemoveAllSchedulesL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::RemoveAllSchedulesL( CStifItemParser& /*aItem*/ )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::RemoveAllSchedulesL ------>");
+ LogMethod(_L("RemoveAllSchedulesL"));
+
+ TInt err( KErrNone );
+
+ while( iAddedProgramIds.Count() )
+ {
+ VCXLOGLO2("CVideoScheduler_ApiTest::RemoveAllSchedulesL -- remove ID %d", iAddedProgramIds[0]);
+ err = iApi->RemoveSchedule( iAddedProgramIds[0] );
+
+ iAddedProgramIds.Remove( 0 );
+
+ if( err != KErrNone )
+ {
+ VCXLOGLO2("CVideoScheduler_ApiTest::RemoveAllSchedulesL -- Failed: %d", err);
+ }
+ }
+
+ VCXLOGLO2("CVideoScheduler_ApiTest::RemoveAllSchedulesL <------ %d", err);
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::API_GetScheduleL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::API_GetScheduleL( CStifItemParser& /*aItem*/ )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::API_GetScheduleL ------>");
+ LogMethod(_L("API_GetScheduleL"));
+
+ TInt err( KErrNone );
+
+ CCseScheduledProgram* program = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( program );
+
+ err = iApi->GetSchedule( iProgram->DbIdentifier(), program );
+
+ if( err == KErrNone )
+ {
+ if( !program )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::API_GetScheduleL: Error, program is NULL.");
+ err = KErrCorrupt;
+ }
+ else
+ {
+ err = ComparePrograms( *program, *iProgram );
+ }
+ }
+
+ CleanupStack::PopAndDestroy( program );
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::API_GetSchedulesByAppUidL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::API_GetSchedulesByAppUidL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::API_GetSchedulesByAppUidL ------>");
+ LogMethod(_L("API_GetSchedulesByAppUidL"));
+
+ TInt err( KErrNone );
+
+ TInt appUid( 0 );
+ User::LeaveIfError( aItem.GetNextInt( appUid ) );
+
+ TInt expectedCount(0);
+ User::LeaveIfError( aItem.GetNextInt( expectedCount ) );
+
+ RPointerArray<CCseScheduledProgram> programs;
+
+ err = iApi->GetSchedulesByAppUid( appUid, programs );
+
+ if( err == KErrNone )
+ {
+ if( programs.Count() != expectedCount )
+ {
+ err = KErrCorrupt;
+ }
+ else
+ if( programs.Count() > 0 )
+ {
+ delete iProgram;
+ iProgram = NULL;
+
+ iProgram = programs[0];
+ programs.Remove( 0 );
+ }
+ }
+
+ programs.ResetAndDestroy();
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::API_GetOverlappingSchedulesL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::API_GetOverlappingSchedulesL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::API_GetOverlappingSchedulesL ------>");
+ LogMethod(_L("API_GetOverlappingSchedulesL"));
+
+ TInt err( KErrNone );
+
+ TInt expectedCount(0);
+ User::LeaveIfError( aItem.GetNextInt( expectedCount ) );
+
+ RPointerArray<CCseScheduledProgram> programs;
+
+ err = iApi->GetOverlappingSchedules( *iProgram, programs );
+
+ if( err == KErrNone )
+ {
+ if( programs.Count() != expectedCount )
+ {
+ err = KErrCorrupt;
+ }
+ else
+ if( programs.Count() > 0 )
+ {
+ delete iProgram;
+ iProgram = NULL;
+
+ iProgram = programs[0];
+ programs.Remove( 0 );
+ }
+ }
+
+ programs.ResetAndDestroy();
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::API_GetSchedulesByPluginUidL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::API_GetSchedulesByPluginUidL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::API_GetSchedulesByPluginUidL ------>");
+ LogMethod(_L("API_GetSchedulesByPluginUidL"));
+
+ TInt err( KErrNone );
+
+ TInt pluginUid( 0 );
+ User::LeaveIfError( aItem.GetNextInt( pluginUid ) );
+
+ TInt expectedCount(0);
+ User::LeaveIfError( aItem.GetNextInt( expectedCount ) );
+
+ RPointerArray<CCseScheduledProgram> programs;
+
+ err = iApi->GetSchedulesByPluginUid( pluginUid, programs );
+
+ if( err == KErrNone )
+ {
+ if( programs.Count() != expectedCount )
+ {
+ err = KErrCorrupt;
+ }
+ else
+ if( programs.Count() > 0 )
+ {
+ delete iProgram;
+ iProgram = NULL;
+
+ iProgram = programs[0];
+ programs.Remove( 0 );
+ }
+ }
+
+ programs.ResetAndDestroy();
+
+ return err;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::API_GetSchedulesByTypeL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::API_GetSchedulesByTypeL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::API_GetSchedulesByTypeL ------>");
+ LogMethod(_L("API_GetSchedulesByTypeL"));
+
+ TInt err( KErrNone );
+
+ TInt type(0);
+ User::LeaveIfError( aItem.GetNextInt( type ) );
+
+ TInt expectedCount(0);
+ User::LeaveIfError( aItem.GetNextInt( expectedCount ) );
+
+ RPointerArray<CCseScheduledProgram> programs;
+
+ err = iApi->GetSchedulesByType( type, programs );
+
+ if( err == KErrNone )
+ {
+ VCXLOGLO2("CVideoScheduler_ApiTest::API_GetSchedulesByTypeL count: %d", programs.Count());
+ VCXLOGLO2("CVideoScheduler_ApiTest::API_GetSchedulesByTypeL expected: %d", expectedCount);
+ if( programs.Count() != expectedCount )
+ {
+ err = KErrCorrupt;
+ }
+ else
+ if( programs.Count() > 0 )
+ {
+ delete iProgram;
+ iProgram = NULL;
+
+ iProgram = programs[0];
+ programs.Remove( 0 );
+ }
+ }
+
+ programs.ResetAndDestroy();
+
+ return err;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::API_GetSchedulesByTimeL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::API_GetSchedulesByTimeL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::API_GetSchedulesByTimeL ------>");
+ LogMethod(_L("API_GetSchedulesByTimeL"));
+
+ TInt err( KErrNone );
+ TInt intervalStart( 0 );
+ TInt intervalEnd( 0 );
+
+ User::LeaveIfError( aItem.GetNextInt( intervalStart ) );
+ User::LeaveIfError( aItem.GetNextInt( intervalEnd ) );
+
+ TTime startTime( 0 );
+ TTime endTime( 0 );
+
+ startTime.UniversalTime();
+ endTime.UniversalTime();
+
+ startTime += TTimeIntervalSeconds( intervalStart );
+ endTime += TTimeIntervalSeconds( intervalEnd );
+
+ TInt expectedCount(0);
+ User::LeaveIfError( aItem.GetNextInt( expectedCount ) );
+
+ RPointerArray<CCseScheduledProgram> programs;
+
+ err = iApi->GetSchedulesByTime( startTime, endTime, programs );
+
+ if( err == KErrNone )
+ {
+ if( programs.Count() != expectedCount )
+ {
+ err = KErrCorrupt;
+ }
+ else
+ if( programs.Count() > 0 )
+ {
+ delete iProgram;
+ iProgram = NULL;
+
+ iProgram = programs[0];
+ programs.Remove( 0 );
+ }
+ }
+
+ programs.ResetAndDestroy();
+
+ return err;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_NewL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_NewL( CStifItemParser& /*aItem*/ )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_NewL ------>");
+ LogMethod(_L("Program_NewL"));
+
+ TInt err( KErrNone );
+
+ iProgram = CCseScheduledProgram::NewL();
+ iProgram->SetAppUid( 0x020202 );
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_NewLFromProgramL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_NewLFromProgramL( CStifItemParser& /*aItem*/ )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_NewLFromProgramL ------>");
+ LogMethod(_L("Program_NewLFromProgramL"));
+
+ TInt err( KErrNone );
+
+ CCseScheduledProgram* program = iProgram;
+ iProgram = NULL;
+
+ CleanupStack::PushL( program );
+ iProgram = CCseScheduledProgram::NewL( *program );
+ CleanupStack::PopAndDestroy( program );
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_ExternalizeLL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_ExternalizeLL( CStifItemParser& /*aItem*/ )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_ExternalizeLL ------>");
+ LogMethod(_L("Program_ExternalizeLL"));
+
+ TInt err( KErrNone );
+
+ TUint32 dataSize = iProgram->ExternalizeLength();
+
+ delete iExternalizeBuff;
+ iExternalizeBuff = NULL;
+ iExternalizeBuff = HBufC8::NewL( dataSize );
+ TPtr8 buffPtr( iExternalizeBuff->Des() );
+
+ RDesWriteStream stream;
+ stream.Open( buffPtr );
+ iProgram->ExternalizeL( stream );
+ stream.CommitL();
+ stream.Close();
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_InternalizeLL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_InternalizeLL( CStifItemParser& /*aItem*/ )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_InternalizeLL ------>");
+ LogMethod(_L("Program_InternalizeLL"));
+
+ TInt err( KErrNone );
+
+ CCseScheduledProgram* program = CCseScheduledProgram::NewL();
+ CleanupStack::PushL( program );
+
+ RDesReadStream stream;
+ TPtr8 buffPtr( iExternalizeBuff->Des() );
+ stream.Open( buffPtr );
+ program->InternalizeL( stream );
+ stream.Close();
+
+ err = ComparePrograms( *program, *iProgram );
+
+ CleanupStack::PopAndDestroy( program );
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_ExternalizeLengthL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_ExternalizeLengthL( CStifItemParser& /*aItem*/ )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_ExternalizeLengthL ------>");
+ LogMethod(_L("Program_ExternalizeLengthL"));
+
+ TInt err( KErrNone );
+
+ iProgram->ExternalizeLength();
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_SetPluginTypeL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_SetPluginTypeL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_SetPluginTypeL ------>");
+ LogMethod(_L("Program_SetPluginTypeL"));
+
+ TInt err( KErrNone );
+
+ TInt pluginType;
+ User::LeaveIfError( aItem.GetNextInt( pluginType ) );
+
+ iProgram->SetPluginType( pluginType );
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_SetNameL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_SetNameL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_SetNameL ------>");
+ LogMethod(_L("Program_SetNameL"));
+
+ TInt err( KErrNone );
+
+ aItem.SetParsingType( CStifItemParser::EQuoteStyleParsing );
+
+ TPtrC name;
+ User::LeaveIfError( aItem.GetNextString( name ) );
+
+ TBuf8<1024> name8;
+ name8.Copy( name );
+
+ iProgram->SetName( name8 );
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_SetStartTimeL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_SetStartTimeL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_SetStartTimeL ------>");
+ LogMethod(_L("Program_SetStartTimeL"));
+
+ TInt err( KErrNone );
+
+ aItem.SetParsingType( CStifItemParser::EQuoteStyleParsing );
+
+ TPtrC dayString;
+ User::LeaveIfError( aItem.GetNextString( dayString ) );
+
+ TTime time( dayString );
+
+ iProgram->SetStartTime( time );
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_SetEndTimeL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_SetEndTimeL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_SetEndTimeL ------>");
+ LogMethod(_L("Program_SetEndTimeL"));
+
+ TInt err( KErrNone );
+
+ aItem.SetParsingType( CStifItemParser::EQuoteStyleParsing );
+
+ TPtrC dayString;
+ User::LeaveIfError( aItem.GetNextString( dayString ) );
+
+ TTime time( dayString );
+
+ iProgram->SetEndTime( time );
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_SetAppUidL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_SetAppUidL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_SetAppUidL ------>");
+ LogMethod(_L("Program_SetAppUidL"));
+
+ TInt err( KErrNone );
+
+ TInt uid( 0 );
+ User::LeaveIfError( aItem.GetNextInt( uid ) );
+
+ iProgram->SetAppUid( uid );
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_SetPluginUidL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_SetPluginUidL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_SetPluginUidL ------>");
+ LogMethod(_L("Program_SetPluginUidL"));
+
+ TInt err( KErrNone );
+
+ TInt uid( 0 );
+ User::LeaveIfError( aItem.GetNextInt( uid ) );
+
+ iProgram->SetPluginUid( uid );
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_SetApplicationDataLL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_SetApplicationDataLL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_SetApplicationDataLL ------>");
+ LogMethod(_L("Program_SetApplicationDataLL"));
+
+ TInt err( KErrNone );
+
+ aItem.SetParsingType( CStifItemParser::EQuoteStyleParsing );
+
+ TPtrC data;
+ User::LeaveIfError( aItem.GetNextString( data ) );
+
+ TBuf8<1024> data8;
+ data8.Copy( data );
+
+ iProgram->SetApplicationDataL( data8 );
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_SetDbIdentifierL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_SetDbIdentifierL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_SetDbIdentifierL ------>");
+ LogMethod(_L("Program_SetDbIdentifierL"));
+
+ TInt err( KErrNone );
+
+ TInt id;
+ User::LeaveIfError( aItem.GetNextInt( id ) );
+
+ iProgram->SetDbIdentifier( id );
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_SetScheduleTypeL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_SetScheduleTypeL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_SetScheduleTypeL ------>");
+ LogMethod(_L("Program_SetScheduleTypeL"));
+
+ TInt err( KErrNone );
+
+ TInt type;
+ User::LeaveIfError( aItem.GetNextInt( type ) );
+
+ iProgram->SetScheduleType( type );
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_PluginTypeL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_PluginTypeL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_PluginTypeL ------>");
+ LogMethod(_L("Program_PluginTypeL"));
+
+ TInt err( KErrNone );
+
+ TInt pluginType;
+ TInt expectedPluginType;
+ User::LeaveIfError( aItem.GetNextInt( expectedPluginType ) );
+
+ pluginType = iProgram->PluginType();
+
+ if( pluginType != expectedPluginType )
+ {
+ err = KErrCorrupt;
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_NameL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_NameL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_NameL ------>");
+ LogMethod(_L("Program_NameL"));
+
+ TInt err( KErrNone );
+
+ aItem.SetParsingType( CStifItemParser::EQuoteStyleParsing );
+
+ TPtrC expectedName;
+ User::LeaveIfError( aItem.GetNextString( expectedName ) );
+
+ const TPtrC8 name8 = iProgram->Name();
+
+ TBuf<1024> name;
+ name.Copy( name8 );
+
+ if( name != expectedName )
+ {
+ err = KErrCorrupt;
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_StartTimeL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_StartTimeL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_StartTimeL ------>");
+ LogMethod(_L("Program_StartTimeL"));
+
+ TInt err( KErrNone );
+
+ aItem.SetParsingType( CStifItemParser::EQuoteStyleParsing );
+
+ TPtrC dayString;
+ User::LeaveIfError( aItem.GetNextString( dayString ) );
+
+ TTime expectedTime( dayString );
+
+ TTime time = iProgram->StartTime();
+
+ if( time != expectedTime )
+ {
+ err = KErrCorrupt;
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_EndTimeL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_EndTimeL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_EndTimeL ------>");
+ LogMethod(_L("Program_EndTimeL"));
+
+ TInt err( KErrNone );
+
+ aItem.SetParsingType( CStifItemParser::EQuoteStyleParsing );
+
+ TPtrC dayString;
+ User::LeaveIfError( aItem.GetNextString( dayString ) );
+
+ TTime expectedTime( dayString );
+
+ TTime time = iProgram->EndTime();
+
+ if( time != expectedTime )
+ {
+ err = KErrCorrupt;
+ }
+
+ return err;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_SetToFutureL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_SetToFutureL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_SetToFutureL ------>");
+ LogMethod(_L("Program_SetToFutureL"));
+
+ TInt err( KErrNone );
+ TInt intervalStart( 0 );
+ TInt intervalEnd( 0 );
+
+ User::LeaveIfError( aItem.GetNextInt( intervalStart ) );
+ User::LeaveIfError( aItem.GetNextInt( intervalEnd ) );
+
+ TTime startTime( 0 );
+ TTime endTime( 0 );
+
+ startTime.UniversalTime();
+ endTime.UniversalTime();
+
+ startTime += TTimeIntervalSeconds( intervalStart );
+ endTime += TTimeIntervalSeconds( intervalEnd );
+
+ iProgram->SetStartTime( startTime );
+ iProgram->SetEndTime( endTime );
+
+ VCXLOGLO3("CVideoScheduler_ApiTest::Program_SetToFutureL -- start %d end %d", startTime, endTime);
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_AppUidL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_AppUidL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_AppUidL ------>");
+ LogMethod(_L("Program_AppUidL"));
+
+ TInt err( KErrNone );
+
+ TInt expectedUid;
+ User::LeaveIfError( aItem.GetNextInt( expectedUid ) );
+
+ TInt32 uid = iProgram->AppUid();
+
+ if( uid != expectedUid )
+ {
+ err = KErrCorrupt;
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_PluginUidL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_PluginUidL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_PluginUidL ------>");
+ LogMethod(_L("Program_PluginUidL"));
+
+ TInt err( KErrNone );
+
+ TInt expectedUid;
+ User::LeaveIfError( aItem.GetNextInt( expectedUid ) );
+
+ TInt32 uid = iProgram->PluginUid();
+
+ if( uid != expectedUid )
+ {
+ err = KErrCorrupt;
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_ApplicationDataL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_ApplicationDataL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_ApplicationDataL ------>");
+ LogMethod(_L("Program_ApplicationDataL"));
+
+ TInt err( KErrNone );
+
+ aItem.SetParsingType( CStifItemParser::EQuoteStyleParsing );
+
+ TPtrC expectedData;
+ User::LeaveIfError( aItem.GetNextString( expectedData ) );
+
+ const TPtrC8 data8 = iProgram->ApplicationData();
+
+ TBuf<1024> data;
+ data.Copy( data8 );
+
+ if( data != expectedData )
+ {
+ err = KErrCorrupt;
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_DbIdentifierL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_DbIdentifierL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_DbIdentifierL ------>");
+ LogMethod(_L("Program_DbIdentifierL"));
+
+ TInt err( KErrNone );
+
+ TInt expectedId;
+ User::LeaveIfError( aItem.GetNextInt( expectedId ) );
+
+ TUint32 id = iProgram->DbIdentifier();
+
+ if( id != expectedId )
+ {
+ err = KErrCorrupt;
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_ScheduleTypeL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_ScheduleTypeL( CStifItemParser& aItem )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::API_AddScheduleL ------>");
+ LogMethod(_L("Program_ScheduleTypeL"));
+
+ TInt err( KErrNone );
+
+ TInt expectedType;
+ User::LeaveIfError( aItem.GetNextInt( expectedType ) );
+
+ TInt32 type = iProgram->ScheduleType();
+
+ if( type != expectedType )
+ {
+ err = KErrCorrupt;
+ }
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::Program_DebugDumpL
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::Program_DebugDumpL( CStifItemParser& /*aItem*/ )
+ {
+ VCXLOGLO1("CVideoScheduler_ApiTest::Program_DebugDumpL ------>");
+ LogMethod(_L("Program_DebugDumpL"));
+
+ TInt err( KErrNone );
+
+ iProgram->DebugDump();
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CVideoScheduler_ApiTest::ComparePrograms
+// -----------------------------------------------------------------------------
+//
+TInt CVideoScheduler_ApiTest::ComparePrograms( CCseScheduledProgram& aProgram1, CCseScheduledProgram& aProgram2 )
+ {
+ TInt err( KErrNone );
+
+ if( aProgram1.DbIdentifier() != aProgram2.DbIdentifier() )
+ {
+ VCXLOGLO3("CVideoScheduler_ApiTest::ComparePrograms: Error, db identifiers differ: %d vs. %d.", aProgram1.DbIdentifier(), aProgram2.DbIdentifier() );
+ err = KErrCorrupt;
+ }
+
+ return err;
+ }
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+// None
+
+// [End of File] - Do not remove
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoutils_plat/videoscheduler_api/videoscheduler_api.metaxml Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0" ?>
+<api id="2bbecbc42e04c522a1ed2abb6a71e504" dataversion="1.0">
+<name>Video Scheduler API</name>
+<description>Video Scheduler API provides an interface for creating scheduled events (for example, timed TV recording).</description>
+<type>C++</type>
+<subsystem>videoserviceutils</subsystem>
+<libs><lib name="CseSchedulerClient.lib"/>
+</libs>
+<release category="domain" sinceversion="5.1"/>
+<attributes>
+<htmldocprovided>no</htmldocprovided>
+<adaptation>no</adaptation>
+</attributes>
+</api>