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