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

Reply via email to