hi list,
the mechanic is working! i inserted in
QtPhoneCall.cpp
a new function ("QtPhoneCall::blindTransfer2()"), a new menu (transfer
call) and it worked for the string "1015", but i am not able to access
PhoneComboBoxCurrenttext in QtCallbar.cpp.
the problem is, i don't know too much about c++ and qt. Please could
someone give me a hint?
Thanks !
karl
Line 559 in qtphonecall.cpp
void QtPhoneCall::holdOrResume() {
if (_hold) {
_cPhoneCall.resume();
} else {
_cPhoneCall.hold();
}
updateHoldAction();
}
//--start my dirty hack
void QtPhoneCall::blindTransfer2() {
//currentText().toStdString();QtCallBar::
// std::string phoneNumber2 = currentText()
//std::string phoneNumber2 =callBar->getPhoneComboBoxCurrentText();
_cPhoneCall.blindTransfer("1015");
}
//-- end my dirty hack
void QtPhoneCall::updateCallDuration() {
_duration++;
updateStatusLabel();
}
Chris Maciejewski schrieb:
Could please someone let me know, if it is currently possible to
transfer call with Qutecom?
Thanks
Chris
2008/8/13 Chris Maciejewski <[EMAIL PROTECTED]>:
Hello,
Just wanted to discuss with the list the idea of adding (or replacing
"Audio Smileys" button) on a "Call" tab with "Call transfer" button.
It seems to me there is already method for this
http://doxygen.qutecom.org/_phone_line_8cpp-source.html#l00273 but I
can't find any GUI element to do this. Or I am missing something
obvious?
Regards,
Chris
_______________________________________________
QuteCom-dev mailing list
[email protected]
http://lists.qutecom.org/mailman/listinfo/qutecom-dev
--
******************************************************************
OGVIT GmbH & Co KG, Tel: +49(0)5251.687060, Fax: +49(0)5251.687069
Adresse: D-33098 Paderborn, Jesuitenmauer 24
http://ogvit.de, [EMAIL PROTECTED]
HRA 2342 Amtsgericht Paderborn
Komplementärin:
OGVIT Verwaltungs GmbH
Jesuitenmauer 24
33098 Paderborn
HRB 3568 Amtsgericht Paderborn
Geschäftsführer: Karl Bernhard Julius Hoffmann
Ust-ID Nr: 812947166
******************************************************************
Kontakt Hamburg:
c/o Postalo GmbH
Kattrepel 2 - 20095 Hamburg
Tel 040/51318373 - fax 040/51318374
******************************************************************
/*
* WengoPhone, a voice over Internet phone
* Copyright (C) 2004-2007 Wengo
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "QtPhoneCall.h"
#include "ui_PhoneCallWidget.h"
#ifdef XV_HWACCEL
#include "QtVideoXV.h"
#endif
#include "QtVideoQt.h"
#include "QtPhoneCallEventFilter.h"
#include "../toaster/QtCallToaster.h"
#include "../QtDialpad.h"
#include <presentation/qt/callbar/QtCallBar.h>
#include <presentation/qt/callbar/QtPhoneComboBox.h>
#include "QtAudioSmileysWindow.h"
#include <presentation/qt/QtWengoPhone.h>
#include <presentation/qt/QtToolBar.h>
#include <presentation/qt/statusbar/QtStatusBar.h>
#include <presentation/qt/contactlist/QtContactList.h>
#include <presentation/qt/profile/QtProfileDetails.h>
#include <control/CWengoPhone.h>
#include <control/profile/CUserProfile.h>
#include <control/profile/CUserProfileHandler.h>
#include <control/phonecall/CPhoneCall.h>
#include <model/config/Config.h>
#include <model/config/ConfigManager.h>
#include <model/contactlist/ContactProfile.h>
#include <model/phonecall/ConferenceCall.h>
#include <model/phonecall/PhoneCall.h>
#include <model/phoneline/PhoneLine.h>
#include <model/profile/AvatarList.h>
#include <sipwrapper/CodecList.h>
#include <sipwrapper/SipWrapper.h>
#include <cutil/global.h>
#include <util/Logger.h>
#include <util/SafeDelete.h>
#include <qtutil/SafeConnect.h>
#include <qtutil/WidgetRatioEnforcer.h>
#include <qtutil/WidgetUtils.h>
#include <QtCore/QMutex>
#include <QtCore/QTime>
#include <QtCore/QTimer>
#include <QtGui/QMenu>
#include <QtGui/QPainter>
// If a PSTN number is shorter than this length, we assume it's a special sip
// account, like 333 for Wengo
static const int PSTN_NUMBER_MIN_LENGTH = 4;
static const int LOCAL_FRAME_WIDTH = 64;
static const int LOCAL_FRAME_HEIGHT = 64;
static const int LOCAL_FRAME_MARGIN = 7;
// See wifo/phapi/phmedia-video.c
static const int NOWEBCAM_FILL_VALUE = 128;
static const int NOWEBCAM_SAMPLE_COUNT = 200;
// Minimum width of buttons shown when we are in "talking" state. Defined to
avoid square buttons
// under MacOS X
static const int TALKING_BUTTON_MIN_WIDTH = 50;
/**
* Helper function to determine if image is a real webcam or not:
* If the remote user has no webcam, then wifo will send us a yuv image filled
* with NOWEBCAM_FILL_VALUE bytes.
*/
static bool isRealWebcamVideoFrame(piximage* image) {
if (image->palette != PIX_OSI_YUV420P) {
return true;
}
int step = (image->width * image->height * 3 / 2) /
NOWEBCAM_SAMPLE_COUNT;
for (int sample=0; sample < NOWEBCAM_SAMPLE_COUNT; ++sample) {
if (image->data[sample * step] != NOWEBCAM_FILL_VALUE) {
return true;
}
}
return false;
}
static void setButtonAction(QPushButton* button, QAction* action) {
button->disconnect();
SAFE_CONNECT_RECEIVER(button, SIGNAL(clicked()), action,
SLOT(trigger()));
button->setIcon(action->icon());
button->setEnabled(action->isEnabled());
button->setToolTip(action->toolTip());
}
static void flashMainWindow(QWidget* window) {
if (window->isActiveWindow()) {
return;
}
if (!window->isVisible()) {
// Make sure the window appears on the taskbar,
// otherwise it won't flash...
window->showMinimized();
}
WidgetUtils::flashWindow(window);
}
QtPhoneCall::QtPhoneCall(CPhoneCall & cPhoneCall)
: QObject(NULL),
_cPhoneCall(cPhoneCall) {
_qtWengoPhone = (QtWengoPhone *)
_cPhoneCall.getCWengoPhone().getPresentation();
_videoWindow = NULL;
_closed = false;
_duration = 0;
_callToaster = NULL;
_remoteVideoFrame = NULL;
_localVideoFrame = NULL;
_hold = false;
_videoMode = VM_None;
_mutex = new QMutex(QMutex::Recursive);
_phoneCallWidget = new QWidget(NULL);
_ui = new Ui::PhoneCallWidget();
_ui->setupUi(_phoneCallWidget);
_ui->encryptionFrame->hide();
//_ui->videoContainer->hide();
_ui->labelStack->setCurrentWidget(_ui->avatarPage);
_ui->buttonStack->setCurrentWidget(_ui->ringingPage);
_phoneCallWidget->setAutoFillBackground(true);
std::string tmpDisplayName =
_cPhoneCall.getPhoneCall().getPeerSipAddress().getDisplayName();
QString userName = QString::fromUtf8(tmpDisplayName.c_str());
if (userName.isEmpty()) {
userName =
QString::fromStdString(_cPhoneCall.getPhoneCall().getPeerSipAddress().getUserName());
}
QPixmap avatarPixmap = loadContactAvatar(userName);
initAvatarLabel(avatarPixmap);
Config & config = ConfigManager::getInstance().getCurrentConfig();
// On MacOSX getVideoEnable causes quite a lot of work, like listing the
// available devices. Therefore we keep the result instead of asking it
// everytime it's needed.
_videoEnabledInConfig = config.getVideoEnable();
//init flip
PhoneLine & phoneLine = dynamic_cast < PhoneLine & >
(_cPhoneCall.getPhoneCall().getPhoneLine());
phoneLine.flipVideoImage(config.getVideoFlipEnable());
////
userName = getDisplayName(userName);
#ifndef OS_MACOSX
//With Qt4.2, the button background is set to _phoneCallWidget
background
//color on Windows and Linux, setting autoFillBackground to true
prevents
//this.
//We don't want to do this on OSX, because on this platform setting
//autoFillBackground to true paints horizontal stripes behind the
buttons.
Q_FOREACH(QPushButton* button,
_phoneCallWidget->findChildren<QPushButton*>()) {
button->setAutoFillBackground(true);
}
////
#endif
Q_FOREACH(QPushButton* button,
_ui->talkingPage->findChildren<QPushButton*>()) {
button->setMinimumWidth(TALKING_BUTTON_MIN_WIDTH);
}
// Set bold ourself: if we do it from Designer it alters the font name
(at
// least with Qt 4.1)
QFont font(_ui->nickNameLabel->font());
font.setBold(true);
_ui->nickNameLabel->setFont(font);
_ui->nickNameLabel->setText(userName);
updateNickNameToolTip();
_ui->statusLabel->setToolTip(tr("Status"));
// Accept call
SAFE_CONNECT(_ui->acceptButton, SIGNAL(clicked()), SLOT(acceptCall()));
// Reject call
SAFE_CONNECT(_ui->rejectButton, SIGNAL(clicked()), SLOT(rejectCall()));
// Tweak ui when we are the caller
if (!isIncoming()) {
_ui->acceptButton->hide();
_ui->rejectButton->setText(tr("Ca&ncel"));
}
// Hang up
_actionHangupCall = new
QAction(QIcon(":/pics/actions/hangup-phone.png"), tr("Hang-up"),
_phoneCallWidget);
SAFE_CONNECT(_actionHangupCall, SIGNAL(triggered()),
SLOT(rejectCall()));
setButtonAction(_ui->hangupButton, _actionHangupCall);
//Hold
_actionHold = new QAction(_phoneCallWidget);
SAFE_CONNECT(_actionHold, SIGNAL(triggered()), SLOT(holdOrResume()));
//Add contact
_actionAddContact = new
QAction(QIcon(":/pics/actions/add-contact.png"), tr("Add contact"),
_phoneCallWidget);
SAFE_CONNECT(_actionAddContact, SIGNAL(triggered()),
SLOT(addContact()));
setButtonAction(_ui->addContactButton, _actionAddContact);
////
SAFE_CONNECT(_ui->dialpadButton, SIGNAL(toggled(bool)),
SLOT(toggleDialpad(bool)) );
SAFE_CONNECT(_ui->smileysButton, SIGNAL(toggled(bool)),
SLOT(toggleSmileys(bool)) );
//Computes the call duration
_callTimer = new QTimer(_phoneCallWidget);
SAFE_CONNECT(_callTimer, SIGNAL(timeout()), SLOT(updateCallDuration()));
QtPhoneCallEventFilter * filter = new
QtPhoneCallEventFilter(_phoneCallWidget);
_phoneCallWidget->installEventFilter(filter);
flashMainWindow(_qtWengoPhone->getWidget());
showToaster(userName, avatarPixmap);
if (!_cPhoneCall.getPhoneCall().getConferenceCall()) {
_qtWengoPhone->addPhoneCall(this);
} else {
_qtWengoPhone->addToConference(this);
}
updateStatusLabel();
updateHoldAction();
//update toolbar (menus)
if (_qtWengoPhone) {
_qtWengoPhone->getQtToolBar().updateMenuActions();
}
////
_ui->acceptButton->setFocus();
}
QtPhoneCall::~QtPhoneCall() {
if (_remoteVideoFrame) {
pix_free(_remoteVideoFrame);
}
if (_localVideoFrame) {
pix_free(_localVideoFrame);
}
OWSAFE_DELETE(_ui);
OWSAFE_DELETE(_mutex);
}
void QtPhoneCall::initAvatarLabel(const QPixmap& pixmap) {
if (pixmap.hasAlpha()) {
// Paint avatar over a background if it's transparent (doing so
for
// full opaque images looks ugly)
QPixmap bg(":/pics/phonecall/avatar_background.png");
QPainter painter(&bg);
painter.drawPixmap(
(bg.width() - pixmap.width()) / 2,
(bg.height() - pixmap.height()) / 2,
pixmap);
painter.end();
_ui->avatarLabel->setPixmap(bg);
} else {
_ui->avatarLabel->setPixmap(pixmap);
}
_ui->labelStack->setCurrentWidget(_ui->avatarPage);
}
QPixmap QtPhoneCall::loadContactAvatar(const QString& userName) {
QPixmap pixmap;
QtContactList * qtContactList = _qtWengoPhone->getQtContactList();
if (qtContactList) {
CContactList & cContactList = qtContactList->getCContactList();
IMContact imContact(EnumIMProtocol::IMProtocolWengo,
userName.toStdString());
std::string contactId =
cContactList.findContactThatOwns(imContact);
ContactProfile contactProfile =
cContactList.getContactProfile(contactId);
std::string data = contactProfile.getIcon().getData();
if (!data.empty()) {
pixmap.loadFromData((uchar *) data.c_str(),
data.size());
}
}
if (pixmap.isNull()) {
// User is not in contact list, or has no avatar defined, use
default
// avatar instead
std::string data =
AvatarList::getInstance().getDefaultAvatarPicture().getData();
pixmap.loadFromData((uchar*) data.c_str(), data.size());
}
return pixmap;
}
void QtPhoneCall::updateHoldAction() {
if (_hold) {
_actionHold->setToolTip(tr("Resume"));
_actionHold->setIcon(QIcon(":/pics/actions/resume-phone.png"));
} else {
_actionHold->setToolTip(tr("Hold"));
_actionHold->setIcon(QIcon(":/pics/actions/hold-phone.png"));
}
setButtonAction(_ui->holdButton, _actionHold);
}
void QtPhoneCall::updateNickNameToolTip() {
QString toolTip =
QString::fromStdString(_cPhoneCall.getPeerSipAddress());
if (!_codecs.isEmpty()) {
toolTip += QString(" (%1)").arg(_codecs);
}
_ui->nickNameLabel->setToolTip(toolTip);
}
QString QtPhoneCall::getDisplayName(QString str) {
QString tmp;
int begin = str.indexOf("sip:", 0, Qt::CaseInsensitive);
if (begin == -1) {
// Not found, return ...
return str;
}
begin += 4;
int end = str.indexOf("@", begin, Qt::CaseInsensitive);
if (end == -1) {
//Not found, return ...
return str;
}
tmp = str.mid(begin, end - begin);
return tmp;
}
void QtPhoneCall::stateChangedEvent(EnumPhoneCallState::PhoneCallState state) {
std::string codecs;
if (_cPhoneCall.getAudioCodecUsed() != CodecList::AudioCodecError) {
codecs += CodecList::toString(_cPhoneCall.getAudioCodecUsed());
}
if (_cPhoneCall.getVideoCodecUsed() != CodecList::VideoCodecError) {
codecs += "/" +
CodecList::toString(_cPhoneCall.getVideoCodecUsed());
}
_codecs = QString::fromStdString(codecs);
updateNickNameToolTip();
updateStatusLabel();
//update toolbar (menus)
if (_qtWengoPhone) {
_qtWengoPhone->getQtToolBar().updateMenuActions();
}
switch (state) {
case EnumPhoneCallState::PhoneCallStateTalking:
_ui->buttonStack->setCurrentWidget(_ui->talkingPage);
_duration = 0;
_callTimer->start(1000);
_actionHangupCall->setEnabled(true);
_ui->encryptionFrame->setVisible(isCallEncrypted());
startedTalking(this);
break;
case EnumPhoneCallState::PhoneCallStateDialing:
case EnumPhoneCallState::PhoneCallStateRinging:
case EnumPhoneCallState::PhoneCallStateRingingStart:
case EnumPhoneCallState::PhoneCallStateRingingStop:
case EnumPhoneCallState::PhoneCallStateIncoming:
_actionHangupCall->setEnabled(true);
break;
case EnumPhoneCallState::PhoneCallStateHold:
_hold = true;
updateHoldAction();
break;
case EnumPhoneCallState::PhoneCallStateResumed:
_hold = false;
updateHoldAction();
break;
case EnumPhoneCallState::PhoneCallStateUnknown:
case EnumPhoneCallState::PhoneCallStateError:
case EnumPhoneCallState::PhoneCallStateMissed:
case EnumPhoneCallState::PhoneCallStateRedirected:
break;
case EnumPhoneCallState::PhoneCallStateClosed:
LOG_FATAL("should never reach this case since
PPhoneCall::close() is done for this purpose");
break;
default:
LOG_FATAL("unknown PhoneCallState=" +
EnumPhoneCallState::toString(state));
}
}
void QtPhoneCall::initVideo(piximage* remoteVideoFrame, piximage*
localVideoFrame) {
_remoteVideoFrame = remoteVideoFrame;
_localVideoFrame = localVideoFrame;
if (!isRealWebcamVideoFrame(remoteVideoFrame)) {
if (_videoEnabledInConfig) {
_videoMode = VM_LocalOnly;
} else {
_videoMode = VM_None;
}
return;
}
// We only get there if we receive a real video from the remote user
if (_videoEnabledInConfig) {
_videoMode = VM_Both;
} else {
_videoMode = VM_RemoteOnly;
}
// Hide avatar label to save space for the video
//_ui->avatarLabel->hide();
#ifdef XV_HWACCEL
if (config.getXVideoEnable()) {
_videoWindow = new QtVideoXV(_phoneCallWidget,
remoteVideoFrame->width, remoteVideoFrame->height,
localVideoFrame->width, localVideoFrame->height);
if (!_videoWindow->isInitialized()) {
OWSAFE_DELETE(_videoWindow);
}
}
#endif
// We can fallback from a failure in QtVideoXV
if (!_videoWindow) {
_videoWindow = new QtVideoQt(_ui->videoContainer);
SAFE_CONNECT(_videoWindow,
SIGNAL(toggleFlipVideoImageSignal()), SLOT(toggleFlipVideoImage()));
}
// Init videoContainer
double ratio = remoteVideoFrame->width /
double(remoteVideoFrame->height);
_ui->videoContainer->setRatio(ratio);
_ui->videoContainer->setChild(_videoWindow->getWidget());
QTimer::singleShot(0, _videoWindow->getWidget(), SLOT(show()));
//_ui->videoContainer->show();
_ui->labelStack->setCurrentWidget(_ui->videoPage);
}
void QtPhoneCall::videoFrameReceivedEvent(piximage * remoteVideoFrame, piximage
* localVideoFrame) {
QMutexLocker locker(_mutex);
//FIXME hack to prevent a crash
if (_closed) {
return;
}
if (_videoMode == VM_None) {
initVideo(remoteVideoFrame, localVideoFrame);
}
if (_videoMode == VM_RemoteOnly || _videoMode == VM_Both) {
_videoWindow->showImage(remoteVideoFrame, localVideoFrame);
}
if (_videoMode == VM_LocalOnly) {
QImage image;
QSize size(_localVideoFrame->width, _localVideoFrame->height);
size.scale(LOCAL_FRAME_WIDTH, LOCAL_FRAME_HEIGHT,
Qt::KeepAspectRatio);
if (size.width() & 1) {
size.setWidth(size.width() + 1);
}
if (size.height() & 1) {
size.setHeight(size.height() + 1);
}
QtVideoQt::convertPixImageToQImage(_localVideoFrame, size,
&image);
QPixmap avatarPix = *_ui->avatarLabel->pixmap();
QPainter painter(&avatarPix);
painter.drawImage(
avatarPix.width() - size.width() - LOCAL_FRAME_MARGIN,
avatarPix.height() - size.height() - LOCAL_FRAME_MARGIN,
image);
painter.end();
_ui->avatarLabel->setPixmap(avatarPix);
}
}
void QtPhoneCall::acceptCall() {
_ui->statusLabel->setText(tr("Initialization..."));
_cPhoneCall.accept();
if (_callToaster) {
_callToaster->close();
}
}
void QtPhoneCall::rejectCall() {
LOG_DEBUG("phone call hangup");
switch (_cPhoneCall.getState()) {
case EnumPhoneCallState::PhoneCallStateError:
case EnumPhoneCallState::PhoneCallStateResumed:
case EnumPhoneCallState::PhoneCallStateTalking:
case EnumPhoneCallState::PhoneCallStateDialing:
case EnumPhoneCallState::PhoneCallStateRinging:
case EnumPhoneCallState::PhoneCallStateRingingStart:
case EnumPhoneCallState::PhoneCallStateRingingStop:
case EnumPhoneCallState::PhoneCallStateIncoming:
case EnumPhoneCallState::PhoneCallStateHold:
case EnumPhoneCallState::PhoneCallStateRedirected:
_cPhoneCall.hangUp();
break;
default:
LOG_DEBUG("call rejected");
}
}
void QtPhoneCall::holdOrResume() {
if (_hold) {
_cPhoneCall.resume();
} else {
_cPhoneCall.hold();
}
updateHoldAction();
}
void QtPhoneCall::blindTransfer2() {
//currentText().toStdString();QtCallBar::
// std::string phoneNumber2 = currentText()
// std::string phoneNumber2 =
callBar->getPhoneComboBoxCurrentText(); // currentText()
_cPhoneCall.blindTransfer("1015");
//QtPhoneComboBox.currentText().toStdString()
}
void QtPhoneCall::updateCallDuration() {
_duration++;
updateStatusLabel();
}
void QtPhoneCall::updateStatusLabel() {
QString text;
switch (_cPhoneCall.getState()) {
case EnumPhoneCallState::PhoneCallStateError:
text = tr("Error");
break;
case EnumPhoneCallState::PhoneCallStateResumed:
case EnumPhoneCallState::PhoneCallStateTalking:
if (_cPhoneCall.getPhoneCall().getConferenceCall()) {
text = tr("Talking - Conference");
} else {
text = tr("Talking");
}
break;
case EnumPhoneCallState::PhoneCallStateDialing:
text = tr("Dialing");
break;
case EnumPhoneCallState::PhoneCallStateRinging:
text = tr("Ringing");
break;
case EnumPhoneCallState::PhoneCallStateRingingStart:
text = tr("Ringing");
break;
case EnumPhoneCallState::PhoneCallStateIncoming:
text = tr("Incoming Call");
break;
case EnumPhoneCallState::PhoneCallStateHold:
text = tr("Hold");
break;
case EnumPhoneCallState::PhoneCallStateRedirected:
text = tr("Redirected");
break;
default:
break;
}
_ui->statusLabel->setText(text);
QTime time;
time = time.addSecs(_duration);
_ui->durationLabel->setText(time.toString(Qt::TextDate));
}
bool QtPhoneCall::isIncoming() const {
return (_cPhoneCall.getState() ==
EnumPhoneCallState::PhoneCallStateIncoming);
}
void QtPhoneCall::showToaster(const QString & userName, const QPixmap& pixmap) {
Config & config = ConfigManager::getInstance().getCurrentConfig();
if (!isIncoming()) {
return;
}
//Shows toaster for incoming chats?
if (!config.getNotificationShowToasterOnIncomingCall()) {
return;
}
OWSAFE_DELETE(_callToaster);
_callToaster = new QtCallToaster();
_callToaster->setMessage(userName);
_callToaster->setPixmap(pixmap);
SAFE_CONNECT(_callToaster, SIGNAL(pickUpButtonClicked()),
SLOT(acceptCall()));
SAFE_CONNECT(_callToaster, SIGNAL(hangUpButtonClicked()),
SLOT(rejectCall()));
_callToaster->show();
}
void QtPhoneCall::close() {
//FIXME hack to prevent a crash
_closed = true;
if (_callToaster) {
_callToaster->close();
}
_callTimer->disconnect();
_callTimer->stop();
OWSAFE_DELETE(_callTimer);
_actionHangupCall->setEnabled(false);
_ui->statusLabel->setText(tr("Closed"));
if (_videoWindow) {
if (_videoWindow->isFullScreen()) {
_videoWindow->unFullScreen();
}
}
//update toolbar (menus)
if (_qtWengoPhone) {
_qtWengoPhone->getQtToolBar().updateMenuActions();
}
////
//TODO: disconnect from flipWebcamButtonClicked
OWSAFE_DELETE(_videoWindow);
OWSAFE_DELETE(_phoneCallWidget);
deleteLater();
}
void QtPhoneCall::toggleFlipVideoImage() {
Config & config = ConfigManager::getInstance().getCurrentConfig();
PhoneLine & phoneLine = dynamic_cast < PhoneLine & >
(_cPhoneCall.getPhoneCall().getPhoneLine());
bool flip = !config.getVideoFlipEnable();
phoneLine.flipVideoImage(flip);
config.set(Config::VIDEO_ENABLE_FLIP_KEY, flip);
}
/**
* Helper function trying to determine if a username is a PSTN number.
*/
static bool isPSTNUserName(const QString& userName) {
for (int pos=0; pos < userName.size(); ++pos) {
if (!userName[0].isDigit()) {
return false;
}
}
return userName.size() >= PSTN_NUMBER_MIN_LENGTH;
}
void QtPhoneCall::addContact() {
CWengoPhone & cWengoPhone = _cPhoneCall.getCWengoPhone();
CUserProfile* cUserProfile =
cWengoPhone.getCUserProfileHandler().getCUserProfile();
if (!cUserProfile) {
LOG_WARN("No user profile defined. This should not happen");
return;
}
ContactProfile contactProfile;
QtProfileDetails qtProfileDetails(*cUserProfile, contactProfile,
_phoneCallWidget->window(), tr("Add a Contact"));
// Fill some QtProfileDetails fields
PhoneCall& call = _cPhoneCall.getPhoneCall();
SipAddress sipAddress = call.getPeerSipAddress();
QString rawSipAddress =
QString::fromStdString(sipAddress.getRawSipAddress());
Config & config = ConfigManager::getInstance().getCurrentConfig();
QString wengoRealm = QString::fromStdString( config.getWengoRealm() );
if (rawSipAddress.contains(wengoRealm)) {
// Wengo server
QString userName;
userName =
QString::fromUtf8(sipAddress.getDisplayName().c_str());
if (userName.isEmpty()) {
userName =
QString::fromUtf8(sipAddress.getUserName().c_str());
}
if (isPSTNUserName(userName)) {
// User name is the phone number
qtProfileDetails.setHomePhone(userName);
} else {
// User name is the name of the Wengo account
qtProfileDetails.setWengoName(userName);
}
} else {
// External SIP server
QString address =
QString::fromStdString(sipAddress.getSipAddress());
if (address.startsWith("sip:")) {
address = address.mid(4);
}
qtProfileDetails.setSipAddress(address);
}
////
if (qtProfileDetails.show()) {
// WARNING: if the user hang up while the dialog is shown,
'this' won't
// be valid anymore. Therefore we must not use any field of
'this'
// here.
cUserProfile->getCContactList().addContact(contactProfile);
}
}
bool QtPhoneCall::isCallEncrypted() {
return _cPhoneCall.isCallEncrypted();
}
/**
* Hide the other audio smileys window if it's open and uncheck its button
*/
static void hideOtherPopupWindow(QPushButton* button, QtAudioSmileysWindow*
window) {
button->blockSignals(true);
button->setChecked(false);
button->blockSignals(false);
if (window) {
window->hide();
}
}
/**
* Show an audio smileys window
*/
static void togglePopupWindow(QtAudioSmileysWindow* window, bool on) {
if (on) {
window->show();
} else {
if (window) {
window->hide();
}
}
}
void QtPhoneCall::toggleDialpad(bool on) {
if (_ui->smileysButton->isChecked()) {
hideOtherPopupWindow(_ui->smileysButton, _smileysWindow.get());
}
if (on) {
if (!_dialpadWindow.get()) {
CDtmfThemeManager& manager =
_qtWengoPhone->getCWengoPhone().getCDtmfThemeManager();
_dialpadWindow.reset( new QtAudioSmileysWindow(manager,
_qtWengoPhone) );
_dialpadWindow->dialpad()->setThemeMode(QtDialpad::ThemeModeDefaultOnly);
_dialpadWindow->setButton(_ui->dialpadButton);
}
}
togglePopupWindow(_dialpadWindow.get(), on);
}
void QtPhoneCall::toggleSmileys(bool on) {
if (_ui->dialpadButton->isChecked()) {
hideOtherPopupWindow(_ui->dialpadButton, _dialpadWindow.get());
}
if (on) {
if (!_smileysWindow.get()) {
CDtmfThemeManager& manager =
_qtWengoPhone->getCWengoPhone().getCDtmfThemeManager();
_smileysWindow.reset( new QtAudioSmileysWindow(manager,
_qtWengoPhone) );
_smileysWindow->dialpad()->setThemeMode(QtDialpad::ThemeModeAudioSmileysOnly);
_smileysWindow->setButton(_ui->smileysButton);
}
}
togglePopupWindow(_smileysWindow.get(), on);
}_______________________________________________
QuteCom-dev mailing list
[email protected]
http://lists.qutecom.org/mailman/listinfo/qutecom-dev