home *** CD-ROM | disk | FTP | other *** search
/ ftp.muug.mb.ca / 2014.06.ftp.muug.mb.ca.tar / ftp.muug.mb.ca / pub / openh323.tar.gz / openh323.tar / openh323 / src / h323annexg.cxx < prev    next >
C/C++ Source or Header  |  2003-04-08  |  15KB  |  467 lines

  1. /*
  2.  * h323annexg.cxx
  3.  *
  4.  * Implementation of H.323 Annex G using H.501
  5.  *
  6.  * Open H323 Library
  7.  *
  8.  * Copyright (c) 2001 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Open H323 Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Contributor(s): ______________________________________.
  25.  *
  26.  * $Log: h323annexg.cxx,v $
  27.  * Revision 1.11  2003/04/09 03:08:10  robertj
  28.  * Fixed race condition in shutting down transactor (pure virtual call)
  29.  *
  30.  * Revision 1.10  2003/04/01 03:14:40  robertj
  31.  * Fixed passing thru H.501 RIP packet to transactor to handle.
  32.  *
  33.  * Revision 1.9  2003/03/26 00:46:29  robertj
  34.  * Had another go at making H323Transactor being able to be created
  35.  *   without having a listener running.
  36.  *
  37.  * Revision 1.8  2003/03/21 05:27:34  robertj
  38.  * Added setting of remote port in UDP transport constructor.
  39.  * Added call backs for cached responses.
  40.  *
  41.  * Revision 1.7  2003/03/20 01:51:11  robertj
  42.  * More abstraction of H.225 RAS and H.501 protocols transaction handling.
  43.  *
  44.  * Revision 1.6  2003/03/18 13:57:53  craigs
  45.  * More H.501 implementation
  46.  *
  47.  * Revision 1.5  2003/03/17 13:19:31  craigs
  48.  * More H501 implementation
  49.  *
  50.  * Revision 1.4  2003/03/14 06:01:16  craigs
  51.  * More updates
  52.  *
  53.  * Revision 1.3  2003/03/01 00:22:10  craigs
  54.  * New PeerElement implementation
  55.  *
  56.  * Revision 1.2  2003/02/25 06:48:19  robertj
  57.  * More work on PDU transaction abstraction.
  58.  *
  59.  * Revision 1.1  2003/02/21 05:27:06  craigs
  60.  * Initial version
  61.  *
  62.  */
  63.  
  64. #include <ptlib.h>
  65.  
  66. #ifdef __GNUC__
  67. #pragma implementation "h323annexg.h"
  68. #endif
  69.  
  70. #include <ptclib/random.h>
  71.  
  72. #include "h323annexg.h"
  73. #include "h323ep.h"
  74. #include "h323pdu.h"
  75. #include "h501.h"
  76.  
  77.  
  78. #if PTRACING
  79. #define PTRACE_pdu pdu
  80. #else
  81. #define PTRACE_pdu
  82. #endif
  83.  
  84.  
  85. #define new PNEW
  86.  
  87.  
  88. ///////////////////////////////////////////////////////////////////////////////
  89.  
  90. H323_AnnexG::H323_AnnexG(H323EndPoint & ep, H323Transport * trans)
  91.   : H323Transactor(ep, trans, DefaultUdpPort, DefaultUdpPort)
  92. {
  93.   Construct();
  94. }
  95.  
  96. H323_AnnexG::H323_AnnexG(H323EndPoint & ep, const H323TransportAddress & addr)
  97.   : H323Transactor(ep, addr, DefaultUdpPort, DefaultUdpPort)
  98. {
  99.   Construct();
  100. }
  101.  
  102. void H323_AnnexG::Construct()
  103. {
  104.   lastRequest = NULL;
  105.   requests.DisallowDeleteObjects();
  106. }
  107.  
  108. H323_AnnexG::~H323_AnnexG()
  109. {
  110.   StopChannel();
  111. }
  112.  
  113. void H323_AnnexG::PrintOn(ostream & strm) const
  114. {
  115.   strm << "H501@";
  116.   H323Transactor::PrintOn(strm);
  117. }
  118.  
  119.  
  120. H323TransactionPDU * H323_AnnexG::CreateTransactionPDU() const
  121. {
  122.   return new H501PDU;
  123. }
  124.  
  125.  
  126. BOOL H323_AnnexG::HandleTransaction(const PASN_Object & rawPDU)
  127. {
  128.   const H501PDU & pdu = (const H501PDU &)rawPDU;
  129.  
  130.   switch (pdu.m_body.GetTag()) {
  131.     case H501_MessageBody::e_serviceRequest :
  132.       if (SendCachedResponse(pdu))
  133.         return FALSE;
  134.       OnReceiveServiceRequest(pdu, pdu.m_body);
  135.       break;
  136.  
  137.     case H501_MessageBody::e_serviceConfirmation :
  138.       return OnReceiveServiceConfirmation(pdu, pdu.m_body);
  139.  
  140.     case H501_MessageBody::e_serviceRejection :
  141.       return OnReceiveServiceRejection(pdu, pdu.m_body);
  142.  
  143.     case H501_MessageBody::e_serviceRelease :
  144.       if (SendCachedResponse(pdu))
  145.         return FALSE;
  146.       OnReceiveServiceRelease(pdu, pdu.m_body);
  147.       break;
  148.  
  149.     case H501_MessageBody::e_descriptorRequest :
  150.       if (SendCachedResponse(pdu))
  151.         return FALSE;
  152.       OnReceiveDescriptorRequest(pdu, pdu.m_body);
  153.       break;
  154.  
  155.     case H501_MessageBody::e_descriptorConfirmation :
  156.       return OnReceiveDescriptorConfirmation(pdu, pdu.m_body);
  157.  
  158.     case H501_MessageBody::e_descriptorRejection :
  159.       return OnReceiveDescriptorRejection(pdu, pdu.m_body);
  160.  
  161.     case H501_MessageBody::e_descriptorIDRequest :
  162.       if (SendCachedResponse(pdu))
  163.         return FALSE;
  164.       OnReceiveDescriptorIDRequest(pdu, pdu.m_body);
  165.       break;
  166.  
  167.     case H501_MessageBody::e_descriptorIDConfirmation :
  168.       return OnReceiveDescriptorIDConfirmation(pdu, pdu.m_body);
  169.  
  170.     case H501_MessageBody::e_descriptorIDRejection :
  171.       return OnReceiveDescriptorIDRejection(pdu, pdu.m_body);
  172.  
  173.     case H501_MessageBody::e_descriptorUpdate :
  174.       if (SendCachedResponse(pdu))
  175.         return FALSE;
  176.       OnReceiveDescriptorUpdate(pdu, pdu.m_body);
  177.       break;
  178.  
  179.     case H501_MessageBody::e_descriptorUpdateAck :
  180.       return OnReceiveDescriptorUpdateACK(pdu, pdu.m_body);
  181.  
  182.     case H501_MessageBody::e_accessRequest :
  183.       if (SendCachedResponse(pdu))
  184.         return FALSE;
  185.       OnReceiveAccessRequest(pdu, pdu.m_body);
  186.       break;
  187.  
  188.     case H501_MessageBody::e_accessConfirmation :
  189.       return OnReceiveAccessConfirmation(pdu, pdu.m_body);
  190.  
  191.     case H501_MessageBody::e_accessRejection :
  192.       return OnReceiveAccessRejection(pdu, pdu.m_body);
  193.  
  194.     case H501_MessageBody::e_requestInProgress :
  195.       return OnReceiveRequestInProgress(pdu, pdu.m_body);
  196.  
  197.     case H501_MessageBody::e_nonStandardRequest :
  198.       if (SendCachedResponse(pdu))
  199.         return FALSE;
  200.       OnReceiveNonStandardRequest(pdu, pdu.m_body);
  201.       break;
  202.  
  203.     case H501_MessageBody::e_nonStandardConfirmation :
  204.       return OnReceiveNonStandardConfirmation(pdu, pdu.m_body);
  205.  
  206.     case H501_MessageBody::e_nonStandardRejection :
  207.       return OnReceiveNonStandardRejection(pdu, pdu.m_body);
  208.  
  209.     case H501_MessageBody::e_unknownMessageResponse :
  210.       OnReceiveUnknownMessageResponse(pdu, pdu.m_body);
  211.       break;
  212.  
  213.     case H501_MessageBody::e_usageRequest :
  214.       if (SendCachedResponse(pdu))
  215.         return FALSE;
  216.       OnReceiveUsageRequest(pdu, pdu.m_body);
  217.       break;
  218.  
  219.     case H501_MessageBody::e_usageConfirmation :
  220.       return OnReceiveUsageConfirmation(pdu, pdu.m_body);
  221.  
  222.     case H501_MessageBody::e_usageIndication :
  223.       if (SendCachedResponse(pdu))
  224.         return FALSE;
  225.       OnReceiveUnknownMessageResponse(pdu, pdu.m_body);
  226.       break;
  227.  
  228.     case H501_MessageBody::e_usageIndicationConfirmation :
  229.       return OnReceiveUsageIndicationConfirmation(pdu, pdu.m_body);
  230.  
  231.     case H501_MessageBody::e_usageIndicationRejection :
  232.       return OnReceiveUsageIndicationRejection(pdu, pdu.m_body);
  233.  
  234.     case H501_MessageBody::e_usageRejection :
  235.       return OnReceiveUsageRejection(pdu, pdu.m_body);
  236.  
  237.     case H501_MessageBody::e_validationRequest :
  238.       if (SendCachedResponse(pdu))
  239.         return FALSE;
  240.       OnReceiveValidationRequest(pdu, pdu.m_body);
  241.       break;
  242.  
  243.     case H501_MessageBody::e_validationConfirmation :
  244.       return OnReceiveValidationConfirmation(pdu, pdu.m_body);
  245.  
  246.     case H501_MessageBody::e_validationRejection :
  247.       return OnReceiveValidationRejection(pdu, pdu.m_body);
  248.  
  249.     case H501_MessageBody::e_authenticationRequest :
  250.       if (SendCachedResponse(pdu))
  251.         return FALSE;
  252.       OnReceiveAuthenticationRequest(pdu, pdu.m_body);
  253.       break;
  254.  
  255.     case H501_MessageBody::e_authenticationConfirmation :
  256.       return OnReceiveAuthenticationConfirmation(pdu, pdu.m_body);
  257.  
  258.     case H501_MessageBody::e_authenticationRejection :
  259.       return OnReceiveAuthenticationRejection(pdu, pdu.m_body);
  260.  
  261.     default :
  262.       OnReceiveUnknown(pdu);
  263.   }
  264.  
  265.   return FALSE;
  266. }
  267.  
  268.  
  269. void H323_AnnexG::OnSendingPDU(PASN_Object & /*rawPDU*/)
  270. {
  271. }
  272.  
  273.  
  274. BOOL H323_AnnexG::OnReceiveUnknown(const H501PDU &)
  275. {
  276.   H501PDU response;
  277.   response.BuildUnknownMessageResponse(0);
  278.   return response.Write(*transport);
  279. }
  280.  
  281. BOOL H323_AnnexG::OnReceiveServiceRequest(const H501PDU & pdu, const H501_ServiceRequest & /*pduBody*/)
  282. {
  283.   PTRACE(3, "AnnexG\tOnReceiveServiceRequest - seq: " << pdu.m_common.m_sequenceNumber);
  284.   H501PDU response;
  285.   response.BuildServiceRejection(pdu.m_common.m_sequenceNumber, H501_ServiceRejectionReason::e_serviceUnavailable);
  286.   return response.Write(*transport);
  287. }
  288.  
  289. BOOL H323_AnnexG::OnReceiveServiceConfirmation(const H501PDU & pdu, const H501_ServiceConfirmation & /*pduBody*/)
  290. {
  291.   return CheckForResponse(H501_MessageBody::e_serviceRequest, pdu.m_common.m_sequenceNumber);
  292. }
  293.  
  294. BOOL H323_AnnexG::OnReceiveServiceRejection(const H501PDU & pdu, const H501_ServiceRejection & pduBody)
  295. {
  296.   return CheckForResponse(H501_MessageBody::e_serviceRequest, pdu.m_common.m_sequenceNumber, &pduBody.m_reason);
  297. }
  298.  
  299. BOOL H323_AnnexG::OnReceiveServiceRelease(const H501PDU & /*common*/, const H501_ServiceRelease & /*pdu*/)
  300. {
  301.   return FALSE;
  302. }
  303.  
  304. BOOL H323_AnnexG::OnReceiveDescriptorRequest(const H501PDU & PTRACE_pdu, const H501_DescriptorRequest & /*pdu*/)
  305. {
  306.   PTRACE(3, "AnnexG\tOnReceiveDescriptorRequest - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  307.   return FALSE;
  308. }
  309.  
  310. BOOL H323_AnnexG::OnReceiveDescriptorConfirmation(const H501PDU & PTRACE_pdu, const H501_DescriptorConfirmation & /*pdu*/)
  311. {
  312.   PTRACE(3, "AnnexG\tOnReceiveDescriptorConfirmation - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  313.   return FALSE;
  314. }
  315.  
  316. BOOL H323_AnnexG::OnReceiveDescriptorRejection(const H501PDU & PTRACE_pdu, const H501_DescriptorRejection & /*pdu*/)
  317. {
  318.   PTRACE(3, "AnnexG\tOnReceiveDescriptorRejection - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  319.   return FALSE;
  320. }
  321.  
  322. BOOL H323_AnnexG::OnReceiveDescriptorIDRequest(const H501PDU & PTRACE_pdu, const H501_DescriptorIDRequest & /*pdu*/)
  323. {
  324.   PTRACE(3, "AnnexG\tOnReceiveDescriptorIDRequest - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  325.   return FALSE;
  326. }
  327.  
  328. BOOL H323_AnnexG::OnReceiveDescriptorIDConfirmation(const H501PDU & PTRACE_pdu, const H501_DescriptorIDConfirmation & /*pdu*/)
  329. {
  330.   PTRACE(3, "AnnexG\tOnReceiveDescriptorIDConfirmation - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  331.   return FALSE;
  332. }
  333.  
  334. BOOL H323_AnnexG::OnReceiveDescriptorIDRejection(const H501PDU & PTRACE_pdu, const H501_DescriptorIDRejection & /*pdu*/)
  335. {
  336.   PTRACE(3, "AnnexG\tOnReceiveDescriptorIDRejection - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  337.   return FALSE;
  338. }
  339.  
  340. BOOL H323_AnnexG::OnReceiveDescriptorUpdate(const H501PDU & PTRACE_pdu, const H501_DescriptorUpdate & /*pdu*/)
  341. {
  342.   PTRACE(3, "AnnexG\tOnReceiveDescriptorUpdate - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  343.   return FALSE;
  344. }
  345.  
  346. BOOL H323_AnnexG::OnReceiveDescriptorUpdateACK(const H501PDU & pdu, const H501_DescriptorUpdateAck & /*pdu*/)
  347. {
  348.   PTRACE(3, "AnnexG\tOnReceiveDescriptorUpdateACK - seq: " << pdu.m_common.m_sequenceNumber);
  349.   return CheckForResponse(H501_MessageBody::e_descriptorUpdate, pdu.m_common.m_sequenceNumber);
  350. }
  351.  
  352. BOOL H323_AnnexG::OnReceiveAccessRequest(const H501PDU & PTRACE_pdu, const H501_AccessRequest & /*pdu*/)
  353. {
  354.   PTRACE(3, "AnnexG\tOnReceiveAccessRequest - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  355.   return FALSE;
  356. }
  357.  
  358. BOOL H323_AnnexG::OnReceiveAccessConfirmation(const H501PDU & pdu, const H501_AccessConfirmation & /*pdu*/)
  359. {
  360.   PTRACE(3, "AnnexG\tOnReceiveAccessConfirmation - seq: " << pdu.m_common.m_sequenceNumber);
  361.   return CheckForResponse(H501_MessageBody::e_accessRequest, pdu.m_common.m_sequenceNumber);
  362. }
  363.  
  364. BOOL H323_AnnexG::OnReceiveAccessRejection(const H501PDU & pdu, const H501_AccessRejection & pduBody)
  365. {
  366.   PTRACE(3, "AnnexG\tOnReceiveAccessRejection - seq: " << pdu.m_common.m_sequenceNumber);
  367.   return CheckForResponse(H501_MessageBody::e_accessRequest, pdu.m_common.m_sequenceNumber, &pduBody.m_reason);
  368. }
  369.  
  370. BOOL H323_AnnexG::OnReceiveRequestInProgress(const H501PDU & pdu, const H501_RequestInProgress & rip)
  371. {
  372.   return HandleRequestInProgress(pdu, rip.m_delay);
  373. }
  374.  
  375. BOOL H323_AnnexG::OnReceiveNonStandardRequest(const H501PDU & PTRACE_pdu, const H501_NonStandardRequest & /*pdu*/)
  376. {
  377.   PTRACE(3, "AnnexG\tOnReceiveNonStandardRequest - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  378.   return FALSE;
  379. }
  380.  
  381. BOOL H323_AnnexG::OnReceiveNonStandardConfirmation(const H501PDU & PTRACE_pdu, const H501_NonStandardConfirmation & /*pdu*/)
  382. {
  383.   PTRACE(3, "AnnexG\tOnReceiveNonStandardConfirmation - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  384.   return FALSE;
  385. }
  386.  
  387. BOOL H323_AnnexG::OnReceiveNonStandardRejection(const H501PDU & PTRACE_pdu, const H501_NonStandardRejection & /*pdu*/)
  388. {
  389.   PTRACE(3, "AnnexG\tOnReceiveNonStandardRejection - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  390.   return FALSE;
  391. }
  392.  
  393. BOOL H323_AnnexG::OnReceiveUnknownMessageResponse(const H501PDU & PTRACE_pdu, const H501_UnknownMessageResponse & /*pdu*/)
  394. {
  395.   PTRACE(3, "AnnexG\tOnReceiveUnknownMessageResponse - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  396.   return FALSE;
  397. }
  398.  
  399. BOOL H323_AnnexG::OnReceiveUsageRequest(const H501PDU & PTRACE_pdu, const H501_UsageRequest & /*pdu*/)
  400. {
  401.   PTRACE(3, "AnnexG\tOnReceiveUsageRequest - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  402.   return FALSE;
  403. }
  404.  
  405. BOOL H323_AnnexG::OnReceiveUsageConfirmation(const H501PDU & PTRACE_pdu, const H501_UsageConfirmation & /*pdu*/)
  406. {
  407.   PTRACE(3, "AnnexG\tOnReceiveUsageConfirmation - seq: " << pdu.m_common.m_sequenceNumber);
  408.   return FALSE;
  409. }
  410.  
  411. BOOL H323_AnnexG::OnReceiveUsageIndicationConfirmation(const H501PDU & PTRACE_pdu, const H501_UsageIndicationConfirmation & /*pdu*/)
  412. {
  413.   PTRACE(3, "AnnexG\tOnReceiveUsageIndicationConfirmation - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  414.   return FALSE;
  415. }
  416.  
  417. BOOL H323_AnnexG::OnReceiveUsageIndicationRejection(const H501PDU & PTRACE_pdu, const H501_UsageIndicationRejection & /*pdu*/)
  418. {
  419.   PTRACE(3, "AnnexG\tOnReceiveUsageIndicationRejection - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  420.   return FALSE;
  421. }
  422.  
  423. BOOL H323_AnnexG::OnReceiveUsageRejection(const H501PDU & PTRACE_pdu, const H501_UsageRejection & /*pdu*/)
  424. {
  425.   PTRACE(3, "AnnexG\tOnReceiveUsageRejection - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  426.   return FALSE;
  427. }
  428.  
  429. BOOL H323_AnnexG::OnReceiveValidationRequest(const H501PDU & PTRACE_pdu, const H501_ValidationRequest & /*pdu*/)
  430. {
  431.   PTRACE(3, "AnnexG\tOnReceiveValidationRequest - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  432.   return FALSE;
  433. }
  434.  
  435. BOOL H323_AnnexG::OnReceiveValidationConfirmation(const H501PDU & PTRACE_pdu, const H501_ValidationConfirmation & /*pdu*/)
  436. {
  437.   PTRACE(3, "AnnexG\tOnReceiveValidationConfirmation - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  438.   return FALSE;
  439. }
  440.  
  441. BOOL H323_AnnexG::OnReceiveValidationRejection(const H501PDU & PTRACE_pdu, const H501_ValidationRejection & /*pdu*/)
  442. {
  443.   PTRACE(3, "AnnexG\tOnReceiveValidationRejection - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  444.   return FALSE;
  445. }
  446.  
  447. BOOL H323_AnnexG::OnReceiveAuthenticationRequest(const H501PDU & PTRACE_pdu, const H501_AuthenticationRequest & /*pdu*/)
  448. {
  449.   PTRACE(3, "AnnexG\tOnReceiveAuthenticationRequest - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  450.   return FALSE;
  451. }
  452.  
  453. BOOL H323_AnnexG::OnReceiveAuthenticationConfirmation(const H501PDU & PTRACE_pdu, const H501_AuthenticationConfirmation & /*pdu*/)
  454. {
  455.   PTRACE(3, "AnnexG\tOnReceiveAuthenticationConfirmation - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  456.   return FALSE;
  457. }
  458.  
  459. BOOL H323_AnnexG::OnReceiveAuthenticationRejection(const H501PDU & PTRACE_pdu, const H501_AuthenticationRejection & /*pdu*/)
  460. {
  461.   PTRACE(3, "AnnexG\tOnReceiveAuthenticationRejection - seq: " << PTRACE_pdu.m_common.m_sequenceNumber);
  462.   return FALSE;
  463. }
  464.  
  465.  
  466. /////////////////////////////////////////////////////////////////////////////
  467.