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

📄 kcallwidget.cpp

📁 kphone-4.2,SHELL协议的VOIP电话
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					QString( tr("Incoming Call: ") ) + call->getCallId() );				holdbutton->setEnabled( true );				transferbutton->setEnabled( true );			}			QString ss = member->getUri().uri();			QDateTime t = QDateTime::currentDateTime();			incomingCall = new IncomingCall( ss, t );			missedCalls.append( incomingCall );			updateCallRegister();			// Ringing tone			QSettings settings;			QString p = "/kphone/General/";			isRingingTone = ( settings.readEntry(				p + "/ringingtone", "No" ).upper() == "YES" );			ringCount = 0;			ringTimer->start( ringTime_1, TRUE );		}		remote->setEditText( member->getUri().uri() );		subject = call->getSubject();		hangup->setEnabled( true );		hangup->setFocus();		if( member->getState() == SipCallMember::state_InviteRequested ) {			hidebutton->setEnabled( false );			dial->setEnabled( false );			hangup->setEnabled( true );			curstate = Calling;		} else if( member->getState() == SipCallMember::state_RequestingInvite ) {			dial->setText( tr("Accept") );			hangup->setText( tr("Reject") );			hidebutton->setEnabled( false );			dial->setEnabled( true );			hangup->setEnabled( true );			curstate = Called;		} else {			hidebutton->setEnabled( false );			dial->setEnabled( false );			hangup->setEnabled( true );			curstate = Connected;			if (!dtmfsenderTimer->isActive())				dtmfsenderTimer->start(dtmfsenderdelay->value() * 10);		}	} else {		curstat->setText( QString::null );		if( call->getCallType() == SipCall::videoCall ) {			setCaption( getUserPrefix() +				QString( tr("Outgoing Video Call: ") ) + call->getCallId() );			holdbutton->setEnabled( false );			transferbutton->setEnabled( false );		} else {			setCaption( getUserPrefix() +				QString( tr("Outgoing Call: ") ) + call->getCallId() );			holdbutton->setEnabled( true );			transferbutton->setEnabled( true );		}		subject = call->getSubject();		remote->setEditText( QString::null );		hidebutton->setEnabled( true );		dial->setEnabled( true );		dial->setFocus();		hangup->setEnabled( false );		curstate = PreDial;	}	updateAudioStatus();}void KCallWidget::dialClicked( void ){	// Multi-purpose buttons hack	if( curstate == Called ) {		missedCalls.setAutoDelete( false );		missedCalls.remove( incomingCall );		missedCalls.setAutoDelete( true );		receivedCalls.append( incomingCall );		updateCallRegister();		acceptCall();		return;	}	if( remote->currentText().length() == 0 ) {		QMessageBox::critical( this, tr("Error: No Destination"),			tr("You must specify someone to call.") );		return;	}/* #ALSA	if( !audio->isAudioOn() ) {		audio_fd = ::open( audio->getOSSFilename(), O_WRONLY | O_NONBLOCK );		if( audio_fd == -1 ) {			QMessageBox::information( this, tr("Dial"),				tr("Close any program which might be using soundcard \nand then retry dial.") );			return;		} else {			::close( audio_fd );		}	}*/	QString strRemoteUri;	QString s = remote->currentText();	if( s.contains( '[' ) && s.contains( ']' ) ) {		strRemoteUri = s.mid( s.find( '[' ) + 1, s.find( ']' ) - s.find( '[' ) - 1 );	} else {		if( s.left( 4 ).lower() != "tel:" ) {			if( s.left( 4 ).lower() != "sip:" ) {				s = "sip:" + s;			}			if( !s.contains( '@' ) ) {				s = s + "@" + call->getHostname();			}		}		strRemoteUri = s;	}	for( int i = 0; i < remote->count(); i++ ) {		if( remote->text( i ).compare( s ) == 0 ) {			remote->removeItem( i );		}	}	remote->insertItem( s, 0 );	remote->setCurrentItem( 0 );	QSettings settings;	QString p = "/kphone/" + getUserPrefix() + "/Call register/";	QString str;	QString label;	for( int i = 0; i < remote->count(); i++ ) {		label = p + "/Dialled" + str.setNum( i );		settings.writeEntry( label, remote->text(i).latin1() );	}	label = p + "/Dialled" + str.setNum( remote->count() );	settings.writeEntry( label, "" );	SipUri remoteuri( strRemoteUri );	audio->setRtpCodec( codecUnknown );	audio->setVideoRtpCodec( codecUnknown );	member = new SipCallMember( call, remoteuri );	connect( member, SIGNAL( statusUpdated( SipCallMember * ) ),		this, SLOT( callMemberStatusUpdated() ) );	connect( member, SIGNAL( statusUpdated( SipCallMember * ) ),		sipauthentication, SLOT( authRequest( SipCallMember * ) ) );	audio->setCurrentCall( call );	member->requestInvite(		audio->audioOut().message( audio->getRtpCodec(), audio->getVideoRtpCodec(), audio->getBodyMask() ),		MimeContentType( "application/sdp" ) );	connect( member, SIGNAL( statusUpdated( SipCallMember * ) ),		this, SLOT( callMemberStatusUpdated( ) ) );	audio->attachToCallMember( member );	hidebutton->setEnabled( false );	dial->setEnabled( false );	hangup->setEnabled( true );	curstate = Calling;	curstat->setText( member->getLocalStatusDescription() );}void KCallWidget::callMemberStatusUpdated( void ){	SdpMessage sdpm;	SdpMessage rsdp;	if( member->getState() == SipCallMember::state_Disconnected ) {		if( member->getLocalStatusDescription().left( 2 ) == "!!" ) {			curstat->setText( tr("Call Failed") );			QMessageBox::critical( this, "KPhone",				member->getLocalStatusDescription().remove(0,2) );			setHide();		} else {			curstat->setText( member->getLocalStatusDescription()					+ " at " + QDateTime::currentDateTime().toString("hh:mm:ss"));		}		forceDisconnect();	} else if( member->getState() == SipCallMember::state_Redirected ) {		curstat->setText( member->getLocalStatusDescription() );		handleRedirect();	} else if( member->getState() == SipCallMember::state_Refer ) {		curstat->setText( member->getLocalStatusDescription() );		member->setState( SipCallMember::state_Refer_handling );		handleRefer();	} else if( member->getState() == SipCallMember::state_Connected ) {		curstat->setText( member->getLocalStatusDescription() );		hidebutton->setEnabled( false );		dial->setEnabled( false );		hangup->setEnabled( true );		curstate = Connected;		if (!dtmfsenderTimer->isActive())			dtmfsenderTimer->start(dtmfsenderdelay->value() * 10);	} else {		curstat->setText( member->getLocalStatusDescription() );	}}void KCallWidget::audioOutputDead( void ){	printf( "KCallAudio: Broken output pipe, disconnecting unpolitely\n" );	forceDisconnect();}void KCallWidget::hangupCall( void ){	if( !hangup->isEnabled() ) {		return;	}	ringTimer->stop();	// Reject call if that's our current state	if( curstate == Called ) {		member->declineInvite();		setHide();		return;	}	if( call->getCallStatus() != SipCall::callDead ) {		hangup->setEnabled( false );		if( member->getState() == SipCallMember::state_Connected ) {			member->requestDisconnect();		} else {			member->cancelTransaction();			if( audio->getCurrentCall() == call ) {				audio->detachFromCall();			}		}		setHide();		return;	}}void KCallWidget::acceptCall( void ){	ringTimer->stop();	acceptCallTimer->start( acceptTime, true );}void KCallWidget::holdCall( void ){    if( curstate != Connected ) 		return;	if( audio->getCurrentCall() == call ) {		audio->toggleOnHold();		holdbutton->setText( tr("Unhold") );	} else if( member ) {		audio->setCurrentCall( call );		audio->attachToCallMember( member );		audio->toggleOnHold();		holdbutton->setText( tr("Hold") );	}}void KCallWidget::handleRedirect( void ){	printf( "KCallWidget: Handling redirect...\n" );	QValueList<SipUri>::Iterator it;	SipUriList urilist = member->getRedirectList();	while ( urilist.getListLength() > 0 ) {		SipUri redirto = urilist.getPriorContact();		QMessageBox mb( tr("Redirect"),			tr("Call redirected to: ") + "\n" + redirto.reqUri() + "\n\n" +			tr("Do you want to proceed ? "),			QMessageBox::Information,			QMessageBox::Yes | QMessageBox::Default,			QMessageBox::No,			QMessageBox::Cancel | QMessageBox::Escape );		switch( mb.exec() ) {		case QMessageBox::No:			continue;		case QMessageBox::Cancel:			forceDisconnect();			return;		}		if( audio->getCurrentCall() == call ) {			audio->detachFromCall();		}		if( member ) disconnect( member, 0, this, 0 );		member = 0;		if( call ) delete call;		call = 0;		redirectCall( redirto, subject );		setHide();		return;	}	forceDisconnect();}void KCallWidget::handleRefer( void ){	printf( "KCallWidget: Handling redirect...\n" );	SipUri redirto = member->getRedirectList().getHead();	if( audio->getCurrentCall() == call ) {		audio->detachFromCall();	}	QMessageBox mb( tr("Redirect"),		tr("Call redirected to: ") + "\n" + redirto.reqUri() + "\n\n" +		tr("Do you want to proceed ? "),		QMessageBox::Information,		QMessageBox::Yes | QMessageBox::Default,		QMessageBox::No,		0 );	if( mb.exec() == QMessageBox::Yes ) {		redirectCall( redirto, subject );		setHide();	} else {		forceDisconnect();	}}void KCallWidget::forceDisconnect( void ){	printf( "KCallWidget: Starting force disconnect...\n" );	if( audio->getCurrentCall() == call ) {		audio->detachFromCall();	}	if( member ) disconnect( member, 0, this, 0 );	member = 0;	if( call ) delete call;	call = 0;	callDeleted();	ringTimer->stop();	dial->setEnabled(false);	hangup->setEnabled(false);	holdbutton->setEnabled(false);	transferbutton->setEnabled(false);	morebutton->setEnabled(false);}void KCallWidget::updateAudioStatus( void ){	if( audio->getCurrentCall() == call ) {		if( audio->isRemoteHold() )			curaudiostat->setText( tr("Attached [holding]") );		else			curaudiostat->setText( tr("Attached [active]") );	} else {		curaudiostat->setText( tr("Unattached") );	}}void KCallWidget::clickDial(){	dialClicked();}void KCallWidget::clickHangup(){	hangupCall();}void KCallWidget::pleaseDial( const SipUri &dialuri ){	remote->setEditText( dialuri.reqUri() );	dialClicked();}void KCallWidget::showTransferDialog( void ){	if( !transfer ) {		transfer = new KCallTransfer(this);		connect( transfer, SIGNAL( pleaseTransfer( const QString & ) ),			this, SLOT( pleaseTransfer( const QString & ) ) );	}	transfer->show();}void KCallWidget::pleaseTransfer( const QString &transferto ){	// Ignore this button if there is no call setup yet.	if( curstate != Connected ) return;	if( call->getCallStatus() != SipCall::callDead ) {		hangup->setEnabled( false );		hidebutton->setEnabled( true );		QString s = transferto;		if( s.left( 4 ).lower() != "tel:" ) {			if( s.left( 4 ).lower() != "sip:" ) {				s = "sip:" + s;			}			if( !s.contains( '@' ) ) {				s = s + "@" +  member->getUri().getHostname();  //call->getHostname();			}		}		member->requestTransfer( SipUri( s ) );		return;	}}void KCallWidget::setDTMFSender( QString &s ){	dtmfsender->setCurrentText(s);}void KCallWidget::getUri( void ){	QSettings settings;	QString p = "/kphone/" + getUserPrefix() + "/Local";	QString xmlFile = settings.readEntry( p + "/PhoneBook", "" );	if( xmlFile.isEmpty() ) {		if( getUserPrefix().isEmpty() ) {			xmlFile = QDir::homeDirPath() + "/.kphone-phonebook.xml";		} else {			xmlFile = QDir::homeDirPath() +				"/.kphone" + getUserPrefix() + "phonebook.xml";		}	}	QStringList r;	if( !phoneBook ) {		phoneBook = new PhoneBook(xmlFile, this, getUserPrefix() + "Phone Book", receivedCalls, missedCalls, r );	}	phoneBook->exec();	remote->setEditText( phoneBook->getUri() );	phoneView->updateContacts( xmlFile );

⌨️ 快捷键说明

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