Merged revisions 44022 via svnmerge from
[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 class MyH323EndPoint : public H323EndPoint
35 {
36         PCLASSINFO(MyH323EndPoint, H323EndPoint);
37
38 public:
39         MyH323EndPoint();
40         int MyMakeCall(const PString &, PString &, void *_callReference, void *_opts);
41         BOOL ClearCall(const PString &, H323Connection::CallEndReason reason);
42         BOOL ClearCall(const PString &);
43
44         void OnClosedLogicalChannel(H323Connection &, const H323Channel &);
45         void OnConnectionEstablished(H323Connection &, const PString &);
46         void OnConnectionCleared(H323Connection &, const PString &);
47         virtual H323Connection * CreateConnection(unsigned, void *, H323Transport *, H323SignalPDU *);
48         void SendUserTone(const PString &, char);
49         BOOL OnConnectionForwarded(H323Connection &, const PString &, const H323SignalPDU &);
50         BOOL ForwardConnection(H323Connection &, const PString &, const H323SignalPDU &);
51         void SetEndpointTypeInfo( H225_EndpointType & info ) const;
52         void SetGateway(void);
53         PStringArray SupportedPrefixes;
54 };
55
56 class MyH323Connection : public H323Connection
57 {
58         PCLASSINFO(MyH323Connection, H323Connection);
59
60 public:
61         MyH323Connection(MyH323EndPoint &, unsigned, unsigned);
62         ~MyH323Connection();
63         H323Channel * CreateRealTimeLogicalChannel(const H323Capability &,
64                         H323Channel::Directions,
65                         unsigned,
66                         const H245_H2250LogicalChannelParameters *,
67                         RTP_QOS *);
68         H323Connection::AnswerCallResponse OnAnswerCall(const PString &,
69                         const H323SignalPDU &,
70                         H323SignalPDU &);
71         void OnReceivedReleaseComplete(const H323SignalPDU &);
72         BOOL OnAlerting(const H323SignalPDU &, const PString &);
73         BOOL OnSendReleaseComplete(H323SignalPDU &);
74         BOOL OnReceivedSignalSetup(const H323SignalPDU &);
75         BOOL OnReceivedFacility(const H323SignalPDU &);
76         BOOL OnSendSignalSetup(H323SignalPDU &);
77         BOOL OnStartLogicalChannel(H323Channel &);
78         BOOL OnClosingLogicalChannel(H323Channel &);
79         virtual void SendUserInputTone(char tone, unsigned duration = 0, unsigned logicalChannel = 0, unsigned rtpTimestamp = 0);
80         virtual void OnUserInputTone(char, unsigned, unsigned, unsigned);
81         virtual void OnUserInputString(const PString &value);
82         BOOL OnReceivedProgress(const H323SignalPDU &);
83         BOOL MySendProgress();
84         void OnSendCapabilitySet(H245_TerminalCapabilitySet &);
85         void OnSetLocalCapabilities();
86         void SetCapabilities(int, int, void *, int);
87         BOOL OnReceivedCapabilitySet(const H323Capabilities &, const H245_MultiplexCapability *,
88                         H245_TerminalCapabilitySetReject &);
89         void SetCause(int _cause) { cause = _cause; };
90         virtual BOOL StartControlChannel(const H225_TransportAddress & h245Address);
91         void SetCallOptions(void *opts, BOOL isIncoming);
92         void SetCallDetails(void *callDetails, const H323SignalPDU &setupPDU, BOOL isIncoming);
93         virtual H323Connection::CallEndReason SendSignalSetup(const PString&, const H323TransportAddress&);
94 #ifdef TUNNELLING
95         virtual BOOL HandleSignalPDU(H323SignalPDU &pdu);
96         BOOL EmbedTunneledInfo(H323SignalPDU &pdu);
97 #endif
98 #ifdef H323_H450
99         virtual void OnReceivedLocalCallHold(int linkedId);
100         virtual void OnReceivedLocalCallRetrieve(int linkedId);
101 #endif
102         void MyHoldCall(BOOL localHold);
103
104         PString sourceAliases;
105         PString destAliases;
106         PString sourceE164;
107         PString destE164;
108         int cid_presentation;
109         int cid_ton;
110         PString rdnis;
111         int redirect_reason;
112
113         WORD sessionId;
114         BOOL bridging;
115 #ifdef TUNNELLING
116         int remoteTunnelOptions;
117         int tunnelOptions;
118 #endif
119
120         unsigned holdHandling;
121         unsigned progressSetup;
122         unsigned progressAlert;
123         int cause;
124
125         RTP_DataFrame::PayloadTypes dtmfCodec[2];
126         int dtmfMode;
127 };
128
129 class MyH323_ExternalRTPChannel : public H323_ExternalRTPChannel
130 {
131         PCLASSINFO(MyH323_ExternalRTPChannel, H323_ExternalRTPChannel);
132
133 public:
134         MyH323_ExternalRTPChannel(
135                         MyH323Connection & connection,
136                         const H323Capability & capability,
137                         Directions direction,
138                         unsigned sessionID);
139
140         ~MyH323_ExternalRTPChannel();
141
142         /* Overrides */
143         BOOL Start(void);
144         BOOL OnReceivedAckPDU(const H245_H2250LogicalChannelAckParameters & param);
145
146 protected:
147         BYTE payloadCode;
148
149         PIPSocket::Address localIpAddr;
150         PIPSocket::Address remoteIpAddr;
151         WORD localPort;
152         WORD remotePort;
153 };
154
155 /**
156  * The MyProcess is a necessary descendant PProcess class so that the H323EndPoint
157  * objected to be created from within that class. (Solves the who owns main() problem).
158  */
159 class MyProcess : public PProcess
160 {
161         PCLASSINFO(MyProcess, PProcess);
162
163 public:
164         MyProcess();
165         ~MyProcess();
166         void Main();
167 };
168
169 #ifdef H323_H450
170 #include <h450pdu.h>
171
172 class MyH4504Handler : public H4504Handler
173 {
174         PCLASSINFO(MyH4504Handler, H4504Handler);
175
176 public:
177         MyH4504Handler(MyH323Connection &_conn, H450xDispatcher &_disp);
178         virtual void OnReceivedLocalCallHold(int linkedId);
179         virtual void OnReceivedLocalCallRetrieve(int linkedId);
180
181 private:
182         MyH323Connection *conn;
183 };
184 #endif
185
186 #include "compat_h323.h"
187
188 #endif /* !defined AST_H323_H */