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

📄 kcallwidget.cpp

📁 kphone-4.2,SHELL协议的VOIP电话
💻 CPP
📖 第 1 页 / 共 3 页
字号:
}void KCallWidget::updateCallRegister( void ){	QString s, ss, s1, s2, s3;	QTime t;	QDate d;	QString label;	IncomingCall *c;	IncomingCall *first;	int count = 0;	QSettings settings;	QString p = "/kphone/" + getUserPrefix() + "/Call register/";	label.setNum( count );	label = p + "/Missed" + label;	s = settings.readEntry( label, "" );	while( !s.isEmpty() ) {		settings.writeEntry( label, "");		label.setNum( ++count );		label = p + "/Missed" + label;		s = settings.readEntry( label, "" );	}	count = 0;	label.setNum( count );	label = p + "/Received" + label;	s = settings.readEntry( label, "" );	while( !s.isEmpty() ) {		settings.writeEntry( label, "");		label.setNum( ++count );		label = p + "/Received" + label;		s = settings.readEntry( label, "" );	}	int i = 0;	int last = receivedCalls.count();	if ( last > 30 ) {		first = receivedCalls.at( last - 30 );	} else {		first = receivedCalls.first();	}	for ( c = first; c != 0; c = receivedCalls.next() ) {		label.setNum( i++ );		label =  p + "/Received" + label;		t = c->getDateTime().time();		d = c->getDateTime().date();		ss = s1.setNum( d.year() ) + "." + s2.setNum( d.month() ) +	"." + s3.setNum( d.day() ) + "-" + t.toString();		settings.writeEntry( label, ss + " [" + c->getContact() + "]");	}	i = 0;	last = missedCalls.count();	if ( last > 30 ) {		first = missedCalls.at( last - 30 );	} else {		first = missedCalls.first();	}	for ( c = first; c != 0; c = missedCalls.next() ) {		label.setNum( i++ );		label = p + "/Missed" + label;		t = c->getDateTime().time();		d = c->getDateTime().date();		ss = s1.setNum( d.year() ) + "." + s2.setNum( d.month() ) +			"." + s3.setNum( d.day() ) + "-" + t.toString();		settings.writeEntry( label, ss + "[" + c->getContact() + "]");	}}void KCallWidget::dtmfsenderChanged ( const QString &s ){	printf("dtmfsenderChanged\n");	if (!dtmfsenderTimer->isActive())		dtmfsenderTimer->start(dtmfsenderdelay->value() * 10);}void KCallWidget::dtmfsenderTimeout( void ){	char c;		printf("dtmfsenderTimeout\n");	if (dtmfsender->currentText().length() == 0 || curstate != Connected)		dtmfsenderTimer->stop();	else {		c = dtmfsender->currentText().at(0).latin1();		dtmfsenderTimer->changeInterval(dtmfsenderdelay->value() * 10);				switch (c) {		case '0':	case '1':	case '2':	case '3':	case '4':		case '5':	case '6':	case '7':	case '8':	case '9':		case '#':	case '*':	case 'A':	case 'a':	case 'B':		case 'b':	case 'C':	case 'c':	case 'D':	case 'd':		case 'X':	case 'x':	case 'Y':	case 'y':	case 'Z':		case 'z':			audio->startDTMF(c);			dtmfsender->setCurrentText(dtmfsender->currentText().mid(1).prepend('w'));			break;		case 'W':			audio->stopDTMF();			dtmfsender->setCurrentText(dtmfsender->currentText().mid(1).prepend('w'));			break;		case 'w':			audio->stopDTMF();			dtmfsender->setCurrentText(dtmfsender->currentText().mid(1));			break;		case ' ':	case '-':	case '(':	case ')':			/* Quick-pause */			dtmfsender->setCurrentText(dtmfsender->currentText().mid(1));			dtmfsenderTimer->changeInterval(1);			break;		case '/':		default:			/* This blocks DTMF... */			dtmfsenderTimer->stop();		}	}}void KCallWidget::ringTimeout( void ){	if( isRingingTone ) {		if( ringCount < 5 ) {			ringCount++;			audio_fd = ::open( audio->getOSSFilename(), O_WRONLY | O_NONBLOCK );			if( audio_fd == -1 ) {				printf( "ERROR: %s\n", "Open Failed" );				return;			}			int flags = fcntl( audio_fd, F_GETFL );			flags &= ~O_NONBLOCK;			fcntl( audio_fd, F_SETFL, flags );			int format = AFMT_S16_LE;			if( ioctl( audio_fd, SNDCTL_DSP_SETFMT, &format ) == -1 ) {				return;			}			if( format != AFMT_S16_LE ) {				return;			}			int channels = 1;			if( ioctl( audio_fd, SNDCTL_DSP_CHANNELS, &channels ) == -1 ) {				return;			}			if( channels != 1 ) {				return;			}			int rate = 8000;			if( ioctl( audio_fd, SNDCTL_DSP_SPEED, &rate ) == -1 ) {				return;			}			if( rate != 8000) {				return;			}			int size = 4096;			int samp = size/2;			int ampl = 16384;			unsigned char devbuf[size];			int buf[samp];			int i, p=0;			double arg1, arg2;			arg1 = (double)2 * (double)M_PI * (double)941 / (double)samp;			arg2 = (double)2 * (double)M_PI * (double)1336 / (double)samp;			for(int i = 0; i < samp; i++) {				buf[i] = (short)((double)(ampl) * sin(arg1 * i) +					(double)(ampl) * sin(arg2 * i));			};			for (i=0; i<samp; i+=2) {				devbuf[p++] = (unsigned char)(buf[i] & 0xff);				devbuf[p++] = (unsigned char)((buf[i] >> 8) & 0xff);			}			for(;;) {				if( write( audio_fd, devbuf, samp ) != -1 ) {					break;				}			}			::close( audio_fd );			ringTimer->start( ringTime_1, TRUE );		} else {			ringCount = 0;			printf( "Ringing tone\n" );			ringTimer->start( ringTime_2, TRUE );		}	}}void KCallWidget::acceptCallTimeout( void ){	if( !audio->isAudioOn() ) {		if( isRingingTone ) {		}		audio_fd = ::open( audio->getOSSFilename(), O_WRONLY | O_NONBLOCK );		if( audio_fd == -1 ) {			QMessageBox::information( this, tr("Accept Call"),				tr("Close any program which might be using soundcard \nand then retry accepting call.") );			return;		} else {			::close( audio_fd );		}	}	if( audio->checkCodec( member ) ) {		audio->setCurrentCall( call );		audio->attachToCallMember( member );		member->acceptInvite(			audio->audioOut().message( audio->getRtpCodec(),				audio->getVideoRtpCodec(), audio->getBodyMask() ),			MimeContentType( "application/sdp" ) );		dial->setText( tr("Dial") );		hangup->setText( tr("Hangup") );		hidebutton->setEnabled( false );		dial->setEnabled( false );		hangup->setEnabled( true );	} else {		member->notAcceptableHere();		QMessageBox::information( this, tr("Accept Call"),			tr("Accepted codec not found.") );	}}void KCallWidget::hideCall( void ){	if( curstate == PreDial ) {		delete call;		call = 0;	}	setHide();}QString KCallWidget::getUserPrefix( void ){	return ((KPhone *)phoneView->parentWidget())->getUserPrefix();}void KCallWidget::setHide( void ){	hided = true;	hide();}KInstantMessageWidget::KInstantMessageWidget( KSipAuthentication *auth,		SipCall *initcall, QWidget *parent, const char *name )	: QDialog( parent, name ), imcall( initcall ){	sipauthentication = auth;	phoneBook = 0;	setCaption( getUserPrefix() + tr(" Message - KPhone") );	QVBoxLayout *vbox = new QVBoxLayout( this );	vbox->setMargin( 3 );	vbox->setSpacing( 3 );	QGridLayout *headergrid = new QGridLayout( 6, 3 );	headergrid->setSpacing( 3 );	vbox->insertLayout( 0, headergrid );	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 );	remote->setEditText( "" );	headergrid->addWidget( remote, 0, 1 );	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 );	QLabel *slabel = new QLabel( tr("Status: "), this );	vbox->insertWidget( 1, slabel );	status = new QTextEdit( this );	status->setReadOnly( true );	vbox->insertWidget( 2, status );	QLabel *mlabel = new QLabel( tr("Message: "), this );	vbox->insertWidget( 3, mlabel );	QGridLayout *mgrid = new QGridLayout( 1, 3 );	mgrid->setSpacing( 3 );	vbox->insertLayout( 4, mgrid );	mEdit = new QTextEdit( this );	mgrid->addWidget( mEdit, 0,0 );	mEdit->setFocus();	mbutton = new QPushButton( tr("Send"), this );	mbutton->setFixedWidth( mbutton->fontMetrics().maxWidth() * 4 );	connect( mbutton, SIGNAL( clicked() ), this, SLOT( mClicked() ) );	mgrid->addWidget( mbutton, 0, 2 );	QGrid *buttonbox = new QGrid(2, this );	buttonbox->setSpacing( 5 );	vbox->insertWidget( 5, buttonbox );	(void) new QWidget( buttonbox );	hidebutton = new QPushButton( tr("Hide"), buttonbox );	connect( hidebutton, SIGNAL( clicked() ), this, SLOT( hide() ) );	resize( 400, 200 );}KInstantMessageWidget::~KInstantMessageWidget( void ){	if( phoneBook ) {		delete phoneBook;	}}void KInstantMessageWidget::instantMessage( SipMessage *message ){	QString s = message->getHeaderData( SipHeader::From );	SipUri u = SipUri( s );	remote->setEditText( u.getUsername() + "@" + u.getHostname() );	QString m = message->messageBody();	status->setText( status->text() + "\n" + tr("Message received from ") + remote->currentText() );	status->setText( status->text() + " (" + QTime::currentTime().toString().latin1() + ")" );	status->setText( status->text() + "\n > " + m );	status->scrollToBottom();}SipCall *KInstantMessageWidget::getCall(){	return imcall;}QString KInstantMessageWidget::getRemote(){	return remote->currentText();}void KInstantMessageWidget::setRemote( QString newremote ){	remote->setEditText( newremote );}void KInstantMessageWidget::mClicked( void ){	if( remote->currentText().length() == 0 ) {		QMessageBox::critical( this, tr("Error: No Destination"),			tr("You must specify someone to send message.") );		return;	}	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 + "@" + imcall->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 );	SipUri remoteuri( strRemoteUri );	member = new SipCallMember( imcall, remoteuri );	connect( member, SIGNAL( statusUpdated( SipCallMember * ) ),		sipauthentication, SLOT( authRequest( SipCallMember * ) ) );	status->setText( status->text() + "\n" + tr("Message sent to ") + remote->currentText() );	status->setText( status->text() + " (" + QTime::currentTime().toString().latin1() + ")" );	status->setText( status->text() + "\n > " + mEdit->text() );	status->scrollToBottom();	member->requestMessage( mEdit->text(),		MimeContentType( "text/plain; charset=UTF-8" ) );	mEdit->clear();}void KInstantMessageWidget::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() );	((KPhoneView *)parentWidget())->updateContacts( xmlFile );}QString KInstantMessageWidget::getUserPrefix( void ){	return ((KPhone *)parentWidget()->parentWidget())->getUserPrefix();}

⌨️ 快捷键说明

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