main.h
上传用户:sdyzjx
上传日期:2007-01-06
资源大小:47k
文件大小:14k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * main.h
  3.  *
  4.  * PWLib application header file for OpenPhone
  5.  *
  6.  * Open H323 Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Open H323 Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * 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): Portions Copyright 1999 NEWLINK
  31.  *
  32.  * $Log: main.h,v $
  33.  * Revision 1.32  2000/07/02 09:14:09  robertj
  34.  * Fixed problems with closing video receive window under Win32.
  35.  *
  36.  * Revision 1.31  2000/06/29 06:20:53  robertj
  37.  * Fixed deadlock when exiting application while in a call.
  38.  *
  39.  * Revision 1.30  2000/06/15 01:46:15  robertj
  40.  * Added channel pause (aka mute) functions.
  41.  *
  42.  * Revision 1.29  2000/06/07 05:48:06  robertj
  43.  * Added call forwarding.
  44.  *
  45.  * Revision 1.28  2000/05/10 05:16:00  robertj
  46.  * Added hook flash to user indications. Also allowed selection of the User Indication
  47.  *    method to be used in the H.245 protocol.
  48.  *
  49.  * Revision 1.27  2000/05/04 11:53:38  robertj
  50.  * Added Packets Too Late statistics.
  51.  * Fixed gatekeeper detection so if "required", disables call menus.
  52.  *
  53.  * Revision 1.26  2000/05/01 08:20:28  robertj
  54.  * Fixed capability loading so do not need to restart program when altering video parameters.
  55.  *
  56.  * Revision 1.25  2000/04/19 02:07:29  robertj
  57.  * Fixed problems with video window.
  58.  *
  59.  * Revision 1.24  2000/04/11 03:59:33  robertj
  60.  * Added new call end reasons for gatekeeper denied calls.
  61.  *
  62.  * Revision 1.23  2000/04/05 20:56:47  robertj
  63.  * Added more statistics.
  64.  *
  65.  * Revision 1.22  2000/03/04 13:44:00  robertj
  66.  * Added timer to ring every 5 seconds and not just once!
  67.  *
  68.  * Revision 1.21  2000/03/04 12:16:55  robertj
  69.  * Added ring sound file to standard sound device on incoming calls.
  70.  *
  71.  * Revision 1.20  2000/02/17 12:25:17  robertj
  72.  * Added user indication send/receive and option to disable H.245 tunneling.
  73.  *
  74.  * Revision 1.19  1999/12/23 23:02:35  robertj
  75.  * File reorganision for separating RTP from H.323 and creation of LID for VPB support.
  76.  *
  77.  * Revision 1.18  1999/11/22 11:20:47  robertj
  78.  * Fixed problem with handset pick up while making H.323 call but before connected.
  79.  *
  80.  * Revision 1.17  1999/11/19 13:00:52  robertj
  81.  * Added HangingUp state so can't start new call till old one fully cleared.
  82.  *
  83.  * Revision 1.16  1999/11/17 03:49:51  robertj
  84.  * Added RTP statistics display.
  85.  *
  86.  * Revision 1.15  1999/11/16 13:22:24  robertj
  87.  * Improved versioning in about dialog (version number now in single place)
  88.  *
  89.  * Revision 1.14  1999/11/13 14:11:56  robertj
  90.  * Changes to make silence detection selectable.
  91.  *
  92.  * Revision 1.13  1999/11/11 23:14:40  robertj
  93.  * Fixed turning off ring on answering call and disabling call menu if initialisation failed.
  94.  *
  95.  * Revision 1.12  1999/11/11 08:54:27  robertj
  96.  * Changed preferred codec function to be full codec ordering.
  97.  *
  98.  * Revision 1.11  1999/11/11 01:20:48  robertj
  99.  * Numerous enhancements to get nearly feature complete for version 1.
  100.  *
  101.  * Revision 1.10  1999/11/06 03:48:36  robertj
  102.  * Added shells for mute functions
  103.  *
  104.  * Revision 1.9  1999/11/05 08:54:41  robertj
  105.  * Rewrite of ixj interface code to fix support for arbitrary codecs.
  106.  *
  107.  * Revision 1.8  1999/11/01 00:50:16  robertj
  108.  * Added receive H.261 video window
  109.  *
  110.  * Revision 1.7  1999/10/30 12:45:47  robertj
  111.  * Added stop channel message, outside line message and G728/G729 interlock for LineJACK
  112.  *
  113.  * Revision 1.6  1999/10/29 02:26:52  robertj
  114.  * Added scrollable status window and better termination information.
  115.  *
  116.  * Revision 1.5  1999/10/28 12:21:34  robertj
  117.  * Added AEC support and speakerphone switching button.
  118.  *
  119.  * Revision 1.4  1999/10/27 06:32:50  robertj
  120.  * Changes to prevent H225 alerting message being sent if "engaged".
  121.  *
  122.  * Revision 1.3  1999/10/24 12:59:40  robertj
  123.  * Added platform independent support for Quicknet xJACK cards.
  124.  *
  125.  * Revision 1.2  1999/10/07 07:37:31  robertj
  126.  * Added auto-answer and trace options (thanks David Iodice of NEWLINK)
  127.  *
  128.  * Revision 1.1  1999/08/25 05:16:11  robertj
  129.  * GUI test application.
  130.  *
  131.  * Revision 1.3  1999/05/24 03:03:08  robertj
  132.  * Fixed include paths after restructure (much belated).
  133.  *
  134.  * Revision 1.2  1999/01/26 06:35:08  robertj
  135.  * Fixed $LOG$ variable in template files
  136.  *
  137.  */
  138. #ifndef _OpenPhone_MAIN_H
  139. #define _OpenPhone_MAIN_H
  140. #include "h323.h"
  141. #include "videoio.h"
  142. #include "ixjlid.h"
  143. class MainWindow;
  144. class MainMenu;
  145. class QuicknetThread;
  146. class StatisticsDlg;
  147. ///////////////////////////////////////////////////////
  148. class OpenPhoneEndPoint : public H323EndPoint
  149. {
  150.   PCLASSINFO(OpenPhoneEndPoint, H323EndPoint);
  151.   public:
  152.     OpenPhoneEndPoint(MainWindow * mainWindow);
  153.     ~OpenPhoneEndPoint();
  154.     // overrides from H323EndPoint
  155.     BOOL OnIncomingCall(H323Connection &, const H323SignalPDU &, H323SignalPDU &);
  156.     BOOL OnConnectionForwarded(H323Connection &, const PString &, const H323SignalPDU &);
  157.     void OnConnectionEstablished(H323Connection &, const PString &);
  158.     void OnConnectionCleared    (H323Connection &, const PString &);
  159.     H323Connection * CreateConnection(unsigned callReference);
  160.     BOOL OpenAudioChannel(H323Connection &, BOOL, unsigned, H323AudioCodec &);
  161.     BOOL OpenVideoDevice(H323Connection &, BOOL, H323VideoCodec &);
  162.     BOOL OnStartLogicalChannel(H323Connection &, H323Channel &);
  163.     void OnClosedLogicalChannel(H323Connection &, const H323Channel &);
  164.     void OnRTPStatistics(const H323Connection &, const RTP_Session &) const;
  165.     // new functions
  166.     BOOL Initialise(PConfig & config);
  167.     BOOL OpenQuicknet(PConfig & config);
  168.     void CloseQuicknet();
  169.     BOOL FindGatekeeper(PConfig & config);
  170.     void LoadCapabilities(PConfig & config);
  171.     OpalIxJDevice xJack;
  172.     BOOL noFastStart;
  173.     BOOL noTunneling;
  174.     BOOL silenceDetect;
  175.     PString alwaysForwardParty;
  176.     PString busyForwardParty;
  177.     int  videoSize;
  178.   protected:
  179.     MainWindow     * mainWindow;
  180.     QuicknetThread * phoneThread;
  181. };
  182. ///////////////////////////////////////////////////////
  183. class OpenPhoneConnection : public H323Connection
  184. {
  185.   PCLASSINFO(OpenPhoneConnection, H323Connection);
  186.   public:
  187.     OpenPhoneConnection(
  188.       OpenPhoneEndPoint & mgr,
  189.       unsigned callReference,
  190.       MainWindow * mainWindow
  191.     );
  192.     // overrides from H323Connection
  193.     AnswerCallResponse OnAnswerCall(const PString &, const H323SignalPDU &, H323SignalPDU &);
  194.     BOOL OnAlerting(const H323SignalPDU &, const PString &);
  195.     void OnSelectLogicalChannels();
  196.     BOOL OnOpenLogicalChannel(const H245_OpenLogicalChannel &,
  197.                               H245_OpenLogicalChannelAck &,
  198.                               unsigned &);
  199.     void OnUserInputString(const PString &);
  200.   protected:
  201.     OpenPhoneEndPoint & myEndpoint;
  202.     MainWindow * mainWindow;
  203. };
  204. ///////////////////////////////////////////////////////
  205. class QuicknetThread : public PThread
  206. {
  207.     PCLASSINFO(QuicknetThread, PThread);
  208.   public:
  209.     QuicknetThread(MainWindow * mainWindow, OpalIxJDevice & xJack);
  210.     void Main();
  211.   private:
  212.     MainWindow * mainWindow;
  213.     OpalIxJDevice & xJack;
  214. };
  215. ///////////////////////////////////////////////////////
  216. class VideoDevice;
  217. class VideoWindow : public PFloatingDialog
  218. {
  219.   PCLASSINFO(VideoWindow, PFloatingDialog);
  220.  
  221.   public:
  222.     VideoWindow(PInteractor * parent, VideoDevice * device, BOOL local);
  223.     ~VideoWindow();
  224.     void SetVideoSize(int _width, int _height);
  225.     BOOL WriteLineSegment(int x, int y, unsigned len, const BYTE * data);
  226.     virtual void OnCancel();
  227.   protected:
  228.     virtual void OnClose();
  229.     virtual void OnRedraw(PCanvas &);
  230.     void Shutdown();
  231.     VideoDevice * device;
  232.     BOOL          localVideo;
  233.     PDrawCanvas * canvas;
  234.     PPixelImage   image;
  235.     PPixelImage   raster;
  236.     PMutex        mutex;
  237. }; 
  238. ///////////////////////////////////////////////////////
  239. class VideoDevice : public H323VideoDevice
  240. {
  241.   PCLASSINFO(VideoDevice, H323VideoDevice);
  242.  
  243.   public:
  244.     VideoDevice(MainWindow * mainWindow, BOOL local, const PString & title);
  245.     ~VideoDevice();
  246.     void SetSize(int _width, int _height);
  247.   protected:
  248.     BOOL WriteLineSegment(int x, int y, unsigned len, const BYTE * data);
  249.     VideoWindow * window;
  250.     BOOL          windowOpen;
  251.   friend class VideoWindow;
  252. }; 
  253. ///////////////////////////////////////////////////////
  254. class MainWindow : public PTopLevelWindow
  255. {
  256.   PCLASSINFO(MainWindow, PTopLevelWindow)
  257.   
  258.   public:
  259.     MainWindow(PArgList & args);
  260.     ~MainWindow();
  261.     PDECLARE_COMMAND_ENABLE("MakeCall",    MainWindow, CallCmd, CanMakeCall);
  262.     PDECLARE_COMMAND_ENABLE("HangupCall",  MainWindow, HangupCmd, CanHangupCall);
  263.     PDECLARE_COMMAND_ENABLE("AcceptCall",  MainWindow, AcceptCallCmd, CanAcceptCall);
  264.     PDECLARE_COMMAND_ENABLE("RefuseCall",  MainWindow, RefuseCallCmd, CanRefuseCall);
  265.     PDECLARE_NOTIFIER(PMenuItem, MainWindow, UserInputCmd);
  266.     PDECLARE_COMMAND_ENABLE("ShowStats",   MainWindow, ShowStatsCmd, CanShowStats);
  267.     PDECLARE_COMMAND_ENABLE("MuteMicrophone", MainWindow, MuteMicrophoneCmd, CanMuteMicrophone);
  268.     PDECLARE_COMMAND_ENABLE("MuteSpeaker", MainWindow, MuteSpeakerCmd, CanMuteSpeaker);
  269.     PDECLARE_COMMAND("ExitCmd", MainWindow, ExitCmd);
  270.     PDECLARE_COMMAND("SpeedDialOptions",  MainWindow, SpeedDialOptionsCmd);
  271.     PDECLARE_COMMAND("GeneralOptions",    MainWindow, GeneralOptionsCmd);
  272.     PDECLARE_COMMAND("ForwardingOptions", MainWindow, ForwardingOptionsCmd);
  273.     PDECLARE_COMMAND_ENABLE("GatekeeperOptions", MainWindow, GatekeeperOptionsCmd, CanSetGatekeeper);
  274.     PDECLARE_COMMAND("AudioOptions",      MainWindow, AudioOptionsCmd);
  275.     PDECLARE_COMMAND("VideoOptions",      MainWindow, VideoOptionsCmd);
  276. #if PTRACING
  277.     PDECLARE_COMMAND("TraceOptions",      MainWindow, TraceOptionsCmd);
  278. #endif
  279.     PDECLARE_NOTIFIER(PTextButton, MainWindow, OnCallButton);
  280.     PDECLARE_NOTIFIER(PTextButton, MainWindow, OnAnswerButton);
  281.     PDECLARE_NOTIFIER(PTextButton, MainWindow, OnRefuseButton);
  282.     PDECLARE_NOTIFIER(PTextButton, MainWindow, OnHangUpButton);
  283.     PDECLARE_NOTIFIER(PTextButton, MainWindow, OnSpeakerButton);
  284.     PDECLARE_NOTIFIER(PTextButton, MainWindow, OnSpeedDialButton);
  285.     PDECLARE_NOTIFIER(PCheckBox, MainWindow, OnSpeakerEnable);
  286.     PDECLARE_NOTIFIER(PCheckBox, MainWindow, OnMicrophoneEnable);
  287.     PDECLARE_NOTIFIER(PHorizontalScrollBar, MainWindow, OnSpeakerVolume);
  288.     PDECLARE_NOTIFIER(PHorizontalScrollBar, MainWindow, OnMicrophoneVolume);
  289.     void OutputStatus(PRESOURCE_ID strId, ...);
  290.     virtual BOOL AllowClose(BOOL closingAll);
  291.     virtual void OnClose();
  292.     virtual void OnResize(const PDim & newSize, ResizeType type);
  293.     BOOL OnAnswerCall(const PString & token, const PString & caller);
  294.     BOOL OnConnectionForwarded(const PString &);
  295.     void OnConnectionEstablished(const PString & token, const PString & party);
  296.     void OnConnectionCleared(const H323Connection & connection);
  297.     void OnLogicalChannel(const H323Channel & channel, unsigned txStrID, unsigned rxStrID);
  298.     void OnHandsetLifted(OpalIxJDevice & xJack);
  299.     void OnHandsetReturned(OpalIxJDevice & xJack);
  300.     enum CallMode {
  301.       IdleCallMode,
  302.       MakingCallMode,
  303.       HangingUpMode,
  304.       IncomingCallWait,
  305.       IncomingLineCall,
  306.       Active323CallMode,
  307.       ActiveLineCallMode,
  308.       NoGatekeeperMode,
  309.       ApplicationShuttingDown
  310.     };
  311.     CallMode GetCallMode() const { return currentCallMode; }
  312.     void SetCallMode(CallMode mode);
  313.     StatisticsDlg * statisticsDialog;
  314.   private:
  315.     void AddSpeedDialButtons();
  316.     BOOL SpeedDial(const PString & key);
  317.     BOOL MakeCall(const PString & address, const PString & gateway);
  318.     void AnswerCall(BOOL accept);
  319.     OpenPhoneEndPoint endpoint;
  320.     // User interface variables
  321.     MainMenu *  myMainMenu;
  322.     PStringListBox * statusWindow;
  323.     PTextButton * makeCallButton;
  324.     PTextButton * answerButton;
  325.     PTextButton * refuseButton;
  326.     PTextButton * hangUpButton;
  327.     PTextButton * speakerButton;
  328.     PCheckBox * speakerEnable;
  329.     PHorizontalScrollBar * speakerVolume;
  330.     PCheckBox * microphoneEnable;
  331.     PHorizontalScrollBar * microphoneVolume;
  332.     PInteractorList speedDialButtons;
  333.     PTimer ringSoundTimer;
  334.     PDECLARE_NOTIFIER(PTimer, MainWindow, OnRingSoundAgain);
  335.     PString       noAnswerForwardParty;
  336.     PTimeInterval noAnswerTime;
  337.     PTimer        noAnswerTimer;
  338.     PDECLARE_NOTIFIER(PTimer, MainWindow, OnNoAnswerTimeout);
  339.     // Configuration variables
  340.     BOOL    autoAnswer;
  341.     BOOL    dtmfAsString;
  342.     PINDEX  maxRecentCalls;
  343.     PString ringSoundFile;
  344.     // State variables
  345.     CallMode currentCallMode;
  346.     PMutex   callModeMutex;
  347.     PString  currentCallToken;
  348.     BOOL     speakerphoneSwitch;
  349. #if PTRACING
  350.     BOOL OpenTraceFile(PConfig & config);
  351.     PTextFile * myTraceFile;
  352. #endif
  353. };
  354. ///////////////////////////////////////////////////////
  355. class OpenPhone : public PApplication
  356. {
  357.   PCLASSINFO(OpenPhone, PApplication)
  358.   public:
  359.     OpenPhone();
  360.     void Main();
  361.     void OnAbout();
  362. };
  363. #endif  // _OpenPhone_MAIN_H
  364. // End of File ///////////////////////////////////////////////////////////////