Subversion Repositories tpanel

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
446 andreas 1
/*
2
 * Copyright (C) 2022 by Andreas Theofilu <andreas@theosys.at>
3
 *
4
 * This program is free software; you can redistribute it and/or modify
5
 * it under the terms of the GNU General Public License as published by
6
 * the Free Software Foundation; either version 3 of the License, or
7
 * (at your option) any later version.
8
 *
9
 * This program is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 * GNU General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU General Public License
15
 * along with this program; if not, write to the Free Software Foundation,
16
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
17
 */
18
 
19
#include <QPushButton>
20
#include <QToolButton>
21
#include <QLabel>
22
 
23
#include "tqtphone.h"
24
#include "tpagemanager.h"
25
#include "terror.h"
26
#include "ui_tqtphone.h"
27
 
28
using std::vector;
29
using std::string;
30
using std::map;
31
using std::pair;
32
 
33
extern TPageManager *gPageManager;              //!< The pointer to the global defined main class.
34
 
35
TQtPhone::TQtPhone(QWidget* parent)
36
    : QDialog(parent),
37
      ui(new Ui::TQtPhone)
38
{
39
    DECL_TRACER("TQtPhone::TQtPhone(QWidget* parent)");
40
 
41
    ui->setupUi(this);
42
 
43
    ui->label_Number->setText(mNumber);
44
    ui->label_Status->setText("");
45
    ui->toolButton_Call->setText("");
46
    ui->toolButton_Call->setIcon(QIcon(":images/pickup.png"));
47
#ifdef Q_OS_IOS
48
    setAttribute(Qt::WA_ContentsMarginsRespectsSafeArea, true);
49
#endif
50
}
51
 
52
TQtPhone::~TQtPhone()
53
{
54
    DECL_TRACER("TQtPhone::~TQtPhone()");
55
 
56
    delete ui;
57
}
58
 
59
void TQtPhone::on_pushButton_0_clicked()
60
{
61
    DECL_TRACER("TQtPhone::on_pushButton_0_clicked()");
62
 
63
    mNumber += "0";
64
    ui->label_Number->setText(mNumber);
65
}
66
 
67
void TQtPhone::on_pushButton_1_clicked()
68
{
69
    DECL_TRACER("TQtPhone::on_pushButton_1_clicked()");
70
 
71
    mNumber += "1";
72
    ui->label_Number->setText(mNumber);
73
}
74
 
75
void TQtPhone::on_pushButton_2_clicked()
76
{
77
    DECL_TRACER("TQtPhone::on_pushButton_2_clicked()");
78
 
79
    mNumber += "2";
80
    ui->label_Number->setText(mNumber);
81
}
82
 
83
void TQtPhone::on_pushButton_3_clicked()
84
{
85
    DECL_TRACER("TQtPhone::on_pushButton_3_clicked()");
86
 
87
    mNumber += "3";
88
    ui->label_Number->setText(mNumber);
89
}
90
 
91
void TQtPhone::on_pushButton_4_clicked()
92
{
93
    DECL_TRACER("TQtPhone::on_pushButton_4_clicked()");
94
 
95
    mNumber += "4";
96
    ui->label_Number->setText(mNumber);
97
}
98
 
99
void TQtPhone::on_pushButton_5_clicked()
100
{
101
    DECL_TRACER("TQtPhone::on_pushButton_5_clicked()");
102
 
103
    mNumber += "5";
104
    ui->label_Number->setText(mNumber);
105
}
106
 
107
void TQtPhone::on_pushButton_6_clicked()
108
{
109
    DECL_TRACER("TQtPhone::on_pushButton_6_clicked()");
110
 
111
    mNumber += "6";
112
    ui->label_Number->setText(mNumber);
113
}
114
 
115
void TQtPhone::on_pushButton_7_clicked()
116
{
117
    DECL_TRACER("TQtPhone::on_pushButton_7_clicked()");
118
 
119
    mNumber += "7";
120
    ui->label_Number->setText(mNumber);
121
}
122
 
123
void TQtPhone::on_pushButton_8_clicked()
124
{
125
    DECL_TRACER("TQtPhone::on_pushButton_8_clicked()");
126
 
127
    mNumber += "8";
128
    ui->label_Number->setText(mNumber);
129
}
130
 
131
void TQtPhone::on_pushButton_9_clicked()
132
{
133
    DECL_TRACER("TQtPhone::on_pushButton_9_clicked()");
134
 
135
    mNumber += "9";
136
    ui->label_Number->setText(mNumber);
137
}
138
 
139
void TQtPhone::on_pushButton_Hash_clicked()
140
{
141
    DECL_TRACER("TQtPhone::on_pushButton_Hash_clicked()");
142
 
143
    mNumber += "#";
144
    ui->label_Number->setText(mNumber);
145
}
146
 
