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

📄 h323f.cpp

📁 基于h323协议的软phone
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/************************************************************************
 *
 *    Version %I%
 *
 *       Copyright (C) 2002 By BEP Corporation.
 * This Document Contains Proprietary Information Of BEP Corporation.
 * No Distribution Is Granted Except  With Written Permission From
 * BEP Corporation.
 *************************************************************************/
/*
 **
 ** MODULE: h323f.cpp
 **
 ** PURPOSE:
 **
 ** LIMITATIONS:
 **
 ** DATE CREATED: 10-29-2003
 **
 ** AUTHOR(S): aoto created
 **
 ** MODIFICATIONS:
 **     userId                  Date            Description
 **
 ** QA Status:
 **      status                   Date             Owner
 **
 */
#include "stdafx.h"
#include "myphone.h"
#include "myphoneDlg.h"

//#include "h323.h"
//#include "task.h"
#include "rvwpt.h"
//#include "beptimer.h"
#include <string.h>
#include "h323common.h"
#ifdef INCLUDE_RV_RTP
#include "payload.h"
#endif
#if 0
#define MAX_DISPLAY_LENGTH       32
#define MAX_PHONE_NUMBER_LEN  32
#define LENGTH_LOCAL_ID	       32
#define MAX_E164NUM_LENGTH      32
#define MAX_H323ID_LENGTH         32
#define FIFTEEN_SEC                       15 * 1000
#define TEN_SEC                               10 * 1000
#define ONE_SEC                              1  * 1000
#define ALERTING_SEC                     30*1000
#define CONNECT_TIME                    90*1000
#define TASKDELAY_ONE_SEC			100
#define CALLER_ACTOR				1
#define RECEIVER_ACTOR				2
#define MAX_CONCURRENT_CALL_NUM	2		/* Max number of simultaneous calls */

typedef struct AppCallInfo_tag
{
	char ipAddr[5];
	char display[MAX_DISPLAY_LENGTH + 1];
	char h323Id[MAX_H323ID_LENGTH + 1];
	char e164Num[MAX_E164NUM_LENGTH + 1];
	WpCodec codec;
	ForwardNumberList	forwardNumberList;	/* Forward to number list */
	unsigned char used;
} AppCallInfo;


#endif
WrapperMsg* wp_msg;
NonWrapperMsg* msg;
extern HWND g_hwnd;
#if 0
unsigned char remoteIPAddr[5];
char localIPNumber[5];		/* 本地终端IP地址,as numbers, not a string */
char TransferIPAddr[5];	/* Transferred-to's IP address (party C address) */
char localDisplay[MAX_DISPLAY_LENGTH+1];	
char digit_set[MAX_PHONE_NUMBER_LEN+1];		/* 用户输入的数字号码 */
char toAddr[MAX_PHONE_NUMBER_LEN+1];
char localE164Num[MAX_E164NUM_LENGTH+1];	/* Terminal's E.164 number */
unsigned char callActor = CALLER_ACTOR; 
int callIndex = -1;
int digitCollectAmount = -1;
int h323_timer = -1;
int call_forward_timer	= -1;			/* 呼叫前转计时器 */
int num_digits = 0;
int starting_transfer = FALSE;				/* 是否已开始转接 */
unsigned char gkEnabled = 0;
unsigned char networkStatus = 1;
unsigned char call_numbers = 0;				/* Concurrent call numbers */
#endif
/***************************************************************************
 *
 *  AppSendWrapper()
 *
 *  Arguments
 *      Input: msgid - Id of the message to send to the Wrapper.
 *
 *  Returns:   OK or ERROR.
 *
 *  Description:
 *  1. Send the indicated message to the Wrapper and deal with all error
 *     handling.
 *
 **************************************************************************/
