Fix missed extension replacement
[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 #define VERSION(a,b,c) ((a)*10000+(b)*100+(c))
33
34 #if 0
35 /**  These need to be redefined here because the C++
36      side of this driver is blind to the asterisk headers */
37 /*! G.723.1 compression */
38 #define AST_FORMAT_G723_1       (1 << 0)
39 /*! GSM compression */
40 #define AST_FORMAT_GSM          (1 << 1)
41 /*! Raw mu-law data (G.711) */
42 #define AST_FORMAT_ULAW         (1 << 2)
43 /*! Raw A-law data (G.711) */
44 #define AST_FORMAT_ALAW         (1 << 3)
45 /*! MPEG-2 layer 3 */
46 #define AST_FORMAT_MP3          (1 << 4)
47 /*! ADPCM (whose?) */
48 #define AST_FORMAT_ADPCM        (1 << 5)
49 /*! Raw 16-bit Signed Linear (8000 Hz) PCM */
50 #define AST_FORMAT_SLINEAR      (1 << 6)
51 /*! LPC10, 180 samples/frame */
52 #define AST_FORMAT_LPC10        (1 << 7)
53 /*! G.729A audio */
54 #define AST_FORMAT_G729A        (1 << 8)
55 /*! SpeeX Free Compression */
56 #define AST_FORMAT_SPEEX        (1 << 9)
57 /*! ILBC Free Codec */
58 #define AST_FORMAT_ILBC         (1 << 10)
59 #endif
60
61 /**This class describes the G.711 codec capability.
62  */
63 class AST_G711Capability : public H323AudioCapability
64 {
65         PCLASSINFO(AST_G711Capability, H323AudioCapability);
66
67 public:
68         AST_G711Capability(int rx_frames = 125, H323_G711Capability::Mode _mode = H323_G711Capability::muLaw, H323_G711Capability::Speed _speed = H323_G711Capability::At64k);
69         virtual PObject *Clone() const;
70         virtual H323Codec * CreateCodec(H323Codec::Direction direction) const;
71         virtual unsigned GetSubType() const;
72         virtual PString GetFormatName() const;
73
74 protected:
75         H323_G711Capability::Mode mode;
76         H323_G711Capability::Speed speed;
77 };
78
79 /**This class describes the G.723.1 codec capability.
80  */
81 class AST_G7231Capability : public H323AudioCapability
82 {
83         PCLASSINFO(AST_G7231Capability, H323AudioCapability);
84
85 public:
86         AST_G7231Capability(int rx_frames = 7, BOOL annexA = TRUE);
87         Comparison Compare(const PObject & obj) const;
88         virtual PObject * Clone() const;
89         virtual H323Codec * CreateCodec(H323Codec::Direction direction) const;
90         virtual unsigned GetSubType() const;
91         virtual PString GetFormatName() const;
92         virtual BOOL OnSendingPDU(H245_AudioCapability & pdu, unsigned packetSize) const;
93         virtual BOOL OnReceivedPDU(const H245_AudioCapability & pdu, unsigned & packetSize);
94
95 protected:
96         BOOL annexA;
97 };
98
99 /**This class describes the (fake) G729 codec capability.
100  */
101 class AST_G729Capability : public H323AudioCapability
102 {
103         PCLASSINFO(AST_G729Capability, H323AudioCapability);
104
105 public:
106         AST_G729Capability(int rx_frames = 24);
107         /* Create a copy of the object. */
108         virtual PObject * Clone() const;
109
110         /* Create the codec instance, allocating resources as required. */
111         virtual H323Codec * CreateCodec(H323Codec::Direction direction) const;
112
113         /* Get the sub-type of the capability. This is a code dependent on the
114            main type of the capability.
115
116            This returns one of the four possible combinations of mode and speed
117            using the enum values of the protocol ASN H245_AudioCapability class. */
118         virtual unsigned GetSubType() const;
119
120         /* Get the name of the media data format this class represents. */
121         virtual PString GetFormatName() const;
122 };
123
124 /* This class describes the VoiceAge G729A codec capability. */
125 class AST_G729ACapability : public H323AudioCapability
126 {
127         PCLASSINFO(AST_G729ACapability, H323AudioCapability);
128
129 public:
130         /* Create a new G.729A capability. */
131         AST_G729ACapability(int rx_frames = 24);
132
133         /* Create a copy of the object. */
134         virtual PObject * Clone() const;
135         /* Create the codec instance, allocating resources as required. */
136         virtual H323Codec * CreateCodec(H323Codec::Direction direction) const;
137
138         /* Get the sub-type of the capability. This is a code dependent on the
139            main type of the capability.
140
141            This returns one of the four possible combinations of mode and speed
142            using the enum values of the protocol ASN H245_AudioCapability class. */
143         virtual unsigned GetSubType() const;
144
145         /* Get the name of the media data format this class represents. */
146         virtual PString GetFormatName() const;
147 };
148
149 /* This class describes the GSM-06.10 codec capability. */
150 class AST_GSM0610Capability : public H323AudioCapability
151 {
152         PCLASSINFO(AST_GSM0610Capability, H323AudioCapability);
153
154 public:
155         /* Create a new GSM capability. */
156         AST_GSM0610Capability(int rx_frames = 24, int comfortNoise = 0, int scrambled = 0);
157
158         /* Create a copy of the object. */
159         virtual PObject * Clone() const;
160
161         /* Create the codec instance, allocating resources as required. */
162         virtual H323Codec * CreateCodec(H323Codec::Direction direction) const;
163
164         /* Get the sub-type of the capability. This is a code dependent on the
165            main type of the capability.
166
167            This returns one of the four possible combinations of mode and speed
168            using the enum values of the protocol ASN H245_AudioCapability class. */
169         virtual unsigned GetSubType() const;
170
171         /* Get the name of the media data format this class represents. */
172         virtual PString GetFormatName() const;
173
174         BOOL OnSendingPDU(H245_AudioCapability & pdu, unsigned packetSize) const;
175         BOOL OnReceivedPDU(const H245_AudioCapability & pdu, unsigned & packetSize);
176
177 protected:
178         int comfortNoise;
179         int scrambled;
180 };
181
182 class MyH323EndPoint : public H323EndPoint
183 {
184         PCLASSINFO(MyH323EndPoint, H323EndPoint);
185
186 public:
187         MyH323EndPoint();
188         int MyMakeCall(const PString &, PString &, void *_callReference, void *_opts);
189         BOOL ClearCall(const PString &, H323Connection::CallEndReason reason);
190         BOOL ClearCall(const PString &);
191
192         void OnClosedLogicalChannel(H323Connection &, const H323Channel &);
193         void OnConnectionEstablished(H323Connection &, const PString &);
194         void OnConnectionCleared(H323Connection &, const PString &);
195         virtual H323Connection * CreateConnection(unsigned, void *, H323Transport *, H323SignalPDU *);
196         void SendUserTone(const PString &, char);
197         BOOL OnConnectionForwarded(H323Connection &, const PString &, const H323SignalPDU &);
198         BOOL ForwardConnection(H323Connection &, const PString &, const H323SignalPDU &);
199         void SetEndpointTypeInfo( H225_EndpointType & info ) const;
200         void SetGateway(void);
201         PStringArray SupportedPrefixes;
202 };
203
204 class MyH323Connection : public H323Connection
205 {
206         PCLASSINFO(MyH323Connection, H323Connection);
207
208 public:
209         MyH323Connection(MyH323EndPoint &, unsigned, unsigned);
210         ~MyH323Connection();
211         H323Channel * CreateRealTimeLogicalChannel(const H323Capability &,
212                         H323Channel::Directions,
213                         unsigned,
214                         const H245_H2250LogicalChannelParameters *,
215                         RTP_QOS *);
216         H323Connection::AnswerCallResponse OnAnswerCall(const PString &,
217                         const H323SignalPDU &,
218                         H323SignalPDU &);
219         void OnReceivedReleaseComplete(const H323SignalPDU &);
220         BOOL OnAlerting(const H323SignalPDU &, const PString &);
221         BOOL OnSendReleaseComplete(H323SignalPDU &);
222         BOOL OnReceivedSignalSetup(const H323SignalPDU &);
223         BOOL OnReceivedFacility(const H323SignalPDU &);
224         BOOL OnSendSignalSetup(H323SignalPDU &);
225         BOOL OnStartLogicalChannel(H323Channel &);
226         BOOL OnClosingLogicalChannel(H323Channel &);
227         virtual void SendUserInputTone(char tone, unsigned duration = 0, unsigned logicalChannel = 0, unsigned rtpTimestamp = 0);
228         virtual void OnUserInputTone(char, unsigned, unsigned, unsigned);
229         virtual void OnUserInputString(const PString &value);
230         BOOL OnReceivedProgress(const H323SignalPDU &);
231         void OnSendCapabilitySet(H245_TerminalCapabilitySet &);
232         void OnSetLocalCapabilities();
233         void SetCapabilities(int, int, void *, int);
234         BOOL OnReceivedCapabilitySet(const H323Capabilities &, const H245_MultiplexCapability *,
235                         H245_TerminalCapabilitySetReject &);
236         void SetCause(int _cause) { cause = _cause; };
237         virtual BOOL StartControlChannel(const H225_TransportAddress & h245Address);
238         void SetCallOptions(void *opts, BOOL isIncoming);
239         void SetCallDetails(void *callDetails, const H323SignalPDU &setupPDU, BOOL isIncoming);
240 #ifdef TUNNELLING
241         virtual BOOL HandleSignalPDU(H323SignalPDU &pdu);
242         BOOL EmbedTunneledInfo(H323SignalPDU &pdu);
243 #endif
244
245         PString sourceAliases;
246         PString destAliases;
247         PString sourceE164;
248         PString destE164;
249         PString rdnis;
250         int redirect_reason;
251
252         WORD sessionId;
253         BOOL bridging;
254 #ifdef TUNNELLING
255         int remoteTunnelOptions;
256         int tunnelOptions;
257 #endif
258
259         unsigned progressSetup;
260         unsigned progressAlert;
261         int cause;
262
263         RTP_DataFrame::PayloadTypes dtmfCodec;
264         int dtmfMode;
265 };
266
267 class MyH323_ExternalRTPChannel : public H323_ExternalRTPChannel
268 {
269         PCLASSINFO(MyH323_ExternalRTPChannel, H323_ExternalRTPChannel);
270
271 public:
272         MyH323_ExternalRTPChannel(
273                         MyH323Connection & connection,
274                         const H323Capability & capability,
275                         Directions direction,
276                         unsigned sessionID);
277
278         ~MyH323_ExternalRTPChannel();
279
280         /* Overrides */
281         BOOL Start(void);
282         BOOL OnReceivedAckPDU(const H245_H2250LogicalChannelAckParameters & param);
283
284 protected:
285         BYTE payloadCode;
286
287         PIPSocket::Address localIpAddr;
288         PIPSocket::Address remoteIpAddr;
289         WORD localPort;
290         WORD remotePort;
291 };
292
293 /**
294  * The MyProcess is a necessary descendant PProcess class so that the H323EndPoint
295  * objected to be created from within that class. (Solves the who owns main() problem).
296  */
297 class MyProcess : public PProcess
298 {
299         PCLASSINFO(MyProcess, PProcess);
300
301 public:
302         MyProcess();
303         ~MyProcess();
304         void Main();
305 };
306
307 #include "compat_h323.h"
308
309 #endif /* !defined AST_H323_H */