int SdpBuild::checkCodec( bool testReInvite, SipCallMember *member, bool forceHold , bool *srtpErr) { bool holdMe=false; cntParam=0; setRecvonly(false); ReInvite=testReInvite; int status = (int)SipCall::GarKeinCall; int isRtpMap=0; int i=0, j=0; QString transT; bool evaluateV=false, evaluateA=false, evaluateAV=false; QString mstr = member->getSessionDescription(); QString ipaddress; QString curline; QString portstr; QString codecstr; QString codecstr1; QString codecstr2; int receivedAudioMediaNumber = 0, receivedVideoMediaNumber = 0; QString dp=":"; QString sec; mstr += '\n'; // Guarentee termination if( mstr.left( mstr.find( '\n' ) ) != "v=0" ) { return doReturn (status); } mstr.remove( 0, mstr.find( '\n' ) + 1 ); while( mstr.length() > 2 ) { curline = mstr.left( mstr.find( '\n' ) ); mstr.remove( 0, mstr.find( '\n' ) + 1 ); if( curline.left( curline.find( '=' ) ) == "c" ) { if( curline.contains("IP4") ) { ipaddress = curline.mid( curline.find( "IP4" ) + 4 ).stripWhiteSpace(); } else { ipaddress = curline.mid( curline.find( "IP6" ) + 4 ).stripWhiteSpace(); } } if( curline.contains("m=audio")) { if(ipaddress.contains("0.0.0.0") || ipaddress.contains("::0") || forceHold){ status = (int) SipCall::putMeOnHold; setExtHost(ipaddress); holdMe = true; } else { if(evaluateV==true) { evaluateAV=true; status = (int)SipCall::auviCall; } else { status = (int)SipCall::StandardCall; evaluateA=true; } if ( ( curline.contains("RTP/SAVP") && (sessionC->getSrtpMode() != 1) )|| ( curline.contains("RTP/AVP") && (sessionC->getSrtpMode() != 0) ) ) { *srtpErr = true; } setAudioPort(curline.section(' ',1,1)); setExtHost(ipaddress); int i = (-1); do { i++; acc[i] = curline.section(' ', i+3, i+3); } while (acc[i].length() != 0); receivedAudioMediaNumber = i; } } if( curline.contains("m=video")) { if(ipaddress.contains("0.0.0.0")|| ipaddress.contains("::0") || forceHold){ status = (int) SipCall::putMeOnHold; setExtHost(ipaddress); holdMe = true; } else { if(evaluateA==true) { evaluateAV=true; status = (int)SipCall::auviCall; } else { status = (int)SipCall::videoCall; evaluateV=true; } setExtPort(curline.section(' ',1,1)); setExtHost(ipaddress); int i = (-1); do { i++; vcc[i] = curline.section(' ', i+3, i+3); } while (vcc[i].length() != 0); receivedVideoMediaNumber = i; } } if( ( curline.contains("m=application") ) ) { if(ipaddress.contains("0.0.0.0") || ipaddress.contains("::0") || forceHold){; status = (int) SipCall::putMeOnHold; setExtHost(ipaddress); holdMe = true; } else { setExtHost(ipaddress); setExtPort(curline.section(' ',1,1)); transT=curline.section(' ',2,2); sec=curline.section(' ',3,3); status = checkVectorId(status,sec); // find the load type call->setRemoteStart(false); // if(status==0){ return doReturn (status); // error } if(!testTrans(status,transT)) return doReturn (0); } } if( curline.contains("a=")) { if (curline.contains("a=sendonly") || curline.contains("a=inactive") || curline.contains("a=recvonly") ) { status = (int) SipCall::putMeOnHold; if( curline.contains("a=sendonly")) { setRecvonly(true); } if(KStatics::haveIPv6){ setExtHost( "::0"); } else { setExtHost("0.0.0.0"); } return doReturn (status); } if (holdMe) { return doReturn (status); //hold was detected by ipaddress } // if (curline.contains("a=fmtp:" + sec) ) {// we have a=vec or a=cmd if(curline.contains("rstart")) { call->setRemoteStart(true); return doReturn (status); } } // we look for audio and video if( curline.contains("a=rtpmap")) { isRtpMap++; codecstr=curline.section(' ',1,1); codecstr1=curline.section(':',1,1); codecstr2=codecstr1.section(' ',0,0); // STORE RECEIVED MEDIA ATTRIBUTES bool concerningAudio = false; // search for audio i=0; while ( i<receivedAudioMediaNumber) { if (codecstr2 == acc[i]) { acstr[i] = codecstr.section('/',0,0); concerningAudio = true; break; } i++; } // search for video, if not audio if (concerningAudio == false) { for (i=0; i<receivedVideoMediaNumber; i++) { if (codecstr2 == vcc[i]) { vcstr[i] = codecstr.section('/',0,0); break; } } } } if ( curline.contains("a=fmtp:97")) { // looks strange, but works, as only ILBC uses responsePay if ( curline.contains ("mode=30") ) tempresponsepay = 240; if ( curline.contains ("mode=20") ) tempresponsepay = 160; } } } // END OF WHILE-LOOP if( (isRtpMap<receivedAudioMediaNumber) && ( evaluateA || evaluateV || evaluateAV) ){ for(i=0;i<=receivedAudioMediaNumber;i++) { for(j=0;j<=NAUDIO;j++) { if (acc[i] == sessionC->getACodecNum(j) ) { if(acstr[i] == "" )acstr[i] = sessionC->getACodecName(j); break; } } } for(i=0;i<=receivedVideoMediaNumber;i++) { for(j=0;j<=NAUDIO;j++) { if (vcc[i] == sessionC->getCodecNum(j) ) { vcstr[i] = sessionC->getCodecName(j); break; } } } } if( evaluateV || evaluateAV) { // *** VIDEO *** if (videoMediaNegotiationINVITE(receivedVideoMediaNumber) == false) { status=0; // no good codec for us; audiocheck is not necessary any longer return doReturn (status); } } if( evaluateA || evaluateAV) { // *** AUDIO *** if (audioMediaNegotiationINVITE(receivedAudioMediaNumber) == false) { status=0; // no good codec for us; return doReturn (status); } } // We have a good Codec return doReturn (status); }
void CWsGceCscBase::SetupL() { iDoTearDown=ETrue; iRed.SetInternal(0xFFFF0000); iGreen.SetInternal(0xFF00FF00); iBlue.SetInternal(0xFF0000FF); iCyan.SetInternal(0xFF00FFFF); iMagenta.SetInternal(0xFFFF00FF); iYellow.SetInternal(0xFFFFFF00); iWhite.SetInternal(0xFFFFFFFF); ASSERT_EQUALS_X(iSession.Connect(), KErrNone); {//Stolen from TAuto CloseAllPanicWindows() TInt idFocus = iSession.GetFocusWindowGroup(); TWsEvent event; event.SetType(EEventKey); //EEventKeyDown TKeyEvent *keyEvent = event.Key(); keyEvent->iCode = EKeyEscape; keyEvent->iScanCode = EStdKeyEscape; keyEvent->iModifiers = 0; TInt theLimit = 50; while(idFocus != NULL && (theLimit-- > 0)) { iSession.SendEventToAllWindowGroups(event); TInt idNewFocus = iSession.GetFocusWindowGroup(); if (idNewFocus!=idFocus) { INFO_PRINTF1(_L("A window was closed [probably a panic box from the previous test].")); } idFocus=idNewFocus; } } TInt err = KErrNone; TRAP(err, iScreenDevice = new (ELeave) CWsScreenDevice(iSession)); PRINT_ON_ERROR2_L(err, _L("Failed to create screen device: %d"), err); ASSERT_EQUALS_X(iScreenDevice->Construct(TGlobalSettings::Instance().iScreen), KErrNone); iDisplayMode = iScreenDevice->DisplayMode(); // Get default display mode TRAP(err, iGc = new (ELeave) CWindowGc(iScreenDevice)); PRINT_ON_ERROR2_L(err, _L("Failed to create graphics context: %d"), err); ASSERT_EQUALS_X(iGc->Construct(), KErrNone); iGroup = RWindowGroup(iSession); ASSERT_EQUALS_X(iGroup.Construct(++iWindowHandle,iScreenDevice), KErrNone); iSession.Flush(); RWindow testTrans(iSession); ASSERT_EQUALS_X(testTrans.Construct(iGroup, ++iWindowHandle), KErrNone); iTransparencyEnabled=(testTrans.SetTransparencyFactor(iWhite)==KErrNone); testTrans.Close(); //clean-up if previous test abended if (PostTestCleanupInstance().iSharedUtility) { //Temp removed - may be causing ONB fails! // if (PostTestCleanupInstance().iSharedUtility->DestroyAll()) // { // INFO_PRINTF1(_L("Destroyed some surfaces from previous test.")); // // } } if (!PostTestCleanupInstance().iCleanedUpOnExit) PostTestCleanupInstance().iCleanedUpOnExit=EFalse; if (!GCEIsSupported()) { INFO_PRINTF1(_L("Some Setup skipped: GCE support is not loaded")); return; } TRAPD(err_FailedToCreateSurfaceUtility, iUtility = CSurfaceUtility::NewL( PostTestCleanupInstance().iSharedUtility)); ASSERT_EQUALS(err_FailedToCreateSurfaceUtility,KErrNone); }