oocalls.c
来自「一个非常美妙的proxy。功能强大。基于sip的协议。如果还要的话」· C语言 代码 · 共 781 行 · 第 1/2 页
C
781 行
/* * Copyright (C) 2004-2005 by Objective Systems, Inc. * * This software is furnished under an open source license and may be * used and copied only in accordance with the terms of this license. * The text of the license may generally be found in the root * directory of this installation in the COPYING file. It * can also be viewed online at the following URL: * * http://www.obj-sys.com/open/license.html * * Any redistributions of this file including modified versions must * maintain this copyright notice. * *****************************************************************************/#include "ootrace.h"#include "ootypes.h"#include "ooCalls.h"#include "ooUtils.h"#include "ooports.h"#include "oochannels.h"#include "ooh245.h"#include "ooCapability.h"#include "ooGkClient.h"#include "ooh323ep.h"#include "ooCalls.h"/** Global endpoint structure */extern OOH323EndPoint gH323ep;OOH323CallData* ooCreateCall(char* type, char*callToken){ OOH323CallData *call=NULL; OOCTXT *pctxt=NULL; pctxt = newContext(); if(!pctxt) { OOTRACEERR1("ERROR:Failed to create OOCTXT for new call\n"); return NULL; } call = (OOH323CallData*)memAlloc(pctxt, sizeof(OOH323CallData)); if(!call) { OOTRACEERR1("ERROR:Memory - ooCreateCall - call\n"); return NULL; } /* memset(call, 0, sizeof(OOH323CallData));*/ call->pctxt = pctxt; call->callMode = gH323ep.callMode; sprintf(call->callToken, "%s", callToken); sprintf(call->callType, "%s", type); call->callReference = 0; if(gH323ep.callerid){ strncpy(call->ourCallerId, gH323ep.callerid, sizeof(call->ourCallerId)-1); call->ourCallerId[sizeof(call->ourCallerId)-1] = '\0'; }else call->ourCallerId[0] = '\0'; memset(&call->callIdentifier, 0, sizeof(H225CallIdentifier)); memset(&call->confIdentifier, 0, sizeof(H225ConferenceIdentifier)); call->flags = 0; if (OO_TESTFLAG(gH323ep.flags, OO_M_TUNNELING)) OO_SETFLAG (call->flags, OO_M_TUNNELING); if(gH323ep.gkClient) { if(OO_TESTFLAG(gH323ep.flags, OO_M_GKROUTED)) { OO_SETFLAG(call->flags, OO_M_GKROUTED); } } if (OO_TESTFLAG(gH323ep.flags, OO_M_FASTSTART)) OO_SETFLAG (call->flags, OO_M_FASTSTART); call->callState = OO_CALL_CREATED; call->callEndReason = OO_REASON_UNKNOWN; call->pCallFwdData = NULL; if(!strcmp(call->callType, "incoming")) { call->callingPartyNumber = NULL; }else{ if(ooUtilsIsStrEmpty(gH323ep.callingPartyNumber)) { call->callingPartyNumber = NULL; }else{ call->callingPartyNumber = (char*) memAlloc(call->pctxt, strlen(gH323ep.callingPartyNumber)+1); if(call->callingPartyNumber) { strcpy(call->callingPartyNumber, gH323ep.callingPartyNumber); }else{ OOTRACEERR3("Error:Memory - ooCreateCall - callingPartyNumber" ".(%s, %s)\n", call->callType, call->callToken); freeContext(pctxt); return NULL; } } } call->calledPartyNumber = NULL; call->h245ConnectionAttempts = 0; call->h245SessionState = OO_H245SESSION_IDLE; call->dtmfmode = gH323ep.dtmfmode; call->mediaInfo = NULL; strcpy(call->localIP, gH323ep.signallingIP); call->pH225Channel = NULL; call->pH245Channel = NULL; call->h245listener = NULL; call->h245listenport = NULL; call->remoteIP[0] = '\0'; call->remotePort = 0; call->remoteH245Port = 0; call->remoteDisplayName = NULL; call->remoteAliases = NULL; call->ourAliases = NULL; call->masterSlaveState = OO_MasterSlave_Idle; call->statusDeterminationNumber = 0; call->localTermCapState = OO_LocalTermCapExchange_Idle; call->remoteTermCapState = OO_RemoteTermCapExchange_Idle; call->ourCaps = NULL; call->remoteCaps = NULL; call->jointCaps = NULL; dListInit(&call->remoteFastStartOLCs); call->remoteTermCapSeqNo =0; call->localTermCapSeqNo = 0; memcpy(&call->capPrefs, &gH323ep.capPrefs, sizeof(OOCapPrefs)); call->logicalChans = NULL; call->noOfLogicalChannels = 0; call->logicalChanNoBase = 1001; call->logicalChanNoMax = 1100; call->logicalChanNoCur = 1001; call->nextSessionID = 4; /* 1,2,3 are reserved for audio, video and data */ dListInit(&call->timerList); call->msdRetries = 0; call->usrData = NULL; OOTRACEINFO3("Created a new call (%s, %s)\n", call->callType, call->callToken); /* Add new call to calllist */ ooAddCallToList (call); if(gH323ep.h323Callbacks.onNewCallCreated) gH323ep.h323Callbacks.onNewCallCreated(call); return call;}int ooAddCallToList(OOH323CallData *call){ if(!gH323ep.callList) { gH323ep.callList = call; call->next = NULL; call->prev = NULL; } else{ call->next = gH323ep.callList; call->prev = NULL; gH323ep.callList->prev = call; gH323ep.callList = call; } return OO_OK;}int ooEndCall(OOH323CallData *call){ OOTRACEDBGA4("In ooEndCall call state is - %s (%s, %s)\n", ooGetCallStateText(call->callState), call->callType, call->callToken); if(call->callState == OO_CALL_CLEARED) { ooCleanCall(call); return OO_OK; } if(call->logicalChans) { OOTRACEINFO3("Clearing all logical channels. (%s, %s)\n", call->callType, call->callToken); ooClearAllLogicalChannels(call); } if(!OO_TESTFLAG(call->flags, OO_M_ENDSESSION_BUILT)) { if(call->h245SessionState == OO_H245SESSION_ACTIVE || call->h245SessionState == OO_H245SESSION_ENDRECVD) { ooSendEndSessionCommand(call); OO_SETFLAG(call->flags, OO_M_ENDSESSION_BUILT); } } if(!call->pH225Channel || call->pH225Channel->sock ==0) { call->callState = OO_CALL_CLEARED; }else{ if(!OO_TESTFLAG(call->flags, OO_M_RELEASE_BUILT)) { if(call->callState == OO_CALL_CLEAR || call->callState == OO_CALL_CLEAR_RELEASERECVD) { ooSendReleaseComplete(call); OO_SETFLAG(call->flags, OO_M_RELEASE_BUILT); } } } return OO_OK;}int ooRemoveCallFromList (OOH323CallData *call){ if(!call) return OO_OK; if(call == gH323ep.callList) { if(!call->next) gH323ep.callList = NULL; else{ call->next->prev = NULL; gH323ep.callList = call->next; } } else{ call->prev->next = call->next; if(call->next) call->next->prev = call->prev; } return OO_OK;}int ooCleanCall(OOH323CallData *call){ OOCTXT *pctxt; OOTRACEWARN4 ("Cleaning Call (%s, %s)- reason:%s\n", call->callType, call->callToken, ooGetReasonCodeText (call->callEndReason)); /* First clean all the logical channels, if not already cleaned. */ if(call->logicalChans) ooClearAllLogicalChannels(call); /* Close H.245 connection, if not already closed */ if(call->h245SessionState != OO_H245SESSION_CLOSED) ooCloseH245Connection(call); else{ if(call->pH245Channel && call->pH245Channel->outQueue.count > 0) { dListFreeAll(call->pctxt, &(call->pH245Channel->outQueue)); memFreePtr(call->pctxt, call->pH245Channel); } } /* Close H.245 listener, if not already closed */ if(call->h245listener) { ooCloseH245Listener(call); } /* Close H225 connection, if not already closed. */ if (0 != call->pH225Channel && 0 != call->pH225Channel->sock) { ooCloseH225Connection(call); } /* Clean timers */ if(call->timerList.count > 0) { dListFreeAll(call->pctxt, &(call->timerList)); } if(gH323ep.gkClient && !OO_TESTFLAG(call->flags, OO_M_DISABLEGK)) { ooGkClientCleanCall(gH323ep.gkClient, call); } ooRemoveCallFromList (call); OOTRACEINFO3("Removed call (%s, %s) from list\n", call->callType, call->callToken); if(call->pCallFwdData && call->pCallFwdData->fwdedByRemote) { if(gH323ep.h323Callbacks.onCallForwarded) gH323ep.h323Callbacks.onCallForwarded(call); if(ooH323HandleCallFwdRequest(call)!= OO_OK) { OOTRACEERR3("Error:Failed to forward call (%s, %s)\n", call->callType, call->callToken); } }else { if(gH323ep.h323Callbacks.onCallCleared) gH323ep.h323Callbacks.onCallCleared(call); } pctxt = call->pctxt; freeContext(pctxt); ASN1CRTFREE0(pctxt); return OO_OK;}int ooCallSetCallerId(OOH323CallData* call, const char* callerid){ if(!call || !callerid) return OO_FAILED; strncpy(call->ourCallerId, callerid, sizeof(call->ourCallerId)-1); call->ourCallerId[sizeof(call->ourCallerId)-1]='\0'; return OO_OK;}int ooCallSetCallingPartyNumber(OOH323CallData *call, const char *number){ if(call->callingPartyNumber) memFreePtr(call->pctxt, call->callingPartyNumber); call->callingPartyNumber = (char*) memAlloc(call->pctxt, strlen(number)+1); if(call->callingPartyNumber) { strcpy(call->callingPartyNumber, number); }else{ OOTRACEERR3("Error:Memory - ooCallSetCallingPartyNumber - " "callingPartyNumber.(%s, %s)\n", call->callType, call->callToken); return OO_FAILED; } /* Set dialed digits alias */ /* if(!strcmp(call->callType, "outgoing")) { ooCallAddAliasDialedDigits(call, number); }*/ return OO_OK;}int ooCallGetCallingPartyNumber(OOH323CallData *call, char *buffer, int len){ if(call->callingPartyNumber) { if(len>(int)strlen(call->callingPartyNumber)) { strcpy(buffer, call->callingPartyNumber); return OO_OK; } } return OO_FAILED;}int ooCallSetCalledPartyNumber(OOH323CallData *call, const char *number){ if(call->calledPartyNumber) memFreePtr(call->pctxt, call->calledPartyNumber); call->calledPartyNumber = (char*) memAlloc(call->pctxt, strlen(number)+1); if(call->calledPartyNumber) { strcpy(call->calledPartyNumber, number); }else{ OOTRACEERR3("Error:Memory - ooCallSetCalledPartyNumber - " "calledPartyNumber.(%s, %s)\n", call->callType, call->callToken); return OO_FAILED; } return OO_OK;}int ooCallGetCalledPartyNumber(OOH323CallData *call, char *buffer, int len){ if(call->calledPartyNumber) { if(len>(int)strlen(call->calledPartyNumber)) { strcpy(buffer, call->calledPartyNumber); return OO_OK; } } return OO_FAILED;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?