ooq931.c

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

C
1,944
字号
   releaseComplete->reason.t = h225ReasonCode;   /* Add user-user ie */   q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=TRUE;    q931msg->userInfo->h323_uu_pdu.h245Tunneling = OO_TESTFLAG (call->flags, OO_M_TUNNELING);   q931msg->userInfo->h323_uu_pdu.h323_message_body.t =            T_H225H323_UU_PDU_h323_message_body_releaseComplete;      q931msg->userInfo->h323_uu_pdu.h323_message_body.u.releaseComplete =                                                              releaseComplete;   releaseComplete->m.callIdentifierPresent = 1;   releaseComplete->protocolIdentifier = gProtocolID;   releaseComplete->callIdentifier.guid.numocts =            call->callIdentifier.guid.numocts;   memcpy(releaseComplete->callIdentifier.guid.data,                                   call->callIdentifier.guid.data,                                  call->callIdentifier.guid.numocts);   OOTRACEDBGA3("Built Release Complete message (%s, %s)\n",                call->callType, call->callToken);   /* Send H225 message */      ret = ooSendH225Msg(call, q931msg);   if(ret != OO_OK)   {      OOTRACEERR3("Error:Failed to enqueue ReleaseComplete message to outbound"                  " queue.(%s, %s)\n", call->callType, call->callToken);   }   memReset(&gH323ep.msgctxt);   return ret;}int ooSendConnect(OOH323CallData *call){   ooAcceptCall(call);   return OO_OK;}/*TODO: Need to clean logical channel in case of failure after creating one */int ooAcceptCall(OOH323CallData *call){   int ret = 0, i=0, j=0, remoteMediaPort=0, remoteMediaControlPort = 0, dir=0;   char remoteMediaIP[20], remoteMediaControlIP[20];   H225Connect_UUIE *connect;   H225TransportAddress_ipAddress *h245IpAddr;   H225VendorIdentifier *vendor;   Q931Message *q931msg=NULL;   DListNode *pNode = NULL;   H245OpenLogicalChannel *olc = NULL, printOlc;   ooH323EpCapability *epCap = NULL;   ASN1DynOctStr *pFS=NULL;   OOCTXT *pctxt = &gH323ep.msgctxt;      H245H2250LogicalChannelParameters *h2250lcp = NULL;     ooLogicalChannel* pChannel;   ret = ooCreateQ931Message(&q931msg, Q931ConnectMsg);   if(ret != OO_OK)   {            OOTRACEERR1("Error: In allocating memory for - H225 "                  "Connect message\n");      return OO_FAILED;   }   q931msg->callReference = call->callReference;   /* Set bearer capability */   if(OO_OK != ooSetBearerCapabilityIE(q931msg, Q931CCITTStd,                        Q931TransferUnrestrictedDigital, Q931TransferPacketMode,                       Q931TransferRatePacketMode, Q931UserInfoLayer1G722G725))     //                          Q931TransferSpeech, Q931TransferCircuitMode,     //                   Q931TransferRate64Kbps, Q931UserInfoLayer1G711ULaw))   {      OOTRACEERR3("Error: Failed to set bearer capability ie. (%s, %s)\n",                   call->callType, call->callToken);      return OO_FAILED;   }   q931msg->userInfo = (H225H323_UserInformation*)      memAllocZ (pctxt,sizeof(H225H323_UserInformation));   if(!q931msg->userInfo)   {      OOTRACEERR1("ERROR:Memory - ooAcceptCall - userInfo\n");      return OO_FAILED;   }      q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=TRUE;    q931msg->userInfo->h323_uu_pdu.h245Tunneling =       OO_TESTFLAG (call->flags, OO_M_TUNNELING);    q931msg->userInfo->h323_uu_pdu.h323_message_body.t =       T_H225H323_UU_PDU_h323_message_body_connect;      connect = (H225Connect_UUIE*)      memAllocZ (pctxt, sizeof(H225Connect_UUIE));   if(!connect)   {      OOTRACEERR1("ERROR:Memory - ooAcceptCall - connect\n");      return OO_FAILED;   }   q931msg->userInfo->h323_uu_pdu.h323_message_body.u.connect = connect;   connect->m.fastStartPresent = 0;   connect->m.multipleCallsPresent = 1;   connect->m.maintainConnectionPresent = 1;   connect->multipleCalls = FALSE;   connect->maintainConnection = FALSE;         connect->conferenceID.numocts = 16;   for (i = 0; i < 16; i++)      connect->conferenceID.data[i] = i + 1;   connect->m.callIdentifierPresent = 1;   connect->callIdentifier.guid.numocts =                                  call->callIdentifier.guid.numocts;   memcpy(connect->callIdentifier.guid.data, call->callIdentifier.guid.data,                                          call->callIdentifier.guid.numocts);      connect->conferenceID.numocts = call->confIdentifier.numocts;   memcpy(connect->conferenceID.data, call->confIdentifier.data,          call->confIdentifier.numocts);   /* Populate alias addresses */   connect->m.connectedAddressPresent = TRUE;   if(call->ourAliases)      ret = ooPopulateAliasList(pctxt, call->ourAliases,                                       &connect->connectedAddress);   else      ret =  ooPopulateAliasList(pctxt, gH323ep.aliases,                                         &connect->connectedAddress);   if(OO_OK != ret)   {      OOTRACEERR1("Error:Failed to populate alias list in Connect message\n");      memReset(pctxt);      return OO_FAILED;   }   connect->m.presentationIndicatorPresent = TRUE;   connect->presentationIndicator.t =                              T_H225PresentationIndicator_presentationAllowed;   connect->m.screeningIndicatorPresent = TRUE;   connect->screeningIndicator = userProvidedNotScreened;   connect->protocolIdentifier = gProtocolID;     /* Pose as Terminal or Gateway */   if(gH323ep.isGateway)      connect->destinationInfo.m.gatewayPresent = TRUE;   else      connect->destinationInfo.m.terminalPresent = TRUE;      connect->destinationInfo.m.vendorPresent = 1;   vendor = &connect->destinationInfo.vendor;         vendor->vendor.t35CountryCode = gH323ep.t35CountryCode;   vendor->vendor.t35Extension = gH323ep.t35Extension;   vendor->vendor.manufacturerCode = gH323ep.manufacturerCode;   if(gH323ep.productID)   {      vendor->m.productIdPresent = 1;      vendor->productId.numocts = ASN1MIN(strlen(gH323ep.productID),                                             sizeof(vendor->productId.data));      strncpy(vendor->productId.data, gH323ep.productID,                                                    vendor->productId.numocts);   }   if(gH323ep.versionID)   {      vendor->m.versionIdPresent = 1;      vendor->versionId.numocts = ASN1MIN(strlen(gH323ep.versionID),                                            sizeof(vendor->versionId.data));      strncpy(vendor->versionId.data, gH323ep.versionID,                                                    vendor->versionId.numocts);    }   /* If fast start supported and remote endpoint has sent faststart element */   if(OO_TESTFLAG(gH323ep.flags, OO_M_FASTSTART) &&       call->remoteFastStartOLCs.count>0)   {      pFS = (ASN1DynOctStr*)memAlloc(pctxt,                         call->remoteFastStartOLCs.count*sizeof(ASN1DynOctStr));      if(!pFS)      {         OOTRACEERR3("Error:Memory - ooAcceptCall - pFS (%s, %s)\n",                       call->callType, call->callToken);             return OO_FAILED;      }      memset(pFS, 0, call->remoteFastStartOLCs.count*sizeof(ASN1DynOctStr));      for(i=0, j=0; i<(int)call->remoteFastStartOLCs.count; i++)      {         pNode = dListFindByIndex(&call->remoteFastStartOLCs, i);         olc = (H245OpenLogicalChannel*)pNode->data;         if(olc->forwardLogicalChannelParameters.dataType.t !=                                                    T_H245DataType_nullData &&            olc->m.reverseLogicalChannelParametersPresent)         {            OOTRACEINFO3("Ignoring bidirectional OLC as it is not supported."                         "(%s, %s)\n", call->callType, call->callToken);            continue;         }         /* Forward Channel - remote transmits - local receives */         if(olc->forwardLogicalChannelParameters.dataType.t !=                                                    T_H245DataType_nullData)         {            OOTRACEDBGC4("Processing received forward olc %d (%s, %s)\n",                           olc->forwardLogicalChannelNumber, call->callType,                           call->callToken);            dir = OORX;            epCap = ooIsDataTypeSupported(call,                                 &olc->forwardLogicalChannelParameters.dataType,                                OORX);            if(!epCap)                continue;            OOTRACEINFO1("Receive Channel data type supported\n");            if(olc->forwardLogicalChannelParameters.multiplexParameters.t !=               T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters)            {               OOTRACEERR4("ERROR:Unknown multiplex parameter type for "                           "channel %d (%s, %s)\n",                            olc->forwardLogicalChannelNumber,                            call->callType, call->callToken);               memFreePtr(call->pctxt, epCap);               epCap = NULL;               continue;            }            h2250lcp = olc->forwardLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters;            if(ooIsSessionEstablished(call, olc->forwardLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters->sessionID, "receive"))            {               OOTRACEINFO4("Receive channel with sessionID %d already "                            "established.(%s, %s)\n", olc->forwardLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters->sessionID,                             call->callType, call->callToken);               memFreePtr(call->pctxt, epCap);               epCap = NULL;               continue;            }            /* Extract mediaControlChannel info, if supplied */            if(h2250lcp->m.mediaControlChannelPresent)            {               if(OO_OK != ooGetIpPortFromH245TransportAddress(call,                                 &h2250lcp->mediaControlChannel,                                 remoteMediaControlIP, &remoteMediaControlPort))               {                  OOTRACEERR3("Error: Invalid media control channel address "                              "(%s, %s)\n", call->callType, call->callToken);                  memFreePtr(call->pctxt, epCap);                  epCap = NULL;                  continue;               }            }         }         else if(olc->m.reverseLogicalChannelParametersPresent)         {/* Reverse channel - remote receives - local transmits */            OOTRACEDBGC4("Processing received reverse olc %d (%s, %s)\n",                           olc->forwardLogicalChannelNumber, call->callType,                           call->callToken);            dir = OOTX;            epCap = ooIsDataTypeSupported(call,                                 &olc->reverseLogicalChannelParameters.dataType,                                OOTX);            if(!epCap)                continue;            OOTRACEINFO1("Transmit Channel data type supported\n");            if(olc->reverseLogicalChannelParameters.multiplexParameters.t !=                T_H245OpenLogicalChannel_reverseLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters)            {               OOTRACEERR4("ERROR:Unknown multiplex parameter type for "                           "channel %d (%s, %s)\n",                            olc->forwardLogicalChannelNumber,                            call->callType, call->callToken);               memFreePtr(call->pctxt, epCap);               epCap = NULL;               continue;            }            if(ooIsSessionEstablished(call, olc->reverseLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters->sessionID, "transmit"))            {               OOTRACEINFO4("Transmit session with sessionID %d already "                            "established.(%s, %s)\n", olc->reverseLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters->sessionID, call->callType, call->callToken);               memFreePtr(call->pctxt, epCap);               epCap = NULL;               continue;            }             /* Extract the remote media endpoint address */            h2250lcp = olc->reverseLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters;            if(!h2250lcp)            {               OOTRACEERR3("ERROR:Invalid OLC received in fast start. No "                           "reverse Logical Channel Parameters found. "                           "(%s, %s)\n", call->callType, call->callToken);               memFreePtr(call->pctxt, epCap);               epCap = NULL;               return OO_FAILED;            }            if(!h2250lcp->m.mediaChannelPresent)            {               OOTRACEERR3("ERROR:Invalid OLC received in fast start. No "                           "reverse media channel information found. "                           "(%s, %s)\n", call->callType, call->callToken);               memFreePtr(call->pctxt, epCap);               epCap = NULL;               return OO_FAILED;            }            if(OO_OK != ooGetIpPortFromH245TransportAddress(call,                                 &h2250lcp->mediaChannel,                                 remoteMediaIP, &remoteMediaPort))            {               OOTRACEERR3("Error: Invalid media  channel address "                           "(%s, %s)\n", call->callType, call->callToken);               memFreePtr(call->pctxt, epCap);               epCap = NULL;               continue;            }            /* Extract mediaControlChannel info, if supplied */            if(h2250lcp->m.mediaControlChannelPresent)            {               if(OO_OK != ooGetIpPortFromH245TransportAddress(call,                                 &h2250lcp->mediaControlChannel,                                 remoteMediaControlIP, &remoteMediaControlPort))               {                  OOTRACEERR3("Error: Invalid media control channel address "                              "(%s, %s)\n", call->callType, call->callToken);                  memFreePtr(call->pctxt, epCap);                  epCap = NULL;                  continue;               }            }         }         if(dir & OOTX)	 {  /* According to the spec if we are accepting olc for transmission               from called endpoint to calling endpoint, called endpoint should               insert a unqiue forwardLogicalChannelNumber into olc	    */            olc->forwardLogicalChannelNumber =  call->logicalChanNoCur++;            if(call->logicalChanNoCur > call->logicalChanNoMax)               call->logicalChanNoCur = call->logicalChanNoBase;         }                  ooPrepareFastStartResponseOLC(call, olc, epCap, pctxt, dir);                  pChannel = ooFindLogicalChannelByLogicalChannelNo	    (call, olc->forwardLogicalChannelNumber);            if(dir & OORX)         {            strcpy(pChannel->remoteIP, remoteMediaControlIP);            pChannel->remoteMediaControlPort = remoteMediaControlPort;            if(epCap->startReceiveChannel)            {                  epCap->startReceiveChannel(call, pChannel);                     OOTRACEINFO4("Receive channel of type %s started (%s, %s)\n",                         (epCap->capType == OO_CAP_TYPE_AUDIO)?"audio":"video",                        call->callType, call->callToken);            }            else{               OOTRACEERR4("ERROR:No callback registered to start receive %s"                          " channel (%s, %s)\n",                         (epCap->capType == OO_CAP_TYPE_AUDIO)?"audio":"video",                            call->callType, call->callToken);               return OO_FAILED;            }         }         if(dir & OOTX)         {            pChannel->remoteMediaPort = remoteMediaPort;            strcpy(pChannel->remoteIP, remoteMediaIP);            pChannel->remoteMediaControlPort = remoteMediaControlPort;            if(epCap->startTransmitChannel)            {                  epCap->startTransmitChannel(call, pChannel);                     OOTRACEINFO3("Transmit channel of type audio started "                            "(%s, %s)\n", call->callType, call->callToken);	       /*OO_SETFLAG (call->flags, OO_M_AUDIO);*/            }            else{

⌨️ 快捷键说明

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