📄 kphoneview.cpp
字号:
#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 + -