int AppSendWrapper (WpMsgId msgid, int callId)
{

	int mult=1;
	unsigned int peer_ip;
	char *dest_number = NULL;

	switch (msgid)
	{
		case WP_SEND_QUERY_AVA:
			peer_ip=remoteIPAddr[3] + remoteIPAddr[2]*0x100 + remoteIPAddr[1]*0x10000 + remoteIPAddr[0]*0x1000000;
	/*		sprintf((char*)remoteIPAddr, "%03u.%03u.%03u.%03u",
				remoteIPAddr[0],
				remoteIPAddr[1],
				remoteIPAddr[2],
				remoteIPAddr[3]);*/
			dest_number = NULL;
			peer_ip = 0xc0a80780;

			strcpy(localDisplay, "BEPPHONE");
			//::MessageBox(g_hwnd, localDisplay, "OK", 0);
			
			/*H323TRACE("localDisplay:%s***\n", localDisplay);*/

			return WpSendMessage(msgid, callId, peer_ip, "", localDisplay, "");
		case WP_SEND_CONN:
/*			SetLocalID();*/
			strncpy(localDisplay, "BEPPHONE",MAX_DISPLAY_LENGTH);
			localDisplay[MAX_DISPLAY_LENGTH]='\0';
			return WpSendMessage(msgid, callId, 0, "", localDisplay, "");

		case WP_SEND_AVA:
			strncpy(localDisplay, "BEPPHONE",MAX_DISPLAY_LENGTH);
			localDisplay[MAX_DISPLAY_LENGTH]='\0';

			return WpSendMessage(msgid, callId, 0, "", localDisplay, "");

		case WP_SEND_TERM:   /* terminate the call */
			return WpSendMessage(msgid, callId, 0, "", "", "");

		default:
		/* printf("In default AppSendWrapper case, callIndex = %u\n",callIndex); */
			return WpSendMessage(msgid, callId, 0, "", "", "");
	}
	return (ERROR);
}


/***************************************************************************
 *
 *  AppTerminateAction()
 *
 *  Arguments
 *      Input: given_state - what our current state is.
 *
 *  Returns:   h323_event_type - which event of forcing to speical state.
 *
 *  Description:
 *  1. General "Terminate" action processing.
 *
 **************************************************************************/
int AppTerminateAction (int given_state)
{

    if(/* If second_call flag is set, we have at least one call up, so need terminate */
		(given_state == ST_H323_BIDIR_VOICE_STATE) || (given_state == ST_H323_QUERY_AVAILABILITY_STATE) ||
		(given_state == ST_H323_WAIT_FOR_CONNECT_STATE) || (given_state == ST_H323_RINGING_STATE) ||
		(given_state == ST_H323_COLLECT_TRANSFER_DIGITS_STATE) ||
		(given_state == ST_H323_AWAIT_CALL_TRANSFER_STATE)
		)
	{
        /* set the term_channel to the call to be terminated */
		if (callIndex >= 0)
		{
	
			AppSendWrapper( WP_SEND_TERM, callIndex );
		}
	
	}

	callIndex = -1; /* clear to handle case of an H.450 error during call setup */

	return to_on_hook_state;
}

int AppCalloutDirect()
{

	remoteIPAddr[4] = 0;
	remoteIPAddr[3] = 154;
	remoteIPAddr[2] = 7;
	remoteIPAddr[1] = 168;
	remoteIPAddr[0] = 192;

	callIndex = AppSendWrapper( WP_SEND_QUERY_AVA, -1 );
	return to_query_availability_state;
}

int H323SMDefaultAction(struct s_event* psEvent, struct s_task* psTask)
{

	return null_event;
}


int H323Action(struct s_event* psEvent, struct s_task* psTask)
{
	int retEvent;
	retEvent = StateDo(psEvent, psTask);
	if (retEvent != null_event)
	{    	
		psEvent->iEvent = retEvent;
		retEvent = StateDo(psEvent, psTask);		
	}
	return 0;
}

int DoNull(s_task* psTask)
{
	return 0;
}
int AppGetCallingNumber()
{
	int ip0, ip1, ip2, ip3;
	/* 处理电话本或呼叫记录的号码 */
	if (toAddr[0] != '\0')
	{
		num_digits = strlen(toAddr);
		digitCollectAmount = (toAddr[0] == '*') ? 13 : -1;
		strncpy(digit_set, toAddr,MAX_PHONE_NUMBER_LEN);	
		digit_set[MAX_PHONE_NUMBER_LEN]='\0';
	}
	digit_set[num_digits] = 0;
	/* 记录拨出号码 */
/*	if (num_digits != 0)
	{
		AppRecordOutgoingCall(digit_set);
	}
*/	
	

	/* 判断输入的IP地址长度是否正确
	 * 固定为12位: xxx.xxx.xxx.xxx
	 * 号码不正确则屏显错误,退出处理
	 */
	if ((num_digits == 0) ||(!gkEnabled && digitCollectAmount == 13 && num_digits < 13)
		|| (!gkEnabled && num_digits == 1 && digit_set[0] == '#')
		|| (!gkEnabled && digit_set[0] != '*' && digit_set[0] != '#'))
	{
/*		LcdShowMessage(H323_INVALID_NUMBER);
		PlayBusyTone(FIFTEEN_SEC);*/
		return ERROR;
	}
	
	
	if (digitCollectAmount == -1 || gkEnabled)
	{
		remoteIPAddr[0] = 0;
	}
	else
	{			
		ip3 = (digit_set[10]-'0')*100+(digit_set[11]-'0')*10+(digit_set[12]-'0');
		ip2 = (digit_set[7]-'0')*100+(digit_set[8]-'0')*10+(digit_set[9]-'0');
		ip1 = (digit_set[4]-'0')*100+(digit_set[5]-'0')*10+(digit_set[6]-'0');
		ip0 = (digit_set[1]-'0')*100+(digit_set[2]-'0')*10+(digit_set[3]-'0');
		if (ip3 > 255 || ip2 > 255 || ip1 > 255 || ip0 > 255)
		{
		/*	LcdShowMessage(H323_INVALID_NUMBER);
			PlayBusyTone(FIFTEEN_SEC);*/
			return ERROR;
		}
		remoteIPAddr[4] = 0;
		remoteIPAddr[3] = ip3;
		remoteIPAddr[2] = ip2;
		remoteIPAddr[1] = ip1;
		remoteIPAddr[0] = ip0;
	}
	return 0;
}

