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

📄 kphoneview.cpp

📁 kphone-4.2,SHELL协议的VOIP电话
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>#include <qhbox.h>#include <qvbox.h>#include <qlayout.h>#include <qsplitter.h>#include <qlabel.h>#include <qcheckbox.h>#include <qmessagebox.h>#include <qsettings.h>#include <qvbox.h>#include <qdir.h>#include "../dissipate2/sipcall.h"#include "../dissipate2/sipclient.h"#include "../dissipate2/sipstatus.h"#include "../dissipate2/siptransaction.h"#include "../dissipate2/sipmessage.h"#include "calllistview.h"#include "kcallwidget.h"#include "callaudio.h"#include "kphone.h"#include "ksipauthentication.h"#include "kphonebook.h"#include "kphoneview.h"ContactParser::ContactParser( void )	: QXmlDefaultHandler(){}bool ContactParser::startDocument(){	return TRUE;}bool ContactParser::startElement( const QString&, const QString&,		const QString& qName,		const QXmlAttributes& attributes){	if( qName == "identity" ) {		QString description = attributes.value( "description" );		QString uri = attributes.value( "uri" );		QString contact = attributes.value( "contact" );		if( uri.left( 4 ).lower() != "tel:" && uri.left( 4 ).lower() != "sip:" ) {			uri = "sip:" + uri;		}		if( contact != QObject::tr("No") ) {			if( !description.isEmpty() ) {				uri += ";" + description;			}			contacts.append( uri );		}	}	return TRUE;}bool ContactParser::endElement( const QString&, const QString&, const QString& ){	return TRUE;}KPhoneView::KPhoneView( SipClient *c, SipUser *u, QWidget *parent, const char *name )	: QWidget( parent, name ), client( c ), user( u ){	reg = 0;	kphone = (KPhone*)parent;	buttonSetOffline = false;	setSubscribeOffline = false;	connect( client, SIGNAL( updateSubscribes() ),		this, SLOT( updateSubscribes() ) );	connect( client, SIGNAL( incomingInstantMessage( SipMessage * ) ),		this, SLOT( incomingInstantMessage( SipMessage * ) ) );	connect( client, SIGNAL( incomingSubscribe( SipCallMember *, bool ) ),		this, SLOT( incomingSubscribe( SipCallMember *, bool ) ) );	connect( client, SIGNAL( incomingCall( SipCall *, QString ) ),		this, SLOT( incomingCall( SipCall *, QString ) ) );	connect( client, SIGNAL( hideCallWidget( SipCall * ) ),		this, SLOT( hideCallWidget( SipCall * ) ) );	QVBoxLayout *vbox = new QVBoxLayout( this );	QGridLayout *headergrid = new QGridLayout( 4, 5 );	vbox->insertLayout( 0, headergrid );	buttonSipUri = new QPushButton( tr("Set Identity"), this );	buttonSipUri->setMinimumWidth( kphoneMinimunWidht );	headergrid->addMultiCellWidget( buttonSipUri, 0, 0, 0, 4 );	connect( buttonSipUri, SIGNAL( clicked() ),		this, SLOT( showIdentities() ) );	lineeditCall = new QLineEdit( this );	lineeditCall->setFocus();	connect( lineeditCall, SIGNAL( returnPressed() ),		this, SLOT( makeNewCall() ) );	headergrid->addMultiCellWidget( lineeditCall, 1, 1, 0, 2 );	buttonNewCall = new QPushButton( "", this );	buttonNewCall->setFixedWidth( 30 );	QIconSet icon;	icon.setPixmap(SHARE_DIR "/icons/mini-kphone.png", QIconSet::Automatic );	buttonNewCall->setIconSet( icon );	headergrid->addWidget( buttonNewCall, 1, 3 );	connect( buttonNewCall, SIGNAL( clicked() ),		this, SLOT( makeNewCall() ) );	buttonVideoCall = new QPushButton( "", this );	buttonVideoCall->setFixedWidth( 30 );	QIconSet icon3;	icon3.setPixmap(SHARE_DIR "/icons/videocall.png", QIconSet::Automatic );	buttonVideoCall->setIconSet( icon3 );	headergrid->addWidget( buttonVideoCall, 1, 4 );	connect( buttonVideoCall, SIGNAL( clicked() ),		this, SLOT( makeVideoCall() ) );	callcount = 1;	clist = new ContactsListView( client, this );	headergrid->addMultiCellWidget( clist, 3, 3, 0, 4 );	clist->addMenuItem( tr("Send Message"), this, SLOT( contactSendMessage() ) );	clist->addMenuItem( tr("Call"), this, SLOT( contactCall() ) );	clist->addMenuItem( tr("Video Call"), this, SLOT( contactVideoCall() ) );	clist->addMenuItem( tr("Phone Book"), this, SLOT( showPhoneBook() ) );	connect( clist, SIGNAL( doubleClicked( QListViewItem * ) ),		this, SLOT( contactDoubleClicked( QListViewItem * ) ) );	connect( client, SIGNAL( callListUpdated() ),		clist, SLOT( auditList() ) );	buttonOffOnline = new QPushButton( "", this );	buttonOffOnline->setFixedWidth( 30 );	QIconSet icon1;	icon1.setPixmap(SHARE_DIR "/icons/offline.png", QIconSet::Automatic );	buttonOffOnline->setIconSet( icon1 );	connect( buttonOffOnline, SIGNAL( clicked() ),		this, SLOT( buttonOffOnlineClicked() ) );	headergrid->addWidget( buttonOffOnline, 4, 0 );	stateComboBox = new QComboBox( TRUE, this, "" );	QString online = tr("Online");	QString busy = tr("Busy");	QString berightback = tr("Be Right Back");	QString away = tr("Away");	QString onthephone = tr("On The Phone");	QString outtolunch = tr("Out To Lunch");	static const char* items[] = {		online, busy,berightback, away,		onthephone, outtolunch, 0 };	stateComboBox->insertStrList( items );	connect( stateComboBox, SIGNAL( activated( const QString & )  ),		this, SLOT( buttonUpdateClicked() ) );	headergrid->addMultiCellWidget( stateComboBox, 4, 4, 1, 3 );	buttonUpdate = new QPushButton( "", this );	buttonUpdate->setFixedWidth( 30 );	QIconSet icon2;	icon2.setPixmap(SHARE_DIR "/icons/enter.png", QIconSet::Automatic );	buttonUpdate->setIconSet( icon2 );	connect( buttonUpdate, SIGNAL( clicked() ),		this, SLOT( buttonUpdateClicked() ) );	headergrid->addWidget( buttonUpdate, 4, 4 );	QString label;	QString uristr;	sipauthentication = new KSipAuthentication();	QSettings settings;	SipCall *newcall;	SipCallMember *member;	QString p = "/kphone/" + getUserPrefix() + "/local/";	QString file = settings.readEntry( p + "/PhoneBook", "" );	if( file.isEmpty() ) {		if( getUserPrefix().isEmpty() ) {			file = QDir::homeDirPath() + "/.kphone-phonebook.xml";		} else {			file = QDir::homeDirPath() + "/.kphone" +				getUserPrefix() + "phonebook.xml";		}	}	QFile xmlFile( file );	QXmlInputSource source( xmlFile );	QXmlSimpleReader reader;	ContactParser parser;	reader.setContentHandler( &parser );	reader.parse( source );	QStringList sl = parser.getListContacts();	for ( QStringList::Iterator it = sl.begin(); it != sl.end(); ++it ) {		QString contact = QString(*it);		if( contact.contains( ";" ) ) {			uristr = contact.left( contact.find( ";" ) );			contact = contact.mid( contact.find( ";" ) + 1 );		} else {			uristr = contact;		}		if( !uristr.isEmpty() ) {			newcall = new SipCall( user, QString::null, SipCall::outSubscribeCall );			newcall->setSubject( uristr );			newcall->setContactStr( contact );			SipUri remoteuri( uristr );			member = new SipCallMember( newcall, remoteuri );			connect( member, SIGNAL( statusUpdated( SipCallMember * ) ),				clist, SLOT( auditList() ) );			connect( member, SIGNAL( statusUpdated( SipCallMember * ) ),				sipauthentication, SLOT( authRequest( SipCallMember * ) ) );		}	}	clist->auditList();	atomId = 1000;	p = "/kphone/" + getUserPrefix() + "/local/";	subscribeExpiresTime = settings.readNumEntry(		p + "/SubscribeExpiresTime", constSubscribeExpiresTime );	if( subscribeExpiresTime == 0 ) {		subscribeExpiresTime = -1;	}	subscribeTimer = new QTimer( this );	connect( subscribeTimer, SIGNAL( timeout() ),		this, SLOT( localStatusUpdate() ) );	isOnline = false;	p = "/kphone/" + getUserPrefix() + "/presence/";	int count = 0;	label.setNum( count );	label = p + "/Rejected" + label;	QString s = settings.readEntry( label, "" );	while( !s.isEmpty() ) {		rejectedContactList.append( s );		label.setNum( ++count );		label = p + "/Rejected" + label;		s = settings.readEntry( label, "" );	}	cwList.setAutoDelete( true );	imwList.setAutoDelete( true );}KPhoneView::~KPhoneView( void ){}void KPhoneView::incomingInstantMessage( SipMessage *message ){	printf( tr("KPhoneView: Incoming Instant Message") + "\n" );	QString subject;	QString remote;	KInstantMessageWidget *imwidget;	SipCall *c;	subject = user->getUri().uri();	remote = message->getHeaderData( SipHeader::From );	for( imwidget = imwList.first(); imwidget != 0; imwidget = imwList.next() ) {		c = imwidget->getCall();		if( c->getSubject() == subject &&				remote.contains( imwidget->getRemote() ) ) {			imwidget->instantMessage( message );			imwidget->show();			return;		}	}	c = new SipCall( user );	c->setSubject( user->getUri().uri() );	imwidget = new KInstantMessageWidget( sipauthentication, c, this );	imwList.append( imwidget );	imwidget->instantMessage( message );	imwidget->show();}void KPhoneView::incomingSubscribe( SipCallMember *member, bool sendSubscribe ){	clist->auditList();	if( member == 0 ) {		return;	}	printf( "KPhoneView: Incoming Subscribe\n" );	bool remove_subscribe = false;	SipUri uri = member->getUri();	QString uristr = member->getUri().reqUri();	for ( QStringList::Iterator it = rejectedContactList.begin(); it != rejectedContactList.end(); ++it ) {		if( uristr == QString(*it) ) {			printf( "KPhoneView: Incoming Subscribe Rejected\n" );			remove_subscribe = true;		}	}	SipCallIterator it( client->getCallList() );	bool find = false;	if( !remove_subscribe ) {		for( it.toFirst(); it.current(); ++it ) {			if( it.current()->getCallType() == SipCall::outSubscribeCall ) {				if( it.current()->getMember( uri ) ) {					find = true;				}			}		}	}	if( !find && !remove_subscribe) {		QString uristr = member->getUri().reqUri();		QMessageBox mb( getUserPrefix() + tr("KPhone"),			tr("Subscribe message from uri:") + "\n" + uristr + "\n\n" +			tr("Do you want to accept and create a contact ?"),			QMessageBox::Information,			QMessageBox::Yes | QMessageBox::Default,			QMessageBox::No,			QMessageBox::Cancel | QMessageBox::Escape );		mb.setButtonText( QMessageBox::Yes, tr("Accept") );		mb.setButtonText( QMessageBox::No, tr("Reject permanently") );		mb.setButtonText( QMessageBox::Cancel, tr("Reject this time") );		switch( mb.exec() ) {			case QMessageBox::Yes:				addContactToPhoneBook( member );				sendSubscribe = false;				break;			case QMessageBox::No:				rejectedContactList.append( member->getUri().reqUri() );				saveRejectContactList();				remove_subscribe = true;				break;			case QMessageBox::Cancel:				remove_subscribe = true;				break;		}	}	if( remove_subscribe ) {		for( it.toFirst(); it.current(); ++it ) {			if( it.current()->getCallType() == SipCall::inSubscribeCall ) {				if( it.current()->getMember( uri ) ) {					delete it.current();				}			}		}		return;	}	if( isOnline ) {		connect( member, SIGNAL( statusUpdated( SipCallMember * ) ),			sipauthentication, SLOT( authRequest( SipCallMember * ) ) );		sendNotify( ONLINE, member );	}	for( it.toFirst(); it.current(); ++it ) {		if( it.current()->getCallType() == SipCall::outSubscribeCall ) {			if( it.current()->getCallStatus() != SipCall::callDead ) {				if( it.current()->getMember( uri ) ) {					if( sendSubscribe ) {						if( reg->getRegisterState() == SipRegister::Connected ) {							QString uristr = it.current()->getSubject();							QString contactStr = it.current()->getContactStr();							if( it.current()->getCallStatus() == SipCall::callInProgress ) {								it.current()->getMember( uri )->requestClearSubscribe();							}							delete it.current();							SipCall *newcall = new SipCall( user, QString::null,								 SipCall::outSubscribeCall );							newcall->setSubject( uristr );							SipUri remoteuri( uristr );							member = new SipCallMember( newcall, remoteuri );							connect( member, SIGNAL( statusUpdated( SipCallMember * ) ),								clist, SLOT( auditList() ) );							connect( member, SIGNAL( statusUpdated( SipCallMember * ) ),								sipauthentication, SLOT( authRequest( SipCallMember * ) ) );							member->requestSubscribe( subscribeExpiresTime );							newcall->setContactStr( contactStr );							break;						}					}				}			}		}	}}void KPhoneView::incomingCall( SipCall *call, QString body ){	updateWidgetList();	if( call->getSubject() == QString::null ) {		call->setSdpMessageMask( body );		call->setSubject( tr("Incoming call") );		callAudio = new CallAudio( this );		callAudio->readAudioSettings();		callAudio->readVideoSettings();		KCallWidget *widget = new KCallWidget( 0, callAudio, call, this );		cwList.append( widget );		connect( widget, SIGNAL( redirectCall( const SipUri &, const QString & ) ),			this, SLOT( redirectCall( const SipUri &, const QString & ) ) );		widget->show();	}}void KPhoneView::hideCallWidget( SipCall *call ){	KCallWidget *widget;	SipCall *c;	for( widget = cwList.first(); widget != 0; widget = cwList.next() ) {		c = widget->getCall();		if( c == call ) {			widget->setHide();		}	}}void KPhoneView::contactDoubleClicked( QListViewItem *i ){	if( !buttonSipUri->text().compare( tr("Set Identity") ) ){		QMessageBox::information( this, tr("KPhone"), tr("Set First Identity.") );		return;	}	QString subject = ( (ContactsListViewItem *) i )->getCall()->getSubject();	SipCall *newcall = new SipCall( user, QString::null, SipCall::StandardCall );	newcall->setSubject( user->getUri().uri() );	callAudio = new CallAudio( this );	callAudio->readAudioSettings();	callAudio->readVideoSettings();	KCallWidget *widget = new KCallWidget( sipauthentication, callAudio, newcall, this );	cwList.append( widget );	connect( widget, SIGNAL( redirectCall( const SipUri &, const QString & ) ),		this, SLOT( redirectCall( const SipUri &, const QString & ) ) );	widget->pleaseDial(subject);	widget->show();}void KPhoneView::contactSendMessage(){	QString subject = "";	if( clist->currentItem() != 0 ) {		subject = ((ContactsListViewItem *)clist->currentItem())->getCall()->getSubject();	}	if( !buttonSipUri->text().compare( tr("Set Identity") ) ){		QMessageBox::information( this, tr("KPhone"), tr("Set First Identity.") );		return;	}	SipUri uri = user->getUri();	KInstantMessageWidget *imwidget;	if( clist->currentItem() ) {		QString subject = ( (ContactsListViewItem *)clist->currentItem() )->getCall()->getSubject();		if( clist->currentItem() != 0 ) {			for( imwidget = imwList.first(); imwidget != 0; imwidget = imwList.next() ) {				if( imwidget->getCall()->getSubject() == uri.uri() &&				    imwidget->getRemote() == subject ) {					imwidget->show();					return;				}			}		}	}	SipCall *initcall = new SipCall( user );	initcall->setSubject( uri.uri() );	imwidget = new KInstantMessageWidget( sipauthentication, initcall, this );	imwList.append( imwidget );	imwidget->setRemote( subject );	imwidget->show();}void KPhoneView::contactCall(){	updateWidgetList();	QString subject = "";	if( clist->currentItem() != 0 ) {		subject = ((ContactsListViewItem *)clist->currentItem())->getCall()->getSubject();	}	if( !buttonSipUri->text().compare( tr("Set Identity") ) ){		QMessageBox::information( this, tr("KPhone"), tr("Set First Identity.") );		return;	}	SipCall *newcall = new SipCall( user, QString::null, SipCall::StandardCall );	newcall->setSubject( user->getUri().uri() );	callAudio = new CallAudio( this );	callAudio->readAudioSettings();	callAudio->readVideoSettings();	KCallWidget *widget = new KCallWidget( sipauthentication, callAudio, newcall, this );	cwList.append( widget );	connect( widget, SIGNAL( redirectCall( const SipUri &, const QString & ) ),		this, SLOT( redirectCall( const SipUri &, const QString & ) ) );	widget->pleaseDial(subject);	widget->show();}void KPhoneView::contactVideoCall(){	updateWidgetList();	QString subject = "";	if( clist->currentItem() != 0 ) {		subject = ((ContactsListViewItem *)clist->currentItem())->getCall()->getSubject();	}	if( !buttonSipUri->text().compare( tr("Set Identity") ) ){		QMessageBox::information( this, tr("KPhone"), tr("Set First Identity.") );		return;	}	SipCall *newcall = new SipCall( user, QString::null, SipCall::videoCall );	newcall->setSubject( user->getUri().uri() );	callAudio = new CallAudio( this );	callAudio->readAudioSettings();	callAudio->readVideoSettings();	KCallWidget *widget = new KCallWidget( sipauthentication, callAudio, newcall, this );	cwList.append( widget );	widget->setRemote( subject );	connect( widget, SIGNAL( redirectCall( const SipUri &, const QString & ) ),		this, SLOT( redirectCall( const SipUri &, const QString & ) ) );	widget->show();}void KPhoneView::showPhoneBook(){	QSettings settings;	QString p = "/kphone/" + getUserPrefix() + "/local/";	QString file = settings.readEntry( p + "/PhoneBook", "" );	if( file.isEmpty() ) {		if( getUserPrefix().isEmpty() ) {			file = QDir::homeDirPath() + "/.kphone-phonebook.xml";		} else {			file = QDir::homeDirPath() + "/.kphone" +				getUserPrefix() + "phonebook.xml";		}	}	QPtrList<IncomingCall> r;

⌨️ 快捷键说明

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