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