📄 voip.c
字号:
CliToolsParams.pCtxDisplayMenu = NULL;
CliToolsParams.pFctHandleMenuChoice = VoipCliHandleMenuChoice;
CliToolsParams.pCtxHandleMenuChoice = NULL;
CliToolsParams.pFctValidateUserInput = VoipCliValidateUserInput;
CliToolsParams.pCtxValidateUserInput = NULL;
CliToolsParams.pFctApplyUserInput = VoipCliApplyUserInput;
CliToolsParams.pCtxApplyUserInput = NULL;
if( g_pContext->TestModeContext.fTestMode == TBX_TRUE )
{
CliToolsParams.fDontRotateLogFile = TBX_TRUE;
}
Result = TbxCliToolsInit( &CliToolsParams, &pCliContext->hCliTools );
if( TBX_RESULT_FAILURE( Result ) )
{
TBX_EXIT_ERROR( Result, 0, "Could not allocate TBX Cli Tools!" );
}
TbxCliToolsLogPrint(pCliContext->hCliTools, TRACE_LEVEL_ALWAYS, NULL, "Starting TBX Cli Tools library...\n");
/* Now start the TBX Cli Tools thread */
Result = TbxCliToolsStart( pCliContext->hCliTools );
if( TBX_RESULT_FAILURE( Result ) )
{
TBX_EXIT_ERROR( Result, 0, "Could not start TBX Cli Tools!" );
}
}
TbxCliToolsLogPrint( pCliContext->hCliTools, TRACE_LEVEL_ALWAYS, NULL, "Reading configuration files...\n");
Result = VoipLoadInitialConfig();
if( TBX_RESULT_FAILURE( Result ) )
{
TBX_EXIT_ERROR (Result, 0, "Failed to load initial configuration.");
}
TbxCliToolsLogPrint(pCliContext->hCliTools, TRACE_LEVEL_ALWAYS, NULL, "Initializing TBX host library...\n");
/* Initialize the TBX library access parameters */
memset (&g_pContext->LibParam, 0, sizeof (g_pContext->LibParam));
g_pContext->LibParam.un32StructVersion = 1;
/* g_pContext->LibParam.szHostName -> Host lib will automatically detect local host name */
strncpy( g_pContext->LibParam.szApplicationName, VOIP_APPLICATION_NAME, sizeof(g_pContext->LibParam.szApplicationName) );
if( g_pContext->CurrentConfig.szInterfaceIp0[0] != '\0' )
{
/* Set host library interface IP address */
strncpy( g_pContext->LibParam.szInterfaceIp0, g_pContext->CurrentConfig.szInterfaceIp0, sizeof(g_pContext->LibParam.szInterfaceIp0) );
g_pContext->LibParam.szInterfaceIp0[sizeof(g_pContext->LibParam.szInterfaceIp0) - 1] = '\0';
strncpy( g_pContext->LibParam.szInterfaceIp1, g_pContext->CurrentConfig.szInterfaceIp1, sizeof(g_pContext->LibParam.szInterfaceIp1) );
g_pContext->LibParam.szInterfaceIp1[sizeof(g_pContext->LibParam.szInterfaceIp1) - 1] = '\0';
}
else
{
/* g_pContext->LibParam.szInterfaceIp0, szInterfaceIp1 -> Host lib will use TBX_GW_ADDRESS_0 and TBX_GW_ADDRESS_1 */
}
if( g_pContext->CurrentConfig.un32GwPortNumber > 0 )
{
/* Set the first host library interface gateway port */
g_pContext->LibParam.un16TbxGwPort = g_pContext->CurrentConfig.aun16TbxGwPort[0];
if( g_pContext->CurrentConfig.un32GwPortNumber > 1 )
{
TBX_UINT32 un32GwCount;
/* set the extra gateway ports */
for( un32GwCount = 1; un32GwCount < g_pContext->CurrentConfig.un32GwPortNumber; un32GwCount++ )
{
g_pContext->LibParam.aun16ExtraTbxGwPort[un32GwCount-1] = g_pContext->CurrentConfig.aun16TbxGwPort[un32GwCount];
}
}
}
else
{
/* g_pContext->LibParam.un16TbxGwPort -> Host lib will use TBX_GW_PORT */
}
g_pContext->LibParam.fEnableInterAppCommunication = TBX_TRUE; /* For stream server */
g_pContext->LibParam.fIgnoreAdapters = TBX_TRUE; /* By default, don't detect remote adapters. We enable it after creating TBX lib filter. */
g_pContext->LibParam.un64UserContext1 = VOIP_USER_CONTEXT;
g_pContext->LibParam.un64UserContext2 = 0;
g_pContext->LibParam.un32AutoDetectionDelayMin = 5000; /* Set default value, not used by the host libray for now */
g_pContext->LibParam.un32WatchdogTimeoutSec = 5000; /* Set default value, not used by the host libray for now */
g_pContext->LibParam.TransportType = TBX_TRANSPORT_TYPE_ETHERNET;
g_pContext->LibParam.MsgRxThreadPrio = TBX_MSG_RX_THREAD_PRIO_HIGHER; /* Networking threads in the host library higher priority */
g_pContext->LibParam.un32ReceiveFifoSize = TBX_RECEIVE_FIFO_SIZE_MAX;
g_pContext->LibParam.un32SendFifoSize = TBX_SEND_FIFO_SIZE_MAX;
g_pContext->LibParam.pFctStderr = VoipTbxLibErrorPrint;
g_pContext->LibParam.pCtxStderr = g_pContext;
g_pContext->LibParam.pFctMsgTrace = NULL;
g_pContext->LibParam.pCtxMsgTrace = NULL;
g_pContext->LibParam.pFctErrorHandler = VoipTbxLibErrorHandler;
g_pContext->LibParam.pCtxErrorHandler = g_pContext;
/* Opening the TBX library */
Result = TBXOpenLib (&g_pContext->LibParam, &g_pContext->hTbxLib);
if( TBX_RESULT_FAILURE( Result ) )
{
TBX_EXIT_ERROR (Result, 0, "Failed to open TBX library.");
}
Result = TBXGetLibParams (g_pContext->hTbxLib, &g_pContext->LibParam);
if( TBX_RESULT_FAILURE( Result ) )
{
TBX_EXIT_ERROR (Result, 0, "Failed to query TBX library parameters.");
}
TbxCliToolsLogPrint( pCliContext->hCliTools, TRACE_LEVEL_0, NULL, "*****************************************\n");
TbxCliToolsLogPrint( pCliContext->hCliTools, TRACE_LEVEL_0, NULL, "* TBX Library %s (0x%08X)\n", g_pContext->LibParam.szBuildTag, g_pContext->LibParam.un32BuildNumber);
TbxCliToolsLogPrint( pCliContext->hCliTools, TRACE_LEVEL_0, NULL, "*****************************************\n");
TbxCliToolsLogPrint( pCliContext->hCliTools, TRACE_LEVEL_ALWAYS, NULL, "Creating TBX host library filter...\n");
/* Create host library filter */
Result = VoipCreateTbxLibFilter();
if( TBX_RESULT_FAILURE( Result ) )
{
TBX_EXIT_ERROR (Result, 0, "Failed to initialize filters.");
}
TbxCliToolsLogPrint( pCliContext->hCliTools, TRACE_LEVEL_ALWAYS, NULL, "Opening streamlib...\n");
/* Open the stream lib */
Result = VoipStreamLibOpen
(
g_pContext->LibParam.szInterfaceIp0,
g_pContext->LibParam.szInterfaceIp1
);
if( TBX_RESULT_FAILURE( Result ) )
{
TBX_EXIT_ERROR (Result, 0, "Failed to open stream lib.");
}
TbxCliToolsLogPrint( pCliContext->hCliTools, TRACE_LEVEL_ALWAYS, NULL, "Starting initial configuration...\n");
/* Start the initial configuration */
Result = VoipStartInitialConfig();
if( TBX_RESULT_FAILURE( Result ) )
{
TBX_EXIT_ERROR (Result, 0, "Failed to start initial configuration.");
}
/* Init Test available */
if( g_pContext->TestModeContext.fTestMode == TBX_TRUE )
{
TbxCliToolsLogPrint( pCliContext->hCliTools, TRACE_LEVEL_ALWAYS, NULL, "Initializing test librairy\n");
VoipInitAutoTest( g_pContext->TestModeContext.hPoolTestFunction );
}
/* It is now safe to start handling TBX CLI Tools callbacks */
pCliContext->fCliToolsSafe = TBX_TRUE;
TbxCliToolsLogPrint( pCliContext->hCliTools, TRACE_LEVEL_ALWAYS, NULL, "Entering main state machine...\n");
/* Enter main state machine function */
Result = VoipStateMachineMain();
if( TBX_RESULT_FAILURE( Result ) )
{
TBX_EXIT_ERROR (Result, 0, "Main state machine failed.");
}
TbxCliToolsLogPrint( pCliContext->hCliTools, TRACE_LEVEL_ALWAYS, NULL, "Main state machine stopped\n");
/* End of the code (skip to cleanup) */
TBX_EXIT_SUCCESS (TBX_RESULT_OK);
}
/*---------------------------------------------------------------------------------------------------------------------------
| Error handling section
*--------------------------------------------------------------------------------------------------------------------------*/
ERROR_HANDLING
{
/* Print the error to the user */
if( (pCliContext != NULL) && (pCliContext->hCliTools) )
{
TbxCliToolsLogPrint(
pCliContext->hCliTools,
TRACE_LEVEL_ERROR, NULL,
"main: %s (Result 0x%08X, %s, line %d)\n",
TBX_ERROR_DESCRIPTION,
TBX_ERROR_RESULT,
__FILE__,
TBX_ERROR_LINE);
}
else
{
fprintf (stderr, "main: %s\n", TBX_ERROR_DESCRIPTION);
}
}
/*---------------------------------------------------------------------------------------------------------------------------
| Cleanup section
*--------------------------------------------------------------------------------------------------------------------------*/
CLEANUP
{
}
g_AppResult =Result;
return Result;
}
/*-------------------------------------------------------------------------------------------------------------------------------
|
| VoipEnterQuitSequence : Move all state machines toward "not used" state.
| It is safe to quit only when all states machines are "not used".
|
| ~ : No parameters
|
| Note : ~
|
| Return : ~
|
*------------------------------------------------------------------------------------------------------------------------------*/
TBX_VOID VoipEnterQuitSequence( TBX_VOID )
{
PVOIP_CLI_CONTEXT pCliContext = &g_pContext->CliContext;
PVOIP_ADAPTER_CONTEXT_NODE pAdapterContextNode;
g_fContinue = TBX_FALSE;
TbxCliToolsLogPrint( pCliContext->hCliTools, TRACE_LEVEL_ALWAYS, NULL, "Canceling all state machines\n");
/* Tell all adapters to switch to "not used" state */
pAdapterContextNode = TBXPoolOfBuffersFirst( g_pContext->hPoolOfAdapters );
while( pAdapterContextNode )
{
if( pAdapterContextNode->pAdapterContext && pAdapterContextNode->pAdapterContext->State != VOIP_ADAPTER_STATE_NOT_USED )
{
VoipAdapterStopUsing( pAdapterContextNode->pAdapterContext );
}
pAdapterContextNode = TBXPoolOfBuffersNext( g_pContext->hPoolOfAdapters, pAdapterContextNode );
}
return;
}
/*-------------------------------------------------------------------------------------------------------------------------------
|
| VoipTerm : Function called when this application exits.
|
| Note : ~
|
| Return : ~
|
*------------------------------------------------------------------------------------------------------------------------------*/
static TBX_VOID VoipTerm( TBX_VOID )
{
TBX_BOOL fTestMode = TBX_FALSE;
PVOIP_CLI_CONTEXT pCliContext = &g_pContext->CliContext;
PVOIP_ADAPTER_CONTEXT pAdapterContext = NULL;
PVOIP_ADAPTER_CONTEXT_NODE pAdapterContextNode = NULL;
if( g_pContext )
{
/* Free test function */
if( g_pContext->TestModeContext.fTestMode == TBX_TRUE )
{
fTestMode = TBX_TRUE;
VoipFreeAutoTest();
}
/* It is no more safe to start handling TBX CLI Tools callbacks */
pCliContext->fCliToolsSafe = TBX_FALSE;
/* Wait until user finishes reading the TBX CLI Log */
{
time_t LastTimePrint = 0;
while( g_fContinue )
{
if( time( NULL ) != LastTimePrint )
{
LastTimePrint = time( NULL );
if( pCliContext->hCliTools )
{
TbxCliToolsLogPrint( pCliContext->hCliTools, TRACE_LEVEL_ALWAYS, NULL, "Waiting for control-C or '%c' to terminate quit sequence...\n", VOIP_CLI_MENU_KEY_QUIT );
}
else
{
fprintf( stderr, "Press any key to quit...\n" );
}
}
TBX_SLEEP_MS( 10 );
if( !pCliContext->hCliTools || TBXCliKeyboardHit() )
break;
}
}
if( pCliContext->hCliTools )
TbxCliToolsLogPrint( pCliContext->hCliTools, TRACE_LEVEL_1, NULL, "Disconnecting from stream server\n");
/* Close stream server library */
VoipStreamServerClose();
/* Open the stream lib */
VoipStreamLibClose();
if( pCliContext->hCliTools )
TbxCliToolsLogPrint( pCliContext->hCliTools, TRACE_LEVEL_ALWAYS, NULL, "Closing TBX host library\n");
/* Close the message receive filter */
if (g_pContext->hFilter != (TBX_FILTER_HANDLE)TBX_HANDLE_INVALID)
{
TBXDestroyMsgFilter (g_pContext->hTbxLib, g_pContext->hFilter);
g_pContext->hFilter = (TBX_FILTER_HANDLE)TBX_HANDLE_INVALID;
}
/* Close the TBX library */
if (g_pContext->hTbxLib != (TBX_LIB_HANDLE)TBX_HANDLE_INVALID)
{
TBXCloseLib (g_pContext->hTbxLib);
g_pContext->hTbxLib = (TBX_LIB_HANDLE)TBX_HANDLE_INVALID;
}
if( pCliContext->hCliTools )
TbxCliToolsLogPrint( pCliContext->hCliTools, TRACE_LEVEL_ALWAYS, NULL, "Destroying application contexts\n");
/* Free the adapter's timer */
if( g_pContext->hAdapterTimers != (TBX_TIMER_HANDLE)TBX_HANDLE_INVALID )
{
TBXTimerDestroy( g_pContext->hAdapterTimers );
g_pContext->hAdapterTimers = (TBX_TIMER_HANDLE)TBX_HANDLE_INVALID;
}
/* Free the hash table of adapter handles */
if( g_pContext->hAdapterHandleHash != (TBX_HASH_HANDLE)TBX_HANDLE_INVALID )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -