1
// Default empty project template
2
#include "applicationui.h"
4
#include <bb/cascades/Application>
5
#include <bb/cascades/QmlDocument>
6
#include <bb/cascades/AbstractPane>
7
#include <bb/cascades/Label>
9
#define THIS_FILE "applicationui.cpp"
11
using namespace bb::cascades;
14
ApplicationUI *ApplicationUI::instance_;
16
#include "../../pjsua_app_config.h"
18
void ApplicationUI::extDisplayMsg(const char *msg)
20
/* Qt's way to invoke method from "foreign" thread */
21
QMetaObject::invokeMethod((QObject*)ApplicationUI::instance(),
22
"displayMsg", Qt::AutoConnection,
27
void ApplicationUI::pjsuaOnStartedCb(pj_status_t status, const char* msg)
29
char errmsg[PJ_ERR_MSG_SIZE];
31
if (status != PJ_SUCCESS && (!msg || !*msg)) {
32
pj_strerror(status, errmsg, sizeof(errmsg));
33
PJ_LOG(3,(THIS_FILE, "Error: %s", errmsg));
36
PJ_LOG(3,(THIS_FILE, "Started: %s", msg));
39
ApplicationUI::extDisplayMsg(msg);
43
void ApplicationUI::pjsuaOnStoppedCb(pj_bool_t restart,
44
int argc, char** argv)
46
PJ_LOG(3,("ipjsua", "CLI %s request", (restart? "restart" : "shutdown")));
48
ApplicationUI::extDisplayMsg("Restarting..");
50
ApplicationUI::instance()->extRestartRequest(argc, argv);
52
ApplicationUI::extDisplayMsg("Shutting down..");
54
ApplicationUI::instance()->isShuttingDown = true;
56
bb::cascades::Application *app = bb::cascades::Application::instance();
62
void ApplicationUI::pjsuaOnAppConfigCb(pjsua_app_config *cfg)
68
void ApplicationUI::extRestartRequest(int argc, char **argv)
72
QMetaObject::invokeMethod((QObject*)this, "restartPjsua",
73
Qt::QueuedConnection);
77
void ApplicationUI::pjsuaStart()
79
// TODO: read from config?
80
const char **argv = pjsua_app_def_argv;
81
int argc = PJ_ARRAY_SIZE(pjsua_app_def_argv) -1;
82
pjsua_app_cfg_t app_cfg;
85
isShuttingDown = false;
86
displayMsg("Starting..");
88
pj_bzero(&app_cfg, sizeof(app_cfg));
90
app_cfg.argc = restartArgc;
91
app_cfg.argv = restartArgv;
94
app_cfg.argv = (char**)argv;
96
app_cfg.on_started = &pjsuaOnStartedCb;
97
app_cfg.on_stopped = &pjsuaOnStoppedCb;
98
app_cfg.on_config_init = &pjsuaOnAppConfigCb;
100
status = pjsua_app_init(&app_cfg);
101
if (status != PJ_SUCCESS) {
102
char errmsg[PJ_ERR_MSG_SIZE];
103
pj_strerror(status, errmsg, sizeof(errmsg));
104
displayMsg(QString("Init error:") + errmsg);
109
status = pjsua_app_run(PJ_FALSE);
110
if (status != PJ_SUCCESS) {
111
char errmsg[PJ_ERR_MSG_SIZE];
112
pj_strerror(status, errmsg, sizeof(errmsg));
113
displayMsg(QString("Error:") + errmsg);
121
void ApplicationUI::pjsuaDestroy()
127
ApplicationUI::ApplicationUI(bb::cascades::Application *app)
128
: QObject(app), isShuttingDown(false), restartArgv(NULL), restartArgc(0)
132
QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this);
133
AbstractPane *root = qml->createRootObject<AbstractPane>();
136
app->setAutoExit(true);
137
connect(app, SIGNAL(aboutToQuit()), this, SLOT(aboutToQuit()));
143
ApplicationUI::~ApplicationUI()
149
ApplicationUI* ApplicationUI::instance()
155
void ApplicationUI::aboutToQuit()
157
if (!isShuttingDown) {
158
isShuttingDown = true;
159
PJ_LOG(3,(THIS_FILE, "Quit signal from GUI, shutting down pjsua.."));
165
void ApplicationUI::displayMsg(const QString &msg)
167
bb::cascades::Application *app = bb::cascades::Application::instance();
168
Label *telnetMsg = app->scene()->findChild<Label*>("telnetMsg");
170
telnetMsg->setText(msg);
175
void ApplicationUI::restartPjsua()