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

📄 h323f.cpp

📁 基于h323协议的软phone
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/**
 * 终结,回到初始状态
 */
int h323_bidir_voice_state_local_on_hook_event(s_event* psEvent, s_task* psTask)
{
	AppTerminateAction( ST_H323_BIDIR_VOICE_STATE );
	return null_event;
}

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

	return null_event;
}

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

/**
 * 通话过程中呼叫转移,进入calltransfer开始等待按键
 */
int h323_bidir_voice_state_call_transfer_key_event(s_event* psEvent, s_task*
    psTask)
{
	return null_event;
}

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

int h323_ringing_state_local_on_hook_event(s_event* psEvent, s_task* psTask)
{
	AppTerminateAction( ST_H323_RINGING_STATE );
	return to_on_hook_state;
}

/**
 * 返回忙或进行呼叫转移
 */
int h323_ringing_state_receive_query_availability_event(s_event* psEvent,
    s_task* psTask)
{
	wp_msg = (WrapperMsg *)psEvent->pMsg;
	AppReplyNotAvailOrFwd(wp_msg);
	return null_event;
}

/**
 * 终结terminate所指通道的通话,若为当前振铃的通话,记录未接来电
 */
int h323_ringing_state_receive_terminate_event(s_event* psEvent, s_task* psTask)
{

	wp_msg = (WrapperMsg *)psEvent->pMsg;

	if (callIndex != wp_msg->baseInfo.callIndex)
	{
		return null_event;
	}
			
	AppTerminateAction( ST_H323_RINGING_STATE );
	/* 设置屏显计时器 */
	return to_on_hook_state;
}

/**
 * 根据全局量判断当前是CT、callforward还是
 * 普通呼叫,发出对应的响应消息,记录
 * 已接来电,产生to_wait_for_connect_state
 */
int h323_ringing_state_local_off_hook_event(s_event* psEvent, s_task* psTask)
{
/*	WrapperMsg wpmsg;
	wpmsg.baseInfo.callIndex = callIndex;
	
	strcpy(wpmsg.baseInfo.localE164Num, "123");	
	strcpy(wpmsg.baseInfo.display, "fjd");
	wpSendConn(&wpmsg);*/
	AppSendWrapper( WP_SEND_CONN, callIndex );
	return to_wait_for_connect_state;	
}

/** Not used
 * 清除calltransfer相关全局量
 */
int h323_ringing_state_call_transfer_abandon(s_event* psEvent, s_task* psTask)
{
	return null_event;
}

/**
 * 若设置CFNR,进行呼叫转移;否则,停止振铃,记录未接来电,产生to_on_hook_state;
 */
int h323_ringing_state_timeout_event(s_event* psEvent, s_task* psTask)
{
	return null_event;
}

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

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

	return null_event;
}

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

	return null_event;
}
int AppCalloutTransfer()
{
	char lcdmsg[24];
	int ip0, ip1, ip2, ip3;
	
	digit_set[num_digits] = 0;

	/* 判断输入的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] != '#'))
	{
/*		PreserveLcdMessage = TRUE;
		LcdShowMessage(H323_INVALID_NUMBER);
		PlayBusyTone(ONE_SEC * 5);
		if (muted && mutedByTransfer)
		{
			ToggleMute();
		}
		else if (muted)
		{
			muted = (muted + 1) & 1;
			ToggleMute();
		}
	*/	return to_bidir_voice_state;
	}
	
	if (digitCollectAmount == -1 || gkEnabled)	
	{
		TransferIPAddr[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)
		{
		/*	PreserveLcdMessage = TRUE;
			LcdShowMessage(H323_INVALID_NUMBER);
			PlayBusyTone(ONE_SEC * 5);
			if (muted && mutedByTransfer)
			{
				ToggleMute();
			}
			else if (muted)
			{
				muted = (muted + 1) & 1;
				ToggleMute();
			}*/
			return to_bidir_voice_state;
		}
		TransferIPAddr[4] = 0;
		TransferIPAddr[3] = ip3;
		TransferIPAddr[2] = ip2;
		TransferIPAddr[1] = ip1;
		TransferIPAddr[0] = ip0;
		sprintf(lcdmsg,"%d.%d.%d.%d",TransferIPAddr[0], TransferIPAddr[1],
			TransferIPAddr[2], TransferIPAddr[3]);

	/*	LcdShowMessage(H323_TRANSFER_NUMBER);
		WriteLcd(lcdmsg, 1, 0 );		*/
	}

