From cd9e89100a1e33f02e5b249dada1f4a7ef3d8c4a Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Tue, 23 Apr 2013 10:59:52 +0000 Subject: [PATCH] Re #1655: Fixes on WM and Symbian due to latest pjsua framework changes. git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@4492 74dad513-b988-da41-8d7b-12977e46ad98 --- build.symbian/bld.inf | 1 + pjsip-apps/src/pjsua/pjsua_app_config.h | 10 +- pjsip-apps/src/pjsua/symbian/group/pjsua.mmp | 4 +- .../src/pjsua/symbian/src/pjsuaAppUi.cpp | 160 ++++++++---------- pjsip-apps/src/pjsua/wm/main_wm.c | 138 ++++++--------- 5 files changed, 138 insertions(+), 175 deletions(-) diff --git a/build.symbian/bld.inf b/build.symbian/bld.inf index 410ee0295..f4ce90393 100644 --- a/build.symbian/bld.inf +++ b/build.symbian/bld.inf @@ -32,3 +32,4 @@ pjmedia_audiodev.mmp /* Applications */ //symsndtest.mmp pjlib_test.mmp +../pjsip-apps/src/pjsua/symbian/group/pjsua.mmp diff --git a/pjsip-apps/src/pjsua/pjsua_app_config.h b/pjsip-apps/src/pjsua/pjsua_app_config.h index 417bc430d..40a24edf8 100644 --- a/pjsip-apps/src/pjsua/pjsua_app_config.h +++ b/pjsip-apps/src/pjsua/pjsua_app_config.h @@ -19,6 +19,8 @@ #ifndef __PJSUA_APP_CONFIG_H__ #define __PJSUA_APP_CONFIG_H__ +#include + /* This file defines the default app config. It's used by pjsua * *mobile* version only. If you're porting pjsua to new mobile * platform, you should only include this file once in one of @@ -27,14 +29,20 @@ const char *pjsua_app_def_argv[] = { "pjsua", "--use-cli", "--no-cli-console", +#if defined(PJ_SYMBIAN) && PJ_SYMBIAN + /* Can't reuse address on E52 */ + "--cli-telnet-port=0", +#else "--cli-telnet-port=2323", - "--no-vad", +#endif "--quality=4", #if defined(PJ_CONFIG_BB10) && PJ_CONFIG_BB10 "--add-buddy=sip:169.254.0.2", #endif NULL }; +#define pjsua_app_def_argc (PJ_ARRAY_SIZE(pjsua_app_def_argv)-1) + #endif /* __PJSUA_APP_CONFIG_H__ */ diff --git a/pjsip-apps/src/pjsua/symbian/group/pjsua.mmp b/pjsip-apps/src/pjsua/symbian/group/pjsua.mmp index 88b87df85..a65981a13 100644 --- a/pjsip-apps/src/pjsua/symbian/group/pjsua.mmp +++ b/pjsip-apps/src/pjsua/symbian/group/pjsua.mmp @@ -101,5 +101,5 @@ STATICLIBRARY libresample.lib SOURCEPATH ..\.. -SOURCE pjsua_cli.c pjsua_legacy.c -SOURCE pjsua_app.c pjsua_common.c pjsua_config.c +SOURCE pjsua_app_cli.c pjsua_app_legacy.c +SOURCE pjsua_app.c pjsua_app_common.c pjsua_app_config.c diff --git a/pjsip-apps/src/pjsua/symbian/src/pjsuaAppUi.cpp b/pjsip-apps/src/pjsua/symbian/src/pjsuaAppUi.cpp index 124417c31..74b8c42f1 100644 --- a/pjsip-apps/src/pjsua/symbian/src/pjsuaAppUi.cpp +++ b/pjsip-apps/src/pjsua/symbian/src/pjsuaAppUi.cpp @@ -23,22 +23,25 @@ // ]]] end generated region [Generated Constants] #include "../../pjsua_app.h" +#include "../../pjsua_app_config.h" /* Global vars */ static CpjsuaAppUi *appui = NULL; static pj_ioqueue_t *app_ioqueue = NULL; -static int restart_argc = 0; -static char **restart_argv = NULL; +static int start_argc = 0; +static char **start_argv = NULL; + +static pj_status_t InitSymbSocket(); +static void DestroySymbSocket(); /* Helper funtions to init/restart/destroy the pjsua */ -static void LibInitL(); -static void LibDestroyL(); -static void LibRestartL(); +static void PjsuaInitL(); +static void PjsuaDestroyL(); /* pjsua app callbacks */ -static void lib_on_started(pj_status_t status, const char* title); -static pj_bool_t lib_on_stopped(pj_bool_t restart, int argc, char** argv); -static void lib_on_config_init(pjsua_app_config *cfg); +static void PjsuaOnStarted(pj_status_t status, const char* title); +static void PjsuaOnStopped(pj_bool_t restart, int argc, char** argv); +static void PjsuaOnConfig(pjsua_app_config *cfg); /* Helper class to schedule function execution */ class MyTimer : public CActive @@ -208,14 +211,24 @@ void CpjsuaAppUi::ConstructL() StatusPane()->MakeVisible(EFalse); Cba()->MakeVisible(EFalse); - // Schedule Lib Init - MyTimer::NewL(100, &LibInitL); + if (InitSymbSocket() != PJ_SUCCESS) { + PutMsg("Failed to initialize Symbian network param."); + } else { + start_argc = pjsua_app_def_argc; + start_argv = (char**)pjsua_app_def_argv; + + // Schedule Lib Init + MyTimer::NewL(100, &PjsuaInitL); + } + } /* Called by Symbian GUI framework when app is about to exit */ void CpjsuaAppUi::PrepareToExit() { - TRAPD(result, LibDestroyL()); + TRAPD(result, PjsuaDestroyL()); + DestroySymbSocket(); + CloseSTDLIB(); CAknViewAppUi::PrepareToExit(); } @@ -231,32 +244,40 @@ static RSocketServ aSocketServer; static RConnection aConn; /* Called when pjsua is started */ -void lib_on_started(pj_status_t status, const char* title) +void PjsuaOnStarted(pj_status_t status, const char* title) { + char err_msg[128]; + + if (status != PJ_SUCCESS || title == NULL) { + char err_str[PJ_ERR_MSG_SIZE]; + pj_strerror(status, err_str, sizeof(err_str)); + pj_ansi_snprintf(err_msg, sizeof(err_msg), "%s: %s", + (title?title:"App start error"), err_str); + title = err_msg; + } + appui->PutMsg(title); } /* Called when pjsua is stopped */ -pj_bool_t lib_on_stopped(pj_bool_t restart, int argc, char** argv) +void PjsuaOnStopped(pj_bool_t restart, int argc, char** argv) { if (restart) { - restart_argc = argc; - restart_argv = argv; + start_argc = argc; + start_argv = argv; // Schedule Lib Init - MyTimer::NewL(100, &LibRestartL); + MyTimer::NewL(100, &PjsuaInitL); } else { /* Destroy & quit GUI, e.g: clean up window, resources */ appui->Exit(); } - - return PJ_FALSE; } /* Called before pjsua initializing config. * We need to override some settings here. */ -void lib_on_config_init(pjsua_app_config *cfg) +void PjsuaOnConfig(pjsua_app_config *cfg) { /* Disable threading */ cfg->cfg.thread_cnt = 0; @@ -271,59 +292,66 @@ void lib_on_config_init(pjsua_app_config *cfg) cfg->cli_cfg.telnet_cfg.ioqueue = app_ioqueue; } -void LibInitL() +// Set Symbian OS parameters in pjlib. +// This must be done before pj_init() is called. +pj_status_t InitSymbSocket() { pj_symbianos_params sym_params; - char* argv[] = { - "", - "--use-cli", - "--cli-telnet-port=0", - "--no-cli-console" - }; - app_cfg_t app_cfg; - pj_status_t status; TInt err; - + // Initialize RSocketServ if ((err=aSocketServer.Connect(32)) != KErrNone) { - status = PJ_STATUS_FROM_OS(err); - goto on_return; + return PJ_STATUS_FROM_OS(err); } // Open up a connection if ((err=aConn.Open(aSocketServer)) != KErrNone) { aSocketServer.Close(); - status = PJ_STATUS_FROM_OS(err); - goto on_return; + return PJ_STATUS_FROM_OS(err); } if ((err=aConn.Start()) != KErrNone) { aConn.Close(); - aSocketServer.Close(); - status = PJ_STATUS_FROM_OS(err); - goto on_return; + aSocketServer.Close(); + return PJ_STATUS_FROM_OS(err); } - // Set Symbian OS parameters in pjlib. - // This must be done before pj_init() is called. pj_bzero(&sym_params, sizeof(sym_params)); sym_params.rsocketserv = &aSocketServer; sym_params.rconnection = &aConn; pj_symbianos_set_params(&sym_params); + + return PJ_SUCCESS; +} + +void DestroySymbSocket() +{ + aConn.Close(); + aSocketServer.Close(); +} + + +void PjsuaInitL() +{ + pjsua_app_cfg_t app_cfg; + pj_status_t status; + + PjsuaDestroyL(); + pj_bzero(&app_cfg, sizeof(app_cfg)); - app_cfg.argc = PJ_ARRAY_SIZE(argv); - app_cfg.argv = argv; - app_cfg.on_started = &lib_on_started; - app_cfg.on_stopped = &lib_on_stopped; - app_cfg.on_config_init = &lib_on_config_init; + app_cfg.argc = start_argc; + app_cfg.argv = start_argv; + app_cfg.on_started = &PjsuaOnStarted; + app_cfg.on_stopped = &PjsuaOnStopped; + app_cfg.on_config_init = &PjsuaOnConfig; appui->PutMsg("Initializing.."); - status = app_init(&app_cfg); + status = pjsua_app_init(&app_cfg); if (status != PJ_SUCCESS) goto on_return; appui->PutMsg("Starting.."); - status = app_run(PJ_FALSE); + status = pjsua_app_run(PJ_FALSE); if (status != PJ_SUCCESS) goto on_return; @@ -332,49 +360,11 @@ on_return: appui->PutMsg("Initialization failed"); } -void LibDestroyL() +void PjsuaDestroyL() { if (app_ioqueue) { pj_ioqueue_destroy(app_ioqueue); app_ioqueue = NULL; } - app_destroy(); - CloseSTDLIB(); -} - -void LibRestartL() -{ - app_cfg_t app_cfg; - pj_status_t status; - - /* Destroy pjsua app first */ - - if (app_ioqueue) { - pj_ioqueue_destroy(app_ioqueue); - app_ioqueue = NULL; - } - app_destroy(); - - /* Reinit pjsua app */ - - pj_bzero(&app_cfg, sizeof(app_cfg)); - app_cfg.argc = restart_argc; - app_cfg.argv = restart_argv; - app_cfg.on_started = &lib_on_started; - app_cfg.on_stopped = &lib_on_stopped; - app_cfg.on_config_init = &lib_on_config_init; - - status = app_init(&app_cfg); - if (status != PJ_SUCCESS) { - appui->PutMsg("app_init() failed"); - return; - } - - /* Run pjsua app */ - - status = app_run(PJ_FALSE); - if (status != PJ_SUCCESS) { - appui->PutMsg("app_run() failed"); - return; - } + pjsua_app_destroy(); } diff --git a/pjsip-apps/src/pjsua/wm/main_wm.c b/pjsip-apps/src/pjsua/wm/main_wm.c index 8ab133840..311ca77db 100644 --- a/pjsip-apps/src/pjsua/wm/main_wm.c +++ b/pjsip-apps/src/pjsua/wm/main_wm.c @@ -16,13 +16,10 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include - -#include -#include #include #include #include "..\pjsua_app.h" +#include "..\pjsua_app_config.h" #define MAINWINDOWCLASS TEXT("PjsuaDlg") #define MAINWINDOWTITLE TEXT("PJSUA") @@ -39,18 +36,17 @@ static HWND g_hWndLbl; static HWND g_hWndImg; static HBITMAP g_hBmp; -static int restart_argc = 0; -static char **restart_argv = NULL; +static int start_argc; +static char **start_argv; -/* Helper funtions to init/restart/destroy the pjsua */ -static void LibInit(); -static void LibDestroy(); -static void LibRestart(); +/* Helper funtions to init/destroy the pjsua */ +static void PjsuaInit(); +static void PjsuaDestroy(); /* pjsua app callbacks */ -static void lib_on_started(pj_status_t status, const char* title); -static pj_bool_t lib_on_stopped(pj_bool_t restart, int argc, char** argv); -static void lib_on_config_init(pjsua_app_config *cfg); +static void PjsuaOnStarted(pj_status_t status, const char* title); +static void PjsuaOnStopped(pj_bool_t restart, int argc, char** argv); +static void PjsuaOnConfig(pjsua_app_config *cfg); LRESULT CALLBACK DialogProc(const HWND hWnd, const UINT Msg, @@ -85,18 +81,14 @@ LRESULT CALLBACK DialogProc(const HWND hWnd, return (LRESULT)GetStockObject(BLACK_BRUSH); case WM_APP_INIT: - LibInit(); + case WM_APP_RESTART: + PjsuaInit(); break; case WM_APP_DESTROY: - LibDestroy(); PostQuitMessage(0); break; - case WM_APP_RESTART: - LibRestart(); - break; - default: return DefWindowProc(hWnd, Msg, wParam, lParam); } @@ -107,7 +99,7 @@ LRESULT CALLBACK DialogProc(const HWND hWnd, /* === GUI === */ -pj_status_t gui_init() +pj_status_t GuiInit() { WNDCLASS wc; HWND hWnd = NULL; @@ -192,7 +184,7 @@ pj_status_t gui_init() #endif /* Create logo */ - g_hBmp = SHLoadDIBitmap(LOGO_PATH); // for jpeg, uses SHLoadImageFile() + g_hBmp = SHLoadDIBitmap(LOGO_PATH); /* for jpeg, uses SHLoadImageFile() */ if (g_hBmp == NULL) { DWORD err = GetLastError(); return PJ_RETURN_OS_ERROR(err); @@ -227,7 +219,7 @@ pj_status_t gui_init() } -pj_status_t gui_start() +pj_status_t GuiStart() { MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { @@ -238,7 +230,7 @@ pj_status_t gui_start() return (msg.wParam); } -void gui_destroy(void) +void GuiDestroy(void) { if (g_hWndMain) { DestroyWindow(g_hWndMain); @@ -266,22 +258,29 @@ void gui_destroy(void) /* === ENGINE === */ /* Called when pjsua is started */ -void lib_on_started(pj_status_t status, const char* title) +void PjsuaOnStarted(pj_status_t status, const char* title) { wchar_t wtitle[128]; + char err_msg[128]; - PJ_UNUSED_ARG(status); + if (status != PJ_SUCCESS || title == NULL) { + char err_str[PJ_ERR_MSG_SIZE]; + pj_strerror(status, err_str, sizeof(err_str)); + pj_ansi_snprintf(err_msg, sizeof(err_msg), "%s: %s", + (title?title:"App start error"), err_str); + title = err_msg; + } pj_ansi_to_unicode(title, strlen(title), wtitle, PJ_ARRAY_SIZE(wtitle)); SetWindowText(g_hWndLbl, wtitle); } /* Called when pjsua is stopped */ -pj_bool_t lib_on_stopped(pj_bool_t restart, int argc, char** argv) +void PjsuaOnStopped(pj_bool_t restart, int argc, char** argv) { if (restart) { - restart_argc = argc; - restart_argv = argv; + start_argc = argc; + start_argv = argv; // Schedule Lib Restart PostMessage(g_hWndMain, WM_APP_RESTART, 0, 0); @@ -289,41 +288,37 @@ pj_bool_t lib_on_stopped(pj_bool_t restart, int argc, char** argv) /* Destroy & quit GUI, e.g: clean up window, resources */ PostMessage(g_hWndMain, WM_APP_DESTROY, 0, 0); } - - return PJ_FALSE; } /* Called before pjsua initializing config. */ -void lib_on_config_init(pjsua_app_config *cfg) +void PjsuaOnConfig(pjsua_app_config *cfg) { PJ_UNUSED_ARG(cfg); } -void LibInit() +void PjsuaInit() { - char* argv[] = { - "", - "--use-cli", - "--cli-telnet-port=0", - "--no-cli-console" - }; - app_cfg_t app_cfg; + pjsua_app_cfg_t app_cfg; pj_status_t status; + /* Destroy pjsua app first */ + pjsua_app_destroy(); + + /* Init pjsua app */ pj_bzero(&app_cfg, sizeof(app_cfg)); - app_cfg.argc = PJ_ARRAY_SIZE(argv); - app_cfg.argv = argv; - app_cfg.on_started = &lib_on_started; - app_cfg.on_stopped = &lib_on_stopped; - app_cfg.on_config_init = &lib_on_config_init; + app_cfg.argc = start_argc; + app_cfg.argv = start_argv; + app_cfg.on_started = &PjsuaOnStarted; + app_cfg.on_stopped = &PjsuaOnStopped; + app_cfg.on_config_init = &PjsuaOnConfig; SetWindowText(g_hWndLbl, _T("Initializing..")); - status = app_init(&app_cfg); + status = pjsua_app_init(&app_cfg); if (status != PJ_SUCCESS) goto on_return; SetWindowText(g_hWndLbl, _T("Starting..")); - status = app_run(PJ_FALSE); + status = pjsua_app_run(PJ_FALSE); if (status != PJ_SUCCESS) goto on_return; @@ -332,45 +327,11 @@ on_return: SetWindowText(g_hWndLbl, _T("Initialization failed")); } -void LibDestroy() +void PjsuaDestroy() { - app_destroy(); + pjsua_app_destroy(); } -void LibRestart() -{ - app_cfg_t app_cfg; - pj_status_t status; - - /* Destroy pjsua app first */ - - app_destroy(); - - /* Reinit pjsua app */ - - pj_bzero(&app_cfg, sizeof(app_cfg)); - app_cfg.argc = restart_argc; - app_cfg.argv = restart_argv; - app_cfg.on_started = &lib_on_started; - app_cfg.on_stopped = &lib_on_stopped; - app_cfg.on_config_init = &lib_on_config_init; - - status = app_init(&app_cfg); - if (status != PJ_SUCCESS) { - SetWindowText(g_hWndLbl, _T("app_init() failed")); - return; - } - - /* Run pjsua app */ - - status = app_run(PJ_FALSE); - if (status != PJ_SUCCESS) { - SetWindowText(g_hWndLbl, _T("app_run() failed")); - return; - } -} - - /* === MAIN === */ int WINAPI WinMain( @@ -389,18 +350,21 @@ int WINAPI WinMain( // store the hInstance in global g_hInst = hInstance; - status = gui_init(); + // Start GUI + status = GuiInit(); if (status != 0) goto on_return; - // Start the engine + // Setup args and start pjsua + start_argc = pjsua_app_def_argc; + start_argv = (char**)pjsua_app_def_argv; PostMessage(g_hWndMain, WM_APP_INIT, 0, 0); - status = gui_start(); + status = GuiStart(); on_return: - LibDestroy(); - gui_destroy(); + PjsuaDestroy(); + GuiDestroy(); return status; }