rasstuff.cpp
上传用户:hnnddl
上传日期:2007-01-06
资源大小:3580k
文件大小:22k
源码类别:

IP电话/视频会议

开发平台:

WINDOWS

  1. /*
  2.  * $Revision: 1.2 $
  3.  * $Date: 1998/10/14 22:48:28 $
  4.  */
  5. ////////////////////////////////////////////////////////////////
  6. //               Copyright (c) 1996-98 Lucent Technologies    //
  7. //                       All Rights Reserved                  //
  8. //                                                            //
  9. //                       THIS IS UNPUBLISHED                  //
  10. //                       PROPRIETARY SOURCE                   //
  11. //                   CODE OF Lucent Technologies              //
  12. // AND elemedia   //
  13. //                                                            //
  14. ////////////////////////////////////////////////////////////////
  15. //
  16. ////////////////////////////////////////////////////////////////
  17. // Example programs are provided soley to demonstrate one     //
  18. // possible use of the stack libraries and are included for   //
  19. // instructional purposes only.  You are free to use, modify  //
  20. // and/or redistribute any portion of code in the example     //
  21. // programs.  However, such examples are not intended to      //
  22. // represent production quality code.                         //
  23. //                                                            //
  24. // THE COPYRIGHT HOLDERS PROVIDE THESE EXAMPLE PROGRAMS       //
  25. // "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED     //
  26. // OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED     //
  27. // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A            //
  28. // PARTICULAR PURPOSE.                                        //
  29. ////////////////////////////////////////////////////////////////
  30. #if defined(USE_RAS)
  31. #include "exchange.h"
  32. #include "call.h"
  33. #include "msg.h"
  34. #include <api/h225rastypes.h>
  35. #include <api/h225raserr.h>
  36. //#include "config.h"
  37. ProtReturnCode
  38. Exchange::SendGRQ(int seq_num, struct sockaddr *dst_addr)
  39. {
  40.     LOG("SendGRQn");
  41.     H225RASMsgGRQ *msg;
  42.     H225RASMessage *m;
  43.     ProtReturnCode ret = H225RASMessage::Factory(m, MSG_GRQ, (H225RASProtocol *)this);
  44.     if (!PROT_IS_SUCCESS(ret) || !m)
  45.     {
  46.             LOG_ERROR("Failed to new GRQ messagen");
  47.             return(ret);
  48.     }
  49.     msg = (H225RASMsgGRQ *)m;
  50.     msg->SetSequenceNumber(seq_num);
  51.     msg->SetRASAddr(GetLocalRASAddr());
  52. // get the endpointType info from Exchange
  53. H225CSEndpointType et;
  54. ((H225RASProtocol *)this)->GetEndpointType(et);
  55. // now set the appropriate mandatory endpointType field of the message
  56. ret = ((ItemEndpointType *)msg)->SetEndpointType(et);
  57. if(!PROT_IS_SUCCESS(ret)) {
  58.             LOG_ERROR("msg->SetEndpointType() failure, ret = %xn", ret);
  59.     }
  60. ret = SendRASMessage(dst_addr, *msg);
  61.     if (!PROT_IS_SUCCESS(ret))
  62.     {
  63.             LOG_ERROR("Failed to send GRQ message 0x%xn", ret);
  64.     }
  65.     delete m;
  66.     return ret;
  67. }
  68. ProtReturnCode
  69. Exchange::SendRRQ(int seq_num, struct sockaddr *dst_addr)
  70. {
  71.     LOG("SendRRQn");
  72.     H225RASMsgRRQ *msg;
  73.     H225RASMessage *m;
  74. H225CSAliasAddress aa;
  75.     ProtReturnCode ret;
  76. ret = H225RASMessage::Factory(m, MSG_RRQ, (H225RASProtocol *)this);
  77.     if (!PROT_IS_SUCCESS(ret) || !m)
  78.     {
  79.             LOG_ERROR("Failed to new RRQ messagen");
  80.             return(ret);
  81.     } 
  82. msg = (H225RASMsgRRQ *)m;
  83.     msg->SetSequenceNumber(seq_num);
  84. msg->SetDiscoveryComplete(FALSE) ;
  85.     if(!PROT_IS_SUCCESS(ret)) {
  86.             LOG_ERROR("msg->SetDiscoveryComplete() failure, ret = %xn", ret);
  87.     }
  88. // call signalling address is mandatory
  89. ret = msg->AddCallSigAddr(GetLocalSigAddr()) ; 
  90.     if(!PROT_IS_SUCCESS(ret)) {
  91.             LOG("msg->AddCallSigAddr() failure, ret = %xn", ret);
  92.     }
  93.      
  94. // ras address is mandatory
  95. ret = msg->AddRASAddr(GetLocalRASAddr()); 
  96.     if(!PROT_IS_SUCCESS(ret)) {
  97.             LOG_ERROR("msg->AddRASAddr() failure, ret = %xn", ret);
  98.     }
  99. // get the endpointType and vendorID info from Exchange
  100. H225CSEndpointType et;
  101.     H225CSVendorID vendor_id;
  102. ((H225RASProtocol *)this)->GetVendorID(vendor_id);
  103. ((H225RASProtocol *)this)->GetEndpointType(et);
  104. // now set the appropriate mandatory vendorID and endpointType fields of the message
  105. ret = ((ItemVendorID *)msg)->SetVendorID(vendor_id);
  106. if(!PROT_IS_SUCCESS(ret)) {
  107.             LOG_ERROR("msg->SetVendorID() failure, ret = %xn", ret);
  108.     }
  109. ret = ((ItemEndpointType *)msg)->SetEndpointType(et);
  110. if(!PROT_IS_SUCCESS(ret)) {
  111.             LOG_ERROR("msg->SetEndpointType() failure, ret = %xn", ret);
  112.     }
  113. char display_str[256];
  114. sprintf(display_str, "%s", config->h323IDsrc);
  115. if  (display_str != NULL)
  116. {
  117. #if 0
  118. H225CSAliasAddress alias;
  119. WCHAR h323_id[128];
  120. int h323_id_len;
  121. h323_id_len =  MultiByteToWideChar(
  122. CP_ACP,
  123. MB_ERR_INVALID_CHARS,
  124. display_str,
  125. strlen(display_str),
  126. h323_id,
  127. 128);
  128. alias.SetH323ID(h323_id,h323_id_len);
  129. ret = msg->AddEndpointAlias(alias);
  130. if(!PROT_IS_SUCCESS(ret)) {
  131. LOG_ERROR("msg->AddEndpointAlias() failure, ret = %xn", ret);
  132. }
  133. #endif
  134. }
  135. // set the phone numbers we want to register as aliases
  136. for (int i=0; i< NUM_LINES; i++) {
  137. char e164[128];
  138. sprintf(e164, "%s%0004d", 
  139. config->e164src, i);
  140. ret = aa.SetE164(e164,(unsigned short)strlen(e164));
  141. if(!PROT_IS_SUCCESS(ret)) {
  142.             LOG_ERROR("aa.SetE164() failure, ret = %xn", ret);
  143. }
  144. ret = msg->AddEndpointAlias(aa);
  145. if(!PROT_IS_SUCCESS(ret)) {
  146.             LOG_ERROR("msg->AddEndpointAlias() failure, ret = %xn", ret);
  147. }
  148. }
  149. int count;
  150. ret = msg->GetNumEndpointAliases(count);
  151. if(!PROT_IS_SUCCESS(ret)) {
  152. LOG_ERROR("msg->GetNumEndpointAliases() failure, ret = %xn", ret);
  153. }
  154. #if 0
  155.     // the gatekeeperIdentifier is optional 
  156. unsigned short ep_id[128];
  157.     int len;
  158.     char *mystring = "elemediaGK";
  159.     for(len = 0; len < 128; len++) {                        
  160.             if(mystring[len] != '') {                     
  161.                     ep_id[len] = (short)mystring[len];      
  162.             } else {                                        
  163.                     ep_id[len] = 0;                         
  164.                     break;                                  
  165.             }                                               
  166.     }
  167.     ret = msg->SetGKID(ep_id,len);
  168.     if(!PROT_IS_SUCCESS(ret)) {
  169.         LOG_ERROR("msg->SetGKID() failure, ret = %xn", ret);
  170.     }
  171.     unsigned short id[128];
  172.     unsigned short *ptr = id;
  173.     char rcvstring[128];
  174.     int len2 = 0;
  175.     ret = msg->GetGKID(ptr,len2);
  176.     if(!PROT_IS_SUCCESS(ret)) {
  177. LOG_ERROR("msg->SetGKID() failure, ret = %xn", ret);
  178.     }
  179.     LOG("Gatekeeper ID len = %dn", len2);
  180.     rcvstring[0] = 'X';
  181.     for(len = 0; len < len2; len++) {              
  182.             rcvstring[len] = (char)*ptr++;         
  183.     }                                              
  184.     rcvstring[len2] = '';
  185.     if (len2 < 100)  {
  186. LOG_ERROR("Gatekeeper ID = %sn",rcvstring);
  187.     }
  188. #endif
  189.     ret = SendRASMessage(dst_addr, *m);
  190.     if (!PROT_IS_SUCCESS(ret))
  191.     {
  192.             LOG_ERROR("Failed to send RRQ message, 0x%x n", ret);
  193.     }
  194.     delete m;
  195.     return ret;
  196. }
  197. ProtReturnCode
  198. Exchange::SendURQ(int seq_num, struct sockaddr *dst_addr)
  199. {
  200.     LOG("SendURQn");
  201.     H225RASMsgURQ *msg;
  202.     H225RASMessage *m;
  203. H225CSAliasAddress aa;
  204.     ProtReturnCode ret = H225RASMessage::Factory(m, MSG_URQ, (H225RASProtocol *)this);
  205.     if (!PROT_IS_SUCCESS(ret) || !m)
  206.     {
  207.             LOG_ERROR("Failed to new URQ messagen");
  208.             return(ret);
  209.     }
  210.     msg = (H225RASMsgURQ *)m;
  211.     msg->SetSequenceNumber(seq_num);
  212. ret = msg->AddCallSigAddr(GetLocalSigAddr()) ; 
  213. if(!PROT_IS_SUCCESS(ret)) {
  214.             LOG("msg->AddCallSigAddr() failure, ret = %xn", ret);
  215.     }
  216. // set the phone numbers we want to unregister 
  217. for (int i=0; i< 10; i++) {
  218. char e164[128];
  219. sprintf(e164, "%s%d", 
  220. config->e164src, i);
  221. ret = aa.SetE164(e164,(unsigned short)strlen(e164));
  222. if(!PROT_IS_SUCCESS(ret)) {
  223.             LOG_ERROR("aa.SetE164() failure, ret = %xn", ret);
  224. }
  225. ret = msg->AddEndpointAlias(aa);
  226. if(!PROT_IS_SUCCESS(ret)) {
  227.             LOG_ERROR("msg->AddEndpointAlias() failure, ret = %xn", ret);
  228. }
  229. }
  230. int count;
  231. ret = msg->GetNumEndpointAliases(count);
  232. if(!PROT_IS_SUCCESS(ret)) {
  233. LOG_ERROR("msg->GetNumEndpointAliases() failure, ret = %xn", ret);
  234. }
  235. // set the endpoint ID that was assigned by the gatekeeper in RRQ
  236. ret = msg->SetEndpointID(ep_id, ep_id_len);
  237. if(!PROT_IS_SUCCESS(ret)) {
  238.             LOG("msg->SetEndpointID() failure, ret = %xn", ret);
  239.     } 
  240.     ret = SendRASMessage(dst_addr, *msg);
  241.     if (!PROT_IS_SUCCESS(ret))
  242.     {
  243.             LOG_ERROR("Failed to send URQ  message, ret = %xn", ret);
  244.     }
  245.     delete m;
  246.     return ret;
  247. }
  248. ProtReturnCode
  249. Exchange::SendUCF(int seq_num, struct sockaddr *dst_addr)
  250. {
  251.         LOG("SendUCFn");
  252.         H225RASMsgUCF *msg;
  253.         H225RASMessage *m;
  254.         ProtReturnCode ret = H225RASMessage::Factory(m, MSG_UCF, (H225RASProtocol *)this);
  255.         if (!PROT_IS_SUCCESS(ret) || !m)
  256.         {
  257.                 LOG_ERROR("Failed to new UCF messagen");
  258.                 return(ret);
  259.         }
  260.         msg = (H225RASMsgUCF *)m;
  261.         msg->SetSequenceNumber(seq_num);
  262.         ret = SendRASMessage(dst_addr, *msg);
  263.         if (!PROT_IS_SUCCESS(ret))
  264.         {
  265.                 LOG_ERROR("Failed to send UCF messagen");
  266.         }
  267.         delete m;
  268.         return ret;
  269. }
  270. ProtReturnCode
  271. Exchange::SendURJ(int seq_num, struct sockaddr *dst_addr)
  272. {
  273.         LOG("SendURJn");
  274.         H225RASMsgURJ *msg;
  275.         H225RASMessage *m;
  276.         ProtReturnCode ret = H225RASMessage::Factory(m, MSG_URJ, (H225RASProtocol *)this);
  277.         if (!PROT_IS_SUCCESS(ret) || !m)
  278.         {
  279.                 LOG_ERROR("Failed to new URJ messagen");
  280.                 return(ret);
  281.         }
  282.         msg = (H225RASMsgURJ *)m;
  283.         msg->SetSequenceNumber(seq_num);
  284.         ret = SendRASMessage(dst_addr, *msg);
  285.         if (!PROT_IS_SUCCESS(ret))
  286.         {
  287.                 LOG_ERROR("Failed to send URJ messagen");
  288.         }
  289.         delete m;
  290.         return ret;
  291. }
  292. ProtReturnCode
  293. Exchange::SendARQ(int seq_num, struct sockaddr *dst_addr, class SendARQdata *arq_data) 
  294. {
  295. LOG("SendARQn");
  296. int index = arq_data->index;
  297.     H225RASMsgARQ *msg;
  298.     H225RASMessage *m;
  299.     ProtReturnCode ret = H225RASMessage::Factory(m, MSG_ARQ, (H225RASProtocol *)this);
  300.     if (!PROT_IS_SUCCESS(ret) || !m)
  301.     {
  302.             LOG_ERROR("Failed to new ARQ message, ret = 0x%xn", ret);
  303.             return(ret);
  304.     }
  305.     msg = (H225RASMsgARQ *)m;
  306.     msg->SetSequenceNumber(seq_num);
  307. ret = msg->SetCallType(CT_POINT_TO_POINT); 
  308. if(!PROT_IS_SUCCESS(ret)) {
  309. LOG_ERROR("msg->SetCallType() failure, ret = %xn", ret);
  310. }
  311. ret = msg->SetCallModel(CM_GATEKEEPER_ROUTED); 
  312. if(!PROT_IS_SUCCESS(ret)) {
  313. LOG_ERROR("msg->SetCallModel() failure, ret = %xn", ret);
  314. }
  315. ret = msg->SetEndpointID(ep_id, ep_id_len);
  316. if(!PROT_IS_SUCCESS(ret)) {
  317. LOG_ERROR("msg->SetEndpointID() failure, ret = %xn", ret);
  318. }
  319. // how much bandwidth do we need for this call? - mandatory 
  320. ret = msg->SetBandwidth(200); // 20kbits
  321. if(!PROT_IS_SUCCESS(ret)) {
  322. LOG_ERROR("msg->SetBandwidth() failure, ret = %xn", ret);
  323. }
  324. // is this endpoint gonna be the active MC? - mandatory
  325. ret = msg->SetActiveMC(FALSE);
  326. if(!PROT_IS_SUCCESS(ret)) {
  327. LOG_ERROR("msg->SetActiveMC() failure, ret = %xn", ret);
  328. }
  329. // are we placing or receiving a call? - mandatory
  330. //  DIR_INCOMING = 1
  331. //  DIR_OUTGOING = 0;
  332. ret = msg->SetAnswerCall(ras_sess[index].direction);
  333. if(!PROT_IS_SUCCESS(ret)) {
  334. LOG_ERROR("msg->SetAnswerCall() failure, ret = %xn", ret);
  335. }
  336. // set the conference ID - mandatory
  337. unsigned char *confID;
  338. int len;
  339. (H225CSProtocol*)calls[index]->GetConfID(confID, len);
  340. ret = msg->SetConfID((char *)confID, len);
  341. if(!PROT_IS_SUCCESS(ret)) {
  342. LOG_ERROR("msg->SetConfID() failure, ret = %xn", ret);
  343. }
  344. // set the call reference value - mandatory
  345. ret = msg->SetCRV(index);
  346. if(!PROT_IS_SUCCESS(ret)) {
  347. LOG_ERROR("msg->SetCRV() failure, ret = %xn", ret);
  348. }
  349. // The application who calls SendARQ must consider:
  350. // if the call is outgoing, the e164dst should be filled with the remote e164 alias
  351. // and the e164src with the local e164 alias
  352. // if the call is incoming, the e164dst should be filled with the local e164 alias
  353. // and the e164src with the remote e164 alias
  354. // Additionally, we only need to address the destination either with an alias 
  355. // like e164 or h323ID or its Q.931 call signalling IP address 
  356. if (arq_data->e164dst[0] != '')
  357. {
  358. H225CSAliasAddress aa;
  359. char e164[128];
  360. sprintf(e164, "%s",arq_data->e164dst);
  361. ret = aa.SetE164(e164,(unsigned short)strlen(e164));
  362. if(!PROT_IS_SUCCESS(ret)) {
  363. LOG_ERROR("aa.SetE164() failure, ret = %xn", ret);
  364. }
  365. ret = msg->AddDstInfo(aa);
  366. if(!PROT_IS_SUCCESS(ret)) {
  367. LOG_ERROR("msg->AddDstInfo() failure, ret = %xn", ret);
  368. }
  369. }
  370. if (arq_data->e164src[0] != '')
  371. {
  372. H225CSAliasAddress aa;
  373. char e164[128];
  374. sprintf(e164, "%s",arq_data->e164src);
  375. ret = aa.SetE164(e164,(unsigned short)strlen(e164));
  376. if(!PROT_IS_SUCCESS(ret)) {
  377. LOG_ERROR("aa.SetE164() failure, ret = %xn", ret);
  378. }
  379. ret = msg->AddSrcInfo(aa);
  380. if(!PROT_IS_SUCCESS(ret)) {
  381. LOG_ERROR("msg->AddSrcInfo() failure, ret = %xn", ret);
  382. }
  383. }
  384. // fill up the srcInfo with h323 alias
  385. #if 0 
  386. if  (arq_data->h323IDsrc[0] != '')
  387. {
  388. H225CSAliasAddress aa;
  389. WCHAR h323_id[128];
  390. int h323_id_len;
  391. h323_id_len =  MultiByteToWideChar(
  392. CP_ACP,
  393. MB_ERR_INVALID_CHARS,
  394. arq_data->h323IDsrc,
  395. strlen(arq_data->h323IDsrc),
  396. h323_id,
  397. 128);
  398. aa.SetH323ID(h323_id,h323_id_len);
  399. ret = msg->AddSrcInfo(aa);
  400. if(!PROT_IS_SUCCESS(ret)) {
  401. LOG_ERROR("msg->AddSrcInfo() failure, ret = %xn", ret);
  402. }
  403. }
  404. // fill up the destinationInfo with h323 alias
  405. if  (arq_data->h323IDdst[0] != '')
  406. {
  407. H225CSAliasAddress aa;
  408. WCHAR h323_id[128];
  409. int h323_id_len;
  410. h323_id_len =  MultiByteToWideChar(
  411. CP_ACP,
  412. MB_ERR_INVALID_CHARS,
  413. arq_data->h323IDsrc,
  414. strlen(arq_data->h323IDdst),
  415. h323_id,
  416. 128);
  417. aa.SetH323ID(h323_id,h323_id_len);
  418. ret = msg->AddDstInfo(aa);
  419. if(!PROT_IS_SUCCESS(ret)) {
  420. LOG_ERROR("msg->AddDstInfo() failure, ret = %xn", ret);
  421. }
  422. }
  423. #endif
  424. // as we send earlier we can send ARQ with destination either H.323 or E.164 alias so the 
  425. // gatekeeper can resolve the destination IP address or we might know 
  426. // the destination IP and we only need authorization for this call from the GK
  427. // 
  428. if (arq_data->callsigdst)
  429. {
  430. msg->SetDstCallSigAddr((sockaddr *)arq_data->callsigdst);
  431. }
  432. // set the call ID - mandatory
  433. H225CSCallID callID;
  434. (H225CSProtocol*)calls[index]->GetCallID(callID);
  435. unsigned char *tmp; char tmp1[256]; 
  436. callID.GetCallID(tmp, len);
  437. strncpy(tmp1, (char*)tmp, len);
  438. LOG("in SendARQ, callid=%sn", tmp1);
  439. ret = msg->SetCallID(callID);
  440. if(!PROT_IS_SUCCESS(ret)) {
  441. LOG_ERROR("msg->SetCallID() failure, ret = %xn", ret);
  442. }
  443. // the message should be fine, send it
  444.     ret = SendRASMessage(dst_addr, *msg);
  445.     if (!PROT_IS_SUCCESS(ret))
  446.     {
  447.             LOG_ERROR("Failed to send ARQ message, ret = 0x%xn", ret);
  448.     }
  449.     delete m;
  450.     return ret;
  451. }
  452. ProtReturnCode
  453. Exchange::SendBRQ(int seq_num, struct sockaddr *dst_addr)
  454. {
  455.         LOG("SendBRQn");
  456.         H225RASMsgBRQ *msg;
  457.         H225RASMessage *m;
  458.         ProtReturnCode ret = H225RASMessage::Factory(m, MSG_BRQ, (H225RASProtocol *)this);
  459.         if (!PROT_IS_SUCCESS(ret) || !m)
  460.         {
  461.                 LOG_ERROR("Failed to new BRQ messagen");
  462.                 return(ret);
  463.         }
  464.         msg = (H225RASMsgBRQ *)m;
  465.         msg->SetSequenceNumber(seq_num);
  466.         ret = SendRASMessage(dst_addr, *msg);
  467.         if (!PROT_IS_SUCCESS(ret))
  468.         {
  469.                 LOG_ERROR("Failed to send BRQ  messagen");
  470.         }
  471.         delete m;
  472.         return ret;
  473. }
  474. ProtReturnCode
  475. Exchange::SendDRQ(int seq_num, struct sockaddr *dst_addr, int index)
  476. {
  477.     LOG("SendDRQn");
  478.     H225RASMsgDRQ *msg;
  479.     H225RASMessage *m;
  480.     ProtReturnCode ret = H225RASMessage::Factory(m, MSG_DRQ, (H225RASProtocol *)this);
  481.     if (!PROT_IS_SUCCESS(ret) || !m)
  482.     {
  483.             LOG_ERROR("Failed to new DRQ messagen");
  484.             return(ret);
  485.     }
  486.     msg = (H225RASMsgDRQ *)m;
  487.     msg->SetSequenceNumber(seq_num);
  488. msg->SetReason(DRQ_NORMAL_DROP);
  489. // mandatory
  490. unsigned char *confID;
  491. int len;
  492. (H225CSProtocol*)calls[index]->GetConfID(confID, len);
  493. ret = msg->SetConfID((char *)confID, len);
  494. if(!PROT_IS_SUCCESS(ret)) {
  495. LOG_ERROR("msg->SetConfID() failure, ret = %xn", ret);
  496. }
  497. // mandatory
  498. ret = msg->SetCRV(index);
  499. if(!PROT_IS_SUCCESS(ret)) {
  500. LOG_ERROR("msg->SetCRV() failure, ret = %xn", ret);
  501. }
  502. // mandatory
  503. ret = msg->SetEndpointID(ep_id, ep_id_len);
  504. if(!PROT_IS_SUCCESS(ret)) {
  505. LOG_ERROR("msg->SetEndpointID() failure, ret = %xn", ret);
  506. }
  507. // set the call ID - mandatory
  508. H225CSCallID callID;
  509. (H225CSProtocol*)calls[index]->GetCallID(callID);
  510. unsigned char *tmp; char tmp1[256]; 
  511. callID.GetCallID(tmp, len);
  512. strncpy(tmp1, (char*)tmp, len);
  513. LOG("in SendDRQ, callid=%sn", tmp1);
  514. ret = msg->SetCallID(callID);
  515. if(!PROT_IS_SUCCESS(ret)) {
  516. LOG_ERROR("msg->SetCallID() failure, ret = %xn", ret);
  517. }
  518.     ret = SendRASMessage(dst_addr, *msg);
  519.     if (!PROT_IS_SUCCESS(ret))
  520.     {
  521. LOG_ERROR("Failed to send DRQ message, ret = 0x%xn", ret);
  522.     }
  523.     delete m;
  524.     return ret;
  525. }
  526. ProtReturnCode
  527. Exchange::SendDCF(int seq_num, struct sockaddr *dst_addr)
  528. {
  529.         LOG("SendDCFn");
  530.         H225RASMsgDCF *msg;
  531.         H225RASMessage *m;
  532.         ProtReturnCode ret = H225RASMessage::Factory(m, MSG_DCF, (H225RASProtocol *)this);
  533.         if (!PROT_IS_SUCCESS(ret) || !m)
  534.         {
  535.                 LOG_ERROR("Failed to new DCF messagen");
  536.                 return(ret);
  537.         }
  538.         msg = (H225RASMsgDCF *)m;
  539.         msg->SetSequenceNumber(seq_num);
  540.         ret = SendRASMessage(dst_addr, *msg);
  541.         if (!PROT_IS_SUCCESS(ret))
  542.         {
  543.                 LOG_ERROR("Failed to send DCF messagen");
  544.         }
  545.         delete m;
  546.         return ret;
  547. }
  548. ProtReturnCode
  549. Exchange::SendDRJ(int seq_num, struct sockaddr *dst_addr)
  550. {
  551.         LOG("SendDRJn");
  552.         H225RASMsgDRJ *msg;
  553.         H225RASMessage *m;
  554.         ProtReturnCode ret = H225RASMessage::Factory(m, MSG_DRJ, (H225RASProtocol *)this);
  555.         if (!PROT_IS_SUCCESS(ret) || !m)
  556.         {
  557.                 LOG_ERROR("Failed to new DRJ messagen");
  558.                 return(ret);
  559.         }
  560.         msg = (H225RASMsgDRJ *)m;
  561.         msg->SetSequenceNumber(seq_num);
  562.         ret = SendRASMessage(dst_addr, *msg);
  563.         if (!PROT_IS_SUCCESS(ret))
  564.         {
  565.                 LOG_ERROR("Failed to send DRJ messagen");
  566.         }
  567.         delete m;
  568.         return ret;
  569. }
  570. ProtReturnCode
  571. Exchange::SendLRQ(int seq_num, struct sockaddr *dst_addr)
  572. {
  573.         LOG("SendLRQn");
  574.         H225RASMsgLRQ *msg;
  575.         H225RASMessage *m;
  576.         ProtReturnCode ret = H225RASMessage::Factory(m, MSG_LRQ, (H225RASProtocol *)this);
  577.         if (!PROT_IS_SUCCESS(ret) || !m)
  578.         {
  579.                 LOG_ERROR("Failed to new LRQ messagen");
  580.                 return(ret);
  581.         }
  582.         msg = (H225RASMsgLRQ *)m;
  583.         msg->SetSequenceNumber(seq_num);
  584.         ret = SendRASMessage(dst_addr, *msg);
  585.         if (!PROT_IS_SUCCESS(ret))
  586.         {
  587.                 LOG_ERROR("Failed to send LRQ messagen");
  588.         }
  589.         delete m;
  590.         return ret;
  591. }
  592. ProtReturnCode
  593. Exchange::SendLCF(int seq_num, struct sockaddr *dst_addr)
  594. {
  595.         LOG("SendLCFn");
  596.         H225RASMsgLCF *msg;
  597.         H225RASMessage *m;
  598.         ProtReturnCode ret = H225RASMessage::Factory(m, MSG_LCF, (H225RASProtocol *)this);
  599.         if (!PROT_IS_SUCCESS(ret) || !m)
  600.         {
  601.                 LOG_ERROR("Failed to new LCF messagen");
  602.                 return(ret);
  603.         }
  604.         msg = (H225RASMsgLCF *)m;
  605.         msg->SetSequenceNumber(seq_num);
  606.         ret = SendRASMessage(dst_addr, *msg);
  607.         if (!PROT_IS_SUCCESS(ret))
  608.         {
  609.                 LOG_ERROR("Failed to send LCF messagen");
  610.         }
  611.         delete m;
  612.         return ret;
  613. }
  614. ProtReturnCode
  615. Exchange::SendLRJ(int seq_num, struct sockaddr *dst_addr)
  616. {
  617.         LOG("SendLRJn");
  618.         H225RASMsgLRJ *msg;
  619.         H225RASMessage *m;
  620.         ProtReturnCode ret = H225RASMessage::Factory(m, MSG_LRJ, (H225RASProtocol *)this);
  621.         if (!PROT_IS_SUCCESS(ret) || !m)
  622.         {
  623.                 LOG_ERROR("Failed to new LRJ messagen");
  624.                 return(ret);
  625.         }
  626.         msg = (H225RASMsgLRJ *)m;
  627.         msg->SetSequenceNumber(seq_num);
  628.         ret = SendRASMessage(dst_addr, *msg);
  629.         if (!PROT_IS_SUCCESS(ret))
  630.         {
  631.                 LOG_ERROR("Failed to send LRJ messagen");
  632.         }
  633.         delete m;
  634.         return ret;
  635. }
  636. ProtReturnCode
  637. Exchange::SendIRQ(int seq_num, struct sockaddr *dst_addr)
  638. {
  639.         LOG("SendIRQn");
  640.         H225RASMsgIRQ *msg;
  641.         H225RASMessage *m;
  642.         ProtReturnCode ret = H225RASMessage::Factory(m, MSG_IRQ, (H225RASProtocol *)this);
  643.         if (!PROT_IS_SUCCESS(ret) || !m)
  644.         {
  645.                 LOG_ERROR("Failed to new IRQ messagen");
  646.                 return(ret);
  647.         }
  648.         msg = (H225RASMsgIRQ *)m;
  649.         msg->SetSequenceNumber(seq_num);
  650.         ret = SendRASMessage(dst_addr, *msg);
  651.         if (!PROT_IS_SUCCESS(ret))
  652.         {
  653.                 LOG_ERROR("Failed to send IRQ messagen");
  654.         }
  655.         delete m;
  656.         return ret;
  657. }
  658. ProtReturnCode
  659. Exchange::SendIRR(int seq_num, struct sockaddr *dst_addr)
  660. {
  661.         LOG("SendIRRn");
  662.         H225RASMsgIRR *msg;
  663.         H225RASMessage *m;
  664.         ProtReturnCode ret = H225RASMessage::Factory(m, MSG_IRR, (H225RASProtocol *)this);
  665.         if (!PROT_IS_SUCCESS(ret) || !m)
  666.         {
  667.                 LOG_ERROR("Failed to new IRR messagen");
  668.                 return(ret);
  669.         }
  670.         msg = (H225RASMsgIRR *)m;
  671.         msg->SetSequenceNumber(seq_num);
  672.         ret = SendRASMessage(dst_addr, *msg);
  673.         if (!PROT_IS_SUCCESS(ret))
  674.         {
  675.                 LOG_ERROR("Failed to send IRR messagen");
  676.         }
  677.         delete m;
  678.         return ret;
  679. }
  680. #endif // USE_RAS