add debug in hopes to figure out native bridging
[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  */
27
28
29 #include <ptlib.h>
30 #include <h323.h>
31 #include <h323pdu.h>
32 #include <mediafmt.h>
33 #include <lid.h>
34
35 #include <list>
36 #include <string>
37 #include <algorithm>
38
39 #include "chan_h323.h"
40
41 /**  These need to be redefined here because the C++
42          side of this driver is blind to the asterisk headers */
43         
44 /*! G.723.1 compression */
45 #define AST_FORMAT_G723_1       (1 << 0)
46 /*! GSM compression */
47 #define AST_FORMAT_GSM          (1 << 1)
48 /*! Raw mu-law data (G.711) */
49 #define AST_FORMAT_ULAW         (1 << 2)
50 /*! Raw A-law data (G.711) */
51 #define AST_FORMAT_ALAW         (1 << 3)
52 /*! MPEG-2 layer 3 */
53 #define AST_FORMAT_MP3          (1 << 4)
54 /*! ADPCM (whose?) */
55 #define AST_FORMAT_ADPCM        (1 << 5)
56 /*! Raw 16-bit Signed Linear (8000 Hz) PCM */
57 #define AST_FORMAT_SLINEAR      (1 << 6)
58 /*! LPC10, 180 samples/frame */
59 #define AST_FORMAT_LPC10        (1 << 7)
60 /*! G.729A audio */
61 #define AST_FORMAT_G729A        (1 << 8)
62 /*! SpeeX Free Compression */
63 #define AST_FORMAT_SPEEX        (1 << 9)
64 /*! ILBC Free Codec */
65 #define AST_FORMAT_ILBC         (1 << 10)
66
67 /**This class describes the G.723.1 codec capability.
68  */
69 class H323_G7231Capability : public H323AudioCapability
70 {
71     PCLASSINFO(H323_G7231Capability, H323AudioCapability);
72   public:
73     H323_G7231Capability(
74       BOOL annexA = TRUE  /// Enable Annex A silence insertion descriptors
75     );
76     Comparison Compare(const PObject & obj) const;
77
78     PObject * Clone() const;
79   
80         virtual H323Codec * CreateCodec(
81       H323Codec::Direction direction  /// Direction in which this instance runs
82     ) const;
83
84         unsigned GetSubType() const;
85     PString GetFormatName() const;
86     BOOL OnSendingPDU(
87       H245_AudioCapability & pdu,  /// PDU to set information on
88       unsigned packetSize          /// Packet size to use in capability
89     ) const;
90
91     BOOL OnReceivedPDU(
92       const H245_AudioCapability & pdu,  /// PDU to get information from
93       unsigned & packetSize              /// Packet size to use in capability
94     );
95   
96   protected:
97     BOOL annexA;
98 };
99
100 class MyH323EndPoint : public H323EndPoint {
101
102         PCLASSINFO(MyH323EndPoint, H323EndPoint);
103
104         public:
105
106         int MakeCall(const PString &, PString &, unsigned int *, unsigned int, char *);
107         BOOL ClearCall(const PString &);
108
109         void OnClosedLogicalChannel(H323Connection &, const H323Channel &);
110         void OnConnectionEstablished(H323Connection &, const PString &);
111         void OnConnectionCleared(H323Connection &, const PString &);
112         H323Connection * CreateConnection(unsigned, void *);
113         void SendUserTone(const PString &, char);
114         H323Capabilities GetCapabilities(void);
115
116         PStringArray SupportedPrefixes; 
117         
118     void SetEndpointTypeInfo( H225_EndpointType & info ) const;
119     void SetGateway(void);
120
121 };
122
123   
124 class MyH323Connection : public H323Connection {
125
126         PCLASSINFO(MyH323Connection, H323Connection);
127
128         public:
129         MyH323Connection(MyH323EndPoint &, unsigned, unsigned);
130         ~MyH323Connection();
131
132         H323Channel * CreateRealTimeLogicalChannel(const H323Capability &, H323Channel::Directions, unsigned, 
133                                                                                            const H245_H2250LogicalChannelParameters *);
134         H323Connection::AnswerCallResponse OnAnswerCall(const PString &, const H323SignalPDU &, H323SignalPDU &);
135         BOOL OnAlerting(const H323SignalPDU &, const PString &);
136         BOOL OnSendReleaseComplete(H323SignalPDU &);
137         BOOL OnReceivedSignalSetup(const H323SignalPDU &);
138         void OnReceivedReleaseComplete(const H323SignalPDU &);
139         BOOL OnReceivedFacility(const H323SignalPDU &);
140         BOOL OnSendSignalSetup(H323SignalPDU &);
141         BOOL OnStartLogicalChannel(H323Channel &);
142         BOOL OnClosingLogicalChannel(H323Channel &);
143         void SendUserInputTone(char, unsigned);
144         void OnUserInputTone(char, unsigned, unsigned, unsigned);
145         void OnUserInputString(const PString &value);
146
147         PString sourceAliases;
148         PString destAliases;
149         PString sourceE164;
150         PString destE164;
151
152         PIPSocket::Address externalIpAddress;   // IP address of media server
153     PIPSocket::Address remoteIpAddress;         // IP Address of remote endpoint
154         WORD                       externalPort;                // local media server Data port (control is dataPort+1)
155         WORD                       remotePort;                  // remote endpoint Data port (control is dataPort+1)
156
157         PSyncPoint bridgeFlag;
158 };
159
160
161 #if 0
162 class MyGatekeeperServer : public H323GatekeeperServer
163 {
164     PCLASSINFO(MyGatekeeperServer, H323GatekeeperServer);
165   public:
166     MyGatekeeperServer(MyH323EndPoint & ep);
167
168     // Overrides
169     virtual H323GatekeeperCall * CreateCall(
170       const OpalGloballyUniqueID & callIdentifier,
171       H323GatekeeperCall::Direction direction
172     );
173     virtual BOOL TranslateAliasAddressToSignalAddress(
174       const H225_AliasAddress & alias,
175       H323TransportAddress & address
176     );
177
178     // new functions
179     BOOL Initialise();
180
181   private:
182     class RouteMap : public PObject {
183         PCLASSINFO(RouteMap, PObject);
184       public:
185         RouteMap(
186           const PString & alias,
187           const PString & host
188         );
189         RouteMap(
190           const RouteMap & map
191         ) : alias(map.alias), regex(map.alias), host(map.host) { }
192
193         void PrintOn(
194           ostream & strm
195         ) const;
196
197         BOOL IsValid() const;
198
199         BOOL IsMatch(
200           const PString & alias
201         ) const;
202
203         const H323TransportAddress & GetHost() const { return host; }
204
205       private:
206         PString              alias;
207         PRegularExpression   regex;
208         H323TransportAddress host;
209     };
210     PList<RouteMap> routes;
211
212     PMutex reconfigurationMutex;
213 };
214
215 #endif
216
217 /**
218  * The MyProcess is a necessary descendant PProcess class so that the H323EndPoint 
219  * objected to be created from within that class. (Who owns main() problem). 
220  */
221 class MyProcess : public PProcess {
222
223         PCLASSINFO(MyProcess, PProcess);
224     
225         public:
226         MyProcess();
227         ~MyProcess();
228
229         void Main(); 
230         
231         
232 };
233
234
235 /** 
236  * This class handles the termination of a call.
237  * Note that OpenH323 Library requires that the termination
238  * of a call should be done inside a separate thread of execution.
239  */
240 class ClearCallThread : public PThread {
241
242         PCLASSINFO(ClearCallThread, PThread);
243
244         public:
245         ClearCallThread(const char *tc);
246         ~ClearCallThread();    
247         
248         void Main();
249         
250         protected:
251         PString token;
252 };
253
254