|
1 /* |
|
2 * Copyright (c) 2006-2008 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: Double hold state for hold state machine. |
|
15 * |
|
16 */ |
|
17 |
|
18 |
|
19 #include <badesca.h> |
|
20 #include <mcesession.h> |
|
21 #include <mcertpsource.h> |
|
22 #include <mcertpsink.h> |
|
23 #include <mcemediastream.h> |
|
24 #include <mceaudiostream.h> |
|
25 #include "svpholddhstate.h" |
|
26 #include "svpholdcontroller.h" |
|
27 #include "svpholdobserver.h" |
|
28 #include "svpholdmediahandler.h" |
|
29 #include "svplogger.h" |
|
30 |
|
31 |
|
32 // --------------------------------------------------------------------------- |
|
33 // CSVPHoldDHState::CSVPHoldDHState |
|
34 // --------------------------------------------------------------------------- |
|
35 // |
|
36 CSVPHoldDHState::CSVPHoldDHState() |
|
37 { |
|
38 } |
|
39 |
|
40 // --------------------------------------------------------------------------- |
|
41 // CSVPHoldDHState::NewL |
|
42 // --------------------------------------------------------------------------- |
|
43 // |
|
44 CSVPHoldDHState* CSVPHoldDHState::NewLC() |
|
45 { |
|
46 CSVPHoldDHState* self = new ( ELeave ) CSVPHoldDHState; |
|
47 CleanupStack::PushL( self ); |
|
48 return self; |
|
49 } |
|
50 |
|
51 // --------------------------------------------------------------------------- |
|
52 // CSVPHoldDHState::~CSVPHoldDHState |
|
53 // --------------------------------------------------------------------------- |
|
54 // |
|
55 CSVPHoldDHState::~CSVPHoldDHState() |
|
56 { |
|
57 } |
|
58 |
|
59 // --------------------------------------------------------------------------- |
|
60 // CSVPHoldDHState::DoApplyL |
|
61 // --------------------------------------------------------------------------- |
|
62 // |
|
63 void CSVPHoldDHState::DoApplyL( CSVPHoldContext& aContext ) |
|
64 { |
|
65 SVPDEBUG1( "CSVPHoldDHState::DoApply" ); |
|
66 CMceSession* session = aContext.SessionObject(); |
|
67 const RPointerArray< CMceMediaStream >& streams = session->Streams(); |
|
68 TSVPHoldStateIndex nextState = KSVPHoldEstablishingStateIndex; |
|
69 |
|
70 TInt audioStreamsHandled = 0; |
|
71 TInt streamCount = streams.Count(); |
|
72 for ( TInt i = 0; i < streamCount; i++ ) |
|
73 { |
|
74 CMceMediaStream* mediaStream = streams[ i ]; |
|
75 TMceMediaType mediaType = mediaStream->Type(); |
|
76 if ( KMceAudio == mediaType ) |
|
77 { |
|
78 // This media is audio stream. Handling depends on the request |
|
79 nextState = PerformRequestL( aContext, *mediaStream, *session ); |
|
80 audioStreamsHandled++; |
|
81 } |
|
82 } |
|
83 |
|
84 if ( 0 == audioStreamsHandled ) |
|
85 { |
|
86 SVPDEBUG1( "CSVPHoldDHState::DoApply - No streams - Leave" ); |
|
87 User::Leave( KErrSVPHoldStateError ); |
|
88 } |
|
89 |
|
90 aContext.SetCurrentStateL( aContext, nextState ); |
|
91 SVPDEBUG1( "CSVPHoldDHState::DoApply - Handled" ); |
|
92 } |
|
93 |
|
94 // --------------------------------------------------------------------------- |
|
95 // CSVPHoldDHState::PerformRequestL |
|
96 // --------------------------------------------------------------------------- |
|
97 // |
|
98 TSVPHoldStateIndex |
|
99 CSVPHoldDHState::PerformRequestL( CSVPHoldContext& aContext, |
|
100 CMceMediaStream& aMediaStream, |
|
101 CMceSession& aSession ) |
|
102 { |
|
103 TSVPHoldStateIndex nextState = KSVPHoldEstablishingStateIndex; |
|
104 switch ( aContext.HoldRequest() ) |
|
105 { |
|
106 case ESVPLocalDoubleHoldResume: |
|
107 { |
|
108 ResumeDoubleHoldSessionLocallyL( aContext, aMediaStream, aSession ); |
|
109 break; |
|
110 } |
|
111 |
|
112 case ESVPRemoteDoubleHoldResume: |
|
113 { |
|
114 RemoteDoubleHoldSessionResumeL( aContext, aMediaStream, aSession ); |
|
115 break; |
|
116 } |
|
117 |
|
118 case ESVPLocalHold: |
|
119 case ESVPLocalResume: |
|
120 case ESVPLocalDoubleHold: |
|
121 case ESVPRemoteHold: |
|
122 case ESVPRemoteResume: |
|
123 case ESVPRemoteDoubleHold: |
|
124 { |
|
125 // Cannot occur in doublehold state |
|
126 User::Leave( KErrSVPHoldStateError ); |
|
127 break; |
|
128 } |
|
129 |
|
130 default: |
|
131 { |
|
132 // Error in request solving,no state change needed: |
|
133 nextState = KSVPHoldDHStateIndex; |
|
134 |
|
135 SVPDEBUG2( "CSVPHoldDHState::PerformRequestL - Error, request %i", |
|
136 aContext.HoldRequest() ); |
|
137 break; |
|
138 } |
|
139 } |
|
140 |
|
141 return nextState; |
|
142 } |
|
143 |
|
144 // --------------------------------------------------------------------------- |
|
145 // CSVPHoldDHState::ResumeDoubleHoldSessionLocallyL |
|
146 // --------------------------------------------------------------------------- |
|
147 // |
|
148 void CSVPHoldDHState:: |
|
149 ResumeDoubleHoldSessionLocallyL( CSVPHoldContext& aContext, |
|
150 CMceMediaStream& aMediaStream, |
|
151 CMceSession& aSession ) |
|
152 { |
|
153 SVPDEBUG1( "CSVPHoldDHState::ResumeDoubleHoldSessionLocallyL - In" ); |
|
154 |
|
155 // Local resume from double holded stream. Handle media stream: |
|
156 aContext.MediaHandler(). |
|
157 PerformMediaActionL( aMediaStream, |
|
158 ESVPLocalDoubleHoldResume ); |
|
159 |
|
160 // Update session |
|
161 aSession.UpdateL(); |
|
162 SVPDEBUG1( "CSVPHoldDHState::ResumeDoubleHoldSessionLocallyL - done" ); |
|
163 } |
|
164 |
|
165 // --------------------------------------------------------------------------- |
|
166 // CSVPHoldDHState::RemoteSoubleHoldSessionResumeL |
|
167 // --------------------------------------------------------------------------- |
|
168 // |
|
169 void CSVPHoldDHState:: |
|
170 RemoteDoubleHoldSessionResumeL( CSVPHoldContext& aContext, |
|
171 CMceMediaStream& aMediaStream, |
|
172 CMceSession& aSession ) |
|
173 { |
|
174 // Remote Resume from double holded stream: |
|
175 SVPDEBUG1( "CSVPHoldDHState::RemoteDoubleHoldSessionResumeL - In" ); |
|
176 |
|
177 MDesC8Array* attributeLines = aMediaStream.MediaAttributeLinesL(); |
|
178 CleanupDeletePushL( attributeLines ); |
|
179 |
|
180 // Check that request has reasonable direction attribute: |
|
181 TSVPHoldRequestType attribute = |
|
182 aContext.SolveRequestL( aSession, attributeLines ); |
|
183 |
|
184 if ( ESVPNoType == attribute ) |
|
185 { |
|
186 // Not hold request |
|
187 SVPDEBUG1( "CSVPHoldDHState::RemoteSoubleHoldSessionResumeL:"); |
|
188 SVPDEBUG1( "Not hold request" ); |
|
189 |
|
190 User::Leave( KErrSVPHoldNotHoldRequest ); |
|
191 } |
|
192 |
|
193 CleanupStack::PopAndDestroy( attributeLines ); |
|
194 |
|
195 // Handle media stream: |
|
196 aContext.MediaHandler(). |
|
197 PerformMediaActionL( aMediaStream, |
|
198 ESVPRemoteDoubleHoldResume ); |
|
199 |
|
200 // Update session |
|
201 aSession.UpdateL(); |
|
202 |
|
203 SVPDEBUG1( "CSVPHoldDHState::RemoteSoubleHoldSessionResumeL - done" ); |
|
204 } |
|
205 |
|
206 // --------------------------------------------------------------------------- |
|
207 // CSVPHoldDHState::DoEnter |
|
208 // --------------------------------------------------------------------------- |
|
209 // |
|
210 void CSVPHoldDHState::DoEnter( CSVPHoldContext& aContext ) |
|
211 { |
|
212 SVPDEBUG1( "CSVPHoldDHState::DoEnter" ); |
|
213 |
|
214 TInt err = KErrNone; |
|
215 TRAP( err, aContext.MediaHandler().DisableAudioL( aContext ) ); |
|
216 |
|
217 // succesfull action is informed to client |
|
218 switch ( aContext.HoldRequest() ) |
|
219 { |
|
220 case ESVPLocalDoubleHold: |
|
221 { |
|
222 SVPDEBUG1( "CSVPHoldDHState::DoEnter - LocalDoubleHold" ); |
|
223 aContext.HoldObserver().SessionLocallyHeld(); |
|
224 break; |
|
225 } |
|
226 |
|
227 case ESVPRemoteDoubleHold: |
|
228 { |
|
229 SVPDEBUG1( "CSVPHoldDHState::DoEnter - RemoteDoubleHold" ); |
|
230 aContext.HoldObserver().SessionRemoteHeld(); |
|
231 break; |
|
232 } |
|
233 |
|
234 default: |
|
235 { |
|
236 // Nothing to do; occurs only with state rollback |
|
237 SVPDEBUG1( "CSVPHoldDHState::DoEnter - Default" ); |
|
238 break; |
|
239 } |
|
240 } |
|
241 } |
|
242 |
|
243 // --------------------------------------------------------------------------- |
|
244 // CSVPHoldDHState::IsOutEstablishingStateActive |
|
245 // --------------------------------------------------------------------------- |
|
246 // |
|
247 TBool CSVPHoldDHState::IsOutEstablishingStateActive() |
|
248 { |
|
249 return EFalse; |
|
250 } |
|
251 |