6b05a9fd82b0400abcefd50be76eeb3ec9256694
[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
30 #include <ptlib.h>
31 #include <h323.h>
32 #include <h323pdu.h>
33 #include <mediafmt.h>
34 #include <lid.h>
35
36 #include <list>
37 #include <string>
38 #include <algorithm>
39
40 #include "chan_h323.h"
41
42 /**  These need to be redefined here because the C++
43          side of this driver is blind to the asterisk headers */
44         
45 /*! G.723.1 compression */
46 #define AST_FORMAT_G723_1       (1 << 0)
47 /*! GSM compression */
48 #define AST_FORMAT_GSM          (1 << 1)
49 /*! Raw mu-law data (G.711) */
50 #define AST_FORMAT_ULAW         (1 << 2)
51 /*! Raw A-law data (G.711) */
52 #define AST_FORMAT_ALAW         (1 << 3)
53 /*! MPEG-2 layer 3 */
54 #define AST_FORMAT_MP3          (1 << 4)
55 /*! ADPCM (whose?) */
56 #define AST_FORMAT_ADPCM        (1 << 5)
57 /*! Raw 16-bit Signed Linear (8000 Hz) PCM */
58 #define AST_FORMAT_SLINEAR      (1 << 6)
59 /*! LPC10, 180 samples/frame */
60 #define AST_FORMAT_LPC10        (1 << 7)
61 /*! G.729A audio */
62 #define AST_FORMAT_G729A        (1 << 8)
63 /*! SpeeX Free Compression */
64 #define AST_FORMAT_SPEEX        (1 << 9)
65 /*! ILBC Free Codec */
66 #define AST_FORMAT_ILBC         (1 << 10)
67
68 /**This class describes the G.723.1 codec capability.
69  */
70 class H323_G7231Capability : public H323AudioCapability
71 {
72     PCLASSINFO(H323_G7231Capability, H323AudioCapability);
73   public:
74     H323_G7231Capability(
75       BOOL annexA = TRUE  /// Enable Annex A silence insertion descriptors
76     );
77     Comparison Compare(const PObject & obj) const;
78
79     PObject * Clone() const;
80   
81         virtual H323Codec * CreateCodec(
82       H323Codec::Direction direction  /// Direction in which this instance runs
83     ) const;
84
85         unsigned GetSubType() const;
86     PString GetFormatName() const;
87     BOOL OnSendingPDU(
88       H245_AudioCapability & pdu,  /// PDU to set information on
89       unsigned packetSize          /// Packet size to use in capability
90     ) const;
91     
92     BOOL OnReceivedPDU(
93       const H245_AudioCapability & pdu,  /// PDU to get information from
94       unsigned & packetSize              /// Packet size to use in capability
95     );
96   
97   protected:
98     BOOL annexA;
99 };
100
101 /**This class describes the (fake) G729 codec capability.
102  */
103 class AST_G729Capability : public H323AudioCapability
104 {
105   PCLASSINFO(AST_G729Capability, H323AudioCapability);
106
107   public:
108   /**@name Construction */
109   //@{
110     /**Create a new G.729 capability.
111      */
112     AST_G729Capability();
113   //@}
114
115   /**@name Overrides from class PObject */
116   //@{
117     /**Create a copy of the object.
118       */
119     virtual PObject * Clone() const;
120   //@}
121
122   /**@name Operations */
123   //@{
124     /**Create the codec instance, allocating resources as required.
125      */
126     virtual H323Codec * CreateCodec(
127       H323Codec::Direction direction  /// Direction in which this instance runs
128     ) const;
129   //@}
130
131   /**@name Identification functions */
132   //@{
133     /**Get the sub-type of the capability. This is a code dependent on the
134        main type of the capability.
135
136        This returns one of the four possible combinations of mode and speed
137        using the enum values of the protocol ASN H245_AudioCapability class.
138      */
139     virtual unsigned GetSubType() const;
140
141     /**Get the name of the media data format this class represents.
142      */
143     virtual PString GetFormatName() const;
144   //@}
145 };
146
147
148 /**This class describes the VoiceAge G729A codec capability.
149  */
150 class AST_G729ACapability : public H323AudioCapability
151 {
152   PCLASSINFO(AST_G729ACapability, H323AudioCapability);
153
154   public:
155   /**@name Construction */
156   //@{
157     /**Create a new G.729A capability.
158      */
159     AST_G729ACapability();
160   //@}
161
162   /**@name Overrides from class PObject */
163   //@{
164     /**Create a copy of the object.
165       */
166     virtual PObject * Clone() const;
167   //@}
168
169   /**@name Operations */
170   //@{
171     /**Create the codec instance, allocating resources as required.
172      */
173     virtual H323Codec * CreateCodec(
174       H323Codec::Direction direction  /// Direction in which this instance runs
175     ) const;
176   //@}
177
178   /**@name Identification functions */
179   //@{
180     /**Get the sub-type of the capability. This is a code dependent on the
181        main type of the capability.
182
183        This returns one of the four possible combinations of mode and speed
184        using the enum values of the protocol ASN H245_AudioCapability class.
185      */
186     virtual unsigned GetSubType() const;
187
188     /**Get the name of the media data format this class represents.
189      */
190     virtual PString GetFormatName() const;
191   //@}
192 };
193
194
195 class MyH323EndPoint : public H323EndPoint {
196
197         PCLASSINFO(MyH323EndPoint, H323EndPoint);
198
199         public:
200
201         int MakeCall(const PString &, PString &, unsigned int *, call_options_t *);
202         BOOL ClearCall(const PString &);
203
204         void OnClosedLogicalChannel(H323Connection &, const H323Channel &);
205         void OnConnectionEstablished(H323Connection &, const PString &);
206         void OnConnectionCleared(H323Connection &, const PString &);
207         H323Connection * CreateConnection(unsigned, void *);
208         void SendUserTone(const PString &, char);
209         H323Capabilities GetCapabilities(void);
210         BOOL OnConnectionForwarded(H323Connection &, const PString &, const H323SignalPDU &);
211  
212         BOOL ForwardConnection(H323Connection &, const PString &, const H323SignalPDU &);
213
214         PStringArray SupportedPrefixes; 
215         
216         void SetEndpointTypeInfo( H225_EndpointType & info ) const;
217         void SetGateway(void);
218 };
219
220   
221 class MyH323Connection : public H323Connection {
222
223         PCLASSINFO(MyH323Connection, H323Connection);
224
225         public:
226         MyH323Connection(MyH323EndPoint &, unsigned, unsigned);
227         MyH323Connection(MyH323EndPoint &, unsigned, unsigned, call_options_t *);
228         ~MyH323Connection();
229
230         H323Channel * CreateRealTimeLogicalChannel(const H323Capability &, H323Channel::Directions, unsigned, 
231                                                                                            const H245_H2250LogicalChannelParameters *);
232         H323Connection::AnswerCallResponse OnAnswerCall(const PString &, const H323SignalPDU &, H323SignalPDU &);
233         void OnReceivedReleaseComplete(const H323SignalPDU &);
234         BOOL OnAlerting(const H323SignalPDU &, const PString &);
235         BOOL OnSendReleaseComplete(H323SignalPDU &);
236         BOOL OnReceivedSignalSetup(const H323SignalPDU &);
237         BOOL OnReceivedFacility(const H323SignalPDU &);
238         BOOL OnSendSignalSetup(H323SignalPDU &);
239         BOOL OnStartLogicalChannel(H323Channel &);
240         BOOL OnClosingLogicalChannel(H323Channel &);    
241         void SendUserInputTone(char, unsigned);
242         void OnUserInputTone(char, unsigned, unsigned, unsigned);
243         void OnUserInputString(const PString &value);
244         BOOL OnReceivedProgress(const H323SignalPDU &);
245         /* Set up H.323 caller id */
246         void SetCID(const char *callerid);      
247
248         PString sourceAliases;
249         PString destAliases;
250         PString sourceE164;
251         PString destE164;
252
253         PIPSocket::Address externalIpAddress;   // IP address of media server
254         PIPSocket::Address remoteIpAddress;     // IP Address of remote endpoint
255         WORD                    externalPort;   // local media server Data port (control is dataPort+1)
256         WORD                    remotePort;     // remote endpoint Data port (control is dataPort+1)
257         WORD                    sessionId;
258         BOOL                    bridging;       // Used to help determine which IP to use
259         unsigned                progressSetup;  // ProgressIndicator IE value for SETUP message
260         unsigned                progressAlert;  // ProgressIndicator IE value for ALERT message
261 };
262
263 class MyH323_ExternalRTPChannel : public H323_ExternalRTPChannel
264 {
265         PCLASSINFO(MyH323_ExternalRTPChannel, H323_ExternalRTPChannel);
266
267 public:
268   /**@name Construction */
269   //@{
270     /**Create a new channel.
271      */
272     MyH323_ExternalRTPChannel(
273       H323Connection & connection,        /// Connection to endpoint for channel
274       const H323Capability & capability,  /// Capability channel is using
275       Directions direction,               /// Direction of channel
276       unsigned sessionID                  /// Session ID for channel
277     );
278     /**Create a new channel.
279      */
280     MyH323_ExternalRTPChannel(
281       H323Connection & connection,        /// Connection to endpoint for channel
282       const H323Capability & capability,  /// Capability channel is using
283       Directions direction,               /// Direction of channel
284       unsigned sessionID,                 /// Session ID for channel
285       const H323TransportAddress & data,  /// Data address
286       const H323TransportAddress & control/// Control address
287     );
288     /**Create a new channel.
289      */
290     MyH323_ExternalRTPChannel(
291       H323Connection & connection,        /// Connection to endpoint for channel
292       const H323Capability & capability,  /// Capability channel is using
293       Directions direction,               /// Direction of channel
294       unsigned sessionID,                 /// Session ID for channel
295       const PIPSocket::Address & ip,      /// IP address of media server
296       WORD dataPort                       /// Data port (control is dataPort+1)
297     );
298   //@}
299 //      BOOL OnReceivedAckPDU(const H245_H2250LogicalChannelAckParameters & param);
300         BOOL Start(void);
301 };
302
303
304 #if 0
305 class MyGatekeeperServer : public H323GatekeeperServer
306 {
307     PCLASSINFO(MyGatekeeperServer, H323GatekeeperServer);
308   public:
309     MyGatekeeperServer(MyH323EndPoint & ep);
310
311     // Overrides
312     virtual H323GatekeeperCall * CreateCall(
313       const OpalGloballyUniqueID & callIdentifier,
314       H323GatekeeperCall::Direction direction
315     );
316     virtual BOOL TranslateAliasAddressToSignalAddress(
317       const H225_AliasAddress & alias,
318       H323TransportAddress & address
319     );
320
321     // new functions
322     BOOL Initialise();
323
324   private:
325     class RouteMap : public PObject {
326         PCLASSINFO(RouteMap, PObject);
327       public:
328         RouteMap(
329           const PString & alias,
330           const PString & host
331         );
332         RouteMap(
333           const RouteMap & map
334         ) : alias(map.alias), regex(map.alias), host(map.host) { }
335
336         void PrintOn(
337           ostream & strm
338         ) const;
339
340         BOOL IsValid() const;
341
342         BOOL IsMatch(
343           const PString & alias
344         ) const;
345
346         const H323TransportAddress & GetHost() const { return host; }
347
348       private:
349         PString              alias;
350         PRegularExpression   regex;
351         H323TransportAddress host;
352     };
353     PList<RouteMap> routes;
354
355     PMutex reconfigurationMutex;
356 };
357
358 #endif
359
360 /**
361  * The MyProcess is a necessary descendant PProcess class so that the H323EndPoint 
362  * objected to be created from within that class. (Who owns main() problem). 
363  */
364 class MyProcess : public PProcess {
365
366         PCLASSINFO(MyProcess, PProcess);
367     
368         public:
369         MyProcess();
370         ~MyProcess();
371
372         void Main(); 
373         
374         
375 };
376
377
378 /** 
379  * This class handles the termination of a call.
380  * Note that OpenH323 Library requires that the termination
381  * of a call should be done inside a separate thread of execution.
382  */
383 class ClearCallThread : public PThread {
384
385         PCLASSINFO(ClearCallThread, PThread);
386
387         public:
388         ClearCallThread(const char *tc);
389         ~ClearCallThread();    
390         
391         void Main();
392         
393         protected:
394         PString token;
395 };