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

模拟服务器

开发平台:

Visual C++

  1. /*
  2.  * main.h
  3.  *
  4.  * PWLib application header file for Voxilla
  5.  *
  6.  * A H.323 Beacon Server application.
  7.  *
  8.  * Copyright (c) 1993-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 Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions of this code were written with the assisance of funding from
  25.  * Vovida Networks, Inc. http://www.vovida.com.
  26.  *
  27.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  28.  * All Rights Reserved.
  29.  *
  30.  * Portions are Copyright (C) 2002 ITEC-Ohio.
  31.  */
  32. #ifndef _Voxilla_MAIN_H
  33. #define _Voxilla_MAIN_H
  34. #include <h323.h>
  35. #include <h323pdu.h>
  36. #include <h245.h>
  37. #include <gsmcodec.h>
  38. #include <lid.h>
  39. #include <ptclib/pwavfile.h>
  40. #include <ptclib/delaychan.h>
  41. class H323BeaconServer : public PProcess
  42. {
  43.   PCLASSINFO(H323BeaconServer, PProcess)
  44.   public:
  45. PString getLocalhostIPAddress();
  46.     H323BeaconServer();
  47.     ~H323BeaconServer();
  48.     void Main();
  49.     void RecordFile(PArgList & args);
  50.     void PlayFile(PArgList & args);
  51.   protected:
  52.     long GetCodec(const PString & codecname);
  53.     OpalLineInterfaceDevice * GetDevice(const PString & device);
  54. };
  55. class MyH323EndPoint : public H323EndPoint
  56. {
  57.   PCLASSINFO(MyH323EndPoint, H323EndPoint);
  58.   public:
  59.     MyH323EndPoint(unsigned callLimit,
  60.                    const PString & runCmd,
  61.                    const PDirectory & dir,
  62.                    int flags);
  63.     // overrides from H323EndPoint
  64.     virtual H323Connection * CreateConnection(unsigned callReference);
  65.     BOOL OnIncomingCall(H323Connection &, const H323SignalPDU &, H323SignalPDU &);
  66.     //void OnConnectionEstablished( H323Connection & , const PString &  );
  67.     // new functions
  68.     BOOL Initialise(PConfigArgs & args);
  69.     PString    GetGSMOGM() const            { return gsmOgm; }
  70.     void       SetGSMOGM(const PString & s) { gsmOgm = s; }
  71.     PString    GetG711OGM() const            { return g711Ogm; }
  72.     void       SetG711OGM(const PString & s) { g711Ogm = s; }
  73.     PString    GetLPC10OGM() const            { return lpc10Ogm; }
  74.     void       SetLPC10OGM(const PString & s) { lpc10Ogm = s; }
  75.     PString    GetSPEEXOGM() const            { return speexOgm; }
  76.     void       SetSPEEXOGM(const PString & s) { speexOgm = s; }
  77.     PString    GetG7231OGM() const            { return g7231Ogm; }
  78.     void       SetG7231OGM(const PString & s) { g7231Ogm = s; }
  79.     unsigned   GetCallLimit() const { return callLimit; }
  80.     PString    GetRunCmd() const    { return runCmd; }
  81.     PDirectory GetDirectory() const { return dir; }
  82.     void       SetRecordWav(const BOOL rec){ recordWav = rec; }
  83.     BOOL       GetRecordWav() const        { return recordWav; }
  84.     enum {
  85.       DeleteAfterRecord = 0x01,
  86.       NoRecordG7231     = 0x02,
  87.       HangupAfterPlay   = 0x04
  88.     };
  89.     BOOL GetDeleteAfterRecord() const   { return flags & DeleteAfterRecord; }
  90.     BOOL GetNoRecordG7231() const       { return flags & NoRecordG7231; }
  91.     BOOL GetHangupAfterPlay() const     { return flags & HangupAfterPlay; }
  92.   protected:
  93.     unsigned callLimit;
  94.     PString pcmOgm, g711Ogm, gsmOgm, lpc10Ogm, g7231Ogm, runCmd;
  95.     PString speexOgm;
  96.     PDirectory dir;
  97.     int flags;
  98.     BOOL recordWav;
  99. };
  100. class PCM_RecordFile;
  101. class MyH323Connection;
  102. PQUEUE(PStringQueue, PString);
  103. class PCM_OGMChannel : public PIndirectChannel
  104. {
  105.   PCLASSINFO(PCM_OGMChannel, PIndirectChannel);
  106.   public:
  107.     PCM_OGMChannel(MyH323Connection & conn);
  108.     BOOL Read(void * buffer, PINDEX amount);
  109.     void PlayFile(PFile * chan);
  110.     BOOL Close();
  111.     void QueueFile(const PString & cmd);
  112.     void FlushQueue();
  113.     void SetRecordTrigger();
  114.     void SetHangupTrigger();
  115.     void SetPlayOnce() { playOnce = TRUE; }
  116.   protected:
  117.     virtual BOOL ReadFrame(PINDEX amount);
  118.     virtual void CreateSilenceFrame(PINDEX amount);
  119.     virtual void Synchronise(PINDEX amount);
  120.     virtual BOOL IsWAVFileValid(PWAVFile *chan);
  121.     BOOL AdjustFrame(void * buffer, PINDEX amount);
  122.     PStringQueue playQueue;
  123.     MyH323Connection & conn;
  124.     PMutex chanMutex;
  125.     int silentCount;
  126.     int totalData;
  127.     BOOL recordTrigger, hangupTrigger;
  128.     BOOL closed;
  129.     BOOL playOnce;
  130.     PAdaptiveDelay ogm_delay;
  131.     PBYTEArray frameBuffer;
  132.     PINDEX frameLen, frameOffs;
  133. };
  134. class G7231_OGMChannel : public PCM_OGMChannel
  135. {
  136.   PCLASSINFO(G7231_OGMChannel, PCM_OGMChannel);
  137.   public:
  138.     G7231_OGMChannel(MyH323Connection & conn);
  139.   protected:
  140.     BOOL ReadFrame(PINDEX amount);
  141.     void CreateSilenceFrame(PINDEX amount);
  142.     void Synchronise(PINDEX amount);
  143.     BOOL IsWAVFileValid(PWAVFile *chan);
  144. };
  145. class MyH323Connection : public H323Connection
  146. {
  147.   PCLASSINFO(MyH323Connection, H323Connection);
  148.   public:
  149.     MyH323Connection(MyH323EndPoint &, unsigned);
  150.     ~MyH323Connection();
  151.     // overrides from H323Connection
  152.     BOOL OpenAudioChannel(BOOL, unsigned, H323AudioCodec & codec);
  153.     AnswerCallResponse OnAnswerCall(const PString &, const H323SignalPDU &, H323SignalPDU &);
  154.     void OnUserInputString(const PString & value);
  155. BOOL OnStartLogicalChannel(H323Channel & channel);
  156. //int SendTraceRtToClient(PString clientIP, PString *message);
  157.     // new functions
  158.     void StartRecording();
  159.     void Hangup();
  160. int log_server();
  161.     void SetE164Number(const PString & _num)
  162.       { e164Number = _num; }
  163.     PString GetE164Number() const
  164.       { return e164Number; }
  165.   protected:
  166.     void OnUserInputChar(char ch);
  167.     BOOL StartMenu(int menuNumber);
  168.     BOOL ProcessMenuCmd(const PString & cmdStr);
  169.     const MyH323EndPoint & ep;
  170.     PString product;
  171.     PTime   callStartTime;
  172.     PTime   recordStartTime;
  173.     PString basename;
  174.     PFilePath recordFn;
  175.     PString transmitCodecName, receiveCodecName;
  176.     BOOL    recordTrigger;
  177.     PMutex  connMutex;
  178.     //PCM_RecordFile * recordFile;
  179.     PCM_OGMChannel * ogmChannel;
  180.     PString digits, lastDigits;
  181.     int currentMenu;
  182.     PStringList menuNames;
  183.     PString securityToken, e164Number;
  184. };
  185. class PCM_RecordFile : public PIndirectChannel
  186. {
  187.   PCLASSINFO(PCM_RecordFile, PIndirectChannel)
  188.   public:
  189.     PCM_RecordFile(MyH323Connection & conn, const PFilePath & fn, unsigned callLimit);
  190.     ~PCM_RecordFile();
  191.     BOOL Write(const void * buf, PINDEX len);
  192.     BOOL Close();
  193.     void StartRecording();
  194.     virtual void DelayFrame(PINDEX len);
  195.     virtual BOOL WriteFrame(const void * buf, PINDEX len);
  196.     BOOL WasRecordStarted() const { return recordStarted; }
  197.   protected:
  198.     MyH323Connection & conn;
  199.     PTime finishTime;
  200.     PFilePath fn;
  201.     unsigned callLimit;
  202.     BOOL recordStarted;
  203.     BOOL timeLimitExceeded;
  204.     BOOL closed;
  205.     BOOL isPCM;
  206.     BOOL dataWritten;
  207.     PAdaptiveDelay delay;
  208.     PMutex pcmrecordMutex;
  209.     PFile *fileclass; // will point to a PWAVFile or PFile class
  210. };
  211. class G7231_RecordFile : public PCM_RecordFile
  212. {
  213.   PCLASSINFO(G7231_RecordFile, PCM_RecordFile);
  214.   public:
  215.     G7231_RecordFile(MyH323Connection & conn, const PFilePath & fn, unsigned callLimit);
  216.     void DelayFrame(PINDEX len);
  217.     BOOL WriteFrame(const void * buf, PINDEX len);
  218. };
  219. /*class G7231_File_Codec : public H323AudioCodec
  220. {
  221.   PCLASSINFO(G7231_File_Codec, H323AudioCodec);
  222.   public:
  223.     G7231_File_Codec(Direction dir);
  224.     unsigned GetBandwidth() const;
  225.     static int GetFrameLen(int val);
  226.       
  227.     BOOL Read(BYTE * buffer, unsigned & length, RTP_DataFrame &);
  228.     BOOL Write(const BYTE * buffer, unsigned length, const RTP_DataFrame & rtp, unsigned & frames);
  229. };  
  230. class G7231_File_Capability : public H323AudioCapability
  231. {
  232.   PCLASSINFO(G7231_File_Capability, H323AudioCapability)
  233.   public:
  234.     G7231_File_Capability();
  235.     unsigned GetSubType() const { return H245_AudioCapability::e_g7231; }
  236.     PString GetFormatName() const { return "G.723.1"; }
  237.     H323Codec * CreateCodec(H323Codec::Direction direction) const;
  238.     BOOL OnSendingPDU(H245_AudioCapability & cap, unsigned packetSize) const;
  239.     BOOL OnReceivedPDU(const H245_AudioCapability & pdu, unsigned & packetSize);
  240.     PObject * Clone() const;
  241. };
  242. */
  243. #endif  // _Voxilla_MAIN_H
  244. // End of File ///////////////////////////////////////////////////////////////