906acd65d12487752ab68805c43efb3dce04a74e
[asterisk/asterisk.git] / channels / h323 / ast_h323.h
1 /*
2  * ast_h323.h
3  *
4  * OpenH323 Channel Driver for ASTERISK PBX.
5  *                      By Jeremy McNamara
6  *                      For The NuFone Network 
7  * 
8  * This code has been derived from code created by
9  *              Michael Manousos and Mark Spencer
10  *
11  * This file is part of the chan_h323 driver for Asterisk
12  *
13  * chan_h323 is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 2 of the License, or
16  * (at your option) any later version. 
17  *
18  * chan_h323 is distributed WITHOUT ANY WARRANTY; without even 
19  * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
20  * PURPOSE. See the GNU General Public License for more details. 
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
25  *
26  * Version Info: $Id$ 
27  */
28
29 #ifndef AST_H323_H
30 #define AST_H323_H
31
32 /**  These need to be redefined here because the C++
33          side of this driver is blind to the asterisk headers */        
34 /*! G.723.1 compression */
35 #define AST_FORMAT_G723_1       (1 << 0)
36 /*! GSM compression */
37 #define AST_FORMAT_GSM          (1 << 1)
38 /*! Raw mu-law data (G.711) */
39 #define AST_FORMAT_ULAW         (1 << 2)
40 /*! Raw A-law data (G.711) */
41 #define AST_FORMAT_ALAW         (1 << 3)
42 /*! MPEG-2 layer 3 */
43 #define AST_FORMAT_MP3          (1 << 4)
44 /*! ADPCM (whose?) */
45 #define AST_FORMAT_ADPCM        (1 << 5)
46 /*! Raw 16-bit Signed Linear (8000 Hz) PCM */
47 #define AST_FORMAT_SLINEAR      (1 << 6)
48 /*! LPC10, 180 samples/frame */
49 #define AST_FORMAT_LPC10        (1 << 7)
50 /*! G.729A audio */
51 #define AST_FORMAT_G729A        (1 << 8)
52 /*! SpeeX Free Compression */
53 #define AST_FORMAT_SPEEX        (1 << 9)
54 /*! ILBC Free Codec */
55 #define AST_FORMAT_ILBC         (1 << 10)
56
57 /**This class describes the G.723.1 codec capability.
58  */
59 class H323_G7231Capability : public H323AudioCapability
60 {
61     PCLASSINFO(H323_G7231Capability, H323AudioCapability);
62   public:
63         H323_G7231Capability(BOOL annexA = TRUE);
64         Comparison Compare(const PObject & obj) const;
65         PObject * Clone() const;
66         virtual H323Codec * CreateCodec(H323Codec::Direction direction) const;
67         unsigned GetSubType() const;
68         PString GetFormatName() const;
69         BOOL OnSendingPDU(H245_AudioCapability & pdu, unsigned packetSize) const;
70         BOOL OnReceivedPDU(const H245_AudioCapability & pdu, unsigned & packetSize);
71   protected:
72         BOOL annexA;
73 };
74
75 /**This class describes the (fake) G729 codec capability.
76  */
77 class AST_G729Capability : public H323AudioCapability
78 {
79   PCLASSINFO(AST_G729Capability, H323AudioCapability);
80
81   public:
82     AST_G729Capability();
83     /* Create a copy of the object. */
84     virtual PObject * Clone() const;
85
86     /* Create the codec instance, allocating resources as required. */
87     virtual H323Codec * CreateCodec(H323Codec::Direction direction) const;
88
89     /* Get the sub-type of the capability. This is a code dependent on the
90        main type of the capability.
91
92        This returns one of the four possible combinations of mode and speed
93        using the enum values of the protocol ASN H245_AudioCapability class. */
94     virtual unsigned GetSubType() const;
95
96     /* Get the name of the media data format this class represents. */
97     virtual PString GetFormatName() const;
98
99 };
100
101 /* This class describes the VoiceAge G729A codec capability. */
102 class AST_G729ACapability : public H323AudioCapability
103 {
104   PCLASSINFO(AST_G729ACapability, H323AudioCapability);
105
106   public:
107     /* Create a new G.729A capability. */
108     AST_G729ACapability();
109
110     /* Create a copy of the object. */
111     virtual PObject * Clone() const;
112     /* Create the codec instance, allocating resources as required. */
113     virtual H323Codec * CreateCodec(H323Codec::Direction direction) const;
114
115     /* Get the sub-type of the capability. This is a code dependent on the
116        main type of the capability.
117
118        This returns one of the four possible combinations of mode and speed
119        using the enum values of the protocol ASN H245_AudioCapability class. */
120     virtual unsigned GetSubType() const;
121
122     /* Get the name of the media data format this class represents. */
123     virtual PString GetFormatName() const;
124 };
125
126 class MyH323EndPoint : public H323EndPoint {
127
128         PCLASSINFO(MyH323EndPoint, H323EndPoint);
129
130         public:
131         int MakeCall(const PString &, PString &, unsigned int *, call_options_t *opts);
132         BOOL ClearCall(const PString &, H323Connection::CallEndReason reason);
133         BOOL ClearCall(const PString &);
134
135         void OnClosedLogicalChannel(H323Connection &, const H323Channel &);
136         void OnConnectionEstablished(H323Connection &, const PString &);
137         void OnConnectionCleared(H323Connection &, const PString &);
138         H323Connection * CreateConnection(unsigned, void *);
139         void SendUserTone(const PString &, char);
140         H323Capabilities GetCapabilities(void);
141         BOOL OnConnectionForwarded(H323Connection &, const PString &, const H323SignalPDU &);
142         BOOL ForwardConnection(H323Connection &, const PString &, const H323SignalPDU &);
143         void SetEndpointTypeInfo( H225_EndpointType & info ) const;
144         void SetGateway(void);
145         PStringArray SupportedPrefixes; 
146 };
147
148 class MyH323Connection : public H323Connection {
149
150         PCLASSINFO(MyH323Connection, H323Connection);
151
152         public:
153         MyH323Connection(MyH323EndPoint &, unsigned, unsigned);
154         ~MyH323Connection();
155         H323Channel * CreateRealTimeLogicalChannel(const H323Capability &, 
156                                                    H323Channel::Directions, 
157                                                    unsigned, 
158                                                    const H245_H2250LogicalChannelParameters *,
159                                                    RTP_QOS *);
160         H323Connection::AnswerCallResponse OnAnswerCall(const PString &, 
161                                                         const H323SignalPDU &, 
162                                                         H323SignalPDU &);
163         void OnReceivedReleaseComplete(const H323SignalPDU &);
164         BOOL OnAlerting(const H323SignalPDU &, const PString &);
165         BOOL OnSendReleaseComplete(H323SignalPDU &);
166         BOOL OnReceivedSignalSetup(const H323SignalPDU &);
167         BOOL OnReceivedFacility(const H323SignalPDU &);
168         BOOL OnSendSignalSetup(H323SignalPDU &);
169         BOOL OnStartLogicalChannel(H323Channel &);
170         BOOL OnClosingLogicalChannel(H323Channel &);    
171         void SendUserInputTone(char, unsigned);
172         void OnUserInputTone(char, unsigned, unsigned, unsigned);
173         void OnUserInputString(const PString &value);
174         BOOL OnReceivedProgress(const H323SignalPDU &);
175         void OnSendCapabilitySet(H245_TerminalCapabilitySet &);
176         BOOL OnReceivedCapabilitySet(const H323Capabilities &, const H245_MultiplexCapability *,
177                                      H245_TerminalCapabilitySetReject &);
178
179         PString sourceAliases;
180         PString destAliases;
181         PString sourceE164;
182         PString destE164;
183
184         WORD sessionId;
185         BOOL bridging;                  
186
187         unsigned progressSetup;
188         unsigned progressAlert;
189
190         RTP_DataFrame::PayloadTypes dtmfCodec;
191 };
192
193 class MyH323_ExternalRTPChannel : public H323_ExternalRTPChannel {
194
195         PCLASSINFO(MyH323_ExternalRTPChannel, H323_ExternalRTPChannel);
196
197         public:
198         MyH323_ExternalRTPChannel(
199                 MyH323Connection & connection,
200                 const H323Capability & capability, 
201                 Directions direction,              
202                 unsigned sessionID);
203
204         ~MyH323_ExternalRTPChannel();
205
206         /* Overrides */
207         BOOL Start(void);
208         BOOL OnReceivedAckPDU(const H245_H2250LogicalChannelAckParameters & param);
209
210         protected:
211         BYTE payloadCode;
212
213         PIPSocket::Address localIpAddr;
214         PIPSocket::Address remoteIpAddr;
215         WORD localPort;
216         WORD remotePort;
217 }; 
218
219 /**
220  * The MyProcess is a necessary descendant PProcess class so that the H323EndPoint 
221  * objected to be created from within that class. (Solves the who owns main() problem). 
222  */
223 class MyProcess : public PProcess {
224
225         PCLASSINFO(MyProcess, PProcess);
226     
227         public:
228         MyProcess();
229         void Main(); 
230 };
231
232 #endif /* !defined AST_H323_H */