main.cxx
上传用户:wzkunzhan
上传日期:2022-04-23
资源大小:2618k
文件大小:64k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. /*
  2.  * main.cxx
  3.  *
  4.  * Main source for H323BeaconServer
  5.  *
  6.  *
  7.  * Copyright (c) 1993-2001 Equivalence Pty. Ltd.
  8.  *
  9.  * The contents of this file are subject to the Mozilla Public License
  10.  * Version 1.0 (the "License"); you may not use this file except in
  11.  * compliance with the License. You may obtain a copy of the License at
  12.  * http://www.mozilla.org/MPL/
  13.  *
  14.  * Software distributed under the License is distributed on an "AS IS"
  15.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  16.  * the License for the specific language governing rights and limitations
  17.  * under the License.
  18.  *
  19.  * The Original Code is Portable Windows Library.
  20.  *
  21.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  22.  *
  23.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  24.  * All Rights Reserved.
  25.  *
  26.  * Portions are Copyright (C) 2002 ITEC-Ohio.
  27.  * All Rights Reserved.
  28.  *
  29.  */
  30. #include <ptlib.h>
  31. //#include <sys/types.h>
  32. //#include <socket.h>
  33. //#include <string.h>
  34. //#include <arpa/inet.h>
  35. //#include <unistd.h>             
  36. //#include <netinet/in.h>
  37. #include <ptlib/pipechan.h>
  38. #include "version.h"
  39. #include "lpc10codec.h"
  40. #include "speexcodec.h"
  41. #include "mscodecs.h"
  42. #include "opalvxml.h"
  43. #include "main.h"
  44. #include "callermain.h"
  45. PCREATE_PROCESS(H323BeaconServer);
  46. #define new PNEW
  47. #define DEFAULT_MSG_LIMIT 60
  48. #define DEFAULT_TESTS_LOG "tests_log.txt"
  49. #define G7231_BLOCK_SIZE 24
  50. #define G7231_SAMPLES_PER_BLOCK 240
  51. #define G7231_BANDWIDTH 63
  52. #define G7231_SILENCE_FLAG 0x02
  53. #define G7231_SILENCE_LENGTH 0x04
  54. #define CHECK_PCM   1
  55. #define CHECK_G7231 2
  56. #define YES '1'
  57. #define NO '0'
  58. #define MENU_PREFIX "UserMenu-"
  59. //log-server defines
  60. //#define SOCKET_ERROR -1
  61. #define SRVPORT 5050
  62. #define LOG_H323 "sideB.H323"
  63. static PMutex logMutex;
  64. static PTextFile logFile;
  65. static PFilePath logFilename = DEFAULT_TESTS_LOG;
  66. PString G7231Ext = ".g723";
  67. PString WAVExt          = ".wav";
  68. PString PCMExt          = ".sw";
  69. PString receivedDTMFMessage;
  70. PString dtmfTrigger = NO;
  71. PString recordDTMFTrigger = NO;
  72. PString stopRecordDTMFTrigger = NO;
  73. PString startPlayingDTMFTrigger = NO;
  74. int playedFlag = 0; //to make sure that the message has already been played before flushing the queue
  75. PString fn_tmp = "";
  76. PString fnAgain = "";
  77. PString IPAddress ; // stores IP address
  78. PString tmpDir;
  79. unsigned int tmpCallLimit;
  80. BOOL playedOnce = FALSE;
  81. int countwavefiles;
  82. char buffercountwavefiles[100];
  83. PString junkwave = "";
  84. BOOL recordStartedNext = FALSE;
  85. PString fn_original = "";
  86. PFilePath fn;
  87. PFilePath _fn;
  88. PFile *fileclass;
  89. PFile *fileclass_tmp; 
  90. PCM_RecordFile * recordFile;
  91. PCM_RecordFile * recordFilejunkwave;
  92. MyH323Connection  * tmpConn;
  93. //Caller * caller;
  94. static void LogMessage(const PString & str)
  95. {
  96.   PTime now;
  97.   PString msg = now.AsString("hh:mm:ss dd/MM/yyyy") & str;
  98.   logMutex.Wait();
  99.   if (!logFile.IsOpen()) {
  100.     logFile.Open(logFilename, PFile::ReadWrite);
  101.     logFile.SetPosition(0, PFile::End);
  102.   }
  103.   logFile.WriteLine(msg);
  104.   logFile.Close();
  105.   
  106.   logMutex.Signal();
  107. }
  108. static void LogCall(const PFilePath & fn,
  109.                     const PString & from,
  110.                     const PString & user,
  111.                     unsigned len,
  112.                     const PString & codec,
  113.                     const PString & product)
  114. {
  115.   PString addr = from;
  116.   LogMessage(addr & """ + user + """ & PString(PString::Unsigned, len) & codec & """ + product + """ & """ + fn + """);
  117. }
  118. ///////////////////////////////////////////////////////////////
  119. H323BeaconServer::H323BeaconServer()
  120.   : PProcess("H.323 Beacon Project", "H.323 Beacon Server",
  121.              MAJOR_VERSION, MINOR_VERSION, BUILD_TYPE, BUILD_NUMBER)
  122. {
  123. }
  124. H323BeaconServer::~H323BeaconServer()
  125. {
  126. }
  127. void H323BeaconServer::Main()
  128. {
  129.   
  130.   
  131.   cout << "*************************************************************n";
  132.   cout << GetName() << " Version 1.4 built using the librariesn";
  133.   cout << "available at http://www.openh323.orgn"; 
  134.   cout << "(C)Copyright ITEC-Ohio,2004.n";
  135.   cout << "http://www.itecohio.org/beaconn";
  136.   cout << "*************************************************************n";
  137.   cout << "NOTE: For more options, Example usage:" << endl;
  138.   cout << ""C:\Program Files\H.323 Beacon Server\H323BeaconServer -h"" << endl;
  139.   PConfigArgs args(GetArguments());
  140.   args.Parse(
  141.              "D-disable:"
  142.  "a-acceptor:"
  143.  "r-result:"
  144.              "d-directory:"
  145.              "g-gatekeeper:"         "n-no-gatekeeper."
  146.              "-g711-ulaw."           "-no-g711-ulaw."
  147.              "-g711-alaw."           "-no-g711-alaw."
  148.              "-g711message:"         "-no-g711message."
  149.              "-g7231."               "-no-g7231."
  150.              "-g7231message:"        "-no-g7231message."
  151.              "-gsm."                 "-no-gsm."
  152.              "-gsmmessage:"          "-no-gsmmessage."
  153.              "h-help."
  154.              "H-hangup."             "-no-hangup."
  155.              "i-interface:"          "-no-interface."
  156.              "k-kill."               "-no-kill."
  157.              "l-limit:"              "-no-limit."
  158.              "-listenport:"          "-no-listenport."
  159.              "-lpc10message:"        "-no-lpc10message."
  160.              "-speexmessage:"        "-no-speexmessage."
  161.              "m-message:"            "-no-message."
  162.              "-no-recordg7231."
  163. #if PTRACING
  164.              "o-output:"
  165. #endif
  166.              "P-prefer:"
  167.              "-pcm."                 "-no-pcm."
  168.              "-pcmmessage:"          "-no-pcmmessage."
  169.              "-port:"
  170.              "q-quicknet:"           "-no-quicknet:"
  171.              "r-run:"                "-no-run."
  172.      "-recordraw."
  173.              "-require-gatekeeper."  "-no-require-gatekeeper."
  174.              "-save."
  175. #if PMEMORY_CHECK
  176.              "-setallocationbreakpoint:"
  177. #endif
  178. #if PTRACING
  179.              "t-trace."
  180. #endif
  181.      "u-username:"           "-no-username."
  182.           , FALSE);
  183. #if PMEMORY_CHECK
  184.   if (args.HasOption("setallocationbreakpoint"))
  185.     PMemoryHeap::SetAllocationBreakpoint(args.GetOptionString("setallocationbreakpoint").AsInteger());
  186. #endif
  187. //#if PTRACING
  188.   PTrace::Initialise(args.GetOptionCount('t'),
  189.                      args.HasOption('o') ? (const char *)args.GetOptionString('o') : NULL);
  190. //#endif
  191.   if (args.HasOption('h')) {
  192.     cout << "Usage : H323BeaconServer [options]n"
  193.             "Options:n"
  194. "  -a --acceptor IPaddress  : Connect to the Acceptor IP in Initiator moden"  //WM
  195.             "  -r --result option  : 'html' or 'text'n"
  196. "  -md --directory dir  : Put recorded mesages into dirn"  //WM
  197.             "  -l --limit secs     : Limit recorded messages to secs duration (default " << DEFAULT_MSG_LIMIT << ")n"
  198.             "  -m --pcmmessage fn  : Set outgoing message for PCM derived codecs (G.711/GSM) to fnn"
  199.             "  --g7231message fn   : Set outgoing message for G723.1 codec to fnn"
  200.             "  --g711message fn    : Set outgoing message for G711 codec to fnn"
  201.             "  --gsmmessage fn     : Set outgoing message for GSM codec to fnn"
  202.             "  --lpc10message fn   : Set outgoing message for LPC10 codec to fnn"
  203.             "  --speexmessage fn   : Set outgoing message for Speex codec to fnn"
  204.             "  --recordraw         : Record PCM audo in raw files (.sw) instead of .wavn"
  205.             "  -r --run cmd        : Run this command after each recorded messagen"
  206.             "  -k --kill           : Kill recorded files after user commandn"
  207.             "  -H --hangup         : hangup after playing messagen"
  208.             "  -u --username str   : Set the local endpoint name to strn"
  209.             "  -i --interface ip   : Bind to a specific interfacen"
  210.             "  --listenport port   : Listen on a specific portn"
  211.             "  -g --gatekeeper host: Specify gatekeeper host.n"
  212.             "  -n --no-gatekeeper  : Disable gatekeeper discovery.n"
  213.             "  --require-gatekeeper: Exit if gatekeeper discovery fails.n"
  214.             "  -D --disable codec  : Disable the specified codec (may be used multiple times)n"
  215.             "  -P --prefer codec   : Prefer the specified codec (may be used multiple times)n"
  216. #if PTRACING
  217.             "  -t --trace          : Enable trace, use multiple times for more detailn"
  218.             "  -o --output         : File for trace output, default is stderrn"
  219. #endif
  220.             "     --save           : Save arguments in configuration filen"
  221.             "  -h --help           : Display this help messagen";
  222.     return;
  223.   }
  224.   args.Save("save");
  225. #if HAS_IXJ
  226.   if (args.GetCount() > 0) {
  227.     if (args[0] *= "record") 
  228.       RecordFile(args);
  229.     else if (args[0] *= "play") 
  230.       PlayFile(args);
  231.     else
  232.       cerr << "unknown command "" << args[0] << """ << endl;
  233.     return;
  234.   }
  235. #endif
  236.   unsigned callLimit = DEFAULT_MSG_LIMIT;
  237.   if (args.HasOption('l')) {
  238.     callLimit = args.GetOptionString('l').AsInteger();
  239.     if (callLimit > 3600) {
  240.       cout << "warning: maximum call length " << callLimit << " is out of range. Using " << DEFAULT_MSG_LIMIT << " insteadn";
  241.       callLimit = DEFAULT_MSG_LIMIT;
  242.     } else if (callLimit == 0)
  243.       cout << "warning: recorded message call limit disabledn";
  244.   }
  245.   cout << "Maximum duration of audio-recording limited to " << callLimit << " seconds...n";
  246.   PString runCmd;
  247.   if (args.HasOption('r')) {
  248.     runCmd = args.GetOptionString('r');
  249.     cout << "Executing "" << runCmd << "" after each message" << endl;
  250.   }
  251. ///////////////////////////////////////////////////////////////////
  252.   
  253.   PDirectory dir;  //WM
  254.   if (args.HasOption('d')) {
  255.     dir = args.GetOptionString('d');
  256.    }
  257.   PString Carg;
  258.   if (args.HasOption('a')) {
  259. Caller caller;
  260. PString CallerIP;
  261. CallerIP = args.GetOptionString('a');
  262. if (CallerIP==NULL){
  263. cout<<"Error: Acceptor IPaddress Missingn"<<
  264. "Usage:H323BeaconServer -a <AcceptorIPaddress>n";
  265. exit(0);
  266. }
  267. Carg = "-tttttt -o sideA.H323 -m media.wav " + CallerIP;
  268. PTime theTime;
  269. PString date = theTime.GetTimeInSeconds();
  270. //cout <<"Test Start Date:"<<date<<"n";
  271. cout<< "Starting the Server in Test Session Initiator mode with noptions ""<<Carg <<""n";
  272. caller.CallerMain(Carg);
  273. PString option;
  274. PString command;
  275. if (args.HasOption('r')) {
  276. option  = args.GetOptionString('r');
  277. if (option=="text"){
  278. command = "perl GO-text.pl " + CallerIP + " " + date;
  279. }
  280. else {
  281. command = "perl GO-html.pl " + CallerIP + " " + date;
  282. }
  283. }
  284. else {
  285. command ="perl GO-text.pl " + CallerIP + " " + date;
  286. }
  287. //call the E-model 
  288.  
  289. if(system(command)==0){
  290. }
  291. return;
  292.   }
  293. /////////////////////////////////////////////////////////////////////
  294.   int flags = 0;
  295.   if (args.HasOption("no-recordg7231")) {
  296.     cout << "Supressing recording of G723.1 messages" << endl;
  297.     flags |= MyH323EndPoint::NoRecordG7231;
  298.   }
  299.   if (args.HasOption('k')) {
  300.     cout << "Deleting recorded files after processing" << endl;
  301.     if (runCmd.IsEmpty()) 
  302.     flags |= MyH323EndPoint::DeleteAfterRecord;
  303.   }
  304.   if (args.HasOption('H'))
  305.     flags |= MyH323EndPoint::HangupAfterPlay;
  306.   
  307.   cout << "Creating the H.323 endpoint for the test session...n";
  308.   MyH323EndPoint endpoint(callLimit, runCmd, dir, flags);
  309.   PString userName = "H323BeaconServer ver" + GetVersion();
  310.   if (args.HasOption('u'))
  311.     userName = args.GetOptionString('u');
  312.   endpoint.SetLocalUserName(userName);
  313.   cout << "Initializing Codecs.........n";
  314.   if (!endpoint.Initialise(args))
  315.     return;
  316.  
  317.   // start the H.323 listener
  318.   H323ListenerTCP * listener;
  319.   PIPSocket::Address interfaceAddress(INADDR_ANY);
  320.  // WORD listenPort = H323ListenerTCP::DefaultSignalPort;
  321.   WORD listenPort = H323EndPoint::DefaultTcpPort;
  322.   PTRACE(1,"LISTENPORT: " <<listenPort);
  323.   if (args.HasOption("listenport"))
  324.     listenPort = (WORD)args.GetOptionString("listenport").AsInteger();
  325.   if (args.HasOption('i'))
  326.     interfaceAddress = PIPSocket::Address(args.GetOptionString('i'));
  327.   cout << "Creating the H.323 TCP Listener...Listen Port: " << listenPort << endl;
  328.   listener  = new H323ListenerTCP(endpoint, interfaceAddress, listenPort);
  329.   if (!endpoint.StartListener(listener)) {
  330.     cout <<  "Could not open H.323 listener port on "
  331.          << listener->GetListenerPort() << endl;
  332.     delete listener;
  333.     return;
  334.   }
  335.   
  336.   
  337.   cout << "H.323 Beacon Server IP Address: " << getLocalhostIPAddress() << endl;
  338.   cout << "Waiting to accept incoming connections..." << endl;
  339.   for (;;) 
  340.     PThread::Current()->Sleep(5000);
  341. }
  342. ///////////////////////////////////////////////////////////////
  343. //  : H323AudioCapability(12*G7231_BLOCK_SIZE, 4*G7231_BLOCK_SIZE)
  344. G7231_File_Capability::G7231_File_Capability()
  345.   : H323AudioCapability(8, 4)
  346. {
  347. }
  348. BOOL G7231_File_Capability::OnSendingPDU(H245_AudioCapability & cap, unsigned packetSize) const
  349. {
  350.   // set the choice to the correct type
  351.   cap.SetTag(GetSubType());
  352.   // get choice data
  353.   H245_AudioCapability_g7231 & g7231 = cap;
  354.   // max number of audio frames per PDU we want to send
  355.   g7231.m_maxAl_sduAudioFrames = packetSize; 
  356.   // no silence suppression
  357.   g7231.m_silenceSuppression = FALSE;
  358.   return TRUE;
  359. }
  360. BOOL G7231_File_Capability::OnReceivedPDU(const H245_AudioCapability & cap, unsigned & packetSize)
  361. {
  362.   const H245_AudioCapability_g7231 & g7231 = cap;
  363.   packetSize = g7231.m_maxAl_sduAudioFrames;
  364.   return TRUE;
  365. }
  366. PObject * G7231_File_Capability::Clone() const
  367. {
  368.   return new G7231_File_Capability(*this);
  369. }
  370. H323Codec * G7231_File_Capability::CreateCodec(H323Codec::Direction direction) const
  371. {
  372.   return new G7231_File_Codec(direction);
  373. }
  374. ///////////////////////////////////////////////////////////////
  375. ///////////////////////////////////////////////////////////////
  376. G7231_File_Codec::G7231_File_Codec(Direction dir)
  377.   : H323AudioCodec(OPAL_G7231_6k3, dir)
  378. {
  379. }
  380. int G7231_File_Codec::GetFrameLen(int val)
  381. {
  382.   static const int frameLen[] = { 24, 20, 4, 1 };
  383.   return frameLen[val & 3];
  384. }
  385. BOOL G7231_File_Codec::Read(BYTE * buffer, unsigned & length, RTP_DataFrame &)
  386. {
  387.   if (rawDataChannel == NULL)
  388.     return FALSE;
  389.     
  390.   if (!rawDataChannel->Read(buffer, 1)) {
  391.     cerr << "Read failed" << endl;
  392.     return FALSE;
  393.   }
  394.   if (rawDataChannel->GetLastReadCount() == 0) {
  395.     cerr << "Read count is zero" << endl;
  396.     return FALSE;
  397.   }
  398.   int readLen = G7231_File_Codec::GetFrameLen(buffer[0]);
  399.   if (readLen > 0) {
  400.     if (!rawDataChannel->Read(buffer+1, readLen-1)) {
  401.       cerr << "Read failed" << endl;
  402.       return FALSE;
  403.     }
  404.     if (rawDataChannel->GetLastReadCount() == 0) {
  405.       cerr << "Read count is zero" << endl;
  406.       return FALSE;
  407.     }
  408.   }
  409.   length = readLen;
  410.   return TRUE;
  411. }
  412. BOOL G7231_File_Codec::Write(const BYTE * buffer, unsigned length, const RTP_DataFrame & /* rtp */, unsigned & writtenLength)
  413. {
  414.   static const BYTE silence[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  415.                                   0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  416.                                   0, 0, 0, 0};
  417.   // If the length is zero, output silence to the file..
  418.   if (length == 0) {
  419.     PTRACE(1,"G.723.1 zero length frame");
  420.     writtenLength = 0;
  421.     return rawDataChannel->Write(silence, 24);
  422.   }
  423.   int writeLen;
  424.   switch (buffer[0]&3) {
  425.     case 0:
  426.       writeLen = 24;
  427.       break;
  428.     case 1:
  429.       writeLen = 20;
  430.       break;
  431.     case 2:
  432.       // Windows Media Player cannot play 4 byte SID (silence) frames.
  433.       // So write out a 24 byte frame of silence instead.
  434.       PTRACE(1,"Replacing SID with 24 byte frame");
  435.       writtenLength = 4;
  436.       return rawDataChannel->Write(silence, 24);
  437. //    writeLen = 4;
  438. //    break;
  439.     default :
  440.       writeLen = 1;
  441.       break;
  442.   }
  443.   PTRACE(1,"G.723.1 frame length = " <<writeLen);
  444.   writtenLength = writeLen;
  445.   return rawDataChannel->Write(buffer, writeLen);
  446. }
  447. unsigned G7231_File_Codec::GetBandwidth() const      { return G7231_BANDWIDTH; }
  448.       
  449. ///////////////////////////////////////////////////////////////
  450. MyH323EndPoint::MyH323EndPoint(unsigned _callLimit,
  451.                                const PString & _runCmd,
  452.                                const PDirectory & _dir,
  453.                                int   _flags)
  454.   : callLimit(_callLimit), runCmd(_runCmd), dir(_dir), flags(_flags)
  455. {
  456. }
  457. BOOL MyH323EndPoint::OnIncomingCall(H323Connection & _conn,
  458.                                     const H323SignalPDU & setupPDU,
  459.                                     H323SignalPDU &)
  460. {
  461.   MyH323Connection & conn = (MyH323Connection &)_conn;
  462.   // see if incoming call is to a getway address
  463.   PString number;
  464.   if (setupPDU.GetDestinationE164(number)) 
  465.     conn.SetE164Number(number);
  466.   return TRUE;
  467. }
  468. /*
  469. void MyH323EndPoint::OnConnectionEstablished( H323Connection & _conn , const PString & _token  )
  470. {
  471.   MyH323Connection & conn = (MyH323Connection &)_conn;
  472.   RTP_Session * session = conn.GetSession(RTP_Session::DefaultAudioSessionID);
  473.   session->SetReportTimeInterval(1000);
  474. }
  475. */
  476. H323Connection * MyH323EndPoint::CreateConnection(unsigned callReference)
  477. {
  478.   return new MyH323Connection(*this, callReference);
  479. }
  480. BOOL MyH323EndPoint::Initialise(PConfigArgs & args)
  481. {
  482.   // format for record files, raw or wav
  483.   if (args.HasOption("recordraw")) 
  484.     SetRecordWav(FALSE);
  485.   else
  486.     SetRecordWav(TRUE);
  487.   // get G723.1 OGM
  488.   if (args.HasOption("g7231message"))
  489.     g7231Ogm = args.GetOptionString("g7231message");
  490.   else if (args.HasOption('m'))  {
  491.     if (PFile::Exists(args.GetOptionString('m') + "_g7231" + WAVExt)) {
  492.       g7231Ogm = args.GetOptionString('m') + "_g7231" + WAVExt;
  493.     }
  494.     else if (PFile::Exists(args.GetOptionString('m') + PCMExt)) {
  495.       g7231Ogm = args.GetOptionString('m') + G7231Ext;
  496.     }
  497.   }
  498.   if (!g7231Ogm.IsEmpty()) {
  499.     // check if the file exists. (do not check if filename contains %s)
  500.     if ((g7231Ogm.Find("%s") == P_MAX_INDEX) && !PFile::Exists(g7231Ogm)) {
  501.       cout << "warning: cannot open G723.1 OGM file "" << g7231Ogm << """ << endl;
  502.       g7231Ogm = "";
  503.     } 
  504.   }
  505.   /*
  506.   if (g7231Ogm.IsEmpty()) 
  507.     cout << "No G.723.1 outgoing message setn";
  508.   else {
  509.     cout << "Using "" << g7231Ogm << "" as G.723.1 outgoing messagen";
  510.   }
  511.   */
  512.   // Get the OGM message for the 'PCM' codecs
  513.   // Check if the file specified exists. If it does, use it.
  514.   // If it does not exist, try with .wav and .sw extensions.
  515.   if (args.HasOption("pcmmessage")) {
  516.     pcmOgm = args.GetOptionString("pcmmessage");
  517.   }
  518.   else if (args.HasOption('m')) {
  519.   if (g7231Ogm.Find("%s") == P_MAX_INDEX) {
  520.        pcmOgm = args.GetOptionString('m');
  521. } else {
  522.       if (PFile::Exists(args.GetOptionString('m'))) {
  523.         pcmOgm = args.GetOptionString('m');
  524.       }
  525.       else if (PFile::Exists(args.GetOptionString('m') + WAVExt)) {
  526.         pcmOgm = args.GetOptionString('m') + WAVExt;
  527.       }
  528.       else if (PFile::Exists(args.GetOptionString('m') + PCMExt)) {
  529.         pcmOgm = args.GetOptionString('m') + PCMExt;
  530.       }
  531. }
  532.   }
  533.   // By default, use the pcmOgm for all the PCM codecs, but allow the user
  534.   // to override them.
  535.   gsmOgm   = pcmOgm;
  536.   g711Ogm  = pcmOgm;
  537.   lpc10Ogm = pcmOgm;
  538.   speexOgm = pcmOgm;
  539.   // We can set the filename for specific codecs.
  540.   if (args.HasOption("gsmmessage")) 
  541.     gsmOgm = args.GetOptionString("gsmmessage");
  542.   if (args.HasOption("g711message")) 
  543.     g711Ogm = args.GetOptionString("g711message");
  544.   if (args.HasOption("lpc10message")) 
  545.     lpc10Ogm = args.GetOptionString("lpc10message");
  546.   if (args.HasOption("speexmessage")) 
  547.     speexOgm = args.GetOptionString("speexmessage");
  548.   // Check GSM OGM message
  549.   if (!gsmOgm.IsEmpty()) {
  550.     if ((gsmOgm.Find("%s") == P_MAX_INDEX) && !PFile::Exists(gsmOgm)) {
  551.       cout << "warning: cannot open GSM OGM file "" << gsmOgm << """ << endl;
  552.       gsmOgm = "";
  553.     }
  554.   } 
  555.   if (gsmOgm.IsEmpty()) {
  556.     cout << "No outgoing message specified in the arguments...." <<endl;
  557. cout << "Shutting down H.323 Beacon Server!!!!!!!!" <<endl;
  558. cout << "Try, Example usage:" << endl;
  559. cout << ""C:\Program Files\C++ H.323 Beacon Server\H323BeaconServer -m message"" << endl;
  560.   }
  561.     
  562.   else {
  563.     cout << "Using "" << gsmOgm << "" as GSM outgoing messagen";
  564.   }
  565.   // Check G.711 OGM message 
  566.   if (!g711Ogm.IsEmpty()) {
  567.     if ((g711Ogm.Find("%s") == P_MAX_INDEX) && !PFile::Exists(g711Ogm)) {
  568.       cout << "warning: cannot open G711 OGM file "" << g711Ogm << """ << endl;
  569.       g711Ogm = "";
  570.     }
  571.   } 
  572.   /*
  573.   if (g711Ogm.IsEmpty()) 
  574.     cout << "No G711 outgoing message setn";
  575.   else {
  576.     cout << "Using "" << g711Ogm << "" as G.711 outgoing messagen";
  577.   }*/
  578.   // Check LPC10 OGM message 
  579.   if (!lpc10Ogm.IsEmpty()) {
  580.     if ((lpc10Ogm.Find("%s") == P_MAX_INDEX) && !PFile::Exists(lpc10Ogm)) {
  581.       cout << "warning: cannot open LPC10 OGM file "" << lpc10Ogm << """ << endl;
  582.       lpc10Ogm = "";
  583.     }
  584.   } 
  585.   if (lpc10Ogm.IsEmpty()) {
  586. //    cout << "No LPC10 outgoing message setn";
  587.   }
  588.   else {
  589.   //  cout << "Using "" << lpc10Ogm << "" as LPC10 outgoing messagen";
  590.   }
  591.   // Check Speex OGM message 
  592.   if (!speexOgm.IsEmpty()) {
  593.     // check if the file exists. (do not check if filename contains %s)
  594.     if ((speexOgm.Find("%s") == P_MAX_INDEX) && !PFile::Exists(speexOgm)) {
  595.       cout << "warning: cannot open Speex OGM file "" << speexOgm << """ << endl;
  596.       speexOgm = "";
  597.     }
  598.   } 
  599.   if (speexOgm.IsEmpty()) {
  600. //    cout << "No Speex outgoing message setn";
  601.   }
  602.   else {
  603. //    cout << "Using "" << speexOgm << "" as Speex outgoing messagen";
  604.   }
  605.   if (g7231Ogm.IsEmpty() && gsmOgm.IsEmpty() && g711Ogm.IsEmpty()
  606.                          && lpc10Ogm.IsEmpty() 
  607.  && speexOgm.IsEmpty()
  608.  ) {
  609.     cerr << "Must specify at least one outgoing message" << endl;
  610.     return FALSE;
  611.   }
  612.   if (!g7231Ogm.IsEmpty())
  613.     SetCapability(0, 0, new G7231_File_Capability);
  614.   if (!gsmOgm.IsEmpty())
  615.     SetCapability(0, 0, new H323_GSM0610Capability);
  616.   if (!gsmOgm.IsEmpty())
  617.     SetCapability(0, 0, new MicrosoftGSMAudioCapability);
  618.   if (!g711Ogm.IsEmpty())
  619.     SetCapability(0, 0, new H323_G711Capability(H323_G711Capability::muLaw, H323_G711Capability::At64k));
  620.   if (!g711Ogm.IsEmpty())
  621.     SetCapability(0, 0, new H323_G711Capability(H323_G711Capability::ALaw, H323_G711Capability::At64k));
  622.   if (!lpc10Ogm.IsEmpty())
  623.     SetCapability(0, 0, new H323_LPC10Capability(*this));
  624.   if (!speexOgm.IsEmpty())
  625.     SetCapability(0, 0, new SpeexNarrow2AudioCapability());
  626.     SetCapability(0, 0, new SpeexNarrow3AudioCapability());
  627.     SetCapability(0, 0, new SpeexNarrow4AudioCapability());
  628.     SetCapability(0, 0, new SpeexNarrow5AudioCapability());
  629.     SetCapability(0, 0, new SpeexNarrow6AudioCapability());
  630.   capabilities.Remove(args.GetOptionString('D').Lines());
  631.   capabilities.Reorder(args.GetOptionString('P').Lines());
  632.   //cout << "Codecs (in preference order):n" << setprecision(2) << capabilities << endl;
  633.   return TRUE;
  634. }
  635. ///////////////////////////////////////////////////////////////
  636. PCM_RecordFile::PCM_RecordFile(MyH323Connection & _conn, const PFilePath & _fn, unsigned _callLimit)
  637.   : conn(_conn), fn(_fn), callLimit(_callLimit)
  638. {
  639.   //recordStarted = FALSE;
  640.   recordStartedNext = FALSE;
  641.   timeLimitExceeded = FALSE;
  642.   closed        = FALSE;
  643.   dataWritten   = FALSE;
  644.   // If the file name ends in .wav then open the output as a WAV file.
  645.   // Otherwise open it as a raw file.
  646.   if ((_fn.Right(4)).ToLower() == ".wav")
  647.     fileclass = new PWAVFile(_fn, PFile::WriteOnly,
  648.      PFile::ModeDefault,PWAVFile::PCM_WavFile);
  649.   else
  650.     fileclass = new PFile(_fn, PFile::WriteOnly);
  651. }
  652. void PCM_RecordFile::StartRecording()
  653. {
  654.    PWaitAndSignal mutex(pcmrecordMutex);
  655.   
  656.   
  657.   //if (recordStarted) 
  658.     if (recordStartedNext)
  659.     return;
  660.   PTRACE(1, "Starting recording to " << junkwave);
  661.   
  662.   if (playedOnce)
  663.   {
  664.   fn_tmp = junkwave;
  665.   fn = junkwave;
  666.   playedOnce = FALSE;
  667.   }
  668.   else
  669.   {
  670. fn_tmp = fn;
  671.   }
  672.   
  673.   PTime now;
  674.   //recordStarted = TRUE;
  675.   recordStartedNext = TRUE;
  676.   finishTime = now + (callLimit * 1000);
  677. }
  678. BOOL PCM_RecordFile::Close()
  679. {
  680.   PWaitAndSignal mutex(pcmrecordMutex);
  681.   
  682.   closed = TRUE;
  683.   return fileclass->Close();
  684. }
  685. BOOL PCM_RecordFile::Write(const void * buf, PINDEX len)
  686. {
  687.   // Wait for the mutex, and Signal it at the end of this function
  688.   PWaitAndSignal mutex(pcmrecordMutex);
  689.   // If the record file has been closed, or if the time limit has
  690.   // been exceeded, then return immediatly.
  691.   if (closed || timeLimitExceeded)
  692.     return TRUE;
  693.   if (!recordStartedNext) {
  694.     DelayFrame(len);
  695.     return TRUE;
  696.   }
  697.     
  698.   
  699.   //To check for the finish DTMFMessage and not clear the call
  700.   //if time exceeded or if the user stops recording...
  701.   PTime now;
  702.   if ((callLimit != 0) && ((now >= finishTime) || strcmp(stopRecordDTMFTrigger,"1") == 0 )) {
  703.         //PTRACE(1, "Terminating call due to timeout..");
  704. if(now >= finishTime){
  705. cout << "Recording Stopped due to time out%%%%%%%%%" <<endl;
  706. PTRACE(1, "Closing recording due to time out...");
  707. }
  708. else{
  709. cout << "Recording Stopped%%%%%%%%%" <<endl;
  710. PTRACE(1, "Closing recording due to stopRecordDTMFTrigger.."<<stopRecordDTMFTrigger);
  711. }
  712.     timeLimitExceeded = TRUE;
  713. //conn.ClearCall(); //to avoid disconnecting after finishing the recording from Client side..
  714. cout << "Waiting for "Start Playing" message from the H.323 Beacon Client..." <<endl;
  715. PTRACE(1, "Waiting for DTMF 3 Message******************");
  716. while(strcmp(startPlayingDTMFTrigger,"1") != 0 ){
  717. // 
  718. PTRACE(1,"WM_A in while look");
  719. //return FALSE;
  720. return TRUE;
  721. }
  722. PTRACE(1, "Finished waiting for DTMF 3 Message*****************");
  723. //Play the file here..
  724. PTRACE(1, "Playing the recorded file>>>>>>>>>>>>>>>>>>>...."<<fn);
  725. /*
  726. PWAVFile *playSaved;
  727. playSaved = new PWAVFile(fn_tmp, PFile::ReadOnly);
  728. PTRACE(1," fn_tmp = " << fn_tmp);
  729. if (!playSaved->IsOpen()){
  730. PTRACE(1, "Cannot open file "" << playSaved->GetName() << """);
  731. delete playSaved;
  732. else{ 
  733. PTRACE(1, "Playing file "" << playSaved->GetName() << """);
  734. SetReadChannel(playSaved, TRUE);
  735. /* doSilence = FALSE;
  736. if (!doSilence){
  737.  
  738. if (ReadFrame(amount)){
  739. frameBoundary = AdjustFrame(buffer, amount);
  740. totalData += amount;
  741. else{ 
  742. PTRACE(1, "Finished playing the recorded file having " << totalData << " bytes");
  743. PIndirectChannel::Close();
  744. silentCount = 5;   // always do 5 frames of silence after every file
  745.   
  746. // no silence
  747. doSilence = TRUE;
  748. }
  749. }*/
  750. /*
  751. */
  752. PTRACE(1, "Terminating call ########################");
  753. conn.ClearCall(); 
  754.     return TRUE;
  755.   }
  756.   DelayFrame(len);
  757.   dataWritten = TRUE;
  758.   return WriteFrame(buf, len);
  759. }
  760. BOOL PCM_RecordFile::WriteFrame(const void * buf, PINDEX len)
  761. {
  762. /*
  763. if(playedOnce){
  764. return  fileclass_tmp->Write(buf, len);
  765. }
  766. */
  767. PTRACE(1,"In PCM_RecordFile::WriteFrame");
  768. return  fileclass->Write(buf, len); //Place where Write() is actually called..
  769. }
  770. void PCM_RecordFile::DelayFrame(PINDEX len)
  771. {
  772.   delay.Delay(len/16);
  773. }
  774. PCM_RecordFile::~PCM_RecordFile()
  775. {
  776.   PWaitAndSignal mutex(pcmrecordMutex);
  777.   if (!dataWritten) {
  778.   if(playedOnce){
  779. PTRACE(1, "Deleting fn_tmp " << fn << " as no data recorded");
  780. fileclass_tmp->Remove(fn);
  781. delete fileclass_tmp;
  782.   }
  783.     PTRACE(1, "Deleting " << fn << " as no data recorded");
  784.     fileclass->Remove(fn);
  785.   }
  786.   delete fileclass;
  787. }
  788. ///////////////////////////////////////////////////////////////
  789. // Override some of the PCM_RecordFile functions to write
  790. // G723.1 data instead of PCM data.
  791. G7231_RecordFile::G7231_RecordFile(MyH323Connection & _conn, const PFilePath & _fn, unsigned _callLimit)
  792.   : PCM_RecordFile(_conn, _fn, _callLimit)
  793. {
  794.   // If the record file is a .wav file, we need to close the file
  795.   // that PCM_RecordFile will have opened, and reopen it as a G.723.1 Wav file.
  796.   if ((_fn.Right(4)).ToLower() == ".wav") {
  797.     fileclass->Remove(_fn);
  798.     delete fileclass;
  799.     fileclass = new PWAVFile(_fn, PFile::WriteOnly,
  800.      PFile::ModeDefault,PWAVFile::G7231_WavFile);
  801.   }
  802. }
  803. BOOL G7231_RecordFile::WriteFrame(const void * buf, PINDEX /*len*/)
  804. {
  805.   int frameLen = G7231_File_Codec::GetFrameLen(*(BYTE *)buf);
  806. //  cerr << "Writing G7231 " << frameLen << endl;
  807.   return fileclass->Write(buf, frameLen);
  808. }
  809. void G7231_RecordFile::DelayFrame(PINDEX /*len*/)
  810. {
  811.   // Ignore the len parameter as that is the compressed size.
  812.   // We must delay by the actual sample time.
  813.   delay.Delay((G7231_SAMPLES_PER_BLOCK*2)/16);
  814. }
  815. ///////////////////////////////////////////////////////////////
  816. static BOOL MatchString(const PString & str1, const PString str2)
  817. {
  818.   if (str1.GetLength() != str2.GetLength())
  819.     return FALSE;
  820.   PINDEX len = str1.GetLength();
  821.   PINDEX i;
  822.   for (i = 0; i < len; i++) 
  823.     if ((str1[i] != '?') && (str2[i] != '?') && (str1[i] != str2[i]))
  824.       return FALSE;
  825.   return TRUE;
  826. }
  827. static PINDEX FindMatch(const PStringList & list, const PString & key)
  828. {
  829.   PINDEX maxKeyLen = 0;
  830.   PINDEX i;
  831.   PINDEX keyLen = key.GetLength();
  832.   PINDEX listLen = list.GetSize();
  833.   for (i = 0; i < listLen; i++)
  834.     maxKeyLen = PMAX(maxKeyLen, list[i].GetLength());
  835.   if (keyLen == 0 || maxKeyLen == 0)
  836.     return P_MAX_INDEX;
  837.   if (keyLen > maxKeyLen)
  838.     return P_MAX_INDEX;
  839.   PINDEX len = 1;
  840.   while (len <= keyLen) {
  841.     PString subStr = key.Left(len);
  842.     PINDEX matches = 0;
  843.     PINDEX lastMatch = P_MAX_INDEX;
  844.     PINDEX i;
  845.     // look for a match to the substring
  846.     for (i = 0; i < list.GetSize(); i++) {
  847.       if ((list[i].GetLength() >= keyLen) && MatchString(list[i].Left(len), subStr)) {
  848.         matches++;
  849.         lastMatch = i;
  850.       }
  851.     }
  852.     // if we got ONE match, we have a winner
  853.     if (matches == 1)
  854.       return lastMatch+1;
  855.     // if we have no matches, then there is no point continuing
  856.     if (matches == 0)
  857.       return P_MAX_INDEX;
  858.     // if we have more than one match, try the next char
  859.     len++;
  860.   }
  861.   // too many matches
  862.   return 0;
  863. }
  864. MyH323Connection::MyH323Connection(MyH323EndPoint & _ep, unsigned callReference)
  865.   : H323Connection(_ep, callReference), ep(_ep)
  866. {
  867.   basename = psprintf("%04i%02i%02i_%02i%02i%02i", callStartTime.GetYear(), callStartTime.GetMonth(),  callStartTime.GetDay(),
  868.                                                    callStartTime.GetHour(), callStartTime.GetMinute(), callStartTime.GetSecond());
  869.   recordFile = NULL;
  870.   ogmChannel = NULL;
  871.   receiveCodecName = transmitCodecName = "none";
  872. // SetMaxAudioDelayJitter(150);
  873.   cout << "Opening Test Session...." << endl;
  874.   currentMenu = 0;
  875.   digits = "";
  876.   PConfig config;
  877.   PStringList sections = config.GetSections();
  878.   PINDEX i;
  879.   for (i = 0; i < sections.GetSize(); i++) {
  880.     if (sections[i].Find(MENU_PREFIX) == 0) 
  881.       menuNames.AppendString(sections[i]);
  882.   }
  883. }
  884. MyH323Connection::~MyH323Connection()
  885. {
  886.   //cout << "Closing Test Session!!!!!!!" << endl;
  887.   //cout << "Waiting to accept incoming calls....." << endl;
  888.   //cout << "H.323 Beacon Server IP Address: " << IPAddress << endl;
  889.   //PTRACE(1,"Closing connection###########################");
  890.   PTime now;
  891.   PTimeInterval interval = now - recordStartTime;
  892.   PString addr = GetControlChannel().GetRemoteAddress();
  893.   PString codecStr = receiveCodecName + "/" + transmitCodecName;
  894.   unsigned duration = (unsigned)((interval.GetMilliSeconds()+999)/1000);
  895.   LogCall(recordFn, addr, GetRemotePartyName(), duration, codecStr, product);
  896.   if ((recordFile!= NULL) && (recordFile->WasRecordStarted()) && !ep.GetRunCmd().IsEmpty()) {
  897.     PString cmdStr = ep.GetRunCmd() &
  898.                      recordFn &
  899.                      "'" + addr + "'" &
  900.                      """ + GetRemotePartyName() + """ &
  901.                      PString(PString::Unsigned, duration) &
  902.                      """ + codecStr + """ &
  903.                      """ + product + """;
  904.     PTRACE(1, "Executing : " << cmdStr);
  905.     system((const char *)cmdStr);
  906.   } else {
  907.     PTRACE(1, "No action to perform at end of record");
  908.   }
  909.   if (ogmChannel != NULL)
  910.   {
  911. PTRACE(1, "Deleting OgmChannel ");
  912.     delete ogmChannel;
  913.   }
  914.   if (recordFile != NULL)
  915.   {
  916. PTRACE(1, "Deleting recordFile ");
  917.     delete recordFile;
  918.   }
  919.   if (ep.GetDeleteAfterRecord())   {
  920.    PTRACE(1, "Removing " << recordFn << " as requested by option");
  921. PString command = "ForceDel.exe ""+recordFn+"" > NUL";
  922. if(system(command)==0)
  923. PTRACE(1,"Removal of " << recordFn << " Successful!");
  924. else
  925. PTRACE(1,"Removal of " << recordFn << " Failure!");
  926.   }
  927.  for(int ii = 0; ii<countwavefiles+2; ii++)
  928.  {
  929.   junkwave = psprintf("junkwave%01i",ii);
  930. junkwave = tmpDir + (junkwave + ".wav");
  931. if(remove(junkwave) == -1)
  932. {
  933. PTRACE(1, "Removing JunkWave Failed**********" << junkwave);
  934. }
  935. else
  936. {
  937. PTRACE(1, "Removing JunkWave Success!!!!!!!");
  938. }
  939.  }
  940. /* PString message =" This is the Trace Route Message From the Servern";
  941. if(SendTraceRtToClient(addr,&message)==1){
  942. cout<<"traceRT sent successfully"<<endl;
  943. PTRACE(1,"traceRT sent successfullyn");
  944. }
  945. else{
  946. cout<<"traceRT send  unsuccessfull"<<endl;
  947. PTRACE(1,"traceRT send unsuccessfulln");
  948. }
  949. */
  950. cout << "Closing Test Session!!!!!!!" << endl;
  951. cout<<"Starting log_server...."<<endl;
  952. log_server();
  953. cout <<"Closing log_server...."<<endl;
  954. cout << "Waiting to accept incoming calls....." << endl;
  955. cout << "H.323 Beacon Server IP Address: " << IPAddress << endl;
  956. PTRACE(1,"Closing connection###########################");
  957. }
  958. H323Connection::AnswerCallResponse
  959.      MyH323Connection::OnAnswerCall(const PString & caller,
  960.                                     const H323SignalPDU & setupPDU,
  961.                                     H323SignalPDU & /*connectPDU*/)
  962. {
  963.   product = "Unknown";
  964.   const H225_Setup_UUIE & setup = setupPDU.m_h323_uu_pdu.m_h323_message_body;
  965.   const H225_EndpointType & epInfo = setup.m_sourceInfo;
  966.   if (epInfo.HasOptionalField(H225_EndpointType::e_vendor)) {
  967.     const H225_VendorIdentifier & vendorInfo = epInfo.m_vendor;
  968.     if (vendorInfo.HasOptionalField(H225_VendorIdentifier::e_productId))
  969.       product = vendorInfo.m_productId.AsString();
  970.     if (vendorInfo.HasOptionalField(H225_VendorIdentifier::e_versionId))
  971.       product = product + "/" + vendorInfo.m_versionId.AsString();
  972.   }
  973.   
  974.   cout << "Accepting call from " << caller << " ...n";
  975.   return AnswerCallNow;
  976. }
  977. BOOL MyH323Connection::OpenAudioChannel(BOOL isEncoding, 
  978.                                         unsigned /* bufferSize */, 
  979.                                         H323AudioCodec & codec)
  980. {
  981. if(playedFlag == 0){ 
  982.   codec.SetSilenceDetectionMode(H323AudioCodec::NoSilenceDetection);
  983.   PStringStream codecName;
  984.   codecName << codec;
  985.   PString ogm;
  986.   BOOL isPCM = FALSE;
  987.   if (codec.IsDescendant(G7231_File_Codec::Class())) {
  988.     ogm   = ep.GetG7231OGM();
  989.     isPCM = FALSE;
  990.   } else if (codec.IsDescendant(H323_GSM0610Codec::Class())) {
  991.     ogm   = ep.GetGSMOGM();
  992.     isPCM = TRUE;
  993.   } else if (codec.IsDescendant(MicrosoftGSMCodec::Class())) {
  994.     ogm   = ep.GetGSMOGM();
  995.     isPCM = TRUE;
  996.   } else if (codec.IsDescendant(H323_muLawCodec::Class())) {
  997.     ogm   = ep.GetG711OGM();
  998.     isPCM = TRUE;
  999.   } else if (codec.IsDescendant(H323_ALawCodec::Class())) {
  1000.     ogm   = ep.GetG711OGM();
  1001.     isPCM = TRUE;
  1002.   } else if (codec.IsDescendant(H323_LPC10Codec::Class())) {
  1003.     ogm   = ep.GetLPC10OGM();
  1004.     isPCM = TRUE;
  1005.   } else if (codec.IsDescendant(SpeexCodec::Class())) {
  1006.     ogm   = ep.GetSPEEXOGM();
  1007.     isPCM = TRUE;
  1008.   } else {
  1009.     cerr << "Unknown codec "" << codecName << endl;
  1010.     return FALSE;
  1011.   }
  1012.   PWaitAndSignal mutex(connMutex);
  1013.   tmpDir = ep.GetDirectory();
  1014.   tmpCallLimit = ep.GetCallLimit();
  1015.   if ((recordFile == NULL) && (isEncoding == FALSE)) {
  1016.     if (isPCM) {
  1017.       if (ep.GetRecordWav() == TRUE)
  1018.       recordFn = ep.GetDirectory() + (basename + ".wav");
  1019.       else
  1020.       recordFn = ep.GetDirectory() + (basename + ".sw");
  1021.       recordFile = new PCM_RecordFile  (*this, recordFn, ep.GetCallLimit());
  1022.     } else {
  1023.       if (ep.GetRecordWav() == TRUE)
  1024.       recordFn = ep.GetDirectory() + (basename + ".wav");
  1025.       else
  1026.       recordFn = ep.GetDirectory() + (basename + ".g723");
  1027.       recordFile = new G7231_RecordFile(*this, recordFn, ep.GetCallLimit());
  1028.     }
  1029.   }
  1030.   if ((ogmChannel == NULL) && (isEncoding == TRUE)) {
  1031.     if (isPCM)
  1032.       ogmChannel = new PCM_OGMChannel(*this);
  1033.     else
  1034.       ogmChannel = new G7231_OGMChannel(*this);
  1035.   }
  1036.   if (isEncoding) {
  1037.     if (ep.GetHangupAfterPlay())
  1038.       ogmChannel->SetPlayOnce();
  1039.     if (ogm.Find("%s"))
  1040.       ogm.Replace("%s", e164Number);
  1041.     transmitCodecName = codecName;
  1042.     if (!StartMenu(0)) {
  1043.       if (!PFile::Exists(ogm))
  1044.         cerr << "error: cannot find OGM "" << ogm << """ << endl;
  1045.       else
  1046.           ogmChannel->QueueFile(ogm); //being called!!
  1047.       if (!ep.GetNoRecordG7231())
  1048.         ogmChannel->SetRecordTrigger();
  1049.     }
  1050.     codec.AttachChannel(ogmChannel, FALSE);
  1051.   } else {
  1052.     receiveCodecName = codecName;
  1053.     codec.AttachChannel(recordFile, FALSE);
  1054.   }
  1055.   return TRUE;
  1056. }
  1057. else 
  1058. return TRUE; 
  1059.   
  1060. }
  1061. BOOL MyH323Connection::OnStartLogicalChannel(H323Channel & channel)
  1062. {
  1063.   if (!H323Connection::OnStartLogicalChannel(channel))
  1064.     return FALSE;
  1065.   cout << "Started logical channel: ";
  1066.   switch (channel.GetDirection()) {
  1067.     case H323Channel::IsTransmitter :
  1068.       cout << "Sending capability information->";
  1069.       break;
  1070.     case H323Channel::IsReceiver :
  1071.       cout << "Receiving capability information-> ";
  1072.       break;
  1073.     default :
  1074.       break;
  1075.   }
  1076.   cout << channel.GetCapability() << endl;
  1077.   return TRUE;
  1078. }
  1079. void MyH323Connection::StartRecording()
  1080. {
  1081.   recordFile->StartRecording();
  1082. }
  1083. void MyH323Connection::OnUserInputString(const PString & value)
  1084. {
  1085.   PINDEX i;
  1086.   for (i = 0; i < value.GetLength(); i++) {
  1087.     OnUserInputChar(value[i]);
  1088.   }
  1089. }
  1090. BOOL MyH323Connection::StartMenu(int menuNumber)
  1091. {
  1092.   digits = "";
  1093.   currentMenu = menuNumber;
  1094.   PString menuName = psprintf("%s%i", MENU_PREFIX, menuNumber);
  1095.   if (menuNames.GetStringsIndex(menuName) == P_MAX_INDEX) 
  1096.     return FALSE;
  1097.   PTRACE(1, "Starting menu " << menuNumber);
  1098.   PConfig menu(menuName);
  1099.   PString startCmd = menu.GetString("start");
  1100.   if (!startCmd.IsEmpty())
  1101.     ProcessMenuCmd(startCmd);
  1102.   return TRUE;
  1103. }
  1104. BOOL MyH323Connection::ProcessMenuCmd(const PString & cmdStr)
  1105. {
  1106.   PTRACE(1, "Processing menu cmd " << cmdStr);
  1107.   PStringArray tokens = cmdStr.Tokenise(" ", FALSE);
  1108.   int len = tokens.GetSize();
  1109.   if (len == 0)
  1110.     return TRUE;
  1111.   PString cmd = tokens[0];
  1112.   if ((len >= 2) && (cmd *= "play")) {
  1113.     ogmChannel->QueueFile(tokens[1]);
  1114.     if (len > 2) {
  1115.       cmd = "menu";
  1116.       tokens[1] = tokens[2];
  1117.     }
  1118.   }
  1119.   if ((len >= 2) && (cmd *= "menu")) {
  1120.     int newMenu = tokens[1].AsInteger();
  1121.     if (newMenu != currentMenu)
  1122.       StartMenu(newMenu);
  1123.   }
  1124.   else if (cmd *= "hangup")
  1125.     ogmChannel->SetHangupTrigger();
  1126.   else if (cmd *= "record")
  1127.     ogmChannel->SetRecordTrigger();
  1128.   return TRUE;
  1129. }
  1130. void MyH323Connection::OnUserInputChar(char ch)
  1131. {
  1132.   if (ch == '#') 
  1133.     digits += '$';
  1134.   else 
  1135.     digits += ch;
  1136.   PTRACE(1, "Processing digit string " << digits);
  1137.     //to change the state of receivedDTMFMessage
  1138.   receivedDTMFMessage = digits;
  1139.   if(strcmp(receivedDTMFMessage,"") != 0)
  1140.   dtmfTrigger = YES;
  1141.   
  1142.   PTRACE(1, "receivedDTMFMessage.........." << receivedDTMFMessage);
  1143.   if(strcmp(receivedDTMFMessage,"1") == 0){
  1144. recordDTMFTrigger = YES;
  1145. cout << "Start recording message received from H.323 Beacon Client..." <<endl;
  1146. PTRACE(1,"recordDTMFTrigger TRUE is----"<<recordDTMFTrigger);
  1147.   }
  1148.   else if (strcmp(receivedDTMFMessage,"2") == 0){
  1149. stopRecordDTMFTrigger = YES;
  1150. cout << "Stop recording message received from H.323 Beacon Client..." <<endl;
  1151. PTRACE(1,"stopRecordDTMFTrigger TRUE is----"<<stopRecordDTMFTrigger);
  1152.   }
  1153.   else if (strcmp(receivedDTMFMessage,"3") == 0){
  1154. startPlayingDTMFTrigger = YES;
  1155. cout << "Start playing message received from H.323 Beacon Client..." <<endl;
  1156. cout << "Playing back the recorded file to the H.323 Beacon Client..." << endl;
  1157. PTRACE(1,"startPlayingDTMFTrigger TRUE is----"<<startPlayingDTMFTrigger);
  1158.   }
  1159.   else if (strcmp(receivedDTMFMessage,"4") == 0){
  1160. cout << "Hang up message received...Hanging up...Please Wait>>>>>>>>"<<endl;
  1161. PTRACE(1,"Hang-up message from client@@@@@@@@@@@@@@@@@@");
  1162.   }
  1163.   else{
  1164. recordDTMFTrigger = NO;
  1165. stopRecordDTMFTrigger = NO;
  1166. startPlayingDTMFTrigger = NO;
  1167. PTRACE(1,"Not a valid DTMF Trigger.....");
  1168.   }
  1169.   if ((strcmp(receivedDTMFMessage,"1") == 0) && (playedFlag > 0)){
  1170. ogmChannel->FlushQueue();
  1171. recordDTMFTrigger = NO; 
  1172. stopRecordDTMFTrigger = NO;
  1173. startPlayingDTMFTrigger = NO;
  1174. playedFlag = 0;
  1175.   }
  1176.   PString menuName = psprintf("%s%i", MENU_PREFIX, currentMenu);
  1177.   if (menuNames.GetStringsIndex(menuName) == P_MAX_INDEX) {
  1178.     PTRACE(1, "Cannot find menu " << menuName);
  1179.     StartMenu(0);
  1180.     return;
  1181.   }
  1182.   PConfig menu(menuName);
  1183.   PStringList keys = menu.GetKeys();
  1184.   PINDEX keyMatch = FindMatch(keys, digits);
  1185.   // if key is still ambiguous, then keep collecting
  1186.   if (keyMatch == 0)
  1187.     return;
  1188.   PString cmd;
  1189.   if (keyMatch != P_MAX_INDEX) {
  1190.     PString key = keys[keyMatch-1];
  1191.     PTRACE(1, "Executing cmd for key " << key);
  1192.     cmd = menu.GetString(key);
  1193.   } else {
  1194.     PTRACE(1, "Cannot match cmd " << digits << " in menu " << menuName);
  1195.     cmd = menu.GetString("error", "menu 0");
  1196.   } 
  1197.   if (!cmd.IsEmpty()) {
  1198.     ProcessMenuCmd(cmd);
  1199.     digits = "";
  1200.   }
  1201.   
  1202. }
  1203. ///////////////////////////////////////////////////////////////
  1204. BOOL CheckWAVFileValid(PWAVFile *chan, int type) {
  1205.   // Check the wave file header
  1206.   if (!chan->IsValid()) {
  1207.     PTRACE(1, chan->GetName() << " wav file header invalid");
  1208.     return FALSE;
  1209.   }
  1210.   // Check the wave file format
  1211.   if ( (type == CHECK_PCM) && (chan->GetFormat() != 0x01) ){
  1212.     PTRACE(1, chan->GetName() << " is not a PCM format wav file");
  1213.     PTRACE(1, "It is format " << chan->GetFormat() );
  1214.     return FALSE;
  1215.   }
  1216.   if ( (type == CHECK_G7231) && 
  1217.        ((chan->GetFormat() != 0x42) && (chan->GetFormat() != 0x111)) ){
  1218.     PTRACE(1, chan->GetName() << " is not a G.723.1 format wav file");
  1219.     PTRACE(1, "It is format " << chan->GetFormat() );
  1220.     return FALSE;
  1221.   }
  1222.   // Check the sample rate for PCM wave files
  1223.   if ( (type == CHECK_PCM) &&
  1224.        ( (chan->GetSampleRate() != 8000)
  1225.        ||(chan->GetChannels() != 1)
  1226.        ||(chan->GetSampleSize() != 16) )
  1227.      ) {
  1228.     PTRACE(1, chan->GetName() << " is not a 16 Bit, Mono, 8000 Hz (8Khz) PCM wav file");
  1229.     PTRACE(1, "It is " << chan->GetSampleSize() << " bits, "
  1230.                        << (chan->GetChannels()==1 ? "mono " : "stereo ")
  1231.                        << chan->GetSampleRate() << " Hz");
  1232.     return FALSE;
  1233.   }
  1234.   return TRUE;
  1235. }
  1236. ///////////////////////////////////////////////////////////////
  1237. PCM_OGMChannel::PCM_OGMChannel(MyH323Connection & _conn)
  1238.   : conn(_conn)
  1239. {
  1240.   silentCount = 20;         // wait 20 frames before playing the OGM
  1241.   recordTrigger = FALSE;
  1242.   hangupTrigger = FALSE;
  1243.   closed        = FALSE;
  1244.   playOnce      = FALSE;
  1245.   frameLen = frameOffs = 0;
  1246. }
  1247. void PCM_OGMChannel::PlayFile(PFile * chan)
  1248.   PWaitAndSignal mutex(chanMutex);
  1249. //  if (IsOpen())
  1250. //    Close();
  1251.   if (!chan->Open(PFile::ReadOnly)) {
  1252.     PTRACE(1, "Cannot open file "" << chan->GetName() << """);
  1253.     return;
  1254.   }
  1255.   PTRACE(1, "Playing file "" << chan->GetName() << """);
  1256.   totalData = 0;
  1257.   SetReadChannel(chan, TRUE);
  1258. }
  1259. BOOL PCM_OGMChannel::IsWAVFileValid(PWAVFile *chan) {
  1260.   // Check that this is a PCM wave file
  1261.   return CheckWAVFileValid(chan, CHECK_PCM);
  1262. }
  1263. BOOL PCM_OGMChannel::Read(void * buffer, PINDEX amount)
  1264. {
  1265.   PWaitAndSignal mutex(chanMutex);
  1266.   // if the channel is closed, then return error
  1267.   if (closed)
  1268.     return FALSE;
  1269.   // Create the frame buffer using the amount of bytes the codec wants to
  1270.   // read. Different codecs use different read sizes.
  1271.   frameBuffer.SetMinSize(1024);//amount);
  1272.   // assume we are returning silence
  1273.   BOOL doSilence = TRUE;
  1274.   BOOL frameBoundary = FALSE;
  1275.  if (strcmp(startPlayingDTMFTrigger,"1") != 0 && (playedOnce == FALSE)){
  1276.  // if still outputting a frame from last time, then keep doing it
  1277.   if (frameOffs < frameLen) {
  1278.     frameBoundary = AdjustFrame(buffer, amount);
  1279.     doSilence = FALSE;
  1280.   else {
  1281.     // if we are returning silence frames, then 
  1282.     if (silentCount > 0) 
  1283.       silentCount--;
  1284.     // if a channel is already open, don't do silence
  1285.     else if (GetBaseReadChannel() != NULL)
  1286.       doSilence = FALSE;
  1287.     // If not in silence and no existing channel, open a new file.
  1288.     else {
  1289. if (strcmp(receivedDTMFMessage,"1") == 0){
  1290.       PString * str = playQueue.Dequeue();
  1291.       if (str != NULL) {
  1292.         // check the file extension and open a .wav or a raw (.sw or .g723) file
  1293.         if (((*str).Right(4)).ToLower() == ".wav") {
  1294.           PWAVFile *chan;
  1295.           chan = new PWAVFile(*str, PFile::ReadOnly);
  1296.           if (!chan->IsOpen()) {
  1297.             PTRACE(1, "Cannot open file "" << chan->GetName() << """);
  1298.             delete chan;
  1299.           } else {
  1300.           if (!IsWAVFileValid(chan) ){
  1301.               PTRACE(1, chan->GetName() << " is not a valid wav file");
  1302.               delete chan;
  1303.               cerr << "wave file is invalid" << endl;
  1304.             } else {
  1305.               PTRACE(1, "Playing file "" << chan->GetName() << """);
  1306.               totalData = 0;
  1307.               SetReadChannel(chan, TRUE);
  1308.               doSilence = FALSE;
  1309.             }
  1310.   }
  1311.         } else { // raw file (eg .sw)
  1312.           PFile *chan;
  1313.           chan = new PFile(*str);
  1314.           if (!chan->Open(PFile::ReadOnly)) {
  1315.             PTRACE(1, "Cannot open file "" << chan->GetName() << """);
  1316.             delete chan;
  1317.           } else {
  1318.              cout << "Playing message file-> "" << chan->GetName() << """ <<endl;
  1319. PTRACE(1, "Playing file "" << chan->GetName() << """); //actually playing here!
  1320. fn_original = chan->GetName();
  1321. totalData = 0;
  1322. SetReadChannel(chan, TRUE);
  1323. doSilence = FALSE;
  1324. playedFlag++; 
  1325. }
  1326.         delete str;
  1327.   }
  1328.       }
  1329.     }
  1330.    /*
  1331. if (strcmp(receivedDTMFMessage,"1") == 0){
  1332. doSilence = FALSE;
  1333. }
  1334. */
  1335.     // if not doing silence, try and read from the file
  1336.     if (!doSilence) {
  1337.   
  1338.          if (ReadFrame(amount)){
  1339. PTRACE(1,"Amount origin file " << amount);
  1340. frameBoundary = AdjustFrame(buffer, amount);
  1341. PTRACE(1,"************** Original Frame Boundary " << frameBoundary);
  1342. totalData += amount;
  1343.   } 
  1344.  else {
  1345.   if (strcmp(receivedDTMFMessage,"1") == 0){ 
  1346. cout << "Finished playing message file........." <<endl;
  1347.         PTRACE(1, "Finished playing " << totalData << " bytes");
  1348.         //closed = TRUE;
  1349.   
  1350.         PIndirectChannel::Close();
  1351.         silentCount = 5;   // always do 5 frames of silence after every file
  1352.   
  1353.         // hangup if required
  1354.         if (hangupTrigger || playOnce) 
  1355.           conn.ClearCall();
  1356.   
  1357.         // trigger record if required
  1358.         else if (recordTrigger) {
  1359.           if ((playQueue.GetSize() == 0) && (GetBaseReadChannel() == NULL))
  1360. cout << "Recording Started%%%%%%%%%" << endl;
  1361. PTRACE(1,"Starting to Record!!!!!!!!!!!!");
  1362.             conn.StartRecording();
  1363. }
  1364.       }
  1365.    
  1366.         // no silence
  1367.         doSilence = TRUE;
  1368.       }
  1369. }
  1370. }
  1371.     }
  1372.     //if (strcmp(startPlayingDTMFTrigger,"1") == 0)
  1373.   else {
  1374. if (strcmp(fn_tmp,"") != 0){
  1375. PWAVFile *playSaved;
  1376. playSaved = new PWAVFile(fn_tmp, PFile::ReadOnly);
  1377. PTRACE(1,"fn_tmp = " << fn_tmp);
  1378. if (!playSaved->IsOpen()){
  1379. PTRACE(1, "Cannot open file "" << playSaved->GetName() << """);
  1380. delete playSaved;
  1381. else{
  1382. PTRACE(1, "Playing file "" << playSaved->GetName() << """);
  1383. SetReadChannel(playSaved, TRUE);
  1384. doSilence = FALSE;
  1385. }
  1386. if (!doSilence){
  1387. if (ReadFrame(amount)){
  1388. PTRACE(1,"buffer = " << buffer << "   amount = " << amount);
  1389. frameBoundary = AdjustFrame(buffer, amount);
  1390. PTRACE(1, "*******************Recorded File " << frameBoundary);
  1391. totalData += amount;
  1392. else{
  1393. cout << "Finished playing back...." << endl;
  1394. cout << "Test Session still active......." << endl;
  1395. PTRACE(1, "Finished playing " << totalData << " bytes");
  1396. // junkwave = psprintf("junkwave%01i",countwavefiles);
  1397.   
  1398. //fn = tmpDir + (junkwave + ".wav");
  1399. // junkwave = tmpDir + (junkwave + ".wav");
  1400. //junkwave = fn;
  1401. //_fn = fn;
  1402. // fn = junkwave;
  1403. // _fn = fn;
  1404. // PTRACE(1,"*TEST* fn = " << junkwave);
  1405.  
  1406. // if ((junkwave.Right(4)).ToLower() == ".wav"){
  1407. //PTRACE(1,"Creating the Junk File****************!!!");
  1408. //fileclass_tmp = new PWAVFile(junkwave, PFile::WriteOnly,
  1409. //PFile::ModeDefault,PWAVFile::PCM_WavFile);
  1410. //}
  1411. //else
  1412. // fileclass_tmp = new PFile(junkwave, PFile::WriteOnly);
  1413. //recordFilejunkwave = new PCM_RecordFile (*((MyH323Connection *)tmpConn),junkwave,tmpCallLimit);
  1414. //closed = TRUE;
  1415. // Remove Temporary File
  1416. // if (strcmp(fn_tmp,fn_original) != 0){
  1417. //PTRACE(1,"Removing fn_tmp file " << fn_tmp);
  1418. //PFile::Remove(fn_tmp);
  1419. //if (remove(fn_tmp) == -1)
  1420. /*
  1421. if (PFile::Remove(fn_tmp,TRUE)){
  1422. PTRACE(1,"Removing Complete");
  1423. }
  1424. else{
  1425. PTRACE(1,"Removing NOT Complete");
  1426. }
  1427. */
  1428. // }
  1429.   
  1430. PIndirectChannel::Close();
  1431. silentCount = 5;   // always do 5 frames of silence after every file
  1432.   
  1433. // no silence
  1434. doSilence = TRUE;
  1435. PTRACE(1,"WM_G");
  1436. if ((strcmp(recordDTMFTrigger,"1") == 0) && playedOnce == TRUE){
  1437. PTRACE(1,"Starting to Record  Second Time!!!!!!!!!!!!^^^^^^^");
  1438. if (recordTrigger){
  1439. if ((playQueue.GetSize() == 0) && (GetBaseReadChannel() == NULL)){
  1440. recordStartedNext = FALSE;
  1441. playedOnce = TRUE;
  1442. //fileclass_tmp->StartRecording();
  1443. //conn.StartRecording();
  1444. recordFilejunkwave->StartRecording();
  1445. // PCM_RecordFile::Write(buffer,amount);
  1446. countwavefiles++;
  1447. //recordFile->StartRecording();
  1448. }
  1449. }
  1450. doSilence = TRUE;
  1451. if (doSilence){
  1452. CreateSilenceFrame(amount);
  1453. frameBoundary = AdjustFrame(buffer, amount);
  1454. }
  1455.                     // delay to synchronise to frame boundary
  1456.   if (frameBoundary){
  1457. Synchronise(amount);
  1458. doSilence = TRUE;
  1459. startPlayingDTMFTrigger = NO;
  1460.   }
  1461.   return TRUE;
  1462. }
  1463.   
  1464. //to keep the record, stop, play cycle going without disconnecting..
  1465. dtmfTrigger = NO;
  1466. recordDTMFTrigger = NO;
  1467. stopRecordDTMFTrigger = NO;
  1468. startPlayingDTMFTrigger = NO;
  1469. playedFlag = 0;
  1470. receivedDTMFMessage = "";
  1471. playedOnce = TRUE;
  1472. PTRACE(1, "WAITING for recordDTMFTrigger" << recordDTMFTrigger);
  1473. /*
  1474. if ((strcmp(receivedDTMFMessage,"4") == 0)){
  1475. PTRACE(1,"Clearing Call in Read function.........@@@@@@@@@@@@@@");
  1476. H323Channel *tmpChan = tmpConn->FindChannel(RTP_Session::DefaultAudioSessionID,FALSE);
  1477. dtmfTrigger = NO;
  1478. recordDTMFTrigger = NO;
  1479. stopRecordDTMFTrigger = NO;
  1480. startPlayingDTMFTrigger = NO;
  1481. playedFlag = 0;
  1482. receivedDTMFMessage = "";
  1483. playedOnce = FALSE;
  1484. return FALSE;
  1485. }
  1486. */
  1487. // This code is for Thread NOT Terminating
  1488. for(;;){
  1489. // This code is for Thread NOT Terminating
  1490. doSilence = TRUE;
  1491. if (doSilence) {
  1492. CreateSilenceFrame(amount);
  1493. frameBoundary = AdjustFrame(buffer, amount);
  1494. }
  1495. // delay to synchronise to frame boundary
  1496. if (frameBoundary){
  1497. Synchronise(amount);
  1498. doSilence = TRUE;
  1499. startPlayingDTMFTrigger = NO;
  1500. }
  1501. if ((strcmp(recordDTMFTrigger,"1") == 0) && playedOnce == TRUE){
  1502. PTRACE(1,"Starting to play message for second time@@@@@@@@@@@@@@");
  1503. fn_tmp = fn_original;  // To make play the original message starting from seconnd record seq
  1504. return TRUE;
  1505. }
  1506. if ((strcmp(stopRecordDTMFTrigger,"1") == 0) && playedOnce == TRUE){
  1507. PTRACE(1,"This is Second STOP");
  1508. fn_tmp = "";
  1509. return TRUE;
  1510. }
  1511. if ((strcmp(startPlayingDTMFTrigger,"1") == 0) && playedOnce == TRUE){
  1512. PTRACE(1,"This is Second time Playing");
  1513. junkwave = psprintf("junkwave%01i",countwavefiles);
  1514. //fn = tmpDir + (junkwave + ".wav");
  1515. junkwave = tmpDir + (junkwave + ".wav");
  1516. //junkwave = fn;
  1517. //_fn = fn;
  1518. PTRACE(1,"*TEST* fn = " << junkwave);
  1519.  
  1520. if ((junkwave.Right(4)).ToLower() == ".wav"){
  1521. PTRACE(1,"Creating the Junk File****************!!!");
  1522. fileclass_tmp = new PWAVFile(junkwave, PFile::WriteOnly,
  1523. PFile::ModeDefault,PWAVFile::PCM_WavFile);
  1524. }
  1525. else
  1526. fileclass_tmp = new PFile(junkwave, PFile::WriteOnly);
  1527. fn = junkwave;
  1528. _fn = fn;
  1529. recordFilejunkwave = new PCM_RecordFile (*((MyH323Connection *)tmpConn),junkwave,tmpCallLimit);
  1530. return TRUE;
  1531. }
  1532. if ((strcmp(receivedDTMFMessage,"4") == 0) && playedOnce == TRUE){
  1533. PTRACE(1,"Clearing call in Read function.........@@@@@@@@@@@@@@");
  1534. //H323Channel *tmpChan = tmpConn->FindChannel(RTP_Session::DefaultAudioSessionID,FALSE);
  1535. dtmfTrigger = NO;
  1536. recordDTMFTrigger = NO;
  1537. stopRecordDTMFTrigger = NO;
  1538. startPlayingDTMFTrigger = NO;
  1539. playedFlag = 0;
  1540. receivedDTMFMessage = "";
  1541. playedOnce = FALSE;
  1542. fn = "";
  1543. fn_tmp = "";
  1544. /*
  1545. switch (tmpChan->GetDirection()) {
  1546. case H323Channel::IsTransmitter :
  1547. //cout << "sending ";
  1548. //PTRACE(1,"In Hangup, Channel is Trasnmitting");
  1549. break;
  1550. case H323Channel::IsReceiver :
  1551. //cout << "receiving ";
  1552. //PTRACE(1,"In Hangup, Channel is Receiving");
  1553. break;
  1554. default :
  1555. break;
  1556. }
  1557. */
  1558. /*
  1559. conn.CloseLogicalChannel(RTP_Session::DefaultAudioSessionID,FALSE);
  1560. //H323ChannelNumber num = tmpChan->GetSessionID();
  1561. conn.CloseLogicalChannel(tmpChan->GetSessionID(),FALSE);
  1562. conn.ClearCall();
  1563. PIndirectChannel::Close();
  1564. conn.~MyH323Connection();
  1565. conn.CleanUpOnCallEnd(); 
  1566. closed = TRUE; */
  1567. //delete tmpChan;
  1568. //delete tmpConn;
  1569. return FALSE;
  1570. }
  1571. //return TRUE;
  1572. }
  1573. PTRACE(1, "FINISHED WAITINGGGGGGGGGGGGGGGGGGGGGGGGGGGG recordDTMFTrigger" << recordDTMFTrigger);
  1574. //conn.ClearCall();
  1575. return TRUE;
  1576. }
  1577. }
  1578. }
  1579.   }
  1580.   // start silence frame if required
  1581.   if (doSilence) {
  1582.     CreateSilenceFrame(amount);
  1583.     frameBoundary = AdjustFrame(buffer, amount);
  1584.   }
  1585.   // delay to synchronise to frame boundary
  1586.   if (frameBoundary)
  1587. Synchronise(amount);
  1588. return TRUE;
  1589. }
  1590. BOOL PCM_OGMChannel::Close()
  1591. {
  1592.   PWaitAndSignal mutex(chanMutex);
  1593.   closed = TRUE;
  1594.   PIndirectChannel::Close();
  1595.   return TRUE;
  1596. }
  1597. void PCM_OGMChannel::SetRecordTrigger()
  1598. {
  1599.   PWaitAndSignal mutex(chanMutex);
  1600.   recordTrigger = TRUE;
  1601.   if ((playQueue.GetSize() == 0) && (GetBaseReadChannel() == NULL))
  1602.     conn.StartRecording();
  1603. }
  1604. void PCM_OGMChannel::SetHangupTrigger()
  1605. {
  1606.   PWaitAndSignal mutex(chanMutex);
  1607.   hangupTrigger = TRUE;
  1608.   if (GetBaseReadChannel() == NULL)
  1609.     conn.ClearCall();
  1610. }
  1611. void PCM_OGMChannel::QueueFile(const PString & fn)
  1612. {
  1613.   PWaitAndSignal mutex(chanMutex);
  1614.   PTRACE(1, "Enqueueing file " << fn << " for playing");
  1615.   fnAgain = fn;
  1616.   PTRACE(1, "Value of fnAgain.......######" <<fnAgain);
  1617.   playQueue.Enqueue(new PString(fn));
  1618. }
  1619. void PCM_OGMChannel::FlushQueue()
  1620. {
  1621.   PWaitAndSignal mutex(chanMutex);
  1622.   if (GetBaseReadChannel() != NULL) {
  1623.     PIndirectChannel::Close();
  1624.     if (hangupTrigger) 
  1625.       conn.ClearCall();
  1626.     else if (recordTrigger) 
  1627.       conn.StartRecording();
  1628.   }
  1629.   PString * str;
  1630.   while ((str = playQueue.Dequeue()) != NULL)
  1631.     delete str;
  1632. }
  1633. BOOL PCM_OGMChannel::AdjustFrame(void * buffer, PINDEX amount)
  1634. {
  1635.   if ((frameOffs + amount) > frameLen) {
  1636.     cerr << "Reading past end of frame:offs=" << frameOffs << ",amt=" << amount << ",len=" << frameLen << endl;
  1637.     return TRUE;
  1638.   }
  1639.   //PAssert((frameOffs + amount) <= frameLen, "Reading past end of frame");
  1640.   memcpy(buffer, frameBuffer.GetPointer()+frameOffs, amount);
  1641.   frameOffs += amount;
  1642.   lastReadCount = amount;
  1643.   return frameOffs == frameLen;
  1644. }
  1645. void PCM_OGMChannel::Synchronise(PINDEX amount)
  1646. {
  1647.   ogm_delay.Delay(amount / 16);
  1648. }
  1649. BOOL PCM_OGMChannel::ReadFrame(PINDEX amount)
  1650. {
  1651.   BOOL result;
  1652.   frameOffs = 0;
  1653.   frameLen  = amount;
  1654.   result = PIndirectChannel::Read(frameBuffer.GetPointer(), frameLen); //This is the Read method being actually called..
  1655.   PTRACE(1, "result in ReadFrame is " << result);
  1656.   // if we did not read a full frame of audio, fill the end of the
  1657.   // frame with zeros.
  1658.   PINDEX count = GetLastReadCount();
  1659.   if (count < frameLen)
  1660.   {
  1661.     memset(frameBuffer.GetPointer()+count, 0, frameLen-count);
  1662. PTRACE(1,"memset occured in ReadFrame");
  1663.   }
  1664.   return result;
  1665. }
  1666. void PCM_OGMChannel::CreateSilenceFrame(PINDEX amount)
  1667. {
  1668.   frameOffs = 0;
  1669.   frameLen  = amount;
  1670.   memset(frameBuffer.GetPointer(), 0, frameLen);
  1671. }
  1672.  
  1673. ///////////////////////////////////////////////////////////////
  1674. G7231_OGMChannel::G7231_OGMChannel(MyH323Connection & conn)
  1675.   : PCM_OGMChannel(conn)
  1676. {
  1677. }
  1678. void G7231_OGMChannel::Synchronise(PINDEX /*amount*/)
  1679. {
  1680.   ogm_delay.Delay(30);
  1681. }
  1682. BOOL G7231_OGMChannel::ReadFrame(PINDEX /*amount*/)
  1683. {
  1684.   if (!PIndirectChannel::Read(frameBuffer.GetPointer(), 1))
  1685.     return FALSE;
  1686.   frameOffs = 0;
  1687.   frameLen = G7231_File_Codec::GetFrameLen(frameBuffer[0]);
  1688.   return PIndirectChannel::Read(frameBuffer.GetPointer()+1, frameLen-1);
  1689. }
  1690. void G7231_OGMChannel::CreateSilenceFrame(PINDEX /*amount*/)
  1691. {
  1692.   frameOffs = 0;
  1693.   frameLen  = 4;
  1694.   frameBuffer[0] = 2;
  1695.   memset(frameBuffer.GetPointer()+1, 0, 3);
  1696. }
  1697. BOOL G7231_OGMChannel::IsWAVFileValid(PWAVFile *chan) {
  1698.   // Check that this is a G.723.1 wave file
  1699.   return CheckWAVFileValid(chan, CHECK_G7231);
  1700. }
  1701. ///////////////////////////////////////////////////////////////
  1702. PString H323BeaconServer::getLocalhostIPAddress()
  1703. {
  1704.   PString hostname ; // stores local host name
  1705.     
  1706.   //Get local host IP address
  1707.   hostent FAR *lpHostEnt = gethostbyname ( hostname ) ;
  1708.   if ( lpHostEnt == NULL )
  1709. cout << "IPAddress not available";
  1710.   LPSTR lpAddr = lpHostEnt -> h_addr_list[0] ;
  1711.   if ( lpAddr )
  1712.   { 
  1713. in_addr inAddr ;
  1714. memmove ( &inAddr, lpAddr, 4 ) ;
  1715. IPAddress = inet_ntoa ( inAddr ) ;
  1716. if ( IPAddress.IsEmpty( ) ) 
  1717. cout << "IPAddress not available"; 
  1718.   }
  1719.   return IPAddress;
  1720. }
  1721. /*
  1722. int MyH323Connection::SendTraceRtToClient(PString clientIP, PString *message)
  1723. {
  1724. // WORD nport=5050;
  1725. int rt=0;
  1726. // sock=new PSocket();
  1727. //PChannel chan;
  1728. //PIPXSocket  sock(nport);
  1729. //sock.port(nport);
  1730. char  temp[100];
  1731. char *ip;
  1732. strcpy(temp,clientIP);
  1733. // cout<< "TEMP: "<<temp<<"n";
  1734. ip=strtok(temp,"$");
  1735. ip=strtok(NULL,":");
  1736. char msg[2048]= "";
  1737. PFile fp("ft_result",PFile::ReadOnly,PFile::ModeDefault);
  1738. fp.read(msg,2048);
  1739. SOCKET writeSocket;
  1740.     writeSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  1741. sockaddr_in service;
  1742.     service.sin_family = AF_INET;
  1743.     service.sin_addr.s_addr = inet_addr(ip);
  1744.     service.sin_port = htons(5051);
  1745. cout <<"Trying to Send the traceRT to client "<< ip<<"n";
  1746. PTRACE(1,"Trying to Send the traceRT to clientn");
  1747. PTRACE(1,ip);
  1748. //char msg[1024] = "MSG FROM SERVER: TRACERT: 1 2 3 4 5 6 7 8 9 10n";
  1749. if (connect (writeSocket, (SOCKADDR*) &service, sizeof(service)) == SOCKET_ERROR) {
  1750. PTRACE(1,"Connection  to client,failed for  traceRT filen");
  1751. }
  1752. else {
  1753. PTRACE(1,"Connection Established to client, sending traceRT filen");
  1754. if(send(writeSocket,msg,sizeof(msg),0)>0) {
  1755. rt=1;
  1756. PTRACE(1,"TRACERT: Successfully writing to client....n");
  1757. }else {
  1758. PTRACE(1,"TRACERT: Send failed....n");
  1759. }
  1760. }
  1761. closesocket (writeSocket);
  1762. return rt;
  1763. }
  1764. */
  1765. int MyH323Connection::log_server(){
  1766.  
  1767. //----------------------
  1768.   // Initialize Winsock
  1769.   WSADATA wsaData;
  1770.   int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
  1771.   if (iResult != NO_ERROR)
  1772.     printf("Error at WSAStartup()n");
  1773.   //----------------------
  1774. SOCKET ListenSocket;
  1775.     ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  1776.     if (ListenSocket == SOCKET_ERROR) {
  1777.     printf("Error at socket(): %ldn", WSAGetLastError());
  1778.     printf("Error at socket()n");
  1779.     WSACleanup();
  1780.     return 1;
  1781.   }
  1782.   //----------------------
  1783.   //----------------------
  1784.   // The sockaddr_in structure specifies the address family,
  1785.   // IP address, and port for the socket that is being bound.
  1786.   sockaddr_in service;
  1787.   service.sin_family = AF_INET;
  1788.   service.sin_addr.s_addr = inet_addr("0.0.0.0");
  1789.   service.sin_port = htons(SRVPORT);
  1790.   
  1791.   //create a structure for the client address
  1792.   //sockaddr_in clientaddr;
  1793.   //unsigned int clntLen;
  1794.   //Set the socket options to reuse the socket address to avoid bind failures
  1795.   //int opt=1;
  1796.   char optval[5] = "TRUE"; 
  1797.   //unsigned long optval =1;
  1798.   if(setsockopt(ListenSocket, SOL_SOCKET, SO_REUSEADDR, optval, sizeof(optval))==SOCKET_ERROR){
  1799. cout<<"Error setting the reuse address optionn";
  1800.   }
  1801.   
  1802.   if (bind( ListenSocket,
  1803.     (struct sockaddr *) &service,
  1804.     sizeof(service)) != 0) {
  1805.     printf("bind() failed.n");
  1806.     close(ListenSocket);
  1807.     return 1;
  1808.   } 
  1809.  //----------------------
  1810.   // Listen for incoming connection requests
  1811.   // on the created socket
  1812.   if (listen( ListenSocket, 1 ) != 0)
  1813.     printf("Error listening on socket.n");
  1814.   //----------------------
  1815.   // Create a SOCKET for accepting incoming requests.
  1816.   SOCKET AcceptSocket;
  1817.   //int AcceptSocket;
  1818.   printf("Waiting for client to connect...nWill timeout in 15 secsn");
  1819.   //printf("before forn");
  1820. //        int nLen = sizeof(struct sockaddr);
  1821.         char buf[1024];
  1822.         int line = 1;
  1823.         FILE *log;
  1824. //printf("Making socket non-blockingn");
  1825.         //----------------------
  1826.   // Accept the connection.
  1827. //fcntl(ListenSocket, F_SETFL, O_NONBLOCK);
  1828. long par=1;
  1829. if(ioctlsocket (ListenSocket, FIONBIO,(unsigned long *)&par)==SOCKET_ERROR){
  1830. cout<<"Cant set socket to non-blocking moden";
  1831. }
  1832.   //while(1) {
  1833. //printf("before forn");
  1834.         AcceptSocket = INVALID_SOCKET;
  1835.         int i=0;
  1836. //AcceptSocket = accept( ListenSocket, NULL, NULL );
  1837. //printf("before forn");
  1838.         for (i=0;i<15;i++){
  1839. //printf("just inside forn");
  1840. if( AcceptSocket == INVALID_SOCKET ) {
  1841.     if (i==14) {
  1842. printf("Client didnt connect Timed outn");
  1843. shutdown (AcceptSocket,2);
  1844. shutdown (ListenSocket,2);
  1845. close (AcceptSocket);
  1846. close (ListenSocket);
  1847. return 0;
  1848. }
  1849. //printf("Sleeping for a second: %dn",i);
  1850.             Sleep(1000);
  1851. AcceptSocket = accept( ListenSocket, NULL, NULL );
  1852. }
  1853.             else {
  1854. //printf("I am in elsen");
  1855. //AcceptSocket = accept( ListenSocket, (struct sockaddr *) &clientaddr, &clntLen );
  1856.                 //AcceptSocket = accept( ListenSocket, NULL, NULL );
  1857. break;
  1858.             }
  1859.         }
  1860. printf("nClient connected...");
  1861.         if(!(log=fopen(LOG_H323,"r")))
  1862.         {
  1863.                 printf("nFailed on opening LOG_H323");
  1864.         }
  1865.         else
  1866.         {
  1867.                 printf("nSending log file...");
  1868.                 while(1)
  1869.                 {
  1870.                         fgets(buf,line,log);
  1871.                         send( AcceptSocket, buf, strlen(buf), 0 );
  1872.                         line++;
  1873.                         if (feof(log)) break;
  1874.                 }
  1875.                 printf("nThe file log was sent!");
  1876.         fclose(log);
  1877.         }
  1878. shutdown (AcceptSocket,2);
  1879. shutdown (ListenSocket,2);
  1880.         close (AcceptSocket);
  1881. close (ListenSocket);
  1882.   //}
  1883.   WSACleanup();
  1884.   return 1;
  1885. }