147
void TQtPhone::on_pushButton_Star_clicked()
148
{
149
    DECL_TRACER("TQtPhone::on_pushButton_Star_clicked()");
150
 
151
    mNumber += "*";
152
    ui->label_Number->setText(mNumber);
153
}
154
 
155
void TQtPhone::on_pushButton_Clear_clicked()
156
{
157
    DECL_TRACER("TQtPhone::on_pushButton_Clear_clicked()");
158
 
159
    mNumber.clear();
160
    ui->label_Number->setText(mNumber);
161
}
162
 
163
void TQtPhone::on_toolButton_Call_clicked()
164
{
165
    DECL_TRACER("TQtPhone::on_pushButton_Call_clicked()");
166
 
167
    if (!gPageManager)
168
        return;
169
 
170
    string ss = stateToString(mLastState);
171
    MSG_DEBUG("Current state: " << ss);
172
 
173
    if (mLastState == SIP_RINGING)
174
    {
175
        map<unsigned int, SIP_STATE_t>::iterator iter;
176
        int id = -1;
177
 
178
        for (iter = mSIPstate.begin(); iter != mSIPstate.end(); ++iter)
179
        {
180
            if (iter->second == SIP_RINGING)
181
            {
182
                id = iter->first;
183
                break;
184
            }
185
        }
186
#ifndef _NOSIP_
187
        MSG_DEBUG("Picking up line " << id);
188
        gPageManager->phonePickup(id);
189
#endif
190
        return;
191
    }
192
    else if (mLastState == SIP_CONNECTED || mLastState == SIP_TRYING)
193
    {
194
        map<unsigned int, SIP_STATE_t>::iterator iter;
195
        int id = -1;
196
 
197
        for (iter = mSIPstate.begin(); iter != mSIPstate.end(); ++iter)
198
        {
199
            if (iter->second == SIP_CONNECTED || iter->second == SIP_TRYING)
200
            {
201
                id = iter->first;
202
                break;
203
            }
204
        }
205
#ifndef _NOSIP_
206
        MSG_DEBUG("Hanging up line " << id);
207
        gPageManager->phoneHangup(id);
208
#endif
209
        return;
210
    }
211
    else if (mNumber.isEmpty())
212
    {
213
        MSG_DEBUG("No phone number to dial.");
214
        return;
215
    }
216
#ifndef _NOSIP_
217
    vector<string>cmds;
218
    cmds.push_back("CALL");
219
    cmds.push_back(mNumber.toStdString());
220
    gPageManager->actPHN(cmds);
221
    ui->toolButton_Call->setIcon(QIcon(":images/hangup.png"));
222
#endif
223
}
224
 
225
void TQtPhone::on_pushButton_Exit_clicked()
226
{
227
    DECL_TRACER("TQtPhone::on_pushButton_Exit_clicked()");
228
    #ifndef _NOSIP_
229
    if (mSIPstate.size() > 0)
230
    {
231
        map<unsigned int, SIP_STATE_t>::iterator iter;
232
 
233
        for (iter = mSIPstate.begin(); iter != mSIPstate.end(); ++iter)
234
        {
235
            if (iter->second == SIP_CONNECTED)
236
            {
237
                if (gPageManager)
238
                {
239
                    vector<string>cmds;
240
                    cmds.push_back("HANGUP");
241
                    cmds.push_back(std::to_string(iter->first));
242
                    gPageManager->sendPHN(cmds);
243
                }
244
            }
245
        }
246
    }
247
    #endif
248
    close();
249
}
250
 
251
void TQtPhone::doResize()
252
{
253
    DECL_TRACER("TQtPhone::doResize()");
254
 
255
    // The main dialog window
256
    QSize size = this->size();
257
    QRect rect = this->geometry();
258
    size.scale(scale(size.width()), scale(size.height()), Qt::KeepAspectRatio);
259
    this->resize(size);
260
    this->move(scale(rect.left()), scale(rect.top()));
261
    QWidget *parent = this->parentWidget();
262
 
263
    if (parent)
264
    {
265
        rect = parent->geometry();
266
        this->move(rect.center() - this->rect().center());
267
    }
268
 
269
    // Layout
270
    // Iterate through childs and resize them
271
    QObjectList childs = children();
272
    QList<QObject *>::Iterator iter;
273
 
274
    for (iter = childs.begin(); iter != childs.end(); ++iter)
275
    {
276
        QObject *obj = *iter;
277
        QString name = obj->objectName();
278
 
279
        if (name.startsWith("toolButton"))
280
            scaleObject(dynamic_cast<QToolButton *>(obj));
281
        else if (name.startsWith("pushButton"))
282
            scaleObject(dynamic_cast<QPushButton *>(obj));
283
        else if (name.startsWith("label"))
284
            scaleObject(dynamic_cast<QLabel *>(obj));
285
        else if (name.startsWith("line"))
286
            scaleObject(dynamic_cast<QFrame *>(obj));
287
    }
288
}
289
 
