?? h323f.cpp
字號:
/************************************************************************
*
* 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 + -