|
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 } |