int callout(int event_type)
{
	if (AppGetCallingNumber() != 0)
	{
		return to_dead_end_state;
	}
	
/*	LcdShowRemote(dig_id, digit_set, num_digits, 0, FLAG_NORMAL);
	PreserveLcdMessage = FALSE;	
	menu_event = reset_event;
*/
	if (!networkStatus)
	{
/*		PreserveLcdMessage = TRUE;
		LcdShowMessage(H323_NETWORK_NOT_CONNECTED);
		PlayBusyTone(FIFTEEN_SEC);*/
		return to_dead_end_state;
	}
	
	else if ((callIndex = AppSendWrapper( WP_SEND_QUERY_AVA, -1)) == -1 )
	{			
		// rest to do
	}
	else
	{
		/*H323TRACE("Going to query_availability_state\n");*/
		/* 设置等待响应计时器 */
		DeleteTimer(&h323_timer);
		h323_timer = CreateTimer(ALERTING_SEC);
		return event_type;			
	}	
}
/*不做动作*/
int h323_on_hook_state_local_off_hook_event(s_event* psEvent, s_task* psTask)
{	
	return null_event;
}

/**
 * LCD显示呼叫方信息,指示灯亮;
 * 处理允许无条件转移的情况;
 * 允许接收,发送WP_SEND_AVA消息并播放铃声;
 * 否则,设置无应答转移计时器
 */
int h323_on_hook_state_receive_query_availability_event(s_event* psEvent, s_task* psTask)
{
	wp_msg = (WrapperMsg *) psEvent->pMsg;
	callIndex = wp_msg->baseInfo.callIndex;
	AppSendWrapper( WP_SEND_AVA, callIndex );

	return null_event;           
}

int h323_on_hook_state_to_ringing_state(s_event* psEvent, s_task* psTask)
{

	return null_event;
}

/**
 *  终结,回到初始状态 
 */
int h323_on_hook_state_local_on_hook_event(s_event* psEvent, s_task* psTask)
{
	return null_event;
}

/**
 * 终结terminate所指通道的通话
 * AppTerminateAction()
 */
int h323_on_hook_state_receive_terminate_event(s_event* psEvent, s_task* psTask)
{
	return null_event;
}


/**
 * 超时处理:LCD清屏、计时器复位
 */
int h323_on_hook_state_timeout_event(s_event* psEvent, s_task* psTask)
{
	return null_event;
}

/**
 * 若在菜单里选中某条电话号码,拨出该号码
 */
int h323_on_hook_state_callout_key_event(s_event* psEvent, s_task* psTask)
{

	return AppCalloutDirect();
}

/**
 * 速拨功能
 */
int h323_on_hook_state_long_digit_event(s_event* psEvent, s_task* psTask)
{

	return null_event;
}

int h323_on_hook_state_to_dead_end_state(s_event* psEvent, s_task* psTask)
{
	return null_event;
}

int h323_on_hook_state_to_query_availability_state(s_event* psEvent, s_task*
    psTask)
{
	return null_event;
}

int h323_on_hook_state_to_wait_for_connect_state(s_event* psEvent, s_task*
    psTask)
{
	return null_event;
}

/**
 * 同on_hook_state_receive_query_availability_event
 */
int h323_wait_first_digit_state_receive_query_availability_event(s_event*
    psEvent, s_task* psTask)
{
	wp_msg = (WrapperMsg *) psEvent->pMsg;
	callIndex = wp_msg->baseInfo.callIndex;
	AppSendWrapper( WP_SEND_AVA, callIndex );
	return null_event;
}

