⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sipclient.cpp

📁 KphoneSI (kpsi) is a SIP (Session Initiation Protocol) user agent for Linux, with which you can in
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		printf( "%s<<<<<\n", msg->message().data() );		}	// Send it	const QString m = msg->message().utf8();	outsocket->send( m.data(), m.length() );		//clean UDP sockets immediately but TCPSockets deferred, as some proxies dislike too early FIN	if ((outsocket != &listener) && !isTCP) {		delete outsocket;	}	if(isTCP && (sndSockets.count() >3)) {	sndSockets.removeFirst();	}	delete msg;}void SipClient::sendTestMessage( QString sendaddr, unsigned int port, QString msg ){	if(debug>0) printf("=====sendTestMessage\n");	MessageSocket *outsocket = 0;	if (symmetricmode) {		outsocket = &listener;	} else {		outsocket = new UDPMessageSocket;	}	outsocket->setHostname( sendaddr.utf8().data() );	outsocket->connect( port );	// Announce what we're sending	if( ( debug == 1) || (debug >= 3) ) {	    printf( "\nSC-s-=====SipClient: Sending: %s.%03d\n<<<<<\n",QTime::currentTime().toString().latin1(),QTime::currentTime().msec() );	    printf( "%s<<<<<\n",msg.data() );	}	// Send it	outsocket->send( msg.utf8().data(), msg.utf8().length() );	if (outsocket != &listener) {		perror("--HOPPLA8");		delete outsocket;	}}void SipClient::sendAck( SipMessage *origmessage ){	SipMessage *msg = new SipMessage;	msg->setType( SipMessage::Request );	msg->setMethod( Sip::ACK );	QString s = origmessage->getHeaderData( SipHeader::CSeq );	s = s.left( s.find( ' ' ) );	s = s	+ " " + Sip::getMethodString( msg->getMethod() );	msg->insertHeader( SipHeader::CSeq, s );	msg->setRequestUri( SipUri( origmessage->getHeaderData( SipHeader::To ) ) );	msg->insertHeader( SipHeader::From, origmessage->getHeaderData( SipHeader::From ) );	msg->insertHeader( SipHeader::To, origmessage->getHeaderData( SipHeader::To ) );	msg->insertHeader( SipHeader::Call_ID, origmessage->getHeaderData( SipHeader::Call_ID ) );	// We need the correct branch parameter	QString branch = origmessage->getViaList().getBottommostVia().getBranchParam();	sendRequest( msg, true, SipUri::null, branch );	delete msg;}void SipClient::setHideViaMode( HideViaMode newmode ){	hidemode = newmode;}void SipClient::setCallForward( bool onoff ){	fwmode = onoff;}void SipClient::setCallForwardUri( const SipUri &u ){	forwarduri = u;}void SipClient::setCallForwardMessage( const QString &newmessage ){	fwbody = newmessage;}const QString SipClient::getUserAgent( void ){	return "KPhoneSI/1.0";}void SipClient::setMaxForwards( int newmax ){	maxforwards = newmax;}void SipClient::setBusy( bool onoff ){	busymode = onoff;}void SipClient::setBusyMessage( const QString &newmessage ){	busybody = newmessage;}SipUser *SipClient::getUser( SipUri uri ){	if( uri == user->getUri() ) {		return user;	} else {		return NULL;	}}void SipClient::updateIdentity( SipUser *u, QString newproxy ){	user = u;	setupContactUri( user );	if( newproxy.isEmpty() || newproxy.lower() == "sip:") {		setExplicitProxyMode( false );	} else {		if( newproxy.left( 4 ).lower() == "sip:" ) {			newproxy.remove( 0, 4 );		}		setExplicitProxyMode( true );		setExplicitProxyAddress( newproxy );	}}void SipClient::sendStunRequest( QString uristr ){	if( !uristr.isEmpty() ) {		useStunProxy = true;		stunProxy = SipUri( uristr );	}	if( useStunProxy ) {		if( !listener.setHostname( stunProxy.getHostname() ) ) { return; }		listener.connect( stunProxy.getPortNumber() );		StunRequestSimple req;		req.msgHdr.msgType = htons(BindRequestMsg);		req.msgHdr.msgLength = htons( sizeof(StunRequestSimple)-sizeof(StunMsgHdr) );		for ( int i=0; i<16; i++ ) {			req.msgHdr.id.octet[i]=0;		}		int id = rand();		req.msgHdr.id.octet[0] = id;		req.msgHdr.id.octet[1] = id>>8;		req.msgHdr.id.octet[2] = id>>16;		req.msgHdr.id.octet[3] = id>>24;		listener.send( (char *)&req, sizeof( req ) );	}}QString SipClient::getSipProxySrv( QString dname ){	if( sipProxyName == dname ) {		return sipProxySrv;	}	QString srv;	QString naptr = getNAPTR( dname );	if( !naptr.isEmpty() ) {		srv = getSRV( naptr );	} else {		srv = getSRV( QString( "_sip._udp." ) + dname );	}	if( !srv.isEmpty() ) {		sipProxyName = dname;		sipProxySrv = srv;		return sipProxySrv;	} else {		return dname;	}}QString SipClient::getResSearch( QString dname, int type, bool UDP ){	unsigned char msg[PACKETSZ],*mptr,*xptr;	int i,j,l,co;	unsigned short *usp,ty;	unsigned int *uip;	res_response *res;	char name[PACKETSZ];	QString tmpName;	QString domainName = "";	u_short priority = 0;	u_short weight = 0;	u_short port = 5060;	if(res_init()==-1){		if(debug>3) printf("res_init -error !\n");	} else if((l=res_search( dname, C_IN, type, msg, sizeof( msg ) ) ) == -1 ) {		if(debug>3) printf( "res_search: NO result !\n" );	} else if( l <= 0 ){		if(debug>3) printf( "res_search: result is empty !\n" );	} else {		if(debug>3) printf( "res_search OK (len=%d)\n", l );		res = (res_response *)msg;		mptr = msg + sizeof( HEADER );		co = ntohs( res->header.qdcount );		for( i=0; i < co; i++ ) {			j = dn_expand( msg, msg + PACKETSZ, mptr, name, MAXDNAME );			if( j < 0 ) {				break;			} else {				mptr += j;				usp = (unsigned short *)mptr;				mptr += sizeof( short );				usp = (unsigned short *)mptr;				mptr += sizeof( short );			}		}		co = ntohs( res->header.ancount );		for( i = 0 ; i < co; i++ ) {			j = dn_expand( msg, msg + PACKETSZ, mptr, name, MAXDNAME );			if( j < 0 ) {				if(debug>3) printf( "\t\tname-error\n" );				break;			} else {				mptr += j;				usp = (unsigned short *)mptr;				ty = ntohs( *usp );				mptr += sizeof( short );				usp = (unsigned short *)mptr;				mptr += sizeof(short);				uip = (unsigned int *)mptr;				mptr += sizeof(int);				uip = (unsigned int *)mptr;				j = ntohs( *uip );				mptr += sizeof(short);				xptr = mptr;				mptr += j;				if( ty == T_NAPTR ) {					usp = (unsigned short *)xptr;					xptr += sizeof(short);					usp = (unsigned short *)xptr;					xptr += sizeof(short);					j = (int)(*xptr);					xptr += 1;					while( j > 0 ) {						xptr+=1;						j--;					}					j = (int)(*xptr);					xptr += 1;					while( j > 0 ) {						xptr += 1;						j--;					}					j=(int)(*xptr);					xptr+=1;					while( j > 0 ) {						xptr += 1;						j--;					}					j = dn_expand( msg, msg + PACKETSZ, xptr, name, MAXDNAME );					if( j < 0 ) {						break;					} else {						tmpName = QString( name );						if( UDP ) {							if( tmpName.contains( "_udp" ) ) {								domainName = QString( name );							}						} else {							if( tmpName.contains( "_tcp" ) ) {								domainName = QString( name );							}						}						if(debug>3) printf("NAPTR: %s\n",name);						xptr+=j;					}				} else if( ty == T_SRV ) {					u_short pr;					u_short we;					u_short po;					usp = (unsigned short *)xptr;					pr = ntohs( *usp );					xptr += sizeof( short );					usp = (unsigned short *)xptr;					we = ntohs( *usp );					xptr += sizeof( short );					usp = (unsigned short *)xptr;					po = ntohs( *usp );					xptr += sizeof( short );					j = dn_expand( msg, msg + PACKETSZ, xptr, name, MAXDNAME );					if( j < 0 ) {						break;					} else {						if( !priority || pr < priority ||						    (pr == priority && we < weight) ) {							priority = pr;							weight = we;							port = po;							if(debug>3) printf("SRV: %d,%d,%d\n",priority,weight,port);							domainName = QString( name ) +								":" + QString::number( port );							if(debug>3) printf("SRV: %s\n",name);							xptr+=j;						}					}				} else {				}			}		}		co = ntohs( res->header.nscount );		co = ntohs( res->header.arcount );	}	return domainName;}QString SipClient::getNAPTR( QString strUri ){	return getResSearch( strUri, T_NAPTR, true );}QString SipClient::getSRV( QString naptr ){	return getResSearch( naptr, T_SRV, true );}void SipClient::callMemberUpdated( void ){	callListUpdated();}void SipClient::printStatus(){	for( SipCall *curcall = calls.first(); curcall != 0; curcall = calls.next() ) {		// call type		if(debug>0) printf("\nSipClient:printStatus: CallType = ");		switch ( curcall->getCallType()) {			case SipCall::StandardCall:				if(debug>0) printf("StandardCall");			break;			case SipCall::videoCall:				if(debug>0) printf("videoCall");			break;			case SipCall::OptionsCall:				if(debug>0) printf("OptionsCall");			break;			case SipCall::RegisterCall:				if(debug>0) printf("RegisterCall");			break;			case SipCall::MsgCall:				if(debug>0) printf("MsgCall");			break;			case SipCall::BrokenCall:				if(debug>0) printf("BrokenCall");			break;			case SipCall::UnknownCall:				if(debug>0) printf("UnknownCall");			break;			case SipCall::outSubscribeCall:				if(debug>0) printf("outSubscribeCall");			break;			case SipCall::inSubscribeCall:				if(debug>0) printf("inSubscribeCall");			break;			case SipCall::inSubscribeCall_2:				if(debug>0) printf("inSubscribeCall_2");			break;			case SipCall::extCall1:				if(debug>0) printf("ExtCall1");			break;			case SipCall::extCall2:				if(debug>0) printf("ExtCall2");			break;			case SipCall::extCall3:				if(debug>0) printf("ExtCall3");			break;			case SipCall::extCall4:				if(debug>0) printf("ExtCall4");			break;			default:				if(debug>0) printf("error - undefined call");			break;		}		//call id		if(debug>0) printf("\n  CallId = %s", curcall->getCallId().ascii());		//call status		if(debug>0) printf("\n  CallStatus = ");		switch ( curcall->getCallStatus()) {			case SipCall::callUnconnected:				if(debug>0) printf("callUnconnected");			break;			case SipCall::callInProgress:				if(debug>0) printf("callInProgress");			break;			case SipCall::callDead:				if(debug>0) printf("callDead");			break;			default:				if(debug>0) printf("error - undefined callState");			break;		}		//call members		SipCallMemberIterator it(curcall->getMemberList());		for (it.toFirst(); it.current(); ++it) {			//call member Uri			if(debug>0) printf("\n  CallMember: reqUri = %s", it.current()->getUri().reqUri().ascii());			//call member status			if(debug>0) printf("\n    CallMemberState = ");			switch ( it.current()->getState()) {				case SipCallMember::state_Idle:					if(debug>0) printf(" Idle");				break;				case SipCallMember::state_EarlyDialog:					if(debug>0) printf(" EarlyDialog");				break;				case SipCallMember::state_Connected:					if(debug>0) printf(" Connected");				break;				case SipCallMember::state_Disconnected:					if(debug>0) printf(" Disconnected");				break;				case SipCallMember::state_InviteRequested:					if(debug>0) printf(" InviteRequested");				break;				case SipCallMember::state_RequestingInvite:					if(debug>0) printf(" RequestingInvite");				break;				case SipCallMember::state_RequestingReInvite:					if(debug>0) printf(" RequestingReInvite");				break;				case SipCallMember::state_Redirected:					if(debug>0) printf(" Redirected");				break;				case SipCallMember::state_Disconnecting:					if(debug>0) printf(" Disconnecting");				break;				case SipCallMember::state_CancelPending:					if(debug>0) printf(" CancelPending");				break;				// state 202 is used to handle refer related activities				case SipCallMember::state_r202:					if(debug>0) printf(" 202");				break;				default:					if(debug>0) printf("error - undefined callMemberState");				break;			}		}	}	if(debug>0) printf("\n");}QString SipClient::getContactText(void) {QString mio     = " Me : " + KStatics::myIP;QString mpo      = ":" + QString::number(nlp,10);QString mi      = "\nbehind NAT: " + contacturi.getHostname();QString mp      = ":" + QString::number(contacturi.getPortNumber(),10);QString trp;if( isTcpSocket() ) trp  = " TCP"; else trp = " UDP";     if(foundStun) return  mio + mpo + mi + mp + trp; else  return  mio + mpo + trp;}QString SipClient::getListenPort(void) {return QString::number(contacturi.getPortNumber());}bool SipClient::haveNoMoreStun(void) {	if(stopStun) {		// return true (Stun was switched of) and delete the info for this time		stopStun=false;		return true;	} else {		return false;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -