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

📄 复件 (2) h323f.cpp

📁 基于h323协议的软phone
💻 CPP
📖 第 1 页 / 共 5 页
字号:
 * 允许接收,发送WP_SEND_AVA消息并播放铃声;
 * 否则,设置无应答转移计时器
 */
int h323_on_hook_state_receive_query_availability_event(s_event* psEvent, s_task* psTask)
{
	H323TRACE("action: h323_on_hook_state_receive_query_availability_event\n");
	
	wp_msg = (WrapperMsg *) psEvent->pMsg;
	callIndex = wp_msg->baseInfo.callIndex;

	/*H323TRACE("call index = %d\n", callIndex);*/

	appCallInfo[callIndex].used = 1;
	appCallInfo[callIndex].ipAddr[3] = wp_msg->baseInfo.remoteIpAddr>> 24;
	appCallInfo[callIndex].ipAddr[2] = (wp_msg->baseInfo.remoteIpAddr >> 16) & 0xFF;
	appCallInfo[callIndex].ipAddr[1] = (wp_msg->baseInfo.remoteIpAddr >> 8) & 0xFF;
	appCallInfo[callIndex].ipAddr[0] = wp_msg->baseInfo.remoteIpAddr & 0xFF;
	strncpy(appCallInfo[callIndex].display, 
		wp_msg->baseInfo.display, MAX_DISPLAY_LENGTH);
	appCallInfo[callIndex].display[MAX_DISPLAY_LENGTH] = '\0';
	strncpy(appCallInfo[callIndex].h323Id, 
		wp_msg->baseInfo.remoteH323Id, MAX_H323ID_LENGTH);
	appCallInfo[callIndex].h323Id[MAX_H323ID_LENGTH] = '\0';
	strncpy(appCallInfo[callIndex].e164Num, 
		wp_msg->baseInfo.remoteE164Num, MAX_E164NUM_LENGTH);
	appCallInfo[callIndex].e164Num[MAX_E164NUM_LENGTH] = '\0';

	/* 未接来电指示灯闪亮 */
	SetLed(LED_SPKR, led_inverse_wink );
	
	AppGetForwardConfig();	

	/* 处理允许无条件转移的情况 */
	if(ForwardUncond)
	{
		char temp[MAX_PHONE_NUMBER_LEN+1];
		sprintf(temp, "*%03d%03d%03d%03d", localIPNumber[0], localIPNumber[1],
			localIPNumber[2], localIPNumber[3]);
		/* 前转号码若为本机则不做处理 */
		if ((!gkEnabled && (strcmp(temp, ForwardNumberUncond) != 0))
			||(gkEnabled && (strcmp(localE164Num, ForwardNumberUncond) != 0)))
		{	
			AppSendCallForward(callIndex, 
				ForwardNumberUncond, ForwardNumberUncondType);
			/* 未接来电指示灯灭 */		
			SetLed(LED_SPKR, led_off );	
			return to_on_hook_state;
		}
	}
	
	/* 响应呼叫方,发送AVA 消息 */
	AppSendWrapper( WP_SEND_AVA, callIndex );
		
	/* 显示来电信息 */
	SetRemoteNumber(appCallInfo[callIndex].e164Num);
	SetRemoteName(appCallInfo[callIndex].display, appCallInfo[callIndex].e164Num);
	
	ClearLcd();
	if (gkEnabled)
		LcdShowRemote(dig_id, remoteNumber, strlen(remoteNumber), remoteName, 
			(transferred_flag ? FLAG_TRANSFERRED : forwarded_flag ? FLAG_FORWARDED :FLAG_NORMAL));
	else
		LcdShowRemote(ip_id, appCallInfo[callIndex].ipAddr, 4, remoteName, 
			(transferred_flag ? FLAG_TRANSFERRED : forwarded_flag ? FLAG_FORWARDED :FLAG_NORMAL));		

	/* 播放来电铃音 */
	StopTone();
        //chenguoyin
	bufferStopTone();   
	PlayRing();
        //chenguoyin
	bufferPlayTone();
	canStopRingInMenu = FALSE;
	
	/*H323TRACE("Going to ringing_state\n");		*/

	if(ForwardNoResponse)
	{			
		DeleteTimer(&h323_timer);
		h323_timer = CreateTimer(ONE_SEC * phoneconfig.conf_forward.interval);			
	}	
	else
	{
		DeleteTimer(&h323_timer);
		h323_timer = CreateTimer(CONNECT_TIME);
	}
	return null_event;           
}

int h323_on_hook_state_to_ringing_state(s_event* psEvent, s_task* psTask)
{
	H323TRACE("action: h323_on_hook_state_to_ringing_state\n");
	return null_event;
}

/**
 *  终结,回到初始状态 
 */
int h323_on_hook_state_local_on_hook_event(s_event* psEvent, s_task* psTask)
{
	H323TRACE("action: h323_on_hook_state_local_on_hook_event\n");
	menu_event = null_event;
	return null_event;
}

/**
 * 终结terminate所指通道的通话
 * AppTerminateAction()
 */
int h323_on_hook_state_receive_terminate_event(s_event* psEvent, s_task* psTask)
{
	H323TRACE("action: h323_on_hook_state_receive_terminate_event\n");
	/*wp_msg = (WrapperMsg *) psEvent->pMsg;
	PreserveLcdMessage = TRUE; 	
	AppTerminateAction( ST_H323_ON_HOOK_STATE );*/
	/*设置屏显计时器,超时则LCD清屏 */
	/*DeleteTimer(&h323_timer);
	h323_timer = CreateTimer(ONE_SEC * 5);*/
	return null_event;
}


/**
 * 超时处理:LCD清屏、计时器复位
 */
int h323_on_hook_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;

	H323TRACE("action: h323_on_hook_state_timeout_event\n");
	
	StopTone();
        //chenguoyin
	bufferStopTone();

	PreserveLcdMessage = FALSE;
	h323_timer = -1;
	digit_set[0] = '\0';
	num_digits = 0;
	return null_event;
}

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

	if (toAddr[0] == '\0' && num_digits == 0)
		return to_on_hook_state;

	/* 打开免提 */
	SetSpeakerphone(TRUE);
	on_speakerphone = TRUE;
	SetLed(LED_SPKR, led_steady_on );

	return AppCalloutDirect();
}

/**
 * 速拨功能
 */
int h323_on_hook_state_long_digit_event(s_event* psEvent, s_task* psTask)
{
	H323TRACE("action: h323_on_hook_state_long_digit_event\n");

	if (toAddr[0] == '\0' && num_digits == 0)
		return to_on_hook_state;

	if (SearchSpeedDialNumber(toAddr) == 0)
	{
		return null_event;
	}

	H323TRACE("digit_set = %s\n", digit_set);

	/* 打开免提 */
	SetSpeakerphone(TRUE);
	on_speakerphone = TRUE;
	SetLed(LED_SPKR, led_steady_on );

	PreserveLcdMessage = TRUE;
	
	return AppCalloutDirect();	
}

int h323_on_hook_state_to_dead_end_state(s_event* psEvent, s_task* psTask)
{
	H323TRACE("action: h323_on_hook_state_to_dead_end_state\n");
	return null_event;
}

int h323_on_hook_state_to_query_availability_state(s_event* psEvent, s_task*
    psTask)
{
	H323TRACE("action: h323_on_hook_state_to_query_availability_state\n");
	PreserveLcdMessage = FALSE;
	return null_event;
}

int h323_on_hook_state_to_wait_for_connect_state(s_event* psEvent, s_task*
    psTask)
{
	H323TRACE("action: h323_on_hook_state_to_wait_for_connect_state\n");
	return null_event;
}

/**
 * 返回忙或进行呼叫转移
 */
int h323_wait_first_digit_state_receive_query_availability_event(s_event*
    psEvent, s_task* psTask)
{
	H323TRACE("action: h323_wait_first_digit_state_receive_query_availability_event\n");

	wp_msg = (WrapperMsg *) psEvent->pMsg;
	AppReplyNotAvailOrFwd(wp_msg);
	return null_event;
}

/**
 * 终结terminate所指通道的通话
 */