/*	if (gkEnabled)
		H323TRACE("Local e164 = %s, digit_set = %s\n",
			localE164Num, digit_set);
	else
	{
		H323TRACE("Local IP = %d.%d.%d.%d\n",
			localIPNumber[0], localIPNumber[1],localIPNumber[2],localIPNumber[3]);
		H323TRACE("Transfer ip = %d.%d.%d.%d\n",
			TransferIPAddr[0],TransferIPAddr[1],TransferIPAddr[2],TransferIPAddr[3]);
	}
*/	
	/* 如果是转接到自己,则不作处理 */
	if ((gkEnabled && (strcmp(localE164Num, digit_set) == 0))
		|| (!gkEnabled && (localIPNumber[0] == TransferIPAddr[0]
						&& localIPNumber[1] == TransferIPAddr[1]
						&& localIPNumber[2] == TransferIPAddr[2]
						&& localIPNumber[3] == TransferIPAddr[3])))
	{
	/*	ClearLcd();
		H323TRACE("Transfer to me\n");
		PreserveLcdMessage = FALSE;	
		menu_event = null_event;
		if (muted && mutedByTransfer)
		{
			ToggleMute();
		}
		else if (muted)
		{
			muted = (muted + 1) & 1;
			ToggleMute();
		}*/
		return to_bidir_voice_state;
	}		
	
	if(AppSendWrapper(WP_INITIATE_CALL_TRANSFER, callIndex) == ERROR)
	{
	#if 0
		tone_playing = receiver_off_hook_tone;
		PlayTone( receiver_off_hook_tone );
		LcdShowMessage(H323_TRANSFER_FAILED);
		menu_event = reset_event;
		
		/* 设置屏显计时器 */
		DeleteTimer(&h323_timer);
		h323_timer = CreateTimer(ONE_SEC * 5);
		if (muted && mutedByTransfer)
		{
			ToggleMute();
		}
		else if (muted)
		{
			muted = (muted + 1) & 1;
			ToggleMute();
		}
	#endif
		return to_bidir_voice_state;
	}
	else
	{
	/*	tone_playing = receiver_off_hook_tone;
		PlayTone( receiver_off_hook_tone );
*/
		/* 设置等待响应计时器 */
		/*h323_timer = THIRTY_SEC;*/
		DeleteTimer(&h323_timer);
		h323_timer = CreateTimer(CONNECT_TIME+5*ONE_SEC);
		
		return to_await_call_transfer_state;
	}
}
/**
 * 收集、记录号码
 */
int h323_collect_transfer_digits_state_digit_event(s_event* psEvent, s_task*
    psTask)
{

	if (num_digits >= MAX_PHONE_NUMBER_LEN)
	{
		return null_event;
	}
		
	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;
	}

	digit_set[num_digits] = msg->digit+'0';	
	if (digit_set[num_digits] == '0' + 10)
		digit_set[num_digits] = '*';
	else if (digit_set[num_digits] == '0' + 11)
		digit_set[num_digits] = '#';

	digit_set[num_digits+1] = '\0';

	
	DeleteTimer(&h323_timer);
	h323_timer = CreateTimer(FIFTEEN_SEC);
			
        num_digits++;	
	
	if (!gkEnabled && num_digits == digitCollectAmount/* || (msg->digit == 11)*/)
	{
		return AppCalloutTransfer();
	}
	return null_event;
}

/**
 * 提供速拨功能:
 * 若已输入的号码在电话本的号码编号范围以内,
 * 则拨出对应编号的电话号码
 */
int h323_collect_transfer_digits_state_long_digit_event(s_event* psEvent,
    s_task* psTask)
{
	return null_event;
}

/**
 * 返回忙或进行呼叫转移
 */
int h323_collect_transfer_digits_state_receive_query_availability_event(s_event*
    psEvent, s_task* psTask)
{
	wp_msg = (WrapperMsg *)psEvent->pMsg;
	AppReplyNotAvailOrFwd(wp_msg);
	return null_event;
}

/**
 * 终结terminate所指通道的通话
 */
