b04f57c95d00d4f075880375d82f1e647cf6f4ec
[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         
35 /*! G.723.1 compression */
36 #define AST_FORMAT_G723_1       (1 << 0)
37 /*! GSM compression */
38 #define AST_FORMAT_GSM          (1 << 1)
39 /*! Raw mu-law data (G.711) */
40 #define AST_FORMAT_ULAW         (1 << 2)
41 /*! Raw A-law data (G.711) */
42 #define AST_FORMAT_ALAW         (1 << 3)
43 /*! MPEG-2 layer 3 */
44 #define AST_FORMAT_MP3          (1 << 4)
45 /*! ADPCM (whose?) */
46 #define AST_FORMAT_ADPCM        (1 << 5)
47 /*! Raw 16-bit Signed Linear (8000 Hz) PCM */
48 #define AST_FORMAT_SLINEAR      (1 << 6)
49 /*! LPC10, 180 samples/frame */
50 #define AST_FORMAT_LPC10        (1 << 7)
51 /*! G.729A audio */
52 #define AST_FORMAT_G729A        (1 << 8)
53 /*! SpeeX Free Compression */
54 #define AST_FORMAT_SPEEX        (1 << 9)
55 /*! ILBC Free Codec */
56 #define AST_FORMAT_ILBC         (1 << 10)
57
58 /**This class describes the G.723.1 codec capability.
59  */
60 class H323_G7231Capability : public H323AudioCapability
61 {
62     PCLASSINFO(H323_G7231Capability, H323AudioCapability);
63   public:
64     H323_G7231Capability(
65       BOOL annexA = TRUE  /// Enable Annex A silence insertion descriptors
66     );
67     Comparison Compare(const PObject & obj) const;
68
69     PObject * Clone() const;
70   
71         virtual H323Codec * CreateCodec(
72       H323Codec::Direction direction  /// Direction in which this instance runs
73     ) const;
74
75         unsigned GetSubType() const;
76     PString GetFormatName() const;
77     BOOL OnSendingPDU(
78       H245_AudioCapability & pdu,  /// PDU to set information on
79       unsigned packetSize          /// Packet size to use in capability
80     ) const;
81
82     BOOL OnReceivedPDU(
83       const H245_AudioCapability & pdu,  /// PDU to get information from
84       unsigned & packetSize              /// Packet size to use in capability
85     );
86   
87   protected:
88     BOOL annexA;
89 };
90
91 /**This class describes the (fake) G729 codec capability.
92  */
93 class AST_G729Capability : public H323AudioCapability
94 {
95   PCLASSINFO(AST_G729Capability, H323AudioCapability);
96
97   public:
98   /**@name Construction */
99   //@{
100     /**Create a new G.729 capability.
101      */
102     AST_G729Capability();
103   //@}
104
105   /**@name Overrides from class PObject */
106   //@{
107     /**Create a copy of the object.
108       */
109     virtual PObject * Clone() const;
110   //@}
111
112   /**@name Operations */
113   //@{
114     /**Create the codec instance, allocating resources as required.
115      */
116     virtual H323Codec * CreateCodec(
117       H323Codec::Direction direction  /// Direction in which this instance runs
118     ) const;
119   //@}
120
121   /**@name Identification functions */
122   //@{
123     /**Get the sub-type of the capability. This is a code dependent on the
124        main type of the capability.
125
126        This returns one of the four possible combinations of mode and speed
127        using the enum values of the protocol ASN H245_AudioCapability class.
128      */
129     virtual unsigned GetSubType() const;
130
131     /**Get the name of the media data format this class represents.
132      */
133     virtual PString GetFormatName() const;
134   //@}
135 };
136
137
138 /**This class describes the VoiceAge G729A codec capability.
139  */
140 class AST_G729ACapability : public H323AudioCapability
141 {
142   PCLASSINFO(AST_G729ACapability, H323AudioCapability);
143
144   public:
145   /**@name Construction */
146   //@{
147     /**Create a new G.729A capability.
148      */
149     AST_G729ACapability();
150   //@}
151
152   /**@name Overrides from class PObject */
153   //@{
154     /**Create a copy of the object.
155       */
156     virtual PObject * Clone() const;
157   //@}
158
159   /**@name Operations */
160   //@{
161     /**Create the codec instance, allocating resources as required.
162      */
163     virtual H323Codec * CreateCodec(
164       H323Codec::Direction direction  /// Direction in which this instance runs
165     ) const;
166   //@}
167
168   /**@name Identification functions */
169   //@{
170     /**Get the sub-type of the capability. This is a code dependent on the
171        main type of the capability.
172
173        This returns one of the four possible combinations of mode and speed
174        using the enum values of the protocol ASN H245_AudioCapability class.
175      */
176     virtual unsigned GetSubType() const;
177
178     /**Get the name of the media data format this class represents.
179      */
180     virtual PString GetFormatName() const;
181   //@}
182 };
183
184
185 class MyH323EndPoint : public H323EndPoint {
186
187         PCLASSINFO(MyH323EndPoint, H323EndPoint);
188
189         public:
190
191         int MakeCall(const PString &, PString &, unsigned int *, unsigned int, char *, char *s);
192         BOOL ClearCall(const PString &);
193
194         void OnClosedLogicalChannel(H323Connection &, const H323Channel &);
195         void OnConnectionEstablished(H323Connection &, const PString &);
196         void OnConnectionCleared(H323Connection &, const PString &);
197         H323Connection * CreateConnection(unsigned, void *);
198         void SendUserTone(const PString &, char);
199         H323Capabilities GetCapabilities(void);
200         BOOL OnConnectionForwarded(H323Connection &, const PString &, const H323SignalPDU &);
201  
202         BOOL ForwardConnection(H323Connection &, const PString &, const H323SignalPDU &);
203
204         PStringArray SupportedPrefixes; 
205         
206         void SetEndpointTypeInfo( H225_EndpointType & info ) const;
207         void SetGateway(void);
208 };
209
210 class MyH323Connection : public H323Connection {
211
212         PCLASSINFO(MyH323Connection, H323Connection);
213
214         public:
215         MyH323Connection(MyH323EndPoint &, unsigned, unsigned);
216         ~MyH323Connection();
217
218         H323Channel * CreateRealTimeLogicalChannel(const H323Capability &, 
219                                                    H323Channel::Directions, 
220                                                    unsigned, 
221                                                    const H245_H2250LogicalChannelParameters *,
222                                                    RTP_QOS *);
223         H323Connection::AnswerCallResponse OnAnswerCall(const PString &, const H323SignalPDU &, H323SignalPDU &);
224         void OnReceivedReleaseComplete(const H323SignalPDU &);
225         BOOL OnAlerting(const H323SignalPDU &, const PString &);
226         BOOL OnSendReleaseComplete(H323SignalPDU &);
227         BOOL OnReceivedSignalSetup(const H323SignalPDU &);
228         BOOL OnReceivedFacility(const H323SignalPDU &);
229         BOOL OnSendSignalSetup(H323SignalPDU &);
230         BOOL OnStartLogicalChannel(H323Channel &);
231         BOOL OnClosingLogicalChannel(H323Channel &);    
232         void SendUserInputTone(char, unsigned);
233         void OnUserInputTone(char, unsigned, unsigned, unsigned);
234         void OnUserInputString(const PString &value);
235
236         PString sourceAliases;
237         PString destAliases;
238         PString sourceE164;
239         PString destE164;
240
241         WORD sessionId;
242         BOOL bridging;                  
243 };
244
245 class MyH323_ExternalRTPChannel : public H323_ExternalRTPChannel {
246
247         PCLASSINFO(MyH323_ExternalRTPChannel, H323_ExternalRTPChannel);
248
249         public:
250         MyH323_ExternalRTPChannel(
251                 MyH323Connection & connection,
252                 const H323Capability & capability, 
253                 Directions direction,              
254                 unsigned sessionID);
255
256         /* Destructor */
257         ~MyH323_ExternalRTPChannel();
258         
259         /* Overrides */
260         BOOL Start(void);
261
262         protected:
263         BYTE payloadCode;
264
265         PIPSocket::Address localIpAddr;
266         PIPSocket::Address remoteIpAddr;
267         WORD localPort;
268         WORD remotePort;
269 }; 
270
271 /**
272  * The MyProcess is a necessary descendant PProcess class so that the H323EndPoint 
273  * objected to be created from within that class. (Who owns main() problem). 
274  */
275 class MyProcess : public PProcess {
276
277         PCLASSINFO(MyProcess, PProcess);
278     
279         public:
280         MyProcess();
281         void Main(); 
282 };
283
284 #endif /* !defined AST_H323_H */