📄 kcallwidget.cpp
字号:
#include <stdio.h>#include <fcntl.h>#include <unistd.h>#include <qdatetime.h>#include <qhbox.h>#include <qvbox.h>#include <qtimer.h>#include <qlabel.h>#include <qlayout.h>#include <qlineedit.h>#include <qpushbutton.h>#include <qtextedit.h>#include <qsettings.h>#include <qspinbox.h>#include <qdir.h>#include <qmessagebox.h>#include <sys/soundcard.h>#include <sys/ioctl.h>#include <math.h>#include <qgrid.h>#include <qbuttongroup.h>#include <qdatetime.h>#include "../dissipate2/sdp.h"#include "../dissipate2/sipmessage.h"#include "../dissipate2/mimecontenttype.h"#include "../dissipate2/sipuser.h"#include "../dissipate2/sipcall.h"#include "../dissipate2/siptransaction.h"#include "ksipauthentication.h"#include "callaudio.h"#include "kphone.h"#include "kphoneview.h"#include "kcallwidget.h"KCallTransfer::KCallTransfer( QWidget *parent, const char *name ) : QDialog( parent, name, true ){ QVBox *vbox = new QVBox( this ); vbox->setMargin( 3 ); vbox->setSpacing( 3 ); QVBoxLayout *vboxl = new QVBoxLayout( this, 5 ); vboxl->addWidget( vbox ); (void) new QLabel( tr("Transfer to URI:"), vbox ); touri = new QLineEdit( vbox ); touri->setMinimumWidth( fontMetrics().maxWidth() * 20 ); QHBoxLayout *buttonBox; buttonBox = new QHBoxLayout( vboxl, 6 ); helpPushButton = new QPushButton( this, tr("help button") ); helpPushButton->setText( tr("&help...") ); helpPushButton->setEnabled( FALSE ); buttonBox->addWidget( helpPushButton ); QSpacerItem *spacer = new QSpacerItem( 0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum ); buttonBox->addItem( spacer ); okPushButton = new QPushButton( this, tr("ok button") ); okPushButton->setText( tr("OK") ); okPushButton->setDefault( TRUE ); buttonBox->addWidget( okPushButton ); cancelPushButton = new QPushButton( this, tr("cancel button") ); cancelPushButton->setText( tr("Cancel") ); cancelPushButton->setAccel( Key_Escape ); buttonBox->addWidget( cancelPushButton ); connect( okPushButton, SIGNAL( clicked() ), this, SLOT( slotOk() ) ); connect( cancelPushButton, SIGNAL( clicked() ), this, SLOT( slotCancel() ) );}KCallTransfer::~KCallTransfer( void ){}void KCallTransfer::slotOk( void ){ if( touri->text().stripWhiteSpace() != QString::null ) { pleaseTransfer( touri->text() ); } touri->clear(); QDialog::accept();}void KCallTransfer::slotCancel( void ){ touri->clear(); QDialog::reject();}KCallWidget::KCallWidget( KSipAuthentication *auth, CallAudio *callaudio, SipCall *initcall, KPhoneView *parent, const char *name ) : call( initcall ), phoneView( parent ){ if( call->getSubject() == tr("Incoming call") ) QDialog::QDialog( NULL, name, FALSE, WStyle_DialogBorder ); else QDialog::QDialog( parent, name, FALSE, WStyle_DialogBorder ); sipauthentication = auth; missedCalls.setAutoDelete( true ); receivedCalls.setAutoDelete( true ); hided = false; phoneBook = 0; curstate = PreDial; member = 0; transfer = 0; createKeypad(); audio = callaudio; connect( audio, SIGNAL( outputDead() ), this, SLOT( audioOutputDead() ) ); connect( audio, SIGNAL( statusUpdated() ), this, SLOT( updateAudioStatus() ) ); ringCount = 0; ringTimer = new QTimer(); connect( ringTimer, SIGNAL( timeout() ), this, SLOT( ringTimeout() ) ); acceptCallTimer = new QTimer(); connect( acceptCallTimer, SIGNAL( timeout() ), this, SLOT( acceptCallTimeout() ) ); dtmfsenderTimer = new QTimer(); connect( dtmfsenderTimer, SIGNAL( timeout() ), this, SLOT( dtmfsenderTimeout() ) ); QVBoxLayout *vbox = new QVBoxLayout( this ); vbox->setMargin( 3 ); vbox->setSpacing( 3 ); QGridLayout *headergrid = new QGridLayout( 2, 3 ); headergrid->setSpacing( 3 ); vbox->insertLayout( 0, headergrid ); // Remote (person we're calling) QLabel *remotelabel = new QLabel( tr("Remote: "), this ); remotelabel->setFixedWidth( remotelabel->fontMetrics().width( tr(" Remote: ") ) ); headergrid->addWidget( remotelabel, 0, 0 ); remote = new QComboBox( true, this ); remote->setAutoCompletion( true ); headergrid->addWidget( remote, 0, 1 ); // DTMF Sender QLabel *dtmfsenderlabel = new QLabel( tr("Send DTMF: "), this ); dtmfsenderlabel->setFixedWidth( dtmfsenderlabel->fontMetrics().width( tr(" Send DTMF: ") ) ); headergrid->addWidget( dtmfsenderlabel, 1, 0 ); dtmfsender = new QComboBox( true, this ); dtmfsender->setAutoCompletion( true ); connect( dtmfsender, SIGNAL( textChanged(const QString &) ), this, SLOT( dtmfsenderChanged(const QString &) ) ); headergrid->addWidget( dtmfsender, 1, 1 ); dtmfsenderdelay = new QSpinBox( 5, 300, 5, this); dtmfsenderdelay->setValue(10); headergrid->addWidget( dtmfsenderdelay, 1, 2 ); // Remember to give remote completion int count = 0; QString s; QString remoteuri; QSettings settings; QString p = "/kphone/" + getUserPrefix() + "/Call register"; QString label = p + "/Dialled" + s.setNum( count ); remoteuri = settings.readEntry( label, "" ); while( !remoteuri.isEmpty() && count < 20 ) { remote->insertItem( remoteuri ); label = p + "/Dialled" + s.setNum( ++count ); remoteuri = settings.readEntry( label, "" ); } QPushButton *loadUri = new QPushButton( "", this ); QIconSet icon; icon.setPixmap(SHARE_DIR "/icons/phonebook.png", QIconSet::Automatic ); loadUri->setIconSet( icon ); loadUri->setFixedWidth( loadUri->fontMetrics().maxWidth() * 2 ); connect( loadUri, SIGNAL( clicked() ), this, SLOT( getUri() ) ); headergrid->addWidget( loadUri, 0, 2 ); QHBox *statline = new QHBox( this ); statline->setSpacing( 5 ); vbox->insertWidget( 1, statline ); QLabel *statlabel = new QLabel( tr("Status: "), statline ); statlabel->setFixedWidth( remotelabel->width() ); curstat = new QLabel( statline ); QLabel *astatlabel = new QLabel( tr("Audio: "), statline ); astatlabel->setFixedWidth( remotelabel->width() ); curaudiostat = new QLabel( statline ); QGrid *buttonbox = new QGrid(2, this ); buttonbox->setSpacing( 5 ); vbox->insertWidget( 2, buttonbox ); dial = new QPushButton( tr("Dial"), buttonbox ); QIconSet icon1; icon1.setPixmap(SHARE_DIR "/icons/dial.png", QIconSet::Automatic ); dial->setIconSet( icon1 ); connect( dial, SIGNAL( clicked() ), this, SLOT( dialClicked() ) ); dial->setEnabled( true ); dial->setFocus(); hangup = new QPushButton( tr("Hangup"), buttonbox ); QIconSet icon2; icon2.setPixmap(SHARE_DIR "/icons/hangup.png", QIconSet::Automatic ); hangup->setIconSet( icon2 ); connect( hangup, SIGNAL( clicked() ), this, SLOT( hangupCall() ) ); hangup->setEnabled( false ); holdbutton = new QPushButton( tr("Hold"), buttonbox ); connect( holdbutton, SIGNAL( clicked() ), this, SLOT( holdCall() ) ); transferbutton = new QPushButton( tr("Transfer"), buttonbox ); connect( transferbutton, SIGNAL( clicked() ), this, SLOT( showTransferDialog() ) ); morebutton = new QPushButton( tr("DTMF"), buttonbox ); morebutton->setToggleButton(true); morebutton->setOn( false ); connect( morebutton, SIGNAL( toggled(bool) ), this, SLOT( showExtension(bool))); hidebutton = new QPushButton( tr("Hide"), buttonbox ); connect( hidebutton, SIGNAL( clicked() ), this, SLOT( hideCall() ) ); QDateTime dt; int year,month,day,hour,min,sec; count = 0; p = "/kphone/" + getUserPrefix() + "/Call register"; label.setNum( count ); label = p + "/Received" + label; s = settings.readEntry( label, "" ); while( !s.isEmpty() ) { year = s.left( s.find( '.' ) ).toInt(); s = s.mid( s.find( '.' ) + 1 ); month = s.left( s.find( '.' ) ).toInt(); s = s.mid( s.find( '.' ) + 1 ); day = s.left( s.find( '-' ) ).toInt(); s = s.mid( s.find( '-' ) + 1 ); hour = s.left( s.find( ':' ) ).toInt(); s = s.mid( s.find( ':' ) + 1 ); min = s.left( s.find( ':' ) ).toInt(); s = s.mid( s.find( ':' ) + 1 ); sec = s.left( s.find( '[' ) ).toInt(); dt.setDate( QDate( year, month, day ) ); dt.setTime( QTime( hour, min, sec ) ); s = s.left( s.find( ']' ) ); s = s.mid( s.find( '[' ) + 1 ); incomingCall = new IncomingCall( s, dt ); receivedCalls.append( incomingCall ); label.setNum( ++count ); label = p + "/Received" + label; s = settings.readEntry( label, "" ); } count = 0; label.setNum( count ); label = p + "/Missed" + label; s = settings.readEntry( label, "" ); while( !s.isEmpty() ) { year = s.left( s.find( '.' ) ).toInt(); s = s.mid( s.find( '.' ) + 1 ); month = s.left( s.find( '.' ) ).toInt(); s = s.mid( s.find( '.' ) + 1 ); day = s.left( s.find( '-' ) ).toInt(); s = s.mid( s.find( '-' ) + 1 ); hour = s.left( s.find( ':' ) ).toInt(); s = s.mid( s.find( ':' ) + 1 ); min = s.left( s.find( ':' ) ).toInt(); s = s.mid( s.find( ':' ) + 1 ); sec = s.left( s.find( '[' ) ).toInt(); dt.setDate( QDate( year, month, day ) ); dt.setTime( QTime( hour, min, sec ) ); s = s.left( s.find( ']' ) ); s = s.mid( s.find( '[' ) + 1 ); incomingCall = new IncomingCall( s, dt ); missedCalls.append( incomingCall ); label.setNum( ++count ); label = p + "/Missed" + label; s = settings.readEntry( label, "" ); } switchCall( initcall );}KCallWidget::~KCallWidget( void ){ delete ringTimer; delete acceptCallTimer; missedCalls.clear(); receivedCalls.clear(); if( call ) { delete call; } if( transfer ) { delete transfer; } if( phoneBook ) { delete phoneBook; } if (keypad) { delete keypad; }}void KCallWidget::createKeypad(void){ QGrid* grid; setOrientation(Qt::Vertical); grid = new QGrid(4); grid->setMargin(30); keypad = new QButtonGroup(); keypad->insert(new QPushButton("1\n ", grid)); keypad->insert(new QPushButton("2\nABC", grid)); keypad->insert(new QPushButton("3\nDEF", grid)); keypad->insert(new QPushButton("a\n ", grid)); keypad->insert(new QPushButton("4\nGHI", grid)); keypad->insert(new QPushButton("5\nJKL", grid)); keypad->insert(new QPushButton("6\nMNO", grid)); keypad->insert(new QPushButton("b\n ", grid)); keypad->insert(new QPushButton("7\nPQRS", grid)); keypad->insert(new QPushButton("8\nTUV", grid)); keypad->insert(new QPushButton("9\nWXYZ", grid)); keypad->insert(new QPushButton("c\n ", grid)); keypad->insert(new QPushButton("e\n*", grid)); keypad->insert(new QPushButton("0\n ", grid)); keypad->insert(new QPushButton("f\n#", grid)); keypad->insert(new QPushButton("d\n ", grid)); keypad->insert(new QPushButton("x\n ", grid)); keypad->insert(new QPushButton("y\n ", grid)); keypad->insert(new QPushButton("z\n ", grid)); connect(keypad, SIGNAL( pressed(int) ), this, SLOT( keypadPressed(int) )); connect(keypad, SIGNAL( released(int) ), this, SLOT( keypadReleased(int) )); setExtension(grid);}void KCallWidget::keypadPressed( int id ){ char code = 0; switch(id) { case 0: code = '1'; break; case 1: code = '2'; break; case 2: code = '3'; break; case 3: code = 'a'; break; case 4: code = '4'; break; case 5: code = '5'; break; case 6: code = '6'; break; case 7: code = 'b'; break; case 8: code = '7'; break; case 9: code = '8'; break; case 10: code = '9'; break; case 11: code = 'c'; break; case 12: code = '*'; break; case 13: code = '0'; break; case 14: code = '#'; break; case 15: code = 'd'; break; case 16: code = 'x'; break; case 17: code = 'y'; break; case 18: code = 'z'; break; } audio->startDTMF(code);}void KCallWidget::keypadReleased( int id ){ audio->stopDTMF();}void KCallWidget::setRemote( QString newremote ){ remote->setEditText( newremote );}SipCall *KCallWidget::getCall(){ return call;}void KCallWidget::switchCall( SipCall *newcall ){ ringTimer->stop(); printf( "KCallWidget: Switching calls...\n" ); call = newcall; audio->setBodyMask( call->getSdpMessageMask() ); dial->setText( tr("Dial") ); hangup->setText( tr("Hangup") ); if( member ) disconnect( member, 0, this, 0 ); member = call->getMemberList().toFirst(); if( member ) { if( member->getState() == SipCallMember::state_Disconnected ) { forceDisconnect(); return; } if( member->getState() == SipCallMember::state_Redirected ) { handleRedirect(); return; } curstat->setText( member->getLocalStatusDescription() ); connect( member, SIGNAL( statusUpdated( SipCallMember * ) ), this, SLOT( callMemberStatusUpdated() ) ); setCaption( getUserPrefix() + QString( tr("Call: ") ) + call->getCallId() ); if( call->getSubject() == tr("Incoming call") ) { if( call->getCallType() == SipCall::videoCall ) { setCaption( getUserPrefix() + QString( tr("Incoming Video Call: ") ) + call->getCallId() ); holdbutton->setEnabled( false ); transferbutton->setEnabled( false ); } else { setCaption( getUserPrefix() +
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -