From 7e629aee4795127c323551e153349bf904166717 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Mon, 15 Apr 2013 10:47:28 +0000 Subject: Re #1657, #1655: initial implementation of pjsua CLI app for BlackBerry BB10 git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4471 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip-apps/src/pjsua/bb10/Makefile | 6 + pjsip-apps/src/pjsua/bb10/PjsuaBB.pro | 30 +++++ pjsip-apps/src/pjsua/bb10/assets/.assets.index | 4 + .../src/pjsua/bb10/assets/images/teluu-logo.png | Bin 0 -> 78108 bytes pjsip-apps/src/pjsua/bb10/assets/main.qml | 41 ++++++ pjsip-apps/src/pjsua/bb10/bar-descriptor.xml | 103 +++++++++++++++ pjsip-apps/src/pjsua/bb10/config.pri | 52 ++++++++ pjsip-apps/src/pjsua/bb10/icon.png | Bin 0 -> 6078 bytes pjsip-apps/src/pjsua/bb10/precompiled.h | 2 + pjsip-apps/src/pjsua/bb10/src/applicationui.cpp | 147 +++++++++++++++++++++ pjsip-apps/src/pjsua/bb10/src/applicationui.h | 37 ++++++ pjsip-apps/src/pjsua/bb10/src/main.cpp | 32 +++++ pjsip-apps/src/pjsua/bb10/translations/Makefile | 12 ++ pjsip-apps/src/pjsua/bb10/translations/PjsuaBB.pro | 1 + pjsip-apps/src/pjsua/bb10/translations/PjsuaBB.ts | 22 +++ 15 files changed, 489 insertions(+) create mode 100644 pjsip-apps/src/pjsua/bb10/Makefile create mode 100644 pjsip-apps/src/pjsua/bb10/PjsuaBB.pro create mode 100644 pjsip-apps/src/pjsua/bb10/assets/.assets.index create mode 100644 pjsip-apps/src/pjsua/bb10/assets/images/teluu-logo.png create mode 100644 pjsip-apps/src/pjsua/bb10/assets/main.qml create mode 100644 pjsip-apps/src/pjsua/bb10/bar-descriptor.xml create mode 100644 pjsip-apps/src/pjsua/bb10/config.pri create mode 100644 pjsip-apps/src/pjsua/bb10/icon.png create mode 100644 pjsip-apps/src/pjsua/bb10/precompiled.h create mode 100644 pjsip-apps/src/pjsua/bb10/src/applicationui.cpp create mode 100644 pjsip-apps/src/pjsua/bb10/src/applicationui.h create mode 100644 pjsip-apps/src/pjsua/bb10/src/main.cpp create mode 100644 pjsip-apps/src/pjsua/bb10/translations/Makefile create mode 100644 pjsip-apps/src/pjsua/bb10/translations/PjsuaBB.pro create mode 100644 pjsip-apps/src/pjsua/bb10/translations/PjsuaBB.ts (limited to 'pjsip-apps/src/pjsua') diff --git a/pjsip-apps/src/pjsua/bb10/Makefile b/pjsip-apps/src/pjsua/bb10/Makefile new file mode 100644 index 00000000..9b922385 --- /dev/null +++ b/pjsip-apps/src/pjsua/bb10/Makefile @@ -0,0 +1,6 @@ +QMAKE_TARGET = PjsuaBB +PROJECT_DIR := $(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))) +I18N_DIR := $(PROJECT_DIR)/translations + +include mk/cs-base.mk + diff --git a/pjsip-apps/src/pjsua/bb10/PjsuaBB.pro b/pjsip-apps/src/pjsua/bb10/PjsuaBB.pro new file mode 100644 index 00000000..78928ad9 --- /dev/null +++ b/pjsip-apps/src/pjsua/bb10/PjsuaBB.pro @@ -0,0 +1,30 @@ +APP_NAME = PjsuaBB + +CONFIG += qt warn_on cascades10 + +include(config.pri) + +SOURCES += ../../pjsua_app.c \ + ../../pjsua_cli_cmd.c \ + ../../pjsua_cli.c \ + ../../pjsua_common.c \ + ../../pjsua_config.c \ + ../../pjsua_legacy.c + +device { + CONFIG(debug, debug|release) { + # Device-Debug custom configuration + include(../../../../pjsip.pri) + LIBS += -lbb + } + + CONFIG(release, debug|release) { + # Device-Release custom configuration + } +} + +simulator { + CONFIG(debug, debug|release) { + # Simulator-Debug custom configuration + } +} diff --git a/pjsip-apps/src/pjsua/bb10/assets/.assets.index b/pjsip-apps/src/pjsua/bb10/assets/.assets.index new file mode 100644 index 00000000..d084d03d --- /dev/null +++ b/pjsip-apps/src/pjsua/bb10/assets/.assets.index @@ -0,0 +1,4 @@ +1 +2 +main.qml +images/teluu-logo.png diff --git a/pjsip-apps/src/pjsua/bb10/assets/images/teluu-logo.png b/pjsip-apps/src/pjsua/bb10/assets/images/teluu-logo.png new file mode 100644 index 00000000..97fadb5b Binary files /dev/null and b/pjsip-apps/src/pjsua/bb10/assets/images/teluu-logo.png differ diff --git a/pjsip-apps/src/pjsua/bb10/assets/main.qml b/pjsip-apps/src/pjsua/bb10/assets/main.qml new file mode 100644 index 00000000..dc3f7f34 --- /dev/null +++ b/pjsip-apps/src/pjsua/bb10/assets/main.qml @@ -0,0 +1,41 @@ +// Default empty project template +import bb.cascades 1.0 + +// creates one page with a label +Page { + Container { + layout: StackLayout { + } + background: Color.Black + Label { + text: qsTr("") + horizontalAlignment: HorizontalAlignment.Center + } + ImageView { + imageSource: "asset:///images/teluu-logo.png" + topMargin: 200 + preferredWidth: 500 + preferredHeight: 500 + verticalAlignment: VerticalAlignment.Center + horizontalAlignment: HorizontalAlignment.Center + } + Label { + text: qsTr("pjsua BB10") + textStyle.base: SystemDefaults.TextStyles.BigText + horizontalAlignment: HorizontalAlignment.Center + textStyle { + color: Color.White + } + } + Label { + objectName: "telnetMsg" + text: qsTr("Starting..") + topMargin: 200 + horizontalAlignment: HorizontalAlignment.Center + textStyle { + color: Color.White + } + } + } +} + diff --git a/pjsip-apps/src/pjsua/bb10/bar-descriptor.xml b/pjsip-apps/src/pjsua/bb10/bar-descriptor.xml new file mode 100644 index 00000000..90e71e3d --- /dev/null +++ b/pjsip-apps/src/pjsua/bb10/bar-descriptor.xml @@ -0,0 +1,103 @@ + + + + + + + + com.example.PjsuaBB + + + PjsuaBB + + + 1.0.0 + + + 1 + + + + + + Teluu Ltd. pjsua Demo App + + + + + + Teluu Ltd. + + + + + + true + none + false + + + + core.media + + armle-v7 + PjsuaBB + + + Qnx/Cascades + armle-v7 + PjsuaBB.so + + + armle-v7 + PjsuaBB + + + x86 + PjsuaBB + + + + + icon.png + + + icon.png + assets + + + + + run_native + access_internet + record_audio + run_when_backgrounded + + + diff --git a/pjsip-apps/src/pjsua/bb10/config.pri b/pjsip-apps/src/pjsua/bb10/config.pri new file mode 100644 index 00000000..2f80a4fa --- /dev/null +++ b/pjsip-apps/src/pjsua/bb10/config.pri @@ -0,0 +1,52 @@ +# Auto-generated by IDE. Any changes made by user will be lost! +BASEDIR = $$quote($$_PRO_FILE_PWD_) + +device { + CONFIG(debug, debug|release) { + SOURCES += $$quote($$BASEDIR/src/applicationui.cpp) \ + $$quote($$BASEDIR/src/main.cpp) + + HEADERS += $$quote($$BASEDIR/src/applicationui.h) + } + + CONFIG(release, debug|release) { + SOURCES += $$quote($$BASEDIR/src/applicationui.cpp) \ + $$quote($$BASEDIR/src/main.cpp) + + HEADERS += $$quote($$BASEDIR/src/applicationui.h) + } +} + +simulator { + CONFIG(debug, debug|release) { + SOURCES += $$quote($$BASEDIR/src/applicationui.cpp) \ + $$quote($$BASEDIR/src/main.cpp) + + HEADERS += $$quote($$BASEDIR/src/applicationui.h) + } +} + +INCLUDEPATH += $$quote($$BASEDIR/src) + +CONFIG += precompile_header + +PRECOMPILED_HEADER = $$quote($$BASEDIR/precompiled.h) + +lupdate_inclusion { + SOURCES += $$quote($$BASEDIR/../src/*.c) \ + $$quote($$BASEDIR/../src/*.c++) \ + $$quote($$BASEDIR/../src/*.cc) \ + $$quote($$BASEDIR/../src/*.cpp) \ + $$quote($$BASEDIR/../src/*.cxx) \ + $$quote($$BASEDIR/../assets/*.qml) \ + $$quote($$BASEDIR/../assets/*.js) \ + $$quote($$BASEDIR/../assets/*.qs) + + HEADERS += $$quote($$BASEDIR/../src/*.h) \ + $$quote($$BASEDIR/../src/*.h++) \ + $$quote($$BASEDIR/../src/*.hh) \ + $$quote($$BASEDIR/../src/*.hpp) \ + $$quote($$BASEDIR/../src/*.hxx) +} + +TRANSLATIONS = $$quote($${TARGET}.ts) diff --git a/pjsip-apps/src/pjsua/bb10/icon.png b/pjsip-apps/src/pjsua/bb10/icon.png new file mode 100644 index 00000000..dab6e7a9 Binary files /dev/null and b/pjsip-apps/src/pjsua/bb10/icon.png differ diff --git a/pjsip-apps/src/pjsua/bb10/precompiled.h b/pjsip-apps/src/pjsua/bb10/precompiled.h new file mode 100644 index 00000000..6213dc4b --- /dev/null +++ b/pjsip-apps/src/pjsua/bb10/precompiled.h @@ -0,0 +1,2 @@ +// This file is used to store precompiled headers. +// It is intentionally left blank. It is up to you to decide which headers should be included here. diff --git a/pjsip-apps/src/pjsua/bb10/src/applicationui.cpp b/pjsip-apps/src/pjsua/bb10/src/applicationui.cpp new file mode 100644 index 00000000..cc5aff0f --- /dev/null +++ b/pjsip-apps/src/pjsua/bb10/src/applicationui.cpp @@ -0,0 +1,147 @@ +// Default empty project template +#include "applicationui.h" + +#include +#include +#include +#include + +#define THIS_FILE "applicationui.cpp" + +using namespace bb::cascades; + +#include "../../pjsua_common.h" + +extern pj_cli_telnet_on_started on_started_cb; +extern pj_cli_on_quit on_quit_cb; + +extern "C" int main_func(int argc, char *argv[]); + +ApplicationUI *ApplicationUI::instance_; + +class CliThread : public QThread +{ + Q_OBJECT +public: + virtual ~CliThread() {} +protected: + void run(); +}; + +static void bb10_show_msg(const char *msg) +{ + /* Qt's way to invoke method from "foreign" thread */ + QMetaObject::invokeMethod((QObject*)ApplicationUI::instance(), "displayMsg", + Qt::QueuedConnection, + Q_ARG(QString,msg)); +} + +static void bb10_telnet_started(pj_cli_telnet_info *telnet_info) +{ + char msg[64]; + + pj_ansi_snprintf(msg, sizeof(msg), + "Telnet to %.*s:%d", + (int)telnet_info->ip_address.slen, + telnet_info->ip_address.ptr, + telnet_info->port); + + PJ_LOG(3,(THIS_FILE, "Started: %s", msg)); + + bb10_show_msg(msg); +} + +static void bb10_on_quit (pj_bool_t is_restarted) +{ + PJ_LOG(3,("ipjsua", "CLI quit, restart(%d)", is_restarted)); + if (!is_restarted) { + bb10_show_msg("Shutting down.."); + ApplicationUI::instance()->isShuttingDown = true; + bb::cascades::Application *app = bb::cascades::Application::instance(); + app->quit(); + } +} + +void CliThread::run() +{ + // TODO: read from config? + char *argv[] = { (char*)"pjsuabb", + (char*)"--use-cli", + (char*)"--no-cli-console", + (char*)"--cli-telnet-port=2323", + (char*)"--dis-codec=*", + (char*)"--add-codec=g722", + NULL }; + int argc = PJ_ARRAY_SIZE(argv) -1; + pj_thread_desc thread_desc; + pj_thread_t *thread; + + pj_thread_register("CliThread", thread_desc, &thread); + // Wait UI to be created + pj_thread_sleep(100); + + on_started_cb = &bb10_telnet_started; + on_quit_cb = &bb10_on_quit; + main_func(argc, argv); +} + +ApplicationUI::ApplicationUI(bb::cascades::Application *app) +: QObject(app), isShuttingDown(false) +{ + instance_ = this; + + // create scene document from main.qml asset + // set parent to created document to ensure it exists for the whole application lifetime + QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this); + + // create root object for the UI + AbstractPane *root = qml->createRootObject(); + // set created root object as a scene + app->setScene(root); + + app->setAutoExit(true); + connect(app, SIGNAL(aboutToQuit()), this, SLOT(aboutToQuit())); + + pj_init(); + + // Run CLI + cliThread = new CliThread; + cliThread->start(); +} + +ApplicationUI::~ApplicationUI() +{ + pj_shutdown(); + instance_ = NULL; +} + +ApplicationUI* ApplicationUI::instance() +{ + return instance_; +} + +void ApplicationUI::aboutToQuit() +{ + static pj_thread_desc thread_desc; + pj_thread_t *thread; + + if (!pj_thread_is_registered()) + pj_thread_register("UIThread", thread_desc, &thread); + + if (!isShuttingDown) { + isShuttingDown = true; + PJ_LOG(3,(THIS_FILE, "Quit signal from GUI, shutting down pjsua..")); + pjsua_destroy(); + } +} + +void ApplicationUI::displayMsg(const QString &msg) +{ + bb::cascades::Application *app = bb::cascades::Application::instance(); + Label *telnetMsg = app->scene()->findChild("telnetMsg"); + if (telnetMsg) { + telnetMsg->setText(msg); + } +} + +#include "applicationui.moc" diff --git a/pjsip-apps/src/pjsua/bb10/src/applicationui.h b/pjsip-apps/src/pjsua/bb10/src/applicationui.h new file mode 100644 index 00000000..785e017f --- /dev/null +++ b/pjsip-apps/src/pjsua/bb10/src/applicationui.h @@ -0,0 +1,37 @@ +// Default empty project template +#ifndef ApplicationUI_HPP_ +#define ApplicationUI_HPP_ + +#include + +namespace bb { namespace cascades { class Application; }} + +class CliThread; + +/*! + * @brief Application pane object + * + *Use this object to create and init app UI, to create context objects, to register the new meta types etc. + */ +class ApplicationUI : public QObject +{ + Q_OBJECT +public: + ApplicationUI(bb::cascades::Application *app); + virtual ~ApplicationUI(); + + bool isShuttingDown; + static ApplicationUI *instance(); + +public slots: + void aboutToQuit(); + + Q_INVOKABLE void displayMsg(const QString &msg); + +private: + CliThread *cliThread; + static ApplicationUI *instance_; +}; + + +#endif /* ApplicationUI_HPP_ */ diff --git a/pjsip-apps/src/pjsua/bb10/src/main.cpp b/pjsip-apps/src/pjsua/bb10/src/main.cpp new file mode 100644 index 00000000..cd2a4b66 --- /dev/null +++ b/pjsip-apps/src/pjsua/bb10/src/main.cpp @@ -0,0 +1,32 @@ +// Default empty project template +#include + +#include +#include +#include "applicationui.h" + +// include JS Debugger / CS Profiler enabler +// this feature is enabled by default in the debug build only +#include + +using namespace bb::cascades; + +Q_DECL_EXPORT int main(int argc, char **argv) +{ + // this is where the server is started etc + Application app(argc, argv); + + // localization support + QTranslator translator; + QString locale_string = QLocale().name(); + QString filename = QString( "PjsuaBB_%1" ).arg( locale_string ); + if (translator.load(filename, "app/native/qm")) { + app.installTranslator( &translator ); + } + + new ApplicationUI(&app); + + // we complete the transaction started in the app constructor and start the client event loop here + return Application::exec(); + // when loop is exited the Application deletes the scene which deletes all its children (per qt rules for children) +} diff --git a/pjsip-apps/src/pjsua/bb10/translations/Makefile b/pjsip-apps/src/pjsua/bb10/translations/Makefile new file mode 100644 index 00000000..28fd97cb --- /dev/null +++ b/pjsip-apps/src/pjsua/bb10/translations/Makefile @@ -0,0 +1,12 @@ +QMAKE_TARGET = PjsuaBB +LUPDATE = $(QNX_HOST)/usr/bin/lupdate +LRELEASE = $(QNX_HOST)/usr/bin/lrelease + +update: $(QMAKE_TARGET).pro FORCE + $(LUPDATE) $(QMAKE_TARGET).pro + +release: $(QMAKE_TARGET).pro $(QMAKE_TARGET).ts + $(LRELEASE) $(QMAKE_TARGET).pro + +FORCE: + diff --git a/pjsip-apps/src/pjsua/bb10/translations/PjsuaBB.pro b/pjsip-apps/src/pjsua/bb10/translations/PjsuaBB.pro new file mode 100644 index 00000000..3f7c659e --- /dev/null +++ b/pjsip-apps/src/pjsua/bb10/translations/PjsuaBB.pro @@ -0,0 +1 @@ +include (../PjsuaBB.pro) diff --git a/pjsip-apps/src/pjsua/bb10/translations/PjsuaBB.ts b/pjsip-apps/src/pjsua/bb10/translations/PjsuaBB.ts new file mode 100644 index 00000000..cdc53c8c --- /dev/null +++ b/pjsip-apps/src/pjsua/bb10/translations/PjsuaBB.ts @@ -0,0 +1,22 @@ + + + + + main + + + + + + + + pjsua BB10 + + + + + Starting.. + + + + -- cgit v1.2.3