bluetooth/gavdp/test/tavsrcOperations.cpp
branchRCL_3
changeset 23 5b153be919d4
parent 22 786b94c6f0a4
child 24 e9b924a62a66
equal deleted inserted replaced
22:786b94c6f0a4 23:5b153be919d4
     1 // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 #include "tavsrcOperations.h"
       
    17 
       
    18 // The opcodes used internally to CTavsrcOperations
       
    19 static const TInt KTavsrcOpCodeConnect = 0x00000001;
       
    20 static const TInt KTavsrcOpCodeCancel = 0x00000002;
       
    21 static const TInt KTavsrcOpCodeDiscoverSEPs = 0x00000004;
       
    22 static const TInt KTavsrcOpCodeCreateBearers = 0x00000008;
       
    23 static const TInt KTavsrcOpCodeCloseBearers = 0x00000010;
       
    24 static const TInt KTavsrcOpCodeContentProtection = 0x00000020;
       
    25 static const TInt KTavsrcOpCodeGetCapabilities = 0x00000040;
       
    26 static const TInt KTavsrcOpCodeStartStreams = 0x00000080;
       
    27 static const TInt KTavsrcOpCodeSuspendStreams = 0x00000100;
       
    28 static const TInt KTavsrcOpCodeEchoStorm = 0x00000200;
       
    29 static const TInt KTavsrcOpCodeAbort = 0x00000400;
       
    30 static const TInt KTavsrcOpCodeStream = 0x00000800;
       
    31 static const TInt KTavsrcOpCodeStreamFaster = 0x00001000;
       
    32 static const TInt KTavsrcOpCodeStreamSlower = 0x00002000;
       
    33 static const TInt KTavsrcOpCodeAutoStream = 0x00004000;
       
    34 static const TInt KTavsrcOpCodeStopStream = 0x00008000;
       
    35 static const TInt KTavsrcOpCodeRegisterSEP = 0x00010000;
       
    36 static const TInt KTavsrcOpCodeRegisterMultipleSEPs = 0x00020000;
       
    37 static const TInt KTavsrcOpCodeStartSrc = 0x00040000;
       
    38 static const TInt KTavsrcOpCodeStopSrc = 0x00080000;
       
    39 static const TInt KTavsrcOpCodeDisconnectSrc = 0x00100000;
       
    40 static const TInt KTavsrcOpCodeConfigureSEP = 0x00200000;
       
    41 static const TInt KTavsrcOpCodeReconfigureSEP = 0x00400000;
       
    42 static const TInt KTavsrcOpCodePacketDropIoctl = 0x00800000;
       
    43 static const TInt KTavsrcOpCodeVolumeUp = 0x01000000;
       
    44 static const TInt KTavsrcOpCodeVolumeDown = 0x02000000;
       
    45 static const TInt KTavsrcOpCodeBackwards = 0x04000000;
       
    46 static const TInt KTavsrcOpCodeForwards = 0x08000000;
       
    47 static const TInt KTavsrcOpCodePlay = 0x10000000;
       
    48 static const TInt KTavsrcOpCodeStop = 0x20000000;
       
    49 static const TInt KTavsrcOpCodeExit = 0x40000000;
       
    50 static const TInt KTavsrcOpCodeToggleSafeMode = 0x80000000;
       
    51 
       
    52 // all the AVRCP opcodes
       
    53 static const TInt KTavsrcOpCodeAvrcp = KTavsrcOpCodeVolumeUp | KTavsrcOpCodeVolumeDown | KTavsrcOpCodeBackwards | KTavsrcOpCodeForwards | KTavsrcOpCodePlay | KTavsrcOpCodeStop;
       
    54 
       
    55 // all always available opcodes
       
    56 static const TInt KTavsrcOpCodeAlwaysAvailable = KTavsrcOpCodeAvrcp | KTavsrcOpCodeToggleSafeMode | KTavsrcOpCodeCancel | KTavsrcOpCodeExit | KTavsrcOpCodeStopSrc | KTavsrcOpCodeRegisterSEP | KTavsrcOpCodeRegisterMultipleSEPs;
       
    57 
       
    58 // all possible opcodes
       
    59 static const TInt KTavsrcOpCodeAll = 0xffffffff;
       
    60 
       
    61 // The next opcodes for every command, 0 means to not change state
       
    62 static const TInt KTavsrcOpConnectNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeDiscoverSEPs | KTavsrcOpCodeAutoStream;
       
    63 static const TInt KTavsrcOpCancelNextOperations = 0;
       
    64 static const TInt KTavsrcOpDiscoverSEPsNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeGetCapabilities;
       
    65 static const TInt KTavsrcOpCreateBearersNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeStartStreams | KTavsrcOpCodeCloseBearers;
       
    66 static const TInt KTavsrcOpCloseBearersNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeCreateBearers;
       
    67 static const TInt KTavsrcOpContentProtectionNextOperations = 0;
       
    68 static const TInt KTavsrcOpGetCapabilitiesNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeConfigureSEP;
       
    69 static const TInt KTavsrcOpStartStreamsNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeStream | KTavsrcOpCodeCloseBearers | KTavsrcOpCodeSuspendStreams | KTavsrcOpCodeAbort;
       
    70 static const TInt KTavsrcOpSuspendStreamsNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeStartStreams | KTavsrcOpCodeAbort | KTavsrcOpCodeReconfigureSEP;
       
    71 static const TInt KTavsrcOpEchoStormNextOperations = 0;
       
    72 static const TInt KTavsrcOpAbortNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeStartStreams | KTavsrcOpCodeCloseBearers;
       
    73 static const TInt KTavsrcOpStreamNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeStopStream | KTavsrcOpCodeCloseBearers | KTavsrcOpCodeSuspendStreams | KTavsrcOpCodeAbort | KTavsrcOpCodeStreamFaster | KTavsrcOpCodeStreamSlower;
       
    74 static const TInt KTavsrcOpStreamFasterNextOperations = 0;
       
    75 static const TInt KTavsrcOpStreamSlowerNextOperations = 0;
       
    76 static const TInt KTavsrcOpAutoStreamNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeStopStream | KTavsrcOpCodeCloseBearers | KTavsrcOpCodeSuspendStreams;
       
    77 static const TInt KTavsrcOpStopStreamNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeCloseBearers | KTavsrcOpCodeStream | KTavsrcOpCodeSuspendStreams | KTavsrcOpCodeAbort;
       
    78 static const TInt KTavsrcOpRegisterSEPNextOperations = 0;
       
    79 static const TInt KTavsrcOpRegisterMultipleSEPsNextOperations = 0;
       
    80 static const TInt KTavsrcOpStartSrcNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeConnect;
       
    81 static const TInt KTavsrcOpStopSrcNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeStartSrc;
       
    82 static const TInt KTavsrcOpDisconnectSrcNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeConnect;
       
    83 static const TInt KTavsrcOpConfigureSEPNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeCreateBearers;
       
    84 static const TInt KTavsrcOpReconfigureSEPNextOperations = KTavsrcOpCodeAlwaysAvailable | KTavsrcOpCodeDisconnectSrc | KTavsrcOpCodeStartStreams | KTavsrcOpCodeAbort | KTavsrcOpCodeReconfigureSEP;
       
    85 static const TInt KTavsrcOpPacketDropIoctlNextOperations = 0;
       
    86 static const TInt KTavsrcOpVolumeUpNextOperations = 0;
       
    87 static const TInt KTavsrcOpVolumeDownNextOperations = 0;
       
    88 static const TInt KTavsrcOpBackwardsNextOperations = 0;
       
    89 static const TInt KTavsrcOpForwardsNextOperations = 0;
       
    90 static const TInt KTavsrcOpPlayNextOperations = 0;
       
    91 static const TInt KTavsrcOpStopNextOperations = 0;
       
    92 static const TInt KTavsrcOpExitNextOperations = 0;
       
    93 static const TInt KTavsrcOpToggleSafeModeNextOperations = 0;
       
    94 
       
    95 // TTavsrcOperation
       
    96 TTavsrcOperation::TTavsrcOperation(TInt aOpCode, TChar aOperation, TInt aNextOpCodes)
       
    97 	: iOpCode(aOpCode), iOperation(aOperation), iNextOpCodes(aNextOpCodes)
       
    98 	{	
       
    99 	}
       
   100 
       
   101 /*static*/ TBool TTavsrcOperation::OperationMatchesAndAllowed(const TTavsrcOperation& aOpA, const TTavsrcOperation& aOpB)
       
   102 	{
       
   103 	return ((aOpA.iOperation == aOpB.iOperation) && (aOpA.iNextOpCodes & aOpB.iOpCode));
       
   104 	}
       
   105 
       
   106 TInt TTavsrcOperation::GetNextOpCodes() const
       
   107 	{
       
   108 	return iNextOpCodes;
       
   109 	}
       
   110 
       
   111 // CTavsrcOperations
       
   112 CTavsrcOperations* CTavsrcOperations::NewL()
       
   113 	{
       
   114 	CTavsrcOperations* operations = new (ELeave) CTavsrcOperations;
       
   115 	CleanupStack::PushL(operations);
       
   116 	operations->ConstructL();
       
   117 	CleanupStack::Pop(operations);
       
   118 	return operations;
       
   119 	}
       
   120 
       
   121 void CTavsrcOperations::ConstructL()
       
   122 	{
       
   123 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeConnect, KTavsrcOpConnect, KTavsrcOpConnectNextOperations));
       
   124 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeCancel, KTavsrcOpCancel, KTavsrcOpCancelNextOperations));
       
   125 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeDiscoverSEPs, KTavsrcOpDiscoverSEPs, KTavsrcOpDiscoverSEPsNextOperations));
       
   126 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeCreateBearers, KTavsrcOpCreateBearers, KTavsrcOpCreateBearersNextOperations));
       
   127 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeCloseBearers, KTavsrcOpCloseBearers, KTavsrcOpCloseBearersNextOperations));
       
   128 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeContentProtection, KTavsrcOpContentProtection, KTavsrcOpContentProtectionNextOperations));
       
   129 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeGetCapabilities, KTavsrcOpGetCapabilities, KTavsrcOpGetCapabilitiesNextOperations));
       
   130 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeStartStreams, KTavsrcOpStartStreams, KTavsrcOpStartStreamsNextOperations));
       
   131 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeSuspendStreams, KTavsrcOpSuspendStreams, KTavsrcOpSuspendStreamsNextOperations));
       
   132 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeEchoStorm, KTavsrcOpEchoStorm, KTavsrcOpEchoStormNextOperations));
       
   133 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeAbort, KTavsrcOpAbort, KTavsrcOpAbortNextOperations));
       
   134 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeStream, KTavsrcOpStream, KTavsrcOpStreamNextOperations));
       
   135 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeStreamFaster, KTavsrcOpStreamFaster, KTavsrcOpStreamFasterNextOperations));
       
   136 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeStreamSlower, KTavsrcOpStreamSlower, KTavsrcOpStreamSlowerNextOperations));
       
   137 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeAutoStream, KTavsrcOpAutoStream, KTavsrcOpAutoStreamNextOperations));
       
   138 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeStopStream, KTavsrcOpStopStream, KTavsrcOpStopStreamNextOperations));
       
   139 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeRegisterSEP, KTavsrcOpRegisterSEP, KTavsrcOpRegisterSEPNextOperations));
       
   140 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeRegisterMultipleSEPs, KTavsrcOpRegisterMultipleSEPs, KTavsrcOpRegisterMultipleSEPsNextOperations));
       
   141 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeStartSrc, KTavsrcOpStartSrc, KTavsrcOpStartSrcNextOperations));
       
   142 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeStopSrc, KTavsrcOpStopSrc, KTavsrcOpStopSrcNextOperations));
       
   143 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeDisconnectSrc, KTavsrcOpDisconnectSrc, KTavsrcOpDisconnectSrcNextOperations));
       
   144 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeConfigureSEP, KTavsrcOpConfigureSEP, KTavsrcOpConfigureSEPNextOperations));
       
   145 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeReconfigureSEP, KTavsrcOpReconfigureSEP, KTavsrcOpReconfigureSEPNextOperations));
       
   146 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodePacketDropIoctl, KTavsrcOpPacketDropIoctl, KTavsrcOpPacketDropIoctlNextOperations));
       
   147 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeVolumeUp, KTavsrcOpVolumeUp, KTavsrcOpVolumeUpNextOperations));
       
   148 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeVolumeDown, KTavsrcOpVolumeDown, KTavsrcOpVolumeDownNextOperations));
       
   149 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeBackwards, KTavsrcOpBackwards, KTavsrcOpBackwardsNextOperations));
       
   150 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeForwards, KTavsrcOpForwards, KTavsrcOpForwardsNextOperations));
       
   151 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodePlay, KTavsrcOpPlay, KTavsrcOpPlayNextOperations));
       
   152 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeStop, KTavsrcOpStop, KTavsrcOpStopNextOperations));
       
   153 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeExit, KTavsrcOpExit, KTavsrcOpExitNextOperations));
       
   154 	iOperations.AppendL(TTavsrcOperation(KTavsrcOpCodeToggleSafeMode, KTavsrcOpToggleSafeMode, KTavsrcOpToggleSafeModeNextOperations));
       
   155 	
       
   156 	// tavsrc always starts the src initially
       
   157 	iLastOperationIndex = GetAllowedOperationIndex(KTavsrcOpStartSrc, KTavsrcOpCodeAll);
       
   158 	User::LeaveIfError(iLastOperationIndex);
       
   159 	}
       
   160 
       
   161 CTavsrcOperations::CTavsrcOperations()
       
   162 	: iPendingOperationIndex(KErrNotFound), iSafeMode(ETrue)
       
   163 	{
       
   164 	}
       
   165 
       
   166 CTavsrcOperations::~CTavsrcOperations()
       
   167 	{
       
   168 	iOperations.Close();
       
   169 	}
       
   170 
       
   171 // Returns the index into iOperations array if aOperation is allowed as the next operation
       
   172 // according to aAllowedNextOpcodes or an error
       
   173 TInt CTavsrcOperations::GetAllowedOperationIndex(TChar aOperation, TInt aAllowedNextOpcodes)
       
   174 	{
       
   175 	TIdentityRelation<TTavsrcOperation> matchFunc(TTavsrcOperation::OperationMatchesAndAllowed);
       
   176 	return (iOperations.Find(TTavsrcOperation(0, aOperation, aAllowedNextOpcodes), matchFunc));
       
   177 	}
       
   178 
       
   179 TBool CTavsrcOperations::IsOperationAllowed(TChar aOperation)
       
   180 	{
       
   181 	TBool ret = EFalse;
       
   182 	
       
   183 	if (!SafeMode())
       
   184 		{
       
   185 		// if we are not in safe mode then any operation is allowed
       
   186 		ret = ETrue;
       
   187 		}
       
   188 	else
       
   189 		{ 
       
   190 		ret = (GetAllowedOperationIndex(aOperation, iOperations[iLastOperationIndex].GetNextOpCodes()) >= 0);
       
   191 		}
       
   192 	return ret;
       
   193 	}
       
   194 
       
   195 TInt CTavsrcOperations::BeginOperation(TChar aOperation)
       
   196 	{
       
   197 	TInt rerr = KErrNone;
       
   198 
       
   199 	if ((iPendingOperationIndex >= 0) && (aOperation != KTavsrcOpCancel))
       
   200 		{
       
   201 		// an operation is in progress, block until it has completed
       
   202 		rerr = KErrNotReady;
       
   203 		}
       
   204 	else
       
   205 		{
       
   206 		TInt allowedNextOpCodes = iOperations[iLastOperationIndex].GetNextOpCodes();
       
   207 		
       
   208 		if (!SafeMode())
       
   209 			{
       
   210 			// not in safe mode so any operation should be allowed
       
   211 			allowedNextOpCodes = KTavsrcOpCodeAll;
       
   212 			}
       
   213 		
       
   214 		TInt index = GetAllowedOperationIndex(aOperation, allowedNextOpCodes);
       
   215 
       
   216 		if (index >= 0)
       
   217 			{
       
   218 			// we have a valid operation
       
   219 			iPendingOperationIndex = index;
       
   220 			}
       
   221 		else
       
   222 			{
       
   223 			// aOperation is not a supported command, return error
       
   224 			rerr = index;
       
   225 			}
       
   226 		}
       
   227 	return rerr;
       
   228 	}
       
   229 
       
   230 void CTavsrcOperations::EndOperation(TChar aOperation, TInt aError)
       
   231 	{
       
   232 	// if an error has occured the state hasn't moved on
       
   233 	if (!aError)
       
   234 		{
       
   235 		// check to see if there is an outstanding operation
       
   236 		if (iPendingOperationIndex < 0)
       
   237 			{
       
   238 			// we have no pending operation, this means that the remote has moved our state on,
       
   239 			// to keep the allowed operations in step pretend that we moved the state on ourselves
       
   240 			iPendingOperationIndex = GetAllowedOperationIndex(aOperation, KTavsrcOpCodeAll);
       
   241 			}
       
   242 	
       
   243 		// update current state if there is any valid operations in the pending operation
       
   244 		if (iOperations[iPendingOperationIndex].GetNextOpCodes() != 0)
       
   245 			{
       
   246 			iLastOperationIndex = iPendingOperationIndex;
       
   247 			}
       
   248 		}
       
   249 	iPendingOperationIndex = KErrNotFound;
       
   250 	}
       
   251 
       
   252 TBool CTavsrcOperations::SafeMode()
       
   253 	{
       
   254 	return iSafeMode;
       
   255 	}
       
   256 
       
   257 void CTavsrcOperations::SetSafeMode(TBool aSafeMode)
       
   258 	{
       
   259 	iSafeMode = aSafeMode;
       
   260 	}