290
void TQtPhone::setPhoneNumber(const std::string& number)
291
{
292
    DECL_TRACER("TQtPhone::setPhoneNumber(const std::string& number)");
293
 
294
    ui->label_Number->setText(number.c_str());
295
}
296
 
297
void TQtPhone::setPhoneStatus(const std::string& msg)
298
{
299
    DECL_TRACER("TQtPhone::setPhoneStatus(const std::string& msg)");
300
 
301
    ui->label_Status->setText(msg.c_str());
302
}
303
 
304
void TQtPhone::setPhoneState(int state, int id)
305
{
306
    DECL_TRACER("TQtPhone::setPhoneState(int state)");
307
 
308
    if (id < 0 || id > 4)
309
    {
310
        MSG_ERROR("Invalid call ID " << id << "!");
311
        return;
312
    }
313
 
314
    string ss;
315
 
316
    if (state >= 0 && state <= SIP_ERROR)
317
    {
318
        mSIPstate.insert_or_assign(id, (SIP_STATE_t)state);
319
        mLastState = (SIP_STATE_t)state;
320
        ss = stateToString((SIP_STATE_t)state);
321
    }
322
    else
323
    {
324
        MSG_WARNING("Unknown state " << state << " for call id " << id << "!");
325
        ss = "??";
326
    }
327
 
328
    MSG_DEBUG("Setting line " << id << " to state " << ss);
329
 
330
    switch(state)
331
    {
332
        case SIP_TRYING:
333
            ui->label_Status->setText(QString("Line: %1 - TRYING").arg(id));
334
            ui->toolButton_Call->setIcon(QIcon(":images/hangup.png"));
335
        break;
336
 
337
        case SIP_CONNECTED:
338
            ui->label_Status->setText(QString("Line: %1 - CONNECTED").arg(id));
339
            ui->toolButton_Call->setIcon(QIcon(":images/hangup.png"));
340
        break;
341
 
342
        case SIP_DISCONNECTED:
343
            ui->label_Status->setText(QString("Line: %1 - DISCONNECTED").arg(id));
344
            ui->toolButton_Call->setIcon(QIcon(":images/pickup.png"));
345
            mNumber.clear();
346
            ui->label_Number->setText(mNumber);
347
        break;
348
 
349
        case SIP_REJECTED:
350
            ui->label_Status->setText(QString("Line: %1 - REJECTED").arg(id));
351
            ui->toolButton_Call->setIcon(QIcon(":images/pickup.png"));
352
        break;
353
 
354
        case SIP_RINGING:
355
            ui->label_Status->setText(QString("Line: %1 - RINGING").arg(id));
356
            ui->toolButton_Call->setIcon(QIcon(":images/pickup.png"));
357
            mNumber.clear();
358
            ui->label_Number->setText(mNumber);
359
        break;
360
 
361
        case SIP_ERROR:
362
            ui->label_Status->setText(QString("Line: %1 - ERROR").arg(id));
363
            ui->toolButton_Call->setIcon(QIcon(":images/pickup.png"));
364
            mNumber.clear();
365
            ui->label_Number->setText(mNumber);
366
        break;
367
 
368
        default:
369
            ui->toolButton_Call->setIcon(QIcon(":images/pickup.png"));
370
            ui->label_Status->setText("");
371
            mNumber.clear();
372
            ui->label_Number->setText(mNumber);
373
    }
374
}
375
 
376
template<typename T>
377
void TQtPhone::scaleObject(T *obj)
378
{
379
    DECL_TRACER("TQtPhone::scaleObject(T *obj): " + obj->objectName().toStdString());
380
 
381
    QSize size = obj->size();
382
    size.scale(scale(size.width()), scale(size.height()), Qt::KeepAspectRatio);
383
    obj->resize(size);
384
    QRect rect = obj->geometry();
385
    obj->move(scale(rect.left()), scale(rect.top()));
386
}
387
 
388
int TQtPhone::scale(int value)
389
{
390
    if (value <= 0 || mScaleFactor == 1.0)
391
        return value;
392
 
393
    return (int)((double)value * mScaleFactor);
394
}
395
 
396
string TQtPhone::stateToString(SIP_STATE_t state)
397
{
398
    DECL_TRACER("TQtPhone::stateToString(SIP_STATE_t state)");
399
 
400
    switch(state)
401
    {
402
        case SIP_CONNECTED:     return "CONNECTED";
403
        case SIP_DISCONNECTED:  return "DISCONNECTED";
404
        case SIP_ERROR:         return "ERROR";
405
        case SIP_HOLD:          return "HOLD";
406
        case SIP_IDLE:          return "IDLE";
407
        case SIP_NONE:          return "NONE";
408
        case SIP_REJECTED:      return "REJECTED";
409
        case SIP_RINGING:       return "RINGING";
410
        case SIP_TRYING:        return "TRYING";
411
    }
412
 
413
    return string();
414
}