/**
 * 终结terminate所指通道的通话
 */
int h323_wait_first_digit_state_receive_terminate_event(s_event* psEvent,
    s_task* psTask)
{
	
	wp_msg = (WrapperMsg *) psEvent->pMsg;
	/* While we are the transferring endpoint,
	     Did we receive a terminate on the existing (first) call? */
	if(callIndex == wp_msg->baseInfo.callIndex)
	{
		AppTerminateAction( ST_H323_COLLECT_TRANSFER_DIGITS_STATE );
		return to_dead_end_state;
	}		
	return null_event;
}

/**
 * 若为呼叫转移,产生to_collect_transfer_digits_state事件;
 * 否则产生to_collect_digits_state
 */
int h323_wait_first_digit_state_digit_event(s_event* psEvent, s_task* psTask)
{
	msg = (NonWrapperMsg *) psEvent->pMsg;
	digit_set[0] = msg->digit+'0';
	digit_set[1] = '\0';
	if (msg->digit == 10)
		digitCollectAmount = 13;
	else
		digitCollectAmount = -1;

	num_digits = 1;

	if (digit_set[0] == '0' + 10)
		digit_set[0] = '*';
	else if (digit_set[0] == '0' + 11)
		digit_set[0] = '#';
		
	/* 设置等待后续拨号的计时器 */
	DeleteTimer(&h323_timer);
	h323_timer = CreateTimer(FIFTEEN_SEC);
		
	if(starting_transfer)
	{
/*		LcdShowDigit( digit_set[0], FALSE );		
		H323TRACE("Going to collect_transfer_digits_state\n");*/
		return to_collect_transfer_digits_state;
	}
	else
	{
/*		LcdShowDigit( digit_set[0], TRUE );
		LcdDShowCursor(TRUE);
		H323TRACE("Going to collect_digits_state\n");*/
		return to_collect_digits_state;		
	}		
	return null_event;
}

/**
 * 等待第一次拨号超时,停止等待
 */
int h323_wait_first_digit_state_timeout_event(s_event* psEvent, s_task* psTask)
{
	return null_event;
}

/**
 * 拨出当前屏显的号码,记录拨出电话;
 * 产生to_query_availability_state事件;
 * 若出错产生to_dead_end_state;
 * 若为第二路通话则产生to_bidir_voice_state
 */
int h323_wait_first_digit_state_callout_key_event(s_event* psEvent, s_task*
    psTask)
{	
	return AppCalloutDirect();
}

/**
 * 快速拨号功能,拨出速拨键1-10中对应的号码;
 * 产生to_query_availability_state事件;
 * 若出错产生to_dead_end_state;
 * 若为第二路通话则产生to_bidir_voice_state
 */

int h323_wait_first_digit_state_speed_dial_key_event(s_event* psEvent, s_task*
    psTask)
{
	return null_event;
}
/**
 * 若是Cll Transfer,返回通话状态
 */
int h323_wait_first_digit_state_cancel_key_event(s_event* psEvent, s_task*
    psTask)
{
	return null_event;
}

/**
 * 终结,回到初始状态
 */
int h323_wait_first_digit_state_local_on_hook_event(s_event* psEvent, s_task*
    psTask)
{

	return null_event;
}

int h323_wait_first_digit_state_to_dead_end_state(s_event* psEvent, s_task*
    psTask)
{
	return null_event;
}

int h323_wait_first_digit_state_to_collect_digits_state(s_event* psEvent,
    s_task* psTask)
{
	return null_event;
}

int h323_wait_first_digit_state_to_collect_transfer_digits_state(s_event*
    psEvent, s_task* psTask)
{

	return null_event;
}

int h323_wait_first_digit_state_to_bidir_voice_state(s_event* psEvent, s_task*
    psTask)
{
	return null_event;
}

int h323_wait_first_digit_state_to_query_availability_state(s_event* psEvent,
    s_task* psTask)
{

	return null_event;
}

/**
 * 收集、记录号码
 */
int h323_collect_digits_state_digit_event(s_event* psEvent, s_task* psTask)
{
		
	if (num_digits >= MAX_PHONE_NUMBER_LEN)
		return null_event;

	if (toAddr[0] != '\0')
	{
		memset(toAddr, 0, sizeof(toAddr));		
	}

	msg = (NonWrapperMsg *) psEvent->pMsg;

        if(!gkEnabled)
        { 
	       if ((digitCollectAmount != -1) && (msg->digit > 9 || num_digits == digitCollectAmount))
		       return null_event;

	       if ((digitCollectAmount == -1) && (msg->digit == 10))
		       return null_event;
        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -