Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);

}