ooh245.c

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

C
1,743
字号
                   call->callType, call->callToken);      return OO_FAILED;   }      unicastAddr1 = h2250lcap->mediaControlChannel.u.unicastAddress;   if(unicastAddr1->t != T_H245UnicastAddress_iPAddress)   {      OOTRACEERR3("Error: Processing OpenLogicalChannelAck - media control "                  "channel address type is not IP (%s, %s)\n", call->callType,                    call->callToken);      return OO_FAILED;   }   iPAddress1 = unicastAddr1->u.iPAddress;   /* Set remote destination address for rtp session */   //   strcpy(call->remoteIP, remoteip);      /* Start channel here */   pLogicalChannel = ooFindLogicalChannelByLogicalChannelNo(call,olcAck->forwardLogicalChannelNumber);   if(!pLogicalChannel)   {      OOTRACEERR4("ERROR:Logical channel %d not found in the channel list for "                  "call (%s, %s)\n", olcAck->forwardLogicalChannelNumber,                   call->callType, call->callToken);      return OO_FAILED;   }   /* Update session id if we were waiting for remote to assign one and remote       did assign one. */   if(pLogicalChannel->sessionID == 0 && h2250lcap->m.sessionIDPresent)      pLogicalChannel->sessionID = h2250lcap->sessionID;      /* Populate ports &ip  for channel */   strcpy(pLogicalChannel->remoteIP, remoteip);      pLogicalChannel->remoteMediaPort = iPAddress->tsapIdentifier;   pLogicalChannel->remoteMediaControlPort = iPAddress1->tsapIdentifier;   if(pLogicalChannel->chanCap->startTransmitChannel)   {      pLogicalChannel->chanCap->startTransmitChannel(call, pLogicalChannel);      OOTRACEINFO4("TransmitLogical Channel of type %s started (%s, %s)\n",                    ooGetCapTypeText(pLogicalChannel->chanCap->cap),                   call->callType, call->callToken);   }   else{      OOTRACEERR3("ERROR:No callback registered for starting transmit channel "                  "(%s, %s)\n", call->callType, call->callToken);      return OO_FAILED;   }   pLogicalChannel->state = OO_LOGICALCHAN_ESTABLISHED;   return OO_OK;}int ooOnReceivedOpenLogicalChannelRejected(OOH323CallData *call,                                      H245OpenLogicalChannelReject *olcReject){   switch(olcReject->cause.t)   {   case T_H245OpenLogicalChannelReject_cause_unspecified:      OOTRACEINFO4("Open logical channel %d rejected - unspecified (%s, %s)\n",                   olcReject->forwardLogicalChannelNumber, call->callType,                    call->callToken);      break;   case T_H245OpenLogicalChannelReject_cause_unsuitableReverseParameters:      OOTRACEINFO4("Open logical channel %d rejected - "                   "unsuitableReverseParameters (%s, %s)\n",                    olcReject->forwardLogicalChannelNumber, call->callType,                    call->callToken);      break;   case T_H245OpenLogicalChannelReject_cause_dataTypeNotSupported:      OOTRACEINFO4("Open logical channel %d rejected - dataTypeNotSupported"                   "(%s, %s)\n", olcReject->forwardLogicalChannelNumber,                    call->callType, call->callToken);      break;   case T_H245OpenLogicalChannelReject_cause_dataTypeNotAvailable:      OOTRACEINFO4("Open logical channel %d rejected - dataTypeNotAvailable"                   "(%s, %s)\n", olcReject->forwardLogicalChannelNumber,                    call->callType, call->callToken);      break;   case T_H245OpenLogicalChannelReject_cause_unknownDataType:      OOTRACEINFO4("Open logical channel %d rejected - unknownDataType"                   "(%s, %s)\n", olcReject->forwardLogicalChannelNumber,                    call->callType, call->callToken);      break;   case T_H245OpenLogicalChannelReject_cause_dataTypeALCombinationNotSupported:      OOTRACEINFO4("Open logical channel %d rejected - "                   "dataTypeALCombinationNotSupported(%s, %s)\n",                    olcReject->forwardLogicalChannelNumber,                    call->callType, call->callToken);      break;   case T_H245OpenLogicalChannelReject_cause_multicastChannelNotAllowed:       OOTRACEINFO4("Open logical channel %d rejected - "                    "multicastChannelNotAllowed (%s, %s)\n",                     olcReject->forwardLogicalChannelNumber,                     call->callType, call->callToken);      break;   case T_H245OpenLogicalChannelReject_cause_insufficientBandwidth:      OOTRACEINFO4("Open logical channel %d rejected - insufficientBandwidth"                   "(%s, %s)\n", olcReject->forwardLogicalChannelNumber,                    call->callType, call->callToken);      break;   case T_H245OpenLogicalChannelReject_cause_separateStackEstablishmentFailed:      OOTRACEINFO4("Open logical channel %d rejected - "                    "separateStackEstablishmentFailed (%s, %s)\n",                     olcReject->forwardLogicalChannelNumber,                     call->callType, call->callToken);      break;   case T_H245OpenLogicalChannelReject_cause_invalidSessionID:      OOTRACEINFO4("Open logical channel %d rejected - "                    "invalidSessionID (%s, %s)\n",                     olcReject->forwardLogicalChannelNumber,                     call->callType, call->callToken);      break;   case T_H245OpenLogicalChannelReject_cause_masterSlaveConflict:      OOTRACEINFO4("Open logical channel %d rejected - "                    "invalidSessionID (%s, %s)\n",                     olcReject->forwardLogicalChannelNumber,                     call->callType, call->callToken);      break;   case T_H245OpenLogicalChannelReject_cause_waitForCommunicationMode:      OOTRACEINFO4("Open logical channel %d rejected - "                    "waitForCommunicationMode (%s, %s)\n",                     olcReject->forwardLogicalChannelNumber,                     call->callType, call->callToken);      break;   case T_H245OpenLogicalChannelReject_cause_invalidDependentChannel:      OOTRACEINFO4("Open logical channel %d rejected - "                    "invalidDependentChannel (%s, %s)\n",                     olcReject->forwardLogicalChannelNumber,                     call->callType, call->callToken);      break;   case T_H245OpenLogicalChannelReject_cause_replacementForRejected:      OOTRACEINFO4("Open logical channel %d rejected - "                    "replacementForRejected (%s, %s)\n",                     olcReject->forwardLogicalChannelNumber,                     call->callType, call->callToken);      break;   default:      OOTRACEERR4("Error: OpenLogicalChannel %d rejected - "                  "invalid cause(%s, %s)\n",                   olcReject->forwardLogicalChannelNumber,                     call->callType, call->callToken);   }   if(call->callState < OO_CALL_CLEAR)   {      call->callState = OO_CALL_CLEAR;      call->callEndReason = OO_REASON_LOCAL_CLEARED;   }   return OO_OK;}/** * Currently only disconnect end session command is supported. **/int ooSendEndSessionCommand(OOH323CallData *call){   int ret;   H245CommandMessage * command;   OOCTXT *pctxt;   H245Message *ph245msg=NULL;   ret = ooCreateH245Message(&ph245msg,                       T_H245MultimediaSystemControlMessage_command);   if(ret != OO_OK)   {      OOTRACEERR3("Error: H245 message creation failed for - End Session "                  "Command (%s, %s)\n", call->callType, call->callToken);      return OO_FAILED;   }   ph245msg->msgType = OOEndSessionCommand;   command = ph245msg->h245Msg.u.command;   pctxt = &gH323ep.msgctxt;   memset(command, 0, sizeof(H245CommandMessage));   command->t = T_H245CommandMessage_endSessionCommand;   command->u.endSessionCommand = (H245EndSessionCommand*) ASN1MALLOC(pctxt,                                  sizeof(H245EndSessionCommand));   memset(command->u.endSessionCommand, 0, sizeof(H245EndSessionCommand));   command->u.endSessionCommand->t = T_H245EndSessionCommand_disconnect;   OOTRACEDBGA3("Built EndSession Command (%s, %s)\n", call->callType,                call->callToken);   ret = ooSendH245Msg(call, ph245msg);   if(ret != OO_OK)   {      OOTRACEERR3("Error:Failed to enqueue EndSession message to outbound "                  "queue.(%s, %s)\n", call->callType, call->callToken);   }   ooFreeH245Message(call, ph245msg);   return ret;}int ooHandleH245Command(OOH323CallData *call,                         H245CommandMessage *command){   ASN1UINT i;   DListNode *pNode = NULL;   OOTimer *pTimer = NULL;   OOTRACEDBGC3("Handling H.245 command message. (%s, %s)\n", call->callType,                 call->callToken);   switch(command->t)   {      case T_H245CommandMessage_endSessionCommand:         OOTRACEINFO3("Received EndSession command (%s, %s)\n",                        call->callType, call->callToken);         if(call->h245SessionState == OO_H245SESSION_ENDSENT)         {            /* Disable Session timer */            for(i = 0; i<call->timerList.count; i++)            {               pNode = dListFindByIndex(&call->timerList, i);               pTimer = (OOTimer*)pNode->data;               if(((ooTimerCallback*)pTimer->cbData)->timerType &                                                             OO_SESSION_TIMER)               {                  ASN1MEMFREEPTR(call->pctxt, pTimer->cbData);                  ooTimerDelete(call->pctxt, &call->timerList, pTimer);                  OOTRACEDBGC3("Deleted Session Timer. (%s, %s)\n",                                 call->callType, call->callToken);                  break;               }	    }            ooCloseH245Connection(call);         }else{            call->h245SessionState = OO_H245SESSION_ENDRECVD;#if 0            if(call->callState < OO_CALL_CLEAR)               call->callState = OO_CALL_CLEAR;#else             if(call->logicalChans)            {               OOTRACEINFO3("In response to received EndSessionCommand - "                            "Clearing all logical channels. (%s, %s)\n",                             call->callType, call->callToken);               ooClearAllLogicalChannels(call);	    }            ooSendEndSessionCommand(call);#endif         }                                 break;      case T_H245CommandMessage_sendTerminalCapabilitySet:         OOTRACEWARN3("Warning: Received command Send terminal capability set "                      "- Not handled (%s, %s)\n", call->callType,                       call->callToken);         break;      case T_H245CommandMessage_flowControlCommand:         OOTRACEWARN3("Warning: Flow control command received - Not handled "                      "(%s, %s)\n", call->callType, call->callToken);         break;      default:         OOTRACEWARN3("Warning: Unhandled H245 command message received "                      "(%s, %s)\n", call->callType, call->callToken);   }   OOTRACEDBGC3("Handling H.245 command message done. (%s, %s)\n",                  call->callType, call->callToken);      return OO_OK;}int ooOnReceivedTerminalCapabilitySetAck(OOH323CallData* call){   call->localTermCapState = OO_LocalTermCapSetAckRecvd;   if(call->remoteTermCapState != OO_RemoteTermCapSetAckSent)      return OO_OK;      if(call->masterSlaveState == OO_MasterSlave_Master ||       call->masterSlaveState == OO_MasterSlave_Slave)   {      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   }         return OO_OK;}int ooCloseAllLogicalChannels(OOH323CallData *call){   ooLogicalChannel *temp;   temp = call->logicalChans;   while(temp)   {      if(temp->state == OO_LOGICALCHAN_ESTABLISHED)      {         /* Sending closelogicalchannel only for outgoing channels*/         if(!strcmp(temp->dir, "transmit"))         {            ooSendCloseLogicalChannel(call, temp);         }         else{            ooSendRequestCloseLogicalChannel(call, temp);         }      }      temp = temp->next;   }   return OO_OK;}int ooSendCloseLogicalChannel(OOH323CallData *call, ooLogicalChannel *logicalChan){   int ret = OO_OK, error=0;   H245Message *ph245msg = NULL;   OOCTXT *pctxt;   H245RequestMessage *request;   H245CloseLogicalChannel* clc;      ret = ooCreateH245Message(&ph245msg,                              T_H245MultimediaSystemControlMessage_request);   if(ret != OO_OK)   {      OOTRACEERR3("ERROR:Failed to create H245 message for closeLogicalChannel"                  " message (%s, %s)\n", call->callType, call->callToken);      return OO_FAILED;   }   ph245msg->msgType = OOCloseLogicalChannel;   ph245msg->logicalChannelNo = logicalChan->channelNo;   pctxt = &gH323ep.msgctxt;   request = ph245msg->h245Msg.u.request;   request->t = T_H245RequestMessage_closeLogicalChannel;   request->u.closeLogicalChannel = (H245CloseLogicalChannel*)ASN1MALLOC(pctxt,                                     sizeof(H245CloseLogicalChannel));   if(!request->u.closeLogicalChannel)   {      OOTRACEERR3("ERROR:Memory allocation for CloseLogicalChannel failed "                  "(%s, %s)\n", call->callType, call->callToken);      ooFreeH245Message(call, ph245msg);      return OO_FAILED;   }   clc = request->u.closeLogicalChannel;   memset(clc, 0, sizeof(H245CloseLogicalChannel));   clc->forwardLogicalChan

⌨️ 快捷键说明

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