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

📄 kcallwidget.cpp

📁 kphone-4.2,SHELL协议的VOIP电话
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#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 + -