ooh245.c

来自「一个非常美妙的proxy。功能强大。基于sip的协议。如果还要的话」· C语言 代码 · 共 1,743 行 · 第 1/5 页

C
1,743
字号
            call->masterSlaveState =  OO_MasterSlave_Master;            OOTRACEINFO3("MasterSlaveDetermination done - Master(%s, %s)\n",                             call->callType, call->callToken);            return OO_OK;         }         if(masterSlave->terminalType > gH323ep.termType)         {            ooSendMasterSlaveDeterminationAck(call, "master");            call->masterSlaveState =  OO_MasterSlave_Slave;            OOTRACEINFO3("MasterSlaveDetermination done - Slave(%s, %s)\n",                             call->callType, call->callToken);            return OO_OK;         }         /* Since term types are same, master slave determination will            be done based on statusdetermination number         */                  OOTRACEDBGA3("Determining master-slave based on StatusDetermination"                      "Number (%s, %s)\n", call->callType, call->callToken);         if(call->masterSlaveState == OO_MasterSlave_DetermineSent)            statusDeterminationNumber = call->statusDeterminationNumber;         else            statusDeterminationNumber = ooGenerateStatusDeterminationNumber();                  if(masterSlave->statusDeterminationNumber <                        statusDeterminationNumber)         {            ooSendMasterSlaveDeterminationAck(call, "slave");            call->masterSlaveState =  OO_MasterSlave_Master;            OOTRACEINFO3("MasterSlaveDetermination done - Master(%s, %s)\n",                             call->callType, call->callToken);            return OO_OK;         }         if(masterSlave->statusDeterminationNumber >                          statusDeterminationNumber)         {            ooSendMasterSlaveDeterminationAck(call, "master");            call->masterSlaveState =  OO_MasterSlave_Slave;            OOTRACEINFO3("MasterSlaveDetermination done - Slave(%s, %s)\n",                             call->callType, call->callToken);            return OO_OK;         }         if(masterSlave->statusDeterminationNumber ==                          statusDeterminationNumber)         {            ooSendMasterSlaveDeterminationReject (call);            OOTRACEERR3("ERROR:MasterSlaveDetermination failed- identical "                        "numbers (%s, %s)\n", call->callType, call->callToken);         }         break;      case OOMasterSlaveAck:         masterSlaveAck = (H245MasterSlaveDeterminationAck*)pmsg;         if(call->masterSlaveState == OO_MasterSlave_DetermineSent)         {            if(masterSlaveAck->decision.t ==                T_H245MasterSlaveDeterminationAck_decision_master)            {               ooSendMasterSlaveDeterminationAck(call, "slave");               call->masterSlaveState =  OO_MasterSlave_Master;               OOTRACEINFO3("MasterSlaveDetermination done - Master(%s, %s)\n",                             call->callType, call->callToken);            }            else            {               ooSendMasterSlaveDeterminationAck(call, "master");               call->masterSlaveState = OO_MasterSlave_Slave;               OOTRACEINFO3("MasterSlaveDetermination done - Slave(%s, %s)\n",                             call->callType, call->callToken);            }         }                  if(call->localTermCapState == OO_LocalTermCapSetAckRecvd &&            call->remoteTermCapState == OO_RemoteTermCapSetAckSent)         {            /*Since Cap exchange and MasterSlave Procedures are done */            if(gH323ep.h323Callbacks.openLogicalChannels)               gH323ep.h323Callbacks.openLogicalChannels(call);            else{               if(!call->logicalChans)                  ooOpenLogicalChannels(call);            }#if 0            if(!call->logicalChans){               if(!gH323ep.h323Callbacks.openLogicalChannels)                  ooOpenLogicalChannels(call);               else                  gH323ep.h323Callbacks.openLogicalChannels(call);            }#endif         }         else            OOTRACEDBGC1("Not opening logical channels as Cap exchange "                         "remaining\n");         break;       default:          OOTRACEWARN3("Warn:Unhandled Master Slave message received - %s - "                       "%s\n", call->callType, call->callToken);   }   return OO_OK;      }int ooSendMasterSlaveDetermination(OOH323CallData *call){   int ret;   H245Message* ph245msg=NULL;   H245RequestMessage *request;   OOCTXT *pctxt=&gH323ep.msgctxt;   H245MasterSlaveDetermination* pMasterSlave;   /* Check whether Master Slave Determination already in progress */   if(call->masterSlaveState != OO_MasterSlave_Idle)   {      OOTRACEINFO3("MasterSlave determination already in progress (%s, %s)\n",                   call->callType, call->callToken);      return OO_OK;   }   ret = ooCreateH245Message(&ph245msg,                   T_H245MultimediaSystemControlMessage_request);   if(ret != OO_OK)   {      OOTRACEERR3("Error: creating H245 message - MasterSlave Determination "                  "(%s, %s)\n", call->callType, call->callToken);      return OO_FAILED;   }   ph245msg->msgType = OOMasterSlaveDetermination;   request = ph245msg->h245Msg.u.request;   request->t = T_H245RequestMessage_masterSlaveDetermination;   request->u.masterSlaveDetermination = (H245MasterSlaveDetermination*)            ASN1MALLOC(pctxt, sizeof(H245MasterSlaveDetermination));      pMasterSlave = request->u.masterSlaveDetermination;   memset(pMasterSlave, 0, sizeof(H245MasterSlaveDetermination));      pMasterSlave->terminalType = gH323ep.termType;    pMasterSlave->statusDeterminationNumber =                        ooGenerateStatusDeterminationNumber();   call->statusDeterminationNumber = pMasterSlave->statusDeterminationNumber;   OOTRACEDBGA3("Built MasterSlave Determination (%s, %s)\n", call->callType,                 call->callToken);    ret = ooSendH245Msg(call, ph245msg);   if(ret != OO_OK)   {      OOTRACEERR3("Error:Failed to enqueue MasterSlaveDetermination message to"                  " outbound queue. (%s, %s)\n", call->callType,                   call->callToken);   }else      call->masterSlaveState = OO_MasterSlave_DetermineSent;      ooFreeH245Message(call, ph245msg);   return ret;}int ooSendMasterSlaveDeterminationAck(OOH323CallData* call,                                      char * status){   int ret=0;   H245ResponseMessage * response=NULL;   H245Message *ph245msg=NULL;   OOCTXT *pctxt=&gH323ep.msgctxt;   ret = ooCreateH245Message(&ph245msg,                       T_H245MultimediaSystemControlMessage_response);   if(ret != OO_OK)   {      OOTRACEERR3("Error:H245 message creation failed for - MasterSlave "                  "Determination Ack (%s, %s)\n",call->callType,                   call->callToken);      return OO_FAILED;   }   ph245msg->msgType = OOMasterSlaveAck;   response = ph245msg->h245Msg.u.response;   memset(response, 0, sizeof(H245ResponseMessage));   response->t = T_H245ResponseMessage_masterSlaveDeterminationAck;   response->u.masterSlaveDeterminationAck = (H245MasterSlaveDeterminationAck*)                   ASN1MALLOC(pctxt, sizeof(H245MasterSlaveDeterminationAck));   memset(response->u.masterSlaveDeterminationAck, 0,                              sizeof(H245MasterSlaveDeterminationAck));   if(!strcmp("master", status))      response->u.masterSlaveDeterminationAck->decision.t =                          T_H245MasterSlaveDeterminationAck_decision_master;   else      response->u.masterSlaveDeterminationAck->decision.t =                          T_H245MasterSlaveDeterminationAck_decision_slave;      OOTRACEDBGA3("Built MasterSlave determination Ack (%s, %s)\n",                 call->callType, call->callToken);   ret = ooSendH245Msg(call, ph245msg);   if(ret != OO_OK)   {      OOTRACEERR3("Error:Failed to enqueue MasterSlaveDeterminationAck message"                  " to outbound queue. (%s, %s)\n", call->callType,                   call->callToken);   }      ooFreeH245Message(call, ph245msg);   return ret;}int ooSendMasterSlaveDeterminationReject (OOH323CallData* call){   int ret=0;   H245ResponseMessage* response=NULL;   H245Message *ph245msg=NULL;   OOCTXT *pctxt=&gH323ep.msgctxt;   ret = ooCreateH245Message      (&ph245msg, T_H245MultimediaSystemControlMessage_response);   if (ret != OO_OK) {      OOTRACEERR3("Error:H245 message creation failed for - MasterSlave "                  "Determination Reject (%s, %s)\n",call->callType,                   call->callToken);      return OO_FAILED;   }   ph245msg->msgType = OOMasterSlaveReject;   response = ph245msg->h245Msg.u.response;   response->t = T_H245ResponseMessage_masterSlaveDeterminationReject;   response->u.masterSlaveDeterminationReject =       (H245MasterSlaveDeterminationReject*)      memAlloc (pctxt, sizeof(H245MasterSlaveDeterminationReject));   response->u.masterSlaveDeterminationReject->cause.t =      T_H245MasterSlaveDeterminationReject_cause_identicalNumbers;   OOTRACEDBGA3 ("Built MasterSlave determination reject (%s, %s)\n", 		 call->callType, call->callToken);   ret = ooSendH245Msg (call, ph245msg);   if (ret != OO_OK) {      OOTRACEERR3 	 ("Error:Failed to enqueue MasterSlaveDeterminationReject "	  "message to outbound queue.(%s, %s)\n", call->callType, 	  call->callToken);   }      ooFreeH245Message (call, ph245msg);   return ret;}int ooSendMasterSlaveDeterminationRelease(OOH323CallData * call){   int ret=0;   H245IndicationMessage* indication=NULL;   H245Message *ph245msg=NULL;   OOCTXT *pctxt=&gH323ep.msgctxt;   ret = ooCreateH245Message      (&ph245msg, T_H245MultimediaSystemControlMessage_indication);   if (ret != OO_OK) {      OOTRACEERR3("Error:H245 message creation failed for - MasterSlave "                  "Determination Release (%s, %s)\n",call->callType,                   call->callToken);      return OO_FAILED;   }   ph245msg->msgType = OOMasterSlaveRelease;   indication = ph245msg->h245Msg.u.indication;   indication->t = T_H245IndicationMessage_masterSlaveDeterminationRelease;   indication->u.masterSlaveDeterminationRelease =       (H245MasterSlaveDeterminationRelease*)      memAlloc (pctxt, sizeof(H245MasterSlaveDeterminationRelease));   if(!indication->u.masterSlaveDeterminationRelease)   {      OOTRACEERR3("Error: Failed to allocate memory for MSDRelease message."                  " (%s, %s)\n", call->callType, call->callToken);      ooFreeH245Message(call, ph245msg);      return OO_FAILED;   }   OOTRACEDBGA3 ("Built MasterSlave determination Release (%s, %s)\n", 		 call->callType, call->callToken);   ret = ooSendH245Msg (call, ph245msg);   if (ret != OO_OK) {      OOTRACEERR3 	 ("Error:Failed to enqueue MasterSlaveDeterminationRelease "	  "message to outbound queue.(%s, %s)\n", call->callType, 	  call->callToken);   }      ooFreeH245Message (call, ph245msg);   return ret;}int ooHandleMasterSlaveReject   (OOH323CallData *call, H245MasterSlaveDeterminationReject* reject){   if(call->msdRetries < DEFAULT_MAX_RETRIES)   {      call->msdRetries++;      OOTRACEDBGA3("Retrying MasterSlaveDetermination. (%s, %s)\n",                     call->callType, call->callToken);      call->masterSlaveState = OO_MasterSlave_Idle;      ooSendMasterSlaveDetermination(call);      return OO_OK;   }   OOTRACEERR3("Error:Failed to complete MasterSlaveDetermination - "               "Ending call. (%s, %s)\n", call->callType, call->callToken);   if(call->callState < OO_CALL_CLEAR)   {      call->callEndReason = OO_REASON_LOCAL_CLEARED;      call->callState = OO_CALL_CLEAR;   }   return OO_OK;}int ooHandleOpenLogicalChannel(OOH323CallData* call,                                  H245OpenLogicalChannel *olc){   H245OpenLogicalChannel_forwardLogicalChannelParameters *flcp =    &(olc->forwardLogicalChannelParameters);   #if 0   if(!call->logicalChans)      ooOpenLogicalChannels(call);#endif   /* Check whether channel type is supported. Only supported channel       type for now is g711ulaw audio channel.   */   switch(flcp->dataType.t)   {   case T_H245DataType_nonStandard:      OOTRACEWARN3("Warn:Media channel data type "                   "'T_H245DataType_nonStandard' not supported (%s, %s)\n",                   call->callType, call->callToken);      ooSendOpenLogicalChannelReject(call, olc->forwardLogicalChannelNumber,             T_H245OpenLogicalChannelReject_cause_dataTypeNotSupported);      break;   case T_H245DataType_nullData:      OOTRACEWARN3("Warn:Media channel data type "                   "'T_H245DataType_nullData' not supported (%s, %s)\n",                   call->callType, call->callToken);      ooSendOpenLogicalChannelReject(call, olc->forwardLogicalChannelNumber,

⌨️ 快捷键说明

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