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

📄 kphoneview.cpp

📁 KphoneSI (kpsi) is a SIP (Session Initiation Protocol) user agent for Linux, with which you can in
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include <stdio.h>#include <signal.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 "kcallview.h"#include "kcallwidget.h"#include "sessioncontrol.h"#include "kphone.h"#include "ksipauthentication.h"#include "kphonebook.h"#include "kphoneview.h"#include "callaudio.h"#include "kstatics.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.lower() != "no" ) {			if( !description.isEmpty() ) {				uri += ";" + description;			}			contacts.append( uri );		}	}	return TRUE;}bool ContactParser::endElement( const QString&, const QString&, const QString& ){	return TRUE;}KPhoneView::KPhoneView( SessionControl *sessioncontrol, SipClient *c, SipUser *u,CallAudio *au, QWidget *parent, const char *name , bool p2p)	: QWidget( parent, name , WStyle_NoBorder), client( c ), user( u ), callAudio(au) {	pointtopoint = p2p;	reg = 0;	widgetCounter=0;	sic = c;	buttonSetOffline = false;	setSubscribeOffline = false;	sessionControl = sessioncontrol;	QSettings settings;	connect( client, SIGNAL( updateSubscribes() ),		this, SLOT( updateSubscribes() ) );	connect( client, SIGNAL( terminateSubscribes(int, SipCall *) ),		this, SLOT( terminateSubscribes(int, SipCall *) ) );	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 );	QHBox *infoline = new QHBox( this );	infoline->setSpacing( 2 );	vbox->insertWidget( 0, infoline );		QGridLayout *headergrid = new QGridLayout( 9,16 );//5	vbox->insertLayout( 1, headergrid );		QHBox *infoline1 = new QHBox( this );	infoline1->setSpacing( 2 );	infostat1 = new QLabel( infoline1 );	infostat1->setText(c->getContactText());	headergrid->addMultiCellWidget( infoline1,0 ,0, 0, 6 );//	buttonSipUri = new QPushButton( "Set Identity", this );	headergrid->addMultiCellWidget( buttonSipUri,0 ,0, 7, 16 );//	connect( buttonSipUri, SIGNAL( clicked() ),		this, SLOT( showIdentities() ) );//phonebook	buttonPhone = new QPushButton( "", this );	buttonPhone->setFixedWidth( 30 );	QIconSet iconPh;	iconPh.setPixmap(SHARE_DIR "/icons/phonebook.png", QIconSet::Automatic );	buttonPhone->setIconSet( iconPh );	headergrid->addWidget( buttonPhone, 1, 0 );	connect( buttonPhone, SIGNAL( clicked() ),		this, SLOT( showPhoneBook() ) );	lineeditCall = new QLineEdit( this );	lineeditCall->setFocus();	connect( lineeditCall, SIGNAL( returnPressed() ),		this, SLOT( makeNewCall() ) );	headergrid->addMultiCellWidget( lineeditCall, 1, 1, 1, 9);// The buttons//Audio	buttonNewCall = new QPushButton( "", this );	buttonNewCall->setFixedWidth( 30 );	QIconSet icon;	icon.setPixmap(SHARE_DIR "/icons/audiocall.png", QIconSet::Automatic );	buttonNewCall->setIconSet( icon );	headergrid->addWidget( buttonNewCall, 1, 10 );	connect( buttonNewCall, SIGNAL( clicked() ),		this, SLOT( makeNewCall() ) );//video	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, 11 );	connect( buttonVideoCall, SIGNAL( clicked() ),		this, SLOT( makeVideoCall() ) );//audio+video	buttonAuViCall = new QPushButton( "", this );	buttonAuViCall->setFixedWidth( 30 );	QIconSet icon4;	icon4.setPixmap(SHARE_DIR "/icons/auvi.png", QIconSet::Automatic );	buttonAuViCall->setIconSet( icon4 );	headergrid->addWidget( buttonAuViCall, 1, 12 );	connect( buttonAuViCall, SIGNAL( clicked() ),		this, SLOT( makeAuViCall() ) );// the gereral sessions	QString icoPic;	buttonNewExt1 = new QPushButton( "", this );	buttonNewExt1->setFixedWidth( 30 );	QIconSet iconT1;		icoPic = settings.readEntry( KStatics::dBase + getUserPrefix() + "/SessionType1/icon", "warning" );	iconT1.setPixmap(SHARE_DIR "/icons/"+icoPic+".png", QIconSet::Automatic );	buttonNewExt1->setIconSet( iconT1 );	headergrid->addWidget( buttonNewExt1, 1, 13 );	connect( buttonNewExt1, SIGNAL( clicked() ),		this, SLOT( makeNewExt1() ) );	buttonNewExt2 = new QPushButton( "", this );	buttonNewExt2->setFixedWidth( 30 );	QIconSet iconT2;	icoPic = settings.readEntry( KStatics::dBase + getUserPrefix() + "/SessionType2/icon", "warning" );	iconT2.setPixmap(SHARE_DIR "/icons/"+icoPic+".png", QIconSet::Automatic );	buttonNewExt2->setIconSet( iconT2 );	headergrid->addWidget( buttonNewExt2, 1, 14 );	connect( buttonNewExt2, SIGNAL( clicked() ),		this, SLOT( makeNewExt2() ) );		buttonNewExt3 = new QPushButton( "", this );	buttonNewExt3->setFixedWidth( 30 );	QIconSet iconT3;	icoPic = settings.readEntry( KStatics::dBase + getUserPrefix() + "/SessionType3/icon", "warning" );	iconT3.setPixmap(SHARE_DIR "/icons/"+icoPic+".png", QIconSet::Automatic );	buttonNewExt3->setIconSet( iconT3 );	headergrid->addWidget( buttonNewExt3, 1, 15 );	connect( buttonNewExt3, SIGNAL( clicked() ),		this, SLOT( makeNewExt3() ) ); 	buttonNewExt4 = new QPushButton( "", this );	buttonNewExt4->setFixedWidth( 30 );	QIconSet iconT4;	icoPic = settings.readEntry( KStatics::dBase + getUserPrefix() + "/SessionType4/icon", "warning" );	iconT4.setPixmap(SHARE_DIR "/icons/"+icoPic+".png", QIconSet::Automatic );	buttonNewExt4->setIconSet( iconT4 );	headergrid->addWidget( buttonNewExt4, 1, 16 );	connect( buttonNewExt4, SIGNAL( clicked() ),		this, SLOT( makeNewExt4() ) );	callcount = 1;		tlist = new KCallView( this, this );	headergrid->addMultiCellWidget( tlist, 2, 2, 0, 16);// 0 7	tlist->setMinimumWidth ( 400 );	tlist->setMinimumHeight( 90 );	tlist->addMenuItem( "toggle hold ", this, SLOT( holdCW() ) );	tlist->addMenuItem( "Refer ", this, SLOT( referCW() ) );	tlist->addMenuItem( "Transfer ", this, SLOT( transferCW() ) );	tlist->addMenuItem( "renegCodec", this, SLOT( renegCodecCW() ) );	tlist->addMenuItem( "hang up", this, SLOT( hangupCW() ) );	tlist->addMenuItem( "toggle CallWidget", this, SLOT( toggleCW() ) );		connect( tlist, SIGNAL( doubleClicked( QListViewItem * ) ),		this, SLOT( listDoubleClicked( QListViewItem * ) ) );		connect( this, SIGNAL( auditKCW(void) ),		tlist, SLOT( auditList(void) ) );		clist = new ContactsListView( client, this );	headergrid->addMultiCellWidget( clist, 3, 3, 0, 16);// 0 7	clist->setMinimumHeight (90); //( kphoneMinimunWidht );	clist->setMinimumWidth (400); //( kphoneMinimunWidht );	clist->addMenuItem( "Send Message", this, SLOT( contactSendMessage() ) );	clist->addMenuItem( "Audio Call", this, SLOT( contactCall() ) );	clist->addMenuItem( "Video Call", this, SLOT( contactVideoCall() ) );	clist->addMenuItem( "Audio+Video Call", this, SLOT( contactAuViCall() ) );	clist->addMenuItem( "Session Type 1" , this, SLOT( contactExt1() ) );	clist->addMenuItem( "Session Type 2" , this, SLOT( contactExt2() ) );	clist->addMenuItem( "Session Type 3" , this, SLOT( contactExt3() ) );	clist->addMenuItem( "Session Type 4" , this, SLOT( contactExt4() ) );	clist->addMenuItem( "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, "" );	static const char* items[] = {		"Online", "Busy", "Be Right Back", "Away", "Permanent absent", "Appointment","On Breakfast", "On Dinner", "On Holidays", "On Lunch ", "Having a Meal", "On Meeting", "Travelling", "In Transit", "Steering", "Shopping", "Sleeping", "Looking TV", "On Vacation", "On The Phone", "Offline",0 };	stateComboBox->insertStrList( items );	connect( stateComboBox, SIGNAL( activated( const QString & )  ),		this, SLOT( buttonUpdateClicked() ) );	headergrid->addMultiCellWidget( stateComboBox, 4, 4, 3, 14 );//4	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, 16 );//5	QString label;	QString uristr;	sipauthentication = new KSipAuthentication();	SipCall *newcall;	SipCallMember *member;	QString p = KStatics::dBase + getUserPrefix() + "/local/";	QString file = settings.readEntry( p + "/PhoneBook", "" );		if( file.isEmpty() ) {		if( getUserPrefix().isEmpty() ) {			file = QDir::homeDirPath() + "/." + KStatics::xBase + "-phonebook.xml";		} else {			file = QDir::homeDirPath() + "/." + KStatics::xBase + "_" + 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 = KStatics::dBase + 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 = KStatics::dBase + 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 ){	QString subject;	QString remote;	KInstantMessageWidget *imwidget;	SipCall *c;	subject = user->getUri().uri();	remote = (message->getHeaderData( SipHeader::From ));	if ( (message->getHeaderData( SipHeader::Content_Type)).contains("application/im-iscomposing")) return;	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;	}	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) ) {			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() ,			"Subscribe message from uri:\n" + uristr +			"\n\nDo you want to accept and create a contact ?",			QMessageBox::Information,			QMessageBox::Yes | QMessageBox::Default,			QMessageBox::No,			QMessageBox::Cancel | QMessageBox::Escape );		mb.setButtonText( QMessageBox::Yes, "Accept" );		mb.setButtonText( QMessageBox::No, "Reject permanently" );		mb.setButtonText( QMessageBox::Cancel, "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 ){	printf("KPhoneView::incomingCall\n");	updateWidgetList();	if( call->getSubject() == QString::null ) {		call->setSdpMessageMask( body );		call->setSubject( "Incoming call" );		//auth		KCallWidget *widget = new KCallWidget(  sipauthentication, sessionControl, call, callAudio, this, this ,NULL ,0 );		cwList.append( widget );		connect( widget, SIGNAL( redirectCall( const SipUri &, const QString &, int  , KCallWidget *, int) ),			this, SLOT( redirectCall( const SipUri &, const QString &, int ,KCallWidget *, int ) ) );		connect( widget, SIGNAL( informPhoneView( int ,int) ),			this, SLOT( informPhoneView( int ,int) ) );		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();		}	}}

⌨️ 快捷键说明

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