int h323_wait_first_digit_state_receive_terminate_event(s_event* psEvent,
    s_task* psTask)
{
	H323TRACE("action: h323_wait_first_digit_state_receive_terminate_event\n");
	
	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)
	{
		/* 未进入菜单 */
		if (!(*menu_inuse))
		{
			PreserveLcdMessage = TRUE;
			if(wp_msg->reason == cmCallStateModeDisconnectedNormal)
			{	
				LcdShowMessage(H323_REMOTE_HUNG_UP_THE_CALL);
			}
			else
			{			
				LcdShowMessage(H323_UNKNOWN_ERROR);				
			}
		}		
		recordCallTime();
		AppTerminateAction( ST_H323_COLLECT_TRANSFER_DIGITS_STATE );
		PlayBusyTone(FIFTEEN_SEC);
		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)
{
	H323TRACE("action: h323_wait_first_digit_state_digit_event\n");
	/* 若已进入菜单,不接收按键号码,退出该事件处理 */
	if (*menu_inuse)
		menu_event = reset_event;
		
	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;		
	}		
}

/**
 * 等待第一次拨号超时,停止等待
 */
int h323_wait_first_digit_state_timeout_event(s_event* psEvent, s_task* psTask)
{
	H323TRACE("action: h323_wait_first_digit_state_timeout_event\n");

	msg = (NonWrapperMsg *)psEvent->pMsg;
	if ((msg->digit != h323_timer) && (msg->digit != call_forward_timer))
		return null_event;
	
	h323_timer = -1;
	if(starting_transfer)   /* just cancel the transfer */
	{		
		H323TRACE("Time out: wait first transfer digit cancelld\n");
		starting_transfer = FALSE;
		if (muted && mutedByTransfer)
		{
			ToggleMute();
			mutedByTransfer = 0;
		}
		return to_bidir_voice_state;
	}
	else
	{
		/* 等待拨号超时,拨出已输入号码 */
		return AppCalloutDirect();
	}	
}

/**
 * 拨出当前屏显的号码,记录拨出电话;
 * 产生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)
{	
	if (starting_transfer)
		return null_event;
	
	if (toAddr[0] == '\0' && num_digits == 0)
	{
		H323TRACE("action: h323_wait_first_digit_state_redial_key_event\n");
		strncpy(digit_set, outgoingcall[0].number,MAX_PHONE_NUMBER_LEN);
		digit_set[MAX_PHONE_NUMBER_LEN]='\0';
		return RedialKey(1);
	}
	H323TRACE("action: h323_wait_first_digit_state_callout_key_event\n");
	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)
{
	int numberIndex = -1;

	if (starting_transfer)
		return null_event;
	
	H323TRACE("action: h323_wait_first_digit_state_speed_dial_key_event\n");

	msg = (NonWrapperMsg *) psEvent->pMsg;
	numberIndex = phoneconfig.conf_speedDial[msg->digit - 1];
	if (numberIndex < 0 || numberIndex > MAX_PHONE_BOOK - 1)
		return null_event;
	
	if ((phonebook[numberIndex].number[0] != '\0'))
	{
		strncpy(digit_set, phonebook[numberIndex].number,MAX_PHONE_NUMBER_LEN);
		digit_set[MAX_PHONE_NUMBER_LEN]='\0';
		return RedialKey(2);
	}	
	return null_event;
}

/**
 * 若是Cll Transfer,返回通话状态
 */
int h323_wait_first_digit_state_cancel_key_event(s_event* psEvent, s_task*
    psTask)
{
	H323TRACE("action: h323_wait_first_digit_state_cancel_key_event\n");
	if (starting_transfer)
	{
		H323TRACE("Collect transfer cancelled, back to voice state\n");
		starting_transfer = FALSE;
		if (muted && mutedByTransfer)
		{
			ToggleMute();
			mutedByTransfer = 0;
		}
		return to_bidir_voice_state;
	}
	return null_event;
}

/**
 * 终结,回到初始状态
 */
int h323_wait_first_digit_state_local_on_hook_event(s_event* psEvent, s_task*
    psTask)
{
	H323TRACE("action: h323_wait_first_digit_state_local_on_hook_event\n");
	
	/* 若为免提状态,状态不变 */
	if (on_speakerphone == TRUE)
		return to_wait_first_digit_state;

	if (starting_transfer)
	{
		recordCallTime();
		AppTerminateAction(ST_H323_COLLECT_TRANSFER_DIGITS_STATE);
	}
	else
	{
		AppTerminateAction( ST_H323_WAIT_FIRST_DIGIT_STATE );
	}
	
	menu_event = reset_event;

⌨️ 快捷键说明

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