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