int h323_collect_transfer_digits_state_receive_terminate_event(s_event* psEvent,
    s_task* psTask)
{
	wp_msg = (WrapperMsg *) psEvent->pMsg;

	if (callIndex != wp_msg->baseInfo.callIndex)
	{
		return null_event;
	}
	
	/* 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;
	
}

/**
 * 播放转接音(ringback_tone);
 * 发送WP_INITIATE_CALL_TRANSFER;
 * 若出错产生to_bidir_voice_state事件
 */
int h323_collect_transfer_digits_state_callout_key_event(s_event* psEvent,
    s_task* psTask)
{
	return AppCalloutTransfer();
}

/**
 * 播放转接音(ringback_tone);
 * 发送WP_INITIATE_CALL_TRANSFER;
 * 若出错产生to_bidir_voice_state事件
 */
int h323_collect_transfer_digits_state_timeout_event(s_event* psEvent, s_task*
    psTask)
{
	msg = (NonWrapperMsg *)psEvent->pMsg;
	if ((msg->digit != h323_timer) && (msg->digit != call_forward_timer))
		return null_event;
	/* 计时器清零 */
	h323_timer = -1;

	starting_transfer = FALSE;
/*	if (muted && mutedByTransfer)
	{
		ToggleMute();
		mutedByTransfer = 0;
	}*/
	return to_bidir_voice_state;
}

/**
 * 返回初始状态
 */
int h323_collect_transfer_digits_state_local_on_hook_event(s_event* psEvent,
    s_task* psTask)
{
	AppTerminateAction( ST_H323_COLLECT_TRANSFER_DIGITS_STATE );	
	return null_event;
}

/**
 * 已输入的号码向前清除一位
 */
int h323_collect_transfer_digits_state_cancel_key_event(s_event* psEvent,
    s_task* psTask)
{	

	digit_set[--num_digits] = '\0';
/*	
	if (num_digits > LCD_WIDTH)
	{
		ClearLcd();
		WriteLcd(digit_set, 0, 0);
		LcdDShowCursor(TRUE);
		return null_event;
	}*/	
/*	LcdShowMessage(H323_TRANSFER_NUMBER);
	WriteLcd(digit_set, 1, 0);
	LcdDShowCursor(TRUE);
*/	
	if (num_digits == 0)
	{		
		return to_wait_first_digit_state;		
	}
	
	return null_event;
}

/**
 * 清空所有输入的内容,
 * 回到wait_first_digit_state状态
 */
int h323_collect_transfer_digits_state_long_cancel_key_event(s_event* psEvent,
    s_task* psTask)
{
	return null_event;
}

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

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

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

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


/**
 * 返回忙或进行呼叫转移
 */
int h323_await_call_transfer_state_receive_query_availability_event(s_event*
    psEvent, s_task* psTask)
{
	wp_msg = (WrapperMsg *)psEvent->pMsg;
	AppReplyNotAvailOrFwd(wp_msg);
	return null_event;
}


/**
 * call transfer initiate result received
 * 修改CT全局量,保持原状态,等待终结
 */
int h323_await_call_transfer_state_ct_init_result_rcvd(s_event* psEvent, s_task*
    psTask)
{
	wp_msg = (WrapperMsg *)psEvent->pMsg;
	if (callIndex != wp_msg->baseInfo.callIndex)
	{
		return null_event;
	}

	/* 通知菜单复位 */
/*	menu_event = reset_event; */

/*	recordCallTime();*/
	AppTerminateAction( ST_H323_AWAIT_CALL_TRANSFER_STATE );
/*	PlayBusyTone(FIFTEEN_SEC);*/
	return to_dead_end_state;
}

/**
 * 终结terminate所指通道的通话,产生to_bir_voice_state或to_dead_end_state
 */
int h323_await_call_transfer_state_receive_terminate_event(s_event* psEvent,
    s_task* psTask)
{
	wp_msg = (WrapperMsg *)psEvent->pMsg;
	if (callIndex != wp_msg->baseInfo.callIndex)
	{
		return null_event;
	}

	/* 通知菜单复位 */
/*	menu_event = reset_event;*/

/*	recordCallTime();*/
	AppTerminateAction( ST_H323_AWAIT_CALL_TRANSFER_STATE );
/*	PlayBusyTone(FIFTEEN_SEC);*/
	return to_dead_end_state;
}

/**
 * 终止CT,产生to_bidir_voice_state
 */
int h323_await_call_transfer_state_timeout_event(s_event* psEvent, s_task*
    psTask)
{
	msg = (NonWrapperMsg *)psEvent->pMsg;
	if ((msg->digit != h323_timer) && (msg->digit != call_forward_timer))
		return null_event;
	/* 未进入菜单 */

/*	recordCallTime();*/
	AppTerminateAction(ST_H323_AWAIT_CALL_TRANSFER_STATE);
/*	PlayBusyTone(FIFTEEN_SEC);*/
	return to_dead_end_state;
}

/**
 * 发送WP_CALL_TRANSFER_ABANDON至“C”;
 * terminate“B”
 */
int h323_await_call_transfer_state_local_on_hook_event(s_event* psEvent, s_task*
    psTask)
{
	/* 设置计时器 */
	DeleteTimer(&h323_timer);
	h323_timer = CreateTimer(ONE_SEC * 5);

/*	recordCallTime();*/
	AppTerminateAction( ST_H323_AWAIT_CALL_TRANSFER_STATE );
/*	menu_event = reset_event;*/
	return null_event;
}

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

	return null_event;
}

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

	return null_event;
}

/*
int copyStrSafely(char *dst, char *src, int len)
{
	strncpy(dst, src, len);
	dst[len] = '\0';
	if (strlen(src) < len)
	{		
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}
*/

/**********************************************/

/* 等待第一次拨号超时或按拨出键,
 * 则直接拨出待机时已输入号码
 */





⌨️ 快捷键说明

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