Last active
May 12, 2018 04:06
-
-
Save theKashey/93f10d036961f4bd7dd728153bc4bea9 to your computer and use it in GitHub Desktop.
EDSS(Q.931 line), xState, 2005 year. C + Lua => C
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "stdafx.h" | |
#include "l2_lapd.h" | |
@require "mpx.lua" | |
@include "../siglib/sys_signals.hh" | |
#include "../siglib/release_types.h" | |
//lua function RR(a)return a;end; | |
//lua function CL(a)return a;end; | |
#define CS_CALL_CLEAR 0 | |
static LPCSTR EDSS_TIMER_NAME[]= | |
{ | |
"T301", | |
"T302", | |
"T303", | |
"T304", | |
"T305", | |
"T306", | |
"T308", | |
"T309", | |
"T310", | |
"T313", | |
"T314", | |
"T316", | |
"T317", | |
"T318", | |
"T319", | |
"T321", | |
"T322" | |
}; | |
static WORD EDSS_TIMER_INFO[]= | |
{ | |
(1),// EDSS_T301 | |
(15),// EDSS_T302 | |
(30),// EDSS_T303 | |
(15),// EDSS_T304 | |
(4),// EDSS_T305 | |
(30),// EDSS_T306 | |
(4),// EDSS_T308 | |
(90),// EDSS_T309 | |
(20),// EDSS_T310 | |
(4),// EDSS_T313 | |
(4),// EDSS_T314 | |
(120),// EDSS_T316 | |
(90),// EDSS_T317 | |
(4),// EDSS_T318 | |
(4),// EDSS_T319 | |
(30),// EDSS_T321 | |
(4),// EDSS_T322 | |
}; | |
#define EDT_SET2CP T0+0 | |
#define EDSS_RELTIMER T1 | |
#define EDSS_T303 T0+2 | |
#define EDSS_T304 T0+3 | |
#define EDSS_T305 T0+4 | |
#define EDSS_T306 T0+5 | |
#define EDSS_T308 T0+6 | |
#define EDSS_T309 T0+7 | |
#define EDSS_T310 T0+8 | |
#define EDSS_T313 T0+9 | |
#define EDSS_T314 T0+10 | |
#define EDSS_T316 T0+11 | |
#define EDSS_T317 T0+12 | |
#define EDSS_T318 T0+13 | |
#define EDSS_T319 T0+14 | |
#define EDSS_T321 T0+15 | |
#define EDSS_T322 T0+16 | |
@BEGIN_DECLARE_PROCESS(EDSS_LINE,"EDSS LINE") | |
@FIELD(WORD,CallID ,"CallID") | |
@FIELD(WORD,Orginate ,"Orginate") | |
@FIELD(PWORD,TimerTimeOut,"Timers timeout") | |
@FIELD(char,Calling[0xFF],"Call number") | |
@FIELD(char,Called[0xFF] ,"Self number") | |
@FIELD(BYTE,BChannel ,"Used bchannel"); | |
@FIELD(WORD,AdTalking ,"SipAD i am talking with"); | |
@FIELD(WORD,DAdTalking ,"SipAD i am talking with"); | |
@FIELD(BYTE,LinkedWith ,"Have sip twin"); | |
@FIELD(struct CF_Connect, ConnectData," holds connect data"); | |
@FIELD(WORD,BreakOnSetup,"break on setup(due to lo channels)"); | |
@FIELD(enum CF_ReleaseType,BREAK_REASON,"reason break"); | |
@FIELD(WORD,TractReady,"is voicetract ready"); | |
@FIELD(WORD,VoiceConnected,"is voice on"); | |
@FIELD(WORD,TONP,"TractOnEvent bitmask"); | |
@FIELD(WORD,EnableDTMF,"Enable DTMF on request"); | |
@FIELD(time_t,StartTime,"TalkStartTime"); | |
@FIELD(WORD,DelayAlertTimer,"Delay alert timer"); | |
@END_DECLARE_PROCESS() | |
@BEGIN_CONTEXT_TRACE() | |
LPCSTR oREMOTE="REMOTE"; | |
LPCSTR oTHIS ="THIS"; | |
@XML_TRACE("CallID","%s|%d",(@THIS()->Orginate?oREMOTE:oTHIS),@THIS()->CallID); | |
@XML_TRACE("Calling","%s",@THIS()->Calling); | |
@XML_TRACE("Called","%s",@THIS()->Called); | |
@XML_TRACE("BChannel","%d",@THIS()->BChannel); | |
@XML_TRACE("AdTalking","%d",@THIS()->AdTalking); | |
@XML_TRACE("BreakOnSetup","%d",@THIS()->BreakOnSetup); | |
@XML_TRACE("VConn","%d",@THIS()->VoiceConnected); | |
@XML_TRACE("TractReady","%d",@THIS()->TractReady); | |
PrintAddr(siptmpBuf, @THIS()->ConnectData.Addr); | |
@XML_TRACE("connect addr", "%s:%d", siptmpBuf, @THIS()->ConnectData.Port) | |
@XML_TRACE("LinkedWith","%d",@THIS()->LinkedWith); | |
@END_CONTEXT_TRACE() | |
@BEGIN_DECLARE_STATES() | |
// General states | |
@DEFINE_STATE(EMPTY ,"empty") | |
@DEFINE_STATE(LOCKED ,"LOCKED"); | |
@DEFINE_STATE(S_U0,"UO Idle State") | |
@DEFINE_STATE(S_U1,"U1 Call initiated") | |
@DEFINE_STATE(S_U2,"U2 Overlap sending") | |
@DEFINE_STATE(S_U3,"U3 Outgoing call proceeding") | |
@DEFINE_STATE(S_U4,"U4 Call delivered") | |
@DEFINE_STATE(S_U5,"U5 Call present") | |
@DEFINE_STATE(S_U6,"U6 BAD STATE") | |
@DEFINE_STATE(S_U7,"U7 Call resived") | |
@DEFINE_STATE(S_U8,"U8 Connect request") | |
@DEFINE_STATE(S_U9,"U9 Incoming Call Proceeding") | |
@DEFINE_STATE(S_S1O,"U10 Active") | |
@DEFINE_STATE(S_U11,"U11 Disconnect Request") | |
@DEFINE_STATE(S_U12,"U12 Disconnect Indication") | |
@DEFINE_STATE(S_U13,"U13") | |
@DEFINE_STATE(S_U14,"U14") | |
@DEFINE_STATE(S_U15,"U15 Suspend Request") | |
@DEFINE_STATE(S_U16,"U16") | |
@DEFINE_STATE(S_U17,"U17 Resume Request") | |
@DEFINE_STATE(S_U18,"U18") | |
@DEFINE_STATE(S_U19,"U19 Release Request") | |
@DEFINE_STATE(S_U2O,"U2O") | |
@DEFINE_STATE(S_U21,"U21") | |
@DEFINE_STATE(S_U22,"U22 Call Abort") | |
@DEFINE_STATE(S_U23,"U23") | |
@DEFINE_STATE(S_U24,"U24") | |
@DEFINE_STATE(S_U25,"U25 Overlap Receiving") | |
@END_DECLARE_STATES() | |
static void ClearThisLine(BOOL WithTimers) | |
{ | |
if(WithTimers) | |
@RESET_ALL_TIMERS(); | |
@THIS()->TimerTimeOut=EDSS_TIMER_INFO; | |
@THIS()->LinkedWith=0; | |
@THIS()->AdTalking=@THIS()->DAdTalking; | |
strcpy(@THIS()->Called ,"-"); | |
strcpy(@THIS()->Calling,"-"); | |
@THIS()->ConnectData.Port=0; | |
if(shedule_pCurBaseContext) | |
@SET_STATE(EMPTY); | |
@THIS()->BREAK_REASON=Release_Normal; | |
} | |
#define TUA_PROCEDING 1 | |
#define TUA_ALLERTING 2 | |
#define TUA_PROGRESS 4 | |
@BEGIN_CALL_CONTEXT() | |
switch(@CODE()) | |
{ | |
case GET_TRACTFLAG: | |
*((long*)@PBUF()) = @THIS()->TONP; | |
return ERROR_noError; | |
case SET_TRACTFLAG: | |
@THIS()->TONP = (WORD) *((long*)@PBUF()); | |
return ERROR_noError; | |
case GET_LineStatState: | |
if(@GET_STATE()!=@STATE(EMPTY)) | |
{ | |
*((long*)@PBUF())=@THIS()->Orginate?3:2; | |
if(@GET_STATE()==@STATE(S_S1O))*((long*)@PBUF())=4; | |
} | |
else *((long*)@PBUF())=1; | |
//printf("GET_LineStatState\n"); | |
return ERROR_noError; | |
case GET_LineStatInCallerID: | |
strcpy((LPSTR)@PBUF(),@THIS()->Calling); | |
return ERROR_noError; | |
case GET_LineStatOutCallerID: | |
strcpy((LPSTR)@PBUF(),@THIS()->Called); | |
//printf("GET_LineStatOutCallerID\n"); | |
return ERROR_noError; | |
case GET_LineStatTimeStart: | |
{ | |
time_t cur_t; | |
struct tm* tt; | |
time(&cur_t); | |
cur_t-=@THIS()->StartTime; | |
tt = localtime(&cur_t); | |
sprintf((LPSTR)@PBUF(), "%.2d:%.2d:%.2d", tt->tm_hour, tt->tm_min, tt->tm_sec); | |
return ERROR_noError; | |
} | |
} | |
return ERROR_noSuchName; | |
@END_CALL_CONTEXT() | |
@BEGIN_INIT_CONTEXT() | |
@THIS()->EnableDTMF=1; | |
@THIS()->DAdTalking=5; | |
@THIS()->TONP=TUA_ALLERTING; | |
ClearThisLine(FALSE); | |
@SET_STATE(EMPTY); | |
@THIS()->DelayAlertTimer=0; | |
@END_INIT_CONTEXT() | |
static void FLOWMESSAGE(struct EDSS_MESSAGE *Sig); | |
static void SendLayerMessage(struct EDSS_MESSAGE *Message); | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSIG_RESTART,LOCKED) | |
{ | |
#define IS_REQ (@PEVENT()->Message->Request) | |
#define RMSG (@PEVENT()->Message) | |
#define GET_MIE(a) (GET_MESSAGE_IE(@PEVENT()->Message,a)) | |
#define OUTMESSAGE(m,a) struct EDSS_MESSAGE m;ConstructMessage(&m,@THIS()->CallID,@THIS()->Orginate,a,@THIS()) | |
} | |
@END_DECLARE_SIGNAL_ACTION() | |
@include "ed_line_sys.cc"; | |
static void OnRestartCondition(const struct ED_SIG_MESSAGE *Sig,struct EDSS_MESSAGE *m) | |
{ | |
WORD RII; | |
RII=DECODE__EDSS_IE_CODE_RESTART_INDICATOR(GET_MESSAGE_IE(Sig->Message,EDSS_IE_CODE_RESTART_INDICATOR)); | |
{ | |
@SIGNAL(ED_BCHAN_CTL,bcl); | |
bcl->From =0xFF; | |
bcl->Use =0; | |
if(RII==RII_ALL || RII==RII_SINGLE) | |
{ | |
bcl->BChanID =0xFF; | |
@SEND(bcl); | |
} | |
else | |
{ | |
struct EDSS_IE_DEF *IE=0; | |
while(IE=GET_MESSAGE_IE_EX(Sig->Message,EDSS_IE_CODE_RESTART_INDICATOR,IE)) | |
{ | |
if(m) | |
APPENDM(m,IE); | |
bcl->BChanID =DECODE__EDSS_IE_CODE_CHANEL_ID(IE); | |
@SEND(bcl); | |
} | |
} | |
} | |
} | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSIG_RESTART) | |
@NEED_ACTION() | |
if(IS_REQ) | |
{ | |
SendLayerMessage(RMSG); | |
} | |
else | |
{ | |
OUTMESSAGE(m,EDSS_MSG_CODE_RESTART_ACK); | |
//first - ask same | |
APPENDM(&m,GET_MIE(EDSS_IE_CODE_RESTART_INDICATOR)); | |
OnRestartCondition(@PEVENT(),&m); | |
//n send | |
FLOWMESSAGE(&m); | |
} | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSIG_RESTART_ACK) | |
if(IS_REQ) | |
SendLayerMessage(RMSG); | |
else | |
//SEND_Release(0); | |
{ | |
OnRestartCondition(@PEVENT(),0); | |
} | |
KILLSELF(); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(KL_START) | |
ClearThisLine(TRUE); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(KL_STOP) | |
ClearThisLine(TRUE); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSIG_SETUP,S_U0) | |
if(IS_REQ) | |
{ | |
SendLayerMessage(RMSG); | |
StartTimer(EDSS_T303); | |
@SET_STATE(S_U1); | |
} | |
else | |
{ | |
//Indication(EDSS_SETUP_IND,@PEVENT()); | |
OnSetupLine(@PEVENT()); | |
//StartTimer(EDSS_T303); | |
@SET_STATE(S_U1); | |
} | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSIG_SETUP) | |
@TRACE_OFF_FLAG() | |
@TRACE("GOT SECOND SETUP.. ignore") | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSIG_DISCONNECT) | |
UpBreak(); | |
if(IS_REQ) | |
{ | |
SendLayerMessage(RMSG); | |
@SET_STATE(S_U11); | |
StartTimer(EDSS_T305); | |
} | |
else | |
{ | |
ReleaseLink(CS_CALL_CLEAR); | |
@SET_STATE(S_U12); | |
} | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSIG_STATUS) | |
if(@THIS()->CallID)SEND_ReleaseCmp(); | |
KILLSELF(); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSIG_RELEASE) | |
UpBreak(); | |
if(IS_REQ) | |
{ | |
SendLayerMessage(RMSG); | |
StopTimer(EDSS_T305); | |
StartTimer(EDSS_T308); | |
@SET_STATE(S_U19); | |
} | |
else | |
{ | |
SEND_ReleaseCmp(); | |
KILLSELF(); | |
} | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSS_T305) // WHERE WAS NO ASK FOR DISCONNECT | |
if(@GET_STATE()==@STATE(S_U11)) | |
{ | |
ReleaseLink(0); | |
/*OUTMESSAGE(m,EDSS_MSG_CODE_CALL_PROCEEDING); | |
APPENDM(&m,CONSTRUCT__EDSS_IE_CODE_CHANEL_ID(@THIS()->BChannel)); | |
INJECT(&m); | |
*/ | |
} | |
else | |
{ | |
@TRACE("T305(DISC) ENDS IN WRONG STATE.AND HOW IT HAPENDS?"); | |
} | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSS_T308)// WHERE WAS NO ASK FOR RELEASE | |
if(@GET_STATE()==@STATE(S_U19)) | |
{ | |
SEND_ReleaseCmp(); | |
KILLSELF(); | |
} | |
else | |
{ | |
@TRACE("T308(RELEASE) ENDS IN WRONG STATE.AND HOW IT HAPENDS?"); | |
} | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSIG_RELEASE_COMPLETE) | |
@SET_TIMER(EDSS_RELTIMER,0) | |
if(IS_REQ) | |
{ | |
SendLayerMessage(RMSG); | |
} | |
else | |
{ | |
} | |
KILLSELF(); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(CF_SETUP,LOCKED) | |
@THIS()->AdTalking=@AD(); | |
@THIS()->LinkedWith=1; | |
if(@THIS()->BreakOnSetup) | |
{ | |
KILLSELF(); | |
return; | |
} | |
@SET_STATE(S_U0); | |
{ | |
// Запрашиваем преобразование номера | |
@SIGNAL(RT_REPLACE_RQ, rq); | |
rq->Hook = 100; | |
strcpy(rq->Set, @PEVENT()->To); | |
strcpy(@THIS()->Calling, @PEVENT()->To); | |
@NEXT_SYNC() | |
} | |
SetupLine(@PEVENT()->From,@THIS()->Calling,1); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(RT_REPLACED) | |
strcpy(@THIS()->Calling, @PEVENT()->Set); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(RT_NOTRESOLVED) | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(RT_NOTCOMPLETED) | |
StopTimer(EDT_SET2CP); | |
OUTMESSAGE(m,EDSS_MSG_CODE_SETUP_ACK); | |
//APPENDM(&m,CONSTRUCT__EDSS_IE_CODE_CHANEL_ID(@THIS()->BChannel)); | |
FLOWMESSAGE(&m); | |
//StopTimer(EDSS_T304); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(CF_SETUP) | |
@THIS()->AdTalking=@AD(); | |
@THIS()->LinkedWith=1; | |
@TRACE("EDL:line%d got CF_SETUP not in LOCKED state",@CONTEXT()); | |
KILLSELF(); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSS_RELTIMER)//,LOCKED) | |
SEND_ReleaseCmp(); | |
KILLSELF(); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(CF_RELEASE) | |
@TRACE("incoming release"); | |
LineBreakRelease(); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(CF_TRYNING) | |
OUTMESSAGE(m,EDSS_MSG_CODE_CALL_PROCEEDING); | |
APPENDM(&m,CONSTRUCT__EDSS_IE_CODE_CHANEL_ID(@THIS()->BChannel)); | |
FLOWMESSAGE(&m); | |
StopTimer(EDSS_T304); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(CF_COMPLETED) | |
OUTMESSAGE(m,EDSS_MSG_CODE_CALL_PROCEEDING); | |
APPENDM(&m,CONSTRUCT__EDSS_IE_CODE_CHANEL_ID(@THIS()->BChannel)); | |
FLOWMESSAGE(&m); | |
StopTimer(EDSS_T304); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(CF_NOTCOMPLETED) | |
OUTMESSAGE(m,EDSS_MSG_CODE_SETUP_ACK); | |
SendLayerMessage(&m); | |
if(@THIS()->EnableDTMF) | |
ToneCTL(EDT_DTMF_ON); | |
StartTimer(EDSS_T304); | |
@SET_STATE(S_U2); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSS_T304) // dial time ends. no number assepted | |
@TRACE("dial time ends. no number assepted"); | |
KILLSELF(); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSIG_SETUP_ACK) | |
@SIGNAL(CF_NOTCOMPLETED,nc); | |
@SEND(nc,@THIS()->AdTalking) | |
@SET_STATE(S_U2); | |
//ToneCTL(EDT_DTMF_ON); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSIG_PROGRESS) | |
@SIGNAL(CF_PROGRESS,nc); | |
@SEND(nc,@THIS()->AdTalking) | |
TryUpTransfer(TUA_PROGRESS); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSIG_INFORMATION) | |
struct EDSS_IE_DEF *CN=GET_MESSAGE_IE(@PEVENT()->Message,EDSS_IE_CODE_CALLED_PARTY_NUM); | |
if(CN) | |
{ | |
LPCSTR To; | |
@SIGNAL(CF_DIGITS,dg); | |
To =DECODE__EDSS_IE_CODE_CALLED_PARTY_NUM(CN); | |
strcpy(dg->Set,To); | |
@SEND(dg,@THIS()->AdTalking); | |
RestartTimer(EDSS_T304); | |
} | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(CF_DIGITS) | |
if(@AD()==8) | |
{ | |
@SIGNAL(CF_DIGITS,dg); | |
memcpy(dg,@PEVENT(),sizeof(*dg)); | |
@SEND(dg,@THIS()->AdTalking); | |
return; | |
} | |
if(strlen(@PEVENT()->Set)==1 && *(@PEVENT()->Set)=='#') | |
{ | |
} | |
else | |
{ | |
OUTMESSAGE(m,EDSS_MSG_CODE_INFORMATION); | |
strcat(@THIS()->Calling,@PEVENT()->Set); | |
APPENDM(&m,CONSTRUCT__EDSS_IE_CODE_CALLED_PARTY_NUM(@PEVENT()->Set)); | |
SendLayerMessage(&m); | |
} | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(CF_QUEUED) | |
OUTMESSAGE(m,EDSS_MSG_CODE_ALERTING); | |
SendLayerMessage(&m); | |
TryUpTransfer(TUA_ALLERTING); | |
ToneCTL(EDT_TONE_QUE); | |
@SET_STATE(S_U4); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(CF_RINGING) | |
OUTMESSAGE(m,EDSS_MSG_CODE_ALERTING); | |
SendLayerMessage(&m); | |
TryUpTransfer(TUA_ALLERTING); | |
ToneCTL(EDT_TONE_RNG); | |
StopTimer(EDSS_T304); | |
@SET_STATE(S_U4); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(CF_PROGRESS) | |
OUTMESSAGE(m,EDSS_MSG_CODE_PROGRESS); | |
SendLayerMessage(&m); | |
TryUpTransfer(TUA_PROGRESS); | |
StopTimer(EDSS_T304); | |
//ToneCTL(EDT_TONE_RNG); | |
//SET_STATE(S_U4); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(CF_ANSWER) | |
OUTMESSAGE(m,EDSS_MSG_CODE_CONNECT); | |
SendLayerMessage(&m); | |
StopTimer(EDSS_T304); | |
@SET_STATE(S_S1O); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSIG_ALERTING) | |
@SIGNAL(CF_RINGING,cfs); | |
@SEND(cfs,@THIS()->AdTalking); | |
TRYCHANGECHANNEL(@PEVENT()); | |
TryUpTransfer(TUA_ALLERTING); | |
@SET_STATE(S_U4); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSIG_CONNECT) | |
{ | |
@SIGNAL(CF_ANSWER,cfs); | |
@SEND(cfs,@THIS()->AdTalking); | |
} | |
TRYCHANGECHANNEL(@PEVENT()); | |
{ | |
OUTMESSAGE(m,EDSS_MSG_CODE_CONNECT_ACK); | |
SendLayerMessage(&m); | |
} | |
@THIS()->TractReady=TRUE; | |
SetUpTransfer(); | |
ToneCTL(EDT_TONE_OFF); | |
@SET_STATE(S_S1O); | |
time(&(@THIS()->StartTime)); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSIG_CONNECT_ACK) | |
@SIGNAL(CF_ANSWER,cfs); | |
@SEND(cfs,@THIS()->AdTalking); | |
@THIS()->TractReady=TRUE; | |
TRYCHANGECHANNEL(@PEVENT()); | |
SetUpTransfer(); | |
ToneCTL(EDT_TONE_OFF); | |
@SET_STATE(S_S1O); | |
time(&(@THIS()->StartTime)); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSIG_CALL_PROCEEDING) | |
if(IS_REQ) | |
SendLayerMessage(RMSG); | |
else | |
{ | |
@SIGNAL(CF_TRYNING,cfs); | |
@SEND(cfs,@THIS()->AdTalking); | |
@SET_STATE(S_U3); | |
TRYCHANGECHANNEL(@PEVENT()); | |
} | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(ED_BCHAN_USE) | |
@THIS()->BChannel=@PEVENT()->BChanID; | |
@TRACE("EDL:line%d use channel %d",@CONTEXT(),@THIS()->BChannel); | |
SetUpTransfer(); | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(CF_CONNECT) | |
//control channel | |
@SIGNAL(CF_ECHO_ON, echo_on) | |
@SIGNAL(CF_ECHO_OFF, echo_off) | |
memcpy(&@THIS()->ConnectData,@PEVENT(),sizeof(@THIS()->ConnectData)); | |
@TRACE("connect info set to line"); | |
SetUpTransfer(); | |
if(@PEVENT()->Codec!=G711a) | |
{ @SEND(echo_on) } | |
else if(@PEVENT()->Echo) | |
{ @SEND(echo_on) } | |
else | |
{ @SEND(echo_off) } | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(CF_HOLD) | |
if(@THIS()->BChannel) | |
{ | |
@SIGNAL(CF_HOLD,cpc); | |
@NEXT_CONTEXT(@THIS()->BChannel) | |
@SEND(cpc,8); | |
} | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(CF_UNHOLD) | |
if(@THIS()->BChannel) | |
{ | |
@SIGNAL(CF_UNHOLD,cpc); | |
@NEXT_CONTEXT(@THIS()->BChannel) | |
@SEND(cpc,8); | |
} | |
@END_DECLARE_SIGNAL_ACTION() | |
@BEGIN_DECLARE_SIGNAL_ACTION(EDSIG_SUSPEND) | |
OUTMESSAGE(m,EDSIG_SUSPEND_REJ); | |
SendLayerMessage(&m); | |
@END_DECLARE_SIGNAL_ACTION() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "stdafx.h" | |
#include "l2_lapd.h" | |
#include "../siglib/sys_signals.h" // auto include | |
#include "../siglib/release_types.h" | |
//lua function RR(a)return a;end; | |
//lua function CL(a)return a;end; | |
#define CS_CALL_CLEAR 0 | |
static LPCSTR EDSS_TIMER_NAME[]= | |
{ | |
"T301", | |
"T302", | |
"T303", | |
"T304", | |
"T305", | |
"T306", | |
"T308", | |
"T309", | |
"T310", | |
"T313", | |
"T314", | |
"T316", | |
"T317", | |
"T318", | |
"T319", | |
"T321", | |
"T322" | |
}; | |
static WORD EDSS_TIMER_INFO[]= | |
{ | |
(1),// EDSS_T301 | |
(15),// EDSS_T302 | |
(30),// EDSS_T303 | |
(15),// EDSS_T304 | |
(4),// EDSS_T305 | |
(30),// EDSS_T306 | |
(4),// EDSS_T308 | |
(90),// EDSS_T309 | |
(20),// EDSS_T310 | |
(4),// EDSS_T313 | |
(4),// EDSS_T314 | |
(120),// EDSS_T316 | |
(90),// EDSS_T317 | |
(4),// EDSS_T318 | |
(4),// EDSS_T319 | |
(30),// EDSS_T321 | |
(4),// EDSS_T322 | |
}; | |
#define EDT_SET2CP T0+0 | |
#define EDSS_RELTIMER T1 | |
#define EDSS_T303 T0+2 | |
#define EDSS_T304 T0+3 | |
#define EDSS_T305 T0+4 | |
#define EDSS_T306 T0+5 | |
#define EDSS_T308 T0+6 | |
#define EDSS_T309 T0+7 | |
#define EDSS_T310 T0+8 | |
#define EDSS_T313 T0+9 | |
#define EDSS_T314 T0+10 | |
#define EDSS_T316 T0+11 | |
#define EDSS_T317 T0+12 | |
#define EDSS_T318 T0+13 | |
#define EDSS_T319 T0+14 | |
#define EDSS_T321 T0+15 | |
#define EDSS_T322 T0+16 | |
struct EDSS_LINE__ContextType | |
{ | |
WORD CallID; // CallID | |
WORD Orginate; // Orginate | |
PWORD TimerTimeOut; // Timers timeout | |
char Calling[0xFF]; // Call number | |
char Called[0xFF]; // Self number | |
BYTE BChannel; // Used bchannel; | |
WORD AdTalking; // SipAD i am talking with; | |
WORD DAdTalking; // SipAD i am talking with; | |
BYTE LinkedWith; // Have sip twin; | |
struct CF_Connect ConnectData; // holds connect data; | |
WORD BreakOnSetup; // break on setup(due to lo channels); | |
enum CF_ReleaseType BREAK_REASON; // reason break; | |
WORD TractReady; // is voicetract ready; | |
WORD VoiceConnected; // is voice on; | |
WORD TONP; // TractOnEvent bitmask; | |
WORD EnableDTMF; // Enable DTMF on request; | |
time_t StartTime; // TalkStartTime; | |
WORD DelayAlertTimer; // Delay alert timer; | |
}; | |
#define ThisProcess ((struct EDSS_LINE__ContextType*)(pContext->pContext)) | |
#define This ((struct EDSS_LINE__ContextType*)shedule_pCurContext) | |
WORD PrintContext__EDSS_LINE(struct AU_BaseContext* pContext, char* pOut, size_t BufLen) | |
{ size_t offset=0; | |
LPCSTR oREMOTE="REMOTE"; | |
LPCSTR oTHIS ="THIS"; | |
{sprintf(pOut+offset, "<CallID data=\"%s|%d\"%s", ThisProcess->Orginate?oREMOTE:oTHIS, ThisProcess->CallID, "/>\r\n"); | |
offset+=strlen(pOut+offset);}; | |
{sprintf(pOut+offset, "<Calling data=\"%s\"%s", ThisProcess->Calling, "/>\r\n"); | |
offset+=strlen(pOut+offset);}; | |
{sprintf(pOut+offset, "<Called data=\"%s\"%s", ThisProcess->Called, "/>\r\n"); | |
offset+=strlen(pOut+offset);}; | |
{sprintf(pOut+offset, "<BChannel data=\"%d\"%s", ThisProcess->BChannel, "/>\r\n"); | |
offset+=strlen(pOut+offset);}; | |
{sprintf(pOut+offset, "<AdTalking data=\"%d\"%s", ThisProcess->AdTalking, "/>\r\n"); | |
offset+=strlen(pOut+offset);}; | |
{sprintf(pOut+offset, "<BreakOnSetup data=\"%d\"%s", ThisProcess->BreakOnSetup, "/>\r\n"); | |
offset+=strlen(pOut+offset);}; | |
{sprintf(pOut+offset, "<VConn data=\"%d\"%s", ThisProcess->VoiceConnected, "/>\r\n"); | |
offset+=strlen(pOut+offset);}; | |
{sprintf(pOut+offset, "<TractReady data=\"%d\"%s", ThisProcess->TractReady, "/>\r\n"); | |
offset+=strlen(pOut+offset);}; | |
PrintAddr(siptmpBuf, ThisProcess->ConnectData.Addr); | |
{sprintf(pOut+offset, "<connect addr data=\"%s:%d\"%s", siptmpBuf, ThisProcess->ConnectData.Port, "/>\r\n"); | |
offset+=strlen(pOut+offset);} | |
{sprintf(pOut+offset, "<LinkedWith data=\"%d\"%s", ThisProcess->LinkedWith, "/>\r\n"); | |
offset+=strlen(pOut+offset);}; | |
return (WORD)strlen(pOut); | |
} | |
// -- States for EDSS_LINE -- | |
// General states | |
; | |
enum EDSS_LINE__StatesEnum | |
{ | |
EDSS_LINE_State_EMPTY = 0, // empty | |
EDSS_LINE_State_LOCKED = 1, // LOCKED | |
EDSS_LINE_State_S_U0 = 2, // UO Idle State | |
EDSS_LINE_State_S_U1 = 3, // U1 Call initiated | |
EDSS_LINE_State_S_U2 = 4, // U2 Overlap sending | |
EDSS_LINE_State_S_U3 = 5, // U3 Outgoing call proceeding | |
EDSS_LINE_State_S_U4 = 6, // U4 Call delivered | |
EDSS_LINE_State_S_U5 = 7, // U5 Call present | |
EDSS_LINE_State_S_U6 = 8, // U6 BAD STATE | |
EDSS_LINE_State_S_U7 = 9, // U7 Call resived | |
EDSS_LINE_State_S_U8 = 10, // U8 Connect request | |
EDSS_LINE_State_S_U9 = 11, // U9 Incoming Call Proceeding | |
EDSS_LINE_State_S_S1O = 12, // U10 Active | |
EDSS_LINE_State_S_U11 = 13, // U11 Disconnect Request | |
EDSS_LINE_State_S_U12 = 14, // U12 Disconnect Indication | |
EDSS_LINE_State_S_U13 = 15, // U13 | |
EDSS_LINE_State_S_U14 = 16, // U14 | |
EDSS_LINE_State_S_U15 = 17, // U15 Suspend Request | |
EDSS_LINE_State_S_U16 = 18, // U16 | |
EDSS_LINE_State_S_U17 = 19, // U17 Resume Request | |
EDSS_LINE_State_S_U18 = 20, // U18 | |
EDSS_LINE_State_S_U19 = 21, // U19 Release Request | |
EDSS_LINE_State_S_U2O = 22, // U2O | |
EDSS_LINE_State_S_U21 = 23, // U21 | |
EDSS_LINE_State_S_U22 = 24, // U22 Call Abort | |
EDSS_LINE_State_S_U23 = 25, // U23 | |
EDSS_LINE_State_S_U24 = 26, // U24 | |
EDSS_LINE_State_S_U25 = 27, // U25 Overlap Receiving | |
}; | |
static struct _AU_StateInfo StatesNames__EDSS_LINE[] = | |
{ | |
{"EMPTY", "empty"}, | |
{"LOCKED", "LOCKED"}, | |
{"S_U0", "UO Idle State"}, | |
{"S_U1", "U1 Call initiated"}, | |
{"S_U2", "U2 Overlap sending"}, | |
{"S_U3", "U3 Outgoing call proceeding"}, | |
{"S_U4", "U4 Call delivered"}, | |
{"S_U5", "U5 Call present"}, | |
{"S_U6", "U6 BAD STATE"}, | |
{"S_U7", "U7 Call resived"}, | |
{"S_U8", "U8 Connect request"}, | |
{"S_U9", "U9 Incoming Call Proceeding"}, | |
{"S_S1O", "U10 Active"}, | |
{"S_U11", "U11 Disconnect Request"}, | |
{"S_U12", "U12 Disconnect Indication"}, | |
{"S_U13", "U13"}, | |
{"S_U14", "U14"}, | |
{"S_U15", "U15 Suspend Request"}, | |
{"S_U16", "U16"}, | |
{"S_U17", "U17 Resume Request"}, | |
{"S_U18", "U18"}, | |
{"S_U19", "U19 Release Request"}, | |
{"S_U2O", "U2O"}, | |
{"S_U21", "U21"}, | |
{"S_U22", "U22 Call Abort"}, | |
{"S_U23", "U23"}, | |
{"S_U24", "U24"}, | |
{"S_U25", "U25 Overlap Receiving"}, | |
{NULL, NULL} | |
}; | |
static void ClearThisLine(BOOL WithTimers) | |
{ | |
if(WithTimers) | |
BreakEventAllTimersByContext(shedule_pCurBaseContext, shedule_pCurrentProcess->ID, shedule_nContext);; | |
This->TimerTimeOut=EDSS_TIMER_INFO; | |
This->LinkedWith=0; | |
This->AdTalking=This->DAdTalking; | |
strcpy(This->Called ,"-"); | |
strcpy(This->Calling,"-"); | |
This->ConnectData.Port=0; | |
if(shedule_pCurBaseContext) | |
{shedule_pCurBaseContext->State=EDSS_LINE_State_EMPTY;if(shedule_pCurBaseContext->TraceCnt){_XML_TraceState(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pName, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pDescription, TraceBuffer);TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}}; | |
This->BREAK_REASON=Release_Normal; | |
} | |
#define TUA_PROCEDING 1 | |
#define TUA_ALLERTING 2 | |
#define TUA_PROGRESS 4 | |
int EDSS_LINE__CallContext(struct AU_Process* pCurProcess, struct AU_BaseContext* pContext, WORD nContext, DWORD Code, void* pOut, size_t BufLen) | |
{ | |
switch(Code) | |
{ | |
case GET_TRACTFLAG: | |
*((long*)pOut) = ThisProcess->TONP; | |
return ERROR_noError; | |
case SET_TRACTFLAG: | |
ThisProcess->TONP = (WORD) *((long*)pOut); | |
return ERROR_noError; | |
case GET_LineStatState: | |
if(pContext->State!=EDSS_LINE_State_EMPTY) | |
{ | |
*((long*)pOut)=ThisProcess->Orginate?3:2; | |
if(pContext->State==EDSS_LINE_State_S_S1O)*((long*)pOut)=4; | |
} | |
else *((long*)pOut)=1; | |
//printf("GET_LineStatState\n"); | |
return ERROR_noError; | |
case GET_LineStatInCallerID: | |
strcpy((LPSTR)pOut,ThisProcess->Calling); | |
return ERROR_noError; | |
case GET_LineStatOutCallerID: | |
strcpy((LPSTR)pOut,ThisProcess->Called); | |
//printf("GET_LineStatOutCallerID\n"); | |
return ERROR_noError; | |
case GET_LineStatTimeStart: | |
{ | |
time_t cur_t; | |
struct tm* tt; | |
time(&cur_t); | |
cur_t-=ThisProcess->StartTime; | |
tt = localtime(&cur_t); | |
sprintf((LPSTR)pOut, "%.2d:%.2d:%.2d", tt->tm_hour, tt->tm_min, tt->tm_sec); | |
return ERROR_noError; | |
} | |
} | |
return ERROR_noSuchName; | |
} | |
void EDSS_LINE__InitContext(WORD nContext, struct AU_BaseContext* pContext) | |
{ | |
ThisProcess->EnableDTMF=1; | |
ThisProcess->DAdTalking=5; | |
ThisProcess->TONP=TUA_ALLERTING; | |
ClearThisLine(FALSE); | |
pContext->State=EDSS_LINE_State_EMPTY;; | |
ThisProcess->DelayAlertTimer=0; | |
} | |
static void FLOWMESSAGE(struct EDSS_MESSAGE *Sig); | |
static void SendLayerMessage(struct EDSS_MESSAGE *Message); | |
void EDSS_LINE__OnSignal__EDSIG_RESTART__InState__LOCKED(const struct ED_SIG_MESSAGE* pSignal, WORD SignalLen) | |
{ | |
{ | |
#define IS_REQ (pSignal->Message->Request) | |
#define RMSG (pSignal->Message) | |
#define GET_MIE(a) (GET_MESSAGE_IE(pSignal->Message,a)) | |
#define OUTMESSAGE(m,a) struct EDSS_MESSAGE m;ConstructMessage(&m,This->CallID,This->Orginate,a,This) | |
} | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
#include "ed_line_sys.c" // auto include | |
static void OnRestartCondition(const struct ED_SIG_MESSAGE *Sig,struct EDSS_MESSAGE *m) | |
{ | |
WORD RII; | |
RII=DECODE__EDSS_IE_CODE_RESTART_INDICATOR(GET_MESSAGE_IE(Sig->Message,EDSS_IE_CODE_RESTART_INDICATOR)); | |
{ | |
struct sED_BCHANCTL a1066_buffer_bcl; struct sED_BCHANCTL* bcl = &a1066_buffer_bcl;; | |
bcl->From =0xFF; | |
bcl->Use =0; | |
if(RII==RII_ALL || RII==RII_SINGLE) | |
{ | |
bcl->BChanID =0xFF; | |
_sfSendSignal(ED_BCHAN_CTL, FALSE, sizeof(struct sED_BCHANCTL), (char*)(bcl));; | |
} | |
else | |
{ | |
struct EDSS_IE_DEF *IE=0; | |
while(IE=GET_MESSAGE_IE_EX(Sig->Message,EDSS_IE_CODE_RESTART_INDICATOR,IE)) | |
{ | |
if(m) | |
APPENDM(m,IE); | |
bcl->BChanID =DECODE__EDSS_IE_CODE_CHANEL_ID(IE); | |
_sfSendSignal(ED_BCHAN_CTL, FALSE, sizeof(struct sED_BCHANCTL), (char*)(bcl));; | |
} | |
} | |
} | |
} | |
void EDSS_LINE__OnSignal__EDSIG_RESTART__Default(const struct ED_SIG_MESSAGE* pSignal, WORD SignalLen) | |
{ | |
if(IS_REQ) | |
{ | |
SendLayerMessage(RMSG); | |
} | |
else | |
{ | |
OUTMESSAGE(m,EDSS_MSG_CODE_RESTART_ACK); | |
//first - ask same | |
APPENDM(&m,GET_MIE(EDSS_IE_CODE_RESTART_INDICATOR)); | |
OnRestartCondition(pSignal,&m); | |
//n send | |
FLOWMESSAGE(&m); | |
} | |
} | |
void EDSS_LINE__OnSignal__EDSIG_RESTART_ACK__Default(const struct ED_SIG_MESSAGE* pSignal, WORD SignalLen) | |
{ | |
if(IS_REQ) | |
SendLayerMessage(RMSG); | |
else | |
//SEND_Release(0); | |
{ | |
OnRestartCondition(pSignal,0); | |
} | |
KILLSELF(); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__KL_START__Default() | |
{ | |
ClearThisLine(TRUE); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__KL_STOP__Default() | |
{ | |
ClearThisLine(TRUE); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__EDSIG_SETUP__InState__S_U0(const struct ED_SIG_MESSAGE* pSignal, WORD SignalLen) | |
{ | |
if(IS_REQ) | |
{ | |
SendLayerMessage(RMSG); | |
StartTimer(EDSS_T303); | |
{shedule_pCurBaseContext->State=EDSS_LINE_State_S_U1;if(shedule_pCurBaseContext->TraceCnt){_XML_TraceState(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pName, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pDescription, TraceBuffer);TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}}; | |
} | |
else | |
{ | |
//Indication(EDSS_SETUP_IND,pSignal); | |
OnSetupLine(pSignal); | |
//StartTimer(EDSS_T303); | |
{shedule_pCurBaseContext->State=EDSS_LINE_State_S_U1;if(shedule_pCurBaseContext->TraceCnt){_XML_TraceState(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pName, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pDescription, TraceBuffer);TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}}; | |
} | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__EDSIG_SETUP__Default(const struct ED_SIG_MESSAGE* pSignal, WORD SignalLen) | |
{ | |
if(shedule_pCurBaseContext->TraceCnt){_XML_Trace(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, TraceBuffer);sprintf(TraceBuffer+(WORD)strlen(TraceBuffer), "GOT SECOND SETUP.. ignore%s\r\n", "</text>\r\n</hint>\r\n"); TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));} | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__EDSIG_DISCONNECT__Default(const struct ED_SIG_MESSAGE* pSignal, WORD SignalLen) | |
{ | |
UpBreak(); | |
if(IS_REQ) | |
{ | |
SendLayerMessage(RMSG); | |
{shedule_pCurBaseContext->State=EDSS_LINE_State_S_U11;if(shedule_pCurBaseContext->TraceCnt){_XML_TraceState(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pName, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pDescription, TraceBuffer);TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}}; | |
StartTimer(EDSS_T305); | |
} | |
else | |
{ | |
ReleaseLink(CS_CALL_CLEAR); | |
{shedule_pCurBaseContext->State=EDSS_LINE_State_S_U12;if(shedule_pCurBaseContext->TraceCnt){_XML_TraceState(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pName, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pDescription, TraceBuffer);TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}}; | |
} | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__EDSIG_STATUS__Default(const struct ED_SIG_MESSAGE* pSignal, WORD SignalLen) | |
{ | |
if(This->CallID)SEND_ReleaseCmp(); | |
KILLSELF(); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__EDSIG_RELEASE__Default(const struct ED_SIG_MESSAGE* pSignal, WORD SignalLen) | |
{ | |
UpBreak(); | |
if(IS_REQ) | |
{ | |
SendLayerMessage(RMSG); | |
StopTimer(EDSS_T305); | |
StartTimer(EDSS_T308); | |
{shedule_pCurBaseContext->State=EDSS_LINE_State_S_U19;if(shedule_pCurBaseContext->TraceCnt){_XML_TraceState(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pName, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pDescription, TraceBuffer);TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}}; | |
} | |
else | |
{ | |
SEND_ReleaseCmp(); | |
KILLSELF(); | |
} | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__EDSS_T305__Default(const * pSignal, WORD SignalLen) | |
{ | |
// WHERE WAS NO ASK FOR DISCONNECT | |
if(shedule_pCurBaseContext->State==EDSS_LINE_State_S_U11) | |
{ | |
ReleaseLink(0); | |
/*OUTMESSAGE(m,EDSS_MSG_CODE_CALL_PROCEEDING); | |
APPENDM(&m,CONSTRUCT__EDSS_IE_CODE_CHANEL_ID(This->BChannel)); | |
INJECT(&m); | |
*/ | |
} | |
else | |
{ | |
if(shedule_pCurBaseContext->TraceCnt){_XML_Trace(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, TraceBuffer);sprintf(TraceBuffer+(WORD)strlen(TraceBuffer), "T305(DISC) ENDS IN WRONG STATE.AND HOW IT HAPENDS?%s\r\n", "</text>\r\n</hint>\r\n"); TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}; | |
} | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__EDSS_T308__Default(const * pSignal, WORD SignalLen) | |
{ | |
// WHERE WAS NO ASK FOR RELEASE | |
if(shedule_pCurBaseContext->State==EDSS_LINE_State_S_U19) | |
{ | |
SEND_ReleaseCmp(); | |
KILLSELF(); | |
} | |
else | |
{ | |
if(shedule_pCurBaseContext->TraceCnt){_XML_Trace(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, TraceBuffer);sprintf(TraceBuffer+(WORD)strlen(TraceBuffer), "T308(RELEASE) ENDS IN WRONG STATE.AND HOW IT HAPENDS?%s\r\n", "</text>\r\n</hint>\r\n"); TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}; | |
} | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__EDSIG_RELEASE_COMPLETE__Default(const struct ED_SIG_MESSAGE* pSignal, WORD SignalLen) | |
{ | |
SetEventTimer(shedule_pCurBaseContext, shedule_pCurrentProcess->ID, shedule_nContext, EDSS_RELTIMER-T0, 0, FALSE, TRUE); | |
if(IS_REQ) | |
{ | |
SendLayerMessage(RMSG); | |
} | |
else | |
{ | |
} | |
KILLSELF(); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__CF_SETUP__InState__LOCKED(const struct CF_Setup* pSignal, WORD SignalLen) | |
{ | |
This->AdTalking=shedule_pEvent->AdapterNo; | |
This->LinkedWith=1; | |
if(This->BreakOnSetup) | |
{ | |
KILLSELF(); | |
return; | |
} | |
{shedule_pCurBaseContext->State=EDSS_LINE_State_S_U0;if(shedule_pCurBaseContext->TraceCnt){_XML_TraceState(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pName, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pDescription, TraceBuffer);TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}}; | |
{ | |
// Запрашиваем преобразование номера | |
struct RT_DestinationRq a1066_buffer_rq; struct RT_DestinationRq* rq = &a1066_buffer_rq;; | |
rq->Hook = 100; | |
strcpy(rq->Set, pSignal->To); | |
strcpy(This->Calling, pSignal->To); | |
sSyncSignalFlag = TRUE; | |
} | |
SetupLine(pSignal->From,This->Calling,1); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__RT_REPLACED__Default(const struct RT_DestinationRq* pSignal, WORD SignalLen) | |
{ | |
strcpy(This->Calling, pSignal->Set); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__RT_NOTRESOLVED__Default(const struct RT_DestinationNotResolved* pSignal, WORD SignalLen) | |
{ | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__RT_NOTCOMPLETED__Default(const struct RT_DestinationNotResolved* pSignal, WORD SignalLen) | |
{ | |
StopTimer(EDT_SET2CP); | |
OUTMESSAGE(m,EDSS_MSG_CODE_SETUP_ACK); | |
//APPENDM(&m,CONSTRUCT__EDSS_IE_CODE_CHANEL_ID(This->BChannel)); | |
FLOWMESSAGE(&m); | |
//StopTimer(EDSS_T304); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__CF_SETUP__Default(const struct CF_Setup* pSignal, WORD SignalLen) | |
{ | |
This->AdTalking=shedule_pEvent->AdapterNo; | |
This->LinkedWith=1; | |
if(shedule_pCurBaseContext->TraceCnt){_XML_Trace(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, TraceBuffer);sprintf(TraceBuffer+(WORD)strlen(TraceBuffer), "EDL:line%d got CF_SETUP not in LOCKED state%s\r\n", shedule_nContext, "</text>\r\n</hint>\r\n"); TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}; | |
KILLSELF(); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__EDSS_RELTIMER__Default(const * pSignal, WORD SignalLen) | |
{ | |
//,LOCKED) | |
SEND_ReleaseCmp(); | |
KILLSELF(); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__CF_RELEASE__Default(const struct CF_Release* pSignal, WORD SignalLen) | |
{ | |
if(shedule_pCurBaseContext->TraceCnt){_XML_Trace(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, TraceBuffer);sprintf(TraceBuffer+(WORD)strlen(TraceBuffer), "incoming release%s\r\n", "</text>\r\n</hint>\r\n"); TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}; | |
LineBreakRelease(); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__CF_TRYNING__Default() | |
{ | |
OUTMESSAGE(m,EDSS_MSG_CODE_CALL_PROCEEDING); | |
APPENDM(&m,CONSTRUCT__EDSS_IE_CODE_CHANEL_ID(This->BChannel)); | |
FLOWMESSAGE(&m); | |
StopTimer(EDSS_T304); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__CF_COMPLETED__Default(const struct CF_Completed* pSignal, WORD SignalLen) | |
{ | |
OUTMESSAGE(m,EDSS_MSG_CODE_CALL_PROCEEDING); | |
APPENDM(&m,CONSTRUCT__EDSS_IE_CODE_CHANEL_ID(This->BChannel)); | |
FLOWMESSAGE(&m); | |
StopTimer(EDSS_T304); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__CF_NOTCOMPLETED__Default() | |
{ | |
OUTMESSAGE(m,EDSS_MSG_CODE_SETUP_ACK); | |
SendLayerMessage(&m); | |
if(This->EnableDTMF) | |
ToneCTL(EDT_DTMF_ON); | |
StartTimer(EDSS_T304); | |
{shedule_pCurBaseContext->State=EDSS_LINE_State_S_U2;if(shedule_pCurBaseContext->TraceCnt){_XML_TraceState(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pName, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pDescription, TraceBuffer);TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}}; | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__EDSS_T304__Default(const * pSignal, WORD SignalLen) | |
{ | |
// dial time ends. no number assepted | |
if(shedule_pCurBaseContext->TraceCnt){_XML_Trace(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, TraceBuffer);sprintf(TraceBuffer+(WORD)strlen(TraceBuffer), "dial time ends. no number assepted%s\r\n", "</text>\r\n</hint>\r\n"); TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}; | |
KILLSELF(); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__EDSIG_SETUP_ACK__Default(const struct ED_SIG_MESSAGE* pSignal, WORD SignalLen) | |
{ | |
// Signal CF_NOTCOMPLETED nc; | |
_sfSendSignalTo(CF_NOTCOMPLETED, FALSE, 0, NULL,This->AdTalking); | |
{shedule_pCurBaseContext->State=EDSS_LINE_State_S_U2;if(shedule_pCurBaseContext->TraceCnt){_XML_TraceState(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pName, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pDescription, TraceBuffer);TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}}; | |
//ToneCTL(EDT_DTMF_ON); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__EDSIG_PROGRESS__Default(const struct ED_SIG_MESSAGE* pSignal, WORD SignalLen) | |
{ | |
// Signal CF_PROGRESS nc; | |
_sfSendSignalTo(CF_PROGRESS, FALSE, 0, NULL,This->AdTalking); | |
TryUpTransfer(TUA_PROGRESS); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__EDSIG_INFORMATION__Default(const struct ED_SIG_MESSAGE* pSignal, WORD SignalLen) | |
{ | |
struct EDSS_IE_DEF *CN=GET_MESSAGE_IE(pSignal->Message,EDSS_IE_CODE_CALLED_PARTY_NUM); | |
if(CN) | |
{ | |
LPCSTR To; | |
struct CF_Digits a1066_buffer_dg; struct CF_Digits* dg = &a1066_buffer_dg;; | |
To =DECODE__EDSS_IE_CODE_CALLED_PARTY_NUM(CN); | |
strcpy(dg->Set,To); | |
_sfSendSignalTo(CF_DIGITS, FALSE, sizeof(struct CF_Digits), (char*)(dg), This->AdTalking);; | |
RestartTimer(EDSS_T304); | |
} | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__CF_DIGITS__Default(const struct CF_Digits* pSignal, WORD SignalLen) | |
{ | |
if(shedule_pEvent->AdapterNo==8) | |
{ | |
struct CF_Digits a1066_buffer_dg; struct CF_Digits* dg = &a1066_buffer_dg;; | |
memcpy(dg,pSignal,sizeof(*dg)); | |
_sfSendSignalTo(CF_DIGITS, FALSE, sizeof(struct CF_Digits), (char*)(dg), This->AdTalking);; | |
return; | |
} | |
if(strlen(pSignal->Set)==1 && *(pSignal->Set)=='#') | |
{ | |
} | |
else | |
{ | |
OUTMESSAGE(m,EDSS_MSG_CODE_INFORMATION); | |
strcat(This->Calling,pSignal->Set); | |
APPENDM(&m,CONSTRUCT__EDSS_IE_CODE_CALLED_PARTY_NUM(pSignal->Set)); | |
SendLayerMessage(&m); | |
} | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__CF_QUEUED__Default() | |
{ | |
OUTMESSAGE(m,EDSS_MSG_CODE_ALERTING); | |
SendLayerMessage(&m); | |
TryUpTransfer(TUA_ALLERTING); | |
ToneCTL(EDT_TONE_QUE); | |
{shedule_pCurBaseContext->State=EDSS_LINE_State_S_U4;if(shedule_pCurBaseContext->TraceCnt){_XML_TraceState(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pName, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pDescription, TraceBuffer);TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}}; | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__CF_RINGING__Default() | |
{ | |
OUTMESSAGE(m,EDSS_MSG_CODE_ALERTING); | |
SendLayerMessage(&m); | |
TryUpTransfer(TUA_ALLERTING); | |
ToneCTL(EDT_TONE_RNG); | |
StopTimer(EDSS_T304); | |
{shedule_pCurBaseContext->State=EDSS_LINE_State_S_U4;if(shedule_pCurBaseContext->TraceCnt){_XML_TraceState(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pName, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pDescription, TraceBuffer);TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}}; | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__CF_PROGRESS__Default() | |
{ | |
OUTMESSAGE(m,EDSS_MSG_CODE_PROGRESS); | |
SendLayerMessage(&m); | |
TryUpTransfer(TUA_PROGRESS); | |
StopTimer(EDSS_T304); | |
//ToneCTL(EDT_TONE_RNG); | |
//SET_STATE(S_U4); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__CF_ANSWER__Default() | |
{ | |
OUTMESSAGE(m,EDSS_MSG_CODE_CONNECT); | |
SendLayerMessage(&m); | |
StopTimer(EDSS_T304); | |
{shedule_pCurBaseContext->State=EDSS_LINE_State_S_S1O;if(shedule_pCurBaseContext->TraceCnt){_XML_TraceState(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pName, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pDescription, TraceBuffer);TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}}; | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__EDSIG_ALERTING__Default(const struct ED_SIG_MESSAGE* pSignal, WORD SignalLen) | |
{ | |
// Signal CF_RINGING cfs; | |
_sfSendSignalTo(CF_RINGING, FALSE, 0, NULL,This->AdTalking);; | |
TRYCHANGECHANNEL(pSignal); | |
TryUpTransfer(TUA_ALLERTING); | |
{shedule_pCurBaseContext->State=EDSS_LINE_State_S_U4;if(shedule_pCurBaseContext->TraceCnt){_XML_TraceState(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pName, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pDescription, TraceBuffer);TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}}; | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__EDSIG_CONNECT__Default(const struct ED_SIG_MESSAGE* pSignal, WORD SignalLen) | |
{ | |
{ | |
// Signal CF_ANSWER cfs; | |
_sfSendSignalTo(CF_ANSWER, FALSE, 0, NULL,This->AdTalking);; | |
} | |
TRYCHANGECHANNEL(pSignal); | |
{ | |
OUTMESSAGE(m,EDSS_MSG_CODE_CONNECT_ACK); | |
SendLayerMessage(&m); | |
} | |
This->TractReady=TRUE; | |
SetUpTransfer(); | |
ToneCTL(EDT_TONE_OFF); | |
{shedule_pCurBaseContext->State=EDSS_LINE_State_S_S1O;if(shedule_pCurBaseContext->TraceCnt){_XML_TraceState(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pName, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pDescription, TraceBuffer);TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}}; | |
time(&(This->StartTime)); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__EDSIG_CONNECT_ACK__Default(const struct ED_SIG_MESSAGE* pSignal, WORD SignalLen) | |
{ | |
// Signal CF_ANSWER cfs; | |
_sfSendSignalTo(CF_ANSWER, FALSE, 0, NULL,This->AdTalking);; | |
This->TractReady=TRUE; | |
TRYCHANGECHANNEL(pSignal); | |
SetUpTransfer(); | |
ToneCTL(EDT_TONE_OFF); | |
{shedule_pCurBaseContext->State=EDSS_LINE_State_S_S1O;if(shedule_pCurBaseContext->TraceCnt){_XML_TraceState(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pName, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pDescription, TraceBuffer);TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}}; | |
time(&(This->StartTime)); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__EDSIG_CALL_PROCEEDING__Default(const struct ED_SIG_MESSAGE* pSignal, WORD SignalLen) | |
{ | |
if(IS_REQ) | |
SendLayerMessage(RMSG); | |
else | |
{ | |
// Signal CF_TRYNING cfs; | |
_sfSendSignalTo(CF_TRYNING, FALSE, 0, NULL,This->AdTalking);; | |
{shedule_pCurBaseContext->State=EDSS_LINE_State_S_U3;if(shedule_pCurBaseContext->TraceCnt){_XML_TraceState(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pName, StatesNames__EDSS_LINE[shedule_pCurBaseContext->State].pDescription, TraceBuffer);TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}}; | |
TRYCHANGECHANNEL(pSignal); | |
} | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__ED_BCHAN_USE__Default(const struct sED_BCHANCTL* pSignal, WORD SignalLen) | |
{ | |
This->BChannel=pSignal->BChanID; | |
if(shedule_pCurBaseContext->TraceCnt){_XML_Trace(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, TraceBuffer);sprintf(TraceBuffer+(WORD)strlen(TraceBuffer), "EDL:line%d use channel %d%s\r\n", shedule_nContext, This->BChannel, "</text>\r\n</hint>\r\n"); TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}; | |
SetUpTransfer(); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__CF_CONNECT__Default(const struct CF_Connect* pSignal, WORD SignalLen) | |
{ | |
//control channel | |
// Signal CF_ECHO_ON echo_on | |
// Signal CF_ECHO_OFF echo_off | |
memcpy(&This->ConnectData,pSignal,sizeof(This->ConnectData)); | |
if(shedule_pCurBaseContext->TraceCnt){_XML_Trace(shedule_pCurrentProcess, shedule_pCurBaseContext, shedule_nContext, TraceBuffer);sprintf(TraceBuffer+(WORD)strlen(TraceBuffer), "connect info set to line%s\r\n", "</text>\r\n</hint>\r\n"); TraceMessage(shedule_pCurrentProcess, shedule_nContext, TraceBuffer, (WORD)strlen(TraceBuffer));}; | |
SetUpTransfer(); | |
if(pSignal->Codec!=G711a) | |
{ _sfSendSignal(CF_ECHO_ON, FALSE, 0, NULL); } | |
else if(pSignal->Echo) | |
{ _sfSendSignal(CF_ECHO_ON, FALSE, 0, NULL); } | |
else | |
{ _sfSendSignal(CF_ECHO_OFF, FALSE, 0, NULL); } | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__CF_HOLD__Default() | |
{ | |
if(This->BChannel) | |
{ | |
// Signal CF_HOLD cpc; | |
snContext = SheduleSendContext; SheduleSendContext = This->BChannel; | |
_sfSendSignalTo(CF_HOLD, FALSE, 0, NULL,8); SheduleSendContext = snContext;; | |
} | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__CF_UNHOLD__Default() | |
{ | |
if(This->BChannel) | |
{ | |
// Signal CF_UNHOLD cpc; | |
snContext = SheduleSendContext; SheduleSendContext = This->BChannel; | |
_sfSendSignalTo(CF_UNHOLD, FALSE, 0, NULL,8); SheduleSendContext = snContext;; | |
} | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
void EDSS_LINE__OnSignal__EDSIG_SUSPEND__Default(const struct ED_SIG_MESSAGE* pSignal, WORD SignalLen) | |
{ | |
OUTMESSAGE(m,EDSIG_SUSPEND_REJ); | |
SendLayerMessage(&m); | |
shedule_pCurBaseContext->ActivityFlag = TRUE; | |
} | |
// ***** SUPER_FINISH(cc) ***** Root file="ed_line" | |
// ***** DECLARE_PROCESS | |
static char sEDSS_LINE__XMLSignalMap[] = | |
"<signalmap>\r\n\ | |
<signal id=KL_STOP>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=ED_ORGINATE>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=RT_NOTRESOLVED>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDT_SET2CP>\r\n\ | |
<state id=S_U1/>\r\n\ | |
<state id=/>\r\n\ | |
</signal>\r\n\ | |
<signal id=RT_NOTCOMPLETED>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDSIG_ALERTING>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDSIG_INFORMATION>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDSIG_CONNECT_ACK>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=CF_RINGING>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=CF_ANSWER>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDSIG_RELEASE_COMPLETE>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=ED_LOCKLINK>\r\n\ | |
<state id=EMPTY/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDSIG_STATUS>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDSIG_RELEASE>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=CF_NOTCOMPLETED>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=CF_COMPLETED>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDSIG_SETUP>\r\n\ | |
<state id=S_U0/>\r\n\ | |
<state id=/>\r\n\ | |
</signal>\r\n\ | |
<signal id=CF_CONNECT>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDSS_RELTIMER>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDSIG_SETUP_ACK>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=ED_CONNECT>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDSIG_DISCONNECT>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDSIG_PROGRESS>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDSIG_SUSPEND>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDSS_T304>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDSS_T308>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=KL_START>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=CF_DIGITS>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDSIG_RESTART_ACK>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=TF>\r\n\ | |
<state id=LOCKED/>\r\n\ | |
</signal>\r\n\ | |
<signal id=CF_SETUP>\r\n\ | |
<state id=LOCKED/>\r\n\ | |
<state id=/>\r\n\ | |
</signal>\r\n\ | |
<signal id=CF_HOLD>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=CF_TRYNING>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDSIG_RESTART>\r\n\ | |
<state id=LOCKED/>\r\n\ | |
<state id=/>\r\n\ | |
</signal>\r\n\ | |
<signal id=ED_NEW>\r\n\ | |
<state id=LOCKED/>\r\n\ | |
<state id=EMPTY/>\r\n\ | |
</signal>\r\n\ | |
<signal id=CF_RELEASE>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=RT_REPLACED>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDSIG_CONNECT>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=CF_PROGRESS>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=CF_UNHOLD>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDSIG_CALL_PROCEEDING>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=ED_BCHAN_USE>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=CF_QUEUED>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
<signal id=EDSS_T305>\r\n\ | |
<state id=""/>\r\n\ | |
</signal>\r\n\ | |
</signalmap>"; | |
const char* get_EDSS_LINE__XMLSignalMap() {return sEDSS_LINE__XMLSignalMap;} | |
void EDSS_LINE__ProcessEvents(const struct AU_Event* pEvent) | |
{ | |
shedule_pEvent = (struct AU_Event*)pEvent; | |
snContext = SheduleSendContext; | |
sSyncSignalFlag = FALSE; | |
shedule_pCurBaseContext->ActivityFlag = FALSE; | |
switch(pEvent->Code) | |
{ | |
case KL_STOP: | |
switch(shedule_pCurBaseContext->State) | |
{ | |
default: | |
EDSS_LINE__OnSignal__KL_STOP__Default(); | |
} | |
break; | |
case ED_ORGINATE: | |
EDSS_LINE__OnSignal__ED_ORGINATE__Default((const struct sED_LINEID*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case RT_NOTRESOLVED: | |
EDSS_LINE__OnSignal__RT_NOTRESOLVED__Default((const struct RT_DestinationNotResolved*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case EDT_SET2CP: | |
switch(shedule_pCurBaseContext->State) | |
{ | |
case EDSS_LINE_State_S_U1: | |
EDSS_LINE__OnSignal__EDT_SET2CP__InState__S_U1((const *)(pEvent->pData), pEvent->DataLen); | |
break; | |
default: | |
EDSS_LINE__OnSignal__EDT_SET2CP__Default((const *)(pEvent->pData), pEvent->DataLen); | |
} | |
break; | |
case RT_NOTCOMPLETED: | |
EDSS_LINE__OnSignal__RT_NOTCOMPLETED__Default((const struct RT_DestinationNotResolved*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case EDSIG_ALERTING: | |
EDSS_LINE__OnSignal__EDSIG_ALERTING__Default((const struct ED_SIG_MESSAGE*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case EDSIG_INFORMATION: | |
EDSS_LINE__OnSignal__EDSIG_INFORMATION__Default((const struct ED_SIG_MESSAGE*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case EDSIG_CONNECT_ACK: | |
EDSS_LINE__OnSignal__EDSIG_CONNECT_ACK__Default((const struct ED_SIG_MESSAGE*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case CF_RINGING: | |
switch(shedule_pCurBaseContext->State) | |
{ | |
default: | |
EDSS_LINE__OnSignal__CF_RINGING__Default(); | |
} | |
break; | |
case CF_ANSWER: | |
switch(shedule_pCurBaseContext->State) | |
{ | |
default: | |
EDSS_LINE__OnSignal__CF_ANSWER__Default(); | |
} | |
break; | |
case EDSIG_RELEASE_COMPLETE: | |
EDSS_LINE__OnSignal__EDSIG_RELEASE_COMPLETE__Default((const struct ED_SIG_MESSAGE*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case ED_LOCKLINK: | |
switch(shedule_pCurBaseContext->State) | |
{ | |
case EDSS_LINE_State_EMPTY: | |
EDSS_LINE__OnSignal__ED_LOCKLINK__InState__EMPTY((const struct sED_LINEID*)(pEvent->pData), pEvent->DataLen); | |
break; | |
} | |
break; | |
case EDSIG_STATUS: | |
EDSS_LINE__OnSignal__EDSIG_STATUS__Default((const struct ED_SIG_MESSAGE*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case EDSIG_RELEASE: | |
EDSS_LINE__OnSignal__EDSIG_RELEASE__Default((const struct ED_SIG_MESSAGE*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case CF_NOTCOMPLETED: | |
switch(shedule_pCurBaseContext->State) | |
{ | |
default: | |
EDSS_LINE__OnSignal__CF_NOTCOMPLETED__Default(); | |
} | |
break; | |
case CF_COMPLETED: | |
EDSS_LINE__OnSignal__CF_COMPLETED__Default((const struct CF_Completed*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case EDSIG_SETUP: | |
switch(shedule_pCurBaseContext->State) | |
{ | |
case EDSS_LINE_State_S_U0: | |
EDSS_LINE__OnSignal__EDSIG_SETUP__InState__S_U0((const struct ED_SIG_MESSAGE*)(pEvent->pData), pEvent->DataLen); | |
break; | |
default: | |
EDSS_LINE__OnSignal__EDSIG_SETUP__Default((const struct ED_SIG_MESSAGE*)(pEvent->pData), pEvent->DataLen); | |
} | |
break; | |
case CF_CONNECT: | |
EDSS_LINE__OnSignal__CF_CONNECT__Default((const struct CF_Connect*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case EDSS_RELTIMER: | |
EDSS_LINE__OnSignal__EDSS_RELTIMER__Default((const *)(pEvent->pData), pEvent->DataLen); | |
break; | |
case EDSIG_SETUP_ACK: | |
EDSS_LINE__OnSignal__EDSIG_SETUP_ACK__Default((const struct ED_SIG_MESSAGE*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case ED_CONNECT: | |
EDSS_LINE__OnSignal__ED_CONNECT__Default((const struct CF_Connect*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case EDSIG_DISCONNECT: | |
EDSS_LINE__OnSignal__EDSIG_DISCONNECT__Default((const struct ED_SIG_MESSAGE*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case EDSIG_PROGRESS: | |
EDSS_LINE__OnSignal__EDSIG_PROGRESS__Default((const struct ED_SIG_MESSAGE*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case EDSIG_SUSPEND: | |
EDSS_LINE__OnSignal__EDSIG_SUSPEND__Default((const struct ED_SIG_MESSAGE*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case EDSS_T304: | |
EDSS_LINE__OnSignal__EDSS_T304__Default((const *)(pEvent->pData), pEvent->DataLen); | |
break; | |
case EDSS_T308: | |
EDSS_LINE__OnSignal__EDSS_T308__Default((const *)(pEvent->pData), pEvent->DataLen); | |
break; | |
case KL_START: | |
switch(shedule_pCurBaseContext->State) | |
{ | |
default: | |
EDSS_LINE__OnSignal__KL_START__Default(); | |
} | |
break; | |
case CF_DIGITS: | |
EDSS_LINE__OnSignal__CF_DIGITS__Default((const struct CF_Digits*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case EDSIG_RESTART_ACK: | |
EDSS_LINE__OnSignal__EDSIG_RESTART_ACK__Default((const struct ED_SIG_MESSAGE*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case TF: | |
switch(shedule_pCurBaseContext->State) | |
{ | |
case EDSS_LINE_State_LOCKED: | |
EDSS_LINE__OnSignal__TF__InState__LOCKED(); | |
break; | |
} | |
break; | |
case CF_SETUP: | |
switch(shedule_pCurBaseContext->State) | |
{ | |
case EDSS_LINE_State_LOCKED: | |
EDSS_LINE__OnSignal__CF_SETUP__InState__LOCKED((const struct CF_Setup*)(pEvent->pData), pEvent->DataLen); | |
break; | |
default: | |
EDSS_LINE__OnSignal__CF_SETUP__Default((const struct CF_Setup*)(pEvent->pData), pEvent->DataLen); | |
} | |
break; | |
case CF_HOLD: | |
switch(shedule_pCurBaseContext->State) | |
{ | |
default: | |
EDSS_LINE__OnSignal__CF_HOLD__Default(); | |
} | |
break; | |
case CF_TRYNING: | |
switch(shedule_pCurBaseContext->State) | |
{ | |
default: | |
EDSS_LINE__OnSignal__CF_TRYNING__Default(); | |
} | |
break; | |
case EDSIG_RESTART: | |
switch(shedule_pCurBaseContext->State) | |
{ | |
case EDSS_LINE_State_LOCKED: | |
EDSS_LINE__OnSignal__EDSIG_RESTART__InState__LOCKED((const struct ED_SIG_MESSAGE*)(pEvent->pData), pEvent->DataLen); | |
break; | |
default: | |
EDSS_LINE__OnSignal__EDSIG_RESTART__Default((const struct ED_SIG_MESSAGE*)(pEvent->pData), pEvent->DataLen); | |
} | |
break; | |
case ED_NEW: | |
switch(shedule_pCurBaseContext->State) | |
{ | |
case EDSS_LINE_State_LOCKED: case EDSS_LINE_State_EMPTY: | |
EDSS_LINE__OnSignal__ED_NEW__In__LOCKED_EMPTY((const struct sED_LINEID*)(pEvent->pData), pEvent->DataLen); | |
break; | |
} | |
break; | |
case CF_RELEASE: | |
EDSS_LINE__OnSignal__CF_RELEASE__Default((const struct CF_Release*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case RT_REPLACED: | |
EDSS_LINE__OnSignal__RT_REPLACED__Default((const struct RT_DestinationRq*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case EDSIG_CONNECT: | |
EDSS_LINE__OnSignal__EDSIG_CONNECT__Default((const struct ED_SIG_MESSAGE*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case CF_PROGRESS: | |
switch(shedule_pCurBaseContext->State) | |
{ | |
default: | |
EDSS_LINE__OnSignal__CF_PROGRESS__Default(); | |
} | |
break; | |
case CF_UNHOLD: | |
switch(shedule_pCurBaseContext->State) | |
{ | |
default: | |
EDSS_LINE__OnSignal__CF_UNHOLD__Default(); | |
} | |
break; | |
case EDSIG_CALL_PROCEEDING: | |
EDSS_LINE__OnSignal__EDSIG_CALL_PROCEEDING__Default((const struct ED_SIG_MESSAGE*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case ED_BCHAN_USE: | |
EDSS_LINE__OnSignal__ED_BCHAN_USE__Default((const struct sED_BCHANCTL*)(pEvent->pData), pEvent->DataLen); | |
break; | |
case CF_QUEUED: | |
switch(shedule_pCurBaseContext->State) | |
{ | |
default: | |
EDSS_LINE__OnSignal__CF_QUEUED__Default(); | |
} | |
break; | |
case EDSS_T305: | |
EDSS_LINE__OnSignal__EDSS_T305__Default((const *)(pEvent->pData), pEvent->DataLen); | |
break; | |
default: | |
{ | |
sprintf(pErrorString, "Signal not processed! Process:%s Context:%d Signal:%d Len:%d From:%d Route:%d", shedule_pCurrentProcess->Name, shedule_nContext, pEvent->Code, pEvent->DataLen, pEvent->From, pEvent->Route); | |
ErrorStack_Push(pErrorString); | |
} | |
} | |
if(!shedule_pCurBaseContext->ActivityFlag) | |
{ | |
char tmp[100]; | |
PrintSignalCode(pEvent->Code, tmp); | |
sprintf(pErrorString, "Activity flag filed! Process:%s Context:%d Signal:%d(%s)", shedule_pCurrentProcess->Name, shedule_nContext, pEvent->Code, tmp); | |
ErrorStack_Push(pErrorString); | |
} | |
} | |
BOOL EDSS_LINE__TuneContext(struct AU_BaseContext* pContext, WORD nContext, const char* pParam, const char* pParamValue); | |
BOOL EDSS_LINE__TraceContext(struct AU_BaseContext* pContext, WORD nContext, char* pOut, size_t OutLen); | |
const char* get_EDSS_LINE__XMLClassInfo(); | |
const char* get_EDSS_LINE__XMLSignalMap(); | |
void RegisterProcess__EDSS_LINEClass(struct AU_ProcessTemplate* pClass) | |
{ | |
sprintf(pClass->Description, "EDSS LINE"); | |
pClass->pInitFunc = EDSS_LINE__InitContext; | |
pClass->pTuneFunc = EDSS_LINE__TuneContext; | |
pClass->pTraceFunc = EDSS_LINE__TraceContext; | |
pClass->pEventFunc = EDSS_LINE__ProcessEvents; | |
pClass->pBaseInfoFunc = get_EDSS_LINE__XMLClassInfo; | |
pClass->pSignalMapFunc = get_EDSS_LINE__XMLSignalMap; | |
pClass->pCallFunc = EDSS_LINE__CallContext; | |
pClass->ExtContextSize = sizeof(struct EDSS_LINE__ContextType); | |
} | |
BOOL EDSS_LINE__TraceContext(struct AU_BaseContext* pBaseContext, WORD nContext, char* pOut, size_t OutLen) | |
{ | |
size_t offset; | |
offset = _XML_TraceContext(shedule_pCurrentProcess, pBaseContext, nContext, StatesNames__EDSS_LINE[pBaseContext->State].pName, StatesNames__EDSS_LINE[pBaseContext->State].pDescription, pOut); | |
PrintContext__EDSS_LINE(pBaseContext, pOut+offset, OutLen); | |
offset+=strlen(pOut+offset); | |
sprintf(pOut+offset, "</params>\r\n</context>"); | |
return TRUE; | |
} | |
BOOL EDSS_LINE__TuneContext(struct AU_BaseContext* pContext, WORD nContext, const char* pParam, const char* pParamValue) | |
{ | |
return FALSE; | |
} | |
static char EDSS_LINE_XMLClassInfo[] = | |
"<class name=EDSS_LINE info=\"EDSS LINE\">\r\n\ | |
<states>\r\n\ | |
<state id=S_U14>U14</state>\r\n\ | |
<state id=LOCKED>LOCKED</state>\r\n\ | |
<state id=S_U25>U25 Overlap Receiving</state>\r\n\ | |
<state id=S_U24>U24</state>\r\n\ | |
<state id=S_U15>U15 Suspend Request</state>\r\n\ | |
<state id=S_U23>U23</state>\r\n\ | |
<state id=S_U6>U6 BAD STATE</state>\r\n\ | |
<state id=S_U16>U16</state>\r\n\ | |
<state id=S_U0>UO Idle State</state>\r\n\ | |
<state id=S_U19>U19 Release Request</state>\r\n\ | |
<state id=S_U22>U22 Call Abort</state>\r\n\ | |
<state id=S_U18>U18</state>\r\n\ | |
<state id=S_U11>U11 Disconnect Request</state>\r\n\ | |
<state id=S_U5>U5 Call present</state>\r\n\ | |
<state id=S_U12>U12 Disconnect Indication</state>\r\n\ | |
<state id=S_U21>U21</state>\r\n\ | |
<state id=S_U17>U17 Resume Request</state>\r\n\ | |
<state id=S_U1>U1 Call initiated</state>\r\n\ | |
<state id=S_U9>U9 Incoming Call Proceeding</state>\r\n\ | |
<state id=S_U13>U13</state>\r\n\ | |
<state id=EMPTY>empty</state>\r\n\ | |
<state id=S_S1O>U10 Active</state>\r\n\ | |
<state id=S_U2>U2 Overlap sending</state>\r\n\ | |
<state id=S_U3>U3 Outgoing call proceeding</state>\r\n\ | |
<state id=S_U4>U4 Call delivered</state>\r\n\ | |
<state id=S_U7>U7 Call resived</state>\r\n\ | |
<state id=S_U8>U8 Connect request</state>\r\n\ | |
<state id=S_U2O>U2O</state>\r\n\ | |
</states>\r\n\ | |
<tunes>\r\n\ | |
</tunes>\r\n\ | |
<signal_map>\r\n\ | |
</signal_map>\r\n\ | |
</class>\r\n"; | |
const char* get_EDSS_LINE__XMLClassInfo() {return EDSS_LINE_XMLClassInfo;} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment