📄 sipclient.cpp
字号:
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 + -