22 #include "muscommon.h" |
22 #include "muscommon.h" |
23 #include "muslogger.h" |
23 #include "muslogger.h" |
24 #include "musmanager.h" |
24 #include "musmanager.h" |
25 #include "musuid.hrh" |
25 #include "musuid.hrh" |
26 #include "musunittesting.h" |
26 #include "musunittesting.h" |
27 #include "mussettings.h" |
|
28 |
27 |
29 #include <mussettingskeys.h> |
|
30 #include <sipstrings.h> |
28 #include <sipstrings.h> |
31 #include <sipstrconsts.h> |
29 #include <sipstrconsts.h> |
32 #include <sdpdocument.h> |
30 #include <featmgr.h> |
33 #include <sdpmediafield.h> |
|
34 #include <sdpcodecstringpool.h> |
|
35 #include <sdpcodecstringconstants.h> |
|
36 #include <sdpattributefield.h> |
|
37 |
|
38 _LIT8( KSendRecv, "sendrecv"); // For attribute checks |
|
39 _LIT8( KRecvOnly, "recvonly"); // For attribute checks |
|
40 _LIT8( KSendOnly, "sendonly" ); // For attribute checks |
|
41 |
31 |
42 _LIT8(KCapabilities, |
32 _LIT8(KCapabilities, |
43 "<SIP_CLIENT ALLOW_STARTING=\"YES\">\ |
33 "<SIP_CLIENT ALLOW_STARTING=\"YES\">\ |
44 <SIP_HEADERS>\ |
34 <SIP_HEADERS>\ |
45 <ACCEPT value=\"application/sdp\"/>\ |
35 <ACCEPT value=\"application/sdp\"/>\ |
103 // |
88 // |
104 void CMusSipCrPlugin::ConstructL() |
89 void CMusSipCrPlugin::ConstructL() |
105 { |
90 { |
106 MUS_LOG( "mus: [MUSSCR] -> CMusSipCrPlugin::ConstructL()" ); |
91 MUS_LOG( "mus: [MUSSCR] -> CMusSipCrPlugin::ConstructL()" ); |
107 iManager = CMusManager::NewL(); |
92 iManager = CMusManager::NewL(); |
108 |
|
109 TRAPD( err, SdpCodecStringPool::OpenL() ); |
|
110 |
|
111 switch ( err ) |
|
112 { |
|
113 case KErrNone: |
|
114 { |
|
115 //close pool at destructor, not opened by others |
|
116 iCloseStringPool = ETrue; |
|
117 break; |
|
118 } |
|
119 |
|
120 case KErrAlreadyExists: |
|
121 { |
|
122 //already opened, do not try to close at destructor |
|
123 iCloseStringPool = EFalse; |
|
124 break; |
|
125 } |
|
126 |
|
127 default: |
|
128 { |
|
129 User::Leave( err ); |
|
130 } |
|
131 } |
|
132 |
|
133 MUS_LOG( "mus: [MUSSCR] <- CMusSipCrPlugin::ConstructL()" ); |
93 MUS_LOG( "mus: [MUSSCR] <- CMusSipCrPlugin::ConstructL()" ); |
134 } |
94 } |
135 |
95 |
136 |
96 |
137 // ------------------------------------------------------------------------- |
97 // ------------------------------------------------------------------------- |
139 // ------------------------------------------------------------------------- |
99 // ------------------------------------------------------------------------- |
140 // |
100 // |
141 TUid CMusSipCrPlugin::ChannelL( RStringF aMethod, |
101 TUid CMusSipCrPlugin::ChannelL( RStringF aMethod, |
142 const TDesC8& /*aRequestUri*/, |
102 const TDesC8& /*aRequestUri*/, |
143 const RPointerArray<CSIPHeaderBase>& /*aHeaders*/, |
103 const RPointerArray<CSIPHeaderBase>& /*aHeaders*/, |
144 const TDesC8& aContent, |
104 const TDesC8& /*aContent*/, |
145 const CSIPContentTypeHeader* /*aContentType*/ ) |
105 const CSIPContentTypeHeader* /*aContentType*/) |
146 { |
106 { |
147 MUS_LOG( "mus: [MUSSCR] -> CMusSipCrPlugin::ChannelL()" ); |
107 FeatureManager::InitializeLibL(); |
148 |
108 TBool support = FeatureManager::FeatureSupported( KFeatureIdMultimediaSharing ); |
|
109 FeatureManager::UnInitializeLib(); |
|
110 TUid uid; |
|
111 uid.iUid = ( TInt ) CMusManager::ESipInviteNotDesired; |
|
112 if ( support ) |
|
113 { |
|
114 uid = DoChannelL( aMethod ); |
|
115 } |
|
116 return uid; |
|
117 } |
|
118 |
|
119 |
|
120 // ------------------------------------------------------------------------- |
|
121 // CMusSipCrPlugin::DoChannelL |
|
122 // ------------------------------------------------------------------------- |
|
123 TUid CMusSipCrPlugin::DoChannelL( RStringF aMethod ) |
|
124 { |
|
125 MUS_LOG( "mus: [MUSSCR] -> CMusSipCrPlugin::DoChannelL()" ); |
|
126 |
149 if ( aMethod == SIPStrings::StringF( SipStrConsts::EOptions ) ) |
127 if ( aMethod == SIPStrings::StringF( SipStrConsts::EOptions ) ) |
150 { |
128 { |
151 TUid uid; |
129 TUid uid; |
152 uid.iUid = ( TInt ) CMusManager::ESipOptions; |
130 uid.iUid = ( TInt ) CMusManager::ESipOptions; |
153 MUS_LOG1( "mus: [MUSSCR] <- CMusSipCrPlugin::ChannelL(): KSipOptions %d", |
131 MUS_LOG1( "mus: [MUSSCR] <- CMusSipCrPlugin::DoChannelL(): KSipOptions %d", |
154 uid.iUid ); |
132 uid.iUid ); |
155 return uid; |
133 return uid; |
156 } |
134 } |
157 else |
135 else |
158 { |
136 { |
162 if( capability < KErrNone || |
140 if( capability < KErrNone || |
163 capability >= MultimediaSharing::EErrServerShutDown ) |
141 capability >= MultimediaSharing::EErrServerShutDown ) |
164 { |
142 { |
165 TUid uid; |
143 TUid uid; |
166 uid.iUid = ( TInt ) CMusManager::ESipInviteNotDesired; |
144 uid.iUid = ( TInt ) CMusManager::ESipInviteNotDesired; |
167 MUS_LOG1( "mus: [MUSSCR] <- CMusSipCrPlugin::ChannelL(): \ |
145 MUS_LOG1( "mus: [MUSSCR] <- CMusSipCrPlugin::DoChannelL(): \ |
168 KNotAllowedSipInvite %d", uid.iUid ); |
146 KNotAllowedSipInvite %d", uid.iUid ); |
169 return uid; |
147 return uid; |
170 } |
148 } |
171 else |
149 else |
172 { |
150 { |
173 TUid uid; |
151 TUid uid; |
174 uid.iUid = ( TInt ) CMusManager::ESipInviteDesired; |
152 uid.iUid = ( TInt ) CMusManager::ESipInviteDesired; |
175 TBool twoWaySupported = MultimediaSharingSettings::VideoDirectionL() == |
153 MUS_LOG1( "mus: [MUSSCR] <- CMusSipCrPlugin::DoChannelL(): \ |
176 MusSettingsKeys::ETwoWayVideo; |
|
177 |
|
178 if ( ( aContent.Length() > 0 ) && twoWaySupported ) |
|
179 { |
|
180 MUS_LOG( "mus: [MUSSCR] 2 way supported, parsing SDP..." ); |
|
181 CSdpDocument* sdpDocument = CSdpDocument::DecodeLC( aContent ); |
|
182 TBool sendRecv = CheckForSendRecvAttributeL( sdpDocument->MediaFields() ); |
|
183 if ( sendRecv ) |
|
184 { |
|
185 uid.iUid = ( TInt ) CMusManager::ESipInviteDesired2WayVideo; |
|
186 } |
|
187 |
|
188 CleanupStack::PopAndDestroy( sdpDocument ); |
|
189 } |
|
190 |
|
191 MUS_LOG1( "mus: [MUSSCR] <- CMusSipCrPlugin::ChannelL(): \ |
|
192 KAllowedSipInvite %d", uid.iUid ); |
154 KAllowedSipInvite %d", uid.iUid ); |
193 return uid; |
155 return uid; |
194 } |
156 } |
195 } |
157 } |
196 } |
158 } |
197 |
159 |
198 // ------------------------------------------------------------------------- |
160 |
199 // CMusSipCrPlugin::CheckForSendRecvAttribute |
|
200 // ------------------------------------------------------------------------- |
|
201 // |
|
202 TBool CMusSipCrPlugin::CheckForSendRecvAttributeL( |
|
203 RPointerArray<CSdpMediaField>& aFields ) const |
|
204 { |
|
205 MUS_LOG( "mus: [MUSSCR] -> CMusSipCrPlugin::CheckForSendRecvAttribute()" ); |
|
206 |
|
207 TBool sendRecv = EFalse; |
|
208 TBool sendAttrFound = EFalse; |
|
209 TBool videoFound = EFalse; |
|
210 RStringF videoType = SdpCodecStringPool::StringPoolL().StringF( |
|
211 SdpCodecStringConstants::EMediaVideo, |
|
212 SdpCodecStringPool::StringTableL() ); |
|
213 const TInt fieldcount = aFields.Count(); |
|
214 |
|
215 for ( TInt i = 0; i < fieldcount && !videoFound; i++ ) |
|
216 { |
|
217 CSdpMediaField* mField = aFields[i]; |
|
218 |
|
219 //only check video fields |
|
220 videoFound = mField->Media() == videoType; |
|
221 |
|
222 if ( videoFound ) |
|
223 { |
|
224 RPointerArray< CSdpAttributeField > attrList = |
|
225 mField->AttributeFields(); |
|
226 |
|
227 TInt attrCount = attrList.Count(); |
|
228 for (TInt j = 0; j < attrCount && !sendAttrFound; j++ ) |
|
229 { |
|
230 CSdpAttributeField* attributeField = attrList[j]; |
|
231 RStringF attribute = attributeField->Attribute(); |
|
232 |
|
233 if ( KErrNotFound != attribute.DesC().FindF( KSendRecv ) ) |
|
234 { |
|
235 sendRecv = ETrue; |
|
236 sendAttrFound = ETrue; |
|
237 MUS_LOG( "mus: [MUSSCR] <sendrecv> attribute found!" ); |
|
238 } |
|
239 else if ( ( KErrNotFound != attribute.DesC().FindF( KSendOnly ) ) || |
|
240 ( KErrNotFound != attribute.DesC().FindF( KRecvOnly ) ) ) |
|
241 { |
|
242 MUS_LOG( "mus: [MUSSCR] <sendonly>/<recvonly> attribute found!" ); |
|
243 sendAttrFound = ETrue; |
|
244 } |
|
245 } |
|
246 |
|
247 if ( !sendAttrFound ) |
|
248 { |
|
249 MUS_LOG( "mus: [MUSSCR] no send/recv related attributes found!" ); |
|
250 sendRecv = ETrue; |
|
251 } |
|
252 } |
|
253 } |
|
254 MUS_LOG1( "mus: [MUSSCR] <- CMusSipCrPlugin::CheckForSendRecvAttribute(), \ |
|
255 sendrecv: %d", sendRecv ); |
|
256 |
|
257 return sendRecv; |
|
258 } |
|
259 |
161 |
260 // ------------------------------------------------------------------------- |
162 // ------------------------------------------------------------------------- |
261 // CMusSipCrPlugin::ConnectL |
163 // CMusSipCrPlugin::ConnectL |
262 // ------------------------------------------------------------------------- |
164 // ------------------------------------------------------------------------- |
263 // |
165 // |
264 void CMusSipCrPlugin::ConnectL( TUid aUid ) |
166 void CMusSipCrPlugin::ConnectL( TUid aUid ) |
265 { |
167 { |
266 MUS_LOG1( "mus: [MUSSCR] -> CMusSipCrPlugin::ConnectL( %d )", aUid.iUid ); |
168 MUS_LOG1( "mus: [MUSSCR] -> CMusSipCrPlugin::ConnectL( %d )", aUid.iUid ); |
267 if ( aUid.iUid == CMusManager::ESipOptions || |
169 if ( aUid.iUid == CMusManager::ESipOptions || |
268 aUid.iUid == CMusManager::ESipInviteDesired || |
170 aUid.iUid == CMusManager::ESipInviteDesired || |
269 aUid.iUid == CMusManager::ESipInviteDesired2WayVideo || |
|
270 aUid.iUid == CMusManager::ESipInviteNotDesired ) |
171 aUid.iUid == CMusManager::ESipInviteNotDesired ) |
271 { |
172 { |
272 iManager->HandleSipRequestL(( CMusManager::TRequestType ) aUid.iUid ); |
173 iManager->HandleSipRequestL(( CMusManager::TRequestType ) aUid.iUid ); |
273 } |
174 } |
274 else |
175 else |