⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 voip.c

📁 telcobridges voip develop
💻 C
📖 第 1 页 / 共 3 页
字号:
			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 + -