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