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

模拟服务器

开发平台:

Visual C++

  1. /*
  2.  * main.h
  3.  *
  4.  * PWLib application header file for Voxilla
  5.  *
  6.  * A H.323 "net telephone" 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.  * Contributor(s): ______________________________________.
  31.  *
  32.  *
  33.  *
  34.  */
  35. //#ifndef _Voxilla_MAIN_H
  36. //#define _Voxilla_MAIN_H
  37. #include <h323.h>
  38. #include <h323pdu.h>
  39. #include <h245.h>
  40. #include <gsmcodec.h>
  41. #include <lid.h>
  42. #include <ptclib/pwavfile.h>
  43. #include <ptclib/delaychan.h>
  44. //class Caller : public PProcess
  45. class Caller : public PObject
  46. {
  47.   PCLASSINFO(Caller, PObject)
  48.   public:
  49.     Caller();
  50.     ~Caller();
  51.     void CallerMain(PString Cargs);
  52.     void RecordFile(PArgList & args);
  53.     void PlayFile(PArgList & args);
  54.   protected:
  55.     long GetCodec(const PString & codecname);
  56.     OpalLineInterfaceDevice * GetDevice(const PString & device);
  57. };
  58. //Caller * caller;
  59. class C_MyH323EndPoint : public H323EndPoint
  60. {
  61.   PCLASSINFO(C_MyH323EndPoint, H323EndPoint);
  62.   public:
  63.     C_MyH323EndPoint(unsigned callLimit,
  64.                    const PString & runCmd,
  65.                    const PDirectory & dir,
  66.                    int flags);
  67.     // overrides from H323EndPoint
  68.     virtual H323Connection * CreateConnection(unsigned callReference);
  69.     BOOL OnIncomingCall(H323Connection &, const H323SignalPDU &, H323SignalPDU &);
  70.     // Alteracoes para o Caller
  71.     BOOL OnAlerting( H323Connection & , const H323SignalPDU & , const PString &
  72.  );
  73.     void OnConnectionEstablished( H323Connection & , const PString &  );
  74.     void OnConnectionCleared( H323Connection & , const PString & );
  75.     void AwaitTermination();
  76.     BOOL MakeOutgoingCall(const PString &);
  77.     // new functions
  78.     BOOL Initialise(PConfigArgs & args);
  79.     PString    GetGSMOGM() const            { return gsmOgm; }
  80.     void       SetGSMOGM(const PString & s) { gsmOgm = s; }
  81.     PString    GetG711OGM() const            { return g711Ogm; }
  82.     void       SetG711OGM(const PString & s) { g711Ogm = s; }
  83.     PString    GetLPC10OGM() const            { return lpc10Ogm; }
  84.     void       SetLPC10OGM(const PString & s) { lpc10Ogm = s; }
  85.     PString    GetSPEEXOGM() const            { return speexOgm; }
  86.     void       SetSPEEXOGM(const PString & s) { speexOgm = s; }
  87.     PString    GetG7231OGM() const            { return g7231Ogm; }
  88.     void       SetG7231OGM(const PString & s) { g7231Ogm = s; }
  89.     unsigned   GetCallLimit() const { return callLimit; }
  90.     PString    GetRunCmd() const    { return runCmd; }
  91.     PDirectory GetDirectory() const { return dir; }
  92.     void       SetRecordWav(const BOOL rec){ recordWav = rec; }
  93.     BOOL       GetRecordWav() const        { return recordWav; }
  94.     enum {
  95.       DeleteAfterRecord = 0x01,
  96.       NoRecordG7231     = 0x02,
  97.       HangupAfterPlay   = 0x04
  98.     };
  99.     BOOL GetDeleteAfterRecord() const   { return flags & DeleteAfterRecord; }
  100.     BOOL GetNoRecordG7231() const       { return flags & NoRecordG7231; }
  101.     BOOL GetHangupAfterPlay() const     { return flags & HangupAfterPlay; }
  102.   protected:
  103.     unsigned callLimit;
  104.     PString pcmOgm, g711Ogm, gsmOgm, lpc10Ogm, g7231Ogm, runCmd;
  105.     PString speexOgm;
  106.     PDirectory dir;
  107.     int flags;
  108. // Variaveis usadas pelo caller
  109.     PString currentCallToken;
  110.     enum {
  111.       InCall = 0x00,
  112.       CallClosed=0x01,
  113.       CallInit=0x02
  114.      } StateFlag ;
  115.     BOOL recordWav;
  116. };
  117. class C_PCM_RecordFile;
  118. class C_MyH323Connection;
  119. PQUEUE(PStringQueue, PString);
  120. class C_PCM_OGMChannel : public PIndirectChannel
  121. {
  122.   PCLASSINFO(C_PCM_OGMChannel, PIndirectChannel);
  123.   public:
  124.     C_PCM_OGMChannel(C_MyH323Connection & conn);
  125.     BOOL Read(void * buffer, PINDEX amount);
  126.     void PlayFile(PFile * chan);
  127.     BOOL Close();
  128.     void QueueFile(const PString & cmd);
  129.     void FlushQueue();
  130.     void SetRecordTrigger();
  131.     void SetHangupTrigger();
  132.     void SetPlayOnce() { playOnce = TRUE; }
  133.   protected:
  134.     virtual BOOL ReadFrame(PINDEX amount);
  135.     virtual void CreateSilenceFrame(PINDEX amount);
  136.     virtual void Synchronise(PINDEX amount);
  137.     virtual BOOL IsWAVFileValid(PWAVFile *chan);
  138.     BOOL AdjustFrame(void * buffer, PINDEX amount);
  139.     PStringQueue playQueue;
  140.     C_MyH323Connection & conn;
  141.     PMutex chanMutex;
  142.     int silentCount;
  143.     int totalData;
  144.     BOOL recordTrigger, hangupTrigger;
  145.     BOOL closed;
  146.     BOOL playOnce;
  147.     PAdaptiveDelay ogm_delay;
  148.     PBYTEArray frameBuffer;
  149.     PINDEX frameLen, frameOffs;
  150. };
  151. class C_G7231_OGMChannel : public C_PCM_OGMChannel
  152. {
  153.   PCLASSINFO(C_G7231_OGMChannel, C_PCM_OGMChannel);
  154.   public:
  155.     C_G7231_OGMChannel(C_MyH323Connection & conn);
  156.   protected:
  157.     BOOL ReadFrame(PINDEX amount);
  158.     void CreateSilenceFrame(PINDEX amount);
  159.     void Synchronise(PINDEX amount);
  160.     BOOL IsWAVFileValid(PWAVFile *chan);
  161. };
  162. class C_MyH323Connection : public H323Connection
  163. {
  164.   PCLASSINFO(C_MyH323Connection, H323Connection);
  165.   public:
  166.     C_MyH323Connection(C_MyH323EndPoint &, unsigned);
  167.     ~C_MyH323Connection();
  168.     // overrides from H323Connection
  169.     BOOL OpenAudioChannel(BOOL, unsigned, H323AudioCodec & codec);
  170.     AnswerCallResponse OnAnswerCall(const PString &, const H323SignalPDU &, H323SignalPDU &);
  171.     BOOL OnStartLogicalChannel(H323Channel & channel);
  172.     void OnUserInputString(const PString & value);
  173.     // new functions
  174.     void StartRecording();
  175.     void Hangup();
  176.     void SetE164Number(const PString & _num)
  177.       { e164Number = _num; }
  178.     PString GetE164Number() const
  179.       { return e164Number; }
  180.   protected:
  181.     void OnUserInputChar(char ch);
  182.     BOOL StartMenu(int menuNumber);
  183.     BOOL ProcessMenuCmd(const PString & cmdStr);
  184.     const C_MyH323EndPoint & ep;
  185.     PString product;
  186.     PTime   callStartTime;
  187.     PTime   recordStartTime;
  188.     PString basename;
  189.     PFilePath recordFn;
  190.     PString transmitCodecName, receiveCodecName;
  191.     BOOL    recordTrigger;
  192.     PMutex  connMutex;
  193.     C_PCM_RecordFile * recordFile;
  194.     C_PCM_OGMChannel * ogmChannel;
  195.     PString digits, lastDigits;
  196.     int currentMenu;
  197.     PStringList menuNames;
  198.     PString securityToken, e164Number;
  199. };
  200. class C_PCM_RecordFile : public PIndirectChannel
  201. {
  202.   PCLASSINFO(C_PCM_RecordFile, PIndirectChannel)
  203.   public:
  204.     C_PCM_RecordFile(C_MyH323Connection & conn, const PFilePath & fn, unsigned callLimit);
  205.     ~C_PCM_RecordFile();
  206.     BOOL Write(const void * buf, PINDEX len);
  207.     BOOL Close();
  208.     void StartRecording();
  209.     virtual void DelayFrame(PINDEX len);
  210.     virtual BOOL WriteFrame(const void * buf, PINDEX len);
  211.     BOOL WasRecordStarted() const { return recordStarted; }
  212.   protected:
  213.     C_MyH323Connection & conn;
  214.     PTime finishTime;
  215.     PFilePath fn;
  216.     unsigned callLimit;
  217.     BOOL recordStarted;
  218.     BOOL timeLimitExceeded;
  219.     BOOL closed;
  220.     BOOL isPCM;
  221.     BOOL dataWritten;
  222.     PAdaptiveDelay delay;
  223.     PMutex pcmrecordMutex;
  224.     PFile *fileclass; // will point to a PWAVFile or PFile class
  225. };
  226. class C_G7231_RecordFile : public C_PCM_RecordFile
  227. {
  228.   PCLASSINFO(C_G7231_RecordFile, C_PCM_RecordFile);
  229.   public:
  230.     C_G7231_RecordFile(C_MyH323Connection & conn, const PFilePath & fn, unsigned callLimit);
  231.     void DelayFrame(PINDEX len);
  232.     BOOL WriteFrame(const void * buf, PINDEX len);
  233. };
  234. //#endif  // _Voxilla_MAIN_H
  235. // End of File ///////////////////////////////////////////////////////////////