ooq931.c

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

C
1,944
字号
               OOTRACEERR3("ERROR:No callback registered to start transmit"                           " audio channel (%s, %s)\n", call->callType,                            call->callToken);               return OO_FAILED;            }         }         /* Do not specify msg buffer let automatic allocation work */         setPERBuffer(pctxt, NULL, 0, 1);         if(asn1PE_H245OpenLogicalChannel(pctxt, olc) != ASN_OK)         {            OOTRACEERR3("ERROR:Encoding of olc failed for faststart "                        "(%s, %s)\n", call->callType, call->callToken);            ooFreeQ931Message(q931msg);            if(call->callState < OO_CALL_CLEAR)            {               call->callEndReason = OO_REASON_LOCAL_CLEARED;               call->callState = OO_CALL_CLEAR;            }            return OO_FAILED;         }         pFS[j].data = encodeGetMsgPtr(pctxt, &(pFS[j].numocts));         /* Dump faststart element in logfile for debugging purpose */         setPERBuffer(pctxt,  (char*)pFS[j].data, pFS[j].numocts, 1);         initializePrintHandler(&printHandler, "FastStart Element");         setEventHandler (pctxt, &printHandler);         memset(&printOlc, 0, sizeof(printOlc));         ret = asn1PD_H245OpenLogicalChannel(pctxt, &(printOlc));         if(ret != ASN_OK)         {            OOTRACEERR3("Error: Failed decoding FastStart Element (%s, %s)\n",                         call->callType, call->callToken);            ooFreeQ931Message(q931msg);            if(call->callState < OO_CALL_CLEAR)            {               call->callEndReason = OO_REASON_LOCAL_CLEARED;               call->callState = OO_CALL_CLEAR;            }            return OO_FAILED;         }         finishPrint();         removeEventHandler(pctxt);          olc = NULL;         j++;         epCap = NULL;      }      OOTRACEDBGA4("Added %d fast start elements to CONNECT message "                   "(%s, %s)\n",  j, call->callType, call->callToken);      if(j != 0)      {         connect->m.fastStartPresent = TRUE;         connect->fastStart.n = j;         connect->fastStart.elem = pFS;       }else{         OOTRACEINFO3("None of the faststart elements received in setup can be"                      " supported, rejecting faststart.(%s, %s)\n",                       call->callType, call->callToken);         connect->m.fastStartPresent = FALSE;         OO_CLRFLAG(call->flags, OO_M_FASTSTART);         OOTRACEDBGC3("Faststart for call is disabled by local endpoint."                      "(%s, %s)\n", call->callType, call->callToken);      }   }   /* Add h245 listener address. Do not add H245 listener address in case      of fast-start. */   if ((!OO_TESTFLAG(call->flags, OO_M_FASTSTART) ||         call->remoteFastStartOLCs.count == 0) &&       !OO_TESTFLAG (call->flags, OO_M_TUNNELING))   {      ooCreateH245Listener(call); /* First create an H.245 listener */      connect->m.h245AddressPresent = TRUE;      connect->h245Address.t = T_H225TransportAddress_ipAddress;         h245IpAddr = (H225TransportAddress_ipAddress*)	 memAllocZ (pctxt, sizeof(H225TransportAddress_ipAddress));      if(!h245IpAddr)      {         OOTRACEERR3("Error:Memory - ooAcceptCall - h245IpAddr"                     "(%s, %s)\n", call->callType, call->callToken);	return OO_FAILED;      }      ooSocketConvertIpToNwAddr(call->localIP, h245IpAddr->ip.data);      h245IpAddr->ip.numocts=4;      h245IpAddr->port = *(call->h245listenport);      connect->h245Address.u.ipAddress = h245IpAddr;   }   OOTRACEDBGA3("Built H.225 Connect message (%s, %s)\n", call->callType,                 call->callToken);   /* H225 message callback */   if(gH323ep.h225Callbacks.onBuiltConnect)      gH323ep.h225Callbacks.onBuiltConnect(call, q931msg);   ret=ooSendH225Msg(call, q931msg);   if(ret != OO_OK)   {      OOTRACEERR3("Error:Failed to enqueue Connect message to outbound queue.(%s, %s)\n", call->callType, call->callToken);      memReset(&gH323ep.msgctxt);      return OO_FAILED;   }   memReset(&gH323ep.msgctxt);#if 0   if (OO_TESTFLAG (call->flags, OO_M_TUNNELING))   {      /* Start terminal capability exchange and master slave determination */      ret = ooSendTermCapMsg(call);      if(ret != OO_OK)      {         OOTRACEERR3("ERROR:Sending Terminal capability message (%s, %s)\n",                      call->callType, call->callToken);         return ret;      }      ret = ooSendMasterSlaveDetermination(call);      if(ret != OO_OK)      {         OOTRACEERR3("ERROR:Sending Master-slave determination message "                  "(%s, %s)\n", call->callType, call->callToken);         return ret;      }      }#endif   return OO_OK;}int ooH323HandleCallFwdRequest(OOH323CallData *call){   OOH323CallData *fwdedCall=NULL;   OOCTXT *pctxt;   ooAliases *pNewAlias=NULL, *alias=NULL;   int i=0, ret = OO_OK;   /* Note: We keep same callToken, for new call which is going      to replace an existing call, thus treating it as a single call.*/   fwdedCall = ooCreateCall("outgoing", call->callToken);   pctxt = fwdedCall->pctxt;   /* Retrieve new destination info from original call */   if(!ooUtilsIsStrEmpty(call->pCallFwdData->ip))   {      strcpy(fwdedCall->remoteIP, call->pCallFwdData->ip);   }   fwdedCall->remotePort = call->pCallFwdData->port;      if(call->pCallFwdData->aliases)   {      alias = call->pCallFwdData->aliases;      while(alias)      {         pNewAlias = (ooAliases*) memAlloc(pctxt, sizeof(ooAliases));         pNewAlias->value = (char*) memAlloc(pctxt, strlen(alias->value)+1);         if(!pNewAlias || !pNewAlias->value)         {            OOTRACEERR3("Error:Memory - ooH323HandleCallFwdRequest - "                        "pNewAlias/pNewAlias->value"                        "(%s, %s)\n", call->callType, call->callToken);            ooCleanCall(fwdedCall);            return OO_FAILED;         }         pNewAlias->type = alias->type;         strcpy(pNewAlias->value, alias->value);         pNewAlias->next = fwdedCall->remoteAliases;         fwdedCall->remoteAliases = pNewAlias;         alias = alias->next;         pNewAlias = NULL;      }   }   fwdedCall->callReference = ooGenerateCallReference();   ooGenerateCallIdentifier(&fwdedCall->callIdentifier);   fwdedCall->confIdentifier.numocts = 16;   for (i = 0; i < 16; i++)      fwdedCall->confIdentifier.data[i] = i+1;         if(gH323ep.gkClient && !OO_TESTFLAG(fwdedCall->flags, OO_M_DISABLEGK))   {     /* No need to check registration status here as it is already checked for        MakeCall command */      ret = ooGkClientSendAdmissionRequest(gH323ep.gkClient, fwdedCall, FALSE);      fwdedCall->callState = OO_CALL_WAITING_ADMISSION;   }   else      ret = ooH323CallAdmitted (fwdedCall);   return OO_OK;}int ooH323MakeCall(char *dest, char *callToken, ooCallOptions *opts){   OOCTXT *pctxt;   OOH323CallData *call;   int ret=0, i=0;   char tmp[30]="\0";   char *ip=NULL, *port = NULL;   if(!dest)   {      OOTRACEERR1("ERROR:Invalid destination for new call\n");      return OO_FAILED;   }   if(!callToken)   {      OOTRACEERR1("ERROR: Invalid callToken parameter to make call\n");      return OO_FAILED;   }   call = ooCreateCall("outgoing", callToken);   pctxt = call->pctxt;   if(opts)   {      if(opts->fastStart)         OO_SETFLAG(call->flags, OO_M_FASTSTART);      else         OO_CLRFLAG(call->flags, OO_M_FASTSTART);      if(opts->tunneling)         OO_SETFLAG(call->flags, OO_M_TUNNELING);      else         OO_CLRFLAG(call->flags, OO_M_TUNNELING);      if(opts->disableGk)         OO_SETFLAG(call->flags, OO_M_DISABLEGK);      else         OO_CLRFLAG(call->flags, OO_M_DISABLEGK);      call->callMode = opts->callMode;   }   ret = ooParseDestination(call, dest, tmp, 30, &call->remoteAliases);   if(ret != OO_OK)   {      OOTRACEERR2("Error: Failed to parse the destination string %s for "                  "new call\n", dest);      ooCleanCall(call);      return OO_FAILED;   }      /* Check whether we have ip address */   if(!ooUtilsIsStrEmpty(tmp))   {      ip = tmp;      port = strchr(tmp, ':');      *port = '\0';      port++;      strcpy(call->remoteIP, ip);      call->remotePort = atoi(port);   }   strcpy(callToken, call->callToken);   call->callReference = ooGenerateCallReference();   ooGenerateCallIdentifier(&call->callIdentifier);   call->confIdentifier.numocts = 16;   for (i = 0; i < 16; i++)      call->confIdentifier.data[i] = i+1;         if(gH323ep.gkClient && !OO_TESTFLAG(call->flags, OO_M_DISABLEGK))   {     /* No need to check registration status here as it is already checked for        MakeCall command */      ret = ooGkClientSendAdmissionRequest(gH323ep.gkClient, call, FALSE);      call->callState = OO_CALL_WAITING_ADMISSION;   }   else      ret = ooH323CallAdmitted (call);   return OO_OK;}int ooH323CallAdmitted(OOH323CallData *call){   int ret=0;         if(!call)   {      /* Call not supplied. Must locate it in list */      OOTRACEERR1("ERROR: Invalid call parameter to ooH323CallAdmitted");      return OO_FAILED;    }   if(!strcmp(call->callType, "outgoing"))   {      ret = ooCreateH225Connection(call);      if(ret != OO_OK)      {         OOTRACEERR3("ERROR:Failed to create H225 connection to %s:%d\n",                       call->remoteIP, call->remotePort);         if(call->callState< OO_CALL_CLEAR)         {            call->callState = OO_CALL_CLEAR;            call->callEndReason = OO_REASON_UNKNOWN;         }         return OO_FAILED;      }            ret = ooH323MakeCall_helper(call);   } else { /* An incoming call */      if(gH323ep.h323Callbacks.onIncomingCall)         gH323ep.h323Callbacks.onIncomingCall(call);      /* Check for manual ringback generation */      if(!OO_TESTFLAG(gH323ep.flags, OO_M_MANUALRINGBACK))      {         ooSendAlerting(call); /* Send alerting message */         if(OO_TESTFLAG(gH323ep.flags, OO_M_AUTOANSWER))            ooSendConnect(call); /* Send connect message - call accepted */      }   }      return OO_OK;}int ooH323MakeCall_helper(OOH323CallData *call){   int ret=0,i=0, k;   Q931Message *q931msg = NULL;   H225Setup_UUIE *setup;   ASN1DynOctStr *pFS=NULL;   H225TransportAddress_ipAddress *destCallSignalIpAddress;   H225TransportAddress_ipAddress *srcCallSignalIpAddress;   ooH323EpCapability *epCap=NULL;   OOCTXT *pctxt = NULL;   H245OpenLogicalChannel *olc, printOlc;   ASN1BOOL aligned = 1;   ooAliases *pAlias = NULL;   pctxt = &gH323ep.msgctxt;        ret = ooCreateQ931Message(&q931msg, Q931SetupMsg);   if(ret != OO_OK)   {      OOTRACEERR1("ERROR:Failed to Create Q931 SETUP Message\n ");      return OO_FAILED;   }   q931msg->callReference = call->callReference;   /* Set bearer capability */   if(OO_OK != ooSetBearerCapabilityIE(q931msg, Q931CCITTStd,                           Q931TransferUnrestrictedDigital, Q931TransferPacketMode,                          Q931TransferRatePacketMode, Q931UserInfoLayer1G722G725))//                        Q931TransferRate64Kbps, Q931UserInfoLayer1G711ULaw))   {      OOTRACEERR3("Error: Failed to set bearer capability ie.(%s, %s)\n",                   call->callType, call->callToken);      return OO_FAILED;   }   /* Set calling party number  Q931 IE */   if(call->callingPartyNumber)     ooQ931SetCallingPartyNumberIE(q931msg,                            (const char*)call->callingPartyNumber, 1, 0, 1, 1);      /* Set called party number Q931 ie */   if(call->calledPartyNumber)      ooQ931SetCalledPartyNumberIE(q931msg,                             (const char*)call->calledPartyNumber, 1, 0);   else if(call->remoteAliases) {      pAlias = call->remoteAliases;      while(pAlias) {         if(pAlias->type == T_H225AliasAddress_dialedDigits)            break;         pAlias = pAlias->next;      }      if(pAlias)      {         call->calledPartyNumber = (char*)memAlloc(call->pctxt,                                                    strlen(pAlias->value)+1);         if(!call->calledPartyNumber)         {            OOTRACEERR3("Error:Memory - ooH323MakeCall_helper - "                        "calledPartyNumber(%s, %s)\n", call->callType,                         call->callToken);            return OO_FAILED;         }         strcpy(call->calledPartyNumber,

⌨️ 快捷键说明

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